mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-12-21 08:09:35 +08:00
- 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.
This commit is contained in:
parent
55834ba5db
commit
13f21ef6cd
6
TODO
6
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
|
||||
|
@ -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!
|
||||
|
64
src/GUI.cpp
64
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; i<listSize; ++i){
|
||||
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(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");
|
||||
|
@ -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
|
||||
|
@ -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<url_seed_alert*>(a.get())){
|
||||
emit urlSeedProblem(QString(p->url.c_str()), QString(p->msg().c_str()));
|
||||
}
|
||||
else if (torrent_checked_alert* p = dynamic_cast<torrent_checked_alert*>(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<QPair<QString, QString> > bittorrent::getTrackersErrors(QString hash) cons
|
||||
return trackersErrors.value(hash, QList<QPair<QString, QString> >());
|
||||
}
|
||||
|
||||
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<torrent_handle> 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");
|
||||
}
|
||||
|
@ -48,7 +48,6 @@ class bittorrent : public QObject{
|
||||
QStringList supported_preview_extensions;
|
||||
QString defaultSavePath;
|
||||
QStringList torrentsToPauseAfterChecking;
|
||||
QStringList torrentsUnchecked;
|
||||
QStringList reloadingTorrents;
|
||||
QHash<QString, QList<long> > ETAstats;
|
||||
QHash<QString, long> 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);
|
||||
|
||||
};
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user