You've already forked qBittorrent
							
							
				mirror of
				https://github.com/qbittorrent/qBittorrent
				synced 2025-11-02 08:10:54 +01:00 
			
		
		
		
	Compare commits
	
		
			75 Commits
		
	
	
		
			release-2.
			...
			release-2.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					9018bdfad0 | ||
| 
						 | 
					1962898e24 | ||
| 
						 | 
					56b88661bc | ||
| 
						 | 
					5b47a762ac | ||
| 
						 | 
					a5c6bcceea | ||
| 
						 | 
					290932e128 | ||
| 
						 | 
					f53fe96191 | ||
| 
						 | 
					fc8a822dac | ||
| 
						 | 
					b7a3ae2b4c | ||
| 
						 | 
					26d19b33e6 | ||
| 
						 | 
					4ba9dc1fed | ||
| 
						 | 
					2c3f99692d | ||
| 
						 | 
					a27d2dcac2 | ||
| 
						 | 
					f7cb6a7da5 | ||
| 
						 | 
					6855edf649 | ||
| 
						 | 
					aff27558dd | ||
| 
						 | 
					f6172f8c77 | ||
| 
						 | 
					1562088bc8 | ||
| 
						 | 
					67973515d5 | ||
| 
						 | 
					7867cf68f9 | ||
| 
						 | 
					1eb26bd78b | ||
| 
						 | 
					a8d635f7ac | ||
| 
						 | 
					289ad37f06 | ||
| 
						 | 
					94de42bf2e | ||
| 
						 | 
					ca9f40eb7f | ||
| 
						 | 
					4013f9fefd | ||
| 
						 | 
					ccf0002c0f | ||
| 
						 | 
					86fb4a323a | ||
| 
						 | 
					38c56a2b5f | ||
| 
						 | 
					2d1286158a | ||
| 
						 | 
					6e7309316c | ||
| 
						 | 
					593fdad426 | ||
| 
						 | 
					933a831eb1 | ||
| 
						 | 
					7c55082464 | ||
| 
						 | 
					fa3e70316e | ||
| 
						 | 
					c9c2ab320d | ||
| 
						 | 
					53d9817d8a | ||
| 
						 | 
					828ecb6b3c | ||
| 
						 | 
					af61ed7c72 | ||
| 
						 | 
					1e86ea8c0a | ||
| 
						 | 
					129bfac549 | ||
| 
						 | 
					4815bb9f11 | ||
| 
						 | 
					81eb8b1341 | ||
| 
						 | 
					1596dc5206 | ||
| 
						 | 
					76a22fabcd | ||
| 
						 | 
					3d7bf26f85 | ||
| 
						 | 
					69661406a0 | ||
| 
						 | 
					74fba0fb7e | ||
| 
						 | 
					d56fc9fcd4 | ||
| 
						 | 
					124dcee7b8 | ||
| 
						 | 
					b5b06ce36d | ||
| 
						 | 
					ef01088411 | ||
| 
						 | 
					bc87c1c409 | ||
| 
						 | 
					bbe4328c06 | ||
| 
						 | 
					d557410156 | ||
| 
						 | 
					a150e24ce4 | ||
| 
						 | 
					261d02863c | ||
| 
						 | 
					c64f02c9bf | ||
| 
						 | 
					790db14b51 | ||
| 
						 | 
					2500ac2cb7 | ||
| 
						 | 
					cd8a7cf0e0 | ||
| 
						 | 
					b3be32126d | ||
| 
						 | 
					643bc5516c | ||
| 
						 | 
					eb94c59892 | ||
| 
						 | 
					72f4c81f4c | ||
| 
						 | 
					9543bd63f9 | ||
| 
						 | 
					7ae7a71782 | ||
| 
						 | 
					8994ca6dd5 | ||
| 
						 | 
					354dceeaf0 | ||
| 
						 | 
					50c7225c1e | ||
| 
						 | 
					44d945b5c0 | ||
| 
						 | 
					4ff6104601 | ||
| 
						 | 
					80760dd7af | ||
| 
						 | 
					7835a13573 | ||
| 
						 | 
					9b26fd50b2 | 
							
								
								
									
										48
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								Changelog
									
									
									
									
									
								
							@@ -1,46 +1,8 @@
 | 
			
		||||
* Sun Oct 17 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.6
 | 
			
		||||
    - BUGFIX: Fix "torrent seeding after creation" feature
 | 
			
		||||
    - BUGFIX: The properties panel data would sometimes not match the selected torrent
 | 
			
		||||
    - BUGFIX: Fix detection of files at final destination when temp dir is used
 | 
			
		||||
    - BUGFIX: Fix moving of a torrent to an unexisting directory
 | 
			
		||||
 | 
			
		||||
* Tue Oct 12 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.5
 | 
			
		||||
    - BUGFIX: Remember torrent completion date correctly
 | 
			
		||||
    - BUGFIX: Fix feature to keep incomplete torrents in a separate folder
 | 
			
		||||
    - BUGFIX: Fix display of URL seeds in the UI
 | 
			
		||||
    - BUGFIX: Improved peer hostname resolution with caching
 | 
			
		||||
    - BUGFIX: Piece availability/downloaded widgets performance improvement
 | 
			
		||||
 | 
			
		||||
