1
mirror of https://github.com/qbittorrent/qBittorrent synced 2025-10-12 03:12:18 +02:00

Compare commits

...

159 Commits

Author SHA1 Message Date
Christophe Dumez
0b0d473a53 tagged v1.3.0 release 2009-01-14 12:37:31 +00:00
Christophe Dumez
f9f912906e - Fix version in qBittorrent.desktop 2009-01-11 10:19:02 +00:00
Christophe Dumez
7b4eee7a7d - Updated Changelog 2009-01-09 18:18:57 +00:00
Christophe Dumez
e799ac57ed - Updated TODO 2009-01-09 18:11:40 +00:00
Christophe Dumez
30c93b9a4a - v1.3.0final 2009-01-09 18:09:41 +00:00
Christophe Dumez
03dc617874 - Updated some translations 2009-01-06 20:38:52 +00:00
Christophe Dumez
bc29577a7b - Added some debug for proxy settings 2009-01-05 23:16:34 +00:00
Christophe Dumez
5509e94778 - Fixed pausing of queued torrents 2009-01-05 22:16:08 +00:00
Christophe Dumez
89330e11de - Priorities are now remembered across restart (bugfix) 2009-01-05 21:19:55 +00:00
Christophe Dumez
c016c4bf66 - Improved DHT code
- Remove outdated comment
2009-01-05 20:41:35 +00:00
Christophe Dumez
3f1081b621 BUGFIX: Proxy settings are now saved even if disabled 2009-01-05 11:42:37 +00:00
Christophe Dumez
e3ae03c8a8 - Ok, HTTP proxy code is working now 2009-01-05 11:20:32 +00:00
Christophe Dumez
fbe292d06e - Fixed another error in HTTP proxy code 2009-01-05 11:13:05 +00:00
Christophe Dumez
1d294e43f1 - Improve src/src.pro for windows 2009-01-04 19:48:16 +00:00
Christophe Dumez
d883ef27be - Use rootDir as default dir on Windows instead of homeDir 2009-01-04 19:37:55 +00:00
Christophe Dumez
be934837e5 - Fixed possible issue in tracker addition 2009-01-04 17:13:47 +00:00
Christophe Dumez
956f97f6d6 - Fixed systray icon tooltip on Windows 2009-01-04 17:08:52 +00:00
Christophe Dumez
de38ca3e23 - Updated Changelog 2009-01-04 15:45:44 +00:00
Christophe Dumez
1efaea46e3 - Made sure that old fastresume is overwritten when saving new one 2009-01-04 15:37:13 +00:00
Christophe Dumez
2694a0947f - Fixed possible crash when pausing a torrent 2009-01-04 12:44:55 +00:00
Christophe Dumez
f61d9d23f5 - Again 2009-01-04 11:33:18 +00:00
Christophe Dumez
60dda258b3 - typo in src.pro 2009-01-04 11:32:31 +00:00
Christophe Dumez
c79a4a746f - Attempt to fix linking on windows 2009-01-04 09:19:20 +00:00
Christophe Dumez
942b579d8e - Removed dependency on qdbus since we are not using it any longer 2009-01-04 00:05:08 +00:00
Christophe Dumez
93bc6dca95 - A lot of improvement in proxy code 2009-01-03 22:49:21 +00:00
Christophe Dumez
f36052351c - Added debug for proxy code 2009-01-03 22:33:05 +00:00
Christophe Dumez
d40c646561 - Removed useless check in proxy code 2009-01-03 22:26:45 +00:00
Christophe Dumez
9412ced722 - Important HTTP proxy fix 2009-01-03 22:24:56 +00:00
Christophe Dumez
7037b53ff8 - Another HTTP proxy fix 2009-01-03 22:20:57 +00:00
Christophe Dumez
adc72fb9a6 - Bump to rc6 2009-01-03 20:50:48 +00:00
Christophe Dumez
f0ca99ed6c - Fixed default state for UPnP/nat-pmp/lsd (DHT was fixed in previous commit already) 2009-01-03 20:45:07 +00:00
Christophe Dumez
e443aa75b7 - Quick fix for #313549 2009-01-03 20:33:38 +00:00
Christophe Dumez
282d0a4af6 - Save fastresume fata when pausing torrents to speed up qBittorrent shutdown 2009-01-03 20:06:46 +00:00
Christophe Dumez
25adf6b061 - Added a workaround fix for a bug in libtorrent regarding set_priority_up() function 2009-01-03 19:47:03 +00:00
Christophe Dumez
88f0ffe86d - Fixed column sorting restoring on startup 2009-01-03 19:34:09 +00:00
Christophe Dumez
c786c42bb1 - Fix for HTTP Proxy settings 2009-01-03 19:23:33 +00:00
Christophe Dumez
36bc2e96ba - Bump to rc5 2008-12-30 11:52:46 +00:00
Christophe Dumez
f9bf485ed7 - Forgot to consider allocating state in WebUI 2008-12-30 11:52:22 +00:00
Christophe Dumez
c18103539c - Display progress using progress bars in Web UI 2008-12-30 11:23:18 +00:00
Christophe Dumez
727f59f73f - Fix compilation warning 2008-12-30 09:02:06 +00:00
Christophe Dumez
5d2d1dfa94 - Compilation fix for MinGW 2008-12-30 08:57:23 +00:00
Christophe Dumez
cf694d14f3 - Updated Korean translation 2008-12-30 08:48:29 +00:00
Christophe Dumez
ec24fe2f49 - No longer force plastiqueStyle as a default (closes #312333) 2008-12-30 02:17:46 +00:00
Christophe Dumez
a0b4e54410 - Got rid of .paused files, useless with new libtorrent 2008-12-30 00:34:41 +00:00
Christophe Dumez
c97bce4d61 - Removed workaround for getting progress of paused torrents, apparently it works 2008-12-30 00:11:20 +00:00
Christophe Dumez
afbfe1a96d - Hide priority column in Web UI when queueing is disabled 2008-12-29 23:04:45 +00:00
Christophe Dumez
2651ec5f0b - Forgot to hide decrease Priority button when disabling queueing 2008-12-29 23:00:13 +00:00
Christophe Dumez
330905da5e - Added priority actions in Web UI 2008-12-29 22:46:18 +00:00
Christophe Dumez
4c6359276c - Fixed progress display of uncheck torrents 2008-12-29 22:09:39 +00:00
Christophe Dumez
ff1fc527e0 - Made some text bigger in options 2008-12-29 21:47:22 +00:00
Christophe Dumez
d79cb6b66e - French translation fix 2008-12-29 21:46:29 +00:00
Christophe Dumez
0ac2554060 - qBittorrent shutdown is now way faster 2008-12-29 21:22:26 +00:00
Christophe Dumez
1d31e049a4 - Fixed possible deadlock when saving fastresume data 2008-12-29 21:10:31 +00:00
Christophe Dumez
d5a4794610 - Fixed priority display for paused torrents 2008-12-29 20:06:08 +00:00
Christophe Dumez
29886acc01 - Putting back priority buttons in toolBar 2008-12-29 20:01:03 +00:00
Christophe Dumez
f1ed7f06b9 - Removed a function that is no longer used 2008-12-29 18:40:10 +00:00
Christophe Dumez
a848538d66 - Pause / resume in Web UI now updates the GUI
- Code cleanup
2008-12-29 18:36:54 +00:00
Christophe Dumez
b58046b1fc - Use QPlastiqueStyle as a default 2008-12-29 11:31:57 +00:00
Christophe Dumez
fe95e90e05 - Updated Changelog 2008-12-28 21:16:17 +00:00
Christophe Dumez
1544300616 - Allow to delete permanently from WebUI 2008-12-28 21:12:49 +00:00
Christophe Dumez
028041f874 - Updated Czech translation 2008-12-28 09:58:15 +00:00
Christophe Dumez
81f2d7ee4a - Cleaned up src.pro
- Removed some debug
2008-12-28 01:17:57 +00:00
Christophe Dumez
66874fbd2f - This is not needed because a showEvent is raised anyway 2008-12-27 22:40:23 +00:00
Christophe Dumez
f47b3be0be - Removed -O0 compil flag 2008-12-27 22:35:45 +00:00
Christophe Dumez
87eee7029d - Force lists refresh before initially displaying the window to avoid lag
- Removed session tweaking on exit since it does not have any effect
2008-12-27 22:29:37 +00:00
Christophe Dumez
713c80451e - Bump to rc3 2008-12-27 21:34:28 +00:00
Christophe Dumez
60889cac79 - Catch exceptions on torrent aditions to avoid crashing because of a bad torrent (that is correctly loaded by torrent_info for some reason) 2008-12-27 21:25:58 +00:00
Christophe Dumez
d398679c7e - Forgot to add this line back 2008-12-27 20:58:30 +00:00
Christophe Dumez
2e5330e54b - Removed code that is no longer needed 2008-12-27 20:35:25 +00:00
Christophe Dumez
1499138b9b - Fix to avoid crash when loading a path that does not exist 2008-12-27 20:30:19 +00:00
Christophe Dumez
2433a87445 - Bump to rc2 2008-12-27 17:55:46 +00:00
Christophe Dumez
d0de11909f - Translations fix due to latest change 2008-12-27 17:55:07 +00:00
Christophe Dumez
3f5340523f - Fix for queueing system 2008-12-27 17:44:33 +00:00
Christophe Dumez
cc5015773b - Should fix queueing system 2008-12-27 17:23:49 +00:00
Christophe Dumez
cd260198f9 - Fixed remembering of paused torrents cleanly 2008-12-27 17:05:26 +00:00
Christophe Dumez
71e3061c18 - Remember paused torrents on startup 2008-12-27 13:04:06 +00:00
Christophe Dumez
6369401150 - Fixed assert hit in new FSWatcher code 2008-12-27 12:12:13 +00:00
Christophe Dumez
fa05441e74 - A little list refresh optimizing 2008-12-27 10:29:44 +00:00
Christophe Dumez
81aac9ebcc - Fixed pause/resume actions in Web UI 2008-12-27 10:14:16 +00:00
Christophe Dumez
7a1af536b6 - Fixed start action 2008-12-27 10:07:03 +00:00
Christophe Dumez
45efcfce13 - Save session data and fast resume data sooner on exit (in case) 2008-12-27 10:02:42 +00:00
Christophe Dumez
cddc3a0a43 - Remove useless signals 2008-12-27 09:47:31 +00:00
Christophe Dumez
c38a8a2bec - Removed code that is no longer needed 2008-12-27 09:40:21 +00:00
Christophe Dumez
1225d16413 - Removed code that is no longer needed 2008-12-27 09:21:09 +00:00
Christophe Dumez
384f3b23ee - Made seed detection a bit safer (do not use progress) 2008-12-27 09:10:07 +00:00
Christophe Dumez
a3cfa6bba1 - Fixed torrents moving back from finished list to download list (without recheck) 2008-12-26 22:30:23 +00:00
Christophe Dumez
51638eddcc - Some more signal/slot fixing 2008-12-26 22:17:02 +00:00
Christophe Dumez
41c6a847b9 - some more signal / slot fixing 2008-12-26 22:11:40 +00:00
Christophe Dumez
d57062a45a - Fixed broken action "start All / Pause all" due to latest code changes 2008-12-26 22:02:01 +00:00
Christophe Dumez
32f478a8c2 - Removed some useless code due to latest changes 2008-12-26 21:59:54 +00:00
Christophe Dumez
61dae1444b - Code optimization for torrent moving back to download list detection 2008-12-26 21:49:13 +00:00
Christophe Dumez
8ed40cc856 - Do not refresh lists when window is not visible (save cpu)
- Force list refresh on show Event to avoid lag before next UpdateList() timer call
2008-12-26 21:41:09 +00:00
Christophe Dumez
941b8c8d2a - Fixed torrent completed message (was not displayed due to last commit) 2008-12-26 21:26:06 +00:00
Christophe Dumez
4f2a2dfab9 - Huge code refactoring (qBittorrent no longer store torrents and access them using libtorrent API) 2008-12-26 21:18:33 +00:00
Christophe Dumez
4a6ab376af - Workaround for is_seed bug: http://code.rasterbar.com/libtorrent/ticket/402 2008-12-26 19:14:19 +00:00
Christophe Dumez
1e37858cc4 - Reset torrent display once it is queued 2008-12-26 18:57:16 +00:00
Christophe Dumez
668268b6b5 - A little downloadThread aborting improvement 2008-12-26 16:43:55 +00:00
Christophe Dumez
cfcd9b7eaf - Fixed memory leak introduced in last commit 2008-12-26 16:27:52 +00:00
Christophe Dumez
6a3dddd0cc Catch SIGTERM to exit cleanly (e.g. computer shutdown) 2008-12-26 16:23:53 +00:00
Christophe Dumez
dfb2046f82 - Fixed icon for seeding torrents (paused or queued) in Web UI 2008-12-26 15:48:07 +00:00
Christophe Dumez
3ae55b6a6f - Fixed typo 2008-12-26 13:49:45 +00:00
Christophe Dumez
7e53d23e33 - Added some debug output on exit 2008-12-26 13:44:39 +00:00
Christophe Dumez
ce2294ee96 - Made session deletion a bit faster
- Fixed possible memory leak when folder scanning is enabled
2008-12-26 13:39:11 +00:00
Christophe Dumez
14646d0f9e Rewrote folder scanning code (Now uses a filesystem watcher) 2008-12-26 13:17:08 +00:00
Christophe Dumez
717a4b00e1 - Fixed piratebay plugin 2008-12-25 19:12:36 +00:00
Christophe Dumez
fca3b66a25 - Rewrote isohunt plugin which was broken 2008-12-25 18:56:04 +00:00
Christophe Dumez
1a861ef240 - Fixed BTJunkie plugin 2008-12-25 17:40:37 +00:00
Christophe Dumez
1590d9a98f - Updated Changelog 2008-12-25 16:22:46 +00:00
Christophe Dumez
112bcd7255 - Add notification in WebUI when qBittorrent is unreachable 2008-12-25 16:20:30 +00:00
Christophe Dumez
af29228cc9 - Updated Chinese (simplified) translation 2008-12-25 16:06:34 +00:00
Christophe Dumez
b8c79e0b5f - Simplified and optimized json code 2008-12-25 14:33:37 +00:00
Christophe Dumez
0d078f660a - fixed seed detection in eventmanager + code is simpler 2008-12-25 13:48:23 +00:00
Christophe Dumez
e7f89f256a - Updated slovak translation 2008-12-24 16:26:45 +00:00
Christophe Dumez
cb693a0795 - Removed outdated comment 2008-12-24 15:06:58 +00:00
Christophe Dumez
7b57345c4f - Fixed stylesheet warning in console on startup 2008-12-24 15:05:45 +00:00
Christophe Dumez
90879386d5 - Fixed Qt4 warning when deleting options 2008-12-24 14:53:40 +00:00
Christophe Dumez
3678aa4d23 - bump to rc1
- Updated TODO
- Fix for toolBar spacing
- A little code cleanup
2008-12-24 14:41:16 +00:00
Christophe Dumez
e497789ec7 - WebUI is now working for IE7 2008-12-24 11:28:02 +00:00
Christophe Dumez
2134d404a5 - Updated version to v1.3 (WebUI) 2008-12-24 10:05:09 +00:00
Christophe Dumez
e0707f6907 - Simplified page structure 2008-12-24 09:59:06 +00:00
Christophe Dumez
816f35cbab - Ported WebUI to MochaUI 0.9.5 2008-12-23 23:47:30 +00:00
Christophe Dumez
a73d3132df - Removed some useless debug
- Increased httpserver update interval
2008-12-23 16:50:46 +00:00
Christophe Dumez
368c122dce - Queueing system fix 2008-12-23 16:27:47 +00:00
Christophe Dumez
c41d17043c - Fixed another memory leak in torrent addition dialog 2008-12-23 15:51:32 +00:00
Christophe Dumez
3c17a1410b - Fixed memory leak in torrent addition dialog 2008-12-23 15:07:29 +00:00
Christophe Dumez
078110851d - Oops typo 2008-12-23 14:58:38 +00:00
Christophe Dumez
70725bdfe2 - Fixed memory leak in RSS parser 2008-12-23 14:56:17 +00:00
Christophe Dumez
3c0a610a34 - Fixed includes 2008-12-23 14:41:14 +00:00
Christophe Dumez
d5b74eecd0 - Updated french translation 2008-12-23 13:51:08 +00:00
Christophe Dumez
1faf183c73 - Updated some translations 2008-12-23 12:59:47 +00:00
Christophe Dumez
a1773a7cfd - Updated language files 2008-12-20 19:41:08 +00:00
Christophe Dumez
1af3515b00 - Updated splashscreen
- bump to beta
2008-12-15 19:28:09 +00:00
Christophe Dumez
70e2a5d3b3 - Fixed compilation warning in main.cpp
- Removed use of Qt3 backport headers in ico.cpp
2008-12-15 19:24:10 +00:00
Christophe Dumez
78409570a9 - Fixed crash when dht_state is missing 2008-12-15 17:28:05 +00:00
Christophe Dumez
5133931302 - Another patch by Attila to fix mingw32 compilation 2008-12-12 09:20:47 +00:00
Christophe Dumez
8326cebf5c - Fix for compiling with mingw32 (By Attila Olah) 2008-12-11 20:49:21 +00:00
Christophe Dumez
ab46f11af2 - Added name name of new turkish translator to about dialog 2008-11-28 14:30:07 +00:00
Christophe Dumez
91acb1a6ec Updated turkish translation 2008-11-28 14:27:56 +00:00
Christophe Dumez
c721fad54b - Fixed ratio column sorting 2008-11-22 14:05:22 +00:00
Christophe Dumez
2aea2a0032 - got rid of libMagick++ dependency 2008-11-04 22:39:43 +00:00
Christophe Dumez
3164337c3c - Some more cleanup 2008-11-04 19:14:51 +00:00
Christophe Dumez
b984c309ff - removed no longer needed pointer
- made use of QPointer instead of c++ pointer
2008-11-04 19:01:51 +00:00
Christophe Dumez
cfbd06225b - Removed priority buttons from toolBar since it only affects download list now 2008-11-02 20:42:02 +00:00
Christophe Dumez
b0a0abd764 Allow to change the save path of torrents after addition 2008-11-02 19:55:55 +00:00
Christophe Dumez
9618056b4e - Added support for 2 new extensions (uTorrent metadata and smart ban plugin)
- Removed option to disable uTorrent Peer eXchange (PeX) -> always ON
2008-11-02 19:22:10 +00:00
Christophe Dumez
8b40e43432 should speed up startup 2008-11-02 18:19:14 +00:00
Christophe Dumez
01bc15d3f4 - Allow to force rechecking torrents 2008-11-02 13:53:45 +00:00
Christophe Dumez
3282e1bcc9 - Save and load session state to remember it over different sessions 2008-11-02 13:19:27 +00:00
Christophe Dumez
e5b6a5605a - ETA calculation now relies on average speed over all sessions
- New ETA calculation system saves memory
- Updated Changelog
2008-11-02 13:07:38 +00:00
Christophe Dumez
9b67807926 - Queueing system should work fine now (port is complete, needs testing) 2008-11-02 11:43:20 +00:00
Christophe Dumez
f3729fbae6 - Use libtorrent queueing system (probably buggy and queueing currently does not work for seeds) 2008-11-02 10:47:59 +00:00
Christophe Dumez
0538c9c3e8 - Removed some debug 2008-11-02 09:30:35 +00:00
Christophe Dumez
53a0e85b8d - Do not save fastresume data for checking torrents 2008-11-02 00:04:38 +00:00
Christophe Dumez
453dd93abf - Should fix fastresume data code 2008-11-01 23:58:53 +00:00
Christophe Dumez
669cc2395a - Updated changelog 2008-11-01 22:09:09 +00:00
Christophe Dumez
82706141cf Ratio calculation improvement: make usage of new all_time_upload and all_time_download variables in torrent_status. 2008-11-01 22:07:14 +00:00
Christophe Dumez
c536f24d55 - Changed default icon from connecting to stalled since connecting state no longer exists 2008-11-01 21:45:30 +00:00
Christophe Dumez
764b4e72ca - rough port to libtorrent v0.14.0. This is probably buggy but it compiles without warnings 2008-11-01 21:42:56 +00:00
Christophe Dumez
19dd21062b - trunk will now be of v1.3.0 2008-11-01 12:50:07 +00:00
124 changed files with 18569 additions and 14768 deletions

View File

@@ -6,6 +6,11 @@ Contributors:
* Ishan Arora <ishan@qbittorrent.org>
* Grigis Gaëtan <cipher16@gmail.com>
Code from other projects:
* files src/ico.cpp src/ico.h
copyright: Malte Starostik <malte@kde.org>
license: LGPL
Images Authors:
* files: src/Icons/*.png
copyright: Gnome Icon Theme

View File

@@ -1,5 +1,37 @@
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.2.1
* Fri Jan 9 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.0
- FEATURE: Based on libtorrent-rasterbar v0.14.2
- FEATURE: Improved ratio calculation system
- FEATURE: Torrent creation code cleanup
- FEATURE: Allow to set maximum number of active seeds (queueing)
- FEATURE: Now seeds priorities are handled automatically by libtorrent-rasterbar (queueing)
- FEATURE: Code cleanup and optimization (save memory and cpu)
- FEATURE: ETA calculation now relies on average speed over all sessions
- FEATURE: Allow to force rechecking torrents
- FEATURE: Added support for 2 new extensions (uTorrent metadata and smart ban plugin)
- FEATURE: Allow to change the save path of torrents after addition
- FEATURE: Got rid of libmagick++ dependency
- FEATURE: Updated Web interface to MochaUI v0.9.5
- FEATURE: Added notification in WebUI when qBittorrent is not reachable
- FEATURE: Rewrote folder scanning code (Now uses a filesystem watcher)
- FEATURE: Added torrent deletion from hard drive function in Web UI
- FEATURE: Added queueing priority actions in Web UI
- FEATURE: Display progress using progress bars in Web UI
- BUGFIX: Made usage of fastresume data more reliable
- BUGFIX: qBittorrent shutdown is now faster
- BUGFIX: Fixed several memory leaks
- BUGFIX: WebUI is now working with IE7
- BUGFIX: Fixed spacing problem in toolbar when toggling its visibility
- BUGFIX: Fixed some compilation and Qt4 warnings
- BUGFIX: Do not use an addition dialog for torrents from folder scanning
- BUGFIX: Catch SIGTERM to exit cleanly (e.g. computer shutdown)
- BUGFIX: Improved proxy support code
- BUGFIX: Fixed systray icon tooltip on Windows
- BUGFIX: Proxy settings are now saved even if disabled
* Sun Nov 9 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.2.1
- BUGFIX: Fixed possible crash when deleting a torrent permanently
- BUGFIX: Queued_for_checking torrents were not displayed as checking in seeding list
- BUGFIX: Speed up startup time when having a lot of torrents
* Wed Oct 29th 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.2.0
- FEATURE: Torrent queueing system (with priorities)

View File

@@ -17,7 +17,7 @@ Dependencies:
- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
Qt >= 4.4.0 is advised
- libtorrent-rasterbar by Arvid Norberg (>= v0.13.1 REQUIRED)
- libtorrent-rasterbar by Arvid Norberg (>= v0.14.0 REQUIRED)
-> http://www.qbittorrent.org/download.php (advised)
-> http://www.libtorrent.net
Be careful: another library (the one used by rTorrent) uses a similar name.

28
TODO
View File

@@ -1,18 +1,18 @@
See https://blueprints.launchpad.net/qbittorrent/
// translations done
- french
- chinese traditional
- chinese simplified
- finish
- swedish
- slovak
- German
- Hungarian
- Italian
- Dutch
// translations done in v1.3.0
- Romanian
- Korean
- Russian
- Bulgarian
- Greek
- Hungarian
- German
- Chinese (traditional)
- Chinese (simplified)
- Italian
- Swedish
- Turkish
- French
- Slovak
- Czech
- Korean
- Portuguese
- Brazilian

113
configure vendored
View File

@@ -26,9 +26,6 @@ Dependency options:
--with-libboost-inc=[path] Path to libboost include files
--with-libcurl-inc=[path] Path to libcurl include files
--with-libcurl-lib=[path] Path to libcurl library files
--disable-libmagick Disable use of libmagick
--with-libmagick-inc=[path] Path to libmagick++ include files
--with-libmagick-lib=[path] Path to libmagick++ library files
--disable-libzzip Disable use of libzzip
--with-libzzip-inc=[path] Path to libzzip++ include files
--with-libzzip-lib=[path] Path to libzzip++ library files
@@ -178,21 +175,6 @@ while [ $# -gt 0 ]; do
shift
;;
--disable-libmagick)
QC_DISABLE_libmagick="Y"
shift
;;
--with-libmagick-inc=*)
QC_WITH_LIBMAGICK_INC=$optarg
shift
;;
--with-libmagick-lib=*)
QC_WITH_LIBMAGICK_LIB=$optarg
shift
;;
--disable-libzzip)
QC_DISABLE_libzzip="Y"
shift
@@ -235,9 +217,6 @@ echo QC_WITH_LIBTORRENT_STATIC_LIB=$QC_WITH_LIBTORRENT_STATIC_LIB
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC
echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB
echo QC_DISABLE_libmagick=$QC_DISABLE_libmagick
echo QC_WITH_LIBMAGICK_INC=$QC_WITH_LIBMAGICK_INC
echo QC_WITH_LIBMAGICK_LIB=$QC_WITH_LIBMAGICK_LIB
echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip
echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC
echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB
@@ -376,13 +355,13 @@ class qc_libtorrent_rasterbar : public ConfObj
{
public:
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
QString name() const { return "libtorrent-rasterbar >= 0.13"; }
QString name() const { return "libtorrent-rasterbar >= 0.14"; }
QString shortname() const { return "libtorrent-rasterbar"; }
bool exec(){
QString s;
s = conf->getenv("QC_WITH_LIBTORRENT_INC");
if(!s.isEmpty()) {
if(!conf->checkHeader(s, "libtorrent/lsd.hpp")) {
if(!conf->checkHeader(s, "libtorrent/magnet_uri.hpp")) {
return false;
}
}else{
@@ -391,7 +370,7 @@ public:
sl << "/usr/local/include";
bool found = false;
foreach(s, sl){
if(conf->checkHeader(s, "libtorrent/lsd.hpp")){
if(conf->checkHeader(s, "libtorrent/magnet_uri.hpp")){
found = true;
break;
}
@@ -553,86 +532,6 @@ public:
return true;
}
};
#line 1 "libmagick.qcm"
/*
-----BEGIN QCMOD-----
name: libmagick
arg: with-libmagick-inc=[path], Path to libmagick++ include files
arg: with-libmagick-lib=[path], Path to libmagick++ library files
-----END QCMOD-----
*/
#include <QProcess>
class qc_libmagick : public ConfObj
{
public:
qc_libmagick(Conf *c) : ConfObj(c) {}
QString name() const { return "ImageMagick library (libmagick++)"; }
QString shortname() const { return "libmagick++"; }
QString checkString() const {
if(!conf->getenv("QC_DISABLE_libmagick").isEmpty())
return "";
return ConfObj::checkString();
}
bool exec(){
if(!conf->getenv("QC_DISABLE_libmagick").isEmpty())
return false;
QString s;
s = conf->getenv("QC_WITH_LIBMAGICK_INC");
if(!s.isEmpty()) {
if(!conf->checkHeader(s, "Magick++.h")) {
return false;
}
}else{
QStringList sl;
sl << "/usr/include";
sl << "/usr/local/include";
bool found = false;
foreach(s, sl){
if(conf->checkHeader(s, "Magick++.h")){
found = true;
break;
}
}
if(!found)
return false;
}
conf->addIncludePath(s);
s = conf->getenv("QC_WITH_LIBMAGICK_LIB");
if(!s.isEmpty()) {
if(!conf->checkLibrary(s, "Magick++")) {
return false;
}
}else{
QStringList sl;
sl << "/usr/lib/";
sl << "/usr/lib64/";
sl << "/usr/local/lib/";
sl << "/usr/local/lib64/";
bool found = false;
foreach(s, sl){
if(conf->checkLibrary(s, "Magick++")) {
found = true;
break;
}
}
if(!found)
return false;
}
conf->addLib(QString("-L") + s);
QProcess magickConfig;
QStringList params;
params << "--libs";
magickConfig.start("Magick++-config", params, QIODevice::ReadOnly);
magickConfig.waitForStarted();
magickConfig.waitForFinished();
QByteArray result = magickConfig.readAll();
result = result.replace("\n", "");
conf->addLib(result.data());
conf->addDefine("HAVE_MAGICK");
return true;
}
};
#line 1 "libzzip.qcm"
/*
-----BEGIN QCMOD-----
@@ -720,9 +619,6 @@ cat >$1/modules_new.cpp <<EOT
o = new qc_libcurl(conf);
o->required = true;
o->disabled = false;
o = new qc_libmagick(conf);
o->required = false;
o->disabled = false;
o = new qc_libzzip(conf);
o->required = false;
o->disabled = false;
@@ -1677,9 +1573,6 @@ export QC_WITH_LIBTORRENT_STATIC_LIB
export QC_WITH_LIBBOOST_INC
export QC_WITH_LIBCURL_INC
export QC_WITH_LIBCURL_LIB
export QC_DISABLE_libmagick
export QC_WITH_LIBMAGICK_INC
export QC_WITH_LIBMAGICK_LIB
export QC_DISABLE_libzzip
export QC_WITH_LIBZZIP_INC
export QC_WITH_LIBZZIP_LIB

View File

@@ -15,6 +15,5 @@
<dep type='libcurl'>
<required/>
</dep>
<dep type='libmagick'/>
<dep type='libzzip'/>
</qconf>

View File

@@ -10,13 +10,13 @@ class qc_libtorrent_rasterbar : public ConfObj
{
public:
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
QString name() const { return "libtorrent-rasterbar >= 0.13"; }
QString name() const { return "libtorrent-rasterbar >= 0.14"; }
QString shortname() const { return "libtorrent-rasterbar"; }
bool exec(){
QString s;
s = conf->getenv("QC_WITH_LIBTORRENT_INC");
if(!s.isEmpty()) {
if(!conf->checkHeader(s, "libtorrent/lsd.hpp")) {
if(!conf->checkHeader(s, "libtorrent/magnet_uri.hpp")) {
return false;
}
}else{
@@ -25,7 +25,7 @@ public:
sl << "/usr/local/include";
bool found = false;
foreach(s, sl){
if(conf->checkHeader(s, "libtorrent/lsd.hpp")){
if(conf->checkHeader(s, "libtorrent/magnet_uri.hpp")){
found = true;
break;
}

View File

@@ -37,8 +37,7 @@
#define F_UPSPEED 2
#define F_LEECH 3
#define F_RATIO 4
#define F_PRIORITY 5
#define F_HASH 6
#define F_HASH 5
class FinishedListDelegate: public QItemDelegate {
Q_OBJECT

View File

@@ -37,18 +37,14 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
setupUi(this);
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), this, SLOT(torrentAdded(QTorrentHandle&)));
finishedListModel = new QStandardItemModel(0,7);
finishedListModel = new QStandardItemModel(0,6);
finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
finishedListModel->setHeaderData(F_UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed"));
finishedListModel->setHeaderData(F_LEECH, Qt::Horizontal, tr("Leechers", "i.e: full/partial sources"));
finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio"));
finishedListModel->setHeaderData(F_PRIORITY, Qt::Horizontal, tr("Priority"));
finishedList->setModel(finishedListModel);
loadHiddenColumns();
// Hide priority column
finishedList->hideColumn(F_PRIORITY);
// Hide hash column
finishedList->hideColumn(F_HASH);
// Load last columns width for download list
@@ -65,7 +61,6 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu);
connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&)));
connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&)));
connect(BTSession, SIGNAL(forceFinishedListUpdate()), this, SLOT(updateFinishedList()));
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")));
actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png")));
@@ -74,20 +69,18 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered()));
connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered()));
connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered()));
connect(actionIncreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionIncreasePriority_triggered()));
connect(actionDecreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDecreasePriority_triggered()));
connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered()));
connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered()));
connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder()));
connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage()));
connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection()));
connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck()));
connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName()));
connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize()));
connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed()));
connect(actionHOSColLeechers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnLeechers()));
connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio()));
connect(actionHOSColPriority, SIGNAL(triggered()), this, SLOT(hideOrShowColumnPriority()));
}
FinishedTorrents::~FinishedTorrents(){
@@ -103,18 +96,7 @@ void FinishedTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) {
emit torrentDoubleClicked(hash, true);
}
void FinishedTorrents::hidePriorityColumn(bool hide) {
finishedList->setColumnHidden(F_PRIORITY, hide);
if(hide)
getActionHoSCol(F_PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png")));
else
getActionHoSCol(F_PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png")));
}
void FinishedTorrents::addTorrent(QString hash){
if(!BTSession->isFinished(hash)){
BTSession->setFinishedTorrent(hash);
}
int row = getRowFromHash(hash);
if(row != -1) return;
row = finishedListModel->rowCount();
@@ -126,8 +108,6 @@ void FinishedTorrents::addTorrent(QString hash){
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.));
finishedListModel->setData(finishedListModel->index(row, F_LEECH), QVariant("0"));
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(QString::fromUtf8(misc::toString(BTSession->getRealRatio(hash)).c_str())));
if(BTSession->isQueueingEnabled())
finishedListModel->setData(finishedListModel->index(row, F_PRIORITY), QVariant((int)BTSession->getUpTorrentPriority(hash)));
finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash));
if(h.is_paused()) {
finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole);
@@ -139,16 +119,10 @@ void FinishedTorrents::addTorrent(QString hash){
// Update the number of finished torrents
++nbFinished;
emit finishedTorrentsNumberChanged(nbFinished);
// Sort List
sortFinishedList();
}
void FinishedTorrents::torrentAdded(QTorrentHandle& h) {
QString hash = h.hash();
if(BTSession->isFinished(hash)) {
addTorrent(hash);
}
}
// Set the color of a row in data model
void FinishedTorrents::setRowColor(int row, QString color){
unsigned int nbColumns = finishedListModel->columnCount()-1;
@@ -255,15 +229,8 @@ void FinishedTorrents::on_actionSet_upload_limit_triggered(){
new BandwidthAllocationDialog(this, true, BTSession, hashes);
}
void FinishedTorrents::updateFinishedList(){
QString hash;
QStringList finishedSHAs = BTSession->getFinishedTorrents();
foreach(hash, finishedSHAs){
QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(!h.is_valid()){
qDebug("Problem: This torrent is not valid in finished list");
continue;
}
void FinishedTorrents::updateTorrent(QTorrentHandle h) {
QString hash = h.hash();
int row = getRowFromHash(hash);
if(row == -1){
qDebug("Cannot find torrent in finished list, adding it");
@@ -271,34 +238,24 @@ void FinishedTorrents::updateFinishedList(){
row = getRowFromHash(hash);
}
Q_ASSERT(row != -1);
// Update priority
if(BTSession->isQueueingEnabled()) {
finishedListModel->setData(finishedListModel->index(row, F_PRIORITY), QVariant((int)BTSession->getUpTorrentPriority(hash)));
if(h.is_paused() && BTSession->isUploadQueued(hash)) {
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole);
if(h.is_paused()) return;
// Update queued torrent
if(BTSession->isQueueingEnabled() && h.is_queued()) {
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
} else {
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole);
}
// Reset upload speed and seeds/leech
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), 0.);
finishedListModel->setData(finishedListModel->index(row, F_LEECH), "0");
setRowColor(row, QString::fromUtf8("grey"));
}
return;
}
if(h.is_paused()) continue;
if(h.state() == torrent_status::downloading || (h.state() != torrent_status::checking_files && h.state() != torrent_status::queued_for_checking && h.progress() < 1.)) {
// What are you doing here? go back to download tab!
int reponse = QMessageBox::question(this, tr("Incomplete torrent in seeding list"), tr("It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted)").arg(h.name()), QMessageBox::Yes | QMessageBox::No);
if (reponse == QMessageBox::Yes) {
qDebug("Info: a torrent was moved from finished to download tab");
deleteTorrent(hash);
BTSession->setUnfinishedTorrent(hash);
emit torrentMovedFromFinishedList(hash);
}
else if (reponse == QMessageBox::No) {
qDebug("Deleted from the finished");
BTSession->deleteTorrent(hash, false);
}
continue;
}
if(h.state() == torrent_status::checking_files){
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
setRowColor(row, QString::fromUtf8("grey"));
continue;
return;
}
setRowColor(row, QString::fromUtf8("orange"));
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole);
@@ -311,7 +268,6 @@ void FinishedTorrents::updateFinishedList(){
if(!finishedList->isColumnHidden(F_RATIO)) {
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash))));
}
}
}
int FinishedTorrents::getRowFromHash(QString hash) const{
@@ -335,13 +291,6 @@ void FinishedTorrents::pauseTorrent(QString hash) {
setRowColor(row, QString::fromUtf8("red"));
}
void FinishedTorrents::resumeTorrent(QString hash) {
int row = getRowFromHash(hash);
Q_ASSERT(row != -1);
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole);
setRowColor(row, QString::fromUtf8("orange"));
}
QString FinishedTorrents::getHashFromRow(unsigned int row) const {
Q_ASSERT(row < (unsigned int)finishedListModel->rowCount());
return finishedListModel->data(finishedListModel->index(row, F_HASH)).toString();
@@ -389,6 +338,18 @@ void FinishedTorrents::propertiesSelection(){
}
}
void FinishedTorrents::forceRecheck(){
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
QModelIndex index;
foreach(index, selectedIndexes){
if(index.column() == F_NAME){
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
QTorrentHandle h = BTSession->getTorrentHandle(hash);
h.force_recheck();
}
}
}
void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
QMenu myFinishedListMenu(this);
QModelIndex index;
@@ -426,13 +387,10 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionSet_upload_limit);
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionForce_recheck);
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionOpen_destination_folder);
myFinishedListMenu.addAction(actionTorrent_Properties);
if(BTSession->isQueueingEnabled()) {
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionIncreasePriority);
myFinishedListMenu.addAction(actionDecreasePriority);
}
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionBuy_it);
@@ -450,12 +408,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){
QMenu hideshowColumn(this);
hideshowColumn.setTitle(tr("Hide or Show Column"));
int lastCol;
if(BTSession->isQueueingEnabled()) {
lastCol = F_PRIORITY;
} else {
lastCol = F_RATIO;
}
int lastCol = F_RATIO;
for(int i=0; i<=lastCol; i++) {
hideshowColumn.addAction(getActionHoSCol(i));
}
@@ -514,10 +467,6 @@ void FinishedTorrents::hideOrShowColumnRatio() {
hideOrShowColumn(F_RATIO);
}
void FinishedTorrents::hideOrShowColumnPriority() {
hideOrShowColumn(F_PRIORITY);
}
// load the previous settings, and hide the columns
bool FinishedTorrents::loadHiddenColumns() {
bool loaded = false;
@@ -579,9 +528,6 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
case F_RATIO :
return actionHOSColRatio;
break;
case F_PRIORITY :
return actionHOSColPriority;
break;
default :
return NULL;
}
@@ -600,7 +546,7 @@ void FinishedTorrents::toggleFinishedListSortOrder(int index) {
switch(index) {
case F_SIZE:
case F_UPSPEED:
case F_PRIORITY:
case F_RATIO:
sortFinishedListFloat(index, sortOrder);
break;
default:
@@ -625,7 +571,6 @@ void FinishedTorrents::sortFinishedList(int index, Qt::SortOrder sortOrder){
switch(index) {
case F_SIZE:
case F_UPSPEED:
case F_PRIORITY:
sortFinishedListFloat(index, sortOrder);
break;
default:

View File

@@ -60,13 +60,11 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
void displayFinishedHoSMenu(const QPoint&);
void setRowColor(int row, QString color);
void saveColWidthFinishedList() const;
void loadLastSortedColumn();
void toggleFinishedListSortOrder(int index);
void sortFinishedList(int index=-1, Qt::SortOrder sortOrder=Qt::AscendingOrder);
void sortFinishedListFloat(int index, Qt::SortOrder sortOrder);
void sortFinishedListString(int index, Qt::SortOrder sortOrder);
void updateFileSize(QString hash);
void torrentAdded(QTorrentHandle& h);
void on_actionSet_upload_limit_triggered();
void notifyTorrentDoubleClicked(const QModelIndex& index);
void hideOrShowColumnName();
@@ -74,17 +72,16 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
void hideOrShowColumnUpSpeed();
void hideOrShowColumnLeechers();
void hideOrShowColumnRatio();
void hideOrShowColumnPriority();
void forceRecheck();
public slots:
void addTorrent(QString hash);
void updateFinishedList();
void updateTorrent(QTorrentHandle h);
void pauseTorrent(QString hash);
void resumeTorrent(QString hash);
void propertiesSelection();
void deleteTorrent(QString hash);
void showPropertiesFromHash(QString hash);
void hidePriorityColumn(bool hide);
void loadLastSortedColumn();
signals:
void torrentMovedFromFinishedList(QString);

File diff suppressed because it is too large Load Diff

View File

@@ -64,7 +64,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers;
// GUI related
QTabWidget *tabs;
options_imp *options;
QPointer<options_imp> options;
QSystemTrayIcon *myTrayIcon;
QPointer<QTimer> systrayCreator;
QMenu *myTrayIconMenu;
@@ -128,8 +128,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{
void readSettings();
void on_actionExit_triggered();
void createTrayIcon();
void updateUnfinishedTorrentNumberCalc();
void updateFinishedTorrentNumberCalc();
void updateUnfinishedTorrentNumber(unsigned int nb);
void updateFinishedTorrentNumber(unsigned int nb);
void fullDiskError(QTorrentHandle& h) const;
@@ -158,14 +156,16 @@ class GUI : public QMainWindow, private Ui::MainWindow{
void processParams(const QStringList& params);
void addTorrent(QString path);
void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker);
void processScannedFiles(const QStringList& params);
void processDownloadedFiles(QString path, QString url);
void downloadFromURLList(const QStringList& urls);
void deleteTorrent(QString hash);
void finishedTorrent(QTorrentHandle& h) const;
void updateLists();
void addedTorrent(QTorrentHandle& h) const;
void checkedTorrent(QTorrentHandle& h) const;
void pausedTorrent(QTorrentHandle& h) const;
void resumedTorrent(QTorrentHandle& h) const;
void updateLists(bool force=false);
bool initWebUi(QString username, QString password, int port);
void pauseTorrent(QString hash);
void on_actionIncreasePriority_triggered();
void on_actionDecreasePriority_triggered();
// Options slots
@@ -184,6 +184,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
protected:
void closeEvent(QCloseEvent *);
void showEvent(QShowEvent *);
bool event(QEvent * event);
void displayRSSTab(bool enable);

View File

@@ -1,6 +1,6 @@
[Desktop Entry]
Categories=Qt;Network;P2P
Comment=V1.2.0
Comment=V1.3.0
Exec=qbittorrent %f
GenericName=Bittorrent client
GenericName[bg]=Торент клиент

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -76,7 +76,7 @@ class about : public QDialog, private Ui::AboutDlg{
- <u>Slovak:</u> helix84<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> Erdem Bingöl (erdem84@gmail.com)<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)<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"));

View File

@@ -172,27 +172,27 @@ class arborescence {
torrent_file *root;
public:
arborescence(torrent_info t) {
torrent_info::file_iterator fi = t.begin_files();
if(t.num_files() > 1) {
root = new torrent_file(0, misc::toQString(t.name()), true);
arborescence(boost::intrusive_ptr<torrent_info> t) {
torrent_info::file_iterator fi = t->begin_files();
if(t->num_files() > 1) {
root = new torrent_file(0, misc::toQString(t->name()), true);
} else {
// XXX: Will crash if there is no file in torrent
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0);
root = new torrent_file(0, misc::toQString(t->name()), false, fi->size, 0);
return;
}
int i = 0;
while(fi != t.end_files()) {
while(fi != t->end_files()) {
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
addFile(path, fi->size, i);
fi++;
++i;
}
qDebug("real size: %ld, tree size: %ld", (long)t.total_size(), (long)root->getSize());
Q_ASSERT(root->getSize() == t.total_size());
qDebug("real size: %ld, tree size: %ld", (long)t->total_size(), (long)root->getSize());
Q_ASSERT(root->getSize() == t->total_size());
}
arborescence(torrent_info t, std::vector<float> fp, int *prioritiesTab) {
arborescence(torrent_info const& t, std::vector<size_type> fp, int *prioritiesTab) {
torrent_info::file_iterator fi = t.begin_files();
if(t.num_files() > 1) {
qDebug("More than one file in the torrent, setting a folder as root");
@@ -200,13 +200,13 @@ class arborescence {
} else {
// XXX: Will crash if there is no file in torrent
qDebug("one file in the torrent, setting it as root with index 0");
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, fp[0], prioritiesTab[0]);
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, fp[0]/t.file_at(0).size, prioritiesTab[0]);
return;
}
int i = 0;
while(fi != t.end_files()) {
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
addFile(path, fi->size, i, fp[i], prioritiesTab[i]);
addFile(path, fi->size, i, fp[i]/t.file_at(i).size, prioritiesTab[i]);
fi++;
++i;
}

File diff suppressed because it is too large Load Diff

View File

@@ -22,10 +22,7 @@
#define __BITTORRENT_H__
#include <QHash>
#include <QList>
#include <QPair>
#include <QStringList>
#include <QDateTime>
#include <QApplication>
#include <QPalette>
#include <QPointer>
@@ -37,8 +34,9 @@
using namespace libtorrent;
class downloadThread;
class deleteThread;
class QTimer;
class QFileSystemWatcher;
class QMutex;
class FilterParserThread;
class bittorrent : public QObject {
@@ -46,23 +44,16 @@ class bittorrent : public QObject {
private:
session *s;
QString scan_dir;
QPointer<QTimer> timerScan;
QTimer *timerAlerts;
QTimer *fastResumeSaver;
QPointer<QFileSystemWatcher> FSWatcher;
QMutex* FSMutex;
QPointer<QTimer> timerAlerts;
QPointer<QTimer> BigRatioTimer;
bool DHTEnabled;
downloadThread *downloader;
QPointer<downloadThread> downloader;
QString defaultSavePath;
QHash<QString, QDateTime> TorrentsStartTime;
QHash<QString, size_type> TorrentsStartData;
QHash<QString, QPair<size_type,size_type> > ratioData;
QHash<QString, QHash<QString, QString> > trackersErrors;
QStringList consoleMessages;
QStringList peerBanMessages;
deleteThread *deleter;
QStringList finishedTorrents;
QStringList unfinishedTorrents;
bool preAllocateAll;
bool addInPause;
int maxConnecsPerTorrent;
@@ -73,16 +64,7 @@ class bittorrent : public QObject {
bool LSDEnabled;
QPointer<FilterParserThread> filterParser;
QString filterPath;
int folderScanInterval; // in seconds
bool queueingEnabled;
int maxActiveDownloads;
int maxActiveTorrents;
int currentActiveDownloads;
QStringList *downloadQueue;
QStringList *queuedDownloads;
QStringList *uploadQueue;
QStringList *queuedUploads;
bool calculateETA;
QStringList url_skippingDlg;
protected:
@@ -93,20 +75,16 @@ class bittorrent : public QObject {
bittorrent();
~bittorrent();
QTorrentHandle getTorrentHandle(QString hash) const;
bool isPaused(QString hash) const;
std::vector<torrent_handle> getTorrents() const;
bool isFilePreviewPossible(QString fileHash) const;
bool isDHTEnabled() const;
float getPayloadDownloadRate() const;
float getPayloadUploadRate() const;
session_status getSessionStatus() const;
int getListenPort() const;
qlonglong getETA(QString hash) const;
float getRealRatio(QString hash) const;
session* getSession() const;
QHash<QString, QString> getTrackersErrors(QString hash) const;
QStringList getFinishedTorrents() const;
QStringList getUnfinishedTorrents() const;
bool isFinished(QString hash) const;
bool has_filtered_files(QString hash) const;
unsigned int getFinishedPausedTorrentsNb() const;
unsigned int getUnfinishedPausedTorrentsNb() const;
@@ -115,46 +93,40 @@ class bittorrent : public QObject {
int getUpTorrentPriority(QString hash) const;
int getMaximumActiveDownloads() const;
int getMaximumActiveTorrents() const;
bool isDownloadQueued(QString hash) const;
bool isUploadQueued(QString hash) const;
int loadTorrentPriority(QString hash);
QStringList getConsoleMessages() const;
QStringList getPeerBanMessages() const;
float getUncheckedTorrentProgress(QString hash) const;
qlonglong getETA(QString hash) const;
public slots:
void addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
QTorrentHandle addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
void loadSessionState();
void saveSessionState();
void downloadFromUrl(QString url);
void downloadFromURLList(const QStringList& url_list);
void deleteTorrent(QString hash, bool permanent = false);
bool pauseTorrent(QString hash);
bool resumeTorrent(QString hash);
/* Needed by Web UI */
void pauseAllTorrents();
void resumeAllTorrents();
void pauseTorrent(QString hash);
void resumeTorrent(QString hash);
/* End Web UI */
void saveDHTEntry();
void preAllocateAllFiles(bool b);
void saveFastResumeAndRatioData();
void saveFastResumeAndRatioData(QString hash);
void saveFastResumeData();
void enableDirectoryScanning(QString scan_dir);
void disableDirectoryScanning();
void enablePeerExchange();
void enableIPFilter(QString filter);
void disableIPFilter();
void setQueueingEnabled(bool enable);
void resumeUnfinishedTorrents();
void saveTorrentPriority(QString hash, int prio);
void saveTorrentSpeedLimits(QString hash);
void loadTorrentSpeedLimits(QString hash);
void saveDownloadUploadForTorrent(QString hash);
void loadDownloadUploadForTorrent(QString hash);
void handleDownloadFailure(QString url, QString reason);
void loadWebSeeds(QString fileHash);
void updateDownloadQueue();
void updateUploadQueue();
void increaseDlTorrentPriority(QString hash);
void decreaseDlTorrentPriority(QString hash);
void increaseUpTorrentPriority(QString hash);
void decreaseUpTorrentPriority(QString hash);
void saveTorrentPriority(QString hash, int prio);
void downloadUrlAndSkipDialog(QString);
// Session configuration - Setters
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
@@ -174,23 +146,15 @@ class bittorrent : public QObject {
void loadFilesPriorities(QTorrentHandle& h);
void setDownloadLimit(QString hash, long val);
void setUploadLimit(QString hash, long val);
void setUnfinishedTorrent(QString hash);
void setFinishedTorrent(QString hash);
void enableUPnP(bool b);
void enableNATPMP(bool b);
void enableLSD(bool b);
bool enableDHT(bool b);
void reloadTorrent(const QTorrentHandle &h, bool full_alloc);
void setTimerScanInterval(int secs);
void setMaxActiveDownloads(int val);
void setMaxActiveTorrents(int val);
void setETACalculation(bool enable);
void addConsoleMessage(QString msg, QColor color=QApplication::palette().color(QPalette::WindowText));
void addPeerBanMessage(QString msg, bool from_ipfilter);
void fixTorrentPriorities();
protected slots:
void scanDirectory();
void scanDirectory(QString);
void readAlerts();
void processDownloadedFile(QString, QString);
bool loadTrackerFile(QString hash);
@@ -198,35 +162,18 @@ class bittorrent : public QObject {
void deleteBigRatios();
signals:
//void invalidTorrent(QString path);
//void duplicateTorrent(QString path);
void addedTorrent(QTorrentHandle& h);
void deletedTorrent(QString hash);
void pausedTorrent(QString hash);
void resumedTorrent(QString hash);
void pausedTorrent(QTorrentHandle& h);
void resumedTorrent(QTorrentHandle& h);
void finishedTorrent(QTorrentHandle& h);
void fullDiskError(QTorrentHandle& h);
void trackerError(QString hash, QString time, QString msg);
//void portListeningFailure();
void trackerAuthenticationRequired(QTorrentHandle& h);
void scanDirFoundTorrents(const QStringList& pathList);
void newDownloadedTorrent(QString path, QString url);
//void aboutToDownloadFromUrl(QString url);
void updateFileSize(QString hash);
//void peerBlocked(QString);
void downloadFromUrlFailure(QString url, QString reason);
//void fastResumeDataRejected(QString name);
//void urlSeedProblem(QString url, QString msg);
void torrentFinishedChecking(QString hash);
//void torrent_ratio_deleted(QString fileName);
//void UPnPError(QString msg);
//void UPnPSuccess(QString msg);
void updateFinishedTorrentNumber();
void updateUnfinishedTorrentNumber();
void forceUnfinishedListUpdate();
void forceFinishedListUpdate();
/*void torrentSwitchedtoFinished(QString hash);
void torrentSwitchedtoUnfinished(QString hash);*/
void torrentFinishedChecking(QTorrentHandle& h);
};
#endif

View File

@@ -26,6 +26,7 @@
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/bind.hpp>
#include <libtorrent/entry.hpp>
#include <libtorrent/bencode.hpp>
@@ -34,6 +35,7 @@
#include <libtorrent/storage.hpp>
#include <libtorrent/hasher.hpp>
#include <libtorrent/file_pool.hpp>
#include <libtorrent/create_torrent.hpp>
#include "createtorrent_imp.h"
#include "misc.h"
@@ -41,13 +43,23 @@
using namespace libtorrent;
using namespace boost::filesystem;
// do not include files and folders whose
// name starts with a .
bool file_filter(boost::filesystem::path const& filename)
{
if (filename.leaf()[0] == '.') return false;
std::cerr << filename << std::endl;
return true;
}
createtorrent::createtorrent(QWidget *parent): QDialog(parent){
setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
creatorThread = new torrentCreatorThread();
connect(creatorThread, SIGNAL(creationSuccess(QString, const char*, QString)), this, SLOT(handleCreationSuccess(QString, const char*, QString)));
creatorThread = new torrentCreatorThread(this);
connect(creatorThread, SIGNAL(creationSuccess(QString, const char*)), this, SLOT(handleCreationSuccess(QString, const char*)));
connect(creatorThread, SIGNAL(creationFailure(QString)), this, SLOT(handleCreationFailure(QString)));
connect(creatorThread, SIGNAL(updateProgress(int)), this, SLOT(updateProgressBar(int)));
path::default_name_check(no_check);
show();
}
@@ -126,31 +138,6 @@ void createtorrent::on_addURLSeed_button_clicked(){
}
}
// Subfunction to add files to a torrent_info structure
// Written by Arvid Norberg (libtorrent Author)
void add_files(torrent_info& t, path const& p, path const& l){
using boost::filesystem::path;
using boost::filesystem::directory_iterator;
#if BOOST_VERSION < 103600
std::string const& leaf = l.leaf();
#else
std::string const& leaf = l.filename();
#endif
if (leaf == ".." || leaf == ".") return;
path f(p / l);
if (is_directory(f)) {
for (directory_iterator i(f), end; i != end; ++i)
#if BOOST_VERSION < 103600
add_files(t, p, l / i->leaf());
#else
add_files(t, p, l / i->filename());
#endif
} else {
qDebug("Adding %s", l.string().c_str());
t.add_file(l, file_size(f));
}
}
QStringList createtorrent::allItems(QListWidget *list){
QStringList res;
unsigned int nbItems = list->count();
@@ -191,17 +178,25 @@ void createtorrent::handleCreationFailure(QString msg) {
hide();
}
void createtorrent::handleCreationSuccess(QString path, const char* branch_path, QString hash) {
if(checkStartSeeding->isChecked()) {
// Create save path file
QFile savepath_file(misc::qBittorrentPath()+QString::fromUtf8("BT_backup")+QDir::separator()+hash+QString::fromUtf8(".savepath"));
savepath_file.open(QIODevice::WriteOnly | QIODevice::Text);
savepath_file.write(branch_path);
savepath_file.close();
emit torrent_to_seed(path);
}
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path);
hide();
void createtorrent::handleCreationSuccess(QString path, const char* branch_path) {
if(checkStartSeeding->isChecked()) {
// Create save path file
boost::intrusive_ptr<torrent_info> t;
try {
t = new torrent_info(path.toUtf8().data());
} catch(std::exception&) {
QMessageBox::critical(0, tr("Torrent creation"), tr("Created torrent file is invalid. It won't be added to download list."));
return;
}
QString hash = misc::toQString(t->info_hash());
QFile savepath_file(misc::qBittorrentPath()+QString::fromUtf8("BT_backup")+QDir::separator()+hash+QString::fromUtf8(".savepath"));
savepath_file.open(QIODevice::WriteOnly | QIODevice::Text);
savepath_file.write(branch_path);
savepath_file.close();
emit torrent_to_seed(path);
}
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path);
hide();
}
void createtorrent::updateProgressBar(int progress) {
@@ -224,58 +219,47 @@ void torrentCreatorThread::create(QString _input_path, QString _save_path, QStri
start();
}
void sendProgressUpdateSignal(int i, int num, QDialog *parent){
((createtorrent*)parent)->updateProgressBar((int)(i*100./(float)num));
}
void torrentCreatorThread::run() {
emit updateProgress(0);
char const* creator_str = "qBittorrent "VERSION;
try {
boost::intrusive_ptr<torrent_info> t(new torrent_info);
ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary);
// Adding files to the torrent
file_storage fs;
file_pool fp;
path full_path = complete(path(input_path.toUtf8().data()));
#if BOOST_VERSION < 103600
add_files(*t, full_path.branch_path(), full_path.leaf());
#else
add_files(*t, full_path.branch_path(), full_path.filename());
#endif
// Adding files to the torrent
add_files(fs, full_path, file_filter);
if(abort) return;
// Set piece size
t->set_piece_size(piece_size);
create_torrent t(fs, piece_size);
// Add url seeds
QString seed;
foreach(seed, url_seeds){
t->add_url_seed(seed.toUtf8().data());
t.add_url_seed(seed.toUtf8().data());
}
for(int i=0; i<trackers.size(); ++i){
t->add_tracker(trackers.at(i).toUtf8().data());
t.add_tracker(trackers.at(i).toUtf8().data());
}
if(abort) return;
// calculate the hash for all pieces
file_pool fp;
boost::scoped_ptr<storage_interface> st(default_storage_constructor(t, full_path.branch_path(), fp));
int num = t->num_pieces();
std::vector<char> buf(piece_size);
for (int i = 0; i < num; ++i) {
st->read(&buf[0], i, 0, t->piece_size(i));
hasher h(&buf[0], t->piece_size(i));
t->set_hash(i, h.final());
emit updateProgress((int)(i*100./(float)num));
if(abort) return;
}
set_piece_hashes(t, full_path.branch_path(), boost::bind<void>(&sendProgressUpdateSignal, _1, t.num_pieces(), parent));
// Set qBittorrent as creator and add user comment to
// torrent_info structure
t->set_creator(creator_str);
t->set_comment((const char*)comment.toUtf8());
t.set_creator(creator_str);
t.set_comment((const char*)comment.toUtf8());
// Is private ?
if(is_private){
t->set_priv(true);
t.set_priv(true);
}
if(abort) return;
// create the torrent and print it to out
entry e = t->create_torrent();
libtorrent::bencode(std::ostream_iterator<char>(out), e);
out.flush();
ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary);
bencode(std::ostream_iterator<char>(out), t.generate());
emit updateProgress(100);
emit creationSuccess(save_path, full_path.branch_path().string().c_str(), misc::toQString(t->info_hash()));
emit creationSuccess(save_path, full_path.branch_path().string().c_str());
}
catch (std::exception& e){
emit creationFailure(QString::fromUtf8(e.what()));

View File

@@ -37,9 +37,12 @@ class torrentCreatorThread : public QThread {
bool is_private;
int piece_size;
bool abort;
QDialog *parent;
public:
torrentCreatorThread() {}
torrentCreatorThread(QDialog *_parent) {
parent = _parent;
}
~torrentCreatorThread() {
abort = true;
wait();
@@ -51,7 +54,7 @@ class torrentCreatorThread : public QThread {
signals:
void creationFailure(QString msg);
void creationSuccess(QString path, const char* branch_path, QString hash);
void creationSuccess(QString path, const char* branch_path);
void updateProgress(int progress);
};
@@ -70,6 +73,9 @@ class createtorrent : public QDialog, private Ui::createTorrentDialog{
signals:
void torrent_to_seed(QString path);
public slots:
void updateProgressBar(int progress);
protected slots:
void on_createButton_clicked();
void on_addFile_button_clicked();
@@ -79,8 +85,7 @@ class createtorrent : public QDialog, private Ui::createTorrentDialog{
void on_addURLSeed_button_clicked();
void on_removeURLSeed_button_clicked();
void handleCreationFailure(QString msg);
void handleCreationSuccess(QString path, const char* branch_path, QString hash);
void updateProgressBar(int progress);
void handleCreationSuccess(QString path, const char* branch_path);
};
#endif

View File

@@ -1,128 +0,0 @@
/*
* Bittorrent Client using Qt4 and libtorrent.
* Copyright (C) 2006 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Contact : chris@qbittorrent.org
*/
#ifndef DELETETHREAD_H
#define DELETETHREAD_H
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QMutexLocker>
#include <QPair>
#include "arborescence.h"
class subDeleteThread : public QThread {
Q_OBJECT
private:
QString save_path;
arborescence *arb;
public:
subDeleteThread(QObject *parent, QString saveDir, arborescence *_arb) : QThread(parent), save_path(saveDir) {
arb = _arb;
}
~subDeleteThread(){
wait();
qDebug("subDeleteThread successfuly deleted");
}
signals:
// For subthreads
void deletionSuccessST(subDeleteThread* st);
//void deletionFailureST(subDeleteThread* st);
protected:
void run(){
/*if(arb->removeFromFS(save_path))
emit deletionSuccessST(this);
else
emit deletionFailureST(this);*/
arb->removeFromFS(save_path);
delete arb;
emit deletionSuccessST(this);
}
};
class deleteThread : public QThread {
Q_OBJECT
private:
QList<QPair<QString, arborescence*> > torrents_list;
QMutex mutex;
QWaitCondition condition;
bool abort;
QList<subDeleteThread*> subThreads;
public:
deleteThread(QObject* parent) : QThread(parent), abort(false){}
~deleteThread(){
mutex.lock();
abort = true;
condition.wakeOne();
mutex.unlock();
qDeleteAll(subThreads);
wait();
}
void deleteTorrent(QString saveDir, arborescence *arb){
qDebug("deleteThread called");
QMutexLocker locker(&mutex);
torrents_list << QPair<QString, arborescence*>(saveDir, arb);
if(!isRunning()){
start();
}else{
condition.wakeOne();
}
}
protected:
void run(){
forever{
if(abort)
return;
mutex.lock();
if(!torrents_list.empty()){
QPair<QString, arborescence *> torrent = torrents_list.takeFirst();
mutex.unlock();
subDeleteThread *st = new subDeleteThread(0, torrent.first, torrent.second);
subThreads << st;
connect(st, SIGNAL(deletionSuccessST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*)));
//connect(st, SIGNAL(deletionFailureST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*)));
st->start();
}else{
condition.wait(&mutex);
mutex.unlock();
}
}
}
protected slots:
void deleteSubThread(subDeleteThread* st){
int index = subThreads.indexOf(st);
Q_ASSERT(index != -1);
subThreads.removeAt(index);
delete st;
}
};
#endif

View File

@@ -18,16 +18,7 @@
<property name="spacing" >
<number>6</number>
</property>
<property name="leftMargin" >
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<property name="margin" >
<number>0</number>
</property>
<item>
@@ -100,7 +91,8 @@
</action>
<action name="actionOpen_destination_folder" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/folder.png</iconset>
<iconset resource="icons.qrc" >
<normaloff>:/Icons/folder.png</normaloff>:/Icons/folder.png</iconset>
</property>
<property name="text" >
<string>Open destination folder</string>
@@ -148,7 +140,8 @@
</action>
<action name="actionBuy_it" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/money.png</iconset>
<iconset resource="icons.qrc" >
<normaloff>:/Icons/money.png</normaloff>:/Icons/money.png</iconset>
</property>
<property name="text" >
<string>Buy it</string>
@@ -161,7 +154,8 @@
</action>
<action name="actionIncreasePriority" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/skin/increase.png</iconset>
<iconset resource="icons.qrc" >
<normaloff>:/Icons/skin/increase.png</normaloff>:/Icons/skin/increase.png</iconset>
</property>
<property name="text" >
<string>Increase priority</string>
@@ -169,12 +163,22 @@
</action>
<action name="actionDecreasePriority" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/skin/decrease.png</iconset>
<iconset resource="icons.qrc" >
<normaloff>:/Icons/skin/decrease.png</normaloff>:/Icons/skin/decrease.png</iconset>
</property>
<property name="text" >
<string>Decrease priority</string>
</property>
</action>
<action name="actionForce_recheck" >
<property name="icon" >
<iconset resource="icons.qrc" >
<normaloff>:/Icons/gear.png</normaloff>:/Icons/gear.png</iconset>
</property>
<property name="text" >
<string>Force recheck</string>
</property>
</action>
</widget>
<resources>
<include location="icons.qrc" />

View File

@@ -81,7 +81,7 @@ void subDownloadThread::run(){
return;
}
CURL *curl;
CURLcode res;
CURLcode res = (CURLcode)-1;
curl = curl_easy_init();
if(curl) {
std::string c_url = url.toUtf8().data();
@@ -123,10 +123,13 @@ void subDownloadThread::run(){
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, -1);
qDebug("Downloading %s", url.toUtf8().data());
res = curl_easy_perform(curl);
if(!abort)
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
fclose(f);
if(abort)
return;
if(res) {
emit downloadFailureST(this, url, errorCodeToString(res));
} else {

File diff suppressed because it is too large Load Diff

View File

@@ -58,7 +58,6 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
signals:
void unfinishedTorrentsNumberChanged(unsigned int);
void torrentDoubleClicked(QString hash, bool finished);
void torrentFinished(QString hash);
protected slots:
void on_actionSet_download_limit_triggered();
@@ -66,13 +65,11 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
void on_actionSet_upload_limit_triggered();
void displayDLListMenu(const QPoint& pos);
void displayDLHoSMenu(const QPoint&);
void addTorrent(QString hash);
void sortDownloadList(int index=-1, Qt::SortOrder startSortOrder=Qt::AscendingOrder);
void toggleDownloadListSortOrder(int index);
void sortDownloadListFloat(int index, Qt::SortOrder sortOrder);
void sortDownloadListString(int index, Qt::SortOrder sortOrder);
void saveColWidthDLList() const;
void torrentAdded(QTorrentHandle& h);
void setRowColor(int row, QColor color);
void showProperties(const QModelIndex &index);
void hideOrShowColumnName();
@@ -84,18 +81,19 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
void hideOrShowColumnRatio();
void hideOrShowColumnEta();
void hideOrShowColumnPriority();
void loadLastSortedColumn();
void forceRecheck();
public slots:
void updateDlList();
bool updateTorrent(QTorrentHandle h);
void pauseTorrent(QString hash);
void resumeTorrent(QString hash);
void deleteTorrent(QString hash);
void propertiesSelection();
void updateFileSizeAndProgress(QString hash);
void showPropertiesFromHash(QString hash);
void hidePriorityColumn(bool hide);
void sortProgressColumn(QString hash);
void sortProgressColumn(QTorrentHandle& h);
void loadLastSortedColumn();
void addTorrent(QString hash);
};

View File

@@ -32,11 +32,6 @@
#include <QDropEvent>
#include <QInputDialog>
#ifdef HAVE_MAGICK
#include <Magick++.h>
using namespace Magick;
#endif
#ifdef HAVE_ZZIP
#include <zzip/zzip.h>
#endif
@@ -611,20 +606,6 @@ void engineSelectDlg::processDownloadedFile(QString url, QString filePath) {
if(url.endsWith("favicon.ico", Qt::CaseInsensitive)){
// Icon downloaded
QImage fileIcon;
#ifdef HAVE_MAGICK
try{
QFile::copy(filePath, filePath+".ico");
Image image(QDir::cleanPath(filePath+".ico").toUtf8().data());
// Convert to PNG since we can't read ICO format
image.magick("PNG");
// Resize to 16x16px
image.sample(Geometry(16, 16));
image.write(filePath.toUtf8().data());
QFile::remove(filePath+".ico");
}catch(Magick::Exception &error_){
qDebug("favicon conversion to PNG failure: %s", error_.what());
}
#endif
if(fileIcon.load(filePath)) {
QList<QTreeWidgetItem*> items = findItemsWithUrl(url);
QTreeWidgetItem *item;

View File

@@ -21,7 +21,6 @@
#include "eventmanager.h"
#include "bittorrent.h"
#include "json.h"
#include <QDebug>
EventManager::EventManager(QObject *parent, bittorrent *BTSession)
@@ -29,116 +28,68 @@ EventManager::EventManager(QObject *parent, bittorrent *BTSession)
{
}
QVariant EventManager::getEventList() const {
QVariantList list;
foreach(QVariantMap event, event_list.values()) {
list << QVariant(event);
}
return QVariant(list);
QList<QVariantMap> EventManager::getEventList() const {
return event_list.values();
}
void EventManager::addedTorrent(QTorrentHandle& h)
{
QVariantMap event;
QString hash = h.hash();
event["hash"] = QVariant(hash);
event["name"] = QVariant(h.name());
event["seed"] = QVariant(h.is_seed());
event["size"] = QVariant((qlonglong)h.actual_size());
if(!h.is_seed()) {
event["progress"] = QVariant(h.progress());
event["dlspeed"] = QVariant(h.download_payload_rate());
}
event["upspeed"] = QVariant(h.upload_payload_rate());
if(h.is_paused()) {
if(BTSession->isQueueingEnabled() && (BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash)))
event["state"] = QVariant("queued");
else
event["state"] = QVariant("paused");
} else {
switch(h.state())
{
case torrent_status::finished:
case torrent_status::seeding:
event["state"] = QVariant("seeding");
break;
case torrent_status::checking_files:
case torrent_status::queued_for_checking:
event["state"] = QVariant("checking");
break;
case torrent_status::connecting_to_tracker:
if(h.download_payload_rate() > 0)
event["state"] = QVariant("downloading");
else
event["state"] = QVariant("connecting");
break;
case torrent_status::downloading:
case torrent_status::downloading_metadata:
if(h.download_payload_rate() > 0)
event["state"] = QVariant("downloading");
else
event["state"] = QVariant("stalled");
break;
default:
qDebug("No status, should not happen!!! status is %d", h.state());
event["state"] = QVariant();
}
}
event_list[hash] = event;
modifiedTorrent(h);
}
void EventManager::deletedTorrent(QString hash)
{
event_list.remove(hash);
event_list.remove(hash);
}
void EventManager::modifiedTorrent(QTorrentHandle h)
{
QString hash = h.hash();
QVariantMap event;
if(h.is_paused()) {
if(BTSession->isQueueingEnabled() && (BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash)))
event["state"] = QVariant("queued");
else
event["state"] = QVariant("paused");
} else {
switch(h.state())
{
case torrent_status::finished:
case torrent_status::seeding:
event["state"] = QVariant("seeding");
break;
case torrent_status::checking_files:
case torrent_status::queued_for_checking:
event["state"] = QVariant("checking");
break;
case torrent_status::connecting_to_tracker:
if(h.download_payload_rate() > 0)
event["state"] = QVariant("downloading");
else
event["state"] = QVariant("connecting");
break;
case torrent_status::downloading:
case torrent_status::downloading_metadata:
if(h.download_payload_rate() > 0)
event["state"] = QVariant("downloading");
else
event["state"] = QVariant("stalled");
break;
default:
qDebug("No status, should not happen!!! status is %d", h.state());
event["state"] = QVariant();
}
}
QString hash = h.hash();
QVariantMap event;
if(h.is_paused()) {
event["state"] = QVariant("paused");
} else {
if(BTSession->isQueueingEnabled() && h.is_queued()) {
event["state"] = QVariant("queued");
} else {
switch(h.state())
{
case torrent_status::finished:
case torrent_status::seeding:
event["state"] = QVariant("seeding");
break;
case torrent_status::checking_files:
case torrent_status::queued_for_checking:
event["state"] = QVariant("checking");
break;
case torrent_status::allocating:
case torrent_status::downloading:
case torrent_status::downloading_metadata:
if(h.download_payload_rate() > 0)
event["state"] = QVariant("downloading");
else
event["state"] = QVariant("stalled");
break;
default:
qDebug("No status, should not happen!!! status is %d", h.state());
event["state"] = QVariant();
}
}
}
event["name"] = QVariant(h.name());
event["size"] = QVariant((qlonglong)h.actual_size());
if(!h.is_seed()) {
if(!h.is_seed()) {
event["progress"] = QVariant(h.progress());
event["dlspeed"] = QVariant(h.download_payload_rate());
if(BTSession->isQueueingEnabled()) {
event["priority"] = QVariant(h.queue_position());
} else {
event["priority"] = -1;
}
}
event["upspeed"] = QVariant(h.upload_payload_rate());
event["seed"] = QVariant(h.is_seed());
event["seed"] = QVariant(h.is_seed());
event["hash"] = QVariant(hash);
event_list[hash] = event;
}

View File

@@ -40,7 +40,7 @@ class EventManager : public QObject
public:
EventManager(QObject *parent, bittorrent* BTSession);
QVariant getEventList() const;
QList<QVariantMap> getEventList() const;
public slots:
void addedTorrent(QTorrentHandle& h);

View File

@@ -35,7 +35,11 @@ using namespace std;
// P2B Stuff
#include <string.h>
#include <arpa/inet.h>
#ifdef Q_WS_WIN
#include <Winsock2.h>
#else
#include <arpa/inet.h>
#endif
// End of P2B stuff
class FilterParserThread : public QThread {
@@ -250,8 +254,9 @@ class FilterParserThread : public QThread {
int getlineInStream(QDataStream& stream, string& name, char delim) {
char c;
int total_read = 0;
int read;
do {
int read = stream.readRawData(&c, 1);
read = stream.readRawData(&c, 1);
total_read += read;
if(read > 0) {
if(c != delim) {

View File

@@ -160,9 +160,8 @@ void HttpConnection::respondNotFound()
void HttpConnection::respondJson()
{
EventManager* manager = parent->eventManager();
QVariant data = manager->getEventList();
QString string = toJson(data);
EventManager* manager = parent->eventManager();
QString string = json::toJson(manager->getEventList());
generator.setStatusLine(200, "OK");
generator.setContentTypeByExt("js");
generator.setMessage(string);
@@ -203,29 +202,36 @@ void HttpConnection::respondCommand(QString command)
emit torrentReadyToBeDownloaded(filePath, false, QString(), false);
return;
}
if(command == "resumeall")
{
if(command == "resumeall") {
emit resumeAllTorrents();
return;
}
if(command == "pauseall")
{
if(command == "pauseall") {
emit pauseAllTorrents();
return;
}
if(command == "resume")
{
if(command == "resume") {
emit resumeTorrent(parser.post("hash"));
return;
}
if(command == "pause")
{
if(command == "pause") {
emit pauseTorrent(parser.post("hash"));
return;
}
if(command == "delete")
{
emit deleteTorrent(parser.post("hash"));
if(command == "delete") {
emit deleteTorrent(parser.post("hash"), false);
return;
}
if(command == "deletePerm") {
emit deleteTorrent(parser.post("hash"), true);
return;
}
if(command == "increasePrio") {
emit increasePrioTorrent(parser.post("hash"));
return;
}
if(command == "decreasePrio") {
emit decreasePrioTorrent(parser.post("hash"));
return;
}
}

View File

@@ -59,9 +59,11 @@ class HttpConnection : public QObject
signals:
void UrlReadyToBeDownloaded(QString url);
void torrentReadyToBeDownloaded(QString, bool, QString, bool);
void deleteTorrent(QString hash);
void deleteTorrent(QString hash, bool permanently);
void resumeTorrent(QString hash);
void pauseTorrent(QString hash);
void increasePrioTorrent(QString hash);
void decreasePrioTorrent(QString hash);
void resumeAllTorrents();
void pauseAllTorrents();
};

Some files were not shown because too many files have changed in this diff Show More