Compare commits
	
		
			1 Commits
		
	
	
		
			release-2.
			...
			release-2.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 28d6577199 | 
							
								
								
									
										19
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						| @@ -6,17 +6,12 @@ Contributors: | ||||
| * Ishan Arora <ishan@qbittorrent.org> | ||||
| * Arnaud Demaizière <arnaud@qbittorrent.org> | ||||
| * Grigis Gaëtan <cipher16@gmail.com> | ||||
| * Christian Kandeler <zambesi@users.sourceforge.net> | ||||
|  | ||||
| Code from other projects: | ||||
| * files src/ico.cpp src/ico.h | ||||
|   copyright: Malte Starostik <malte@kde.org> | ||||
|   license: LGPL | ||||
|  | ||||
| * files src/search_engine/socks.py | ||||
|   copyright: Dan Haim <negativeiq@users.sourceforge.net> | ||||
|   license: BSD | ||||
|  | ||||
| Images Authors: | ||||
| * files: src/Icons/*.png | ||||
|   copyright: Gnome Icon Theme | ||||
| @@ -61,8 +56,8 @@ Translations authors: | ||||
| * files: src/lang/*.ts | ||||
|   copyright: | ||||
|   - Brazilian: Nick Marinho (nickmarinho@gmail.com) | ||||
|   - Bulgarian: Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net) | ||||
|   - Catalan: Francisco Luque Contreras (frannoe@ya.com) | ||||
|   - Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net) | ||||
|   - Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net) | ||||
|   - Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com) | ||||
|   - Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com) | ||||
|   - Czech: Jirka Vilim (web@tets.cz) | ||||
| @@ -72,10 +67,10 @@ Translations authors: | ||||
|   - Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net) | ||||
|   - French: Christophe Dumez (chris@qbittorrent.org) | ||||
|   - German: Niels Hoffmann (zentralmaschine@users.sourceforge.net) | ||||
|   - Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) and Stephanos Antaris (santaris@csd.auth.gr) | ||||
|   - Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) | ||||
|   - Hungarian: Majoros Péter (majoros.j.p@t-online.hu) | ||||
|   - Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com) | ||||
|   - Japanese: Nardog (alphisation@gmail.com) | ||||
|   - Japanese: Nardog (nardog@e2umail.com) | ||||
|   - Korean: Jin Woo Sin (jin828sin@users.sourceforge.net) | ||||
|   - Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net) | ||||
|   - Polish: Mariusz Fik (fisiu@opensuse.org) | ||||
| @@ -84,8 +79,8 @@ Translations authors: | ||||
|   - Russian: Nick Khazov (m2k3d0n at users.sourceforge.net) | ||||
|   - Serbian: Anaximandar Milet (anaximandar at operamail.com) | ||||
|   - Slovak:  helix84 | ||||
|   - Spanish: Francisco Luque Contreras (frannoe@ya.com) | ||||
|   - Spanish: Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net) | ||||
|   - Swedish: Daniel Nylander (po@danielnylander.se) | ||||
|   - Turkish: Hasan Yilmaz (iletisim@hedefturkce.com) | ||||
|   - Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net) and Oleh Prypin (blaxpirit@gmail.com) | ||||
|   - Turkish: Erdem Bingöl (erdem84@gmail.com) | ||||
|   - Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net) | ||||
|   license: GPLv2 | ||||
|   | ||||
							
								
								
									
										169
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						| @@ -1,124 +1,4 @@ | ||||
| * Sat Mar 20 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.2.1 | ||||
|     - FEATURE: Display pieces that are being downloaded | ||||
|     - FEATURE: Added back folder watching in Web UI | ||||
|     - FEATURE: Added back file prioritizing in Web UI | ||||
|     - BUGFIX: Fix compilation with Qt 4.4 | ||||
|     - BUGFIX: Fix Web UI compatibility with Safari | ||||
|     - BUGFIX: Fix progress display with cleanlook style | ||||
|     - BUGFIX: Fix file filtering in complex torrents | ||||
|     - BUGFIX: Ask for user confirmation for recursive torrent download | ||||
|     - BUGFIX: Fix "add file" dialog in torrent creation tool | ||||
|     - BUGFIX: Fix "Ctrl+A" in Web UI | ||||
|  | ||||
| * Sun Mar 14 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.2.0 | ||||
|     - FEATURE: User can set alternative speed limits for fast toggling | ||||
|     - FEATURE: Bandwidth scheduler (automatically use alternative speed limits for a given period) | ||||
|     - FEATURE: Added "Added/Completed On" columns to transfer list | ||||
|     - FEATURE: Added "Upload/Download limit" columns to transfer list | ||||
|     - FEATURE: Torrent files can be exported to a given directory | ||||
|     - FEATURE: Outgoing ports range can be customized (for QoS) | ||||
|     - FEATURE: User can choose to apply transfer limits on LAN too | ||||
|     - FEATURE: User can choose to include the protocol overhead in transfer limits | ||||
|     - FEATURE: Torrents can be automatically rechecked on completion | ||||
|     - FEATURE: If 2 torrents have the same hash, add new trackers/URL seeds to the existing torrent | ||||
|     - FEATURE: Trackers can be added from Web UI | ||||
|     - FEATURE: Global transfer information are displayed in the new Web UI status bar | ||||
|     - FEATURE: Allow to change the priority of several files at once | ||||
|     - FEATURE: Support for multiple scan folders (Patch by Christian Kandeler) | ||||
|     - BUGFIX: Only one log window can be opened at a time | ||||
|     - BUGFIX: Optimized RSS module memory usage | ||||
|     - BUGFIX: Consider HTTP downloads >1MB as invalid .torrent files and abort | ||||
|     - BUGFIX: Fix Web UI authentication with some browsers | ||||
|     - BUGFIX: Set Web UI ban period to 1 hour | ||||
|     - COSMETIC: Improved style management | ||||
|  | ||||
| * Mon Jan 18 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.1.0 | ||||
|     - FEATURE: Graphical User Interface can be disabled at compilation time (headless running) | ||||
|     - FEATURE: Torrents can be labeled/categorized | ||||
|     - FEATURE: Labeled torrent can be downloaded corresponding subfolders | ||||
|     - FEATURE: Disk cache size can be set from preferences | ||||
|     - FEATURE: Peer Exchange (PeX) can be disabled from preferences | ||||
|     - FEATURE: Append !.qB extension to incomplete files option (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Torrent files/folders can be renamed (torrent addition dialog or files properties) | ||||
|     - FEATURE: uTorrent compatible tracker list support (use torrentz.com url as a default) | ||||
|     - FEATURE: Better proxy support and preferences remodeling | ||||
|     - FEATURE: qBittorrent can identify itself as uTorrent, Vuze or KTorrent (Any stable version) | ||||
|     - FEATURE: Torrents can be renamed in transfer list | ||||
|     - FEATURE: Display torrent addition dialog for magnet links too | ||||
|     - FEATURE: Files contained in a torrent are opened on double click (files panel) | ||||
|     - FEATURE: Added support for magnet links in search engine | ||||
|     - FEATURE: Added vertor.com and torrentdownloads.net search plugins | ||||
|     - FEATURE: Search engine can now use a SOCKS5 proxy | ||||
|     - FEATURE: HTTP proxy support for peer communication | ||||
|     - BUGFIX: Search engine loads new proxy settings without program restart | ||||
|     - BUGFIX: Use XDG folders (.cache, .local) instead of .qbittorrent | ||||
|     - BUGFIX: Added legal notice on startup that the user must accept | ||||
|     - BUGFIX: Protect Web UI authentication against brute forcing | ||||
|     - BUGFIX: Use HTTP digest mode for Web UI authentication (instead of Basic) | ||||
|     - BUGFIX: Properly display torrents with one file in subfolder(s) | ||||
|     - BUGFIX: Display Web UI favicon | ||||
|     - BUGFIX: File priority can be set for finished torrents that have filtered files | ||||
|     - COSMETIC: Use checkboxes to filter torrent content instead of comboboxes | ||||
|     - COSMETIC: Use alternating row colors in transfer list (set in program preferences) | ||||
|     - COSMETIC: Added a spin box to speed limiting dialog for manual input | ||||
|  | ||||
| * Mon Jan 11 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.0.7 | ||||
|     - BUGFIX: Fix 'Add in pause' setting in torrent addition dialog | ||||
|     - BUGFIX: Update RSS feed as soon as feed downloader is enabled | ||||
|     - BUGFIX: RSS Feed downloader ignores articles above maximum number of articles | ||||
|     - BUGFIX: Fix possible bug when deleting a RSS folder | ||||
|     - BUGFIX: Remove persistant data when a RSS feed is deleted | ||||
|     - BUGFIX: RSS filters are now alphabetically sorted | ||||
|     - BUGFIX: Fix crash when renaming currently displayed RSS filter | ||||
|     - BUGFIX: Remove overwriting confirmation when exporting RSS filters since Qt takes care of it | ||||
|  | ||||
| * Tue Jan 5 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.0.6 | ||||
|     - BUGFIX: Fix detection of invalid torrent files | ||||
|     - BUGFIX: Stop catching signals once one has been caught to avoid possible infinite loop | ||||
|     - BUGFIX: Force data recheck whenever a torrent is moved | ||||
|     - BUGFIX: Detect existing torrent data even if incomplete torrents are saved to a different folder | ||||
|     - COSMETIC: Improve torrent deletion confirmation dialog so that the text that not get truncated | ||||
|  | ||||
| * Thu Dec 31 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.5 | ||||
|     - BUGFIX: Fix crash with downloaded/availability bars when the torrent has too many pieces | ||||
|  | ||||
| * Wed Dec 30 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.4 | ||||
|     - BUGFIX: Fix PeerGuardian .p2b binary filter support | ||||
|     - BUGFIX: Fix possible crash when closing a search engine tab | ||||
|     - BUGFIX: Make sure service port does not change | ||||
|     - BUGFIX: Fix possible DHT port saving issue | ||||
|     - BUGFIX: Fix communication between qBittorrent and Web UI (Qt 4.6) | ||||
|     - BUGFIX: Use Wildcard matching instead of full regex in RSS feed downloader | ||||
|     - BUGFIX: Fix code for listening on a random port whenever it failed to listen on the one defined | ||||
|     - BUGFIX: Use global maximum transfer rates as maximum values in per-torrent speed limiting dialogs | ||||
|     - BUGFIX: Fix global download rate limiting from Web UI | ||||
|     - COSMETIC: Display a disconnected icon in status bar whenever qBittorrent failed to listen on the port defined | ||||
|  | ||||
| * Wed Dec 23 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.3 | ||||
|     - BUGFIX: Minor cosmetic fix to program preferences | ||||
|     - BUGFIX: Fix "Temp path" button in program preferences | ||||
|     - BUGFIX: Handle paths with [~, ., ..] properly | ||||
|     - BUGFIX: Trackers are now displayed for torrents without metadata | ||||
|     - BUGFIX: Fix issue with speed limiting (unlimited was not handled properly) | ||||
|     - BUGFIX: Use the save path set in program preferences as a default in torrent addition dialog | ||||
|  | ||||
| * Fri Dec 18 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.2 | ||||
|     - BUGFIX: Fix .qbittorrent folder not being created (critical bug introduced in v2.0.1 that makes qBittorrent unusuable for new users) | ||||
|     - BUGFIX: Fix RSS Feed downloader for some feeds | ||||
|     - BUGFIX: Do not use home folder as a fallback when the save path is not accessible | ||||
|     - BUGFIX: Fix Mininova, ThePirateBay search engine plugins | ||||
|     - BUGFIX: Read RSS articles are remembered on restart for feeds with no torrents attached | ||||
|  | ||||
| * Sun Dec 13 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.1 | ||||
|     - BUGFIX: µTorrent user-agent is now spoofed correctly | ||||
|     - BUGFIX: Fix column hiding behavior when queueing system is disabled | ||||
|     - BUGFIX: Fix link to plugins.qbittorrent.org in plugins dialog | ||||
|     - BUGFIX: ~/qBT_dir is created only when it is actually used | ||||
|     - BUGFIX: Fix possible missing slot message (toggleSelectedTorrentsSuperSeeding) | ||||
|     - BUGFIX: Fix possible crash in torrent properties (files) | ||||
|     - BUGFIX: Added Hex Magnet Links support (Thanks Haypo) | ||||
|  | ||||
| * Thu Dec 10 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.0 | ||||
| * Unknown - Christophe Dumez <chris@qbittorrent.org> - v2.0.0 | ||||
|     - FEATURE: Added program option to disable splash screen | ||||
|     - FEATURE: Dropped dependency on libcurl and libzzip | ||||
|     - FEATURE: Display more information regarding the torrent in its properties | ||||
| @@ -158,14 +38,10 @@ | ||||
|     - FEATURE: Support for bitcomet padding files (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Option to skip file checking and start seeding immediately in torrent addition dialog (Stephanos Antaris) (libtorrent >= v0.15 only) | ||||
|     - BUGFIX: Made sure qBittorrent does not scrape the tracker too frequently (libtorrent >= 0.15 only) | ||||
|     - BUGFIX: Fix Paste action in search engine field | ||||
|     - BUGFIX: Fix possible double free in search engine destructor | ||||
|     - BUGFIX: Properly handle trackers error messages | ||||
|     - WEB UI: Remodeled Web UI to match new qBittorrent UI (Properties and preferences available) | ||||
|     - WEB UI: Added internationalization support | ||||
|     - WEB UI: Reduced computation in Javascript (do this one server side instead) | ||||
|     - WEB UI: Fixed Transfer list flickering | ||||
|     - WEB UI: Password is now stored as md5 | ||||
|     - I18N: Added Serbian translation (By Anaximandar Milet) | ||||
|     - COSMETIC: Merged download / upload lists | ||||
|     - COSMETIC: Torrents can be filtered based on their status | ||||
| @@ -179,49 +55,6 @@ | ||||
|     - COSMETIC: New torrent status icons by Mateusz Tolola | ||||
|     - COSMETIC: Make use of libnotify if available for system notifications (Ubuntu, ...) | ||||
|  | ||||
| * Tue Nov 17 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.6 | ||||
|   - BUGFIX: RSS feed articles can now be displayed using keyboard arrows | ||||
|   - BUGFIX: RSS feed downloader can only process unread articles now | ||||
|   - BUGFIX: Fixed memory leak in RSS parser | ||||
|   - BUGFIX: Fixed possible crash in search autocompletion | ||||
|   - BUGFIX: Improved ETA calculation for big torrents | ||||
|   - BUGFIX: Fixed per-torrent speed limiting | ||||
|  | ||||
| * Wed Nov 4 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.5 | ||||
|   - BUGFIX: Fixed man page | ||||
|   - BUGFIX: Fix crash on torrent addition (if libtorrent-rasterbar has debug enabled) | ||||
|   - BUGFIX: Fix trackers addition to torrents (bug introduced in v1.5.4) | ||||
|   - BUGFIX: Suppress compilation warning regarding sortNewsList() not being used | ||||
|   - BUGFIX: Make sure scan folder is different than qBittorrent backup directory to avoid torrents deletion | ||||
|   - BUGFIX: Added safety mecanism which adds the torrents back to the list in case qbittorrent-resume.conf gets deleted or corrupted. | ||||
|  | ||||
| * Sun Oct 25 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.4 | ||||
|   - BUGFIX: Updated man page | ||||
|   - BUGFIX: Fixed possible crash with torrents containing unicode characters | ||||
|   - BUGFIX: Fixed problem when disabling systray integration and starting minimized | ||||
|   - BUGFIX: Fixed PirateBay search plugin | ||||
|   - BUGFIX: Using Download button in search results list now downloads the right torrents | ||||
|   - BUGFIX: The search results list is no longer sorted automatically when a row color is updated | ||||
|  | ||||
| * Wed Sep 30 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.3 | ||||
|   - BUGFIX: Fix a possible crash when pausing then deleting a torrent quickly | ||||
|   - BUGFIX: Fix a race condition in folder scanning and torrent downloader | ||||
|   - BUGFIX: Hide download url column in search results | ||||
|   - BUGFIX: Fix a crash when scanned directory does not exist | ||||
|   - BUGFIX: Fix compilation on Mac OS | ||||
|   - BUGFIX: Added a command line parameter to disable splash screen | ||||
|   - BUGFIX: Ignore permanent deletion button when no torrent is selected | ||||
|   - BUGFIX: When a selected torrent is deleted, select next suitable torrent | ||||
|  | ||||
| * Sun Sep 20 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.2 | ||||
|   - BUGFIX: Some torrents were pausing for no reason | ||||
|   - I18N: Updated Korean translation | ||||
|  | ||||
| * Thu Sep 7 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.1 | ||||
|    - BUGFIX: Fix crash in torrent addition dialog when save path does not exist (closes #425227) | ||||
|    - BUGFIX: Fix downloading from URL (broken in v1.5.0) | ||||
|    - BUGFIX: Pause torrents in error state | ||||
|  | ||||
| * Thu Sep 3 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.0 | ||||
|     - FEATURE: Added Magnet URI support | ||||
|     - FEATURE: Search engine supports category-based requests | ||||
|   | ||||
							
								
								
									
										59
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						| @@ -1,55 +1,30 @@ | ||||
| qBittorrent - A BitTorrent client in C++ / Qt4 | ||||
| ------------------------------------------ | ||||
|  | ||||
| 1) Compile and install qBittorrent with Qt4 Graphical Interface | ||||
| ./configure | ||||
| make && make install | ||||
| qbittorrent | ||||
|  | ||||
|   $ ./configure | ||||
|   $ make && make install | ||||
|   $ qbittorrent | ||||
| will install and execute qBittorrent hopefully without any problems. | ||||
|  | ||||
|   will install and execute qBittorrent hopefully without any problems. | ||||
| Dependencies: | ||||
| - Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml) | ||||
|  | ||||
|   Dependencies: | ||||
|     - Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml) | ||||
| - libtorrent-rasterbar by Arvid Norberg (>= 0.14.0 REQUIRED, >= v0.15.0 ADVISED) | ||||
|     -> http://www.qbittorrent.org/download.php (advised) | ||||
|     -> http://www.libtorrent.net | ||||
|     Be careful: another library (the one used by rTorrent) uses a similar name. | ||||
|  | ||||
|     - pkg-config executable | ||||
| - libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization | ||||
|  | ||||
|     - libtorrent-rasterbar by Arvid Norberg (>= 0.14.4 REQUIRED, >= v0.15.0 ADVISED) | ||||
|         -> http://www.libtorrent.net | ||||
|         Be careful: another library (the one used by rTorrent) uses a similar name. | ||||
| - python >= 2.3 (needed by search engine) | ||||
|  | ||||
|     - libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization | ||||
|  | ||||
|     - python >= 2.3 (needed by search engine) | ||||
|         * Run time only dependency | ||||
|  | ||||
|     - libnotify >= 0.4.2, glib-2.0 (optional) | ||||
|         * Can be used for system notifications to replace standard Qt notifications | ||||
|           so that it integrates better into the Desktop | ||||
|  | ||||
|     - geoip-database (optional) | ||||
|         * If qBittorrent cannot find this database, it will try to resolve countries using the Internet but it will be a lot slower. | ||||
|         * Run time only dependency | ||||
|  | ||||
| 2) Compile and install qBittorrent without Qt4 Graphical interface | ||||
|  | ||||
|   $ ./configure --disable-gui | ||||
|   $ make && make install | ||||
|   $ qbittorrent | ||||
|  | ||||
|   will install and execute qBittorrent hopefully without any problems. | ||||
|  | ||||
|   Dependencies: | ||||
|     - Qt >= 4.4.0 (libqt-devel, libqtcore, libqtnetwork) | ||||
|  | ||||
|     - pkg-config executable | ||||
|  | ||||
|     - libtorrent-rasterbar by Arvid Norberg (>= 0.14.4 REQUIRED, >= v0.15.0 ADVISED) | ||||
|         -> http://www.libtorrent.net | ||||
|         Be careful: another library (the one used by rTorrent) uses a similar name. | ||||
|  | ||||
|     - libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization | ||||
| - libnotify >= 0.4.2, glib-2.0 (optional) | ||||
|   * Can be used for system notifications to replace standard Qt notifications | ||||
|     so that it integrates better into the Desktop | ||||
|  | ||||
| - geoip-database (optional) | ||||
|   * If qBittorrent cannot find this database, it will try to resolve countries using the Internet but it will be a lot slower. | ||||
|  | ||||
| DOCUMENTATION: | ||||
| Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org. | ||||
|   | ||||
							
								
								
									
										73
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -18,8 +18,6 @@ Main options: | ||||
|   --help              This help text. | ||||
|  | ||||
| Dependency options: | ||||
|   --disable-gui                      Disable qBittorrent Graphical user | ||||
|                                     interface for headless running | ||||
|   --with-libboost-inc=[path]         Path to libboost include files | ||||
|   --disable-libnotify               Disable use of libnotify | ||||
|   --disable-geoip-database          Disable use of geoip-database | ||||
| @@ -142,11 +140,6 @@ while [ $# -gt 0 ]; do | ||||
| 			shift | ||||
| 			;; | ||||
|  | ||||
| 		--disable-gui) | ||||
| 			QC_DISABLE_GUI="Y" | ||||
| 			shift | ||||
| 			;; | ||||
|  | ||||
| 		--with-libboost-inc=*) | ||||
| 			QC_WITH_LIBBOOST_INC=$optarg | ||||
| 			shift | ||||
| @@ -188,7 +181,6 @@ echo PREFIX=$PREFIX | ||||
| echo BINDIR=$BINDIR | ||||
| echo DATADIR=$DATADIR | ||||
| echo EX_QTDIR=$EX_QTDIR | ||||
| echo QC_DISABLE_GUI=$QC_DISABLE_GUI | ||||
| echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC | ||||
| echo QC_DISABLE_libnotify=$QC_DISABLE_libnotify | ||||
| echo QC_DISABLE_geoip_database=$QC_DISABLE_geoip_database | ||||
| @@ -298,7 +290,6 @@ cat >$1/modules.cpp <<EOT | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: Qt >= 4.4 | ||||
| arg: disable-gui, Disable qBittorrent Graphical user interface for headless running | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| class qc_qt4 : public ConfObj | ||||
| @@ -309,27 +300,11 @@ public: | ||||
| 	QString shortname() const { return "Qt 4.4"; } | ||||
| 	bool exec() | ||||
| 	{ | ||||
| 		if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 			conf->addDefine("DISABLE_GUI"); | ||||
| 		}	 | ||||
| 		if(QT_VERSION >= 0x040500) { | ||||
|                         conf->addDefine("QT_4_5"); | ||||
|                 } | ||||
| 		return(QT_VERSION >= 0x040400); | ||||
| 	} | ||||
| }; | ||||
| #line 1 "pkg-config.qcm" | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: pkg-config | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| #include <QProcess> | ||||
| class qc_pkg_config : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_pkg_config(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "pkg-config executable"; } | ||||
| 	QString shortname() const { return "pkg-config"; } | ||||
| 	bool exec(){ | ||||
| 		return !conf->findProgram("pkg-config").isEmpty(); | ||||
| 		 | ||||
| 	} | ||||
| }; | ||||
| #line 1 "libtorrent-rasterbar.qcm" | ||||
| @@ -343,11 +318,11 @@ class qc_libtorrent_rasterbar : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "libtorrent-rasterbar >= 0.14.4"; } | ||||
| 	QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.15.0 advised)"; } | ||||
| 	QString shortname() const { return "libtorrent-rasterbar"; } | ||||
| 	bool exec(){ | ||||
| 		QStringList incs; | ||||
| 		QString req_ver = "0.14.4"; | ||||
| 		QString req_ver = "0.14.0"; | ||||
| 		QString adv_ver = "0.15.0"; | ||||
| 		QString version, libs, other; | ||||
| 		VersionMode mode = VersionMin; | ||||
| @@ -355,18 +330,12 @@ public: | ||||
| 			return false; | ||||
| 		for(int n = 0; n < incs.count(); ++n) | ||||
| 			conf->addIncludePath(incs[n]); | ||||
| 		//if(!libs.isEmpty()) | ||||
| 		//	conf->addLib(libs); | ||||
| 		if(!libs.isEmpty()) | ||||
| 			conf->addLib(libs); | ||||
| 		if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other)) | ||||
|                         printf("\nWarning: libtorrent-rasterbar v%s was detected. Some feature will be disabled because they require v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data()); | ||||
|                         printf("\nWarning: libtorrent-rasterbar v%s was detected.\nAlthough it will compile and run, you will be missing some features. Please consider updating to v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data()); | ||||
| 		else | ||||
| 			conf->addDefine("LIBTORRENT_0_15"); | ||||
| 		// Get linking parameters | ||||
| 		QStringList params; | ||||
| 		QByteArray staticlibs; | ||||
| 		params << "--static" << "--libs" << "libtorrent-rasterbar"; | ||||
| 		conf->doCommand("pkg-config", params, &staticlibs); | ||||
| 		conf->addLib(staticlibs.trimmed()); | ||||
| 		return true; | ||||
| 	} | ||||
| }; | ||||
| @@ -440,15 +409,7 @@ public: | ||||
| 	qc_libnotify(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "libnotify >= 0.4.2 (optional)"; } | ||||
| 	QString shortname() const { return "libnotify"; } | ||||
|         QString checkString() const { | ||||
|                 if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) | ||||
|                         return ""; | ||||
|                 return ConfObj::checkString(); | ||||
|         } | ||||
| 	bool exec(){ | ||||
| 		if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		QStringList incs; | ||||
| 		QString req_ver = "0.4.2"; | ||||
| 		QString version, libs, other; | ||||
| @@ -491,15 +452,7 @@ public: | ||||
| 	qc_geoip_database(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "GeoIP Database (optional)"; } | ||||
| 	QString shortname() const { return "GeoIP Database"; } | ||||
|         QString checkString() const { | ||||
|                 if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) | ||||
|                         return ""; | ||||
|                 return ConfObj::checkString(); | ||||
|         } | ||||
| 	bool exec() { | ||||
| 	if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 		return false; | ||||
| 	} | ||||
| #ifdef Q_WS_X11 | ||||
| 		if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) { | ||||
| #endif | ||||
| @@ -508,9 +461,9 @@ public: | ||||
| 			return true; | ||||
| #ifdef Q_WS_X11 | ||||
| 		} | ||||
|                 if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat") || QFile::exists("/var/lib/GeoIP/GeoIP.dat")) | ||||
|                 if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat")) | ||||
| 			return true; | ||||
|                 printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat or /var/lib/GeoIP/GeoIP.dat\nCountry resolution will be slow."); | ||||
|                 printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat\nCountry resolution will be slow."); | ||||
| 		return false; | ||||
| #endif | ||||
| 	} | ||||
| @@ -521,9 +474,6 @@ cat >$1/modules_new.cpp <<EOT | ||||
|     o = new qc_qt4(conf); | ||||
|     o->required = true; | ||||
|     o->disabled = false; | ||||
|     o = new qc_pkg_config(conf); | ||||
|     o->required = true; | ||||
|     o->disabled = false; | ||||
|     o = new qc_libtorrent_rasterbar(conf); | ||||
|     o->required = true; | ||||
|     o->disabled = false; | ||||
| @@ -1481,7 +1431,6 @@ export PREFIX | ||||
| export BINDIR | ||||
| export DATADIR | ||||
| export EX_QTDIR | ||||
| export QC_DISABLE_GUI | ||||
| export QC_WITH_LIBBOOST_INC | ||||
| export QC_DISABLE_libnotify | ||||
| export QC_DISABLE_geoip_database | ||||
|   | ||||
| @@ -1,44 +0,0 @@ | ||||
| .\" This manpage has been automatically generated by docbook2man | ||||
| .\" from a DocBook document.  This tool can be found at: | ||||
| .\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>. | ||||
| .TH "QBITTORRENT\-NOX" "1" "January 16th 2010" "Command line Bittorrent client written in C++ / Qt4" "" | ||||
|  | ||||
| .SH "NAME" | ||||
| qBittorrent\-nox \- a command line Bittorrent client written in C++ / Qt4 | ||||
|  | ||||
| .SH "SYNOPSIS" | ||||
|  | ||||
| \fBqbittorrent\-nox\fR [\-\-webui-port=x] [TORRENT_FILE | URL]... | ||||
|  | ||||
| \fBqbittorrent\-nox\fR \-\-help | ||||
|  | ||||
| \fBqbittorrent\-nox\fR \-\-version | ||||
|  | ||||
| .PP | ||||
| .SH "DESCRIPTION" | ||||
|  | ||||
| \fBqBittorrent-nox\fR is an advanced command-line Bittorrent client written in C++ / Qt4, | ||||
| using the \fBlibtorrent-rasterbar\fR library by Arvid Norberg. qBittorrent\-nox aims | ||||
| to be a good alternative to other command line bittorrent clients and provides features similar to popular graphical clients. | ||||
|  | ||||
| qBittorrent\-nox is fast, stable, light and it supports unicode.  | ||||
| It also comes with UPnP port forwarding / NAT-PMP, encryption (Vuze compatible),  | ||||
| FAST extension (mainline) and PeX support (utorrent compatible). | ||||
|  | ||||
| qBittorrent\-nox is meant to be controlled via its feature-rich Web UI which is accessible as a default on http://localhost:8080. The Web UI access is secured and the default account user name is "admin" with "adminadmin" as a password. | ||||
|  | ||||
| .SH "OPTIONS" | ||||
|  | ||||
| \fB--help\fR Prints the command line options. | ||||
|  | ||||
| \fB--version\fR Prints qbittorrent program version number. | ||||
|  | ||||
| \fB--webui-port=x\fR Changes Web UI port to x (default: 8080). | ||||
|  | ||||
| .SH "BUGS" | ||||
|  | ||||
| If you find a bug, please report it at http://bugs.qbittorrent.org | ||||
|  | ||||
| .SH "AUTHOR" | ||||
|  | ||||
| Christophe Dumez <chris@qbittorrent.org> | ||||
| @@ -1,14 +1,14 @@ | ||||
| .\" This manpage has been automatically generated by docbook2man | ||||
| .\" from a DocBook document.  This tool can be found at: | ||||
| .\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>. | ||||
| .TH "QBITTORRENT" "1" "January 16th 2010" "Bittorrent client written in C++ / Qt4" "" | ||||
| .TH "QBITTORRENT" "1" "September 30th 2009" "Bittorrent client written in C++ / Qt4" "" | ||||
|  | ||||
| .SH "NAME" | ||||
| qBittorrent \- a Bittorrent client written in C++ / Qt4 | ||||
|  | ||||
| .SH "SYNOPSIS" | ||||
|  | ||||
| \fBqbittorrent\fR [\-\-no-splash] [\-\-webui-port=x] [TORRENT_FILE | URL]... | ||||
| \fBqbittorrent\fR [\-\-no-splash] [TORRENT_FILE | URL]... | ||||
|  | ||||
| \fBqbittorrent\fR \-\-help | ||||
|  | ||||
| @@ -18,9 +18,10 @@ qBittorrent \- a Bittorrent client written in C++ / Qt4 | ||||
| .SH "DESCRIPTION" | ||||
|  | ||||
| \fBqBittorrent\fR is an advanced Bittorrent client written in C++ / Qt4, | ||||
| using the \fBlibtorrent-rasterbar\fR library by Arvid Norberg. qBittorrent is similar to uTorrent. qBittorrent | ||||
| using the \fBrblibtorrent\fR library by Arvid Norberg. qBittorrent aims | ||||
| to be a good alternative to all other bittorrent clients out there. qBittorrent | ||||
| is fast, stable, light, it supports unicode and it provides a good integrated search engine. | ||||
| It also comes with UPnP port forwarding / NAT-PMP, encryption (Vuze compatible),  | ||||
| It also comes with UPnP port forwarding / NAT-PMP, encryption (Azureus compatible),  | ||||
| FAST extension (mainline) and PeX support (utorrent compatible). | ||||
|  | ||||
| .SH "OPTIONS" | ||||
| @@ -31,8 +32,6 @@ FAST extension (mainline) and PeX support (utorrent compatible). | ||||
|  | ||||
| \fB--no-splash\fR Disables splash screen on startup. | ||||
|  | ||||
| \fB--webui-port=x\fR Changes Web UI port to x (default: 8080). | ||||
|  | ||||
| .SH "BUGS" | ||||
|  | ||||
| If you find a bug, please report it at http://bugs.qbittorrent.org | ||||
|   | ||||
| @@ -1,4 +1,6 @@ | ||||
| TEMPLATE = subdirs | ||||
|  | ||||
| include(conf.pri) | ||||
|  | ||||
| SUBDIRS += src | ||||
|  | ||||
|   | ||||
| @@ -6,9 +6,6 @@ | ||||
|   <dep type='qt4'> | ||||
|     <required/> | ||||
|   </dep> | ||||
|   <dep type='pkg-config'> | ||||
|     <required/> | ||||
|   </dep> | ||||
|   <dep type='libtorrent-rasterbar'> | ||||
|     <required/> | ||||
|   </dep> | ||||
|   | ||||
| @@ -11,15 +11,7 @@ public: | ||||
| 	qc_geoip_database(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "GeoIP Database (optional)"; } | ||||
| 	QString shortname() const { return "GeoIP Database"; } | ||||
|         QString checkString() const { | ||||
|                 if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) | ||||
|                         return ""; | ||||
|                 return ConfObj::checkString(); | ||||
|         } | ||||
| 	bool exec() { | ||||
| 	if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 		return false; | ||||
| 	} | ||||
| #ifdef Q_WS_X11 | ||||
| 		if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) { | ||||
| #endif | ||||
| @@ -28,9 +20,9 @@ public: | ||||
| 			return true; | ||||
| #ifdef Q_WS_X11 | ||||
| 		} | ||||
|                 if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat") || QFile::exists("/var/lib/GeoIP/GeoIP.dat")) | ||||
|                 if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat")) | ||||
| 			return true; | ||||
|                 printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat or /var/lib/GeoIP/GeoIP.dat\nCountry resolution will be slow."); | ||||
|                 printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat\nCountry resolution will be slow."); | ||||
| 		return false; | ||||
| #endif | ||||
| 	} | ||||
|   | ||||
| @@ -10,15 +10,7 @@ public: | ||||
| 	qc_libnotify(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "libnotify >= 0.4.2 (optional)"; } | ||||
| 	QString shortname() const { return "libnotify"; } | ||||
|         QString checkString() const { | ||||
|                 if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) | ||||
|                         return ""; | ||||
|                 return ConfObj::checkString(); | ||||
|         } | ||||
| 	bool exec(){ | ||||
| 		if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		QStringList incs; | ||||
| 		QString req_ver = "0.4.2"; | ||||
| 		QString version, libs, other; | ||||
|   | ||||
| @@ -8,11 +8,11 @@ class qc_libtorrent_rasterbar : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "libtorrent-rasterbar >= 0.14.4"; } | ||||
| 	QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.15.0 advised)"; } | ||||
| 	QString shortname() const { return "libtorrent-rasterbar"; } | ||||
| 	bool exec(){ | ||||
| 		QStringList incs; | ||||
| 		QString req_ver = "0.14.4"; | ||||
| 		QString req_ver = "0.14.0"; | ||||
| 		QString adv_ver = "0.15.0"; | ||||
| 		QString version, libs, other; | ||||
| 		VersionMode mode = VersionMin; | ||||
| @@ -20,18 +20,12 @@ public: | ||||
| 			return false; | ||||
| 		for(int n = 0; n < incs.count(); ++n) | ||||
| 			conf->addIncludePath(incs[n]); | ||||
| 		//if(!libs.isEmpty()) | ||||
| 		//	conf->addLib(libs); | ||||
| 		if(!libs.isEmpty()) | ||||
| 			conf->addLib(libs); | ||||
| 		if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other)) | ||||
|                         printf("\nWarning: libtorrent-rasterbar v%s was detected. Some feature will be disabled because they require v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data()); | ||||
|                         printf("\nWarning: libtorrent-rasterbar v%s was detected.\nAlthough it will compile and run, you will be missing some features. Please consider updating to v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data()); | ||||
| 		else | ||||
| 			conf->addDefine("LIBTORRENT_0_15"); | ||||
| 		// Get linking parameters | ||||
| 		QStringList params; | ||||
| 		QByteArray staticlibs; | ||||
| 		params << "--static" << "--libs" << "libtorrent-rasterbar"; | ||||
| 		conf->doCommand("pkg-config", params, &staticlibs); | ||||
| 		conf->addLib(staticlibs.trimmed()); | ||||
| 		return true; | ||||
| 	} | ||||
| }; | ||||
|   | ||||
| @@ -1,16 +0,0 @@ | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: pkg-config | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| #include <QProcess> | ||||
| class qc_pkg_config : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_pkg_config(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "pkg-config executable"; } | ||||
| 	QString shortname() const { return "pkg-config"; } | ||||
| 	bool exec(){ | ||||
| 		return !conf->findProgram("pkg-config").isEmpty(); | ||||
| 	} | ||||
| }; | ||||
| @@ -1,7 +1,6 @@ | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: Qt >= 4.4 | ||||
| arg: disable-gui, Disable qBittorrent Graphical user interface for headless running | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| class qc_qt4 : public ConfObj | ||||
| @@ -12,9 +11,10 @@ public: | ||||
| 	QString shortname() const { return "Qt 4.4"; } | ||||
| 	bool exec() | ||||
| 	{ | ||||
| 		if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 			conf->addDefine("DISABLE_GUI"); | ||||
| 		}	 | ||||
| 		if(QT_VERSION >= 0x040500) { | ||||
|                         conf->addDefine("QT_4_5"); | ||||
|                 } | ||||
| 		return(QT_VERSION >= 0x040400); | ||||
| 		 | ||||
| 	} | ||||
| }; | ||||
|   | ||||
							
								
								
									
										189
									
								
								src/GUI.cpp
									
									
									
									
									
								
							
							
						
						
							
								
								
									
										197
									
								
								src/GUI.h
									
									
									
									
									
								
							
							
						
						| @@ -55,117 +55,108 @@ class TransferListFiltersWidget; | ||||
| class QSplitter; | ||||
| class PropertiesWidget; | ||||
| class StatusBar; | ||||
| class consoleDlg; | ||||
| class about; | ||||
| class createtorrent; | ||||
| class downloadFromURL; | ||||
|  | ||||
| class GUI : public QMainWindow, private Ui::MainWindow{ | ||||
|   Q_OBJECT | ||||
|  | ||||
| public: | ||||
|   // Construct / Destruct | ||||
|   GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList()); | ||||
|   ~GUI(); | ||||
|   // Methods | ||||
|   int getCurrentTabIndex() const; | ||||
|   TransferListWidget* getTransferList() const { return transferList; } | ||||
|   private: | ||||
|     // Bittorrent | ||||
|     Bittorrent *BTSession; | ||||
|     QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed? | ||||
|     // GUI related | ||||
|     QTimer *guiUpdater; | ||||
|     QTabWidget *tabs; | ||||
|     StatusBar *status_bar; | ||||
|     QPointer<options_imp> options; | ||||
|     QPointer<QSystemTrayIcon> systrayIcon; | ||||
|     QPointer<QTimer> systrayCreator; | ||||
|     QMenu *myTrayIconMenu; | ||||
|     TransferListWidget *transferList; | ||||
|     TransferListFiltersWidget *transferListFilters; | ||||
|     PropertiesWidget *properties; | ||||
|     bool displaySpeedInTitle; | ||||
|     bool force_exit; | ||||
|     // Keyboard shortcuts | ||||
|     QShortcut *switchSearchShortcut; | ||||
|     QShortcut *switchSearchShortcut2; | ||||
|     QShortcut *switchTransferShortcut; | ||||
|     QShortcut *switchRSSShortcut; | ||||
|     // Widgets | ||||
|     QAction *prioSeparator; | ||||
|     QAction *prioSeparator2; | ||||
|     QSplitter *hSplitter; | ||||
|     QSplitter *vSplitter; | ||||
|     // Search | ||||
|     SearchEngine *searchEngine; | ||||
|     // RSS | ||||
|     QPointer<RSSImp> rssWidget; | ||||
|     // Misc | ||||
|     QLocalServer *localServer; | ||||
|  | ||||
| public slots: | ||||
|   void trackerAuthenticationRequired(QTorrentHandle& h); | ||||
|   void setTabText(int index, QString text) const; | ||||
|   void showNotificationBaloon(QString title, QString msg) const; | ||||
|   void downloadFromURLList(const QStringList& urls); | ||||
|   void updateAltSpeedsBtn(bool alternative); | ||||
|   protected slots: | ||||
|     // GUI related slots | ||||
|     void dropEvent(QDropEvent *event); | ||||
|     void dragEnterEvent(QDragEnterEvent *event); | ||||
|     void toggleVisibility(QSystemTrayIcon::ActivationReason e); | ||||
|     void on_actionAbout_triggered(); | ||||
|     void on_actionCreate_torrent_triggered(); | ||||
|     void on_actionWebsite_triggered() const; | ||||
|     void on_actionBugReport_triggered() const; | ||||
|     void on_actionShow_console_triggered(); | ||||
|     void readParamsOnSocket(); | ||||
|     void acceptConnection(); | ||||
|     void balloonClicked(); | ||||
|     void writeSettings(); | ||||
|     void readSettings(); | ||||
|     void on_actionExit_triggered(); | ||||
|     void createTrayIcon(); | ||||
|     void fullDiskError(QTorrentHandle& h, QString msg) const; | ||||
|     void handleDownloadFromUrlFailure(QString, QString) const; | ||||
|     void createSystrayDelayed(); | ||||
|     void tab_changed(int); | ||||
|     // Keyboard shortcuts | ||||
|     void createKeyboardShortcuts(); | ||||
|     void displayTransferTab() const; | ||||
|     void displaySearchTab() const; | ||||
|     void displayRSSTab() const; | ||||
|     // Torrent actions | ||||
|     void on_actionSet_global_upload_limit_triggered(); | ||||
|     void on_actionSet_global_download_limit_triggered(); | ||||
|     void on_actionDocumentation_triggered() const; | ||||
|     void on_actionOpen_triggered(); | ||||
|     void updateGUI(); | ||||
|     void loadPreferences(bool configure_session=true); | ||||
|     void processParams(const QStringList& params); | ||||
|     void addTorrent(QString path); | ||||
|     void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker); | ||||
|     void processDownloadedFiles(QString path, QString url); | ||||
|     void downloadFromURLList(const QStringList& urls); | ||||
|     void finishedTorrent(QTorrentHandle& h) const; | ||||
|     // Options slots | ||||
|     void on_actionOptions_triggered(); | ||||
|     void optionsSaved(); | ||||
|     // HTTP slots | ||||
|     void on_actionDownload_from_URL_triggered(); | ||||
|  | ||||
| protected slots: | ||||
|   // GUI related slots | ||||
|   void dropEvent(QDropEvent *event); | ||||
|   void dragEnterEvent(QDragEnterEvent *event); | ||||
|   void toggleVisibility(QSystemTrayIcon::ActivationReason e); | ||||
|   void on_actionAbout_triggered(); | ||||
|   void on_actionCreate_torrent_triggered(); | ||||
|   void on_actionWebsite_triggered() const; | ||||
|   void on_actionBugReport_triggered() const; | ||||
|   void on_actionShow_console_triggered(); | ||||
|   void readParamsOnSocket(); | ||||
|   void acceptConnection(); | ||||
|   void balloonClicked(); | ||||
|   void writeSettings(); | ||||
|   void readSettings(); | ||||
|   void on_actionExit_triggered(); | ||||
|   void createTrayIcon(); | ||||
|   void fullDiskError(QTorrentHandle& h, QString msg) const; | ||||
|   void handleDownloadFromUrlFailure(QString, QString) const; | ||||
|   void createSystrayDelayed(); | ||||
|   void tab_changed(int); | ||||
|   // Keyboard shortcuts | ||||
|   void createKeyboardShortcuts(); | ||||
|   void displayTransferTab() const; | ||||
|   void displaySearchTab() const; | ||||
|   void displayRSSTab() const; | ||||
|   // Torrent actions | ||||
|   void on_actionSet_global_upload_limit_triggered(); | ||||
|   void on_actionSet_global_download_limit_triggered(); | ||||
|   void on_actionDocumentation_triggered() const; | ||||
|   void on_actionOpen_triggered(); | ||||
|   void updateGUI(); | ||||
|   void loadPreferences(bool configure_session=true); | ||||
|   void processParams(const QStringList& params); | ||||
|   void addTorrent(QString path); | ||||
|   void addUnauthenticatedTracker(const QPair<QTorrentHandle,QString> &tracker); | ||||
|   void processDownloadedFiles(QString path, QString url); | ||||
|   void finishedTorrent(QTorrentHandle& h) const; | ||||
|   void askRecursiveTorrentDownloadConfirmation(QTorrentHandle &h); | ||||
|   // Options slots | ||||
|   void on_actionOptions_triggered(); | ||||
|   void optionsSaved(); | ||||
|   // HTTP slots | ||||
|   void on_actionDownload_from_URL_triggered(); | ||||
|  | ||||
| protected: | ||||
|   void closeEvent(QCloseEvent *); | ||||
|   void showEvent(QShowEvent *); | ||||
|   bool event(QEvent * event); | ||||
|   void displayRSSTab(bool enable); | ||||
|   public slots: | ||||
|     void trackerAuthenticationRequired(QTorrentHandle& h); | ||||
|     void setTabText(int index, QString text) const; | ||||
|     void showNotificationBaloon(QString title, QString msg) const; | ||||
|  | ||||
| private: | ||||
|   // Bittorrent | ||||
|   Bittorrent *BTSession; | ||||
|   QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed? | ||||
|   // GUI related | ||||
|   QTimer *guiUpdater; | ||||
|   QTabWidget *tabs; | ||||
|   StatusBar *status_bar; | ||||
|   QPointer<options_imp> options; | ||||
|   QPointer<consoleDlg> console; | ||||
|   QPointer<about> aboutDlg; | ||||
|   QPointer<createtorrent> createTorrentDlg; | ||||
|   QPointer<downloadFromURL> downloadFromURLDialog; | ||||
|   QPointer<QSystemTrayIcon> systrayIcon; | ||||
|   QPointer<QTimer> systrayCreator; | ||||
|   QMenu *myTrayIconMenu; | ||||
|   TransferListWidget *transferList; | ||||
|   TransferListFiltersWidget *transferListFilters; | ||||
|   PropertiesWidget *properties; | ||||
|   bool displaySpeedInTitle; | ||||
|   bool force_exit; | ||||
|   // Keyboard shortcuts | ||||
|   QShortcut *switchSearchShortcut; | ||||
|   QShortcut *switchSearchShortcut2; | ||||
|   QShortcut *switchTransferShortcut; | ||||
|   QShortcut *switchRSSShortcut; | ||||
|   // Widgets | ||||
|   QAction *prioSeparator; | ||||
|   QAction *prioSeparator2; | ||||
|   QSplitter *hSplitter; | ||||
|   QSplitter *vSplitter; | ||||
|   // Search | ||||
|   SearchEngine *searchEngine; | ||||
|   // RSS | ||||
|   QPointer<RSSImp> rssWidget; | ||||
|   // Misc | ||||
|   QLocalServer *localServer; | ||||
|   protected: | ||||
|     void closeEvent(QCloseEvent *); | ||||
|     void showEvent(QShowEvent *); | ||||
|     bool event(QEvent * event); | ||||
|     void displayRSSTab(bool enable); | ||||
|  | ||||
|   public: | ||||
|     // Construct / Destruct | ||||
|     GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList()); | ||||
|     ~GUI(); | ||||
|     // Methods | ||||
|     int getCurrentTabIndex() const; | ||||
|     QPoint screenCenter() const; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|   | ||||
| Before Width: | Height: | Size: 459 B After Width: | Height: | Size: 496 B | 
							
								
								
									
										
											BIN
										
									
								
								src/Icons/oxygen/application-x-kgetlist-no.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 743 B | 
							
								
								
									
										
											BIN
										
									
								
								src/Icons/oxygen/application-x-kgetlist.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 659 B | 
| Before Width: | Height: | Size: 7.0 KiB | 
| Before Width: | Height: | Size: 1.0 KiB | 
| Before Width: | Height: | Size: 409 B | 
| Before Width: | Height: | Size: 1.8 KiB | 
| Before Width: | Height: | Size: 722 B | 
| @@ -1,6 +1,6 @@ | ||||
| [Desktop Entry] | ||||
| Categories=Qt;Network;P2P; | ||||
| Comment=V2.2.1 | ||||
| Comment=V2.0.0 | ||||
| Exec=qbittorrent %f | ||||
| GenericName=Bittorrent client | ||||
| GenericName[bg]=Торент клиент | ||||
| @@ -21,7 +21,7 @@ GenericName[pt_BR]=Cliente Bittorrent | ||||
| GenericName[ro]=Client Bittorrent | ||||
| GenericName[ru]=клиент Bittorrent | ||||
| GenericName[sk]=Klient siete Bittorrent | ||||
| GenericName[sr]=Bittorrent-клијент | ||||
| GenericName[sr]=БитТоррент клијент | ||||
| GenericName[sv]=Bittorrent-klient | ||||
| GenericName[tr]=Bittorrent istemcisi | ||||
| GenericName[uk]=Bittorrent-клієнт | ||||
|   | ||||
| Before Width: | Height: | Size: 1.4 KiB | 
| Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 78 KiB | 
| Before Width: | Height: | Size: 910 B | 
| Before Width: | Height: | Size: 2.2 KiB | 
| Before Width: | Height: | Size: 680 B | 
| @@ -63,8 +63,8 @@ class about : public QDialog, private Ui::AboutDlg{ | ||||
|       te_translation->append(tr("I would like to thank the following people who volunteered to translate qBittorrent:")+QString::fromUtf8("<br>")); | ||||
|       te_translation->append(QString::fromUtf8( | ||||
|           "<i>- <u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)<br>\ | ||||
|           - <u>Bulgarian:</u> Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)<br>\ | ||||
|           - <u>Catalan:</u> Francisco Luque Contreras (frannoe@ya.com)<br>\ | ||||
|           - <u>Bulgarian:</u> Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)<br>\ | ||||
|           - <u>Catalan:</u> Gekko Dam Beer (gekko04@users.sourceforge.net)<br>\ | ||||
|           - <u>Chinese (Simplified):</u> Guo Yue (yue.guo0418@gmail.com)<br>\ | ||||
|           - <u>Chinese (Traditional):</u> Yi-Shun Wang (dnextstep@gmail.com)<br>\ | ||||
|           - <u>Czech:</u> Jirka Vilim (web@tets.cz)<br>\ | ||||
| @@ -75,7 +75,7 @@ class about : public QDialog, private Ui::AboutDlg{ | ||||
|           - <u>Greek:</u> Tsvetan Bankov (emerge_life@users.sourceforge.net)<br>\ | ||||
|           - <u>Hungarian:</u> Majoros Péter (majoros.peterj@gmail.com)<br>\ | ||||
|           - <u>Italian:</u> Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)<br>\ | ||||
|           - <u>Japanese:</u> Nardog (alphisation@gmail.com)<br>\ | ||||
|           - <u>Japanese:</u> Nardog (nardog@e2umail.com)<br>\ | ||||
|           - <u>Korean:</u> Jin Woo Sin (jin828sin@users.sourceforge.net)<br>\ | ||||
|           - <u>Norwegian:</u> Lars-Erik Labori (hamil@users.sourceforge.net)<br>\ | ||||
|           - <u>Polish:</u> Mariusz Fik (fisiu@opensuse.org)<br>\ | ||||
| @@ -84,10 +84,10 @@ class about : public QDialog, private Ui::AboutDlg{ | ||||
|           - <u>Russian:</u> Nick Khazov (m2k3d0n@users.sourceforge.net) and Alexey Morsov (samurai@ricom.ru)<br>\ | ||||
|           - <u>Serbian:</u> Anaximandar Milet (anaximandar@operamail.com)<br>\ | ||||
|           - <u>Slovak:</u>  helix84<br>\ | ||||
|           - <u>Spanish:</u> Francisco Luque Contreras (frannoe@ya.com)<br>\ | ||||
|           - <u>Spanish:</u> Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net) and Gabriel de Oliveira (deadloop@hotmail.com)<br>\ | ||||
|           - <u>Swedish:</u> Daniel Nylander (po@danielnylander.se)<br>\ | ||||
|           - <u>Turkish:</u> Hasan YILMAZ (iletisim@hedefturkce.com) and Erdem Bingöl (erdem84@gmail.com)<br>\ | ||||
|           - <u>Ukrainian:</u> Andrey Shpachenko (masterfix@users.sourceforge.net) and Oleh Prypin (blaxpirit@gmail.com)<br><br>")); | ||||
|           - <u>Ukrainian:</u> Andrey Shpachenko (masterfix@users.sourceforge.net)<br><br>")); | ||||
|       te_translation->append(tr("Please contact me if you would like to translate qBittorrent into your own language.")); | ||||
|       te_translation->scrollToAnchor(QString::fromUtf8("top")); | ||||
|       // License | ||||
|   | ||||
| @@ -1,146 +0,0 @@ | ||||
| #ifndef ADVANCEDSETTINGS_H | ||||
| #define ADVANCEDSETTINGS_H | ||||
|  | ||||
| #include <QTableWidget> | ||||
| #include <QHeaderView> | ||||
| #include <QSpinBox> | ||||
| #include <QCheckBox> | ||||
| #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 }; | ||||
| #define ROW_COUNT 9 | ||||
|  | ||||
| class AdvancedSettings: public QTableWidget { | ||||
|   Q_OBJECT | ||||
|  | ||||
| private: | ||||
|   QSpinBox *spin_cache, *outgoing_ports_min, *outgoing_ports_max, *spin_list_refresh; | ||||
|   QCheckBox *cb_ignore_limits_lan, *cb_count_overhead, *cb_recheck_completed, *cb_resolve_countries, *cb_resolve_hosts; | ||||
|  | ||||
| public: | ||||
|   AdvancedSettings(QWidget *parent=0): QTableWidget(parent) { | ||||
|     // Set visual appearance | ||||
|     setEditTriggers(QAbstractItemView::NoEditTriggers); | ||||
|     setAlternatingRowColors(true); | ||||
|     setColumnCount(2); | ||||
|     QStringList header; | ||||
|     header << tr("Property") << tr("Value"); | ||||
|     setHorizontalHeaderLabels(header); | ||||
|     setColumnWidth(0, width()/2); | ||||
|     horizontalHeader()->setStretchLastSection(true); | ||||
|     verticalHeader()->setVisible(false); | ||||
|     setRowCount(ROW_COUNT); | ||||
|     // Load settings | ||||
|     loadAdvancedSettings(); | ||||
|   } | ||||
|  | ||||
|   ~AdvancedSettings() { | ||||
|     delete spin_cache; | ||||
|     delete outgoing_ports_min; | ||||
|     delete outgoing_ports_max; | ||||
|     delete cb_ignore_limits_lan; | ||||
|     delete cb_count_overhead; | ||||
|     delete cb_recheck_completed; | ||||
|     delete spin_list_refresh; | ||||
|     delete cb_resolve_countries; | ||||
|     delete cb_resolve_hosts; | ||||
|   } | ||||
|  | ||||
| public slots: | ||||
|   void saveAdvancedSettings() { | ||||
|     // Disk write cache | ||||
|     Preferences::setDiskCacheSize(spin_cache->value()); | ||||
|     // Outgoing ports | ||||
|     Preferences::setOutgoingPortsMin(outgoing_ports_min->value()); | ||||
|     Preferences::setOutgoingPortsMax(outgoing_ports_max->value()); | ||||
|     // Ignore limits on LAN | ||||
|     Preferences::ignoreLimitsOnLAN(cb_ignore_limits_lan->isChecked()); | ||||
|     // Include protocol overhead in transfer limits | ||||
|     Preferences::includeOverheadInLimits(cb_count_overhead->isChecked()); | ||||
|     // Recheck torrents on completion | ||||
|     Preferences::recheckTorrentsOnCompletion(cb_recheck_completed->isChecked()); | ||||
|     // Transfer list refresh interval | ||||
|     Preferences::setRefreshInterval(spin_list_refresh->value()); | ||||
|     // Peer resolution | ||||
|     Preferences::resolvePeerCountries(cb_resolve_countries->isChecked()); | ||||
|     Preferences::resolvePeerHostNames(cb_resolve_hosts->isChecked()); | ||||
|   } | ||||
|  | ||||
| protected slots: | ||||
|   void loadAdvancedSettings() { | ||||
|     // Disk write cache | ||||
|     setItem(DISK_CACHE, PROPERTY, new QTableWidgetItem(tr("Disk write cache size"))); | ||||
|     spin_cache = new QSpinBox(); | ||||
|     connect(spin_cache, SIGNAL(valueChanged(int)), this, SLOT(emitSettingsChanged())); | ||||
|     spin_cache->setMinimum(1); | ||||
|     spin_cache->setMaximum(200); | ||||
|     spin_cache->setValue(Preferences::diskCacheSize()); | ||||
|     spin_cache->setSuffix(tr(" MiB")); | ||||
|     setCellWidget(DISK_CACHE, VALUE, spin_cache); | ||||
|     // Outgoing port Min | ||||
|     setItem(OUTGOING_PORT_MIN, PROPERTY, new QTableWidgetItem(tr("Outgoing ports (Min) [0: Disabled]"))); | ||||
|     outgoing_ports_min = new QSpinBox(); | ||||
|     connect(outgoing_ports_min, SIGNAL(valueChanged(int)), this, SLOT(emitSettingsChanged())); | ||||
|     outgoing_ports_min->setMinimum(0); | ||||
|     outgoing_ports_min->setMaximum(65535); | ||||
|     outgoing_ports_min->setValue(Preferences::outgoingPortsMin()); | ||||
|     setCellWidget(OUTGOING_PORT_MIN, VALUE, outgoing_ports_min); | ||||
|     // Outgoing port Min | ||||
|     setItem(OUTGOING_PORT_MAX, PROPERTY, new QTableWidgetItem(tr("Outgoing ports (Max) [0: Disabled]"))); | ||||
|     outgoing_ports_max = new QSpinBox(); | ||||
|     connect(outgoing_ports_max, SIGNAL(valueChanged(int)), this, SLOT(emitSettingsChanged())); | ||||
|     outgoing_ports_max->setMinimum(0); | ||||
|     outgoing_ports_max->setMaximum(65535); | ||||
|     outgoing_ports_max->setValue(Preferences::outgoingPortsMax()); | ||||
|     setCellWidget(OUTGOING_PORT_MAX, VALUE, outgoing_ports_max); | ||||
|     // Ignore transfer limits on local network | ||||
|     setItem(IGNORE_LIMIT_LAN, PROPERTY, new QTableWidgetItem(tr("Ignore transfer limits on local network"))); | ||||
|     cb_ignore_limits_lan = new QCheckBox(); | ||||
|     connect(cb_ignore_limits_lan, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged())); | ||||
|     cb_ignore_limits_lan->setChecked(Preferences::ignoreLimitsOnLAN()); | ||||
|     setCellWidget(IGNORE_LIMIT_LAN, VALUE, cb_ignore_limits_lan); | ||||
|     // Consider protocol overhead in transfer limits | ||||
|     setItem(COUNT_OVERHEAD, PROPERTY, new QTableWidgetItem(tr("Include TCP/IP overhead in transfer limits"))); | ||||
|     cb_count_overhead = new QCheckBox(); | ||||
|     connect(cb_count_overhead, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged())); | ||||
|     cb_count_overhead->setChecked(Preferences::includeOverheadInLimits()); | ||||
|     setCellWidget(COUNT_OVERHEAD, VALUE, cb_count_overhead); | ||||
|     // Recheck completed torrents | ||||
|     setItem(RECHECK_COMPLETED, PROPERTY, new QTableWidgetItem(tr("Recheck torrents on completion"))); | ||||
|     cb_recheck_completed = new QCheckBox(); | ||||
|     connect(cb_recheck_completed, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged())); | ||||
|     cb_recheck_completed->setChecked(Preferences::recheckTorrentsOnCompletion()); | ||||
|     setCellWidget(RECHECK_COMPLETED, VALUE, cb_recheck_completed); | ||||
|     // Transfer list refresh interval | ||||
|     setItem(LIST_REFRESH, PROPERTY, new QTableWidgetItem(tr("Transfer list refresh interval"))); | ||||
|     spin_list_refresh = new QSpinBox(); | ||||
|     connect(spin_list_refresh, SIGNAL(valueChanged(int)), this, SLOT(emitSettingsChanged())); | ||||
|     spin_list_refresh->setMinimum(30); | ||||
|     spin_list_refresh->setMaximum(99999); | ||||
|     spin_list_refresh->setValue(Preferences::getRefreshInterval()); | ||||
|     spin_list_refresh->setSuffix(tr(" ms", " milliseconds")); | ||||
|     setCellWidget(LIST_REFRESH, VALUE, spin_list_refresh); | ||||
|     // Resolve Peer countries | ||||
|     setItem(RESOLVE_COUNTRIES, PROPERTY, new QTableWidgetItem(tr("Resolve peer countries (GeoIP)"))); | ||||
|     cb_resolve_countries = new QCheckBox(); | ||||
|     connect(cb_resolve_countries, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged())); | ||||
|     cb_resolve_countries->setChecked(Preferences::resolvePeerCountries()); | ||||
|     setCellWidget(RESOLVE_COUNTRIES, VALUE, cb_resolve_countries); | ||||
|     // Resolve peer hosts | ||||
|     setItem(RESOLVE_HOSTS, PROPERTY, new QTableWidgetItem(tr("Resolve peer host names"))); | ||||
|     cb_resolve_hosts = new QCheckBox(); | ||||
|     connect(cb_resolve_hosts, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged())); | ||||
|     cb_resolve_hosts->setChecked(Preferences::resolvePeerHostNames()); | ||||
|     setCellWidget(RESOLVE_HOSTS, VALUE, cb_resolve_hosts); | ||||
|   } | ||||
|  | ||||
|   void emitSettingsChanged() { | ||||
|     emit settingsChanged(); | ||||
|   } | ||||
|  | ||||
| signals: | ||||
|   void settingsChanged(); | ||||
| }; | ||||
|  | ||||
| #endif // ADVANCEDSETTINGS_H | ||||
| @@ -1,111 +0,0 @@ | ||||
| #ifndef BANDWIDTHSCHEDULER_H | ||||
| #define BANDWIDTHSCHEDULER_H | ||||
|  | ||||
| #include <QTimer> | ||||
| #include <QTime> | ||||
| #include <QDateTime> | ||||
| #include "preferences.h" | ||||
| #include <iostream> | ||||
|  | ||||
| class BandwidthScheduler: public QTimer { | ||||
|   Q_OBJECT | ||||
|  | ||||
| private: | ||||
|   bool in_alternative_mode; | ||||
|  | ||||
| public: | ||||
|   BandwidthScheduler(QObject *parent): QTimer(parent), in_alternative_mode(false) { | ||||
|     Q_ASSERT(Preferences::isSchedulerEnabled()); | ||||
|     // Signal shot, we call start() again manually | ||||
|     setSingleShot(true); | ||||
|     // Connect Signals/Slots | ||||
|     connect(this, SIGNAL(timeout()), this, SLOT(switchMode())); | ||||
|   } | ||||
|  | ||||
| public slots: | ||||
|   void start() { | ||||
|     Q_ASSERT(Preferences::isSchedulerEnabled()); | ||||
|  | ||||
|     QTime startAltSpeeds = Preferences::getSchedulerStartTime(); | ||||
|     QTime endAltSpeeds = Preferences::getSchedulerEndTime(); | ||||
|     if(startAltSpeeds == endAltSpeeds) { | ||||
|       std::cerr << "Error: bandwidth scheduler have the same start time and end time." << std::endl; | ||||
|       std::cerr << "The bandwidth scheduler will be disabled" << std::endl; | ||||
|       stop(); | ||||
|       emit switchToAlternativeMode(false); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     // Determine what the closest QTime is | ||||
|     QTime now = QTime::currentTime(); | ||||
|     uint time_to_start = secsTo(now, startAltSpeeds); | ||||
|     uint time_to_end = secsTo(now, endAltSpeeds); | ||||
|     if(time_to_end < time_to_start) { | ||||
|       // We should be in alternative mode | ||||
|       in_alternative_mode = true; | ||||
|       // Start counting | ||||
|       QTimer::start(time_to_end*1000); | ||||
|     } else { | ||||
|       // We should be in normal mode | ||||
|       in_alternative_mode = false; | ||||
|       // Start counting | ||||
|       QTimer::start(time_to_start*1000); | ||||
|     } | ||||
|     // Send signal to notify BTSession | ||||
|     emit switchToAlternativeMode(in_alternative_mode); | ||||
|   } | ||||
|  | ||||
|   void switchMode() { | ||||
|     // Get the day this mode was started (either today or yesterday) | ||||
|     QDate current_date = QDateTime::currentDateTime().toLocalTime().date(); | ||||
|     int day = current_date.dayOfWeek(); | ||||
|     if(in_alternative_mode) { | ||||
|       // It is possible that starttime was yesterday | ||||
|       if(QTime::currentTime().secsTo(Preferences::getSchedulerStartTime()) > 0) { | ||||
|         current_date.addDays(-1); // Go to yesterday | ||||
|         day = current_date.day(); | ||||
|       } | ||||
|     } | ||||
|     // Check if the day is in scheduler days | ||||
|     // Notify BTSession only if necessary | ||||
|     switch(Preferences::getSchedulerDays()) { | ||||
|     case EVERY_DAY: | ||||
|       emit switchToAlternativeMode(!in_alternative_mode); | ||||
|       break; | ||||
|     case WEEK_ENDS: | ||||
|       if(day == Qt::Saturday || day == Qt::Sunday) | ||||
|         emit switchToAlternativeMode(!in_alternative_mode); | ||||
|       break; | ||||
|     case WEEK_DAYS: | ||||
|       if(day != Qt::Saturday && day != Qt::Sunday) | ||||
|         emit switchToAlternativeMode(!in_alternative_mode); | ||||
|       break; | ||||
|     default: | ||||
|       // Convert our enum index to Qt enum index | ||||
|       int scheduler_day = ((int)Preferences::getSchedulerDays()) - 2; | ||||
|       if(day == scheduler_day) | ||||
|         emit switchToAlternativeMode(!in_alternative_mode); | ||||
|       break; | ||||
|     } | ||||
|     // Call start again | ||||
|     start(); | ||||
|   } | ||||
|  | ||||
| signals: | ||||
|   void switchToAlternativeMode(bool alternative); | ||||
|  | ||||
| private: | ||||
|   // Qt function can return negative values and we | ||||
|   // don't want that | ||||
|   uint secsTo(QTime now, QTime t) { | ||||
|     int diff = now.secsTo(t); | ||||
|     if(diff < 0) { | ||||
|       // 86400 seconds in a day | ||||
|       diff += 86400; | ||||
|     } | ||||
|     Q_ASSERT(diff >= 0); | ||||
|     return diff; | ||||
|   } | ||||
| }; | ||||
|  | ||||
| #endif // BANDWIDTHSCHEDULER_H | ||||