* Fri Oct 1 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.4
 | 
			
		||||
    - BUGFIX: Clean program exit on system shutdown/logout
 | 
			
		||||
    - BUGFIX: Fix possible search engine plugin update
 | 
			
		||||
 | 
			
		||||
* Tue Sep 28 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.3
 | 
			
		||||
    - BUGFIX: Fix encoding issue in command line parameters processing
 | 
			
		||||
    - BUGFIX: Fix possible crash when changing the save path in addition dialog
 | 
			
		||||
    - BUGFIX: Fix wrong mapping to source model
 | 
			
		||||
 | 
			
		||||
* Sun Sep 26 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.2
 | 
			
		||||
    - BUGFIX: Fix display of torrent content in addition dialog
 | 
			
		||||
    - BUGFIX: Really fix manual editing of save path in torrent addition dialog
 | 
			
		||||
 | 
			
		||||
* Sun Sep 26 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.1
 | 
			
		||||
    - I18N: Updated Arabic translation
 | 
			
		||||
    - I18N: Fixes to German translation
 | 
			
		||||
    - BUGFIX: Save path can now be edited in torrent addition dialog
 | 
			
		||||
    - BUGFIX: Fix save path encoding on non-utf8 systems
 | 
			
		||||
    - BUGFIX: Fix saving to drive root on Windows
 | 
			
		||||
    - BUGFIX: OGV can now be previewed
 | 
			
		||||
    - BUGFIX: Maximum download limit is now 10MB/s
 | 
			
		||||
    - BUGFIX: Fix 'download in scan dir' persistence
 | 
			
		||||
    - BUGFIX: Add .torrent extension only when missing (torrent creator)
 | 
			
		||||
    - BUGFIX: Fix possible issue with temporary download path persistence
 | 
			
		||||
    - BUGFIX: Added support for | (OR) operator in RSS feed downloader
 | 
			
		||||
    - BUGFIX: Fix Web UI for spanish users
 | 
			
		||||
    - BUGFIX: Fix locale switching from Web UI
 | 
			
		||||
    - BUGFIX: Use AND operator for torrentdownloads.net searches
 | 
			
		||||
    - BUGFIX: Limit torrent addition dialog width to fit the screen
 | 
			
		||||
    - COSMETIC: Fix progress bars style on Windows
 | 
			
		||||
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.5.0
 | 
			
		||||
    - FEATURE: qBittorrent can now act as a tracker
 | 
			
		||||
    - FEATURE: Added feature to shutdown qbittorrent on torrents completion
 | 
			
		||||
    - FEATURE: Added a transfer list column to display the current tracker
 | 
			
		||||
    - COSMETIC: Replaced message box by on-screen notification for download errors
 | 
			
		||||
 | 
			
		||||
* Tue Aug 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.0
 | 
			
		||||
    - FEATURE: Added actions to "Move to top/bottom" of priority queue
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								INSTALL
									
									
									
									
									
								
							@@ -10,7 +10,7 @@ qBittorrent - A BitTorrent client in C++ / Qt4
 | 
			
		||||
  will install and execute qBittorrent hopefully without any problems.
 | 
			
		||||
 | 
			
		||||
  Dependencies:
 | 
			
		||||
    - Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
 | 
			
		||||
    - Qt >= 4.5.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
 | 
			
		||||
 | 
			
		||||
    - pkg-config executable
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								configure
									
									
									
									
										vendored
									
									
								
							@@ -325,7 +325,7 @@ cat >$1/modules.cpp <<EOT
 | 
			
		||||
#line 1 "qt4.qcm"
 | 
			
		||||
/*
 | 
			
		||||
-----BEGIN QCMOD-----
 | 
			
		||||
name: Qt >= 4.4
 | 
			
		||||
name: Qt >= 4.5
 | 
			
		||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
 | 
			
		||||
-----END QCMOD-----
 | 
			
		||||
*/
 | 
			
		||||
@@ -333,14 +333,14 @@ class qc_qt4 : public ConfObj
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	qc_qt4(Conf *c) : ConfObj(c) {}
 | 
			
		||||
	QString name() const { return "Qt >= 4.4"; }
 | 
			
		||||
	QString shortname() const { return "Qt 4.4"; }
 | 
			
		||||
	QString name() const { return "Qt >= 4.5"; }
 | 
			
		||||
	QString shortname() const { return "Qt 4.5"; }
 | 
			
		||||
	bool exec()
 | 
			
		||||
	{
 | 
			
		||||
		if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
 | 
			
		||||
			conf->addDefine("DISABLE_GUI");
 | 
			
		||||
		}	
 | 
			
		||||
		return(QT_VERSION >= 0x040400);
 | 
			
		||||
		return(QT_VERSION >= 0x040500);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
