From 13f21ef6cdfebc8a393882491b12e35c6e885c5b Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Fri, 17 Aug 2007 02:03:13 +0000 Subject: [PATCH] - Make use of new torrent_checked_alert that was just included in libtorrent. This allowed to improve torrent that just finished checking handling and progress column sorting. Also allowed to optimize cpu/memory usage a little. --- TODO | 6 ++-- src/FinishedTorrents.cpp | 17 ----------- src/GUI.cpp | 64 +++++++++++++++++++++++++--------------- src/GUI.h | 1 + src/bittorrent.cpp | 46 +++++++++++------------------ src/bittorrent.h | 7 ++--- src/torrentAddition.h | 5 ++-- 7 files changed, 66 insertions(+), 80 deletions(-) diff --git a/TODO b/TODO index 1635e448f..a01a6c0b6 100644 --- a/TODO +++ b/TODO @@ -46,10 +46,8 @@ - wait for fastresume data on exit should be in a thread? * beta5 - Translations update (IN PROGRESS) - - make use of finishedChecking alert if hydri applies my patch for this - - Clean up delayed progress column sorting code - - Clean up pause after checking code - Check incremental download (looks broken) + - improve torrentFinishedList with new alert - Wait for some bug fixes in libtorrent : - upload/download limit per torrent (Ticket #83) @@ -69,6 +67,8 @@ LANGUAGES UPDATED: beta4->beta5 changelog: - FEATURE: Supports Bittorrent FAST extension +- FEATURE: Improved code handling torrents that have just finished checking +- FEATURE: Improved progress column sorting code - BUGFIX: Wait for torrent_paused_alert before saving fast resume data on exit - BUGFIX: Wait for torrent_paused_alert before reloading a torrent for full allocation mode - BUFFIG: Fixed overflow causing ratio data to be negative diff --git a/src/FinishedTorrents.cpp b/src/FinishedTorrents.cpp index 2609af504..fad1424e0 100644 --- a/src/FinishedTorrents.cpp +++ b/src/FinishedTorrents.cpp @@ -173,23 +173,6 @@ void FinishedTorrents::updateFinishedList(){ std::cerr << "ERROR: Can't find torrent in finished list\n"; continue; } - if(BTSession->getTorrentsToPauseAfterChecking().indexOf(hash) != -1){ - // Pause torrent if it finished checking and it is was supposed to be paused. - // This is a trick to see the progress of the pause torrents on startup - if(torrentStatus.state != torrent_status::checking_files && torrentStatus.state != torrent_status::queued_for_checking){ - qDebug("Paused torrent finished checking with state: %d", torrentStatus.state); - finishedListModel->setData(finishedListModel->index(row, F_PROGRESS), QVariant((double)torrentStatus.progress)); - finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(":/Icons/skin/paused.png")), Qt::DecorationRole); - setRowColor(row, "red"); - BTSession->pauseTorrent(hash); - continue; - } - } - if(BTSession->getUncheckedTorrentsList().indexOf(hash) != -1){ - if(torrentStatus.state != torrent_status::checking_files && torrentStatus.state != torrent_status::queued_for_checking){ - BTSession->setTorrentFinishedChecking(hash); - } - } if(h.is_paused()) continue; if(torrentStatus.state == torrent_status::downloading || (torrentStatus.state != torrent_status::checking_files && torrentStatus.state != torrent_status::queued_for_checking && torrentStatus.progress != 1.)) { // What are you doing here? go back to download tab! diff --git a/src/GUI.cpp b/src/GUI.cpp index cfc4075f5..fe8057055 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -138,7 +138,6 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent){ connect(BTSession, SIGNAL(finishedTorrent(torrent_handle&)), this, SLOT(finishedTorrent(torrent_handle&))); connect(BTSession, SIGNAL(fullDiskError(torrent_handle&)), this, SLOT(fullDiskError(torrent_handle&))); connect(BTSession, SIGNAL(portListeningFailure()), this, SLOT(portListeningFailure())); - connect(BTSession,SIGNAL(allTorrentsFinishedChecking()), this, SLOT(sortProgressColumnDelayed())); connect(BTSession, SIGNAL(trackerAuthenticationRequired(torrent_handle&)), this, SLOT(trackerAuthenticationRequired(torrent_handle&))); connect(BTSession, SIGNAL(peerBlocked(QString)), this, SLOT(addLogPeerBlocked(const QString))); connect(BTSession, SIGNAL(fastResumeDataRejected(QString)), this, SLOT(addFastResumeRejectedAlert(QString))); @@ -147,6 +146,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent){ connect(BTSession, SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString))); connect(BTSession, SIGNAL(aboutToDownloadFromUrl(QString)), this, SLOT(displayDownloadingUrlInfos(QString))); connect(BTSession, SIGNAL(urlSeedProblem(QString, QString)), this, SLOT(addUrlSeedError(QString, QString))); + connect(BTSession, SIGNAL(torrentFinishedChecking(QString)), this, SLOT(torrentChecked(QString))); // creating options options = new options_imp(this); connect(options, SIGNAL(status_changed(QString, bool)), this, SLOT(OptionsSaved(QString, bool))); @@ -562,23 +562,6 @@ void GUI::updateDlList(bool force){ row = getRowFromHash(fileHash); } Q_ASSERT(row != -1); - if(BTSession->getTorrentsToPauseAfterChecking().indexOf(fileHash) != -1){ - // Pause torrent if it finished checking and it is was supposed to be paused. - // This is a trick to see the progress of the pause torrents on startup - if(torrentStatus.state != torrent_status::checking_files && torrentStatus.state != torrent_status::queued_for_checking){ - qDebug("Paused torrent finished checking with state: %d", torrentStatus.state); - DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)torrentStatus.progress)); - DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/paused.png")), Qt::DecorationRole); - setRowColor(row, "red"); - BTSession->pauseTorrent(fileHash); - continue; - } - } - if(delayedSorting && BTSession->getUncheckedTorrentsList().indexOf(fileHash) != -1){ - if(torrentStatus.state != torrent_status::checking_files && torrentStatus.state != torrent_status::queued_for_checking){ - BTSession->setTorrentFinishedChecking(fileHash); - } - } // No need to update a paused torrent if(h.is_paused()) continue; // Parse download state @@ -924,7 +907,7 @@ void GUI::dropEvent(QDropEvent *event){ } if(useTorrentAdditionDialog){ torrentAdditionDialog *dialog = new torrentAdditionDialog(this); - connect(dialog, SIGNAL(torrentAddition(QString, bool, bool, QString)), BTSession, SLOT(addTorrent(QString, bool, bool, QString))); + connect(dialog, SIGNAL(torrentAddition(QString, bool, QString)), BTSession, SLOT(addTorrent(QString, bool, QString))); connect(dialog, SIGNAL(setInfoBarGUI(QString, QString)), this, SLOT(setInfoBar(QString, QString))); dialog->showLoad(file); }else{ @@ -963,7 +946,7 @@ void GUI::on_actionOpen_triggered(){ for(unsigned int i=0; ishowLoad(pathsList.at(i)); }else{ @@ -1184,7 +1167,7 @@ void GUI::processParams(const QStringList& params){ }else{ if(useTorrentAdditionDialog){ torrentAdditionDialog *dialog = new torrentAdditionDialog(this); - connect(dialog, SIGNAL(torrentAddition(QString, bool, bool, QString)), BTSession, SLOT(addTorrent(QString, bool, bool, QString))); + connect(dialog, SIGNAL(torrentAddition(QString, bool, QString)), BTSession, SLOT(addTorrent(QString, bool, QString))); connect(dialog, SIGNAL(setInfoBarGUI(QString, QString)), this, SLOT(setInfoBar(QString, QString))); dialog->showLoad(param); }else{ @@ -1201,7 +1184,7 @@ void GUI::processScannedFiles(const QStringList& params){ foreach(param, params){ if(useTorrentAdditionDialog){ torrentAdditionDialog *dialog = new torrentAdditionDialog(this); - connect(dialog, SIGNAL(torrentAddition(QString, bool, bool, QString)), BTSession, SLOT(addTorrent(QString, bool, bool, QString))); + connect(dialog, SIGNAL(torrentAddition(QString, bool, QString)), BTSession, SLOT(addTorrent(QString, bool, QString))); connect(dialog, SIGNAL(setInfoBarGUI(QString, QString)), this, SLOT(setInfoBar(QString, QString))); dialog->showLoad(param, true); }else{ @@ -1215,11 +1198,11 @@ void GUI::processDownloadedFiles(QString path, QString url){ bool useTorrentAdditionDialog = settings.value("Options/Misc/TorrentAdditionDialog/Enabled", true).toBool(); if(useTorrentAdditionDialog){ torrentAdditionDialog *dialog = new torrentAdditionDialog(this); - connect(dialog, SIGNAL(torrentAddition(QString, bool, bool, QString)), BTSession, SLOT(addTorrent(QString, bool, bool, QString))); + connect(dialog, SIGNAL(torrentAddition(QString, bool, QString)), BTSession, SLOT(addTorrent(QString, bool, QString))); connect(dialog, SIGNAL(setInfoBarGUI(QString, QString)), this, SLOT(setInfoBar(QString, QString))); dialog->showLoad(path, false, url); }else{ - BTSession->addTorrent(path, false, false, url); + BTSession->addTorrent(path, false, url); } } @@ -1614,6 +1597,39 @@ void GUI::finishedTorrent(torrent_handle& h){ } } +// Called when a torrent finished checking +void GUI::torrentChecked(QString hash){ + // Check if the torrent was paused after checking + if(BTSession->isPaused(hash)){ + // Was paused, change its icon/color + if(finishedTorrentTab->getFinishedSHAs().indexOf(hash) != -1){ + // In finished list + qDebug("Automatically paused torrent was in finished list"); + int row = finishedTorrentTab->getRowFromHash(hash); + finishedTorrentTab->getFinishedListModel()->setData(finishedTorrentTab->getFinishedListModel()->index(row, F_UPSPEED), QVariant((double)0.0)); + finishedTorrentTab->getFinishedListModel()->setData(finishedTorrentTab->getFinishedListModel()->index(row, F_NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole); + finishedTorrentTab->setRowColor(row, "red"); + }else{ + // In download list + int row = getRowFromHash(hash); + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.0)); + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.0)); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + DLListModel->setData(DLListModel->index(row, NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole); + setRowColor(row, "red"); + } + } + if(finishedTorrentTab->getFinishedSHAs().indexOf(hash) == -1) { + // Update progress in download list + torrent_handle h = BTSession->getTorrentHandle(hash); + torrent_status torrentStatus = h.status(); + int row = getRowFromHash(hash); + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)torrentStatus.progress)); + // Delayed Sorting + sortProgressColumnDelayed(); + } +} + // Notification when disk is full void GUI::fullDiskError(torrent_handle& h){ QSettings settings("qBittorrent", "qBittorrent"); diff --git a/src/GUI.h b/src/GUI.h index 59373bd8c..a8954477b 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -153,6 +153,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{ void processDownloadedFiles(QString path, QString url); void downloadFromURLList(const QStringList& urls); void displayDownloadingUrlInfos(QString url); + void torrentChecked(QString hash); // Utils slots void setRowColor(int row, QString color); // Options slots diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index b8b962b0b..2e53efbe2 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -226,7 +226,6 @@ bool bittorrent::pauseTorrent(QString hash){ int index = torrentsToPauseAfterChecking.indexOf(hash); if(index != -1) { torrentsToPauseAfterChecking.removeAt(index); - qDebug("A torrent was paused just after checking, good"); } return change; } @@ -273,7 +272,7 @@ void bittorrent::loadWebSeeds(QString fileHash){ } // Add a torrent to the bittorrent session -void bittorrent::addTorrent(QString path, bool fromScanDir, bool onStartup, QString from_url){ +void bittorrent::addTorrent(QString path, bool fromScanDir, QString from_url){ torrent_handle h; entry resume_data; bool fastResume=false; @@ -303,10 +302,6 @@ void bittorrent::addTorrent(QString path, bool fromScanDir, bool onStartup, QStr // Getting torrent file informations torrent_info t(e); QString hash = QString(misc::toString(t.info_hash()).c_str()); - if(onStartup){ - qDebug("Added a hash to the unchecked torrents list"); - torrentsUnchecked << hash; - } if(s->find_torrent(t.info_hash()).is_valid()){ // Update info Bar if(!fromScanDir){ @@ -436,10 +431,6 @@ void bittorrent::addTorrent(QString path, bool fromScanDir, bool onStartup, QStr } } -QStringList bittorrent::getTorrentsToPauseAfterChecking() const{ - return torrentsToPauseAfterChecking; -} - // Set the maximum number of opened connections void bittorrent::setMaxConnections(int maxConnec){ s->set_max_connections(maxConnec); @@ -695,7 +686,7 @@ void bittorrent::saveFastResumeAndRatioData(){ h.pause(); QString fileHash = QString(misc::toString(h.info_hash()).c_str()); while(!receivedPausedAlert(fileHash)){ - qDebug("Sleeping while waiting that %s is paused", misc::toString(h.info_hash()).c_str()); + //qDebug("Sleeping while waiting that %s is paused", misc::toString(h.info_hash()).c_str()); //printPausedTorrents(); SleeperThread::msleep(500); readAlerts(); @@ -968,6 +959,17 @@ void bittorrent::readAlerts(){ else if (url_seed_alert* p = dynamic_cast(a.get())){ emit urlSeedProblem(QString(p->url.c_str()), QString(p->msg().c_str())); } + else if (torrent_checked_alert* p = dynamic_cast(a.get())){ + QString hash = QString(misc::toString(p->handle.info_hash()).c_str()); + qDebug("%s have just finished checking", (const char*)hash.toUtf8()); + int index = torrentsToPauseAfterChecking.indexOf(hash); + if(index != -1){ + // Pause torrent + pauseTorrent(hash); + qDebug("%s was paused after checking", (const char*)hash.toUtf8()); + } + emit torrentFinishedChecking(hash); + } a = s->pop_alert(); } } @@ -976,6 +978,10 @@ QList > bittorrent::getTrackersErrors(QString hash) cons return trackersErrors.value(hash, QList >()); } +QStringList bittorrent::getTorrentsToPauseAfterChecking() const{ + return torrentsToPauseAfterChecking; +} + // Function to reload the torrent async after the torrent is actually // paused so that we can get fastresume data void bittorrent::pauseAndReloadTorrent(const torrent_handle &h){ @@ -1166,22 +1172,6 @@ std::vector bittorrent::getTorrentHandles() const{ return s->get_torrents(); } -QStringList bittorrent::getUncheckedTorrentsList() const{ - return torrentsUnchecked; -} - -void bittorrent::setTorrentFinishedChecking(QString hash){ - int index = torrentsUnchecked.indexOf(hash); - qDebug("torrent %s finished checking", (const char*)hash.toUtf8()); - if(index != -1){ - torrentsUnchecked.removeAt(index); - qDebug("Still %d unchecked torrents", torrentsUnchecked.size()); - if(torrentsUnchecked.size() == 0){ - emit allTorrentsFinishedChecking(); - } - } -} - // Save DHT entry to hard drive void bittorrent::saveDHTEntry(){ // Save DHT entry @@ -1219,7 +1209,7 @@ void bittorrent::resumeUnfinishedTorrents(){ } // Resume downloads foreach(fileName, filePaths){ - addTorrent(fileName, false, true); + addTorrent(fileName, false); } qDebug("Unfinished torrents resumed"); } diff --git a/src/bittorrent.h b/src/bittorrent.h index 474f6a0c9..22ef14395 100644 --- a/src/bittorrent.h +++ b/src/bittorrent.h @@ -48,7 +48,6 @@ class bittorrent : public QObject{ QStringList supported_preview_extensions; QString defaultSavePath; QStringList torrentsToPauseAfterChecking; - QStringList torrentsUnchecked; QStringList reloadingTorrents; QHash > ETAstats; QHash ETAs; @@ -77,7 +76,6 @@ class bittorrent : public QObject{ session_status getSessionStatus() const; int getListenPort() const; QStringList getTorrentsToPauseAfterChecking() const; - QStringList getUncheckedTorrentsList() const; long getETA(QString hash) const; size_type torrentEffectiveSize(QString hash) const; bool inFullAllocationMode(QString hash) const; @@ -88,7 +86,7 @@ class bittorrent : public QObject{ void printPausedTorrents(); public slots: - void addTorrent(QString path, bool fromScanDir = false, bool onStartup = false, QString from_url = QString()); + void addTorrent(QString path, bool fromScanDir = false, QString from_url = QString()); void downloadFromUrl(QString url); void downloadFromURLList(const QStringList& url_list); void deleteTorrent(QString hash, bool permanent = false); @@ -104,7 +102,6 @@ class bittorrent : public QObject{ void enableIPFilter(ip_filter filter); void disableIPFilter(); void pauseAndReloadTorrent(const torrent_handle &h); - void setTorrentFinishedChecking(QString hash); void resumeUnfinishedTorrents(); void updateETAs(); void saveTorrentSpeedLimits(QString hash); @@ -149,11 +146,11 @@ class bittorrent : public QObject{ void newDownloadedTorrent(QString path, QString url); void aboutToDownloadFromUrl(QString url); void updateFileSize(QString hash); - void allTorrentsFinishedChecking(); void peerBlocked(QString); void downloadFromUrlFailure(QString url, QString reason); void fastResumeDataRejected(QString name); void urlSeedProblem(QString url, QString msg); + void torrentFinishedChecking(QString hash); }; diff --git a/src/torrentAddition.h b/src/torrentAddition.h index 66b401366..29843d9f0 100644 --- a/src/torrentAddition.h +++ b/src/torrentAddition.h @@ -45,7 +45,7 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{ signals: void setInfoBarGUI(QString info, QString color); - void torrentAddition(QString filePath, bool fromScanDir, bool onStartup, QString from_url); + void torrentAddition(QString filePath, bool fromScanDir, QString from_url); private: QString fileName; @@ -335,8 +335,7 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{ // save filtered files savePiecesPriorities(); // Add to download list - // TODO : quick fix - emit torrentAddition(filePath, fromScanDir, false, from_url); + emit torrentAddition(filePath, fromScanDir, from_url); close(); }