From 9b67807926f748f9a6e6e463cdbc7d73f5f78964 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 2 Nov 2008 11:43:20 +0000 Subject: [PATCH] - Queueing system should work fine now (port is complete, needs testing) --- src/FinishedListDelegate.h | 3 +- src/FinishedTorrents.cpp | 48 ++------------ src/FinishedTorrents.h | 2 - src/GUI.cpp | 11 +--- src/bittorrent.cpp | 24 +------ src/bittorrent.h | 6 +- src/downloadingTorrents.cpp | 4 +- src/eventmanager.cpp | 128 ++++++++++++++++++------------------ src/qtorrenthandle.cpp | 19 +++++- src/qtorrenthandle.h | 3 + src/seeding.ui | 38 ++--------- 11 files changed, 105 insertions(+), 181 deletions(-) diff --git a/src/FinishedListDelegate.h b/src/FinishedListDelegate.h index 214633361..cdd9bc748 100644 --- a/src/FinishedListDelegate.h +++ b/src/FinishedListDelegate.h @@ -37,8 +37,7 @@ #define F_UPSPEED 2 #define F_LEECH 3 #define F_RATIO 4 -#define F_PRIORITY 5 -#define F_HASH 6 +#define F_HASH 5 class FinishedListDelegate: public QItemDelegate { Q_OBJECT diff --git a/src/FinishedTorrents.cpp b/src/FinishedTorrents.cpp index 07bb49d67..6bba0f818 100644 --- a/src/FinishedTorrents.cpp +++ b/src/FinishedTorrents.cpp @@ -38,17 +38,14 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png"))); actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png"))); connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), this, SLOT(torrentAdded(QTorrentHandle&))); - finishedListModel = new QStandardItemModel(0,7); + finishedListModel = new QStandardItemModel(0,6); finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name")); finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); finishedListModel->setHeaderData(F_UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed")); finishedListModel->setHeaderData(F_LEECH, Qt::Horizontal, tr("Leechers", "i.e: full/partial sources")); finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio")); - finishedListModel->setHeaderData(F_PRIORITY, Qt::Horizontal, tr("Priority")); finishedList->setModel(finishedListModel); loadHiddenColumns(); - // Hide priority column - finishedList->hideColumn(F_PRIORITY); // Hide hash column finishedList->hideColumn(F_HASH); // Load last columns width for download list @@ -74,8 +71,6 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered())); connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered())); connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered())); - connect(actionIncreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionIncreasePriority_triggered())); - connect(actionDecreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDecreasePriority_triggered())); connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered())); connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered())); connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder())); @@ -87,7 +82,6 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed())); connect(actionHOSColLeechers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnLeechers())); connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio())); - connect(actionHOSColPriority, SIGNAL(triggered()), this, SLOT(hideOrShowColumnPriority())); } FinishedTorrents::~FinishedTorrents(){ @@ -103,14 +97,6 @@ void FinishedTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) { emit torrentDoubleClicked(hash, true); } -void FinishedTorrents::hidePriorityColumn(bool hide) { - finishedList->setColumnHidden(F_PRIORITY, hide); - if(hide) - getActionHoSCol(F_PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png"))); - else - getActionHoSCol(F_PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png"))); -} - void FinishedTorrents::addTorrent(QString hash){ if(!BTSession->isFinished(hash)){ BTSession->setFinishedTorrent(hash); @@ -126,8 +112,6 @@ void FinishedTorrents::addTorrent(QString hash){ finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.)); finishedListModel->setData(finishedListModel->index(row, F_LEECH), QVariant("0")); finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(QString::fromUtf8(misc::toString(BTSession->getRealRatio(hash)).c_str()))); - if(BTSession->isQueueingEnabled()) - finishedListModel->setData(finishedListModel->index(row, F_PRIORITY), QVariant((int)BTSession->getUpTorrentPriority(hash))); finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash)); if(h.is_paused()) { finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole); @@ -271,15 +255,12 @@ void FinishedTorrents::updateFinishedList(){ row = getRowFromHash(hash); } Q_ASSERT(row != -1); - // Update priority - if(BTSession->isQueueingEnabled()) { - finishedListModel->setData(finishedListModel->index(row, F_PRIORITY), QVariant((int)BTSession->getUpTorrentPriority(hash))); - if(h.is_paused() && BTSession->isUploadQueued(hash)) { + // Update queued torrent + if(BTSession->isQueueingEnabled() && BTSession->isTorrentQueued(hash)) { finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole); setRowColor(row, QString::fromUtf8("grey")); - } } - if(h.is_paused()) continue; + if(h.is_paused() || h.is_queued()) continue; if(h.state() == torrent_status::downloading || (h.state() != torrent_status::checking_files && h.state() != torrent_status::queued_for_checking && h.progress() < 1.)) { // What are you doing here? go back to download tab! int reponse = QMessageBox::question(this, tr("Incomplete torrent in seeding list"), tr("It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted)").arg(h.name()), QMessageBox::Yes | QMessageBox::No); @@ -428,11 +409,6 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){ myFinishedListMenu.addSeparator(); myFinishedListMenu.addAction(actionOpen_destination_folder); myFinishedListMenu.addAction(actionTorrent_Properties); - if(BTSession->isQueueingEnabled()) { - myFinishedListMenu.addSeparator(); - myFinishedListMenu.addAction(actionIncreasePriority); - myFinishedListMenu.addAction(actionDecreasePriority); - } myFinishedListMenu.addSeparator(); myFinishedListMenu.addAction(actionBuy_it); @@ -450,12 +426,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){ void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){ QMenu hideshowColumn(this); hideshowColumn.setTitle(tr("Hide or Show Column")); - int lastCol; - if(BTSession->isQueueingEnabled()) { - lastCol = F_PRIORITY; - } else { - lastCol = F_RATIO; - } + int lastCol = F_RATIO; for(int i=0; i<=lastCol; i++) { hideshowColumn.addAction(getActionHoSCol(i)); } @@ -514,10 +485,6 @@ void FinishedTorrents::hideOrShowColumnRatio() { hideOrShowColumn(F_RATIO); } -void FinishedTorrents::hideOrShowColumnPriority() { - hideOrShowColumn(F_PRIORITY); -} - // load the previous settings, and hide the columns bool FinishedTorrents::loadHiddenColumns() { bool loaded = false; @@ -579,9 +546,6 @@ QAction* FinishedTorrents::getActionHoSCol(int index) { case F_RATIO : return actionHOSColRatio; break; - case F_PRIORITY : - return actionHOSColPriority; - break; default : return NULL; } @@ -600,7 +564,6 @@ void FinishedTorrents::toggleFinishedListSortOrder(int index) { switch(index) { case F_SIZE: case F_UPSPEED: - case F_PRIORITY: sortFinishedListFloat(index, sortOrder); break; default: @@ -625,7 +588,6 @@ void FinishedTorrents::sortFinishedList(int index, Qt::SortOrder sortOrder){ switch(index) { case F_SIZE: case F_UPSPEED: - case F_PRIORITY: sortFinishedListFloat(index, sortOrder); break; default: diff --git a/src/FinishedTorrents.h b/src/FinishedTorrents.h index fe3aaec75..dd2308bbd 100644 --- a/src/FinishedTorrents.h +++ b/src/FinishedTorrents.h @@ -74,7 +74,6 @@ class FinishedTorrents : public QWidget, public Ui::seeding { void hideOrShowColumnUpSpeed(); void hideOrShowColumnLeechers(); void hideOrShowColumnRatio(); - void hideOrShowColumnPriority(); public slots: void addTorrent(QString hash); @@ -84,7 +83,6 @@ class FinishedTorrents : public QWidget, public Ui::seeding { void propertiesSelection(); void deleteTorrent(QString hash); void showPropertiesFromHash(QString hash); - void hidePriorityColumn(bool hide); signals: void torrentMovedFromFinishedList(QString); diff --git a/src/GUI.cpp b/src/GUI.cpp index 8031e3de8..f406743f4 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -1035,7 +1035,6 @@ void GUI::configureSession(bool deleteOptions) { if(options->isQueueingSystemEnabled()) { if(!BTSession->isQueueingEnabled()) { downloadingTorrentTab->hidePriorityColumn(false); - finishedTorrentTab->hidePriorityColumn(false); actionDecreasePriority->setVisible(true); actionIncreasePriority->setVisible(true); prioSeparator->setVisible(true); @@ -1056,8 +1055,6 @@ void GUI::configureSession(bool deleteOptions) { sessionSettings.active_seeds = -1; BTSession->setQueueingEnabled(false); downloadingTorrentTab->hidePriorityColumn(true); - finishedTorrentTab->hidePriorityColumn(true); - actionDecreasePriority->setVisible(false); actionIncreasePriority->setVisible(false); prioSeparator->setVisible(false); prioSeparator2->setVisible(false); @@ -1208,7 +1205,7 @@ void GUI::togglePausedState(QString hash) { if(tabs->currentIndex() == 1) inDownloadList = false; QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(BTSession->isPaused(hash) && !(BTSession->isQueueingEnabled() && (BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash)))) { + if(BTSession->isPaused(hash)) { BTSession->resumeTorrent(hash); if(inDownloadList) { downloadingTorrentTab->resumeTorrent(hash); @@ -1268,9 +1265,6 @@ void GUI::on_actionIncreasePriority_triggered() { if(inDownloadList) { BTSession->increaseDlTorrentPriority(hash); downloadingTorrentTab->updateDlList(); - } else { - BTSession->increaseUpTorrentPriority(hash); - finishedTorrentTab->updateFinishedList(); } } } @@ -1291,9 +1285,6 @@ void GUI::on_actionDecreasePriority_triggered() { if(inDownloadList) { BTSession->decreaseDlTorrentPriority(hash); downloadingTorrentTab->updateDlList(); - } else { - BTSession->decreaseUpTorrentPriority(hash); - finishedTorrentTab->updateFinishedList(); } } } diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index dc514136d..9221b7133 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -163,35 +163,16 @@ void bittorrent::increaseDlTorrentPriority(QString hash) { h.queue_position_up(); } -void bittorrent::increaseUpTorrentPriority(QString hash) { - Q_ASSERT(queueingEnabled); - QTorrentHandle h = getTorrentHandle(hash); - h.queue_position_up(); -} - void bittorrent::decreaseDlTorrentPriority(QString hash) { Q_ASSERT(queueingEnabled); QTorrentHandle h = getTorrentHandle(hash); h.queue_position_down(); } -void bittorrent::decreaseUpTorrentPriority(QString hash) { - Q_ASSERT(queueingEnabled); - QTorrentHandle h = getTorrentHandle(hash); - h.queue_position_down(); -} - -bool bittorrent::isDownloadQueued(QString hash) const { - Q_ASSERT(queueingEnabled); - QTorrentHandle h = getTorrentHandle(hash); - return h.queue_position() >= 0; -} - -bool bittorrent::isUploadQueued(QString hash) const { - // FIXME: libtorrent does not support this. +bool bittorrent::isTorrentQueued(QString hash) const { Q_ASSERT(queueingEnabled); QTorrentHandle h = getTorrentHandle(hash); - return h.queue_position() >= 0; + return h.is_queued(); } void bittorrent::setUploadLimit(QString hash, long val) { @@ -220,6 +201,7 @@ void bittorrent::setQueueingEnabled(bool enable) { int bittorrent::getDlTorrentPriority(QString hash) const { Q_ASSERT(queueingEnabled); QTorrentHandle h = getTorrentHandle(hash); + qDebug("Priority for %s is %d", h.name().toUtf8().data(), h.queue_position()); return h.queue_position(); } diff --git a/src/bittorrent.h b/src/bittorrent.h index d89f2990e..38ad1da39 100644 --- a/src/bittorrent.h +++ b/src/bittorrent.h @@ -107,8 +107,8 @@ class bittorrent : public QObject { int getUpTorrentPriority(QString hash) const; int getMaximumActiveDownloads() const; int getMaximumActiveTorrents() const; - bool isDownloadQueued(QString hash) const; - bool isUploadQueued(QString hash) const; + bool isTorrentQueued(QString hash) const; + bool is_auto_managed() const; int loadTorrentPriority(QString hash); QStringList getConsoleMessages() const; QStringList getPeerBanMessages() const; @@ -140,8 +140,6 @@ class bittorrent : public QObject { void loadWebSeeds(QString fileHash); void increaseDlTorrentPriority(QString hash); void decreaseDlTorrentPriority(QString hash); - void increaseUpTorrentPriority(QString hash); - void decreaseUpTorrentPriority(QString hash); void downloadUrlAndSkipDialog(QString); // Session configuration - Setters void setListeningPortsRange(std::pair ports); diff --git a/src/downloadingTorrents.cpp b/src/downloadingTorrents.cpp index 4dfd475ae..9d24dbc97 100644 --- a/src/downloadingTorrents.cpp +++ b/src/downloadingTorrents.cpp @@ -501,7 +501,7 @@ void DownloadingTorrents::updateDlList() { // Update Priority if(BTSession->isQueueingEnabled()) { DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); - if(h.is_paused() && BTSession->isDownloadQueued(hash)) { + if(BTSession->isTorrentQueued(hash)) { DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole); if(!downloadList->isColumnHidden(ETA)) { DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); @@ -510,7 +510,7 @@ void DownloadingTorrents::updateDlList() { } } // No need to update a paused torrent - if(h.is_paused()) continue; + if(h.is_paused() || h.is_queued()) continue; // Parse download state // Setting download state switch(h.state()) { diff --git a/src/eventmanager.cpp b/src/eventmanager.cpp index 9cb9a5804..025944b93 100644 --- a/src/eventmanager.cpp +++ b/src/eventmanager.cpp @@ -49,76 +49,78 @@ void EventManager::addedTorrent(QTorrentHandle& h) event["progress"] = QVariant(h.progress()); event["dlspeed"] = QVariant(h.download_payload_rate()); } - event["upspeed"] = QVariant(h.upload_payload_rate()); - if(h.is_paused()) { - if(BTSession->isQueueingEnabled() && (BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash))) - event["state"] = QVariant("queued"); - else - event["state"] = QVariant("paused"); - } else { - switch(h.state()) - { - case torrent_status::finished: - case torrent_status::seeding: - event["state"] = QVariant("seeding"); - break; - case torrent_status::checking_files: - case torrent_status::queued_for_checking: - event["state"] = QVariant("checking"); - break; - case torrent_status::downloading: - case torrent_status::downloading_metadata: - if(h.download_payload_rate() > 0) - event["state"] = QVariant("downloading"); - else - event["state"] = QVariant("stalled"); - break; - default: - qDebug("No status, should not happen!!! status is %d", h.state()); - event["state"] = QVariant(); - } - } - event_list[hash] = event; -} + event["upspeed"] = QVariant(h.upload_payload_rate()); + if(h.is_paused()) { + event["state"] = QVariant("paused"); + } else { + if(BTSession->isQueueingEnabled() && h.is_queued()) { + event["state"] = QVariant("queued"); + } else{ + switch(h.state()) + { + case torrent_status::finished: + case torrent_status::seeding: + event["state"] = QVariant("seeding"); + break; + case torrent_status::checking_files: + case torrent_status::queued_for_checking: + event["state"] = QVariant("checking"); + break; + case torrent_status::downloading: + case torrent_status::downloading_metadata: + if(h.download_payload_rate() > 0) + event["state"] = QVariant("downloading"); + else + event["state"] = QVariant("stalled"); + break; + default: + qDebug("No status, should not happen!!! status is %d", h.state()); + event["state"] = QVariant(); + } + } + } + event_list[hash] = event; + } void EventManager::deletedTorrent(QString hash) { - event_list.remove(hash); + event_list.remove(hash); } void EventManager::modifiedTorrent(QTorrentHandle h) { - QString hash = h.hash(); - QVariantMap event; - - if(h.is_paused()) { - if(BTSession->isQueueingEnabled() && (BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash))) - event["state"] = QVariant("queued"); - else - event["state"] = QVariant("paused"); - } else { - switch(h.state()) - { - case torrent_status::finished: - case torrent_status::seeding: - event["state"] = QVariant("seeding"); - break; - case torrent_status::checking_files: - case torrent_status::queued_for_checking: - event["state"] = QVariant("checking"); - break; - case torrent_status::downloading: - case torrent_status::downloading_metadata: - if(h.download_payload_rate() > 0) - event["state"] = QVariant("downloading"); - else - event["state"] = QVariant("stalled"); - break; - default: - qDebug("No status, should not happen!!! status is %d", h.state()); - event["state"] = QVariant(); - } - } + QString hash = h.hash(); + QVariantMap event; + + if(h.is_paused()) { + event["state"] = QVariant("paused"); + } else { + if(BTSession->isQueueingEnabled() && h.is_queued()) { + event["state"] = QVariant("queued"); + } else { + switch(h.state()) + { + case torrent_status::finished: + case torrent_status::seeding: + event["state"] = QVariant("seeding"); + break; + case torrent_status::checking_files: + case torrent_status::queued_for_checking: + event["state"] = QVariant("checking"); + break; + case torrent_status::downloading: + case torrent_status::downloading_metadata: + if(h.download_payload_rate() > 0) + event["state"] = QVariant("downloading"); + else + event["state"] = QVariant("stalled"); + break; + default: + qDebug("No status, should not happen!!! status is %d", h.state()); + event["state"] = QVariant(); + } + } + } event["name"] = QVariant(h.name()); event["size"] = QVariant((qlonglong)h.actual_size()); if(!h.is_seed()) { diff --git a/src/qtorrenthandle.cpp b/src/qtorrenthandle.cpp index 9ec652a7a..c36c63cf6 100644 --- a/src/qtorrenthandle.cpp +++ b/src/qtorrenthandle.cpp @@ -85,7 +85,12 @@ bool QTorrentHandle::is_valid() const { bool QTorrentHandle::is_paused() const { Q_ASSERT(h.is_valid()); - return h.is_paused(); + return h.is_paused() && !h.is_auto_managed(); +} + +bool QTorrentHandle::is_queued() const { + Q_ASSERT(h.is_valid()); + return h.is_paused() && h.is_auto_managed(); } size_type QTorrentHandle::total_size() const { @@ -281,6 +286,11 @@ bool QTorrentHandle::is_seed() const { return h.is_seed(); } +bool QTorrentHandle::is_auto_managed() const { + Q_ASSERT(h.is_valid()); + return h.is_auto_managed(); +} + // // Setters // @@ -297,11 +307,13 @@ void QTorrentHandle::set_upload_limit(int limit) { void QTorrentHandle::pause() { Q_ASSERT(h.is_valid()); + h.auto_managed(false); h.pause(); } void QTorrentHandle::resume() { Q_ASSERT(h.is_valid()); + h.auto_managed(true); h.resume(); } @@ -340,6 +352,11 @@ void QTorrentHandle::replace_trackers(std::vector const& v) cons h.replace_trackers(v); } +void QTorrentHandle::auto_managed(bool b) const { + Q_ASSERT(h.is_valid()); + h.auto_managed(b); +} + void QTorrentHandle::queue_position_down() const { Q_ASSERT(h.is_valid()); h.queue_position_down(); diff --git a/src/qtorrenthandle.h b/src/qtorrenthandle.h index 7191c7038..f5d4994db 100644 --- a/src/qtorrenthandle.h +++ b/src/qtorrenthandle.h @@ -78,6 +78,7 @@ class QTorrentHandle { bool has_metadata() const; void save_resume_data() const; int queue_position() const; + bool is_queued() const; QString file_at(unsigned int index) const; size_type filesize_at(unsigned int index) const; std::vector const& trackers() const; @@ -93,6 +94,7 @@ class QTorrentHandle { QStringList files_path() const; int num_uploads() const; bool is_seed() const; + bool is_auto_managed() const; // // Setters @@ -114,6 +116,7 @@ class QTorrentHandle { void set_tracker_login(QString username, QString password); void queue_position_down() const; void queue_position_up() const; + void auto_managed(bool) const; // // Operators diff --git a/src/seeding.ui b/src/seeding.ui index 1f01969bb..8f575110c 100644 --- a/src/seeding.ui +++ b/src/seeding.ui @@ -16,16 +16,7 @@ 6 - - 9 - - - 9 - - - 9 - - + 9 @@ -88,7 +79,8 @@ - :/Icons/folder.png + + :/Icons/folder.png:/Icons/folder.png Open destination folder @@ -121,33 +113,13 @@ - :/Icons/money.png + + :/Icons/money.png:/Icons/money.png Buy it - - - Priority - - - - - :/Icons/skin/increase.png - - - Increase priority - - - - - :/Icons/skin/decrease.png - - - Decrease priority - -