#line 1 "pkg-config.qcm"
 | 
			
		||||
@@ -616,22 +616,22 @@ arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplicat
 | 
			
		||||
class qc_qtsingleapplication : public ConfObj
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
 | 
			
		||||
	QString name() const { return "qtsingleapplication library"; }
 | 
			
		||||
	QString shortname() const { return "qtsingleapplication"; }
 | 
			
		||||
        qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
 | 
			
		||||
        QString name() const { return "qtsingleapplication library"; }
 | 
			
		||||
        QString shortname() const { return "qtsingleapplication"; }
 | 
			
		||||
 | 
			
		||||
	bool exec(){
 | 
			
		||||
        	QString s;
 | 
			
		||||
		s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
 | 
			
		||||
        bool exec(){
 | 
			
		||||
                QString s;
 | 
			
		||||
                s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
 | 
			
		||||
                if(s.compare("system", Qt::CaseInsensitive) == 0) {
 | 
			
		||||
                  // System
 | 
			
		||||
                  conf->addDefine("USE_SYSTEM_QTSINGLEAPPLICATION");
 | 
			
		||||
                  printf(" [system] ");
 | 
			
		||||
                } else {
 | 
			
		||||
                  printf(" [shipped] ");
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
                }
 | 
			
		||||
                return true;
 | 
			
		||||
        }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
EOT
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
-----BEGIN QCMOD-----
 | 
			
		||||
name: Qt >= 4.4
 | 
			
		||||
name: Qt >= 4.5
 | 
			
		||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
 | 
			
		||||
-----END QCMOD-----
 | 
			
		||||
*/
 | 
			
		||||
@@ -8,13 +8,13 @@ class qc_qt4 : public ConfObj
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	qc_qt4(Conf *c) : ConfObj(c) {}
 | 
			
		||||
	QString name() const { return "Qt >= 4.4"; }
 | 
			
		||||
	QString shortname() const { return "Qt 4.4"; }
 | 
			
		||||
	QString name() const { return "Qt >= 4.5"; }
 | 
			
		||||
	QString shortname() const { return "Qt 4.5"; }
 | 
			
		||||
	bool exec()
 | 
			
		||||
	{
 | 
			
		||||
		if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
 | 
			
		||||
			conf->addDefine("DISABLE_GUI");
 | 
			
		||||
		}	
 | 
			
		||||
		return(QT_VERSION >= 0x040400);
 | 
			
		||||
		return(QT_VERSION >= 0x040500);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								src/GUI.cpp
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/GUI.cpp
									
									
									
									
									
								
							@@ -52,7 +52,7 @@
 | 
			
		||||
#include "torrentadditiondlg.h"
 | 
			
		||||
#include "searchengine.h"
 | 
			
		||||
#include "rss_imp.h"
 | 
			
		||||
#include "bittorrent.h"
 | 
			
		||||
#include "qbtsession.h"
 | 
			
		||||
#include "about_imp.h"
 | 
			
		||||
#include "trackerlogin.h"
 | 
			
		||||
#include "options_imp.h"
 | 
			
		||||
@@ -126,7 +126,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), for
 | 
			
		||||
  // Fix Tool bar layout
 | 
			
		||||
  toolBar->layout()->setSpacing(7);
 | 
			
		||||
  // Creating Bittorrent session
 | 
			
		||||
  BTSession = new Bittorrent();
 | 
			
		||||
  BTSession = new QBtSession();
 | 
			
		||||
  connect(BTSession, SIGNAL(fullDiskError(QTorrentHandle&, QString)), this, SLOT(fullDiskError(QTorrentHandle&, QString)));
 | 
			
		||||
  connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(finishedTorrent(QTorrentHandle&)));
 | 
			
		||||
  connect(BTSession, SIGNAL(trackerAuthenticationRequired(QTorrentHandle&)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle&)));
 | 
			
		||||
@@ -202,6 +202,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), for
 | 
			
		||||
  displaySearchTab(actionSearch_engine->isChecked());
 | 
			
		||||
  displayRSSTab(actionRSS_Reader->isChecked());
 | 
			
		||||
  actionShutdown_when_downloads_complete->setChecked(Preferences::shutdownWhenDownloadsComplete());
 | 
			
		||||
  actionShutdown_qBittorrent_when_downloads_complete->setChecked(Preferences::shutdownqBTWhenDownloadsComplete());
 | 
			
		||||
 | 
			
		||||
  show();
 | 
			
		||||
 | 
			
		||||
