Compare commits
397 Commits
release-2.
...
release-2.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c506a01dea | ||
![]() |
9034094cf9 | ||
![]() |
c48766aeb7 | ||
![]() |
28a6afeb02 | ||
![]() |
c8d0f5a104 | ||
![]() |
3c396257de | ||
![]() |
a9be841d2d | ||
![]() |
7d0581a7a5 | ||
![]() |
4efeb66b73 | ||
![]() |
3b05f8b4b4 | ||
![]() |
6b4f09d740 | ||
![]() |
f1b02c1280 | ||
![]() |
3d546a4c5d | ||
![]() |
19368bcefa | ||
![]() |
dbbf26449c | ||
![]() |
8f28804f8c | ||
![]() |
b7edfea4ce | ||
![]() |
23b2f94c40 | ||
![]() |
8f40f41fef | ||
![]() |
33f868144b | ||
![]() |
b2545bb709 | ||
![]() |
3b6e1e82d9 | ||
![]() |
7710c88797 | ||
![]() |
4d5001d18d | ||
![]() |
0f4f108eb5 | ||
![]() |
f0d0bb7170 | ||
![]() |
66157da5c2 | ||
![]() |
13493e1afe | ||
![]() |
f6bfacda2c | ||
![]() |
f7a86b5484 | ||
![]() |
66cd3f8184 | ||
![]() |
3a237c93be | ||
![]() |
4c34066727 | ||
![]() |
1960008c83 | ||
![]() |
deffbd6321 | ||
![]() |
53927c9aa0 | ||
![]() |
d84346616a | ||
![]() |
e1183dbc0b | ||
![]() |
602f1574ca | ||
![]() |
358f7d16da | ||
![]() |
e4006d6175 | ||
![]() |
949b4ce4e9 | ||
![]() |
cbafac8ea9 | ||
![]() |
e4bf116ce8 | ||
![]() |
bccdad4b1b | ||
![]() |
9b372b3cce | ||
![]() |
98d0c00f85 | ||
![]() |
9d2f2230ee | ||
![]() |
81c6958428 | ||
![]() |
f976eda6a9 | ||
![]() |
fe8d5a3528 | ||
![]() |
240c3508fe | ||
![]() |
1065f5fb86 | ||
![]() |
2b37986007 | ||
![]() |
22d0c4a241 | ||
![]() |
dd47ce6767 | ||
![]() |
5c80ce42e0 | ||
![]() |
adb727d282 | ||
![]() |
e17ca355ae | ||
![]() |
b80940ac4f | ||
![]() |
1eca139db9 | ||
![]() |
25278beb2f | ||
![]() |
5922ffff62 | ||
![]() |
ff084e9681 | ||
![]() |
86e5d219d2 | ||
![]() |
b78e0a54ed | ||
![]() |
4bfacb8b91 | ||
![]() |
e9ad58a373 | ||
![]() |
09c48539ad | ||
![]() |
3693ecdd30 | ||
![]() |
ddc66e6005 | ||
![]() |
fd0b1f8931 | ||
![]() |
1a4f638ff6 | ||
![]() |
77239db3c5 | ||
![]() |
0ea59c8d58 | ||
![]() |
54e2a8c7fe | ||
![]() |
245a8e0a3a | ||
![]() |
51e474c893 | ||
![]() |
81d3e64518 | ||
![]() |
95da161be3 | ||
![]() |
8618f13b7a | ||
![]() |
e24e7578f2 | ||
![]() |
a03ad3de23 | ||
![]() |
9bd40a9b79 | ||
![]() |
b4b61b9b7d | ||
![]() |
5656fe9a9b | ||
![]() |
fb79146ae6 | ||
![]() |
ba27191b2a | ||
![]() |
dc87aa3d5c | ||
![]() |
83cf3aebab | ||
![]() |
dedd9bd03c | ||
![]() |
ab36a358b7 | ||
![]() |
6ea97f09cf | ||
![]() |
5f7822d202 | ||
![]() |
6a87225dd0 | ||
![]() |
b6f56c0812 | ||
![]() |
c4ce2a2549 | ||
![]() |
41650da297 | ||
![]() |
74c61e6805 | ||
![]() |
e8dd7bbcc9 | ||
![]() |
335d012d55 | ||
![]() |
17fc58840a | ||
![]() |
0e8c55b9f5 | ||
![]() |
d581f653c6 | ||
![]() |
48dbaf05ae | ||
![]() |
540da69d61 | ||
![]() |
06efd64a80 | ||
![]() |
62d872984b | ||
![]() |
1dd11dd8f8 | ||
![]() |
2ce375d8eb | ||
![]() |
8ed0e58d63 | ||
![]() |
660a6929fd | ||
![]() |
44f6c972d4 | ||
![]() |
6a6077bf1d | ||
![]() |
30234a4e78 | ||
![]() |
dc9edf7538 | ||
![]() |
92574458d0 | ||
![]() |
c35ef9ad15 | ||
![]() |
4059bcc0fa | ||
![]() |
1840d1c49f | ||
![]() |
cbd948f6f3 | ||
![]() |
454c093033 | ||
![]() |
45eaf7ce58 | ||
![]() |
04b7af4df5 | ||
![]() |
8c6978be82 | ||
![]() |
6c9e7156f7 | ||
![]() |
bc89845523 | ||
![]() |
9ffe9c2006 | ||
![]() |
1d598d7772 | ||
![]() |
7f576ccc82 | ||
![]() |
d5da8a6277 | ||
![]() |
a297204b27 | ||
![]() |
e0182bb03e | ||
![]() |
ca5bf5e9d7 | ||
![]() |
5475d730ff | ||
![]() |
7796520580 | ||
![]() |
340500c351 | ||
![]() |
043d33ff91 | ||
![]() |
baf991b342 | ||
![]() |
dc47e90126 | ||
![]() |
67e3f9e686 | ||
![]() |
aaeb6b90ed | ||
![]() |
d124ada755 | ||
![]() |
31105aefe4 | ||
![]() |
44c258796e | ||
![]() |
26100120a9 | ||
![]() |
0db8ce891b | ||
![]() |
979aba5685 | ||
![]() |
396da6bd94 | ||
![]() |
1b0d86220f | ||
![]() |
957d2c0d1a | ||
![]() |
455657912a | ||
![]() |
e3da1902df | ||
![]() |
d0f8e9208f | ||
![]() |
de50346428 | ||
![]() |
c7ca51f950 | ||
![]() |
4522174555 | ||
![]() |
126230ad08 | ||
![]() |
6aa1f4156a | ||
![]() |
2726faa090 | ||
![]() |
230b84032d | ||
![]() |
9c4c5e2d1a | ||
![]() |
2bf8e2d2d7 | ||
![]() |
9bb05c8dea | ||
![]() |
2707aa2818 | ||
![]() |
93c644da88 | ||
![]() |
4a114c0fdc | ||
![]() |
f95108155d | ||
![]() |
75f75854c2 | ||
![]() |
e20c3cd0b6 | ||
![]() |
2273ea4099 | ||
![]() |
b115b0c6a3 | ||
![]() |
9d79a51f18 | ||
![]() |
db9005158e | ||
![]() |
4491999a8c | ||
![]() |
113a502a7e | ||
![]() |
7ad39003f4 | ||
![]() |
4b43871708 | ||
![]() |
aa8f7552a2 | ||
![]() |
19d94b53d2 | ||
![]() |
ca98a261e6 | ||
![]() |
535ec2ced6 | ||
![]() |
a300c236ba | ||
![]() |
b16c26b24c | ||
![]() |
1b1dde3fc8 | ||
![]() |
bd5880843f | ||
![]() |
abf35a31f3 | ||
![]() |
015638035a | ||
![]() |
8e27fe83f1 | ||
![]() |
ce4b105065 | ||
![]() |
37a7b79a6f | ||
![]() |
ef19e8aeef | ||
![]() |
f6886b4749 | ||
![]() |
8306959cb4 | ||
![]() |
d1918ee206 | ||
![]() |
b2b76f9e35 | ||
![]() |
a07fb264e8 | ||
![]() |
881f2d04d2 | ||
![]() |
e1b629df88 | ||
![]() |
eab6a194e1 | ||
![]() |
3733bc9148 | ||
![]() |
ae5746a636 | ||
![]() |
cb509cebb3 | ||
![]() |
511c4474c7 | ||
![]() |
d063aea977 | ||
![]() |
447efc52d8 | ||
![]() |
296acf820c | ||
![]() |
6ae49acb69 | ||
![]() |
af1b06c5be | ||
![]() |
4732c8565d | ||
![]() |
52dd1476db | ||
![]() |
63170b9214 | ||
![]() |
2203b399df | ||
![]() |
d80f7a6ef3 | ||
![]() |
88c56d8250 | ||
![]() |
fca24a8f84 | ||
![]() |
6d140a141a | ||
![]() |
a18e325c18 | ||
![]() |
c4d9c51e49 | ||
![]() |
27e980de28 | ||
![]() |
3c4906bb4d | ||
![]() |
da796c80c3 | ||
![]() |
7a2af0f506 | ||
![]() |
3e562e7450 | ||
![]() |
4fc777268b | ||
![]() |
037e57b687 | ||
![]() |
2b289655c1 | ||
![]() |
118ea6093d | ||
![]() |
cac6f7428c | ||
![]() |
ae6acc4ca2 | ||
![]() |
641c6f0132 | ||
![]() |
56dc8cad71 | ||
![]() |
7cc07d842c | ||
![]() |
baaadf07fa | ||
![]() |
719b32ba36 | ||
![]() |
af5c1096b5 | ||
![]() |
3008222b92 | ||
![]() |
5ef9faacd5 | ||
![]() |
ff65b6ea2f | ||
![]() |
4c8a087b81 | ||
![]() |
8f4bf93f02 | ||
![]() |
824b2f6fff | ||
![]() |
ba0c7334b7 | ||
![]() |
a1dd724220 | ||
![]() |
a7820e5f08 | ||
![]() |
1a2eee8060 | ||
![]() |
4a2713a9f0 | ||
![]() |
5ece0b4f70 | ||
![]() |
44e8ec2b37 | ||
![]() |
d7e5f4b895 | ||
![]() |
b0c7bdf82b | ||
![]() |
a239ac1a52 | ||
![]() |
99459dc55d | ||
![]() |
78ba99778a | ||
![]() |
96d3df3135 | ||
![]() |
cbe4bbac6a | ||
![]() |
f502e82ec4 | ||
![]() |
a5d8766a9e | ||
![]() |
55d8e3d76b | ||
![]() |
7b7fb4d278 | ||
![]() |
09c7c50ad3 | ||
![]() |
131250dc03 | ||
![]() |
130187723c | ||
![]() |
7bac95c9ad | ||
![]() |
add2475700 | ||
![]() |
533e402bca | ||
![]() |
b87a23037e | ||
![]() |
6d88bb5b83 | ||
![]() |
435801c893 | ||
![]() |
9d0577fa5c | ||
![]() |
f2891dae74 | ||
![]() |
a43a1f5b67 | ||
![]() |
ee9ca1ece7 | ||
![]() |
8271e20fac | ||
![]() |
132b1f7ffe | ||
![]() |
77b4d97069 | ||
![]() |
2168d5a30e | ||
![]() |
7ad90b1b80 | ||
![]() |
f60ef5dbd5 | ||
![]() |
4dc26d0a77 | ||
![]() |
551273b831 | ||
![]() |
d5a09674ae | ||
![]() |
907e620e9e | ||
![]() |
f96ec75eec | ||
![]() |
4d00db2b42 | ||
![]() |
db564b4521 | ||
![]() |
3f2076d195 | ||
![]() |
ed13c43e93 | ||
![]() |
b5a9fe71e1 | ||
![]() |
d0037d90f4 | ||
![]() |
e885ee0d35 | ||
![]() |
ff5e5d1062 | ||
![]() |
1bfadf5219 | ||
![]() |
4f9eca78d9 | ||
![]() |
7aa2994078 | ||
![]() |
1128b3ea83 | ||
![]() |
9d06947125 | ||
![]() |
14cc600a8b | ||
![]() |
4f3fd86f91 | ||
![]() |
e663717d64 | ||
![]() |
8b5d388e77 | ||
![]() |
22d781edd5 | ||
![]() |
4252832ba5 | ||
![]() |
fab58296af | ||
![]() |
e142877e10 | ||
![]() |
6f6e453ae4 | ||
![]() |
50e620daf2 | ||
![]() |
c334439df6 | ||
![]() |
2d9b4f273e | ||
![]() |
15c7099e85 | ||
![]() |
d2b1f6176f | ||
![]() |
8306d7931b | ||
![]() |
b07fbb726e | ||
![]() |
9586f0e61c | ||
![]() |
7d66c07cef | ||
![]() |
28ecb2fe1d | ||
![]() |
a9cafeaa76 | ||
![]() |
5fc69ccb73 | ||
![]() |
bc626e3512 | ||
![]() |
98561f9db9 | ||
![]() |
b56dee2a92 | ||
![]() |
885a7f592e | ||
![]() |
6965448a24 | ||
![]() |
475d63dad8 | ||
![]() |
c87a0bde0b | ||
![]() |
c1bc9886b7 | ||
![]() |
88f8437c5a | ||
![]() |
411a1c641d | ||
![]() |
dc0ad73eca | ||
![]() |
04e008afa0 | ||
![]() |
a6207f70d5 | ||
![]() |
b8a30be7bc | ||
![]() |
67d60766c1 | ||
![]() |
97c0b28a98 | ||
![]() |
c61aded388 | ||
![]() |
1fd57b5d63 | ||
![]() |
755b8dec30 | ||
![]() |
ecd5c1fcc3 | ||
![]() |
db5402385a | ||
![]() |
09ef3073a1 | ||
![]() |
6dd3833e0f | ||
![]() |
d4762a4d8d | ||
![]() |
38cc55ea09 | ||
![]() |
5d60295db3 | ||
![]() |
18bd3b855c | ||
![]() |
868d423c82 | ||
![]() |
edb6857de0 | ||
![]() |
ed803fb994 | ||
![]() |
83d83a364d | ||
![]() |
690bb92154 | ||
![]() |
8e39eef7aa | ||
![]() |
1923a51c59 | ||
![]() |
3dc1107b40 | ||
![]() |
dd22e9009c | ||
![]() |
c7ccf39abf | ||
![]() |
af166f53d3 | ||
![]() |
21eb26a374 | ||
![]() |
e2aaf5d1de | ||
![]() |
0b7ca15c4f | ||
![]() |
07ee2a4aff | ||
![]() |
141d3b6737 | ||
![]() |
e2c3e6dbaa | ||
![]() |
b1126556c0 | ||
![]() |
69cb8d1398 | ||
![]() |
094d979ce6 | ||
![]() |
92dd669597 | ||
![]() |
32a8dec0e7 | ||
![]() |
2dd5bccd49 | ||
![]() |
18d0283463 | ||
![]() |
9fe807b6f1 | ||
![]() |
84f00bf3f6 | ||
![]() |
d3687fd863 | ||
![]() |
d1a549a6cc | ||
![]() |
c1552ff254 | ||
![]() |
54a396bc6e | ||
![]() |
ed732bca63 | ||
![]() |
02a4464e8f | ||
![]() |
7f97df4462 | ||
![]() |
9d20af02a2 | ||
![]() |
cbaef050f0 | ||
![]() |
148139c2c4 | ||
![]() |
793f8a103d | ||
![]() |
ffa48b64ac | ||
![]() |
59a8e651f9 | ||
![]() |
fb9f2a01b5 | ||
![]() |
944e25a5d8 | ||
![]() |
ad597c72d2 | ||
![]() |
abbbf1e562 | ||
![]() |
d2dd29c35a | ||
![]() |
906f2bab1e | ||
![]() |
bb6468005d | ||
![]() |
a2423e97eb | ||
![]() |
ed1d75ecb1 | ||
![]() |
1e4200345a | ||
![]() |
be11f4e039 | ||
![]() |
22ec528cdf | ||
![]() |
ebf341a6de |
19
AUTHORS
@@ -6,12 +6,17 @@ Contributors:
|
|||||||
* Ishan Arora <ishan@qbittorrent.org>
|
* Ishan Arora <ishan@qbittorrent.org>
|
||||||
* Arnaud Demaizière <arnaud@qbittorrent.org>
|
* Arnaud Demaizière <arnaud@qbittorrent.org>
|
||||||
* Grigis Gaëtan <cipher16@gmail.com>
|
* Grigis Gaëtan <cipher16@gmail.com>
|
||||||
|
* Christian Kandeler <zambesi@users.sourceforge.net>
|
||||||
|
|
||||||
Code from other projects:
|
Code from other projects:
|
||||||
* files src/ico.cpp src/ico.h
|
* files src/ico.cpp src/ico.h
|
||||||
copyright: Malte Starostik <malte@kde.org>
|
copyright: Malte Starostik <malte@kde.org>
|
||||||
license: LGPL
|
license: LGPL
|
||||||
|
|
||||||
|
* files src/search_engine/socks.py
|
||||||
|
copyright: Dan Haim <negativeiq@users.sourceforge.net>
|
||||||
|
license: BSD
|
||||||
|
|
||||||
Images Authors:
|
Images Authors:
|
||||||
* files: src/Icons/*.png
|
* files: src/Icons/*.png
|
||||||
copyright: Gnome Icon Theme
|
copyright: Gnome Icon Theme
|
||||||
@@ -56,8 +61,8 @@ Translations authors:
|
|||||||
* files: src/lang/*.ts
|
* files: src/lang/*.ts
|
||||||
copyright:
|
copyright:
|
||||||
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
||||||
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
|
- Bulgarian: Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)
|
||||||
- Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
|
- Catalan: Francisco Luque Contreras (frannoe@ya.com)
|
||||||
- Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com)
|
- Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com)
|
||||||
- Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
|
- Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
|
||||||
- Czech: Jirka Vilim (web@tets.cz)
|
- Czech: Jirka Vilim (web@tets.cz)
|
||||||
@@ -67,10 +72,10 @@ Translations authors:
|
|||||||
- Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net)
|
- Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net)
|
||||||
- French: Christophe Dumez (chris@qbittorrent.org)
|
- French: Christophe Dumez (chris@qbittorrent.org)
|
||||||
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
|
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
|
||||||
- Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net)
|
- Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) and Stephanos Antaris (santaris@csd.auth.gr)
|
||||||
- Hungarian: Majoros Péter (majoros.j.p@t-online.hu)
|
- Hungarian: Majoros Péter (majoros.j.p@t-online.hu)
|
||||||
- Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)
|
- Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)
|
||||||
- Japanese: Nardog (nardog@e2umail.com)
|
- Japanese: Nardog (alphisation@gmail.com)
|
||||||
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
|
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
|
||||||
- Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net)
|
- Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net)
|
||||||
- Polish: Mariusz Fik (fisiu@opensuse.org)
|
- Polish: Mariusz Fik (fisiu@opensuse.org)
|
||||||
@@ -79,8 +84,8 @@ Translations authors:
|
|||||||
- Russian: Nick Khazov (m2k3d0n at users.sourceforge.net)
|
- Russian: Nick Khazov (m2k3d0n at users.sourceforge.net)
|
||||||
- Serbian: Anaximandar Milet (anaximandar at operamail.com)
|
- Serbian: Anaximandar Milet (anaximandar at operamail.com)
|
||||||
- Slovak: helix84
|
- Slovak: helix84
|
||||||
- Spanish: Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net)
|
- Spanish: Francisco Luque Contreras (frannoe@ya.com)
|
||||||
- Swedish: Daniel Nylander (po@danielnylander.se)
|
- Swedish: Daniel Nylander (po@danielnylander.se)
|
||||||
- Turkish: Erdem Bingöl (erdem84@gmail.com)
|
- Turkish: Hasan Yilmaz (iletisim@hedefturkce.com)
|
||||||
- Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net)
|
- Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net) and Oleh Prypin (blaxpirit@gmail.com)
|
||||||
license: GPLv2
|
license: GPLv2
|
||||||
|
157
Changelog
@@ -1,4 +1,112 @@
|
|||||||
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v2.0.0
|
* 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
|
||||||
- FEATURE: Added program option to disable splash screen
|
- FEATURE: Added program option to disable splash screen
|
||||||
- FEATURE: Dropped dependency on libcurl and libzzip
|
- FEATURE: Dropped dependency on libcurl and libzzip
|
||||||
- FEATURE: Display more information regarding the torrent in its properties
|
- FEATURE: Display more information regarding the torrent in its properties
|
||||||
@@ -38,10 +146,14 @@
|
|||||||
- FEATURE: Support for bitcomet padding files (libtorrent >= v0.15 only)
|
- 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)
|
- 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: 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: Remodeled Web UI to match new qBittorrent UI (Properties and preferences available)
|
||||||
- WEB UI: Added internationalization support
|
- WEB UI: Added internationalization support
|
||||||
- WEB UI: Reduced computation in Javascript (do this one server side instead)
|
- WEB UI: Reduced computation in Javascript (do this one server side instead)
|
||||||
- WEB UI: Fixed Transfer list flickering
|
- WEB UI: Fixed Transfer list flickering
|
||||||
|
- WEB UI: Password is now stored as md5
|
||||||
- I18N: Added Serbian translation (By Anaximandar Milet)
|
- I18N: Added Serbian translation (By Anaximandar Milet)
|
||||||
- COSMETIC: Merged download / upload lists
|
- COSMETIC: Merged download / upload lists
|
||||||
- COSMETIC: Torrents can be filtered based on their status
|
- COSMETIC: Torrents can be filtered based on their status
|
||||||
@@ -55,6 +167,49 @@
|
|||||||
- COSMETIC: New torrent status icons by Mateusz Tolola
|
- COSMETIC: New torrent status icons by Mateusz Tolola
|
||||||
- COSMETIC: Make use of libnotify if available for system notifications (Ubuntu, ...)
|
- 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
|
* Thu Sep 3 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.0
|
||||||
- FEATURE: Added Magnet URI support
|
- FEATURE: Added Magnet URI support
|
||||||
- FEATURE: Search engine supports category-based requests
|
- FEATURE: Search engine supports category-based requests
|
||||||
|
59
INSTALL
@@ -1,30 +1,55 @@
|
|||||||
qBittorrent - A BitTorrent client in C++ / Qt4
|
qBittorrent - A BitTorrent client in C++ / Qt4
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|
||||||
./configure
|
1) Compile and install qBittorrent with Qt4 Graphical Interface
|
||||||
make && make install
|
|
||||||
qbittorrent
|
|
||||||
|
|
||||||
will install and execute qBittorrent hopefully without any problems.
|
$ ./configure
|
||||||
|
$ make && make install
|
||||||
|
$ qbittorrent
|
||||||
|
|
||||||
Dependencies:
|
will install and execute qBittorrent hopefully without any problems.
|
||||||
- Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
|
||||||
|
|
||||||
- libtorrent-rasterbar by Arvid Norberg (>= 0.14.0 REQUIRED, >= v0.15.0 ADVISED)
|
Dependencies:
|
||||||
-> http://www.qbittorrent.org/download.php (advised)
|
- Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||||
-> 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
|
- pkg-config executable
|
||||||
|
|
||||||
- python >= 2.3 (needed by search engine)
|
- 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.
|
||||||
|
|
||||||
- libnotify >= 0.4.2, glib-2.0 (optional)
|
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
|
||||||
* Can be used for system notifications to replace standard Qt notifications
|
|
||||||
so that it integrates better into the Desktop
|
- 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
|
||||||
|
|
||||||
- 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:
|
DOCUMENTATION:
|
||||||
Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
|
Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
|
||||||
|
73
configure
vendored
@@ -18,6 +18,8 @@ Main options:
|
|||||||
--help This help text.
|
--help This help text.
|
||||||
|
|
||||||
Dependency options:
|
Dependency options:
|
||||||
|
--disable-gui Disable qBittorrent Graphical user
|
||||||
|
interface for headless running
|
||||||
--with-libboost-inc=[path] Path to libboost include files
|
--with-libboost-inc=[path] Path to libboost include files
|
||||||
--disable-libnotify Disable use of libnotify
|
--disable-libnotify Disable use of libnotify
|
||||||
--disable-geoip-database Disable use of geoip-database
|
--disable-geoip-database Disable use of geoip-database
|
||||||
@@ -140,6 +142,11 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
--disable-gui)
|
||||||
|
QC_DISABLE_GUI="Y"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
--with-libboost-inc=*)
|
--with-libboost-inc=*)
|
||||||
QC_WITH_LIBBOOST_INC=$optarg
|
QC_WITH_LIBBOOST_INC=$optarg
|
||||||
shift
|
shift
|
||||||
@@ -181,6 +188,7 @@ echo PREFIX=$PREFIX
|
|||||||
echo BINDIR=$BINDIR
|
echo BINDIR=$BINDIR
|
||||||
echo DATADIR=$DATADIR
|
echo DATADIR=$DATADIR
|
||||||
echo EX_QTDIR=$EX_QTDIR
|
echo EX_QTDIR=$EX_QTDIR
|
||||||
|
echo QC_DISABLE_GUI=$QC_DISABLE_GUI
|
||||||
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
||||||
echo QC_DISABLE_libnotify=$QC_DISABLE_libnotify
|
echo QC_DISABLE_libnotify=$QC_DISABLE_libnotify
|
||||||
echo QC_DISABLE_geoip_database=$QC_DISABLE_geoip_database
|
echo QC_DISABLE_geoip_database=$QC_DISABLE_geoip_database
|
||||||
@@ -290,6 +298,7 @@ cat >$1/modules.cpp <<EOT
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.4
|
name: Qt >= 4.4
|
||||||
|
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_qt4 : public ConfObj
|
class qc_qt4 : public ConfObj
|
||||||
@@ -300,11 +309,27 @@ public:
|
|||||||
QString shortname() const { return "Qt 4.4"; }
|
QString shortname() const { return "Qt 4.4"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
if(QT_VERSION >= 0x040500) {
|
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
conf->addDefine("QT_4_5");
|
conf->addDefine("DISABLE_GUI");
|
||||||
}
|
}
|
||||||
return(QT_VERSION >= 0x040400);
|
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"
|
#line 1 "libtorrent-rasterbar.qcm"
|
||||||
@@ -318,11 +343,11 @@ class qc_libtorrent_rasterbar : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.15.0 advised)"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14.4"; }
|
||||||
QString shortname() const { return "libtorrent-rasterbar"; }
|
QString shortname() const { return "libtorrent-rasterbar"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QStringList incs;
|
QStringList incs;
|
||||||
QString req_ver = "0.14.0";
|
QString req_ver = "0.14.4";
|
||||||
QString adv_ver = "0.15.0";
|
QString adv_ver = "0.15.0";
|
||||||
QString version, libs, other;
|
QString version, libs, other;
|
||||||
VersionMode mode = VersionMin;
|
VersionMode mode = VersionMin;
|
||||||
@@ -330,12 +355,18 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
for(int n = 0; n < incs.count(); ++n)
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
conf->addIncludePath(incs[n]);
|
conf->addIncludePath(incs[n]);
|
||||||
if(!libs.isEmpty())
|
//if(!libs.isEmpty())
|
||||||
conf->addLib(libs);
|
// conf->addLib(libs);
|
||||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||||
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());
|
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());
|
||||||
else
|
else
|
||||||
conf->addDefine("LIBTORRENT_0_15");
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -409,7 +440,15 @@ public:
|
|||||||
qc_libnotify(Conf *c) : ConfObj(c) {}
|
qc_libnotify(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libnotify >= 0.4.2 (optional)"; }
|
QString name() const { return "libnotify >= 0.4.2 (optional)"; }
|
||||||
QString shortname() const { return "libnotify"; }
|
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(){
|
bool exec(){
|
||||||
|
if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
QStringList incs;
|
QStringList incs;
|
||||||
QString req_ver = "0.4.2";
|
QString req_ver = "0.4.2";
|
||||||
QString version, libs, other;
|
QString version, libs, other;
|
||||||
@@ -452,7 +491,15 @@ public:
|
|||||||
qc_geoip_database(Conf *c) : ConfObj(c) {}
|
qc_geoip_database(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "GeoIP Database (optional)"; }
|
QString name() const { return "GeoIP Database (optional)"; }
|
||||||
QString shortname() const { return "GeoIP Database"; }
|
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() {
|
bool exec() {
|
||||||
|
if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#ifdef Q_WS_X11
|
#ifdef Q_WS_X11
|
||||||
if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) {
|
if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) {
|
||||||
#endif
|
#endif
|
||||||
@@ -461,9 +508,9 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
#ifdef Q_WS_X11
|
#ifdef Q_WS_X11
|
||||||
}
|
}
|
||||||
if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat"))
|
if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat") || QFile::exists("/var/lib/GeoIP/GeoIP.dat"))
|
||||||
return true;
|
return true;
|
||||||
printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat\nCountry resolution will be slow.");
|
printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat or /var/lib/GeoIP/GeoIP.dat\nCountry resolution will be slow.");
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -474,6 +521,9 @@ cat >$1/modules_new.cpp <<EOT
|
|||||||
o = new qc_qt4(conf);
|
o = new qc_qt4(conf);
|
||||||
o->required = true;
|
o->required = true;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
|
o = new qc_pkg_config(conf);
|
||||||
|
o->required = true;
|
||||||
|
o->disabled = false;
|
||||||
o = new qc_libtorrent_rasterbar(conf);
|
o = new qc_libtorrent_rasterbar(conf);
|
||||||
o->required = true;
|
o->required = true;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
@@ -1431,6 +1481,7 @@ export PREFIX
|
|||||||
export BINDIR
|
export BINDIR
|
||||||
export DATADIR
|
export DATADIR
|
||||||
export EX_QTDIR
|
export EX_QTDIR
|
||||||
|
export QC_DISABLE_GUI
|
||||||
export QC_WITH_LIBBOOST_INC
|
export QC_WITH_LIBBOOST_INC
|
||||||
export QC_DISABLE_libnotify
|
export QC_DISABLE_libnotify
|
||||||
export QC_DISABLE_geoip_database
|
export QC_DISABLE_geoip_database
|
||||||
|
44
doc/qbittorrent-nox.1
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
.\" 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
|
.\" This manpage has been automatically generated by docbook2man
|
||||||
.\" from a DocBook document. This tool can be found at:
|
.\" from a DocBook document. This tool can be found at:
|
||||||
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>.
|
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>.
|
||||||
.TH "QBITTORRENT" "1" "September 30th 2009" "Bittorrent client written in C++ / Qt4" ""
|
.TH "QBITTORRENT" "1" "January 16th 2010" "Bittorrent client written in C++ / Qt4" ""
|
||||||
|
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
qBittorrent \- a Bittorrent client written in C++ / Qt4
|
qBittorrent \- a Bittorrent client written in C++ / Qt4
|
||||||
|
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
|
|
||||||
\fBqbittorrent\fR [\-\-no-splash] [TORRENT_FILE | URL]...
|
\fBqbittorrent\fR [\-\-no-splash] [\-\-webui-port=x] [TORRENT_FILE | URL]...
|
||||||
|
|
||||||
\fBqbittorrent\fR \-\-help
|
\fBqbittorrent\fR \-\-help
|
||||||
|
|
||||||
@@ -18,10 +18,9 @@ qBittorrent \- a Bittorrent client written in C++ / Qt4
|
|||||||
.SH "DESCRIPTION"
|
.SH "DESCRIPTION"
|
||||||
|
|
||||||
\fBqBittorrent\fR is an advanced Bittorrent client written in C++ / Qt4,
|
\fBqBittorrent\fR is an advanced Bittorrent client written in C++ / Qt4,
|
||||||
using the \fBrblibtorrent\fR library by Arvid Norberg. qBittorrent aims
|
using the \fBlibtorrent-rasterbar\fR library by Arvid Norberg. qBittorrent is similar to uTorrent. qBittorrent
|
||||||
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.
|
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 (Azureus compatible),
|
It also comes with UPnP port forwarding / NAT-PMP, encryption (Vuze compatible),
|
||||||
FAST extension (mainline) and PeX support (utorrent compatible).
|
FAST extension (mainline) and PeX support (utorrent compatible).
|
||||||
|
|
||||||
.SH "OPTIONS"
|
.SH "OPTIONS"
|
||||||
@@ -32,6 +31,8 @@ FAST extension (mainline) and PeX support (utorrent compatible).
|
|||||||
|
|
||||||
\fB--no-splash\fR Disables splash screen on startup.
|
\fB--no-splash\fR Disables splash screen on startup.
|
||||||
|
|
||||||
|
\fB--webui-port=x\fR Changes Web UI port to x (default: 8080).
|
||||||
|
|
||||||
.SH "BUGS"
|
.SH "BUGS"
|
||||||
|
|
||||||
If you find a bug, please report it at http://bugs.qbittorrent.org
|
If you find a bug, please report it at http://bugs.qbittorrent.org
|
||||||
|
@@ -1,6 +1,4 @@
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
include(conf.pri)
|
|
||||||
|
|
||||||
SUBDIRS += src
|
SUBDIRS += src
|
||||||
|
|
||||||
|
@@ -6,6 +6,9 @@
|
|||||||
<dep type='qt4'>
|
<dep type='qt4'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
|
<dep type='pkg-config'>
|
||||||
|
<required/>
|
||||||
|
</dep>
|
||||||
<dep type='libtorrent-rasterbar'>
|
<dep type='libtorrent-rasterbar'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
|
@@ -11,7 +11,15 @@ public:
|
|||||||
qc_geoip_database(Conf *c) : ConfObj(c) {}
|
qc_geoip_database(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "GeoIP Database (optional)"; }
|
QString name() const { return "GeoIP Database (optional)"; }
|
||||||
QString shortname() const { return "GeoIP Database"; }
|
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() {
|
bool exec() {
|
||||||
|
if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#ifdef Q_WS_X11
|
#ifdef Q_WS_X11
|
||||||
if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) {
|
if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) {
|
||||||
#endif
|
#endif
|
||||||
@@ -20,9 +28,9 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
#ifdef Q_WS_X11
|
#ifdef Q_WS_X11
|
||||||
}
|
}
|
||||||
if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat"))
|
if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat") || QFile::exists("/var/lib/GeoIP/GeoIP.dat"))
|
||||||
return true;
|
return true;
|
||||||
printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat\nCountry resolution will be slow.");
|
printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat or /var/lib/GeoIP/GeoIP.dat\nCountry resolution will be slow.");
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@@ -10,7 +10,15 @@ public:
|
|||||||
qc_libnotify(Conf *c) : ConfObj(c) {}
|
qc_libnotify(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libnotify >= 0.4.2 (optional)"; }
|
QString name() const { return "libnotify >= 0.4.2 (optional)"; }
|
||||||
QString shortname() const { return "libnotify"; }
|
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(){
|
bool exec(){
|
||||||
|
if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
QStringList incs;
|
QStringList incs;
|
||||||
QString req_ver = "0.4.2";
|
QString req_ver = "0.4.2";
|
||||||
QString version, libs, other;
|
QString version, libs, other;
|
||||||
|
@@ -8,11 +8,11 @@ class qc_libtorrent_rasterbar : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.15.0 advised)"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14.4"; }
|
||||||
QString shortname() const { return "libtorrent-rasterbar"; }
|
QString shortname() const { return "libtorrent-rasterbar"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QStringList incs;
|
QStringList incs;
|
||||||
QString req_ver = "0.14.0";
|
QString req_ver = "0.14.4";
|
||||||
QString adv_ver = "0.15.0";
|
QString adv_ver = "0.15.0";
|
||||||
QString version, libs, other;
|
QString version, libs, other;
|
||||||
VersionMode mode = VersionMin;
|
VersionMode mode = VersionMin;
|
||||||
@@ -20,12 +20,18 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
for(int n = 0; n < incs.count(); ++n)
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
conf->addIncludePath(incs[n]);
|
conf->addIncludePath(incs[n]);
|
||||||
if(!libs.isEmpty())
|
//if(!libs.isEmpty())
|
||||||
conf->addLib(libs);
|
// conf->addLib(libs);
|
||||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||||
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());
|
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());
|
||||||
else
|
else
|
||||||
conf->addDefine("LIBTORRENT_0_15");
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
16
qcm/pkg-config.qcm
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
-----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,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.4
|
name: Qt >= 4.4
|
||||||
|
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_qt4 : public ConfObj
|
class qc_qt4 : public ConfObj
|
||||||
@@ -11,10 +12,9 @@ public:
|
|||||||
QString shortname() const { return "Qt 4.4"; }
|
QString shortname() const { return "Qt 4.4"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
if(QT_VERSION >= 0x040500) {
|
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
conf->addDefine("QT_4_5");
|
conf->addDefine("DISABLE_GUI");
|
||||||
}
|
}
|
||||||
return(QT_VERSION >= 0x040400);
|
return(QT_VERSION >= 0x040400);
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
182
src/GUI.cpp
196
src/GUI.h
@@ -55,108 +55,116 @@ class TransferListFiltersWidget;
|
|||||||
class QSplitter;
|
class QSplitter;
|
||||||
class PropertiesWidget;
|
class PropertiesWidget;
|
||||||
class StatusBar;
|
class StatusBar;
|
||||||
|
class consoleDlg;
|
||||||
|
class about;
|
||||||
|
class createtorrent;
|
||||||
|
class downloadFromURL;
|
||||||
|
|
||||||
class GUI : public QMainWindow, private Ui::MainWindow{
|
class GUI : public QMainWindow, private Ui::MainWindow{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
public:
|
||||||
// Bittorrent
|
// Construct / Destruct
|
||||||
Bittorrent *BTSession;
|
GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList());
|
||||||
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
~GUI();
|
||||||
// GUI related
|
// Methods
|
||||||
QTimer *guiUpdater;
|
int getCurrentTabIndex() const;
|
||||||
QTabWidget *tabs;
|
TransferListWidget* getTransferList() const { return transferList; }
|
||||||
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;
|
|
||||||
|
|
||||||
protected slots:
|
public slots:
|
||||||
// GUI related slots
|
void trackerAuthenticationRequired(QTorrentHandle& h);
|
||||||
void dropEvent(QDropEvent *event);
|
void setTabText(int index, QString text) const;
|
||||||
void dragEnterEvent(QDragEnterEvent *event);
|
void showNotificationBaloon(QString title, QString msg) const;
|
||||||
void toggleVisibility(QSystemTrayIcon::ActivationReason e);
|
void downloadFromURLList(const QStringList& urls);
|
||||||
void on_actionAbout_triggered();
|
void updateAltSpeedsBtn(bool alternative);
|
||||||
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;
|
||||||
|
// Options slots
|
||||||
|
void on_actionOptions_triggered();
|
||||||
|
void optionsSaved();
|
||||||
|
// HTTP slots
|
||||||
|
void on_actionDownload_from_URL_triggered();
|
||||||
|
|
||||||
public slots:
|
protected:
|
||||||
void trackerAuthenticationRequired(QTorrentHandle& h);
|
void closeEvent(QCloseEvent *);
|
||||||
void setTabText(int index, QString text) const;
|
void showEvent(QShowEvent *);
|
||||||
void showNotificationBaloon(QString title, QString msg) const;
|
bool event(QEvent * event);
|
||||||
|
void displayRSSTab(bool enable);
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
void closeEvent(QCloseEvent *);
|
// Bittorrent
|
||||||
void showEvent(QShowEvent *);
|
Bittorrent *BTSession;
|
||||||
bool event(QEvent * event);
|
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
||||||
void displayRSSTab(bool enable);
|
// GUI related
|
||||||
|
QTimer *guiUpdater;
|
||||||
public:
|
QTabWidget *tabs;
|
||||||
// Construct / Destruct
|
StatusBar *status_bar;
|
||||||
GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList());
|
QPointer<options_imp> options;
|
||||||
~GUI();
|
QPointer<consoleDlg> console;
|
||||||
// Methods
|
QPointer<about> aboutDlg;
|
||||||
int getCurrentTabIndex() const;
|
QPointer<createtorrent> createTorrentDlg;
|
||||||
QPoint screenCenter() const;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Before Width: | Height: | Size: 496 B After Width: | Height: | Size: 459 B |
Before Width: | Height: | Size: 743 B |
Before Width: | Height: | Size: 659 B |
BIN
src/Icons/oxygen/chronometer.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
src/Icons/oxygen/feed-subscribe.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
src/Icons/oxygen/folder-documents.png
Normal file
After Width: | Height: | Size: 409 B |
BIN
src/Icons/oxygen/gear32.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
src/Icons/oxygen/services.png
Normal file
After Width: | Height: | Size: 722 B |
@@ -1,6 +1,6 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Categories=Qt;Network;P2P;
|
Categories=Qt;Network;P2P;
|
||||||
Comment=V2.0.0
|
Comment=V2.2.0
|
||||||
Exec=qbittorrent %f
|
Exec=qbittorrent %f
|
||||||
GenericName=Bittorrent client
|
GenericName=Bittorrent client
|
||||||
GenericName[bg]=Торент клиент
|
GenericName[bg]=Торент клиент
|
||||||
@@ -21,7 +21,7 @@ GenericName[pt_BR]=Cliente Bittorrent
|
|||||||
GenericName[ro]=Client Bittorrent
|
GenericName[ro]=Client Bittorrent
|
||||||
GenericName[ru]=клиент Bittorrent
|
GenericName[ru]=клиент Bittorrent
|
||||||
GenericName[sk]=Klient siete Bittorrent
|
GenericName[sk]=Klient siete Bittorrent
|
||||||
GenericName[sr]=БитТоррент клијент
|
GenericName[sr]=Bittorrent-клијент
|
||||||
GenericName[sv]=Bittorrent-klient
|
GenericName[sv]=Bittorrent-klient
|
||||||
GenericName[tr]=Bittorrent istemcisi
|
GenericName[tr]=Bittorrent istemcisi
|
||||||
GenericName[uk]=Bittorrent-клієнт
|
GenericName[uk]=Bittorrent-клієнт
|
||||||
|
BIN
src/Icons/skin/disconnected.png
Executable file
After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
BIN
src/Icons/slow.png
Normal file
After Width: | Height: | Size: 910 B |
BIN
src/Icons/slow48.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
src/Icons/slow_off.png
Normal file
After 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(tr("I would like to thank the following people who volunteered to translate qBittorrent:")+QString::fromUtf8("<br>"));
|
||||||
te_translation->append(QString::fromUtf8(
|
te_translation->append(QString::fromUtf8(
|
||||||
"<i>- <u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)<br>\
|
"<i>- <u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)<br>\
|
||||||
- <u>Bulgarian:</u> Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)<br>\
|
- <u>Bulgarian:</u> Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)<br>\
|
||||||
- <u>Catalan:</u> Gekko Dam Beer (gekko04@users.sourceforge.net)<br>\
|
- <u>Catalan:</u> Francisco Luque Contreras (frannoe@ya.com)<br>\
|
||||||
- <u>Chinese (Simplified):</u> Guo Yue (yue.guo0418@gmail.com)<br>\
|
- <u>Chinese (Simplified):</u> Guo Yue (yue.guo0418@gmail.com)<br>\
|
||||||
- <u>Chinese (Traditional):</u> Yi-Shun Wang (dnextstep@gmail.com)<br>\
|
- <u>Chinese (Traditional):</u> Yi-Shun Wang (dnextstep@gmail.com)<br>\
|
||||||
- <u>Czech:</u> Jirka Vilim (web@tets.cz)<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>Greek:</u> Tsvetan Bankov (emerge_life@users.sourceforge.net)<br>\
|
||||||
- <u>Hungarian:</u> Majoros Péter (majoros.peterj@gmail.com)<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>Italian:</u> Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)<br>\
|
||||||
- <u>Japanese:</u> Nardog (nardog@e2umail.com)<br>\
|
- <u>Japanese:</u> Nardog (alphisation@gmail.com)<br>\
|
||||||
- <u>Korean:</u> Jin Woo Sin (jin828sin@users.sourceforge.net)<br>\
|
- <u>Korean:</u> Jin Woo Sin (jin828sin@users.sourceforge.net)<br>\
|
||||||
- <u>Norwegian:</u> Lars-Erik Labori (hamil@users.sourceforge.net)<br>\
|
- <u>Norwegian:</u> Lars-Erik Labori (hamil@users.sourceforge.net)<br>\
|
||||||
- <u>Polish:</u> Mariusz Fik (fisiu@opensuse.org)<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>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>Serbian:</u> Anaximandar Milet (anaximandar@operamail.com)<br>\
|
||||||
- <u>Slovak:</u> helix84<br>\
|
- <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>Spanish:</u> Francisco Luque Contreras (frannoe@ya.com)<br>\
|
||||||
- <u>Swedish:</u> Daniel Nylander (po@danielnylander.se)<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>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>"));
|
- <u>Ukrainian:</u> Andrey Shpachenko (masterfix@users.sourceforge.net) and Oleh Prypin (blaxpirit@gmail.com)<br><br>"));
|
||||||
te_translation->append(tr("Please contact me if you would like to translate qBittorrent into your own language."));
|
te_translation->append(tr("Please contact me if you would like to translate qBittorrent into your own language."));
|
||||||
te_translation->scrollToAnchor(QString::fromUtf8("top"));
|
te_translation->scrollToAnchor(QString::fromUtf8("top"));
|
||||||
// License
|
// License
|
||||||
|
146
src/advancedsettings.h
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
#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
|
111
src/bandwidthscheduler.h
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#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
|