Browse Source

made ETA calculation more reliable

adaptive-webui-19844
Christophe Dumez 18 years ago
parent
commit
80f61880b7
  1. 1
      Changelog
  2. 1
      TODO
  3. 4
      src/GUI.cpp
  4. 46
      src/bittorrent.cpp
  5. 6
      src/bittorrent.h

1
Changelog

@ -20,6 +20,7 @@
- FEATURE: Added a way to link against static libtorrent (useful for deb packages) - FEATURE: Added a way to link against static libtorrent (useful for deb packages)
- BUGFIX: Progress of paused torrents is now correct on restart - BUGFIX: Progress of paused torrents is now correct on restart
- BUGFIX: Progress column gets sorted on restart it is was during last execution - BUGFIX: Progress column gets sorted on restart it is was during last execution
- BUGFIX: Made ETA more reliable using stats instead of instant values
- COSMETIC: Redesigned torrent properties a little - COSMETIC: Redesigned torrent properties a little
- COSMETIC: Redesigned options a little - COSMETIC: Redesigned options a little
- COSMETIC: Display more logs messages concerning features - COSMETIC: Display more logs messages concerning features

1
TODO

@ -46,3 +46,4 @@
- Allow to scan multiple directories - Allow to scan multiple directories
- Fix all (or almost all) opened bugs in bug tracker - Fix all (or almost all) opened bugs in bug tracker
- Fix sorting with Qt 4.3 - Reported to Trolltech, waiting for fix - Fix sorting with Qt 4.3 - Reported to Trolltech, waiting for fix
- update sorting when a new torrent is added

4
src/GUI.cpp

@ -534,7 +534,7 @@ void GUI::updateDlList(bool force){
if(torrentStatus.download_payload_rate > 0){ if(torrentStatus.download_payload_rate > 0){
// Display "Downloading" status when connecting if download speed > 0 // Display "Downloading" status when connecting if download speed > 0
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading..."))); DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading...")));
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)((ti.total_size()-torrentStatus.total_done)/(double)torrentStatus.download_payload_rate))); DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)BTSession.getETA(fileHash)));
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole); DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole);
setRowColor(row, "green"); setRowColor(row, "green");
}else{ }else{
@ -552,7 +552,7 @@ void GUI::updateDlList(bool force){
if(torrentStatus.download_payload_rate > 0){ if(torrentStatus.download_payload_rate > 0){
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading..."))); DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading...")));
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole); DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole);
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)((ti.total_size()-torrentStatus.total_done)/(double)torrentStatus.download_payload_rate))); DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)BTSession.getETA(fileHash)));
setRowColor(row, "green"); setRowColor(row, "green");
}else{ }else{
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Stalled", "i.e: State of a torrent whose download speed is 0kb/s"))); DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Stalled", "i.e: State of a torrent whose download speed is 0kb/s")));

46
src/bittorrent.cpp

