/* * lftp - file transfer program * * Copyright (c) 1996-2012 by Alexander V. Lukyanov (lav@yars.free.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "Speedometer.h" #include "misc.h" #include "xstring.h" #include "ResMgr.h" #define now SMTask::now Speedometer::Speedometer(const char *p) { period=15; rate=0; last_second=now; start=now; last_bytes=0; terse=true; period_resource=p; Reconfig(0); } bool Speedometer::Valid() { return now>=start+TimeDiff(1,0) && nowTimeout(500); return rate; } void Speedometer::Add(int b) { if(b==0 && (now==last_second || TimeDiff(now,last_second).MilliSeconds()<100)) return; // This makes Speedometer start only when first data come. if(rate==0) Reset(); double div=period; if(start>now) start=now; // time was adjusted? if(now0) last_bytes=now; if(rate<0) rate=0; } // These `incorrect' units are used to fit on status line xstring& Speedometer::GetStr(float r) { if(r<1) return xstring::get_tmp(""); if(r<1024) // for translator: those are the units. This is 'byte per second' return xstring::format(_("%.0fb/s"),r); else if(r<1024*1024) // for translator: This is 'Kibibyte per second' return xstring::format(_("%.1fK/s"),r/1024.); else // for translator: This is 'Mebibyte per second' return xstring::format(_("%.2fM/s"),r/(1024.*1024)); } xstring& Speedometer::GetStrProper(float r) { if(r<1) return xstring::get_tmp(""); if(r<1024) return xstring::format(_("%.0f B/s"),r); else if(r<1024*1024) return xstring::format(_("%.1f KiB/s"),r/1024.); else return xstring::format(_("%.2f MiB/s"),r/(1024.*1024)); } xstring& Speedometer::GetStr() { return Valid() ? GetStr(Get()) : xstring::get_tmp(""); } xstring& Speedometer::GetETAStrFromSize(off_t size) { if(!Valid() || Get()<1) return xstring::get_tmp(""); return GetETAStrFromTime(long(size/rate+.5)); } xstring& Speedometer::GetETAStrFromTime(long eta) { if(eta<0) return xstring::get_tmp(""); unsigned flags=TimeInterval::TO_STR_TRANSLATE; if(terse) flags+=TimeInterval::TO_STR_TERSE; // for translator: Estimated Time of Arrival. return xstring::cat(_("eta:"),TimeInterval(eta,0).toString(flags),NULL); } const char *Speedometer::GetStrS(float r) { xstring &rate=GetStr(r); if(rate.length()) rate.append(' '); return rate; } const char *Speedometer::GetStrS() { return Valid() ? GetStrS(Get()) : ""; } const char *Speedometer::GetETAStrSFromSize(off_t s) { xstring &eta=GetETAStrFromSize(s); if(eta.length()) eta.append(' '); return eta; } const char *Speedometer::GetETAStrSFromTime(long s) { xstring &eta=GetETAStrFromTime(s); if(eta.length()) eta.append(' '); return eta; } void Speedometer::Reset() { start=now; last_second=now; rate=0; last_bytes=0; } ResDecl res_eta_terse("xfer:eta-terse", "yes",ResMgr::BoolValidate,ResMgr::NoClosure); void Speedometer::Reconfig(const char *n) { terse=res_eta_terse.QueryBool(0); SetPeriod(ResMgr::Query(period_resource,0)); }