@@ -541,7 +542,7 @@ void GUI::askRecursiveTorrentDownloadConfirmation(QTorrentHandle &h) {
 | 
			
		||||
 | 
			
		||||
void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{
 | 
			
		||||
  // Display a message box
 | 
			
		||||
  QMessageBox::critical(0, tr("Url download error"), tr("Couldn't download file at url: %1, reason: %2.").arg(url).arg(reason));
 | 
			
		||||
  showNotificationBaloon(tr("Url download error"), tr("Couldn't download file at url: %1, reason: %2.").arg(url).arg(reason));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GUI::on_actionSet_global_upload_limit_triggered() {
 | 
			
		||||
@@ -921,7 +922,6 @@ void GUI::optionsSaved() {
 | 
			
		||||
// Load program preferences
 | 
			
		||||
void GUI::loadPreferences(bool configure_session) {
 | 
			
		||||
  BTSession->addConsoleMessage(tr("Options were saved successfully."));
 | 
			
		||||
#ifndef Q_WS_MAC
 | 
			
		||||
  const bool newSystrayIntegration = Preferences::systrayIntegration();
 | 
			
		||||
  actionLock_qBittorrent->setEnabled(newSystrayIntegration);
 | 
			
		||||
  if(newSystrayIntegration != (systrayIcon!=0)) {
 | 
			
		||||
@@ -946,7 +946,6 @@ void GUI::loadPreferences(bool configure_session) {
 | 
			
		||||
      delete myTrayIconMenu;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
  // General
 | 
			
		||||
  if(Preferences::isToolbarDisplayed()) {
 | 
			
		||||
    toolBar->setVisible(true);
 | 
			
		||||
@@ -1010,9 +1009,8 @@ void GUI::trackerAuthenticationRequired(QTorrentHandle& h) {
 | 
			
		||||
// Check connection status and display right icon
 | 
			
		||||
void GUI::updateGUI() {
 | 
			
		||||
  // update global informations
 | 
			
		||||
#ifndef Q_WS_MAC
 | 
			
		||||
  if(systrayIcon) {
 | 
			
		||||
#if defined(Q_WS_X11)
 | 
			
		||||
#if defined(Q_WS_X11) || defined(Q_WS_MAC)
 | 
			
		||||
    QString html = "<div style='background-color: #678db2; color: #fff;height: 18px; font-weight: bold; margin-bottom: 5px;'>";
 | 
			
		||||
    html += tr("qBittorrent");
 | 
			
		||||
    html += "</div>";
 | 
			
		||||
@@ -1030,7 +1028,6 @@ void GUI::updateGUI() {
 | 
			
		||||
#endif
 | 
			
		||||
    systrayIcon->setToolTip(html); // tray icon
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
  if(displaySpeedInTitle) {
 | 
			
		||||
    setWindowTitle(tr("qBittorrent %1 (Down: %2/s, Up: %3/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_download_rate)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_upload_rate)));
 | 
			
		||||
  }
 | 
			
		||||
@@ -1050,10 +1047,8 @@ void GUI::showNotificationBaloon(QString title, QString msg) const {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef Q_WS_MAC
 | 
			
		||||
  if(systrayIcon && QSystemTrayIcon::supportsMessages())
 | 
			
		||||
    systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*****************************************************
 | 
			
		||||
@@ -1090,7 +1085,6 @@ void GUI::downloadFromURLList(const QStringList& url_list) {
 | 
			
		||||
 *****************************************************/
 | 
			
		||||
 | 
			
		||||
void GUI::createSystrayDelayed() {
 | 
			
		||||
#ifndef Q_WS_MAC
 | 
			
		||||
  static int timeout = 20;
 | 
			
		||||
  if(QSystemTrayIcon::isSystemTrayAvailable()) {
 | 
			
		||||
    // Ok, systray integration is now supported
 | 
			
		||||
@@ -1111,7 +1105,6 @@ void GUI::createSystrayDelayed() {
 | 
			
		||||
      Preferences::setSystrayIntegration(false);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GUI::updateAltSpeedsBtn(bool alternative) {
 | 
			
		||||
@@ -1178,6 +1171,11 @@ void GUI::on_actionShutdown_when_downloads_complete_triggered() {
 | 
			
		||||
  Preferences::setShutdownWhenDownloadsComplete(is_checked);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GUI::on_actionShutdown_qBittorrent_when_downloads_complete_triggered() {
 | 
			
		||||
  bool is_checked = static_cast<QAction*>(sender())->isChecked();
 | 
			
		||||
  Preferences::setShutdownqBTWhenDownloadsComplete(is_checked);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GUI::on_actionSpeed_in_title_bar_triggered() {
 | 
			
		||||
  displaySpeedInTitle = static_cast<QAction*>(sender())->isChecked();
 | 
			
		||||
  Preferences::showSpeedInTitleBar(displaySpeedInTitle);
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@
 | 
			
		||||
#include "ui_mainwindow.h"
 | 
			
		||||
#include "qtorrenthandle.h"
 | 
			
		||||
 | 
			
		||||
class Bittorrent;
 | 
			
		||||
class QBtSession;
 | 
			
		||||
class QTimer;
 | 
			
		||||
class downloadFromURL;
 | 
			
		||||
class SearchEngine;
 | 
			
		||||
@@ -140,7 +140,7 @@ protected:
 | 
			
		||||
private:
 | 
			
		||||
  QFileSystemWatcher *executable_watcher;
 | 
			
		||||
  // Bittorrent
 | 
			
		||||
  Bittorrent *BTSession;
 | 
			
		||||
  QBtSession *BTSession;
 | 
			
		||||
  QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
 | 
			
		||||
  // GUI related
 | 
			
		||||
  QTimer *guiUpdater;
 | 
			
		||||
@@ -183,6 +183,7 @@ private slots:
 | 
			
		||||
    void on_actionSpeed_in_title_bar_triggered();
 | 
			
		||||
    void on_actionTop_tool_bar_triggered();
 | 
			
		||||
    void on_actionShutdown_when_downloads_complete_triggered();
 | 
			
		||||
    void on_actionShutdown_qBittorrent_when_downloads_complete_triggered();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Categories=Qt;Network;P2P;
 | 
			
		||||
Comment=V2.4.6
 | 
			
		||||
Comment=V2.5.0
 | 
			
		||||
Exec=qbittorrent %f
 | 
			
		||||
GenericName=Bittorrent client
 | 
			
		||||
GenericName[ar]=العميل Bittorrent
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB  | 
@@ -47,7 +47,7 @@
 | 
			
		||||
	<key>CFBundlePackageType</key>
 | 
			
		||||
	<string>APPL</string>
 | 
			
		||||
	<key>CFBundleGetInfoString</key>
 | 
			
		||||
	<string>2.4.6</string>
 | 
			
		||||
	<string>2.5.0</string>
 | 
			
		||||
	<key>CFBundleSignature</key>
 | 
			
		||||
	<string>????</string>
 | 
			
		||||
	<key>CFBundleExecutable</key>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,15 +11,15 @@
 | 
			
		||||
#include "preferences.h"
 | 
			
		||||
 | 
			
		||||
enum AdvSettingsCols {PROPERTY, VALUE};
 | 
			
		||||
enum AdvSettingsRows {DISK_CACHE, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, IGNORE_LIMIT_LAN, COUNT_OVERHEAD, RECHECK_COMPLETED, LIST_REFRESH, RESOLVE_COUNTRIES, RESOLVE_HOSTS, MAX_HALF_OPEN, SUPER_SEEDING, NETWORK_IFACE, PROGRAM_NOTIFICATIONS };
 | 
			
		||||
#define ROW_COUNT 13
 | 
			
		||||
enum AdvSettingsRows {DISK_CACHE, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, IGNORE_LIMIT_LAN, COUNT_OVERHEAD, RECHECK_COMPLETED, LIST_REFRESH, RESOLVE_COUNTRIES, RESOLVE_HOSTS, MAX_HALF_OPEN, SUPER_SEEDING, NETWORK_IFACE, PROGRAM_NOTIFICATIONS, TRACKER_STATUS, TRACKER_PORT };
 | 
			
		||||
#define ROW_COUNT 15
 | 
			
		||||
 | 
			
		||||
class AdvancedSettings: public QTableWidget {
 | 
			
		||||
  Q_OBJECT
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  QSpinBox *spin_cache, *outgoing_ports_min, *outgoing_ports_max, *spin_list_refresh, *spin_maxhalfopen;
 | 
			
		||||
  QCheckBox *cb_ignore_limits_lan, *cb_count_overhead, *cb_recheck_completed, *cb_resolve_countries, *cb_resolve_hosts, *cb_super_seeding, *cb_program_notifications;
 | 
			
		||||
  QSpinBox *spin_cache, *outgoing_ports_min, *outgoing_ports_max, *spin_list_refresh, *spin_maxhalfopen, *spin_tracker_port;
 | 
			
		||||
  QCheckBox *cb_ignore_limits_lan, *cb_count_overhead, *cb_recheck_completed, *cb_resolve_countries, *cb_resolve_hosts, *cb_super_seeding, *cb_program_notifications, *cb_tracker_status;
 | 
			
		||||
  QComboBox *combo_iface;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
@@ -53,6 +53,8 @@ public:
 | 
			
		||||
    delete cb_super_seeding;
 | 
			
		||||
    delete combo_iface;
 | 
			
		||||
    delete cb_program_notifications;
 | 
			
		||||
    delete spin_tracker_port;
 | 
			
		||||
    delete cb_tracker_status;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
public slots:
 | 
			
		||||
@@ -88,6 +90,9 @@ public slots:
 | 
			
		||||
    }
 | 
			
		||||
    // Program notification
 | 
			
		||||
    Preferences::useProgramNotification(cb_program_notifications->isChecked());
 | 
			
		||||
    // Tracker
 | 
			
		||||
    Preferences::setTrackerEnabled(cb_tracker_status->isChecked());
 | 
			
		||||
    Preferences::setTrackerPort(spin_tracker_port->value());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
protected slots:
 | 
			
		||||
@@ -190,11 +195,25 @@ protected slots:
 | 
			
		||||
    connect(combo_iface, SIGNAL(currentIndexChanged(int)), this, SLOT(emitSettingsChanged()));
 | 
			
		||||
    setCellWidget(NETWORK_IFACE, VALUE, combo_iface);
 | 
			
		||||
    // Program notifications
 | 
			
		||||
    setItem(PROGRAM_NOTIFICATIONS, PROPERTY, new QTableWidgetItem(tr("Display program notification baloons")));
 | 
			
		||||
    setItem(PROGRAM_NOTIFICATIONS, PROPERTY, new QTableWidgetItem(tr("Display program notification balloons")));
 | 
			
		||||
    cb_program_notifications = new QCheckBox();
 | 
			
		||||
    connect(cb_program_notifications, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged()));
 | 
			
		||||
    cb_program_notifications->setChecked(Preferences::useProgramNotification());
 | 
			
		||||
    setCellWidget(PROGRAM_NOTIFICATIONS, VALUE, cb_program_notifications);
 | 
			
		||||
    // Tracker State
 | 
			
		||||
    setItem(TRACKER_STATUS, PROPERTY, new QTableWidgetItem(tr("Enable embedded tracker")));
 | 
			
		||||
    cb_tracker_status = new QCheckBox();
 | 
			
		||||
    connect(cb_tracker_status, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged()));
 | 
			
		||||
    cb_tracker_status->setChecked(Preferences::isTrackerEnabled());
 | 
			
		||||
    setCellWidget(TRACKER_STATUS, VALUE, cb_tracker_status);
 | 
			
		||||
    // Tracker port
 | 
			
		||||
    setItem(TRACKER_PORT, PROPERTY, new QTableWidgetItem(tr("Embedded tracker port")));
 | 
			
		||||
    spin_tracker_port = new QSpinBox();
 | 
			
		||||
    connect(spin_tracker_port, SIGNAL(valueChanged(int)), this, SLOT(emitSettingsChanged()));
 | 
			
		||||
    spin_tracker_port->setMinimum(1);
 | 
			
		||||
    spin_tracker_port->setMaximum(65535);
 | 
			
		||||
    spin_tracker_port->setValue(Preferences::getTrackerPort());
 | 
			
		||||
    setCellWidget(TRACKER_PORT, VALUE, spin_tracker_port);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void emitSettingsChanged() {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2657
									
								
								src/bittorrent.cpp
									
									
									
									
									
								
							
							
						
						
									
										2657
									
								
								src/bittorrent.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -31,7 +31,7 @@
 | 
			
		||||
#ifndef CONSOLE_H
 | 
			
		||||
#define CONSOLE_H
 | 
			
		||||
 | 
			
		||||
#include "bittorrent.h"
 | 
			
		||||
#include "qbtsession.h"
 | 
			
		||||
#include "ui_console.h"
 | 
			
		||||
 | 
			
		||||
using namespace libtorrent;
 | 
			
		||||
@@ -40,10 +40,10 @@ class consoleDlg : public QDialog, private Ui_ConsoleDlg{
 | 
			
		||||
  Q_OBJECT
 | 
			
		||||
  
 | 
			
		||||
  private:
 | 
			
		||||
    Bittorrent *BTSession;
 | 
			
		||||
    QBtSession *BTSession;
 | 
			
		||||
  
 | 
			
		||||
  public:
 | 
			
		||||
    consoleDlg(QWidget *parent, Bittorrent* _BTSession) : QDialog(parent) {
 | 
			
		||||
    consoleDlg(QWidget *parent, QBtSession* _BTSession) : QDialog(parent) {
 | 
			
		||||
      setupUi(this);
 | 
			
		||||
      setAttribute(Qt::WA_DeleteOnClose);
 | 
			
		||||
      setModal(true);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										221
									
								
								src/feedList.h
									
									
									
									
									
								
							
							
						
						
									
										221
									
								
								src/feedList.h
									
									
									
									
									
								
							@@ -1,221 +0,0 @@
 | 
			
		||||
#ifndef FEEDLIST_H
 | 
			
		||||
#define FEEDLIST_H
 | 
			
		||||
 | 
			
		||||
#include <QTreeWidget>
 | 
			
		||||
#include <QTreeWidgetItem>
 | 
			
		||||
#include <QDropEvent>
 | 
			
		||||
#include <QDragMoveEvent>
 | 
			
		||||
#include <QStringList>
 | 
			
		||||
#include <QHash>
 | 
			
		||||
#include <QUrl>
 | 
			
		||||
#include "rss.h"
 | 
			
		||||
 | 
			
		||||
class FeedList: public QTreeWidget {
 | 
			
		||||
  Q_OBJECT
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  RssManager *rssmanager;
 | 
			
		||||
  QHash<QTreeWidgetItem*, RssFile*> mapping;
 | 
			
		||||
  QHash<QString, QTreeWidgetItem*> feeds_items;
 | 
			
		||||
  QTreeWidgetItem* current_feed;
 | 
			
		||||
  QTreeWidgetItem *unread_item;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  FeedList(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), rssmanager(rssmanager) {
 | 
			
		||||
    setContextMenuPolicy(Qt::CustomContextMenu);
 | 
			
		||||
    setDragDropMode(QAbstractItemView::InternalMove);
 | 
			
		||||
    setSelectionMode(QAbstractItemView::ExtendedSelection);
 | 
			
		||||
    setColumnCount(1);
 | 
			
		||||
    QTreeWidgetItem *___qtreewidgetitem = headerItem();
 | 
			
		||||
    ___qtreewidgetitem->setText(0, QApplication::translate("RSS", "RSS feeds", 0, QApplication::UnicodeUTF8));
 | 
			
		||||
    unread_item = new QTreeWidgetItem(this);
 | 
			
		||||
    unread_item->setText(0, tr("Unread") + QString::fromUtf8("  (") + QString::number(rssmanager->getNbUnRead(), 10)+ QString(")"));
 | 
			
		||||
    unread_item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/oxygen/mail-folder-inbox.png")));
 | 
			
		||||
    itemAdded(unread_item, rssmanager);
 | 
			
		||||
    connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*)));
 | 
			
		||||
    setCurrentItem(unread_item);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ~FeedList() {
 | 
			
		||||
    disconnect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*)));
 | 
			
		||||
    delete unread_item;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void itemAdded(QTreeWidgetItem *item, RssFile* file) {
 | 
			
		||||
    mapping[item] = file;
 | 
			
		||||
    if(file->getType() == RssFile::STREAM) {
 | 
			
		||||
      feeds_items[file->getID()] = item;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void itemAboutToBeRemoved(QTreeWidgetItem *item) {
 | 
			
		||||
    RssFile* file = mapping.take(item);
 | 
			
		||||
    if(file->getType() == RssFile::STREAM) {
 | 
			
		||||
      feeds_items.remove(file->getID());
 | 
			
		||||
    } else {
 | 
			
		||||
      QList<RssStream*> feeds = ((RssFolder*)file)->getAllFeeds();
 | 
			
		||||
      foreach(RssStream* feed, feeds) {
 | 
			
		||||
        feeds_items.remove(feed->getID());
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool hasFeed(QString url) const {
 | 
			
		||||
    return feeds_items.contains(QUrl(url).toString());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QList<QTreeWidgetItem*> getAllFeedItems() const {
 | 
			
		||||
    return feeds_items.values();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QTreeWidgetItem* getUnreadItem() const {
 | 
			
		||||
    return unread_item;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QStringList getItemPath(QTreeWidgetItem* item) const {
 | 
			
		||||
    QStringList path;
 | 
			
		||||
    if(item) {
 | 
			
		||||
      if(item->parent())
 | 
			
		||||
        path << getItemPath(item->parent());
 | 
			
		||||
      path.append(getRSSItem(item)->getID());
 | 
			
		||||
    }
 | 
			
		||||
    return path;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) const {
 | 
			
		||||
    QList<QTreeWidgetItem*> open_folders;
 | 
			
		||||
    int nbChildren;
 | 
			
		||||
    if(parent)
 | 
			
		||||
      nbChildren = parent->childCount();
 | 
			
		||||
    else
 | 
			
		||||
      nbChildren = topLevelItemCount();
 | 
			
		||||
    for(int i=0; i<nbChildren; ++i) {
 | 
			
		||||
      QTreeWidgetItem *item;
 | 
			
		||||
      if(parent)
 | 
			
		||||
        item = parent->child(i);
 | 
			
		||||
      else
 | 
			
		||||
        item = topLevelItem(i);
 | 
			
		||||
      if(getItemType(item) == RssFile::FOLDER && item->isExpanded()) {
 | 
			
		||||
        QList<QTreeWidgetItem*> open_subfolders = getAllOpenFolders(item);
 | 
			
		||||
        if(!open_subfolders.empty()) {
 | 
			
		||||
          open_folders << open_subfolders;
 | 
			
		||||
        } else {
 | 
			
		||||
          open_folders << item;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return open_folders;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QList<QTreeWidgetItem*> getAllFeedItems(QTreeWidgetItem* folder) {
 | 
			
		||||
    QList<QTreeWidgetItem*> feeds;
 | 
			
		||||
    int nbChildren = folder->childCount();
 | 
			
		||||
    for(int i=0; i<nbChildren; ++i) {
 | 
			
		||||
      QTreeWidgetItem *item = folder->child(i);
 | 
			
		||||
      if(getItemType(item) == RssFile::STREAM) {
 | 
			
		||||
        feeds << item;
 | 
			
		||||
      } else {
 | 
			
		||||
        feeds << getAllFeedItems(item);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return feeds;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  RssFile* getRSSItem(QTreeWidgetItem *item) const {
 | 
			
		||||
    return mapping.value(item, 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  RssFile::FileType getItemType(QTreeWidgetItem *item) const {
 | 
			
		||||
    return mapping.value(item)->getType();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QString getItemID(QTreeWidgetItem *item) const {
 | 
			
		||||
    return mapping.value(item)->getID();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QTreeWidgetItem* getTreeItemFromUrl(QString url) const{
 | 
			
		||||
    return feeds_items.value(url, 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  RssStream* getRSSItemFromUrl(QString url) const {
 | 
			
		||||
    return (RssStream*)getRSSItem(getTreeItemFromUrl(url));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QTreeWidgetItem* currentItem() const {
 | 
			
		||||
    return current_feed;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  QTreeWidgetItem* currentFeed() const {
 | 
			
		||||
    return current_feed;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
  void foldersAltered(QList<QTreeWidgetItem*> folders);
 | 
			
		||||
  void overwriteAttempt(QString filename);
 | 
			
		||||
 | 
			
		||||
protected slots:
 | 
			
		||||
  void updateCurrentFeed(QTreeWidgetItem* new_item) {
 | 
			
		||||
    if(!new_item) return;
 | 
			
		||||
    if(!mapping.contains(new_item)) return;
 | 
			
		||||
    if((getItemType(new_item) == RssFile::STREAM) || new_item == unread_item)
 | 
			
		||||
      current_feed = new_item;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  void dragMoveEvent(QDragMoveEvent * event) {
 | 
			
		||||
    QTreeWidgetItem *item = itemAt(event->pos());
 | 
			
		||||
    if(item == unread_item) {
 | 
			
		||||
      event->ignore();
 | 
			
		||||
    } else {
 | 
			
		||||
      if(item && getItemType(item) != RssFile::FOLDER)
 | 
			
		||||
        event->ignore();
 | 
			
		||||
      else {
 | 
			
		||||
        if(selectedItems().contains(unread_item)) {
 | 
			
		||||
          event->ignore();
 | 
			
		||||
        } else {
 | 
			
		||||
          QTreeWidget::dragMoveEvent(event);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void dropEvent(QDropEvent *event) {
 | 
			
		||||
    qDebug("dropEvent");
 | 
			
		||||
    QList<QTreeWidgetItem*> folders_altered;
 | 
			
		||||
    QTreeWidgetItem *dest_folder_item =  itemAt(event->pos());
 | 
			
		||||
    RssFolder *dest_folder;
 | 
			
		||||
    if(dest_folder_item) {
 | 
			
		||||
      dest_folder = (RssFolder*)getRSSItem(dest_folder_item);
 | 
			
		||||
      folders_altered << dest_folder_item;
 | 
			
		||||
    } else {
 | 
			
		||||
      dest_folder = rssmanager;
 | 
			
		||||
    }
 | 
			
		||||
    QList<QTreeWidgetItem *> src_items = selectedItems();
 | 
			
		||||
    // Check if there is not going to overwrite another file
 | 
			
		||||
    foreach(QTreeWidgetItem *src_item, src_items) {
 | 
			
		||||
      RssFile *file = getRSSItem(src_item);
 | 
			
		||||
      if(dest_folder->hasChild(file->getID())) {
 | 
			
		||||
        emit overwriteAttempt(file->getID());
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    // Proceed with the move
 | 
			
		||||
    foreach(QTreeWidgetItem *src_item, src_items) {
 | 
			
		||||
      QTreeWidgetItem *parent_folder = src_item->parent();
 | 
			
		||||
      if(parent_folder && !folders_altered.contains(parent_folder))
 | 
			
		||||
        folders_altered << parent_folder;
 | 
			
		||||
      // Actually move the file
 | 
			
		||||
      RssFile *file = getRSSItem(src_item);
 | 
			
		||||
      rssmanager->moveFile(file, dest_folder);
 | 
			
		||||
    }
 | 
			
		||||
    QTreeWidget::dropEvent(event);
 | 
			
		||||
    if(dest_folder_item)
 | 
			
		||||
      dest_folder_item->setExpanded(true);
 | 
			
		||||
    // Emit signal for update
 | 
			
		||||
    if(!folders_altered.empty())
 | 
			
		||||
      emit foldersAltered(folders_altered);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // FEEDLIST_H
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -34,7 +34,7 @@
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QCoreApplication>
 | 
			
		||||
#include "preferences.h"
 | 
			
		||||
#include "bittorrent.h"
 | 
			
		||||
#include "qbtsession.h"
 | 
			
		||||
 | 
			
		||||
class HeadlessLoader: public QObject {
 | 
			
		||||
  Q_OBJECT
 | 
			
		||||
@@ -44,7 +44,7 @@ public:
 | 
			
		||||
    // Enable Web UI
 | 
			
		||||
    Preferences::setWebUiEnabled(true);
 | 
			
		||||
    // Instanciate Bittorrent Object
 | 
			
		||||
    BTSession = new Bittorrent();
 | 
			
		||||
    BTSession = new QBtSession();
 | 
			
		||||
    connect(BTSession, SIGNAL(newConsoleMessage(QString)), this, SLOT(displayConsoleMessage(QString)));
 | 
			
		||||
    // Resume unfinished torrents
 | 
			
		||||
    BTSession->startUpTorrents();
 | 
			
		||||
@@ -103,7 +103,7 @@ public slots:
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  Bittorrent *BTSession;
 | 
			
		||||
  QBtSession *BTSession;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user