@ -28,6 +28,8 @@
#include "misc.h" #include "misc.h"
#include "downloadThread.h" #include "downloadThread.h"
#define ETAS_MAX_VALUES 5
// Main constructor // Main constructor
bittorrent::bittorrent(){ bittorrent::bittorrent(){
// To avoid some exceptions // To avoid some exceptions
@ -51,11 +53,6 @@ bittorrent::bittorrent(){
connect(downloader, SIGNAL(downloadFinished(const QString&, const QString&, int, const QString&)), this, SLOT(processDownloadedFile(const QString&, const QString&, int, const QString&))); connect(downloader, SIGNAL(downloadFinished(const QString&, const QString&, int, const QString&)), this, SLOT(processDownloadedFile(const QString&, const QString&, int, const QString&)));
} }
void bittorrent::resumeUnfinishedTorrents(){
// Resume unfinished torrents
resumeUnfinished();
}
// Main destructor // Main destructor
bittorrent::~bittorrent(){ bittorrent::~bittorrent(){
disableDirectoryScanning(); disableDirectoryScanning();
@ -64,6 +61,40 @@ bittorrent::~bittorrent(){
delete s; delete s;
} }
void bittorrent::resumeUnfinishedTorrents(){
// Resume unfinished torrents
resumeUnfinished();
}
void bittorrent::updateETAs(){
std::vector<torrent_handle> handles = s->get_torrents();
for(unsigned int i=0; i<handles.size(); ++i){
torrent_handle h = handles[i];
if(h.is_valid()){
QString hash = QString(misc::toString(h.info_hash()).c_str());
QList<long> listEtas = ETAstats.value(hash, QList<long>());
if(listEtas.size() == ETAS_MAX_VALUES){
long moy = 0;
long val;
foreach(val, listEtas){
moy += val;
}
ETAs[hash] = (long) ((double)moy/(double)ETAS_MAX_VALUES);
ETAstats[hash] = QList<long>();
}else{
torrent_status torrentStatus = h.status();
torrent_info ti = h.get_torrent_info();
listEtas << (long)((ti.total_size()-torrentStatus.total_done)/(double)torrentStatus.download_payload_rate);
ETAstats[hash] = listEtas;
}
}
}
}
long bittorrent::getETA(QString hash) const{
return ETAs.value(hash, -1);
}
// Return the torrent handle, given its hash // Return the torrent handle, given its hash
torrent_handle bittorrent::getTorrentHandle(const QString& hash) const{ torrent_handle bittorrent::getTorrentHandle(const QString& hash) const{
return s->find_torrent(misc::fromString<sha1_hash>((hash.toStdString()))); return s->find_torrent(misc::fromString<sha1_hash>((hash.toStdString())));
@ -101,6 +132,9 @@ void bittorrent::deleteTorrent(const QString& hash, bool permanent){
torrentBackup.remove(hash+".priorities"); torrentBackup.remove(hash+".priorities");
torrentBackup.remove(hash+".savepath"); torrentBackup.remove(hash+".savepath");
torrentBackup.remove(hash+".trackers"); torrentBackup.remove(hash+".trackers");
// Remove it fro ETAs hash tables
ETAstats.take(hash);
ETAs.take(hash);
if(permanent){ if(permanent){
// Remove from Hard drive // Remove from Hard drive
qDebug("Removing this on hard drive: %s", qPrintable(savePath+QDir::separator()+fileName)); qDebug("Removing this on hard drive: %s", qPrintable(savePath+QDir::separator()+fileName));
@ -674,6 +708,8 @@ void bittorrent::readAlerts(){
} }
a = s->pop_alert(); a = s->pop_alert();
} }
// ETAs
updateETAs();
} }
void bittorrent::reloadTorrent(const torrent_handle &h, bool compact_mode){ void bittorrent::reloadTorrent(const torrent_handle &h, bool compact_mode){

6
src/bittorrent.h

@ -21,6 +21,8 @@
#ifndef __BITTORRENT_H__ #ifndef __BITTORRENT_H__
#define __BITTORRENT_H__ #define __BITTORRENT_H__
#include <QHash>
#include <libtorrent/entry.hpp> #include <libtorrent/entry.hpp>
#include <libtorrent/bencode.hpp> #include <libtorrent/bencode.hpp>
#include <libtorrent/session.hpp> #include <libtorrent/session.hpp>
@ -59,6 +61,8 @@ class bittorrent : public QObject{
QString defaultSavePath; QString defaultSavePath;
QStringList torrentsToPauseAfterChecking; QStringList torrentsToPauseAfterChecking;
QStringList torrentsUnchecked; QStringList torrentsUnchecked;
QHash<QString, QList<long> > ETAstats;
QHash<QString, long> ETAs;
protected: protected:
QString getSavePath(const QString& hash); QString getSavePath(const QString& hash);
@ -80,6 +84,7 @@ class bittorrent : public QObject{
int getListenPort() const; int getListenPort() const;
QStringList getTorrentsToPauseAfterChecking() const; QStringList getTorrentsToPauseAfterChecking() const;
QStringList getUncheckedTorrentsList() const; QStringList getUncheckedTorrentsList() const;
long getETA(QString hash) const;
public slots: public slots:
void addTorrent(const QString& path, bool fromScanDir = false, bool onStartup = false, const QString& from_url = QString()); void addTorrent(const QString& path, bool fromScanDir = false, bool onStartup = false, const QString& from_url = QString());
@ -102,6 +107,7 @@ class bittorrent : public QObject{
void reloadTorrent(const torrent_handle &h, bool compact_mode = true); void reloadTorrent(const torrent_handle &h, bool compact_mode = true);
void setTorrentFinishedChecking(QString hash); void setTorrentFinishedChecking(QString hash);
void resumeUnfinishedTorrents(); void resumeUnfinishedTorrents();
void updateETAs();
// Session configuration - Setters // Session configuration - Setters
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports); void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
void setMaxConnections(int maxConnec); void setMaxConnections(int maxConnec);

Loading…
Cancel
Save