diff --git a/TODO b/TODO index e1f857cab..bf453e922 100644 --- a/TODO +++ b/TODO @@ -81,5 +81,6 @@ beta5->beta6 changelog: - BUGFIX: Prevent downloadFromUrl flooding - BUGFIX: Made finished list context menu more similar to the download list one - BUGFIX: Fixed Pause/Start action in lists context menus +- BUGFIX: Improved ETA calculation - BUGFIX: Display the torrent that are being checked as 'checking' in seeding list - I18N: Removed no longer maintained Traditional chinese translation \ No newline at end of file diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index 68e9e81fc..0d4e2856e 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -112,19 +112,22 @@ void bittorrent::updateETAs() { QTorrentHandle h = handles[i]; if(h.is_valid()) { QString hash = h.hash(); - QList listEtas = ETAstats.value(hash, QList()); + QList listEtas = ETAstats.value(hash, QList()); if(listEtas.size() == ETAS_MAX_VALUES) { listEtas.removeFirst(); } - if(h.download_payload_rate() != 0) { - listEtas << (long)((h.total_size()-h.total_done())/(double)h.download_payload_rate()); + if(h.download_payload_rate()) { + listEtas << (qlonglong)((h.total_size()-h.total_done())/(double)h.download_payload_rate()); ETAstats[hash] = listEtas; long moy = 0; long val; + unsigned int nbETAs = listEtas.size(); + Q_ASSERT(nbETAs); foreach(val, listEtas) { - moy += val; + moy += (qlonglong)((double)val/(double)nbETAs); + Q_ASSERT(moy >= 0); } - ETAs[hash] = (long) ((double)moy/(double)listEtas.size()); + ETAs[hash] = moy; } } } diff --git a/src/bittorrent.h b/src/bittorrent.h index a31359dba..fea40c790 100644 --- a/src/bittorrent.h +++ b/src/bittorrent.h @@ -49,8 +49,8 @@ class bittorrent : public QObject{ QString defaultSavePath; QStringList torrentsToPauseAfterChecking; QStringList reloadingTorrents; - QHash > ETAstats; - QHash ETAs; + QHash > ETAstats; + QHash ETAs; QHash > ratioData; QTimer *ETARefresher; QStringList fullAllocationModeList; diff --git a/src/misc.h b/src/misc.h index 00e5059a0..faf8c72ef 100644 --- a/src/misc.h +++ b/src/misc.h @@ -285,28 +285,36 @@ class misc : public QObject{ // Take a number of seconds and return an user-friendly // time duration like "1d 2h 10m". - static QString userFriendlyDuration(const long int seconds) { - if(seconds < 0) { + static QString userFriendlyDuration(qlonglong seconds) { + if(seconds < 0 or seconds > 8640000) { return tr("Unknown"); } - if(seconds < 60) { - return tr("< 1m", "< 1 minute"); + int level = 0; + int days = int(seconds / 86400.); + if(!days) + level = 1; + else + seconds -= days * 86400; + int hours = int(seconds / 3600.); + if(!hours) + level = 2; + else + seconds -= hours * 3600; + int minutes = int(seconds / 60.0); + if(!minutes) + level = 3; + else + seconds -= minutes * 60; + switch(level){ + case 3: + return tr("< 1m", "< 1 minute"); + case 2: + return tr("%1m","e.g: 10minutes").arg(QString::QString::fromUtf8(misc::toString(minutes).c_str())); + case 1: + return tr("%1h%2m", "e.g: 3hours 5minutes").arg(QString::fromUtf8(misc::toString(hours).c_str())).arg(QString::fromUtf8(misc::toString(minutes).c_str())); + default: + return tr("%1d%2h%3m", "e.g: 2days 10hours 2minutes").arg(QString::fromUtf8(misc::toString(days).c_str())).arg(QString::fromUtf8(misc::toString(hours).c_str())).arg(QString::fromUtf8(misc::toString(minutes).c_str())); } - int minutes = seconds / 60; - if(minutes < 60) { - return tr("%1m","e.g: 10minutes").arg(QString::QString::fromUtf8(misc::toString(minutes).c_str())); - } - int hours = minutes / 60; - minutes = minutes - hours*60; - if(hours < 24) { - return tr("%1h%2m", "e.g: 3hours 5minutes").arg(QString::fromUtf8(misc::toString(hours).c_str())).arg(QString::fromUtf8(misc::toString(minutes).c_str())); - } - int days = hours / 24; - hours = hours - days * 24; - if(days < 100) { - return tr("%1d%2h%3m", "e.g: 2days 10hours 2minutes").arg(QString::fromUtf8(misc::toString(days).c_str())).arg(QString::fromUtf8(misc::toString(hours).c_str())).arg(QString::fromUtf8(misc::toString(minutes).c_str())); - } - return tr("Unknown"); } }; diff --git a/src/src.pro b/src/src.pro index 8689f4d81..f5f877f48 100644 --- a/src/src.pro +++ b/src/src.pro @@ -19,15 +19,15 @@ DEFINES += VERSION_BUGFIX=0 contains(DEBUG_MODE, 1){ CONFIG += debug CONFIG -= release - QMAKE_CXXFLAGS_RELEASE += -O1 - QMAKE_CXXFLAGS_DEBUG += -O1 + QMAKE_CXXFLAGS_RELEASE += -fwrapv -O1 + QMAKE_CXXFLAGS_DEBUG += -fwrapv -O1 message(Debug build!) } contains(DEBUG_MODE, 0){ CONFIG -= debug CONFIG += release - QMAKE_CXXFLAGS_RELEASE += -O2 - QMAKE_CXXFLAGS_DEBUG += -O2 + QMAKE_CXXFLAGS_RELEASE += -fwrapv -O2 + QMAKE_CXXFLAGS_DEBUG += -fwrapv -O2 message(Release build!) }