Compare commits
1770 Commits
release-3.
...
release-4.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d2f3d1ec2c | ||
|
|
bc6e3ae40d | ||
|
|
b02e239f7c | ||
|
|
397cd4bf60 | ||
|
|
409f972ad3 | ||
|
|
267961ffca | ||
|
|
dff753c452 | ||
|
|
ce3bafd30d | ||
|
|
e5538d9f25 | ||
|
|
7a8a32b1c3 | ||
|
|
cac5e0391b | ||
|
|
726790fa93 | ||
|
|
c9c7a5be53 | ||
|
|
1495513cfc | ||
|
|
085afaac14 | ||
|
|
d58a54c758 | ||
|
|
78d9bcb6a1 | ||
|
|
1a43cd329d | ||
|
|
2fe687eeca | ||
|
|
107bd8a54f | ||
|
|
865df3fcf1 | ||
|
|
cbf9c52462 | ||
|
|
171e25e962 | ||
|
|
239d14fd10 | ||
|
|
0b7a175156 | ||
|
|
b37dbb60b5 | ||
|
|
d5acd1f210 | ||
|
|
65eda4a68e | ||
|
|
7209881025 | ||
|
|
a5d0a4b619 | ||
|
|
79276a8786 | ||
|
|
fa2b645a64 | ||
|
|
4d5d6df734 | ||
|
|
2c39b69c18 | ||
|
|
13c0077e95 | ||
|
|
9299e3f371 | ||
|
|
b9ddc6ee86 | ||
|
|
276856a614 | ||
|
|
fbd6a8a0da | ||
|
|
6fc18b4af6 | ||
|
|
44d633fb68 | ||
|
|
eb4bf6cc68 | ||
|
|
6db6c850eb | ||
|
|
02ae1e3734 | ||
|
|
eb887139fd | ||
|
|
84805f7fb8 | ||
|
|
2719131ed2 | ||
|
|
52401bd2b0 | ||
|
|
4834703bc4 | ||
|
|
3ed73244b1 | ||
|
|
97cd430125 | ||
|
|
d202b85d51 | ||
|
|
c51b79e9fc | ||
|
|
4449018207 | ||
|
|
ced8e41473 | ||
|
|
2c66ed6708 | ||
|
|
c7d3d6ac90 | ||
|
|
13210b3e9f | ||
|
|
6e622fc23b | ||
|
|
ae35111b59 | ||
|
|
e1c3d419a7 | ||
|
|
7396b8adba | ||
|
|
c09001545d | ||
|
|
f8d4315f7e | ||
|
|
1fa2957d27 | ||
|
|
ade50d2b53 | ||
|
|
0fa1d35b87 | ||
|
|
6486fc5f4d | ||
|
|
1e059ab1a2 | ||
|
|
15b137211b | ||
|
|
6f8f1d7bad | ||
|
|
a31f0c0a3d | ||
|
|
f977d1293a | ||
|
|
1399be50cb | ||
|
|
52dcf32cc8 | ||
|
|
52b2b807ab | ||
|
|
5cf4f00824 | ||
|
|
faa6fad025 | ||
|
|
9f94bbce3a | ||
|
|
5c49b2486c | ||
|
|
4f6e7f97c6 | ||
|
|
7751c5b75c | ||
|
|
a1a9f3317b | ||
|
|
fb20f59a96 | ||
|
|
a15e3407b0 | ||
|
|
e267c2d37a | ||
|
|
ae32edeb26 | ||
|
|
34d38ef466 | ||
|
|
120ee6b836 | ||
|
|
7d25b6fce2 | ||
|
|
068eff9e9f | ||
|
|
31a55f79f1 | ||
|
|
bac032e01c | ||
|
|
b809941f02 | ||
|
|
77c3758090 | ||
|
|
5758817189 | ||
|
|
acc9f08a05 | ||
|
|
f3b7f17a7c | ||
|
|
dfc3f047e2 | ||
|
|
223ab7de84 | ||
|
|
d2a4027347 | ||
|
|
4594895082 | ||
|
|
e457223fcd | ||
|
|
8fc25c4524 | ||
|
|
410e133592 | ||
|
|
e114bc7ef6 | ||
|
|
6ac57cb24c | ||
|
|
2b7893adc8 | ||
|
|
84b8832d57 | ||
|
|
0e738b534c | ||
|
|
96ce8690b6 | ||
|
|
a23698940c | ||
|
|
50bb733293 | ||
|
|
6420157b55 | ||
|
|
86bdfbf88c | ||
|
|
81e8f79164 | ||
|
|
64a0ad33c1 | ||
|
|
3cd0ffecaf | ||
|
|
a2ddabaedb | ||
|
|
1fec1978aa | ||
|
|
8de67fd745 | ||
|
|
3b51582416 | ||
|
|
ffa2fdce9d | ||
|
|
588f1c7592 | ||
|
|
ab1ece2460 | ||
|
|
7a935d8a87 | ||
|
|
3926eba585 | ||
|
|
74bf420610 | ||
|
|
324f18a0b2 | ||
|
|
c134e391e6 | ||
|
|
24504951b0 | ||
|
|
f7f02ab16a | ||
|
|
fe810fcd37 | ||
|
|
17167e79d2 | ||
|
|
7bd86048a8 | ||
|
|
d399f024a7 | ||
|
|
21f06abef8 | ||
|
|
fbe0e96fd5 | ||
|
|
94e00dd38d | ||
|
|
c3f5432877 | ||
|
|
4dcc187a72 | ||
|
|
97c99dfaaf | ||
|
|
da83041a3f | ||
|
|
d40a4f14dd | ||
|
|
de7b0278f4 | ||
|
|
17f5e10ffc | ||
|
|
a0dbb6c97c | ||
|
|
4d330a6110 | ||
|
|
9fc2bf6353 | ||
|
|
f9c7121847 | ||
|
|
d3a0ac3b6e | ||
|
|
a6c99844de | ||
|
|
d51a957247 | ||
|
|
a0c16cd461 | ||
|
|
8fe11dff91 | ||
|
|
efcdcf5898 | ||
|
|
da543cdae2 | ||
|
|
0374742e57 | ||
|
|
408052d1ec | ||
|
|
b0ebbc3596 | ||
|
|
e45e1166b2 | ||
|
|
de64d5c3bc | ||
|
|
07130c4b26 | ||
|
|
8482464ad0 | ||
|
|
d7ce6e39d4 | ||
|
|
97acbd5259 | ||
|
|
60937a1871 | ||
|
|
ed43bc377d | ||
|
|
8d11929815 | ||
|
|
0e6f8c15c5 | ||
|
|
8107201a5b | ||
|
|
395ea4d1d0 | ||
|
|
7bf317929b | ||
|
|
3cacf876c9 | ||
|
|
d6247dd4ec | ||
|
|
4f0c49f1c4 | ||
|
|
30455e8b01 | ||
|
|
60adb94463 | ||
|
|
a02fd5b588 | ||
|
|
39ce080318 | ||
|
|
f53abd2f07 | ||
|
|
5b0ae0271b | ||
|
|
ec2efd8c62 | ||
|
|
146daea513 | ||
|
|
5ab67faacb | ||
|
|
4213d37857 | ||
|
|
0192922910 | ||
|
|
d2b88e9f84 | ||
|
|
a32c4aca92 | ||
|
|
91d41336a7 | ||
|
|
d73d790612 | ||
|
|
af0fed6669 | ||
|
|
a24c13b902 | ||
|
|
c44c6a8d88 | ||
|
|
5f62a68e71 | ||
|
|
5af90fee46 | ||
|
|
b17566f113 | ||
|
|
29edea050b | ||
|
|
7ceb646e90 | ||
|
|
0ff39e4d10 | ||
|
|
1e146c94bd | ||
|
|
8a0da04807 | ||
|
|
9e7a847cce | ||
|
|
63d3f20e51 | ||
|
|
817e3fbb05 | ||
|
|
263e96aba2 | ||
|
|
0379376fd8 | ||
|
|
de7efb50c2 | ||
|
|
400f8dc2d8 | ||
|
|
b2b63be798 | ||
|
|
c9aba893de | ||
|
|
1ac4cdcf4d | ||
|
|
08a0fef18a | ||
|
|
6f54c170ab | ||
|
|
d3b4c7bec4 | ||
|
|
f8dfe1ea57 | ||
|
|
ce5f8bab44 | ||
|
|
59cf70f8f2 | ||
|
|
561975f435 | ||
|
|
eae6fea830 | ||
|
|
2673c2b5b2 | ||
|
|
3c17f3a836 | ||
|
|
0890154e16 | ||
|
|
0877824875 | ||
|
|
60bd5999b0 | ||
|
|
d0ec60fa01 | ||
|
|
e7a70a4acc | ||
|
|
85cb49e8e1 | ||
|
|
3f00a6e5e3 | ||
|
|
35e18a2e09 | ||
|
|
8ae2ae3b5c | ||
|
|
27c5f2aede | ||
|
|
34a69aa0b2 | ||
|
|
72fc903f4a | ||
|
|
4f04992de8 | ||
|
|
1b147494d4 | ||
|
|
b535a0b44e | ||
|
|
6c2271584c | ||
|
|
1002b28c95 | ||
|
|
dfded7bc9d | ||
|
|
36fde9ede5 | ||
|
|
6b4ac1b960 | ||
|
|
cc141ba02f | ||
|
|
8fc931a61b | ||
|
|
0b6cf54508 | ||
|
|
ff12163176 | ||
|
|
6a8a0bbd6b | ||
|
|
f8ebffac65 | ||
|
|
e58f4c0bdf | ||
|
|
f450ff278d | ||
|
|
566fd893f4 | ||
|
|
30ab46999c | ||
|
|
0320f9d5b5 | ||
|
|
ad7c9ed123 | ||
|
|
25acdba344 | ||
|
|
786059802b | ||
|
|
0ae708114b | ||
|
|
fbeaabb841 | ||
|
|
98bef605a7 | ||
|
|
37a0e48b46 | ||
|
|
fea1a66aba | ||
|
|
0ffdb51f95 | ||
|
|
4e596629fd | ||
|
|
61281dd226 | ||
|
|
61d1f2180f | ||
|
|
3bcf941205 | ||
|
|
1746c9d331 | ||
|
|
58c31c5353 | ||
|
|
e872719ef1 | ||
|
|
dcba10f01b | ||
|
|
5bc3b0138e | ||
|
|
1aa3c69916 | ||
|
|
e7ee59c12f | ||
|
|
24a69a9fe7 | ||
|
|
7b4316ea8f | ||
|
|
802cd89ec9 | ||
|
|
aa1ddc0df2 | ||
|
|
11b44407af | ||
|
|
962e5a8f3d | ||
|
|
e73db85fad | ||
|
|
ec16525164 | ||
|
|
1f9eb594e7 | ||
|
|
c964f0c490 | ||
|
|
d25467d3e6 | ||
|
|
b6ce109cdb | ||
|
|
c614c66535 | ||
|
|
b3004ac28b | ||
|
|
c4b9063767 | ||
|
|
a6bb642200 | ||
|
|
22ea0be917 | ||
|
|
934133772e | ||
|
|
07780b48c5 | ||
|
|
0532d546d7 | ||
|
|
18651c8d01 | ||
|
|
55e038b165 | ||
|
|
23616d5dd0 | ||
|
|
3aff71020f | ||
|
|
f345d0f136 | ||
|
|
d397cf60fb | ||
|
|
28f336f5bd | ||
|
|
be61e8f2fd | ||
|
|
448d937c15 | ||
|
|
3d970399d4 | ||
|
|
228f82bcdc | ||
|
|
aaf78f09c2 | ||
|
|
7a478424cc | ||
|
|
e66dba6a2d | ||
|
|
247d07edb9 | ||
|
|
29945f5aa7 | ||
|
|
ff710ebd2c | ||
|
|
a22d2f0139 | ||
|
|
db2dec3d28 | ||
|
|
726e9f0774 | ||
|
|
8e6df572a8 | ||
|
|
57493c5556 | ||
|
|
30bf6e958f | ||
|
|
f2e771ddc0 | ||
|
|
6b65f8add8 | ||
|
|
8318f72a9e | ||
|
|
59bbf2c6c6 | ||
|
|
11f5738d99 | ||
|
|
62be2d7400 | ||
|
|
7f37b80801 | ||
|
|
2d119c3e9d | ||
|
|
b97d098a85 | ||
|
|
6dccab5797 | ||
|
|
8150805312 | ||
|
|
a7f4ea8b18 | ||
|
|
cd5a55d711 | ||
|
|
aa947ee966 | ||
|
|
91f528bc96 | ||
|
|
53017d5cde | ||
|
|
741d87cb91 | ||
|
|
4d28f8f48d | ||
|
|
1a506ac582 | ||
|
|
13a8c84bbd | ||
|
|
3181469d87 | ||
|
|
467e516801 | ||
|
|
70ae05c3de | ||
|
|
7d030b4cd9 | ||
|
|
a77e1c9f36 | ||
|
|
dee0b63cc5 | ||
|
|
c2a2d306da | ||
|
|
34c29b78f9 | ||
|
|
8c98c8cb3f | ||
|
|
fc543b9db6 | ||
|
|
793ed7148f | ||
|
|
de74f9298f | ||
|
|
4ab117d946 | ||
|
|
d88f0f36e0 | ||
|
|
fd05f5dec5 | ||
|
|
e00c96df99 | ||
|
|
fff6640127 | ||
|
|
574fed04fc | ||
|
|
66aeafdc63 | ||
|
|
4a1ed9ff0e | ||
|
|
8419ca87f9 | ||
|
|
15fb72275a | ||
|
|
10b10b10b8 | ||
|
|
d3912b5600 | ||
|
|
63566b45d0 | ||
|
|
8c0577862b | ||
|
|
6f6a17341f | ||
|
|
c13af881d9 | ||
|
|
c503583046 | ||
|
|
45c21f62f9 | ||
|
|
cdb8f4bc61 | ||
|
|
b5c0d90e9c | ||
|
|
087856d3d8 | ||
|
|
4021bf68f7 | ||
|
|
02f77a05dc | ||
|
|
080dd79875 | ||
|
|
475348595c | ||
|
|
34c7465009 | ||
|
|
ace68d4961 | ||
|
|
72cb868224 | ||
|
|
c2f9f57ef4 | ||
|
|
8c589b8579 | ||
|
|
3a87af7372 | ||
|
|
d3ccbe4f86 | ||
|
|
1b9882b3a3 | ||
|
|
70d0fb741f | ||
|
|
4a4e3a13e6 | ||
|
|
ff80208534 | ||
|
|
a8bcc2ee52 | ||
|
|
74cecb1b6c | ||
|
|
1ac7d779a7 | ||
|
|
a585b02e76 | ||
|
|
d8083dd985 | ||
|
|
bd90614413 | ||
|
|
e3671050d1 | ||
|
|
146b0b91f0 | ||
|
|
dedd31ada5 | ||
|
|
ae5932a573 | ||
|
|
20f6bf817e | ||
|
|
c618214061 | ||
|
|
6d9eec0e71 | ||
|
|
b6080c19c2 | ||
|
|
c456b9a42c | ||
|
|
3933790bda | ||
|
|
0940a8a764 | ||
|
|
f35a5c8085 | ||
|
|
712e6a0e5c | ||
|
|
1f9ccb44a3 | ||
|
|
92decf83b8 | ||
|
|
7eed1a108e | ||
|
|
7e87eeb2d4 | ||
|
|
60524348f0 | ||
|
|
9f2fe2b678 | ||
|
|
a4141fd151 | ||
|
|
7de1aba092 | ||
|
|
d277696acc | ||
|
|
2e8c01d88c | ||
|
|
908481885c | ||
|
|
386b93bb0f | ||
|
|
8efcc335de | ||
|
|
009798f690 | ||
|
|
6bab30a178 | ||
|
|
ced52e3269 | ||
|
|
03b2decab6 | ||
|
|
47960b2592 | ||
|
|
b82edc561f | ||
|
|
e99e88bbe7 | ||
|
|
72da2e7252 | ||
|
|
494601ea75 | ||
|
|
9fc6de77ca | ||
|
|
659dd3285b | ||
|
|
d8c0a40b1f | ||
|
|
562080de69 | ||
|
|
c3b1c57d67 | ||
|
|
7f089db942 | ||
|
|
ebc50a7237 | ||
|
|
15ef4fcc56 | ||
|
|
ce36a7ca62 | ||
|
|
5529a7713c | ||
|
|
b8d2fef653 | ||
|
|
309ae0b4e9 | ||
|
|
d302e4fb92 | ||
|
|
4b48f7b8d9 | ||
|
|
2702410572 | ||
|
|
e24b565857 | ||
|
|
fad3af27ca | ||
|
|
7302042daf | ||
|
|
927ecc7075 | ||
|
|
4ddb340a94 | ||
|
|
a2ab6fa8ab | ||
|
|
c4ccf6b774 | ||
|
|
9ba00d7035 | ||
|
|
08a6c75227 | ||
|
|
f4a6242711 | ||
|
|
0838f64311 | ||
|
|
8ca730f0d8 | ||
|
|
d80abeb10f | ||
|
|
2e4c3b1901 | ||
|
|
71ce193f5a | ||
|
|
32551b8e6c | ||
|
|
0f7eabfa4b | ||
|
|
4d53d8d1ba | ||
|
|
a18b3bea03 | ||
|
|
44f8a48d73 | ||
|
|
3cc1b11025 | ||
|
|
aea887a30f | ||
|
|
7cf1d844b0 | ||
|
|
954f05b4a9 | ||
|
|
3fb8ff281f | ||
|
|
1b5852ad0b | ||
|
|
b9403774e6 | ||
|
|
b18bf48014 | ||
|
|
51e3e5438b | ||
|
|
0939875ca8 | ||
|
|
a2d5d48aff | ||
|
|
92a7479e2d | ||
|
|
5c10a24923 | ||
|
|
bc18bf1ab4 | ||
|
|
d5af8722a6 | ||
|
|
114c9a8421 | ||
|
|
73c37cc460 | ||
|
|
14f50f1038 | ||
|
|
d9555a9e9d | ||
|
|
5d33399000 | ||
|
|
33979cb41c | ||
|
|
e82a1522c8 | ||
|
|
e00be240b0 | ||
|
|
b360c5453b | ||
|
|
ce77ebdfe1 | ||
|
|
f3658daf72 | ||
|
|
a997b7d078 | ||
|
|
f211b238c4 | ||
|
|
692e4a986a | ||
|
|
c44efbd965 | ||
|
|
fbda237cc4 | ||
|
|
26f645bd6c | ||
|
|
a4d2df575e | ||
|
|
1d3dbcb9d2 | ||
|
|
5dc54aa224 | ||
|
|
72a54910e9 | ||
|
|
a2f82be6c2 | ||
|
|
13b04f8d2d | ||
|
|
bdca55f15c | ||
|
|
8a6d8f3953 | ||
|
|
cb678a254d | ||
|
|
78d6b14fe8 | ||
|
|
446b3307f9 | ||
|
|
b4baeaaf23 | ||
|
|
42c17ea5ce | ||
|
|
3739bcc270 | ||
|
|
b9e8cab1e5 | ||
|
|
4d4097d819 | ||
|
|
94909d9b92 | ||
|
|
5b59b18606 | ||
|
|
7320ac1bc0 | ||
|
|
30081e0356 | ||
|
|
d61fc7e820 | ||
|
|
a36848b5c0 | ||
|
|
f8debdea67 | ||
|
|
a4d5ac4b17 | ||
|
|
e38829218e | ||
|
|
9f98f9f7ac | ||
|
|
1a099fa742 | ||
|
|
e075274177 | ||
|
|
706097ddda | ||
|
|
b1f1823c65 | ||
|
|
0addeafc6b | ||
|
|
44c5a9beff | ||
|
|
e177799ada | ||
|
|
76e3383650 | ||
|
|
c37d90bf6d | ||
|
|
722c928ab5 | ||
|
|
2d3914c077 | ||
|
|
4e37688105 | ||
|
|
f53a403a7b | ||
|
|
ec08cb5445 | ||
|
|
fc0c28d376 | ||
|
|
6540dfa528 | ||
|
|
69cb67e6e5 | ||
|
|
cf462ae448 | ||
|
|
da581dee41 | ||
|
|
1808f0e614 | ||
|
|
3e964212ac | ||
|
|
c1e3e2a745 | ||
|
|
7bc81ead8c | ||
|
|
7d1ac06ce2 | ||
|
|
1fbf121506 | ||
|
|
f36e891010 | ||
|
|
bd2f69a9d6 | ||
|
|
6f6fe626a1 | ||
|
|
fb9ebce9c6 | ||
|
|
2258e4d5ed | ||
|
|
73047e3c84 | ||
|
|
933f9f1451 | ||
|
|
46abe42a54 | ||
|
|
a902eb6b2b | ||
|
|
de54fa2c30 | ||
|
|
7eaa5987c8 | ||
|
|
67f44e03a2 | ||
|
|
4ea9a2f07e | ||
|
|
90c6bb6054 | ||
|
|
eba41978b0 | ||
|
|
6bcb07649e | ||
|
|
893ce32f1d | ||
|
|
a1cad86bbf | ||
|
|
b3c73b7868 | ||
|
|
0a5bb6685f | ||
|
|
e8f6149a6d | ||
|
|
e91a5f6a5a | ||
|
|
5e50d8ed91 | ||
|
|
172991e068 | ||
|
|
c4e16aa820 | ||
|
|
93df0ef1d1 | ||
|
|
70f1153413 | ||
|
|
160b7ff2d3 | ||
|
|
c56b4a25bc | ||
|
|
818dcce462 | ||
|
|
98415917c6 | ||
|
|
71cf25ae99 | ||
|
|
c50cee8feb | ||
|
|
a78a1a9c64 | ||
|
|
74fb070e78 | ||
|
|
335443e6a0 | ||
|
|
d5d946dd66 | ||
|
|
b71ee80ecd | ||
|
|
fd7e69e1e0 | ||
|
|
51cf6bd2a5 | ||
|
|
59e6a4298d | ||
|
|
6764de8ef0 | ||
|
|
71814885aa | ||
|
|
abfcfb5af0 | ||
|
|
8f6e04d779 | ||
|
|
f53dab8ad4 | ||
|
|
05ab9fc355 | ||
|
|
df1a8bfdea | ||
|
|
46ac5e0ee2 | ||
|
|
3a3125ea2b | ||
|
|
e433cbab97 | ||
|
|
c799923d7d | ||
|
|
711be50e9c | ||
|
|
4c6059c352 | ||
|
|
032eb12585 | ||
|
|
3cdc6fb978 | ||
|
|
b894d886ec | ||
|
|
e1adfde66e | ||
|
|
c865ba2803 | ||
|
|
f259bde275 | ||
|
|
51104a9fb4 | ||
|
|
a886dbf8ab | ||
|
|
989a70fe60 | ||
|
|
98cec6a495 | ||
|
|
090a2edc1a | ||
|
|
41628dd5f6 | ||
|
|
fa64f33c2a | ||
|
|
ead1f6e1f6 | ||
|
|
14e168039c | ||
|
|
5d0cfc7475 | ||
|
|
339b35c369 | ||
|
|
91e7e94820 | ||
|
|
8218ec1bd1 | ||
|
|
cfb07b3d5b | ||
|
|
0b5de9ff54 | ||
|
|
a35c6426ab | ||
|
|
617f19e599 | ||
|
|
302c8ba850 | ||
|
|
94b496354b | ||
|
|
4600e679d1 | ||
|
|
129172453b | ||
|
|
7d36c81949 | ||
|
|
6cb2f05a6c | ||
|
|
829e1399ca | ||
|
|
4b2266a8e2 | ||
|
|
9496b2a159 | ||
|
|
0b28fb6c6b | ||
|
|
41a63718c9 | ||
|
|
01325ee7de | ||
|
|
f99ba03177 | ||
|
|
b06080e2e7 | ||
|
|
ae0a9d74c4 | ||
|
|
2045c38005 | ||
|
|
4e1b7c3b87 | ||
|
|
34798399da | ||
|
|
97d52668cc | ||
|
|
c32cee8098 | ||
|
|
018574e546 | ||
|
|
48b0cf8a48 | ||
|
|
ae0ec716cb | ||
|
|
c27108c97a | ||
|
|
56436d3f97 | ||
|
|
d702b32e53 | ||
|
|
22178f9997 | ||
|
|
6d7d566cdf | ||
|
|
d413bc65ef | ||
|
|
4b2d8a7941 | ||
|
|
21a72c651f | ||
|
|
ecd67b9d75 | ||
|
|
07af8c9648 | ||
|
|
a8d95dd8bd | ||
|
|
0710a59bf5 | ||
|
|
0bf7fa15c1 | ||
|
|
44b6cb28f6 | ||
|
|
d5414631c3 | ||
|
|
0f746ffd5a | ||
|
|
f3338263ea | ||
|
|
44996b4c6b | ||
|
|
bbe8184abe | ||
|
|
d1ee54f6ea | ||
|
|
f4bd3d2868 | ||
|
|
7f346b49a7 | ||
|
|
05d8c46bb0 | ||
|
|
35ab86d32f | ||
|
|
ec274157d7 | ||
|
|
6ad8a4d8b1 | ||
|
|
5490c54f8d | ||
|
|
fe056e7fc0 | ||
|
|
e40444d1ad | ||
|
|
50f0ba4f7a | ||
|
|
84cdd2e061 | ||
|
|
be7facdfaf | ||
|
|
ca8ea73ddb | ||
|
|
1111ca9d90 | ||
|
|
a79099fc52 | ||
|
|
812bd4c83a | ||
|
|
a86f189f53 | ||
|
|
59556dfc6a | ||
|
|
86e82c71e5 | ||
|
|
851fb8d3de | ||
|
|
2e3aaf3428 | ||
|
|
f3d6ae3433 | ||
|
|
4a0244ae88 | ||
|
|
40948ab652 | ||
|
|
b2528f7573 | ||
|
|
d4f30030a6 | ||
|
|
027607490a | ||
|
|
829ad2e1e6 | ||
|
|
b4d474b770 | ||
|
|
d2e02605e9 | ||
|
|
b271fa9f00 | ||
|
|
5de505acfe | ||
|
|
faaafce35b | ||
|
|
0d3c670728 | ||
|
|
b779330163 | ||
|
|
5958585e3a | ||
|
|
5fb3b4639c | ||
|
|
3dba24bfe0 | ||
|
|
10f2fbdd17 | ||
|
|
ec0771448c | ||
|
|
272d53fdf8 | ||
|
|
4e48408eaa | ||
|
|
e26b30a5f4 | ||
|
|
e4d6fe2d02 | ||
|
|
e9bd75f4e1 | ||
|
|
7d19ee2e59 | ||
|
|
8a106314ff | ||
|
|
17e6eba50a | ||
|
|
b2ff058bc0 | ||
|
|
5c0bf86405 | ||
|
|
f904cfa32d | ||
|
|
6fae4e6e5c | ||
|
|
db3158c410 | ||
|
|
5a57f2ef64 | ||
|
|
9eb01fbe4d | ||
|
|
61efc76b82 | ||
|
|
3091e03a95 | ||
|
|
3752d112fb | ||
|
|
a16c557137 | ||
|
|
2b2b3a4fe7 | ||
|
|
bc910798da | ||
|
|
c37ff51004 | ||
|
|
a7dcf20ed1 | ||
|
|
729fbb2e50 | ||
|
|
aa51907387 | ||
|
|
be60b3e046 | ||
|
|
147f4d76e2 | ||
|
|
7a6da3d3ce | ||
|
|
b90db12ba0 | ||
|
|
431658bee6 | ||
|
|
14513cd81f | ||
|
|
5084c01c2b | ||
|
|
140187649d | ||
|
|
f3cbb7f9da | ||
|
|
b69b6d1f55 | ||
|
|
79e8f69fb6 | ||
|
|
fa2128cbae | ||
|
|
610922e3dc | ||
|
|
9839ef7292 | ||
|
|
87384ca2a2 | ||
|
|
ffdcfe9686 | ||
|
|
7539bee5c5 | ||
|
|
59de1af31b | ||
|
|
70edf84d46 | ||
|
|
2091dfaa69 | ||
|
|
cb1646be32 | ||
|
|
1ce71fc63e | ||
|
|
fc49856857 | ||
|
|
fa1149e1f2 | ||
|
|
8b6d7ab809 | ||
|
|
008d7dbedc | ||
|
|
e64bb1de8c | ||
|
|
60998a68eb | ||
|
|
922fec44d2 | ||
|
|
22989a436e | ||
|
|
bf3ef61a1d | ||
|
|
cae2f3059c | ||
|
|
b6c6b70915 | ||
|
|
3b5e7eb0ea | ||
|
|
ea9d65f377 | ||
|
|
38063c388e | ||
|
|
7da29f7654 | ||
|
|
76e1c3b10b | ||
|
|
5c730f984d | ||
|
|
0fb3b18a8f | ||
|
|
6ca3e4f094 | ||
|
|
eba45a0b26 | ||
|
|
7756dd80f3 | ||
|
|
f5ad04766f | ||
|
|
f9c39e3dac | ||
|
|
84bc011df5 | ||
|
|
31b69ae6f6 | ||
|
|
82edc5c495 | ||
|
|
884ca03624 | ||
|
|
f0fe8808bd | ||
|
|
b5f81a34cb | ||
|
|
ad4b691fa5 | ||
|
|
be8eab4e54 | ||
|
|
9e56f3d318 | ||
|
|
4adcd03ec7 | ||
|
|
759bf4d73d | ||
|
|
7d2a393532 | ||
|
|
511796f74e | ||
|
|
c7d10dc091 | ||
|
|
4f1c428d8f | ||
|
|
54e99f2510 | ||
|
|
78438d7044 | ||
|
|
a844ccb06a | ||
|
|
f9abd254f4 | ||
|
|
d045f64ebb | ||
|
|
ee239ddd1e | ||
|
|
73f762250c | ||
|
|
c39056f1a8 | ||
|
|
4ad541d066 | ||
|
|
cab10aa7b4 | ||
|
|
f78bf27daf | ||
|
|
92cfd1f602 | ||
|
|
49332ab12c | ||
|
|
32b7f0745f | ||
|
|
f6a941defc | ||
|
|
cf9e8abea1 | ||
|
|
e96e14ca76 | ||
|
|
01ddf23745 | ||
|
|
83009adbc0 | ||
|
|
c8f955e302 | ||
|
|
0240c87095 | ||
|
|
5675021895 | ||
|
|
12b73747f5 | ||
|
|
179b686e42 | ||
|
|
2a7f4217df | ||
|
|
d880372b49 | ||
|
|
fa8c69a5e1 | ||
|
|
25c7c297e8 | ||
|
|
bcd6baa793 | ||
|
|
5046c36458 | ||
|
|
c0339d4f6a | ||
|
|
976504498a | ||
|
|
52b1bb2ae4 | ||
|
|
b167b4174e | ||
|
|
0fb8810c52 | ||
|
|
2bb2d3fc89 | ||
|
|
5d185f1fcd | ||
|
|
3b3de81cb7 | ||
|
|
769fe17a21 | ||
|
|
354702140a | ||
|
|
5df8ad32fe | ||
|
|
b9b8352a31 | ||
|
|
eb3f4b8490 | ||
|
|
6c05b5f083 | ||
|
|
14ebf2118a | ||
|
|
c87cdaea23 | ||
|
|
0fdd3e23ff | ||
|
|
beddee8dd4 | ||
|
|
ed900d3e86 | ||
|
|
e6e0ecfaea | ||
|
|
d79297db1a | ||
|
|
f96eb587ff | ||
|
|
e4d9e9f63f | ||
|
|
4669a99617 | ||
|
|
077ad6506c | ||
|
|
043ae1eb17 | ||
|
|
e64b1f5ca1 | ||
|
|
180ec7af4a | ||
|
|
eff13cc9eb | ||
|
|
19c5e71a76 | ||
|
|
7be27f7770 | ||
|
|
a9c5dab0dd | ||
|
|
9225d9ab2b | ||
|
|
13d9dea8ac | ||
|
|
0cb9884965 | ||
|
|
87e454cc6d | ||
|
|
b625c4c662 | ||
|
|
484e021ca2 | ||
|
|
84759d4f20 | ||
|
|
741e0a08ea | ||
|
|
7628490def | ||
|
|
d50a7778fe | ||
|
|
09cf93521f | ||
|
|
e65a628bf9 | ||
|
|
bdf736b7d7 | ||
|
|
3dfcd6db6a | ||
|
|
134e4c1eb9 | ||
|
|
a087d146df | ||
|
|
3ac87f22cb | ||
|
|
56b885995c | ||
|
|
56c07704d8 | ||
|
|
c765d8ebe2 | ||
|
|
dd1959abfb | ||
|
|
b1c45901f0 | ||
|
|
5b35981c85 | ||
|
|
75d0414da3 | ||
|
|
f8213f5d56 | ||
|
|
311b060c70 | ||
|
|
7aadf644e0 | ||
|
|
afd4f89693 | ||
|
|
f4fa000ba3 | ||
|
|
68ecbf4185 | ||
|
|
cccc019e5d | ||
|
|
68e8f565e2 | ||
|
|
cb0f73da57 | ||
|
|
c8ddd68a7a | ||
|
|
a6b6009fb1 | ||
|
|
1376d8fa7b | ||
|
|
c002f30848 | ||
|
|
8d58c52ad8 | ||
|
|
96f9984823 | ||
|
|
824b90b643 | ||
|
|
05def34697 | ||
|
|
cb7cadfc54 | ||
|
|
7f7b63b172 | ||
|
|
ca77a315d9 | ||
|
|
35921c70fe | ||
|
|
0517a3eb63 | ||
|
|
d52a74092b | ||
|
|
7d7f82ae46 | ||
|
|
fed325a54d | ||
|
|
f1942bc0e0 | ||
|
|
dcab1da8ab | ||
|
|
a2bb947dcc | ||
|
|
fa45ba102c | ||
|
|
75ef6356d3 | ||
|
|
e37a696e7d | ||
|
|
72a6f7ae24 | ||
|
|
ecd49148d0 | ||
|
|
a178268b31 | ||
|
|
ba03fb30f3 | ||
|
|
a092cb9bda | ||
|
|
7c75ee20e3 | ||
|
|
18d9403a58 | ||
|
|
b5bf6df058 | ||
|
|
b88b7d4af7 | ||
|
|
c43cfbad17 | ||
|
|
b6e64c13d8 | ||
|
|
bfec8b8588 | ||
|
|
a33ff12123 | ||
|
|
d686f2dda6 | ||
|
|
9bab229108 | ||
|
|
6cd233dd61 | ||
|
|
7d55467f4b | ||
|
|
3de105704e | ||
|
|
9d3378bd3b | ||
|
|
3c1f747c25 | ||
|
|
5a611b66a5 | ||
|
|
ada75cbbe1 | ||
|
|
4c13f155ff | ||
|
|
df274e6457 | ||
|
|
8380edc00c | ||
|
|
08aaff379b | ||
|
|
33ada71e4b | ||
|
|
e230cde6c4 | ||
|
|
de403dcd9d | ||
|
|
48c2901d09 | ||
|
|
ca937b72ef | ||
|
|
28547f4ec5 | ||
|
|
c384cc8c8c | ||
|
|
69da12e6b2 | ||
|
|
bf102be567 | ||
|
|
7b594a635e | ||
|
|
70ce12372d | ||
|
|
7fb3962192 | ||
|
|
84fe40c492 | ||
|
|
8949a8ad75 | ||
|
|
2244b7cb66 | ||
|
|
e89c32685b | ||
|
|
14a39ba3c3 | ||
|
|
e178e70053 | ||
|
|
88b2b26007 | ||
|
|
2d37a39e43 | ||
|
|
7ba66e692f | ||
|
|
3e375128c0 | ||
|
|
cd88b5595c | ||
|
|
bc41e2034c | ||
|
|
132cc7f788 | ||
|
|
5f767b96f6 | ||
|
|
7ed5c65b10 | ||
|
|
6ce443424b | ||
|
|
7adb1d7f82 | ||
|
|
05dbea390b | ||
|
|
514de7edc4 | ||
|
|
d330ae2421 | ||
|
|
5ae35ea6dc | ||
|
|
0f0bb7277a | ||
|
|
84da355f4c | ||
|
|
4f59caf3ca | ||
|
|
b2827702e5 | ||
|
|
435886bbf0 | ||
|
|
5c4db0fa17 | ||
|
|
26e8072c84 | ||
|
|
9a123c42c3 | ||
|
|
283511116e | ||
|
|
77da1afae5 | ||
|
|
0caf03130c | ||
|
|
d88ec48468 | ||
|
|
5a006d5980 | ||
|
|
4e8ca90b23 | ||
|
|
07edb7b74e | ||
|
|
abeff99ba0 | ||
|
|
5cf86d3677 | ||
|
|
9f06d0d47b | ||
|
|
f523685414 | ||
|
|
a90100a0b7 | ||
|
|
1652425cee | ||
|
|
c90794878f | ||
|
|
b2144f7928 | ||
|
|
5255719661 | ||
|
|
daf33ef8aa | ||
|
|
ba1e5b8d58 | ||
|
|
49ed0765e1 | ||
|
|
0d1b70e248 | ||
|
|
ce3c53b3c4 | ||
|
|
ab187f06da | ||
|
|
0b313e0bc3 | ||
|
|
7f2f78a816 | ||
|
|
e1c9e3b9ed | ||
|
|
5608827429 | ||
|
|
b971eb52ee | ||
|
|
f7194eecb0 | ||
|
|
5d2d22a218 | ||
|
|
11c2ee81c1 | ||
|
|
d1d6f7ddbc | ||
|
|
3c1774360f | ||
|
|
7bd7f2b045 | ||
|
|
d557e9600a | ||
|
|
de26606ad5 | ||
|
|
cffa729ac5 | ||
|
|
599dbe1870 | ||
|
|
ba2dc69ff9 | ||
|
|
d84461c9b2 | ||
|
|
f4652b3f7b | ||
|
|
4b18bb29a6 | ||
|
|
6e7d3b8135 | ||
|
|
a415f14fac | ||
|
|
d73688bfd8 | ||
|
|
2d053da21f | ||
|
|
f2d8b8e319 | ||
|
|
fd5d1583de | ||
|
|
7923b54456 | ||
|
|
34f893e8ad | ||
|
|
07c0e72bd3 | ||
|
|
94c9772a81 | ||
|
|
2e66ddb0a0 | ||
|
|
6b835f53ce | ||
|
|
7d34a89efd | ||
|
|
3afe1835c0 | ||
|
|
f85b97916c | ||
|
|
8abb5fdf47 | ||
|
|
c395bf7c7c | ||
|
|
1e5b2e57e7 | ||
|
|
bfde2ce875 | ||
|
|
b84d9201fd | ||
|
|
aa1e884c81 | ||
|
|
55916df97d | ||
|
|
90bbe3379d | ||
|
|
d5385523ac | ||
|
|
390d7a8124 | ||
|
|
9b760a8fa0 | ||
|
|
6302eb1317 | ||
|
|
1259069358 | ||
|
|
c7bdd10734 | ||
|
|
32bdb73f70 | ||
|
|
c7a04e27f4 | ||
|
|
935b30b17a | ||
|
|
e37488807b | ||
|
|
96c1187f47 | ||
|
|
64f9cbbf54 | ||
|
|
601649f49a | ||
|
|
cecff159a0 | ||
|
|
f6dbf2454d | ||
|
|
1233c5b67b | ||
|
|
36901295b2 | ||
|
|
a372d22fb2 | ||
|
|
1785c54b83 | ||
|
|
bb4e67684c | ||
|
|
05387edbfa | ||
|
|
b358809328 | ||
|
|
259b5e51c4 | ||
|
|
4128f01aa8 | ||
|
|
146d4e049a | ||
|
|
9f8dfbc51c | ||
|
|
e10c2abf3b | ||
|
|
841676fd36 | ||
|
|
05f4270d01 | ||
|
|
e440fc3d17 | ||
|
|
3081a8bb3f | ||
|
|
660b8cdb7e | ||
|
|
afe930cbee | ||
|
|
e054f63746 | ||
|
|
59b570cf62 | ||
|
|
f391b24b1d | ||
|
|
7bf06cd6e6 | ||
|
|
f885c6375a | ||
|
|
db4b30ad48 | ||
|
|
6053390bf5 | ||
|
|
5cbc7b16c0 | ||
|
|
1757973f88 | ||
|
|
10cd45dc81 | ||
|
|
a5ae86512a | ||
|
|
b97cb7422f | ||
|
|
124eddc68c | ||
|
|
23a88b5d69 | ||
|
|
aba625d544 | ||
|
|
f8dc8ad4ad | ||
|
|
1a9781d66f | ||
|
|
a42b4ef0a0 | ||
|
|
b382ae2233 | ||
|
|
3e12d958e9 | ||
|
|
81ec2e60a9 | ||
|
|
c49bb2daad | ||
|
|
59942531df | ||
|
|
4e33af41dd | ||
|
|
42929e7783 | ||
|
|
07f141af2e | ||
|
|
d249e9e7c6 | ||
|
|
7c13f71481 | ||
|
|
26052802ca | ||
|
|
829425831f | ||
|
|
7b04dd4106 | ||
|
|
d2e911c3ea | ||
|
|
6960245a06 | ||
|
|
c30e61904d | ||
|
|
bec4617128 | ||
|
|
b3a7954363 | ||
|
|
3a744a954b | ||
|
|
501a2d7c45 | ||
|
|
3ea81be2cc | ||
|
|
a7253c5ead | ||
|
|
05d226a103 | ||
|
|
6ec1c61b06 | ||
|
|
6ea9325868 | ||
|
|
943cc86eb9 | ||
|
|
83d6a28030 | ||
|
|
d411d8b3a1 | ||
|
|
89d91500f1 | ||
|
|
c63da264d7 | ||
|
|
da412571e4 | ||
|
|
5f01065614 | ||
|
|
77b27abc94 | ||
|
|
025ee32281 | ||
|
|
ddb8badcc9 | ||
|
|
c30882e1d1 | ||
|
|
b0c9c8a2aa | ||
|
|
4e2de98903 | ||
|
|
9234f2f15d | ||
|
|
2ba4319850 | ||
|
|
85add9a5c8 | ||
|
|
e94e8d3e7f | ||
|
|
5f4114ae76 | ||
|
|
affebf3431 | ||
|
|
b00a9d4398 | ||
|
|
9cb01dedba | ||
|
|
382b5cae8f | ||
|
|
76580e4766 | ||
|
|
a64538b964 | ||
|
|
f448587271 | ||
|
|
bb956b8453 | ||
|
|
8742d7aa45 | ||
|
|
d3ece7417d | ||
|
|
f264214e69 | ||
|
|
a7e2162cdc | ||
|
|
630871214f | ||
|
|
4e8c509157 | ||
|
|
991502432c | ||
|
|
53e3f8a239 | ||
|
|
1e1471c7c6 | ||
|
|
3846a5b875 | ||
|
|
705d7730dc | ||
|
|
5e114c0f2e | ||
|
|
959676164b | ||
|
|
c4e9291db4 | ||
|
|
6b48cab5e3 | ||
|
|
dbd079dfb8 | ||
|
|
bb17d4a8dd | ||
|
|
b5fe749f0b | ||
|
|
b2cb473b63 | ||
|
|
ce22d031f6 | ||
|
|
e7b4292d3c | ||
|
|
e3e7636de8 | ||
|
|
57a4b9f8b6 | ||
|
|
d060b0d342 | ||
|
|
39a81f30ff | ||
|
|
6d4f46c8ae | ||
|
|
5efc45190a | ||
|
|
0ad33bf9ac | ||
|
|
d32c9470a0 | ||
|
|
c85a0a41ba | ||
|
|
97ee63fc78 | ||
|
|
05cbb35814 | ||
|
|
df95efe33e | ||
|
|
def27bce4d | ||
|
|
95eb0efabe | ||
|
|
12de907732 | ||
|
|
fd996f15f0 | ||
|
|
0b1a9220a9 | ||
|
|
98215d2231 | ||
|
|
95fbff3a53 | ||
|
|
978d1e1d3e | ||
|
|
5f2362dc89 | ||
|
|
b3378d4599 | ||
|
|
307f2919a3 | ||
|
|
88626b26d2 | ||
|
|
f9c2bd3502 | ||
|
|
f9aeb5783d | ||
|
|
8e64ffba01 | ||
|
|
7600e273dc | ||
|
|
da1d6b0063 | ||
|
|
bd318bd004 | ||
|
|
204f3d8542 | ||
|
|
fee8aba610 | ||
|
|
47a252e517 | ||
|
|
f373ca82c6 | ||
|
|
363e19be7f | ||
|
|
5878d49f60 | ||
|
|
1397a951fe | ||
|
|
6f16890475 | ||
|
|
f05793c2e3 | ||
|
|
c2abbed055 | ||
|
|
81ea07abee | ||
|
|
bc270bd801 | ||
|
|
df22c5a914 | ||
|
|
6812b74bbf | ||
|
|
e2bf462a45 | ||
|
|
57dac8d5f7 | ||
|
|
b4bdfa7b2b | ||
|
|
f13c604fbe | ||
|
|
0ca31deedb | ||
|
|
00b5d52eab | ||
|
|
42fec52b0d | ||
|
|
fed2609cb2 | ||
|
|
7398e7f0ad | ||
|
|
57a61c48a2 | ||
|
|
7f40e42ddc | ||
|
|
fc0746eb71 | ||
|
|
4baa6dde52 | ||
|
|
529c208170 | ||
|
|
c907a2f857 | ||
|
|
6ead0ae9ee | ||
|
|
83b58468d9 | ||
|
|
01b73bf704 | ||
|
|
673b86c6e3 | ||
|
|
a318040eaa | ||
|
|
14b867e1f6 | ||
|
|
4ca1a2d5aa | ||
|
|
8a1d387c38 | ||
|
|
dbf744a179 | ||
|
|
6ea89bf621 | ||
|
|
4f78a50add | ||
|
|
a7495fa7b4 | ||
|
|
47a3f1d93d | ||
|
|
2cef805ab6 | ||
|
|
140016c068 | ||
|
|
e22664da0f | ||
|
|
6e73fa80b8 | ||
|
|
35c51ad3b1 | ||
|
|
9c5a5fc83d | ||
|
|
5906a4a2de | ||
|
|
f5855ae208 | ||
|
|
5e7684ab50 | ||
|
|
fecf8501cb | ||
|
|
71143d1417 | ||
|
|
f4f4e31a7a | ||
|
|
926cbb18ea | ||
|
|
a81cf1ea16 | ||
|
|
30b52b9825 | ||
|
|
be9bc07890 | ||
|
|
49fb950195 | ||
|
|
9e177a0a81 | ||
|
|
d25430f377 | ||
|
|
f89d7c2f67 | ||
|
|
f45ec40392 | ||
|
|
9f31b0ef4d | ||
|
|
f6ff680295 | ||
|
|
565847ceb3 | ||
|
|
f702d43973 | ||
|
|
0143799623 | ||
|
|
da379702a2 | ||
|
|
ef6e848756 | ||
|
|
31d04cffd9 | ||
|
|
56287173b1 | ||
|
|
0a81152267 | ||
|
|
e3265dd934 | ||
|
|
b8c703b8b0 | ||
|
|
850556fdfa | ||
|
|
d4e68a159f | ||
|
|
ab412ebf37 | ||
|
|
4ebb12e06b | ||
|
|
3a49485039 | ||
|
|
ab65c04e0e | ||
|
|
3186541f49 | ||
|
|
f80df53532 | ||
|
|
7d0bdc2863 | ||
|
|
071b3981f7 | ||
|
|
ff8b0944a2 | ||
|
|
e542f17809 | ||
|
|
06cd41801e | ||
|
|
e4349e8db1 | ||
|
|
3f53f17411 | ||
|
|
8b64dd95a5 | ||
|
|
e809b042aa | ||
|
|
7fe5674b9a | ||
|
|
b7ef066545 | ||
|
|
220f6b1da2 | ||
|
|
599166ed0f | ||
|
|
2fb6bb00bf | ||
|
|
e0d9ae3116 | ||
|
|
1bf24acff7 | ||
|
|
8366fced96 | ||
|
|
96ce409cd1 | ||
|
|
c52a964a8a | ||
|
|
2c2638c1fe | ||
|
|
473e23f992 | ||
|
|
513e8f246b | ||
|
|
7bebc36cd5 | ||
|
|
626a224382 | ||
|
|
c3bde7c910 | ||
|
|
d65ff87148 | ||
|
|
8e9b0d97ec | ||
|
|
f22aee2bff | ||
|
|
2d8d3c8152 | ||
|
|
2136e41fad | ||
|
|
bde762cb11 | ||
|
|
a8d2590a4c | ||
|
|
36f894d0d8 | ||
|
|
18148a3aed | ||
|
|
49586441f3 | ||
|
|
4c79a1d766 | ||
|
|
34db2f5dd9 | ||
|
|
fbc002f212 | ||
|
|
2a20855c17 | ||
|
|
a1e0fa5509 | ||
|
|
2d0b9e6538 | ||
|
|
3be35743ac | ||
|
|
2c459e8f74 | ||
|
|
f741d3131d | ||
|
|
e2a090f03f | ||
|
|
7c0b5818b1 | ||
|
|
f050f15a0c | ||
|
|
7d5ab68f50 | ||
|
|
a12d82524a | ||
|
|
75bdfe971b | ||
|
|
f12e21560a | ||
|
|
65d9739c6c | ||
|
|
6a11056b60 | ||
|
|
d3fb46663c | ||
|
|
e4c0da4ed4 | ||
|
|
f89819bbdb | ||
|
|
32490f1ef6 | ||
|
|
a33cfc26dc | ||
|
|
03d1dad2a3 | ||
|
|
c7c71d3c88 | ||
|
|
a9e63283cc | ||
|
|
b13c991f4b | ||
|
|
cd4f288f67 | ||
|
|
5e796054ba | ||
|
|
b8060bc507 | ||
|
|
29394293ed | ||
|
|
50f7c734cb | ||
|
|
8cb4e7934e | ||
|
|
e3409228da | ||
|
|
1099a5006f | ||
|
|
87e8bc5722 | ||
|
|
71ec5c5c05 | ||
|
|
216d98844b | ||
|
|
a52f9d4ef9 | ||
|
|
231262ad8e | ||
|
|
2d6669b88d | ||
|
|
f51753f166 | ||
|
|
484cd2f1ce | ||
|
|
1760beed17 | ||
|
|
a6595507f0 | ||
|
|
c193d448d8 | ||
|
|
c982813acb | ||
|
|
95ddc57c13 | ||
|
|
5063940138 | ||
|
|
feab999093 | ||
|
|
e2f43b3383 | ||
|
|
13e67f176a | ||
|
|
43d52026b7 | ||
|
|
acef6ad973 | ||
|
|
b30048202a | ||
|
|
cc09e7e834 | ||
|
|
364c22bee7 | ||
|
|
cdab0bb140 | ||
|
|
8a6866d409 | ||
|
|
b599a8e2fb | ||
|
|
baadf34134 | ||
|
|
dd9728334a | ||
|
|
ce41702cbe | ||
|
|
4eadda5c9a | ||
|
|
f651062991 | ||
|
|
7d3e903db0 | ||
|
|
b6b819a2a1 | ||
|
|
1336cb7a61 | ||
|
|
cd2496215e | ||
|
|
2b0ad4477e | ||
|
|
57605cb840 | ||
|
|
93d8cadaaf | ||
|
|
fdc44871ca | ||
|
|
7f6e6264a8 | ||
|
|
3db384efd5 | ||
|
|
845f962bc2 | ||
|
|
ad1b5bdd47 | ||
|
|
4c02bdb092 | ||
|
|
0c3813c9c5 | ||
|
|
1d6a1db491 | ||
|
|
1e9bbce249 | ||
|
|
0dd8f21511 | ||
|
|
f1b5815f95 | ||
|
|
696ea0bf94 | ||
|
|
c2b6e1ce1a | ||
|
|
c474810294 | ||
|
|
5c5b007618 | ||
|
|
18ee87f586 | ||
|
|
2b8327c807 | ||
|
|
fa8bae8931 | ||
|
|
69a7747d4b | ||
|
|
fb8e7a2084 | ||
|
|
bdd31b8f82 | ||
|
|
9207689941 | ||
|
|
b86f92212f | ||
|
|
851d97d95e | ||
|
|
1eb6b05bbb | ||
|
|
645c3bf69f | ||
|
|
cef150eee6 | ||
|
|
d721939d5f | ||
|
|
663791fac2 | ||
|
|
1058572c8a | ||
|
|
73832a5ed8 | ||
|
|
b0c324ace8 | ||
|
|
6a281bef8f | ||
|
|
2ea1716c1a | ||
|
|
e557634feb | ||
|
|
376ff79f16 | ||
|
|
0bbdda32e8 | ||
|
|
2f19594bef | ||
|
|
3b5d27093a | ||
|
|
edb8670dc0 | ||
|
|
09194f8e1b | ||
|
|
1a0bc3cf66 | ||
|
|
0da4bfa0cf | ||
|
|
3067f82aea | ||
|
|
2bb76bf781 | ||
|
|
7794502324 | ||
|
|
e48649ac3e | ||
|
|
f91fa45860 | ||
|
|
c15ddbc53c | ||
|
|
d63f9e751d | ||
|
|
fc077257d0 | ||
|
|
d265d2e1a0 | ||
|
|
ead592647a | ||
|
|
2c24c0bfbf | ||
|
|
f7833c9f0c | ||
|
|
24584503d9 | ||
|
|
50f2437ac3 | ||
|
|
a4dca52617 | ||
|
|
a939fca4ac | ||
|
|
d30a799b45 | ||
|
|
c003229fcf | ||
|
|
dbf995480a | ||
|
|
3361f1cd80 | ||
|
|
f53cc05f52 | ||
|
|
99aeacf9b0 | ||
|
|
2d9f90c3b5 | ||
|
|
45b68bd46c | ||
|
|
8c83fd5e24 | ||
|
|
268a5a95c8 | ||
|
|
2efdddb9af | ||
|
|
8c36f753f9 | ||
|
|
d39d40c064 | ||
|
|
9a91ed501e | ||
|
|
502d633175 | ||
|
|
d1ce5826e1 | ||
|
|
1fb020fb3a | ||
|
|
7ac7268b8f | ||
|
|
e21c346183 | ||
|
|
5fbac5da5b | ||
|
|
e7ff5eb6b1 | ||
|
|
d41031ebf7 | ||
|
|
05e4d4fc0d | ||
|
|
8656c1897d | ||
|
|
6800c1a6ad | ||
|
|
dd2dcc4147 | ||
|
|
1fa6f3123b | ||
|
|
80ac326f28 | ||
|
|
c047ef5b37 | ||
|
|
b11ab06bb2 | ||
|
|
f50a8d4f59 | ||
|
|
45617e086c | ||
|
|
5996738030 | ||
|
|
46a355675e | ||
|
|
89b334d71c | ||
|
|
8372c819e9 | ||
|
|
96c2947283 | ||
|
|
83e931766f | ||
|
|
6835b99f10 | ||
|
|
45b1a75d56 | ||
|
|
15ec515872 | ||
|
|
0190ac9037 | ||
|
|
ee0306c4fd | ||
|
|
56605cd0c3 | ||
|
|
3ddb1b98b3 | ||
|
|
8b559a8b51 | ||
|
|
1cfda610cc | ||
|
|
6ff929e567 | ||
|
|
dd34663224 | ||
|
|
d05d5a85a5 | ||
|
|
f4dc5c6809 | ||
|
|
e4c8862cc5 | ||
|
|
39d8f09c38 | ||
|
|
fa2a1ad6d3 | ||
|
|
94ae44bb71 | ||
|
|
7080d3da98 | ||
|
|
d75564b885 | ||
|
|
64daecb266 | ||
|
|
d0e31adaf7 | ||
|
|
12627bbc10 | ||
|
|
498f5e3877 | ||
|
|
8baa144933 | ||
|
|
b24bdcb8d9 | ||
|
|
7b2fab411c | ||
|
|
a96cabfe73 | ||
|
|
654c8edc6b | ||
|
|
f83f3b84ca | ||
|
|
60417a598a | ||
|
|
41fe85b624 | ||
|
|
c1f7446c26 | ||
|
|
12e1cae93c | ||
|
|
95df9c5cf6 | ||
|
|
4c4fb44363 | ||
|
|
d9cf1187d7 | ||
|
|
403de336d2 | ||
|
|
ebc7997dbf | ||
|
|
cd85d00b3b | ||
|
|
51b7e299b4 | ||
|
|
3b7fcf0813 | ||
|
|
76dd4ea5c0 | ||
|
|
c5f5292d9e | ||
|
|
b2527a0ad6 | ||
|
|
2fbb712f57 | ||
|
|
1c25603686 | ||
|
|
aa246f0ca8 | ||
|
|
f410b29c99 | ||
|
|
e35a7ef9d3 | ||
|
|
f058e666e5 | ||
|
|
843f7ede8f | ||
|
|
b099a766e6 | ||
|
|
d5209d7ddf | ||
|
|
f37aed868e | ||
|
|
09d3f73154 | ||
|
|
9a393bbcea | ||
|
|
a43db66d87 | ||
|
|
a667f900c5 | ||
|
|
65a30bab3f | ||
|
|
958b70e4ac | ||
|
|
732f46cc69 | ||
|
|
30819b3cbc | ||
|
|
ee277bf126 | ||
|
|
1a010cbfc6 | ||
|
|
176d4780b5 | ||
|
|
4a5f29b0d1 | ||
|
|
034bd83915 | ||
|
|
b94a1b9fbe | ||
|
|
cd9cae4121 | ||
|
|
48d2beece5 | ||
|
|
b0a5c973a5 | ||
|
|
5c4470ec07 | ||
|
|
a56b745429 | ||
|
|
325ba48601 | ||
|
|
6054e05e70 | ||
|
|
87c32ccb98 | ||
|
|
232af6b802 | ||
|
|
057cbed204 | ||
|
|
4e4b370b4a | ||
|
|
c57aaf0216 | ||
|
|
2ee43758d5 | ||
|
|
9507e12ca7 | ||
|
|
a17fc84fd0 | ||
|
|
f23cd9204c | ||
|
|
decfae7b8a | ||
|
|
c93ada1e7b | ||
|
|
31be920ba4 | ||
|
|
53261cc0b2 | ||
|
|
c8a562b865 | ||
|
|
38f3c39d1d | ||
|
|
43aede8d63 | ||
|
|
87dc9a4a18 | ||
|
|
6b6411d06b | ||
|
|
398d11a453 | ||
|
|
f579360086 | ||
|
|
c04f502863 | ||
|
|
3591a0cedd | ||
|
|
193913129f | ||
|
|
44624d0003 | ||
|
|
2f62a79135 | ||
|
|
063eb7e9ab | ||
|
|
a3d6371d36 | ||
|
|
a26d48082d | ||
|
|
acbc7d9556 | ||
|
|
a8b394752e | ||
|
|
29c94d2fb5 | ||
|
|
2fd8a0ea22 | ||
|
|
0d32b9a692 | ||
|
|
418734b0a3 | ||
|
|
b752df7557 | ||
|
|
4a3d9029d1 | ||
|
|
ef75ae4aee | ||
|
|
5c8a4b3912 | ||
|
|
f975187e48 | ||
|
|
69d52a06d7 | ||
|
|
de5381856d | ||
|
|
d31ccbde15 | ||
|
|
8f875962b2 | ||
|
|
cdb70a8c14 | ||
|
|
b2839a6442 | ||
|
|
1af8a1533e | ||
|
|
ab813df992 | ||
|
|
3fa15eeb35 | ||
|
|
d3c38da04d | ||
|
|
717759db29 | ||
|
|
c2a26d39af | ||
|
|
b79b5a01cc | ||
|
|
3df802cef7 | ||
|
|
dbf430ac2e | ||
|
|
3a2bd3c9b1 | ||
|
|
245f424014 | ||
|
|
a5780dd66c | ||
|
|
4f01660591 | ||
|
|
e8789dcd02 | ||
|
|
a35cbdc4a9 | ||
|
|
a203246e85 | ||
|
|
ea8acf3bbd | ||
|
|
9bdd26de43 | ||
|
|
909fc3fa50 | ||
|
|
ca45d15424 | ||
|
|
5e0252c152 | ||
|
|
c6ca877b72 | ||
|
|
4965704b10 | ||
|
|
cf25ed3d80 | ||
|
|
9e91cd70ee | ||
|
|
049e622e3c | ||
|
|
26fceae7e5 | ||
|
|
a19e2e48a1 | ||
|
|
21f587cc45 | ||
|
|
3a99e3b755 | ||
|
|
1fea2b3d8a | ||
|
|
a17ca5382d | ||
|
|
76c075395a | ||
|
|
bb9516c5cb | ||
|
|
0779b29022 | ||
|
|
2bcefe364f | ||
|
|
00e6e00e71 | ||
|
|
ca4bbdd02b | ||
|
|
b863e77b63 | ||
|
|
5e6c38a524 | ||
|
|
c75d6fd2b5 | ||
|
|
6d4a828698 | ||
|
|
9b4a0d3dee | ||
|
|
1b44eaf6fe | ||
|
|
165ab473df | ||
|
|
a5e6cd256c | ||
|
|
6ff1722dbf | ||
|
|
829012ae3c | ||
|
|
e330a91921 | ||
|
|
f961fd6a7c | ||
|
|
9b031d2fae | ||
|
|
c5c540469f | ||
|
|
486b65487f | ||
|
|
1e8299f842 | ||
|
|
b8c4a86348 | ||
|
|
05b557c27f | ||
|
|
abcdd105e3 | ||
|
|
6202156f97 | ||
|
|
4706733846 | ||
|
|
e07562beae | ||
|
|
6ccf2f9232 | ||
|
|
52d08f7112 | ||
|
|
59c6a0f736 | ||
|
|
6662081044 | ||
|
|
28ed981082 | ||
|
|
6f7ae728eb | ||
|
|
67758cb092 | ||
|
|
881108057d | ||
|
|
e378a65508 | ||
|
|
12c151eb69 | ||
|
|
fa34f0efcc | ||
|
|
06be9edfe1 | ||
|
|
9c88959651 | ||
|
|
ecc19ff23e | ||
|
|
429a1ba78a | ||
|
|
990e33a4b1 | ||
|
|
56ca80eb78 | ||
|
|
ed7fb20758 | ||
|
|
bc92f156c1 | ||
|
|
e9547f7a1c | ||
|
|
c700b8c5c5 | ||
|
|
17f1a7d22a | ||
|
|
15652025d3 | ||
|
|
ef1261de45 | ||
|
|
a564b96ccf | ||
|
|
76c16e0994 | ||
|
|
719e71264b | ||
|
|
7a0f04e667 | ||
|
|
bd85ce02da | ||
|
|
2691bb1540 | ||
|
|
c9293dd2d1 | ||
|
|
d3b47f45ab | ||
|
|
30f4036c97 | ||
|
|
405b06319d | ||
|
|
0bffa066db | ||
|
|
edbfff62e8 | ||
|
|
deb9a6b37f | ||
|
|
07de39ff17 | ||
|
|
db459b2400 | ||
|
|
ac365c5efb | ||
|
|
54979e6b53 | ||
|
|
768b67d275 | ||
|
|
0a92cb74a5 | ||
|
|
efed388402 | ||
|
|
e4679a6eaf | ||
|
|
981bbae75f | ||
|
|
c3b4ebdc1b | ||
|
|
450b1e75c9 | ||
|
|
82e02f7118 | ||
|
|
2d25edd4d6 | ||
|
|
fa92a10f15 | ||
|
|
ebe6d1b603 | ||
|
|
07599b5923 | ||
|
|
41dbb82cc2 | ||
|
|
39ad4d65e8 | ||
|
|
91a99c6903 | ||
|
|
3e0f8a1e4e | ||
|
|
970e21fc33 | ||
|
|
9e20553dab | ||
|
|
87347cf0e5 | ||
|
|
b10f04abbd | ||
|
|
d203f39f0a | ||
|
|
75d4e2a2f2 | ||
|
|
05a2e5a92e | ||
|
|
00c765be1b | ||
|
|
aea6c38b33 | ||
|
|
1e3a57ad92 | ||
|
|
805f0d4c90 | ||
|
|
2275060022 | ||
|
|
c9b74c2742 | ||
|
|
8754fd5646 | ||
|
|
3797cc767f | ||
|
|
2aa8c07d0e | ||
|
|
9db93e5d8f | ||
|
|
29b0200f62 | ||
|
|
696ce427a8 | ||
|
|
17ac4b90be | ||
|
|
623ab03492 | ||
|
|
b3e4d8487b | ||
|
|
bae5c6a1db | ||
|
|
658a73e610 | ||
|
|
bdac97147f | ||
|
|
78462dfa6c | ||
|
|
8362cb5e4f | ||
|
|
ae3c473490 | ||
|
|
8014d74210 | ||
|
|
71bdd353d3 | ||
|
|
ad7bce76d8 | ||
|
|
7cc5a3e050 | ||
|
|
6bf2c5a946 | ||
|
|
9853187051 | ||
|
|
f4ef0633c9 | ||
|
|
91c3de4620 | ||
|
|
6545ba9a35 | ||
|
|
797861a9c0 | ||
|
|
8df192e8dd | ||
|
|
6f2eccd62f | ||
|
|
a7777a48e3 | ||
|
|
b4c9c7cde4 | ||
|
|
b2bf1b3425 | ||
|
|
692cac1dc5 | ||
|
|
c19e660306 | ||
|
|
067a8bf108 | ||
|
|
753c9556fd | ||
|
|
ccec11e568 | ||
|
|
0eaf991d6f | ||
|
|
af90eadf71 | ||
|
|
d336c7c02c | ||
|
|
7005af3047 | ||
|
|
ff67d29573 | ||
|
|
0070dcf550 | ||
|
|
213cefb001 | ||
|
|
56ee6dac08 | ||
|
|
4f8155e612 |
@@ -3,7 +3,11 @@ version: '{branch}-{build}'
|
|||||||
# Do not build on tags (GitHub only)
|
# Do not build on tags (GitHub only)
|
||||||
skip_tags: true
|
skip_tags: true
|
||||||
|
|
||||||
os: Visual Studio 2015
|
image: Visual Studio 2017
|
||||||
|
|
||||||
|
branches:
|
||||||
|
except: # blacklist
|
||||||
|
- coverity_scan
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
REPO_DIR: &REPO_DIR c:\qbittorrent
|
REPO_DIR: &REPO_DIR c:\qbittorrent
|
||||||
@@ -20,6 +24,8 @@ clone_folder: *REPO_DIR
|
|||||||
cache:
|
cache:
|
||||||
- *CACHE_DIR
|
- *CACHE_DIR
|
||||||
|
|
||||||
|
clone_depth: 50
|
||||||
|
|
||||||
install:
|
install:
|
||||||
# check if library needs update
|
# check if library needs update
|
||||||
- appveyor DownloadFile "%QBT_VER_URL%" -FileName "c:\version_new" && SET /P newVersion=<"c:\version_new"
|
- appveyor DownloadFile "%QBT_VER_URL%" -FileName "c:\version_new" && SET /P newVersion=<"c:\version_new"
|
||||||
@@ -36,7 +42,7 @@ install:
|
|||||||
|
|
||||||
before_build:
|
before_build:
|
||||||
# setup env
|
# setup env
|
||||||
- CALL "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"
|
- CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
|
||||||
- SET PATH=%PATH%;c:\qbt\qt5_32\bin;%CACHE_DIR%\jom;
|
- SET PATH=%PATH%;c:\qbt\qt5_32\bin;%CACHE_DIR%\jom;
|
||||||
# setup project
|
# setup project
|
||||||
- COPY /Y "%CACHE_DIR%\winconf.pri" "%REPO_DIR%"
|
- COPY /Y "%CACHE_DIR%\winconf.pri" "%REPO_DIR%"
|
||||||
|
|||||||
12
.editorconfig
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# EditorConfig is awesome: http://EditorConfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[**.yml]
|
||||||
|
indent_size = 2
|
||||||
18
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,14 +1,20 @@
|
|||||||
**Please provide the following information**
|
**Please provide the following information**
|
||||||
|
|
||||||
### qBittorrent version and Operating System:
|
### qBittorrent version and Operating System
|
||||||
|
(type here)
|
||||||
|
|
||||||
### If on linux, libtorrent and Qt version:
|
### If on linux, libtorrent and Qt version
|
||||||
|
(type here)
|
||||||
|
|
||||||
### What is the problem:
|
### What is the problem
|
||||||
|
(type here)
|
||||||
|
|
||||||
### What is the expected behavior:
|
### What is the expected behavior
|
||||||
|
(type here)
|
||||||
|
|
||||||
### Steps to reproduce:
|
### Steps to reproduce
|
||||||
|
(type here)
|
||||||
|
|
||||||
### Extra info(if any):
|
### Extra info(if any)
|
||||||
|
(type here)
|
||||||
|
|
||||||
|
|||||||
3
.gitignore
vendored
@@ -31,3 +31,6 @@ src/qbittorrent.app
|
|||||||
aclocal.m4
|
aclocal.m4
|
||||||
autom4te.cache/*
|
autom4te.cache/*
|
||||||
config.status
|
config.status
|
||||||
|
src/icons/qbt-theme/build-icons/node_modules/
|
||||||
|
src/icons/skin/build-icons/node_modules/
|
||||||
|
src/icons/skin/build-icons/icons/*.png
|
||||||
|
|||||||
138
.travis.yml
@@ -10,19 +10,18 @@ env:
|
|||||||
# Uncomment when Travis upgraded "Ubuntu 12.04 LTS" to a newer version whose repo will have a more up-to-date libtorrent package
|
# Uncomment when Travis upgraded "Ubuntu 12.04 LTS" to a newer version whose repo will have a more up-to-date libtorrent package
|
||||||
#- lt_branch=dist gui=true
|
#- lt_branch=dist gui=true
|
||||||
#- lt_branch=dist gui=false
|
#- lt_branch=dist gui=false
|
||||||
- lt_branch=RC_1_0 qt=5 gui=true
|
- lt_branch=RC_1_0 gui=true build_system=cmake
|
||||||
- lt_branch=RC_1_0 qt=5 gui=false
|
- lt_branch=RC_1_0 gui=false build_system=cmake
|
||||||
- lt_branch=RC_1_0 qt=4 gui=true
|
- lt_branch=RC_1_0 gui=true build_system=qmake
|
||||||
- lt_branch=RC_1_0 qt=4 gui=false
|
- lt_branch=RC_1_0 gui=false build_system=qmake
|
||||||
global:
|
global:
|
||||||
- secure: "OI9CUjj4lTb0HwwIZU5PbECU3hLlAL6KC8KsbwohG8/O3j5fLcnmDsK4Ad9us5cC39sS11Jcd1kDP2qRcCuST/glVNhLkcjKkiQerOfd5nQ/qL4JYfz/1mfP5mdpz9jHKzpLUIG+TXkbSTjP6VVmsb5KPT+3pKEdRFZB+Pu9+J8="
|
- secure: "OI9CUjj4lTb0HwwIZU5PbECU3hLlAL6KC8KsbwohG8/O3j5fLcnmDsK4Ad9us5cC39sS11Jcd1kDP2qRcCuST/glVNhLkcjKkiQerOfd5nQ/qL4JYfz/1mfP5mdpz9jHKzpLUIG+TXkbSTjP6VVmsb5KPT+3pKEdRFZB+Pu9+J8="
|
||||||
- coverity_branch: coverity_scan
|
- coverity_branch: coverity_scan
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
allow_failures:
|
allow_failures:
|
||||||
- os: osx
|
- env: lt_branch=RC_1_0 gui=true build_system=cmake
|
||||||
env: lt_branch=RC_1_0 qt=4 gui=true
|
- env: lt_branch=RC_1_0 gui=false build_system=cmake
|
||||||
- os: osx
|
|
||||||
env: lt_branch=RC_1_0 qt=4 gui=false
|
|
||||||
|
|
||||||
branches:
|
branches:
|
||||||
except:
|
except:
|
||||||
@@ -56,39 +55,36 @@ addons:
|
|||||||
apt:
|
apt:
|
||||||
sources:
|
sources:
|
||||||
# sources list: https://github.com/travis-ci/apt-source-whitelist/blob/master/ubuntu.json
|
# sources list: https://github.com/travis-ci/apt-source-whitelist/blob/master/ubuntu.json
|
||||||
#- ubuntu-toolchain-r-test
|
- ubuntu-toolchain-r-test
|
||||||
#- boost-latest
|
#- boost-latest
|
||||||
- sourceline: 'ppa:qbittorrent-team/qbittorrent-stable'
|
- sourceline: 'ppa:qbittorrent-team/qbittorrent-stable'
|
||||||
- sourceline: 'ppa:beineri/opt-qt551-trusty'
|
- sourceline: 'ppa:beineri/opt-qt551-trusty'
|
||||||
|
- sourceline: 'ppa:adrozdoff/cmake'
|
||||||
packages:
|
packages:
|
||||||
# packages list: https://github.com/travis-ci/apt-package-whitelist/blob/master/ubuntu-precise
|
# packages list: https://github.com/travis-ci/apt-package-whitelist/blob/master/ubuntu-precise
|
||||||
- autoconf
|
- [autoconf, automake, colormake]
|
||||||
- automake
|
- [cmake, ninja-build]
|
||||||
- colormake
|
|
||||||
- libssl-dev
|
- libssl-dev
|
||||||
- libboost-dev
|
- [libboost-dev, libboost-system-dev]
|
||||||
- libboost-system-dev
|
|
||||||
- libtorrent-rasterbar-dev
|
- libtorrent-rasterbar-dev
|
||||||
# Qt 5.5.1
|
- [qt55base, qt55svg, qt55tools]
|
||||||
- qt55base
|
- [gcc-6, g++-6]
|
||||||
- qt55tools
|
|
||||||
# Qt 4.8
|
|
||||||
- qt4-default
|
|
||||||
- libqt4-dev
|
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
# only allow specific build for coverity scan, others will stop
|
# only allow specific build for coverity scan, others will stop
|
||||||
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ] && ! [ "$TRAVIS_OS_NAME" = "linux" -a "$lt_branch" = "RC_1_0" -a "$gui" = true ]; then exit ; fi
|
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ] && ! [ "$TRAVIS_OS_NAME" = "linux" -a "$lt_branch" = "RC_1_0" -a "$gui" = true -a "$build_system" = "qmake" ]; then exit ; fi
|
||||||
|
|
||||||
- shopt -s expand_aliases
|
- shopt -s expand_aliases
|
||||||
- alias make="colormake -j3" # Using nprocs/2 sometimes may fail (gcc is killed by system)
|
- alias make="colormake -j3" # Using nprocs/2 sometimes may fail (gcc is killed by system)
|
||||||
#- libt_path="$HOME/libt_install"
|
|
||||||
#- ltconf="$ltconf --prefix="$libt_path" --disable-geoip"
|
|
||||||
- qbt_path="$HOME/qbt_install"
|
- qbt_path="$HOME/qbt_install"
|
||||||
- qbtconf="$qbtconf --prefix="$qbt_path" PKG_CONFIG_PATH="$libt_path/lib/pkgconfig":/opt/qt55/lib/pkgconfig:$PKG_CONFIG_PATH"
|
- |
|
||||||
|
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
||||||
|
qbtconf="$qbtconf --prefix="$qbt_path" PKG_CONFIG_PATH=/opt/qt55/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
else
|
||||||
|
qbtconf="$qbtconf --prefix="$qbt_path""
|
||||||
|
fi
|
||||||
|
|
||||||
# options for specific branches
|
# options for specific branches
|
||||||
- if [ "$qt" = 4 ]; then qbtconf="$qbtconf --with-qt4" ; fi
|
|
||||||
- if [ "$gui" = false ]; then qbtconf="$qbtconf --disable-gui" ; fi
|
- if [ "$gui" = false ]; then qbtconf="$qbtconf --disable-gui" ; fi
|
||||||
- |
|
- |
|
||||||
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
||||||
@@ -97,11 +93,17 @@ before_install:
|
|||||||
|
|
||||||
# Qt 5
|
# Qt 5
|
||||||
PATH=/opt/qt55/bin:${PATH}
|
PATH=/opt/qt55/bin:${PATH}
|
||||||
|
|
||||||
|
if [ "$build_system" = "cmake" ]; then
|
||||||
|
COMPILER_VERSION=6
|
||||||
|
export CXX="${CXX}-${COMPILER_VERSION}" CC="${CC}-${COMPILER_VERSION}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# print settings
|
# print settings
|
||||||
- echo $lt_branch
|
- echo $lt_branch
|
||||||
- echo $gui
|
- echo $gui
|
||||||
|
- echo $build_system
|
||||||
- echo $ltconf
|
- echo $ltconf
|
||||||
- echo $qbtconf
|
- echo $qbtconf
|
||||||
|
|
||||||
@@ -110,49 +112,46 @@ install:
|
|||||||
#if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
#if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
||||||
# build libtorrent from source
|
# build libtorrent from source
|
||||||
#if [ "$lt_branch" != "dist" ]; then
|
#if [ "$lt_branch" != "dist" ]; then
|
||||||
#cd "$HOME" && pwd && git clone --depth 1 https://github.com/arvidn/libtorrent.git --branch $lt_branch ;
|
#cd "$HOME" && pwd && git clone --depth 1 https://github.com/arvidn/libtorrent.git --branch $lt_branch
|
||||||
#cd libtorrent && ./autotool.sh && ./configure $ltconf && make install ;
|
#cd libtorrent && ./autotool.sh && ./configure $ltconf && make install
|
||||||
#fi ;
|
#fi
|
||||||
#fi
|
#fi
|
||||||
- |
|
- |
|
||||||
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
# dependencies
|
# dependencies
|
||||||
brew update > /dev/null
|
brew update > /dev/null
|
||||||
brew install colormake ccache zlib
|
|
||||||
PATH="/usr/local/opt/ccache/libexec:$PATH"
|
|
||||||
brew link --force zlib
|
|
||||||
brew outdated "pkg-config" || brew upgrade "pkg-config"
|
brew outdated "pkg-config" || brew upgrade "pkg-config"
|
||||||
|
brew install colormake ccache zlib qt
|
||||||
|
PATH="/usr/local/opt/ccache/libexec:$PATH"
|
||||||
|
brew link --force zlib qt
|
||||||
|
|
||||||
wget https://builds.shiki.hu/homebrew/version ;
|
wget https://builds.shiki.hu/homebrew/version
|
||||||
if ! cmp --quiet "version" "$HOME/hombebrew_cache/version" ; then
|
if ! cmp --quiet "version" "$HOME/hombebrew_cache/version" ; then
|
||||||
echo "Cached files are different from server. Downloading new ones." ;
|
echo "Cached files are different from server. Downloading new ones."
|
||||||
# First delete old files
|
# First delete old files
|
||||||
rm -r "$HOME/hombebrew_cache" ;
|
rm -r "$HOME/hombebrew_cache"
|
||||||
mkdir "$HOME/hombebrew_cache";
|
mkdir "$HOME/hombebrew_cache"
|
||||||
cp "version" $HOME/hombebrew_cache ;
|
cp "version" $HOME/hombebrew_cache
|
||||||
cd "$HOME/hombebrew_cache" ;
|
cd "$HOME/hombebrew_cache"
|
||||||
wget https://builds.shiki.hu/homebrew/libtorrent-rasterbar.rb ;
|
wget https://builds.shiki.hu/homebrew/libtorrent-rasterbar.rb
|
||||||
wget https://builds.shiki.hu/homebrew/libtorrent-rasterbar-1.0.10.el_capitan.bottle.tar.gz ;
|
wget https://builds.shiki.hu/homebrew/libtorrent-rasterbar-1.1.6+git20180101.b45acf28a5+patched-configure.el_capitan.bottle.tar.gz
|
||||||
wget https://builds.shiki.hu/homebrew/qt5.rb ;
|
|
||||||
wget https://builds.shiki.hu/homebrew/qt5-5.7.1_1.el_capitan.bottle.tar.gz ;
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Copy custom libtorrent bottle to homebrew's cache so it can find and install it
|
# Copy custom libtorrent bottle to homebrew's cache so it can find and install it
|
||||||
# Also install our custom libtorrent formula by passing the local path to it
|
# Also install our custom libtorrent formula by passing the local path to it
|
||||||
# These 2 files are restored from Travis' cache.
|
# These 2 files are restored from Travis' cache.
|
||||||
cp "$HOME/hombebrew_cache/libtorrent-rasterbar-1.0.10.el_capitan.bottle.tar.gz" "$(brew --cache)" ;
|
cp "$HOME/hombebrew_cache/libtorrent-rasterbar-1.1.6+git20180101.b45acf28a5+patched-configure.el_capitan.bottle.tar.gz" "$(brew --cache)"
|
||||||
brew install "$HOME/hombebrew_cache/libtorrent-rasterbar.rb" ;
|
brew install "$HOME/hombebrew_cache/libtorrent-rasterbar.rb"
|
||||||
|
|
||||||
# Qt
|
if [ "$build_system" = "cmake" ]; then
|
||||||
if [ "$qt" = 4 ]; then brew install qt && ln -s /usr/local/Cellar/qt/4.8.7_2/plugins /usr/local ; fi ;
|
brew outdated cmake || brew upgrade cmake
|
||||||
if [ "$qt" = 5 ]; then
|
brew install ninja
|
||||||
# Copy custom qt5 bottle to homebrew's cache so it can find and install it
|
|
||||||
# Also install our custom qt5 formula by passing the local path to it
|
ln -s /usr/local/opt/qt/mkspecs /usr/local/mkspecs
|
||||||
# These 2 files are restored from Travis' cache.
|
ln -s /usr/local/opt/qt/plugins /usr/local/plugins
|
||||||
cp "$HOME/hombebrew_cache/qt5-5.7.1_1.el_capitan.bottle.tar.gz" "$(brew --cache)" ;
|
|
||||||
brew install "$HOME/hombebrew_cache/qt5.rb" ;
|
|
||||||
brew link --force qt5 ;
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
MY_CMAKE_OPENSSL_HINT="-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/"
|
||||||
fi
|
fi
|
||||||
- |
|
- |
|
||||||
if [ "$TRAVIS_BRANCH" != "$coverity_branch" ]; then
|
if [ "$TRAVIS_BRANCH" != "$coverity_branch" ]; then
|
||||||
@@ -162,22 +161,41 @@ install:
|
|||||||
|
|
||||||
script:
|
script:
|
||||||
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ]; then exit ; fi # skip usual build when running coverity scan
|
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ]; then exit ; fi # skip usual build when running coverity scan
|
||||||
- cd "$TRAVIS_BUILD_DIR" && ./bootstrap.sh && ./configure $qbtconf
|
|
||||||
- |
|
- |
|
||||||
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
cd "$TRAVIS_BUILD_DIR"
|
||||||
sed -i "" -e "s/^\(CC.*&&\).*$/\1 $CC/" src/Makefile ; # workaround for Qt & ccache: https://bugreports.qt.io/browse/QTBUG-31034
|
if [ "$build_system" = "cmake" ]; then
|
||||||
sed -i "" -e "s/^\(CXX.*&&\).*$/\1 $CXX/" src/Makefile ;
|
mkdir build
|
||||||
sed -i "" -e 's/^\(CXXFLAGS.*\)$/\1 -Wno-unused-local-typedefs -Wno-inconsistent-missing-override/' src/Makefile ;
|
cd build
|
||||||
|
cmake -DGUI=${gui} -DCMAKE_INSTALL_PREFIX="$qbt_path" "$MY_CMAKE_OPENSSL_HINT" \
|
||||||
|
-G "Ninja" -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE ..
|
||||||
|
BUILD_TOOL="ninja"
|
||||||
fi
|
fi
|
||||||
- make && make install
|
if [ "$build_system" = "qmake" ]; then
|
||||||
|
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
|
# For some reason for RC_1_1 we need to also specify the OpenSSL compiler/linker flags
|
||||||
|
# Homebrew doesn't symlink OpenSSL for security reasons
|
||||||
|
./bootstrap.sh && ./configure $qbtconf CXXFLAGS="$(PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" pkg-config --cflags openssl)" LDFLAGS="$(PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" pkg-config --libs openssl)"
|
||||||
|
sed -i "" -e "s/^\(CC.*&&\).*$/\1 $CC/" src/Makefile # workaround for Qt & ccache: https://bugreports.qt.io/browse/QTBUG-31034
|
||||||
|
sed -i "" -e "s/^\(CXX.*&&\).*$/\1 $CXX/" src/Makefile
|
||||||
|
sed -i "" -e 's/^\(CXXFLAGS.*\)$/\1 -Wno-unused-local-typedefs -Wno-inconsistent-missing-override/' src/Makefile
|
||||||
|
else
|
||||||
|
./bootstrap.sh && ./configure $qbtconf
|
||||||
|
fi
|
||||||
|
BUILD_TOOL="make"
|
||||||
|
fi
|
||||||
|
- $BUILD_TOOL && $BUILD_TOOL install
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
- if [ "$gui" = true ]; then qbt_exe="qbittorrent" ; else qbt_exe="qbittorrent-nox" ; fi
|
- if [ "$gui" = true ]; then qbt_exe="qbittorrent" ; else qbt_exe="qbittorrent-nox" ; fi
|
||||||
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then cd "$qbt_path/bin" ; fi
|
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then cd "$qbt_path/bin" ; fi
|
||||||
- |
|
- |
|
||||||
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
macdeployqt "$TRAVIS_BUILD_DIR/src/$qbt_exe.app" ;
|
if [ "$build_system" = "qmake" ]; then
|
||||||
cd "$TRAVIS_BUILD_DIR/src/$qbt_exe.app/Contents/MacOS" ;
|
macdeployqt "$TRAVIS_BUILD_DIR/src/$qbt_exe.app"
|
||||||
|
cd "$TRAVIS_BUILD_DIR/src/$qbt_exe.app/Contents/MacOS"
|
||||||
|
else
|
||||||
|
cd "$qbt_path/$qbt_exe.app/Contents/MacOS"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
- ./$qbt_exe --version
|
- ./$qbt_exe --version
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[main]
|
[main]
|
||||||
host = https://www.transifex.com
|
host = https://www.transifex.com
|
||||||
|
|
||||||
[qbittorrent.qbittorrent_v3_3_x]
|
[qbittorrent.qbittorrent_master]
|
||||||
file_filter = src/lang/qbittorrent_<lang>.ts
|
file_filter = src/lang/qbittorrent_<lang>.ts
|
||||||
lang_map = pt: pt_PT
|
lang_map = pt: pt_PT
|
||||||
source_file = src/lang/qbittorrent_en.ts
|
source_file = src/lang/qbittorrent_en.ts
|
||||||
|
|||||||
16
AUTHORS
@@ -34,6 +34,14 @@ Code from other projects:
|
|||||||
license: GPLv2/3
|
license: GPLv2/3
|
||||||
|
|
||||||
Images Authors:
|
Images Authors:
|
||||||
|
* files: src/icons/skin/qbittorrent-tray.svg (and related pngs)
|
||||||
|
copyright: Provided by HVS <hvs linuxmail org> (raster first proposal) and Atif Afzal(@atfzl github) <atif5801@gmail.com> (vectorized and modified)
|
||||||
|
license: GPLv2+
|
||||||
|
|
||||||
|
* files: src/qbittorrent_file.ico src/icons/fileicon.svg
|
||||||
|
copyright: 'uknown.svg' (LGPLv3+) from Oxygen Icon Theme was used as base which was slightly modified and 'qbittorrent-tray.svg' (GPLv2+) was overlayed above it.
|
||||||
|
license: GPLv3+
|
||||||
|
|
||||||
* files: src/icons/*.png
|
* files: src/icons/*.png
|
||||||
copyright: Gnome Icon Theme
|
copyright: Gnome Icon Theme
|
||||||
license: GPLv2
|
license: GPLv2
|
||||||
@@ -44,10 +52,10 @@ Images Authors:
|
|||||||
license: LGPL
|
license: LGPL
|
||||||
url: http://www.oxygen-icons.org
|
url: http://www.oxygen-icons.org
|
||||||
|
|
||||||
* files: src/icons/flags/*.png
|
* files: src/icons/flags/*.svg
|
||||||
copyright: Mark James <mjames@gmail.com>
|
copyright: lipis/flag-icon-css
|
||||||
license: Public Domain
|
license: MIT
|
||||||
url: http://www.famfamfam.com
|
url: https://github.com/lipis/flag-icon-css/
|
||||||
|
|
||||||
* files: src/icons/skin/*.png
|
* files: src/icons/skin/*.png
|
||||||
files: src/menuicons/YYxYY/*.png
|
files: src/menuicons/YYxYY/*.png
|
||||||
|
|||||||
@@ -22,13 +22,8 @@ add_definitions(-DQBT_VERSION_MINOR=${VER_MINOR})
|
|||||||
add_definitions(-DQBT_VERSION_BUGFIX=${VER_BUGFIX})
|
add_definitions(-DQBT_VERSION_BUGFIX=${VER_BUGFIX})
|
||||||
add_definitions(-DQBT_VERSION_BUILD=${VER_BUILD})
|
add_definitions(-DQBT_VERSION_BUILD=${VER_BUILD})
|
||||||
|
|
||||||
# os2 {
|
|
||||||
# DEFINES += DQBT_VERSION=\'\"v$${PROJECT_VERSION}\"\'
|
|
||||||
# DEFINES += DQBT_VERSION_2=\'\"$${PROJECT_VERSION}\"\'
|
|
||||||
# } else {
|
|
||||||
add_definitions(-DQBT_VERSION="v${PROJECT_VERSION}")
|
add_definitions(-DQBT_VERSION="v${PROJECT_VERSION}")
|
||||||
add_definitions(-DQBT_VERSION_2="${PROJECT_VERSION}")
|
add_definitions(-DQBT_VERSION_2="${PROJECT_VERSION}")
|
||||||
# }
|
|
||||||
|
|
||||||
if (UNIX AND NOT APPLE)
|
if (UNIX AND NOT APPLE)
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
@@ -41,11 +36,8 @@ endif(WIN32)
|
|||||||
# we need options here, because they are used not only in "src" subdir, but in the "dist" dir too
|
# we need options here, because they are used not only in "src" subdir, but in the "dist" dir too
|
||||||
include(CMakeDependentOption)
|
include(CMakeDependentOption)
|
||||||
|
|
||||||
option(QT5 "Compile using Qt5" ON)
|
|
||||||
option(SYSTEM_QTSINGLEAPPLICATION
|
option(SYSTEM_QTSINGLEAPPLICATION
|
||||||
"Use the system qtsingleapplication library or shipped one otherwise")
|
"Use the system qtsingleapplication library or shipped one otherwise")
|
||||||
cmake_dependent_option(SYSTEM_QJSON
|
|
||||||
"Use the shipped qjson library or the system one (Qt4 only)" OFF "NOT QT5" OFF)
|
|
||||||
|
|
||||||
option(GUI "Allows to disable GUI for headless running. Disables QtDBus and the GeoIP Database" ON)
|
option(GUI "Allows to disable GUI for headless running. Disables QtDBus and the GeoIP Database" ON)
|
||||||
|
|
||||||
|
|||||||
@@ -231,8 +231,8 @@ Example:
|
|||||||
|
|
||||||
#include <libtorrent/version.hpp>
|
#include <libtorrent/version.hpp>
|
||||||
|
|
||||||
#include "base/bittorrent/session.h"
|
|
||||||
#include "base/bittorrent/infohash.h"
|
#include "base/bittorrent/infohash.h"
|
||||||
|
#include "base/bittorrent/session.h"
|
||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/misc.h"
|
#include "base/utils/misc.h"
|
||||||
#include "base/utils/string.h"
|
#include "base/utils/string.h"
|
||||||
@@ -240,7 +240,23 @@ Example:
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 9. Misc. ###
|
### 9. Include guard. ###
|
||||||
|
`#pragma once` should be used instead of "include guard" in new code:
|
||||||
|
```c++
|
||||||
|
// examplewidget.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class ExampleWidget : public QWidget
|
||||||
|
{
|
||||||
|
// (some code omitted)
|
||||||
|
};
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10. Misc. ###
|
||||||
|
|
||||||
* Line breaks for long lines with operation:
|
* Line breaks for long lines with operation:
|
||||||
|
|
||||||
@@ -282,20 +298,32 @@ auto spinBox = static_cast<QSpinBox*>(sender());
|
|||||||
// we know the variable type based on the right-hand expression
|
// we know the variable type based on the right-hand expression
|
||||||
```
|
```
|
||||||
|
|
||||||
* Space around operations eg `a = b + c` or `a=b+c`:
|
* Notice the spaces in the following specific situations:
|
||||||
|
|
||||||
Before and after the assignment and other binary (and ternary) operators there should be a space.<br/>
|
|
||||||
There should not be a space between increment/decrement and its operand.<br/>
|
|
||||||
Some valid use cases:
|
|
||||||
```c++
|
```c++
|
||||||
|
// Before and after the assignment and other binary (and ternary) operators there should be a space
|
||||||
|
// There should not be a space between increment/decrement and its operand
|
||||||
a += 20;
|
a += 20;
|
||||||
a = (b <= MAX_B ? b : MAX_B);
|
a = (b <= MAX_B ? b : MAX_B);
|
||||||
++a;
|
++a;
|
||||||
b--;
|
--b;
|
||||||
|
|
||||||
for (int a = 0; a < b; ++b) {
|
for (int a = 0; a < b; ++b) {
|
||||||
// code
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Range-based for loop, spaces before and after the colon
|
||||||
|
for (auto i : container) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Derived class, spaces before and after the colon
|
||||||
|
class Derived : public Base
|
||||||
|
{
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
* Prefer pre-increment, pre-decrement operators
|
||||||
|
```c++
|
||||||
|
++i, --j; // Yes
|
||||||
|
i++, j--; // No
|
||||||
```
|
```
|
||||||
|
|
||||||
* private/public/protected must not be indented
|
* private/public/protected must not be indented
|
||||||
|
|||||||
736
Changelog
@@ -1,3 +1,177 @@
|
|||||||
|
* Fri Feb 16 2018 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.0.4
|
||||||
|
- FEATURE: Add source field in Torrent creator. Closes #7965. (Chocobo1)
|
||||||
|
- FEATURE: Torrent creator: raise maximum piece size to 32 MiB (Chocobo1)
|
||||||
|
- FEATURE: Add a force reannounce option in the transfer list context menu. Closes #6448. (Jesse Bryan)
|
||||||
|
- BUGFIX: Fix sorting of country flags column in Peers tab. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix natural sorting when the common part of 2 strings ends partially in a number which continues in the uncommon part. Closes #8080 #6732. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix application of speed limits on LAN and μTP connections. Closes #7745. (sledgehammer999)
|
||||||
|
- BUGFIX: Make peer information flags in peerlist more readable. (thalieht)
|
||||||
|
- BUGFIX: Fix gui issues on high DPI monitor. (Chocobo1)
|
||||||
|
- BUGFIX: Fix dialog and column size on high DPI monitors. (Chocobo1)
|
||||||
|
- BUGFIX: Fix constant status of '[F] Downloading'. Closes #7628. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix translation context. Closes #8211. (sledgehammer999)
|
||||||
|
- BUGFIX: Separate subnet whitelist options into two lines. (Thomas Piccirello)
|
||||||
|
- BUGFIX: Don't set application name twice. (Luís Pereira)
|
||||||
|
- BUGFIX: Set default file log size to 65 KiB and delete backup logs older than 1 month. (sledgehammer999)
|
||||||
|
- WEBUI: Only prepend scheme when it is not present. Closes #8057. (Chocobo1)
|
||||||
|
- WEBUI: Add "Remaining" and "Availability" columns to webui Content tab. (Thomas Piccirello)
|
||||||
|
- WEBUI: Make value formatting consistent with GUI (Thomas Piccirello)
|
||||||
|
- WEBUI: Reposition Total Size column to match gui (Thomas Piccirello)
|
||||||
|
- WEBUI: Add Tags and Time Active columns (Thomas Piccirello)
|
||||||
|
- WEBUI: Use https for www.qbittorrent.org (Thomas Piccirello)
|
||||||
|
- WEBUI: Match webui statuses to gui, closes #7516 (Thomas Piccirello)
|
||||||
|
- WEBUI: Right-align stat values (Thomas Piccirello)
|
||||||
|
- WEBUI: Add missing units. (Thomas Piccirello)
|
||||||
|
- RSS: Fix crash when deleting rule because it tries to update. Closes #8094 (glassez)
|
||||||
|
- RSS: Don't process new/updated RSS rules when disabled (glassez)
|
||||||
|
- RSS: Remove legacy and corrupted RSS settings (glassez)
|
||||||
|
- SEARCH: Search only when category is supported by plugin. Closes #8053. (jan.karberg)
|
||||||
|
- SEARCH: Only add search separators as needed. (Thomas Piccirello)
|
||||||
|
- COSMETIC: Tweak spacing in torrent properties widget and speed widget. (Chocobo1)
|
||||||
|
- WINDOWS: Use standard folder icon for open file behavior on Windows. Closes #7880. (Chocobo1)
|
||||||
|
- WINDOWS: Revert "Run external program" function. Now you will not be able to directly run batch scripts. (Chocobo1)
|
||||||
|
- MACOS: Fix torrent file selection in Finder on mac (vit9696)
|
||||||
|
- MACOS: Fix Finder reveal in preview and torrent contents (vit9696)
|
||||||
|
- MACOS: Fix cmd+w not closing the main window on macOS (vit9696)
|
||||||
|
- OTHER: Fix splitting of compiler flags in configure. Autoconf removes a set of [] during script translation, resulting in a wrong sed command. (sledgehammer999)
|
||||||
|
- OTHER: configure: Parse all compiler related flags together. (sledgehammer999)
|
||||||
|
- OTHER: Update copyright year. (sledgehammer999)
|
||||||
|
|
||||||
|
* Sun Dec 17 2017 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.0.3
|
||||||
|
- BUGFIX: Add height padding to the transfer list icons. Closes #7951. (sledgehammer999)
|
||||||
|
- BUGFIX: Allow to drag-n-drop URLs into mainwindow to initiate download. (Chocobo1)
|
||||||
|
- BUGFIX: Fix crash when fitlering search results. Stable sorting is removed. Closes #7952.(Chocobo1)
|
||||||
|
- WEBUI: Fix missing qbt logo on login page in webUI. Closes #7953. (Chocobo1)
|
||||||
|
- WEBUI: Add check to avoid type error after logout. (Chocobo1)
|
||||||
|
- WEBUI: Use POST for logout command. This is to avoid browser being smart to prefetch the link then logging out the user. (Chocobo1)
|
||||||
|
- WEBUI: Fix WebUI is not reachable via IPv6. (glassez)
|
||||||
|
- WINDOWS: Disable the "?" help button in all dialogs on Windows. Closes #7365. Requires Qt 5.10. (Chocobo1)
|
||||||
|
|
||||||
|
* Fri Dec 01 2017 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.0.2
|
||||||
|
- BUGFIX: Fix crash on some systems when creating address object for 255.255.255.255. Closes #7735. (sledgehammer999)
|
||||||
|
- PERFORMANCE: Change MixedModeAlgorithm default to TCP. This was the v3_3_x default and should sustain higher speeds. Closes #7779. (Chocobo1)
|
||||||
|
- PERFORMANCE: Stop logging IP filter parsing errors after a while, otherwise the GUI freezes or qBittorrent doesn't start. (sledgehammer999)
|
||||||
|
- GUI: Implement stable sort. Rows in transfer list shouldn't flicker anymore. (Chocobo1)
|
||||||
|
- WEBUI: Fix build when webui is disabled. (Heiko Becker)
|
||||||
|
- RSS: Fix build because of missing header. Closes #7805. (thoradia)
|
||||||
|
- RSS: Fix RSS parser. (glassez)
|
||||||
|
- RSS: Implement Import/Export RSS rules in legacy(aka v3_3_x) format. (glassez)
|
||||||
|
- RSS: Implement Import/Export RSS rules in JSON format. (glassez)
|
||||||
|
- WINDOWS: Fixed blurry text under Windows by setting DPI awareness to default. (TheNicker)
|
||||||
|
- LINUX: Fix i386 build. (Evgeny Lensky)
|
||||||
|
|
||||||
|
* Wed Nov 22 2017 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.0.1
|
||||||
|
- BUGFIX: Fix crash on opening torrent/magnet (uninitialized pointer). Closes #7739 #7723. (sledgehammer999)
|
||||||
|
- BUGFIX: Enable preferences Apply button when ip banlist is modified (Thomas Piccirello)
|
||||||
|
- BUGFIX: Allow drag-n-drop magnet links to mainwindow. Closes #7742. (Chocobo1)
|
||||||
|
- BUGFIX: Fix crash when aborting a torrent creation process. Closes #7783. (Chocobo1)
|
||||||
|
- BUGFIX: Correctly check if torrent passed during application start already exists. (sledgehammer999)
|
||||||
|
- WEBUI: Add ip subnet whitelist for bypassing webui auth (Thomas Piccirello)
|
||||||
|
- WEBUI: Fix logo missing in login page (Chocobo1)
|
||||||
|
- COSMETIC: Fix english typo. (sledgehammer999)
|
||||||
|
- OTHER: cmake: qtsingleapplication should always be built statically (luigino)
|
||||||
|
|
||||||
|
* Mon Nov 20 2017 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.0.0
|
||||||
|
- FEATURE: Change qbittorrent logo. Issue #6467. (HVS, Atif Afzal, sledgehammer999)
|
||||||
|
- FEATURE: New icon theme with SVG source, so we can scale it appropriately in the future. (Bert Verhelst)
|
||||||
|
- FEATURE: Drop Qt 4 support. Raise minimum Qt version to 5.5.1 (evsh)
|
||||||
|
- FEATURE: UI for managing locally banned IP list (dzmat)
|
||||||
|
- FEATURE: Support for specifying where to save/load config files. Support for portable mode. (evsh)
|
||||||
|
- FEATURE: It is now possible to pass options via ENV variables instead of cmd options. (evsh)
|
||||||
|
- FEATURE: Allow to strip subfolder in multifile torrents. (glassez, sledgehammer999)
|
||||||
|
- FEATURE: Allow cmd args to specify options when adding torrents. (Brian Kendall)
|
||||||
|
- FEATURE: Widget for showing filesystem paths while typing. Used in the Add New Torrent and Options dialogs. (evsh)
|
||||||
|
- FEATURE: Trackerlist: Allow to toggle columns (thalieht)
|
||||||
|
- FEATURE: Add availability column to torrent content model and torrent properties window (evsh)
|
||||||
|
- FEATURE: Implemented share limit by seeding time (naikel)
|
||||||
|
- FEATURE: Revamp Torrent creator (Chocobo1)
|
||||||
|
- FEATURE: Enable drag n drop to create torrent on mainwindow (Chocobo1)
|
||||||
|
- FEATURE: Add show/hide statusbar option (takiz)
|
||||||
|
- FEATURE: Show number of pieces. Closes #6774. (Chocobo1)
|
||||||
|
- FEATURE: Allow to select & delete multiple entries in "Manage Cookies" dialog (Chocobo1)
|
||||||
|
- FEATURE: Fetch Favicons via google as a final fallback (KingLucius)
|
||||||
|
- FEATURE: Add a Tags (multi-label) feature to the GUI. Closes #13. (tgregerson)
|
||||||
|
- FEATURE: Use the system icons for each file type in the Content tab (evsh)
|
||||||
|
- FEATURE: Use SVG files for monochrome tray icons. Closes #6085. (evsh)
|
||||||
|
- FEATURE: Prefill torrent name when creating a new torrent. Closes #7229. (Chocobo1)
|
||||||
|
- FEATURE: Expose more libtorrent options in advanced settings (Chocobo1)
|
||||||
|
- FEATURE: Add comboBox for selecting BitTorrent protocol. Closes #6316. (Chocobo1)
|
||||||
|
- FEATURE: Allow SMTP sender to be set. Closes #7575. (Chocobo1)
|
||||||
|
- FEATURE: Allow to specify if announcing to all tiers is desired. (sledgehammer999)
|
||||||
|
- FEATURE: Configurable number of history of paths in Add New Torrent dialog. (evsh)
|
||||||
|
- BUGFIX: Adjust icons names to better fit FDO scheme (evsh)
|
||||||
|
- BUGFIX: Optimized IP filter parsing, making blazingly fast (sledgehammer999, evsh)
|
||||||
|
- BUGFIX: Fix dialogs didn't position on the correct screen which qBittorrent window is on. Closes #1690, #2474, #3538. (Chocobo1)
|
||||||
|
- BUGFIX: Refactor and improve StatusBar (glassez)
|
||||||
|
- BUGFIX: Set expiration date for newly added cookie to +2 years from now, instead of +99 years. (Chocobo1)
|
||||||
|
- BUGFIX: Don't create subfolder inside temp folder (glassez)
|
||||||
|
- BUGFIX: Don't replace existing files when relocating torrent (glassez)
|
||||||
|
- BUGFIX: Fix explicit Torrent Management Mode in Add New Torrent dialog. Closes #5602. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix calculation of 'Average time in queue' stat under libtorrent 1.1.x (sledgehammer999)
|
||||||
|
- BUGFIX: Don't disable bandwidth scheduler when manually switching speed limits. Closes #7306. (glassez)
|
||||||
|
- BUGFIX: Fix dereferencing freed pointer. Closes #7420. (Chocobo1)
|
||||||
|
- BUGFIX: Change the default cache size to 64MiB. (Chocobo1)
|
||||||
|
- BUGFIX: The previous "Disk write cache size" is not accurate since it is also being used for read cache, so rename it to "Disk cache". (Chocobo1)
|
||||||
|
- BUGFIX: Replace dialog ok-cancel buttons with QDialogButtonBox, which follows the platform specific button order. (Chocobo1)
|
||||||
|
- BUGFIX: Better reporting of success/failure of torrent and file deletion. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix last activity calculation. Closes #7461. (Chocobo1)
|
||||||
|
- BUGFIX: Save state of options windows on cancel too. (silverqx)
|
||||||
|
- BUGFIX: Persist size and treeview header state in preview dialog. (silverqx)
|
||||||
|
- BUGFIX: Show torrent name in "add new torrent" dialog on merging trackers (Chocobo1)
|
||||||
|
- BUGFIX: Properly pre-select the selected torrent's current ratio limiting options in UpDownRatioDlg dialogs. Fixes #7352 (thalieht)
|
||||||
|
- BUGFIX: Optimize code for SpeedWidget. (dzmat)
|
||||||
|
- BUGFIX: Disable processing events when adding torrents(prevents crashes). Closes #7436. (Chocobo1)
|
||||||
|
- BUGFIX: Open links in browser. Closes #7651. (Chocobo1)
|
||||||
|
- BUGFIX: Change default settings for tracker/tier announces to mimick μTorrent behavior. (sledgehammer999)
|
||||||
|
- BUGFIX: Explicitly set UPnP state on start-up. Closes #7338. (Chocobo1)
|
||||||
|
- BUGFIX: Include/print caught signal in stackdump (Chocobo1)
|
||||||
|
- COSMETIC: Trackerlist: Set text alignment of columns with numbers to the right (thalieht)
|
||||||
|
- COSMETIC: Enable alternatingRowColors for "Manage Cookie" dialog (Chocobo1)
|
||||||
|
- COSMETIC: Remove indentation for category/tag filter widgets in all platforms (thalieht)
|
||||||
|
- COSMETIC: Add space between widgets in left side panel. Closes #7224. (Chocobo1, glassez)
|
||||||
|
- COSMETIC: Unify preference window borders across the tabs (vit9696)
|
||||||
|
- COSMETIC: Center Options dialog when showed. (silverqx)
|
||||||
|
- COSMETIC: Show delete accelerator key in menu. closes #7508 (Nick Korotysh)
|
||||||
|
- COSMETIC: Set QTextOption::NoWrap property in "Download from URLs" dialog (Chocobo1)
|
||||||
|
- COSMETIC: Use SVG icons for the country flags. Closes #6223. (sledgehammer999)
|
||||||
|
- WEBUI: Allow to load/use ECDSA certificate in webUI. (Chocobo1)
|
||||||
|
- WEBUI: Add copy options to webui context menu (addresses #6815) (#7036) (Tom Piccirello)
|
||||||
|
- WEBUI: Set torrent location from webui context menu (addresses #6815) (#7062) (Tom Piccirello)
|
||||||
|
- WEBUI: Add option to rename torrent from WebUI (Thomas Piccirello)
|
||||||
|
- WEBUI: Add auto torrent management to webui context menu (addresses #6815) (Thomas Piccirello)
|
||||||
|
- WEBUI: Option for "Create subfolder" when adding new torrent. (thalieht)
|
||||||
|
- WEBUI: Fix addPaused wrong default behavior. (Chocobo1)
|
||||||
|
- WEBUI: Reposition "Priority" menu option in WebUI to match gui. Closes #7072. (Thomas Piccirello)
|
||||||
|
- WEBUI: Report TCPServer errorString() if webui fails to listen to port. (Matthew Fioravante)
|
||||||
|
- WEBUI: Exit gracefully when failed to initialize web server with qbt-nox (Chocobo1)
|
||||||
|
- WEBUI: Add file-to-piece-index mappings in /query/propertiesFiles command (Chocobo1)
|
||||||
|
- WEBUI: Add optional parameters for /command/download & /command/upload (Chocobo1)
|
||||||
|
- WEBUI: Print error messages upon receiving invalid header fields. (Chocobo1)
|
||||||
|
- WEBUI: Add WebUi\Address config option. (Matthew Fioravante)
|
||||||
|
- WEBUI: Reinitialize webUI server when "IP address" setting changed. An app restart won't be necessary from now on. (Chocobo1)
|
||||||
|
- WEBUI: Improve log and error messages (Chocobo1)
|
||||||
|
- SEARCH: Use explicit class for search plugin versions (evsh)
|
||||||
|
- SEARCH: Remove all search plugins from repo. There is another repo named 'search-plugins'. (sledgehammer999)
|
||||||
|
- SEARCH: Update the backend when a new plugin favicon is downloaded. (sledgehammer999)
|
||||||
|
- SEARCH: Allow search plugins sorting. Closes #7526. (Nick Korotysh)
|
||||||
|
- RSS: Redesigned RSS subsystem (glassez)
|
||||||
|
- RSS: Do not use hardcoded colors in RSS feed view (evsh)
|
||||||
|
- RSS: Improve RSS events logging (glassez)
|
||||||
|
- WINDOWS: Use dpiawareness=1 on Windows. Closes #5393. (sledgehammer999)
|
||||||
|
- WINDOWS: Reformat Windows build configuration files. (glassez)
|
||||||
|
- LINUX: Allow custom tray icons when system icon theme is used. Closes #7403. (evsh)
|
||||||
|
- MACOS: Various macOS UI improvements (vit9696)
|
||||||
|
- MACOS: Fix main menu item location on macOS (vit9696)
|
||||||
|
- MACOS: Fix macOS window restoration after using hide icon (vit9696)
|
||||||
|
- MACOS: Fix notification display on macOS (vit9696)
|
||||||
|
- OTHER: Use new classes/methods from libtorrent and stop using deprecate ones. (glassez)
|
||||||
|
- OTHER: Various string fixes (Allan Nordhøy, sledgehammer999)
|
||||||
|
- OTHER: cmake: do not use Qt5Widgets when locating QtSingleApplication. Closes #7551. (evsh)
|
||||||
|
- OTHER: Update BOOST m4 macros and simplify AX_BOOST_BASE usage (Chocobo1)
|
||||||
|
- OTHER: Drop OS/2 support. (sledgehammer999)
|
||||||
|
- OTHER: Optimize file size of PNG and SVG files. (sledgehammer999)
|
||||||
|
- OTHER: Add new translators in the About page.
|
||||||
|
|
||||||
* Thu Jun 01 2017 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.13
|
* Thu Jun 01 2017 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.13
|
||||||
- BUGFIX: Fixed UI glitch about torrent numbers in the sidepanel. Fixes #6454. (evsh)
|
- BUGFIX: Fixed UI glitch about torrent numbers in the sidepanel. Fixes #6454. (evsh)
|
||||||
- BUGFIX: Fix downloaded/uploaded columns were not highlighted properly when selected. (Chocobo1)
|
- BUGFIX: Fix downloaded/uploaded columns were not highlighted properly when selected. (Chocobo1)
|
||||||
@@ -280,7 +454,6 @@
|
|||||||
- OTHER: Use new alert dispathing API for libtorrent 1.1.x (glassez)
|
- OTHER: Use new alert dispathing API for libtorrent 1.1.x (glassez)
|
||||||
- OTHER: Fix gcc 6 compilation with qmake. See #5237. (sledgehammer999)
|
- OTHER: Fix gcc 6 compilation with qmake. See #5237. (sledgehammer999)
|
||||||
|
|
||||||
|
|
||||||
* Tue Mar 29 2016 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.4
|
* Tue Mar 29 2016 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.4
|
||||||
- FEATURE: Download more pieces in "Download first and last pieces first" feature (ngosang)
|
- FEATURE: Download more pieces in "Download first and last pieces first" feature (ngosang)
|
||||||
- FEATURE: Unlock first column in peerlist too (thalieht)
|
- FEATURE: Unlock first column in peerlist too (thalieht)
|
||||||
@@ -413,7 +586,6 @@
|
|||||||
- COSMETIC: Change text description for half-open connection (Chocobo1)
|
- COSMETIC: Change text description for half-open connection (Chocobo1)
|
||||||
- OTHER: Change update URL to FossHub. Closes #4188. (sledgehammer999)
|
- OTHER: Change update URL to FossHub. Closes #4188. (sledgehammer999)
|
||||||
|
|
||||||
|
|
||||||
* Sun Nov 29 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.0
|
* Sun Nov 29 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.0
|
||||||
- FEATURE: Huge core code refactoring. Problems with labels, temp folders etc should be eliminated. Smoother UI should be observed too. (glassez)
|
- FEATURE: Huge core code refactoring. Problems with labels, temp folders etc should be eliminated. Smoother UI should be observed too. (glassez)
|
||||||
- FEATURE: Speed graph (Anton Lashkov)
|
- FEATURE: Speed graph (Anton Lashkov)
|
||||||
@@ -466,6 +638,166 @@
|
|||||||
- OTHER: Reduce max value of "Disk cache size" to 1536MB for 32bit. Closes to #4028. (Chocobo1)
|
- OTHER: Reduce max value of "Disk cache size" to 1536MB for 32bit. Closes to #4028. (Chocobo1)
|
||||||
- OTHER: Make "Download in sequential order" and "Download first and last piece first" options independent. (glassez)
|
- OTHER: Make "Download in sequential order" and "Download first and last piece first" options independent. (glassez)
|
||||||
|
|
||||||
|
* Sat Oct 31 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.5
|
||||||
|
- BUGFIX: Fix difficult to reproduce crash. (glassez)
|
||||||
|
- OTHER: Fix Windows' Qt5 build. (Gelmir)
|
||||||
|
|
||||||
|
* Sat Oct 10 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.4
|
||||||
|
- FEATURE: Select the file of single file torrents when opening destination folder (pmzqla)
|
||||||
|
- BUGFIX: Fix crash with invalid favicon. Closes #3632. (glassez)
|
||||||
|
- BUGFIX: Try to download favicon.png when the download of favicon.ico fails (pmzqla)
|
||||||
|
- BUGFIX: Try to avoid loading a corrupted configuration file. Also log errors encountered while saving/loading the configuration. Closes #3503. (sledgehammer999)
|
||||||
|
- BUGFIX: Allow adding torrent link from Torcache (jsayol)
|
||||||
|
- BUGFIX: Don't limit the number of torrents that can be announced to the tracker/dht/lsd. Closes #3473. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix potential crash when memory allocation failed. Closes #3877. (Chocobo1)
|
||||||
|
- COSMETIC: Change Queue buttons order in the Toolbar (GUI & Web UI) (ngosang)
|
||||||
|
- COSMETIC: Move option "Ignore transfer limits on local network" to Speed page (Chocobo1)
|
||||||
|
- COSMETIC: Move option "Confirm torrent deletion" to Behavior page (Chocobo1)
|
||||||
|
- COSMETIC: Fix typos. Make `μTP` untranslatable. Use American variation of words. Closes #3654. (sledgehammer999)
|
||||||
|
- COSMETIC: Optimize text color for dark themes. Closes #3633 and #3815. (sledgehammer999)
|
||||||
|
- COSMETIC: Show current label in the torrent context menu. Closes #3776. (sledgehammer999)
|
||||||
|
- WEBUI: Add save_path to /query/torrents (Casey Bodley)
|
||||||
|
- WEBUI: Bump API_VERSION to 5
|
||||||
|
- SEARCH: Fix python detection when the 'Anaconda' software is installed. Closes #3731. (sledgehammer999)
|
||||||
|
- RSS: Handle magnet links as torrents instead of news URLs. Closes #3560 (ngosang)
|
||||||
|
- RSS: Trim elements text in RSS articles (ngosang)
|
||||||
|
- RSS: Fix contextual menu in RSS torrents list (ngosang)
|
||||||
|
- RSS: Improve error handling when a RSS feed doesn't contain torrents (ngosang)
|
||||||
|
- RSS: More precise message and code simplification in RSS feeds deletion (ngosang)
|
||||||
|
- RSS: Don't hide the elements in Unread list when clicked (ngosang)
|
||||||
|
- RSS: Allow multiple selection in RSS torrents list (ngosang)
|
||||||
|
- RSS: Simplify string translation (ngosang)
|
||||||
|
- RSS: Handle more types of RSS feeds (ngosang)
|
||||||
|
- RSS: Fix RSS panel position not saved (ngosang)
|
||||||
|
- RSS: Fix forgetting label changes to first item in RSS rule list. (Gelmir)
|
||||||
|
- RSS: Add label to UI when a new one is creating during rule addition. (Gelmir)
|
||||||
|
- RSS: Removes refresh message when adding a new feed (ngosang)
|
||||||
|
- RSS: Fix RSS crash when deleting RSS feeds. Closes #997, #2152, #2461, #3718, #3747, #3766, #3806, #3814, #3829 and #3846. (ngosang)
|
||||||
|
- RSS: Sort labels in RSS Downloader dialog, closes #3140. (Chocobo1)
|
||||||
|
- WINDOWS: Correctly show german letters in the installer. Closes #3574, #3566. (sledgehammer999)
|
||||||
|
- WINDOWS: Fix file selection on Explorer when the filename contains weird characters. Closes #3185. (sledgehammer999)
|
||||||
|
- WINDOWS: Fix wrong default download directory in Windows. Closes #2625. (Chocobo1)
|
||||||
|
- WINDOWS: Fix German translation of the installer. (netswap)
|
||||||
|
- LINUX: Fix broken .desktop file icon for some locales. See #3905. (sledgehammer999)
|
||||||
|
- OTHER: Fix ppc64le detection during configure (sledgehammer999)
|
||||||
|
- OTHER: Don't use sed in configure. Closes #3169. (pmzqla)
|
||||||
|
- OTHER: Fix broken donation link. Closes #3771. (sledgehammer999)
|
||||||
|
- OTHER: Add forum link in README. Closes #3853. (sledgehammer999)
|
||||||
|
- OTHER: New translation: Esperanto
|
||||||
|
- OTHER: Fix Qt5 nox build on non-Windows. (sledgehammer999)
|
||||||
|
|
||||||
|
* Sun Aug 02 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.3
|
||||||
|
- BUGFIX: Fix crash when closing a search tab while search is running (pmzqla)
|
||||||
|
- SEARCH: Other minor search fixes and improvements (pmzqla)
|
||||||
|
|
||||||
|
* Sat Aug 01 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.2
|
||||||
|
- FEATURE: Allow to force reannounce DHT too (Chocobo1)
|
||||||
|
- FEATURE: Implement an option to disable confirmation of torrent recheck (blaxspirit)
|
||||||
|
- FEATURE: Allow to copy all the trackers with a keyboard shortcut (pmzqla)
|
||||||
|
- BUGFIX: Fix torrent renaming. Closes #3398 (ngosang)
|
||||||
|
- BUGFIX: Fix localhost address (::ffff:127.0.0.1) is not recognized when connecting to WebUI (Chocobo1)
|
||||||
|
- BUGFIX: Fix '&' character in label name becomes accelerator key, closes #3454. (Chocobo1)
|
||||||
|
- BUGFIX: Fix HTTP header parsing when torrent filename contains a semicolon. Closes #3511.
|
||||||
|
- BUGFIX: Fix installing search plugin from local file. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix installing search plugin by drag-n-dropping file. (sledgehammer999)
|
||||||
|
- COSMETIC: Update color scheme of completed.png icon. (sledgehammer999)
|
||||||
|
- COSMETIC: Fix printing of the copyright symbol in the About dialog. (sledgehammer999)
|
||||||
|
- COSMETIC: Minor changes in Preview File dialog (ngosang)
|
||||||
|
- COSMETIC: Add Force Resume icon (ngosang)
|
||||||
|
- COSMETIC: Add count of unread items to RSS tab label (pmzqla)
|
||||||
|
- WEBUI: Ports between 1 and 65535 as in the GUI. Closes #1602 (ngosang)
|
||||||
|
- WEBUI: Fix an error in Content tab when the torrent doesn't have metadata (ngosang)
|
||||||
|
- WEBUI: New option Web UI port UPNP. Closes #3358 (ngosang)
|
||||||
|
- WEBUI: Fix API Content Types. Closes #3393 (ngosang)
|
||||||
|
- WEBUI: Fix empty trackers addition (ngosang)
|
||||||
|
- WEBUI: Torrent download from hash. Closes #1173 (ngosang)
|
||||||
|
- WEBUI: Fix sort by queue number (ngosang)
|
||||||
|
- WEBUI: Open external links in a new window/tab (ngosang)
|
||||||
|
- WEBUI: Massive increase in performance. (ngosang)
|
||||||
|
- SEARCH: Search status per tab (DoumanAsh)
|
||||||
|
- SEARCH: Remove the word 'torrent' in ExtraTorrent results (ngosang)
|
||||||
|
- SEARCH: Prefer python3 over python2 on Linux and OS X (pmzqla)
|
||||||
|
- SEARCH: Show notification if Python is not found and a search is started (pmzqla)
|
||||||
|
- SEARCH: Update link to the Windows Python installer (pmzqla)
|
||||||
|
- SEARCH: Improve checks for python. Print python version and path to log. (sledgehammer999)
|
||||||
|
- SEARCH: Improve Python detection (ngosang)
|
||||||
|
- OTHER: Improvements on the build system (Chocobo1)
|
||||||
|
- OTHER: Bump minimum libtorrent version required to 1.0.6/0.16.19. (sledgehammer999)
|
||||||
|
- OTHER: New translation: Slovenian
|
||||||
|
|
||||||
|
* Sat Jul 11 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.1
|
||||||
|
- FEATURE: Change default preferences (ngosang)
|
||||||
|
- FEATURE: Add "Add link to torrent" menu in TrayIconMenu. Closes #2918. (Chocobo1)
|
||||||
|
- FEATURE: Allow to Open files from the properties pane by pressing "Enter" (pmzqla)
|
||||||
|
- FEATURE: Add checkbox option for IpFilterTrackers. (Chocobo1)
|
||||||
|
- FEATURE: Download-from-URL textbox change focus on tab key (Mayank Asthana)
|
||||||
|
- FEATURE: Increase priority value of "High" (pmzqla)
|
||||||
|
- FEATURE: Add 16 KiB, 8 MiB and 16 MiB piece sizes in Torrent Creator (ngosang)
|
||||||
|
- BUGFIX: Disable Auto piece size when creating a new torrent (ngosang)
|
||||||
|
- BUGFIX: Set default focus to cancel button in delete confirm dlg, closes #3085 (Chocobo1)
|
||||||
|
- BUGFIX: Set default focus to ok button in add new torrent dlg (Chocobo1)
|
||||||
|
- BUGFIX: Set default focus to no button in exit confirm box (Chocobo1)
|
||||||
|
- BUGFIX: Fix Start Minimized checkbox in Options (ngosang)
|
||||||
|
- BUGFIX: Remove limits on alternative speeds setting (LazyBui)
|
||||||
|
- BUGFIX: Fix sorting torrents by ETA (pmzqla)
|
||||||
|
- BUGFIX: Improve ratio calculation formula. Closes #3096. (Chocobo1)
|
||||||
|
- BUGFIX: Clear missing files flag when resuming or force rechecking. Fixes issues in #2750. (sledgehammer999)
|
||||||
|
- BUGFIX: Delete tempfile when downloading favicon.ico. Closes #3257. (sledgehammer999)
|
||||||
|
- BUGFIX: Don't close downloadFromURL dialog when showing empty url warning (Chocobo1)
|
||||||
|
- BUGFIX: Minimize to tray only if the relevant option is enabled. (sledgehammer999)
|
||||||
|
- BUGFIX: Update disk space label after changing partition, closes #3309. (Chocobo1)
|
||||||
|
- BUGFIX: Don't use a default upload limit. Closes #3275. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix Properties bar size when started minimized to tray. Closes #3206. (sledgehammer999)
|
||||||
|
- COSMETIC: Change option text "Confirmation on exit when torrents are active" (Chocobo1)
|
||||||
|
- COSMETIC: Enable to choose dark/light tray icons on all platforms. (Chocobo1)
|
||||||
|
- COSMETIC: Use AllUppercase for label text (Chocobo1)
|
||||||
|
- COSMETIC: changes in typography (ngosang)
|
||||||
|
- COSMETIC: Menu revamp (Chocobo1)
|
||||||
|
- COSMETIC: Revamp general tab info (Chocobo1)
|
||||||
|
- COSMETIC: Better update message for users (Chocobo1)
|
||||||
|
- COSMETIC: Fix ugly 'C++' wrapping in About dialog. (glassez)
|
||||||
|
- WEBUI: Fix login and logout relative URLs (ngosang)
|
||||||
|
- WEBUI: Fix resumeAll and pauseAll. Closes #3016 (ngosang)
|
||||||
|
- WEBUI: Changes in title bar (ngosang)
|
||||||
|
- WEBUI: Complete translatable strings (ngosang)
|
||||||
|
- WEBUI: Minor changes in style (ngosang)
|
||||||
|
- WEBUI: Fix Max connections and Time active in transfer information (ngosang)
|
||||||
|
- WEBUI: New config - Global maximum number of upload slots (ngosang)
|
||||||
|
- WEBUI: Display wasted data with friendly units. Closes #2994 (ngosang)
|
||||||
|
- WEBUI: add delay in shutdown command in order to send out response msg (Chocobo1)
|
||||||
|
- WEBUI: Option to hide Top Toolbar (ngosang)
|
||||||
|
- WEBUI: Reorder the tabs/groups in Options window (ngosang)
|
||||||
|
- WEBUI: Add new options (ngosang)
|
||||||
|
- WEBUI: Increase API_VERSION due to changes in #3279, #3197, #3226 and #3040 (ngosang)
|
||||||
|
- WEBUI: Add Web Seeds (HTTP Sources) tab (ngosang)
|
||||||
|
- WEBUI: Don't update the tabs if tab's panel is collapsed (ngosang)
|
||||||
|
- WEBUI: Fix alternative global rate limits. (ngosang)
|
||||||
|
- SEARCH: Fix thepiratebay. Closes #3012 (ngosang)
|
||||||
|
- SEARCH: Improve torrentz engine to return more results (ngosang)
|
||||||
|
- SEARCH: Change width of columns in search tab. Closes #764 (ngosang)
|
||||||
|
- SEARCH: Make strings translatable in seach engine (ngosang)
|
||||||
|
- SEARCH: Aborting search engine process during closure. Close #2671 (DoumanAsh)
|
||||||
|
- SEARCH: Perform searches in parallel (DoumanAsh)
|
||||||
|
- SEARCH: Add Demonoid search engine (ngosang)
|
||||||
|
- SEARCH: Minor fixes in search engines (ngosang)
|
||||||
|
- SEARCH: Show the version of search engines (ngosang)
|
||||||
|
- SEARCH: Update Legit Torrent to remove sgmllib (DoumanAsh)
|
||||||
|
- SEARCH: Update KickassTorrents (ngosang)
|
||||||
|
- SEARCH: Update BTDigg (ngosang)
|
||||||
|
- SEARCH: Update Torrentz (ngosang)
|
||||||
|
- SEARCH: Update ExtraTorrent (ngosang)
|
||||||
|
- SEARCH: Update TorrentReactor (ngosang)
|
||||||
|
- SEARCH: Fix Python 2 implementation of Torrentz (ngosang)
|
||||||
|
- SEARCH: Cosmetic changes in search engine (ngosang)
|
||||||
|
- SEARCH: Fix column sort in search engine. Closes #2621 (ngosang)
|
||||||
|
- RSS: Update matching RSS articles while editing rules (pmzqla)
|
||||||
|
- WINDOWS: Fix python detection from registry when multiple versions are installed (sledgehammer999)
|
||||||
|
- LINUX: Fixes Linux issue for when the theme doesn't have a corresponding icon. (sledgehammer999)
|
||||||
|
- OTHER: Correctly detect FreeBSD when configuring. (sledgehammer999, yurivict)
|
||||||
|
- OTHER: Add translator to credits.
|
||||||
|
- OTHER: New translation: Indonesian.
|
||||||
|
- OTHER: Split Chinese locales into Chinese Simplified, Chinese Traditional(Taiwan), Chinese Traditional(Hong Kong). (sledgehammer999)
|
||||||
|
|
||||||
* Sun May 10 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.0
|
* Sun May 10 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.0
|
||||||
- FEATURE: Show actual protocol for listen success/failure in the log. Needs libtorrent v1.0.0 (Gelmir)
|
- FEATURE: Show actual protocol for listen success/failure in the log. Needs libtorrent v1.0.0 (Gelmir)
|
||||||
- FEATURE: Support per tracker re-announce. Needs libtorrent v1.0.0 (Gelmir)
|
- FEATURE: Support per tracker re-announce. Needs libtorrent v1.0.0 (Gelmir)
|
||||||
@@ -556,6 +888,208 @@
|
|||||||
- OTHER: Backtrace generation now works on MinGW. (Gelmir)
|
- OTHER: Backtrace generation now works on MinGW. (Gelmir)
|
||||||
- OTHER: New translation: Hindi(India).
|
- OTHER: New translation: Hindi(India).
|
||||||
|
|
||||||
|
* Wed Feb 22 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.12
|
||||||
|
- OSX: Fix build to work with older machines. (sledgehammer999, Noctem)
|
||||||
|
- WINDOWS: Fix automatic Python download. (sledgehammer999)
|
||||||
|
- WINDOWS: Fix crashes due to memory corruption and improve Python registry searching. (glassez)
|
||||||
|
|
||||||
|
* Wed Oct 22 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.11
|
||||||
|
- FEATURE: Allow relative torrent paths when qBittorrent is already running (pmzqla)
|
||||||
|
- FEATURE: Make Windows icons suitable for high dpi screens (pmzqla)
|
||||||
|
- FEATURE: Increase maximum size of system icons (pmzqla)
|
||||||
|
- BUGFIX: Fix crash in the "Content" widget when user would right click in it without a torrent selected (Ivan Sorokin)
|
||||||
|
- BUGFIX: Don't show multiple unlock UI dialogs. Closes #2040. (sledgehammer999)
|
||||||
|
- SEARCH: Fix bug where python would falsely be detected and nothing worked (paolo-sz)
|
||||||
|
- SEARCH: Fix TorrentReactor search plugin (Bruno Barbieri)
|
||||||
|
- SEARCH: Fix search engine encoding issues with python3 on Windows (Bruno Barbieri)
|
||||||
|
- SEARCH: Pirate bay search engine update (DoumanAsh)
|
||||||
|
- SEARCH: Internal improvements in the python code (Bruno Barbieri)
|
||||||
|
- WINDOWS: Fix magnet link association. Closes #1952. (sledgehammer999)
|
||||||
|
- WINDOWS and OSX: Fix again the program updater. The url was changed by sourceforge.net. Closes #1954. (sledgehammer999)
|
||||||
|
- OSX: Fix compilation (sledgehammer999)
|
||||||
|
- WEBUI: Set correct HTTP Content-Type in case of forbidden access. (pmzqla)
|
||||||
|
- COSMETIC: Remove unneeded tooltip (pmzqla)
|
||||||
|
- COSMETIC: Don't stretch the last section in the transfer list (pmzqla)
|
||||||
|
- COSMETIC: Set minimum width of the left panel in the preferences (pmzqla)
|
||||||
|
- OTHER: Optimize sorting of rows. This should have less CPU impact when many torrents are present. (Ivan Sorokin)
|
||||||
|
- OTHER: Use the correct character encoding for exceptions coming from libtorrent. (sledgehammer999)
|
||||||
|
- OTHER: Use boost:bind() as the docs show. Allows compilation with older gcc versions. (sledgehammer999)
|
||||||
|
|
||||||
|
* Sun Sep 21 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.10
|
||||||
|
- FEATURE: Allow disabling of OS cache. This will prevent RAM increases on Windows when seeding many files. Closes #1699. (sledgehammer999)
|
||||||
|
- FEATURE: Add 'Completed' column. Closes #1241. (sledgehammer999)
|
||||||
|
- FEATURE: Added 'Ratio Limit' column. Closes #936. (sledgehammer999)
|
||||||
|
- FEATURE: Add 'Open' and 'Open Containing Folder' entries in the content's right-click menu. Closes #1143. (sledgehammer999)
|
||||||
|
- FEATURE: Don't listen on IPv6 address by default. Prevents network connectivity problems. Closes #1880. (sledgehammer999)
|
||||||
|
- FEATURE: Added 'Shutdown now' button in shutdown confirmation dialog. Closes #969. (sledgehammer999)
|
||||||
|
- FEATURE: Add peer port column to PeerListWidget. Closes #1650. (Ivanov Juriy)
|
||||||
|
- COSMETIC: Fix weird ratio values when torrent was imported or downloaded history was lost due to crash. (sledgehammer999)
|
||||||
|
- COSMETIC: Use 'μTP' instead of 'uTP'. (sledgehammer999)
|
||||||
|
- COSMETIC: Show the loaded torrents in the transferlist when qBT is launched with a torrent/magnet and the AddNewTorrentDialog is showing. Closes #1564. (sledgehammer999)
|
||||||
|
- COSMETIC: Don't mix finished/unifinished torrents when sorting by ETA. Closes #1688. (sledgehammer999)
|
||||||
|
- COSMETIC: Sort finished torrents by completed date when sorting by queue number. (sledgehammer999)
|
||||||
|
- COSMETIC: Right align numerical values in the transfer list. Partially revert 51a9a9aab. Closes #1903. (sledgehammer999)
|
||||||
|
- COSMETIC: Don't display the Search Engine tab by default. (sledgehammer999)
|
||||||
|
- WINDOWS: Correctly associate torrents and magnet links with qBittorrent under non-admin accounts. Closes #291 #527 #579 #614 #964. (glassez, sledgehammer999)
|
||||||
|
- WINDOWS: Check for python before creating the search engine tab. Prevents the creation of python specific files in the user's PC if no python is found. Closes #1370. (sledgehammer999)
|
||||||
|
- WINDOWS: Don't create keys in the registry if python isn't found. Closes #1370. (sledgehammer999)
|
||||||
|
- WINDOWS: Can now correctly detect 64bit and 32bit python installations on 64bit Windows. Closes #1148 #445 #795 #1708. (sledgehammer999)
|
||||||
|
- WINDOWS: Search first in PATH for python. Closes #956. (sledgehammer999)
|
||||||
|
- OSX: Enable system tray in MACOSX (Nick Korotysh).
|
||||||
|
- OSX: Fix headless (nox) build. (sledgehammer999)
|
||||||
|
- WEBUI: Correctly save/load settings and other improvements (glassez)
|
||||||
|
- WEBUI: Removed broken 'Report a bug' iframe. Closes #1343 (Benjamin Hutchins)
|
||||||
|
- WEBUI: Removed broken 'Documentation'. Improves fix for #1343 (Benjamin Hutchins)
|
||||||
|
- WEBUI: Removed essentially useless 'Visit website' iframe and changed it to a regular link. Improves fix for #1343 (Benjamin Hutchins)
|
||||||
|
- BUGFIX: Fix RSS feed icon. The tmp file gets deleted in the feed destructor. Closes #1639 (sledgehammer999)
|
||||||
|
- BUGFIX: fix issue #1674: AddNewTorrentDialog is shown again and again even if checkbox "dont ask me again" is set (Ivan Sorokin)
|
||||||
|
- BUGFIX: Don't show availability bar for magnet links (Ivan Sorokin)
|
||||||
|
- BUGFIX: Fix crash when the selected torrent disappears from the transfer list. Closes #1661 (sledgehammer999)
|
||||||
|
- BUGFIX: Fix tracker announcing problem(hit-and-run) when many torrents are being active. Closes #1571 (sledgehammer999)
|
||||||
|
- BUGFIX: Count magnet links in the 'downloading' filter and make them prevent system inhibition. Closes #1558 (sledgehammer999)
|
||||||
|
- BUGFIX: Pick up updated plugins. Closes #1745. (sledgehammer999)
|
||||||
|
- BUGFIX: Bring mainwindow in front when notification is clicked and other windows are in front. (sledgehammer999)
|
||||||
|
- BUGFIX: Speedup torrent moving (Ivan Sorokin)
|
||||||
|
- BUGFIX: Fix bug when moving a torrent before the previous move is completed (Ivan Sorokin)
|
||||||
|
- BUGFIX: Add option to hibernate computer in Auto-Shutdown menu (Bruno Barbieri)
|
||||||
|
- BUGFIX: Fix column resizing issues (Bryan Roscoe)
|
||||||
|
- BUGFIX: Fix possible crashes. Closes #1814. (sledgehammer999)
|
||||||
|
- BUGFIX: Limit max cache to 1800MiB for 32bits compiled binaries and to 4GiB for other. Closes #1698. (sledgehammer999)
|
||||||
|
- BUGFIX: Don't localize double numbers in the webui. Closes #1525. (sledgehammer999)
|
||||||
|
- BUGFIX: Don't shrink transferlist rows when scrolling horizontally. Closes #1613. (sledgehammer999)
|
||||||
|
- BUGFIX: When qBT is launched with a magnet don't show it in the transferlist while the metadata are being loaded in the background. (sledgehammer999)
|
||||||
|
- BUGFIX: Show disk space while retrieving metadata. Closes #1693. (sledgehammer999)
|
||||||
|
- BUGFIX: Don't disable DHT/LSD/UPnP in the GUI when anonymous mode is enabled. (sledgehammer999)
|
||||||
|
- BUGFIX: Possible fix for crash in RSS code. Closes #1901. (sledgehammer999)
|
||||||
|
- BUGFIX: Fixed SMTP emailing code (Ivanov Juriy, sledgehammer999)
|
||||||
|
- BUGFIX: Don't display the context menu in 'Content' and 'HTTP Sources' buttons when no torrent is selected. It prevents crashes. Closes #1906, #1900. (sledgehammer999)
|
||||||
|
- BUGFIX: Don't translate file extensions. Closes #1907. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix available disk space label on single file torrents. (sledgehammer999)
|
||||||
|
- BUGFIX: Show stalled downloads that are uploading under the 'Active' filter. Closes #1654." (sledgehammer999)
|
||||||
|
- BUGFIX: fix import torrent with "Keep incomplete torrents in:" enabled (lojack5)
|
||||||
|
- BUGFIX: Send a spoofed user agent for the search engines(fixes some of them) (Martin Janco)
|
||||||
|
- BUGFIX: Support URLs that redirect to magnet links (Gelmir)
|
||||||
|
- BUGFIX: Consider queued items before deciding to 'auto-shutdown on downloads completion'. Closes #1942. (sledgehammer999)
|
||||||
|
|
||||||
|
* Tue Apr 29 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.9.2
|
||||||
|
- OTHER: The v3.1.9.1 Windows build was broken
|
||||||
|
|
||||||
|
* Mon Apr 28 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.9.1
|
||||||
|
- OTHER: This is an excuse to produce new builds with an OpenSSL version that isn't affected by the heartbleed bug for Windows and Mac. This bug should only affect the WebUI and only if HTTPS/SSL authentication was enabled.
|
||||||
|
|
||||||
|
* Sat Mar 01 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.9
|
||||||
|
- BUGFIX: Fix nox build. Closes #1368 (bob23450)
|
||||||
|
- BUGFIX: Fix build with libtorrent 0.15.x (sledgehammer999)
|
||||||
|
- BUGFIX: Fix missing percentage signs. Closes #1392. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix queue sorting order. (alfrix)
|
||||||
|
- BUGFIX: Fix build using qt < 4.7 Closes #1385. (Evgeny Lensky)
|
||||||
|
- BUGFIX: Fix autoupdater. Send our user-agent to sourceforge.net (sledgehammer999)
|
||||||
|
- FEATURE: Add button for links in toolbar (alfrix)
|
||||||
|
|
||||||
|
* Sun Feb 02 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.8
|
||||||
|
- BUGFIX: Really fix build of v3.1.6
|
||||||
|
|
||||||
|
* Sun Feb 02 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.7
|
||||||
|
- BUGFIX: Fix build of v3.1.6
|
||||||
|
|
||||||
|
* Sun Feb 02 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.6
|
||||||
|
- BUGFIX: Fix 'preview file' regression. Closes #1285. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix peers and seeds sorting in transfer list. (Angel Alonso)
|
||||||
|
- BUGFIX: Fix btdigg search engine. (BTDigg research team)
|
||||||
|
- BUGFIX: Save statistics every 15min and only if there was new traffic. Fixes #1288 and partially #1272. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix share ratio text in the 'general' tab. (sledgehammer999)
|
||||||
|
- BUGFIX: Output a more generic message when blocking IPs and don't use italics in the log. (sledgehammer999)
|
||||||
|
- BUGFIX: Allow 2 decimals when setting the share ratio. Closes #1303. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix extratorrents search plugin. (sledgehammer999)
|
||||||
|
- BUGFIX: Use shorter names for amount columns in main UI (Gelmir)
|
||||||
|
- BUGFIX: Fix overstretched options dialog. Closes #1293. (sledgehammer999)
|
||||||
|
- BUGFIX: Don't show a popup menu when no torrent is selected. (sledgehammer999)
|
||||||
|
- BUGFIX: Launch external programs async and don't block. Closes #1252. (sledgehammer999)
|
||||||
|
- BUGFIX: Don't re-announce to trackers when torrent is paused. Closes #1310. (sledgehammer999)
|
||||||
|
- BUGFIX: Bring dialog boxes in the front when qbt doesn't have focus. (sledgehammer999)
|
||||||
|
- BUGFIX: Correctly resize 'name' column of the content tab. Closes #1360. (sledgehammer999)
|
||||||
|
- BUGFIX: Correctly restore 'name' column width when loading magnet links in the 'Add new torrent dialog'. Closes #1334. (sledgehammer999)
|
||||||
|
- WEBUI: Fix sorting by size in WebUI when non-default locale used. (Vladimir Golovnev)
|
||||||
|
- UI: Reposition statistics menu item. (sledgehammer999)
|
||||||
|
- UI: Convert more accurately decimal numbers to text. (sledgehammer999)
|
||||||
|
- WINDOWS/OSX: Improvements on the behavior of the program updater(closes #1282) (sledgehammer999)
|
||||||
|
- LINUX: Explicitle tell that we don't support freedesktop's startup notify standard. Fixes GNOME issues. Closes #1217. (sledgehammer999)
|
||||||
|
- LINUX: Add our WM_CLASS in the .desktop file so window managers know how to group our windows. (sledgehammer999)
|
||||||
|
- OTHER: Sync translations from Transifex.
|
||||||
|
|
||||||
|
* Thu 16 Jan 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.5
|
||||||
|
- BUGFIX: Fix compilation with Qt 4.7. Closes #1215. (sledgehammer999)
|
||||||
|
- BUGFIX: Third attempt at fixing saving settings on OS shutdown. (sledgehammer999)
|
||||||
|
- BUGFIX: Preview now correctly uses the selected file. Closes #1222 #1182. (sledgehammer999)
|
||||||
|
- BUGFIX: Allow to resize the columns in Add New Torrent dialog. Closes #1207 #676 (sledgehammer999)
|
||||||
|
- BUGFIX: Ensure that at least one column in the tranferlist is always visible. Closes #1165. (sledgehammer999)
|
||||||
|
- BUGFIX: Ensure that the options window will always be placed onscreen. Closes #1226. (sledgehammer999)
|
||||||
|
- BUGFIX: Delete temporary files after they aren't needed. Closes #1188. (sledgehammer999)
|
||||||
|
- BUGFIX: Correctly detect libtorrent version. (sledgehammer999)
|
||||||
|
- BUGFIX: Various code cppcheck fixes (Konstantin Goncharik)
|
||||||
|
- BUGFIX: Remove isohunt search engine and update thepiratebay url (sledgehammer999)
|
||||||
|
- BUGFIX: Fix rss settings corruption when checking regexp and going to other rule. (Gelmir)
|
||||||
|
- BUGFIX: Don't count paused torrents for the autoshutdown. Closes #1280. (sledgehammer999)
|
||||||
|
- LINUX: Fix notifications with xfce4-notifyd.
|
||||||
|
- OSX: Added basic retina support. Closes #1251. (Sébastien Lavoie)
|
||||||
|
- OTHER: Sync translations from Transifex.
|
||||||
|
|
||||||
|
* Sun 29 Dec 2013 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.4
|
||||||
|
- FEATURE: Statistics dialog (Gelmir)
|
||||||
|
- FEATURE: Tooltips explaining each peer's connection flags (sledgehammer999)
|
||||||
|
- FEATURE: Win/Mac Check for program updates every 15min and allow the user to manually check for updates through the help menu. (sledgehammer999)
|
||||||
|
- BUGFIX: Better dialog message for torrent delete confirmation (sledgehammer999)
|
||||||
|
- BUGFIX: Fix resizing grip location. Closes #1146. (sledgehammer999)
|
||||||
|
- BUGFIX: Lock toolbar in place. Closes #1144. (sledgehammer999)
|
||||||
|
- BUGFIX: Second attempt at fixing saving settings on shutdown. (sledgehammer999)
|
||||||
|
- BUGFIX: Sort labels in 'Add new torrent' dialog. Closes #1150 #411. (sledgehammer999)
|
||||||
|
- LINUX: Fix build under Ubuntu 13.10 (sledgehammer999)
|
||||||
|
- LINUX: Make sleep and shutdown functions work on systemd's logind (Faheem Pervez)
|
||||||
|
|
||||||
|
* Mon Nov 20 2013 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.3
|
||||||
|
- FEATURE: Add a key shortcut to "Add link to torrent..." (Angel Alonso)
|
||||||
|
- BUGFIX: Make all columns and headers use the same text alignment in the transferlist. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix build system for Unix/Linux. (sledgehammer999)
|
||||||
|
- BUGFIX: Case insensitive sort in Peers list. Closes #1066. (sledgehammer999)
|
||||||
|
- BUGFIX: Small optimization of WebUI responses when there isn't a data payload. (sledgehammer999)
|
||||||
|
- BUGFIX: Hide empty folders after filtering. Closes #74. (sledgehammer999)
|
||||||
|
- BUGFIX: Expand folders when filtering files. Closes #1076. (sledgehammer999)
|
||||||
|
- BUGFIX: Updated search plugin's URL (Zach Thibeau)
|
||||||
|
- BUGFIX: Strip some png to fix incorrect sRGB profiles. (Angel Alonso)
|
||||||
|
- BUGFIX: Fixed font issues on OSX Mavericks (Zach Thibeau)
|
||||||
|
- BUGFIX: Improve text in the About dialog (Artem S. Tashkinov)
|
||||||
|
- BUGFIX: Always show a peer IP address as a tool tip (Artem S. Tashkinov)
|
||||||
|
- BUGFIX: Fix inhibit system functionality. Closes #766. (sledgehammer999)
|
||||||
|
- BUGFIX: WebUI: Don't gzip too small payloads. (sledgehammer999)
|
||||||
|
- BUGFIX: Correctly detect if the browser supports gzip compression. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix WebUI link to 'Anonymous mode' explanation. Closes #1093. (sledgehammer999)
|
||||||
|
- BUGFIX: Correctly update tracker tier number in the trackers tab. Closes #1075. (sledgehammer999)
|
||||||
|
- BUGFIX: Speed improvements.(sledgehammer999)
|
||||||
|
- OTHER: Updated translations.
|
||||||
|
|
||||||
|
* Tue Nov 05 2013 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.2
|
||||||
|
- BUGFIX: Fix WebUI gzip compression. Closes #1037. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix compilation with qt < 4.8.0. Closes #1043. (sledgehammer999)
|
||||||
|
- OTHER: Updated translations.
|
||||||
|
|
||||||
|
* Mon Oct 28 2013 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.1
|
||||||
|
- FEATURE: Show external IP in the log. Closes #968. (sledgehammer999)
|
||||||
|
- FEATURE: Enable gzip compression in the webui. It should be faster now. (sledgehammer999)
|
||||||
|
- FEATURE: Torrents show more states(queued for checking, downloading metadata, allocating, checking resume). (sledgehammer999)
|
||||||
|
- FEATURE: Reenable "force reannounce" to all trackers. (sledgehammer999)
|
||||||
|
- FEATURE: Allow to clear the UI lock password. Closes #973. (sledgehammer999)
|
||||||
|
- FEATURE: New translations: English(Australia) and English(United Kingdom)
|
||||||
|
- BUGFIX: Expose all available translation in the WebUI. Closes #976. (sledgehammer999)
|
||||||
|
- BUGFIX: Copy IP copied wrong data. Closes #970 (sledgehammer999)
|
||||||
|
- BUGFIX: "Preview file..." didn't work on single file torrents. (sledgehammer999)
|
||||||
|
- BUGFIX: Fix and improve the scheduler (Gelmir and sledgehammer999)
|
||||||
|
- BUGFIX: RSS fixes. Closes #960, #998 (Gelmir)
|
||||||
|
- BUGFIX: Fix 'append label to save path' with magnet links. (sledgehammer999)
|
||||||
|
- BUGFIX: Can download up to 10MB .torrent file when a link is provided. Closes #879 (sledgehammer999)
|
||||||
|
- OTHER: Updated translations.
|
||||||
|
- LINUX: Fix missing conf.pri error (leigh123linux)
|
||||||
|
- WINDOWS: Don't remove file associations if they aren't our own. (sledgehammer999)
|
||||||
|
|
||||||
* Sat Oct 12 2013 - Christophe Dumez <chris@qbittorrent.org> and sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.0
|
* Sat Oct 12 2013 - Christophe Dumez <chris@qbittorrent.org> and sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.0
|
||||||
- FEATURE: Add command line option to daemonize qbittorrent-nox (ngaro)
|
- FEATURE: Add command line option to daemonize qbittorrent-nox (ngaro)
|
||||||
- FEATURE: Add "Shutdown qBittorrent" button to Web UI (ngaro)
|
- FEATURE: Add "Shutdown qBittorrent" button to Web UI (ngaro)
|
||||||
@@ -594,6 +1128,118 @@
|
|||||||
- PERFORMANCE: Impove drawing speed of tranferlist when there are many torrents(>100)
|
- PERFORMANCE: Impove drawing speed of tranferlist when there are many torrents(>100)
|
||||||
- PERFORMANCE: Impove drawing speed of peers list when there are many peers
|
- PERFORMANCE: Impove drawing speed of peers list when there are many peers
|
||||||
|
|
||||||
|
* Mon Jul 29 2013 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.0.11
|
||||||
|
- FEATURE: Allow more fine tuning of upload slots. It should improve speed (sledgehammer999)
|
||||||
|
- FEATURE: Enable edit/rename via F2 or double click in various places (Gelmir)
|
||||||
|
- BUGFIX: Fix Spanish and Basque translations being messed up on Windows (sledgehammer999)
|
||||||
|
- BUGFIX: Don't allow newlines in rename dialog (Gelmir)
|
||||||
|
- BUGFIX: Treat unfinished dates as the newest ones when sorting (sledgehammer999)
|
||||||
|
- BUGFIX: Fix text size problem on Windows with custom DPI (sledgehammer999)
|
||||||
|
- BUGFIX: Respect UI lock when clicking on tray notification (sledgehammer999)
|
||||||
|
- BUGFIX: Fix kickass torrents search plugin (Gelmir)
|
||||||
|
- BUGFIX: Use system language as default language. Closes #780 (sledgehammer999)
|
||||||
|
- BUGFIX: Move completed files to .unwanted folder when they are unselected by the user (constantined)
|
||||||
|
- BUGFIX: Show delete action when multiple feeds are selected (Gelmir)
|
||||||
|
- BUGFIX: Use Unicode for libtorrent alert messages (Gelmir)
|
||||||
|
- OTHER: Update translations
|
||||||
|
- WINDOWS: Shave off ~4MB from the binary size (sledgehammer999)
|
||||||
|
- WINDOWS: Remove wrong dependency on msvc2008 runtime (sledgehammer999)
|
||||||
|
- WINDOWS: Disable stacktrace when building with mingw (Gelmir)
|
||||||
|
- WINDOWS: Updated NSIS script to include/delete .pdb file. (sledgehammer999)
|
||||||
|
|
||||||
|
* Tue Jul 9 2013 - Christophe Dumez <chris@qbittorrent.org> and sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.0.10
|
||||||
|
- BUGFIX: Fix LegitTorrents search plugin
|
||||||
|
- BUGFIX: Improve peer host name resolution (closes #360)
|
||||||
|
- BUGFIX: Context menu fix in the Web UI
|
||||||
|
- BUGFIX: Respect 'don't show' torrent dialog in Search (sledgehammer999)
|
||||||
|
- BUGFIX: Torrent creator can now use files/folders from disk root (Gelmir)
|
||||||
|
- BUGFIX: Update free disk space when changing drives in the add new torrent dialog (sledgehammer999)
|
||||||
|
- BUGFIX: Various fixes relating to RSS drag and drop (Gelmir)
|
||||||
|
- BUGFIX: Properly rename torrent which changes position in filter model (Gelmir)
|
||||||
|
- BUGFIX: Actually show tray notifications when a torrent finishes downloading (sledgehammer999)
|
||||||
|
- BUGFIX: Don't download RSS items based on rules still being edited (Gelmir)
|
||||||
|
- COSMETIC: Native look for the search boxes (Hyperz)
|
||||||
|
- IMPROVEMENT: Use natural sorting where possible (Gelmir and sledgehammer999)
|
||||||
|
- LINUX: Drop Boost.Thread dependency from configure script
|
||||||
|
- OTHER: Update translations.
|
||||||
|
- OTHER: Drop obsolete Boost.Thread dependency from configure script on linux (Dumez)
|
||||||
|
- LIBTORRENT: SOCKS5 fixes (0.16.10)
|
||||||
|
- LIBTORRENT: Fix hanging issue on Windows when closing files (0.16.10)
|
||||||
|
- LIBTORRENT: Cache can now be returned to the OS (0.16.10)
|
||||||
|
- PERFORMANCE: Impove drawing speed of tranferlist when there are many torrents(>100) (sledgehammer999)
|
||||||
|
- PERFORMANCE: Impove drawing speed of peers list when there are many peers (sledgehammer999)
|
||||||
|
|
||||||
|
* Sat Mar 16 2013 - Christophe Dumez <chris@qbittorrent.org> - v3.0.9
|
||||||
|
- BUGFIX: Raise qBittorrent windows when another instance is launched
|
||||||
|
- BUGFIX: Show human readable names for network interfaces in preferences (Windows)
|
||||||
|
- BUGFIX: Fix torrent creator bug when saving non-latin path (Windows)
|
||||||
|
- BUGFIX: Enable 'copy magnet uri' for torrents without metadata too
|
||||||
|
- BUGFIX: Fix a few JSON parser issues (Gelmir)
|
||||||
|
- BUGFIX: Add support for gzipped encoded HTTP responses (daimor)
|
||||||
|
- BUGFIX: Fix possibly missing "Add torrent" icon (Driim)
|
||||||
|
- OTHER: Add search plugin for Legit Torrents
|
||||||
|
|
||||||
|
* Sun Jan 20 2013 - Christophe Dumez <chris@qbittorrent.org> - v3.0.8
|
||||||
|
- BUGFIX: Fix support for --no-splash command line argument
|
||||||
|
- BUGFIX: Fix compilation error with libtorrent v0.15
|
||||||
|
- BUGFIX: Fix search issues with Python3
|
||||||
|
- BUGFIX: Fix dead link about certificates in program preferences
|
||||||
|
|
||||||
|
* Sat Jan 19 2013 - Christophe Dumez <chris@qbittorrent.org> - v3.0.7
|
||||||
|
- BUGFIX: Update max write cache size to 2048MB and set it to automatic by default (closes #148)
|
||||||
|
- BUGFIX: Add m4v to the list of previewable file extensions (closes #216)
|
||||||
|
- BUGFIX: Fix "Couldn't set environment variable..." message on start up (closes #245)
|
||||||
|
- BUGFIX: Use right path separator in torrent addition dialog on Windows
|
||||||
|
- BUGFIX: Fix "Set as default save path" setting (closes #254)
|
||||||
|
- BUGFIX: Reenable disk cache on Windows since the memory issue seems to be gone
|
||||||
|
- BUGFIX: Fixed several search engine plugins and removed the dead ones
|
||||||
|
- BUGFIX: Use https links in search plugins when possible
|
||||||
|
- BUGFIX: Bump Mootools to v1.4.5 (Web UI)
|
||||||
|
- BUGFIX: Require password to exit qBittorrent from tray icon when locked (closes #311)
|
||||||
|
- BUGFIX: Fix possible crash in loadPeers() (closes #222)
|
||||||
|
|
||||||
|
* Sun Oct 7 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.6
|
||||||
|
- BUGFIX: Fix unicode support for command-line arguments on Windows (closes #139)
|
||||||
|
- BUGFIX: Do not store created torrent in memory before writing it to a file (closes #133)
|
||||||
|
- BUGFIX: No longer fallback to ANY interface if the user-selected interface cannot be found (closes #143)
|
||||||
|
- BUGFIX: Fix timezone parsing in RSS (closes #136)
|
||||||
|
- BUGFIX: Fix cookie support for RSS feeds (closes #119)
|
||||||
|
|
||||||
|
* Sun Sep 30 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.5
|
||||||
|
- BUGFIX: Disabling systray icon no longer disables file association settings (closes #114)
|
||||||
|
- BUGFIX: Import new trackers from magnet link in case of duplicate torrent (closes #111)
|
||||||
|
- BUGFIX: Fix "Skip hash check" feature in torrent import dialog (closes #128)
|
||||||
|
- BUGFIX: Several Web UI connection fixes
|
||||||
|
- BUGFIX: Add Basque locale to Web UI
|
||||||
|
|
||||||
|
* Tue Sep 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.4
|
||||||
|
- BUGFIX: Fix issue with downloads starting from scratch on startup if temporary
|
||||||
|
directory setting is enabled.
|
||||||
|
|
||||||
|
* Sun Sep 16 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.3
|
||||||
|
- BUGFIX: Fix issue with temporary directory not being taken into consideration (closes #94)
|
||||||
|
- BUGFIX: Address encoding issues when using search engine on Windows (closes #29)
|
||||||
|
- BUGFIX: Bypass cache when uploading a torrent file in Web UI (closes #68)
|
||||||
|
- BUGFIX: "Completed On" column is not updated until restart (closes #84)
|
||||||
|
- BUGFIX: Fix possible build error on some systems
|
||||||
|
- I18N: Add hebrew translation
|
||||||
|
|
||||||
|
* Sat Sep 1 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.2
|
||||||
|
- FEATURE: Add "clear" functionality to search field (closes #59)
|
||||||
|
- BUGFIX: Attempt to use qBittorrent icon from theme if available (closes #49)
|
||||||
|
- BUGFIX: Fix crash when a fastresume file is empty (closes #52)
|
||||||
|
- BUGFIX: Fix encoding problem for detected XDG Download folder (closes #53)
|
||||||
|
- BUGFIX: Improve performance when showing torrent content panel (Improves #24)
|
||||||
|
- BUGFIX: Fix label-based filtering of torrents whose label contains special characters
|
||||||
|
- BUGFIX: Fix possible crash due to labels (closes #64)
|
||||||
|
|
||||||
|
* Tue Aug 21 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.1
|
||||||
|
- BUGFIX: Fix possible crash when adding a tracker to a magnet torrent without metadata (Closes #1034254)
|
||||||
|
- BUGFIX: Remember queue position for torrents without metadata (closes #17)
|
||||||
|
- BUGFIX: Fix crash when using unauthorized characters in label names (closes #19)
|
||||||
|
- BUGFIX: Fix search plugins updating (closes #25)
|
||||||
|
- BUGFIX: Make uTP connections rate limited by default
|
||||||
|
|
||||||
* Thu Aug 09 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.0
|
* Thu Aug 09 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.0
|
||||||
- FEATURE: Brand new torrent addition dialog
|
- FEATURE: Brand new torrent addition dialog
|
||||||
- FEATURE: Add the ability to choose the save path when using magnet links (mutoso)
|
- FEATURE: Add the ability to choose the save path when using magnet links (mutoso)
|
||||||
@@ -605,6 +1251,92 @@
|
|||||||
- OTHER: Drop support for libtorrent v0.14.x
|
- OTHER: Drop support for libtorrent v0.14.x
|
||||||
- OTHER: Drop support for Qt 4.5
|
- OTHER: Drop support for Qt 4.5
|
||||||
|
|
||||||
|
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.9.12
|
||||||
|
- BUGFIX: Fix issue when "Minimize to tray" and "Start minimized" are both enabled
|
||||||
|
|
||||||
|
* Sun Jul 1 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.11
|
||||||
|
- BUGFIX: Fix unreversible "Minimize to tray" on some window managers
|
||||||
|
- BUGFIX: Fix torrent availability computation (closes #988869)
|
||||||
|
- BUGFIX: Bring window to front after restoring from systray
|
||||||
|
- BUGFIX: Fix keyboard focus problems on main window (closes #1019563)
|
||||||
|
- BUGFIX: Fix ThePirateBay search plugin
|
||||||
|
|
||||||
|
* Sun Jun 24 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.10
|
||||||
|
- BUGFIX: Fix possible crash when showing torrent content (closes #1002586)
|
||||||
|
- BUGFIX: Add support for RSS feeds using magnet links (closes #1016379)
|
||||||
|
- BUGFIX: Remove 100kb limit for torrent file size in Web UI
|
||||||
|
- BUGFIX: Fix ratio limiting bug (closes #835217)
|
||||||
|
- BUGFIX: Do not display .!qB file extensions in Web UI
|
||||||
|
- BUGFIX: Stop using absolute URLs in Web UI ajax requests (closes #1011226)
|
||||||
|
- BUGFIX: Fix torrent association and loading on Mac OS X (closes #1011229)
|
||||||
|
- BUGFIX: Fix unreversible "Minimize to tray" on some window managers (closes #917825)
|
||||||
|
|
||||||
|
* Sun May 20 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.9
|
||||||
|
- BUGFIX: More reliable RSS feed parsing (closes #1001777)
|
||||||
|
- BUGFIX: Better support for cookies in RSS
|
||||||
|
- BUGFIX: Make sure show/hide text in tray icon menu is correct
|
||||||
|
- COSMETIC: Improve style of left panel
|
||||||
|
- COSMETIC: Never disable properties panel
|
||||||
|
- COSMETIC: Make sure first tab is initially selected in options dialog
|
||||||
|
- COSMETIC: Fix a few focus issues on Mac OS X
|
||||||
|
|
||||||
|
* Sat May 5 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.8
|
||||||
|
- BUGFIX: Various UI style fixes
|
||||||
|
- BUGFIX: Fix compilation with gcc 4.7
|
||||||
|
- BUGFIX: Fix possible compilation error with msvc (Windows)
|
||||||
|
- BUGFIX: Fix compilation on OS/2
|
||||||
|
- I18N: Update Italian translation
|
||||||
|
|
||||||
|
* Sun Mar 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.7
|
||||||
|
- BUGFIX: Fix important HTTP request parsing bug (Web UI)
|
||||||
|
|
||||||
|
* Sat Mar 17 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.6
|
||||||
|
- BUGFIX: Fix download first/last pieces state reporting
|
||||||
|
- BUGFIX: Fix name of progress column in torrent content panel
|
||||||
|
- BUGFIX: Disable system tray icon on Mac OS X
|
||||||
|
- BUGFIX: RSS downloader should not ignore "Do not start automatically" rule (closes #946910)
|
||||||
|
- BUGFIX: Fix DHT port setting in Web UI (Closes #952182)
|
||||||
|
- BUGFIX: Fix possible Web UI authentication problem when using SSL (closes #941343)
|
||||||
|
- BUGFIX: Fix possible issues with folder removal when removing a torrent
|
||||||
|
- I18N: Add Basque translation
|
||||||
|
|
||||||
|
* Sat Feb 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.5
|
||||||
|
- BUGFIX: Fix crash when disabling then reenabling RSS
|
||||||
|
- BUGFIX: Fix duplicate torrent detection when adding a magnet link
|
||||||
|
- BUGFIX: Fix import of new trackers when adding a torrent with same hash (Closes #747000)
|
||||||
|
- BUGFIX: Fix possible redownload of torrents marked as read (Closes #927495)
|
||||||
|
- BUGFIX: Properly remove RSS feed settings/history upon feed removal
|
||||||
|
|
||||||
|
* Sat Feb 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.4
|
||||||
|
- BUGFIX: qBittorrent does not handle redirection to relative URLs correctly (Closes #919905)
|
||||||
|
- BUGFIX: Cmd+M minimizes main window on Mac OS X (Closes #928216)
|
||||||
|
- BUGFIX: Cmd+Del removes torrents on Mac OS X (Closes #928852)
|
||||||
|
- BUGFIX: Fix potential bug when moving single file torrents to tmp folder (closes #932861)
|
||||||
|
- BUGFIX: Fix torrent import dialog layout (Closes #930932)
|
||||||
|
- BUGFIX: Prevent log window buffer from filling up (Closes #929673)
|
||||||
|
- I18N: Add Belarusian translation
|
||||||
|
|
||||||
|
* Thu Dec 29 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.3
|
||||||
|
- BUGFIX: Fix btdigg plugin (Python3 support + torrent name in magnet links)
|
||||||
|
- BUGFIX: Fix banning of IPv6 peers (Closes #885021)
|
||||||
|
- BUGFIX: Fix torrent addition dialog layout problem (Closes #84650522)
|
||||||
|
- BUGFIX: Do not report any progress for disabled files (Closes #56731485)
|
||||||
|
- BUGFIX: Make torrent sorting case insensitive (Closes #857154)
|
||||||
|
- BUGFIX: Improve Web UI usability of small devices
|
||||||
|
- BUGFIX: Program updater: More reliable version detection / comparison
|
||||||
|
- I18N: Add Georgian translation
|
||||||
|
|
||||||
|
* Sat Oct 29 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.2
|
||||||
|
- BUGFIX: Fix mimimum dimensions for torrent addition dialog
|
||||||
|
- BUGFIX: Remove dependency on boost-datetime
|
||||||
|
- BUGFIX: Remove dependency on boost-filesystem (libtorrent v0.16.x)
|
||||||
|
|
||||||
|
* Sun Oct 23 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.1
|
||||||
|
- BUGFIX: Add support for speed limits scheduling (Web UI)
|
||||||
|
- BUGFIX: Fix ratio calculation for purely seeded torrents
|
||||||
|
- I18N: Update Russian translation
|
||||||
|
- COSMETIC: Torrent addition dialog layout fixes
|
||||||
|
|
||||||
* Sat Oct 08 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.0
|
* Sat Oct 08 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.0
|
||||||
- FEATURE: Add file association settings to program preferences (Windows)
|
- FEATURE: Add file association settings to program preferences (Windows)
|
||||||
- FEATURE: Add setting to ignore slow torrents in queueing system
|
- FEATURE: Add setting to ignore slow torrents in queueing system
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ You can also download it from [here](https://github.com/qbittorrent/qBittorrent/
|
|||||||
|
|
||||||
### Misc:
|
### Misc:
|
||||||
For more information please visit:
|
For more information please visit:
|
||||||
http://www.qbittorrent.org
|
https://www.qbittorrent.org
|
||||||
|
|
||||||
or our wiki here:
|
or our wiki here:
|
||||||
http://wiki.qbittorrent.org
|
http://wiki.qbittorrent.org
|
||||||
|
|||||||
74
README.os2
@@ -1,74 +0,0 @@
|
|||||||
qBittorrent - A BitTorrent client in Qt4
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
This is the eComStation (OS/2) qBittorrent part of the readme. See also README for more general information.
|
|
||||||
|
|
||||||
|
|
||||||
Building qBittorrent
|
|
||||||
********************
|
|
||||||
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
- gcc based build env (recommended gcc v4.4.2 or greater)
|
|
||||||
|
|
||||||
- Qt4 for eCS (OS/2) dev package (see http://svn.netlabs.org/qt4 for more information)
|
|
||||||
|
|
||||||
- libtorrent-rasterbar for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information)
|
|
||||||
|
|
||||||
- boost for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information)
|
|
||||||
|
|
||||||
|
|
||||||
How to build
|
|
||||||
============
|
|
||||||
|
|
||||||
First you need to create the conf.pri file in the same dir as this readme.os2 is.
|
|
||||||
the conf.pri file has the following content:
|
|
||||||
|
|
||||||
##### conf.pri content begin #####
|
|
||||||
BINDIR = ./bin
|
|
||||||
INCDIR = ./include
|
|
||||||
LIBDIR = ./lib
|
|
||||||
DATADIR = ./share
|
|
||||||
|
|
||||||
CONFIG += staticlib
|
|
||||||
INCLUDEPATH += x:/trees/libtorrent/trunk/include
|
|
||||||
LIBS += -Lx:/trees/libtorrent/trunk/src/.libs \
|
|
||||||
-Lx:/trees/boost/trunk/stage/lib \
|
|
||||||
-Lx:/trees/openssl \
|
|
||||||
-Lx:/extras/lib
|
|
||||||
##### conf.pri content end #####
|
|
||||||
|
|
||||||
Of course all the above path references have to be adjusted to your build env.
|
|
||||||
|
|
||||||
Now you can either do a normal build or a shadow build. A shadow build has the
|
|
||||||
advantage that no created files are in the same dir as the sources are.
|
|
||||||
|
|
||||||
For a normal build do the following:
|
|
||||||
|
|
||||||
Simply type:
|
|
||||||
$ qmake
|
|
||||||
|
|
||||||
Followed by:
|
|
||||||
$ make
|
|
||||||
|
|
||||||
For a shadow build do the following:
|
|
||||||
given your sources are in x:\trees\qbittorrent\trunk create a
|
|
||||||
x:\trees\qbittorrent\build directory
|
|
||||||
|
|
||||||
Now switch to the created directory and type:
|
|
||||||
$ qmake ..\trunk
|
|
||||||
|
|
||||||
Followed by:
|
|
||||||
$ make
|
|
||||||
|
|
||||||
If all works fine you should get a working qbittorrent executable.
|
|
||||||
|
|
||||||
If you have any question regarding the eCS (OS/2) port of qBittorrent you can meet me (_diver) on IRC:
|
|
||||||
#netlabs on irc.freenode.net
|
|
||||||
|
|
||||||
------------------------------------------
|
|
||||||
Silvan Scherrer <silvan.scherrer@aroa.ch>
|
|
||||||
|
|
||||||
|
|
||||||
355
cmake/Modules/DeployQt5.cmake
Normal file
@@ -0,0 +1,355 @@
|
|||||||
|
# Borrowed from Avogadro project (https://github.com/OpenChemistry/avogadroapp)
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# DeployQt5
|
||||||
|
# ---------
|
||||||
|
#
|
||||||
|
# Functions to help assemble a standalone Qt5 executable.
|
||||||
|
#
|
||||||
|
# A collection of CMake utility functions useful for deploying Qt5
|
||||||
|
# executables.
|
||||||
|
#
|
||||||
|
# The following functions are provided by this module:
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# write_qt5_conf
|
||||||
|
# resolve_qt5_paths
|
||||||
|
# fixup_qt5_executable
|
||||||
|
# install_qt5_plugin_path
|
||||||
|
# install_qt5_plugin
|
||||||
|
# install_qt5_executable
|
||||||
|
#
|
||||||
|
# Requires CMake 2.8.9 or greater because Qt 5 does.
|
||||||
|
# Also depends on BundleUtilities.cmake.
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# WRITE_QT5_CONF(<qt_conf_dir> <qt_conf_contents>)
|
||||||
|
#
|
||||||
|
# Writes a qt.conf file with the <qt_conf_contents> into <qt_conf_dir>.
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# RESOLVE_QT5_PATHS(<paths_var> [<executable_path>])
|
||||||
|
#
|
||||||
|
# Loop through <paths_var> list and if any don't exist resolve them
|
||||||
|
# relative to the <executable_path> (if supplied) or the
|
||||||
|
# CMAKE_INSTALL_PREFIX.
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# FIXUP_QT5_EXECUTABLE(<executable> [<qtplugins> <libs> <dirs> <plugins_dir> <request_qt_conf>])
|
||||||
|
#
|
||||||
|
# Copies Qt plugins, writes a Qt configuration file (if needed) and
|
||||||
|
# fixes up a Qt5 executable using BundleUtilities so it is standalone
|
||||||
|
# and can be drag-and-drop copied to another machine as long as all of
|
||||||
|
# the system libraries are compatible.
|
||||||
|
#
|
||||||
|
# <executable> should point to the executable to be fixed-up.
|
||||||
|
#
|
||||||
|
# <qtplugins> should contain a list of the names or paths of any Qt
|
||||||
|
# plugins to be installed.
|
||||||
|
#
|
||||||
|
# <libs> will be passed to BundleUtilities and should be a list of any
|
||||||
|
# already installed plugins, libraries or executables to also be
|
||||||
|
# fixed-up.
|
||||||
|
#
|
||||||
|
# <dirs> will be passed to BundleUtilities and should contain and
|
||||||
|
# directories to be searched to find library dependencies.
|
||||||
|
#
|
||||||
|
# <plugins_dir> allows an custom plugins directory to be used.
|
||||||
|
#
|
||||||
|
# <request_qt_conf> will force a qt.conf file to be written even if not
|
||||||
|
# needed.
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# INSTALL_QT5_PLUGIN_PATH(plugin executable copy installed_plugin_path_var <plugins_dir> <component> <configurations>)
|
||||||
|
#
|
||||||
|
# Install (or copy) a resolved <plugin> to the default plugins directory
|
||||||
|
# (or <plugins_dir>) relative to <executable> and store the result in
|
||||||
|
# <installed_plugin_path_var>.
|
||||||
|
#
|
||||||
|
# If <copy> is set to TRUE then the plugins will be copied rather than
|
||||||
|
# installed. This is to allow this module to be used at CMake time
|
||||||
|
# rather than install time.
|
||||||
|
#
|
||||||
|
# If <component> is set then anything installed will use this COMPONENT.
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# INSTALL_QT5_PLUGIN(plugin executable copy installed_plugin_path_var <plugins_dir> <component>)
|
||||||
|
#
|
||||||
|
# Install (or copy) an unresolved <plugin> to the default plugins
|
||||||
|
# directory (or <plugins_dir>) relative to <executable> and store the
|
||||||
|
# result in <installed_plugin_path_var>. See documentation of
|
||||||
|
# INSTALL_QT5_PLUGIN_PATH.
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# INSTALL_QT5_EXECUTABLE(<executable> [<qtplugins> <libs> <dirs> <plugins_dir> <request_qt_conf> <component>])
|
||||||
|
#
|
||||||
|
# Installs Qt plugins, writes a Qt configuration file (if needed) and
|
||||||
|
# fixes up a Qt5 executable using BundleUtilities so it is standalone
|
||||||
|
# and can be drag-and-drop copied to another machine as long as all of
|
||||||
|
# the system libraries are compatible. The executable will be fixed-up
|
||||||
|
# at install time. <component> is the COMPONENT used for bundle fixup
|
||||||
|
# and plugin installation. See documentation of FIXUP_QT5_BUNDLE.
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright 2011 Mike McQuaid <mike@mikemcquaid.com>
|
||||||
|
#
|
||||||
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
|
# see accompanying file Copyright.txt for details.
|
||||||
|
#
|
||||||
|
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the License for more information.
|
||||||
|
#=============================================================================
|
||||||
|
# (To distribute this file outside of CMake, substitute the full
|
||||||
|
# License text for the above reference.)
|
||||||
|
|
||||||
|
# The functions defined in this file depend on the fixup_bundle function
|
||||||
|
# (and others) found in BundleUtilities.cmake
|
||||||
|
|
||||||
|
include(BundleUtilities)
|
||||||
|
set(DeployQt5_cmake_dir "${CMAKE_CURRENT_LIST_DIR}")
|
||||||
|
set(DeployQt5_apple_plugins_dir "PlugIns")
|
||||||
|
|
||||||
|
function(write_qt5_conf qt_conf_dir qt_conf_contents)
|
||||||
|
set(qt_conf_path "${qt_conf_dir}/qt.conf")
|
||||||
|
message(STATUS "Writing ${qt_conf_path}")
|
||||||
|
file(WRITE "${qt_conf_path}" "${qt_conf_contents}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(resolve_qt5_paths paths_var)
|
||||||
|
set(executable_path ${ARGV1})
|
||||||
|
|
||||||
|
set(paths_resolved)
|
||||||
|
foreach(path ${${paths_var}})
|
||||||
|
if(EXISTS "${path}")
|
||||||
|
list(APPEND paths_resolved "${path}")
|
||||||
|
else()
|
||||||
|
if(${executable_path})
|
||||||
|
list(APPEND paths_resolved "${executable_path}/${path}")
|
||||||
|
else()
|
||||||
|
list(APPEND paths_resolved "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${path}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set(${paths_var} ${paths_resolved} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(fixup_qt5_executable executable)
|
||||||
|
set(qtplugins ${ARGV1})
|
||||||
|
set(libs ${ARGV2})
|
||||||
|
set(dirs ${ARGV3})
|
||||||
|
set(plugins_dir ${ARGV4})
|
||||||
|
set(request_qt_conf ${ARGV5})
|
||||||
|
|
||||||
|
message(STATUS "fixup_qt5_executable")
|
||||||
|
message(STATUS " executable='${executable}'")
|
||||||
|
message(STATUS " qtplugins='${qtplugins}'")
|
||||||
|
message(STATUS " libs='${libs}'")
|
||||||
|
message(STATUS " dirs='${dirs}'")
|
||||||
|
message(STATUS " plugins_dir='${plugins_dir}'")
|
||||||
|
message(STATUS " request_qt_conf='${request_qt_conf}'")
|
||||||
|
|
||||||
|
if(QT_LIBRARY_DIR)
|
||||||
|
list(APPEND dirs "${QT_LIBRARY_DIR}")
|
||||||
|
endif()
|
||||||
|
if(QT_BINARY_DIR)
|
||||||
|
list(APPEND dirs "${QT_BINARY_DIR}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
set(qt_conf_dir "${executable}/Contents/Resources")
|
||||||
|
set(executable_path "${executable}")
|
||||||
|
set(write_qt_conf TRUE)
|
||||||
|
if(NOT plugins_dir)
|
||||||
|
set(plugins_dir "${DeployQt5_apple_plugins_dir}")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
get_filename_component(executable_path "${executable}" PATH)
|
||||||
|
if(NOT executable_path)
|
||||||
|
set(executable_path ".")
|
||||||
|
endif()
|
||||||
|
set(qt_conf_dir "${executable_path}")
|
||||||
|
set(write_qt_conf ${request_qt_conf})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
foreach(plugin ${qtplugins})
|
||||||
|
set(installed_plugin_path "")
|
||||||
|
install_qt5_plugin("${plugin}" "${executable}" 1 installed_plugin_path)
|
||||||
|
list(APPEND libs ${installed_plugin_path})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
foreach(lib ${libs})
|
||||||
|
if(NOT EXISTS "${lib}")
|
||||||
|
message(FATAL_ERROR "Library does not exist: ${lib}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
resolve_qt5_paths(libs "${executable_path}")
|
||||||
|
|
||||||
|
if(write_qt_conf)
|
||||||
|
set(qt_conf_contents "[Paths]\nPlugins = ${plugins_dir}")
|
||||||
|
write_qt5_conf("${qt_conf_dir}" "${qt_conf_contents}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
fixup_bundle("${executable}" "${libs}" "${dirs}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_qt5_plugin_path plugin executable copy installed_plugin_path_var)
|
||||||
|
set(plugins_dir ${ARGV4})
|
||||||
|
set(component ${ARGV5})
|
||||||
|
set(configurations ${ARGV6})
|
||||||
|
if(EXISTS "${plugin}")
|
||||||
|
if(APPLE)
|
||||||
|
if(NOT plugins_dir)
|
||||||
|
set(plugins_dir "${DeployQt5_apple_plugins_dir}")
|
||||||
|
endif()
|
||||||
|
set(plugins_path "${executable}/Contents/${plugins_dir}")
|
||||||
|
else()
|
||||||
|
get_filename_component(plugins_path "${executable}" PATH)
|
||||||
|
if(NOT plugins_path)
|
||||||
|
set(plugins_path ".")
|
||||||
|
endif()
|
||||||
|
if(plugins_dir)
|
||||||
|
set(plugins_path "${plugins_path}/${plugins_dir}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(plugin_group "")
|
||||||
|
|
||||||
|
get_filename_component(plugin_path "${plugin}" PATH)
|
||||||
|
get_filename_component(plugin_parent_path "${plugin_path}" PATH)
|
||||||
|
get_filename_component(plugin_parent_dir_name "${plugin_parent_path}" NAME)
|
||||||
|
get_filename_component(plugin_name "${plugin}" NAME)
|
||||||
|
string(TOLOWER "${plugin_parent_dir_name}" plugin_parent_dir_name)
|
||||||
|
|
||||||
|
if("${plugin_parent_dir_name}" STREQUAL "plugins")
|
||||||
|
get_filename_component(plugin_group "${plugin_path}" NAME)
|
||||||
|
set(${plugin_group_var} "${plugin_group}")
|
||||||
|
endif()
|
||||||
|
set(plugins_path "${plugins_path}/${plugin_group}")
|
||||||
|
|
||||||
|
if(${copy})
|
||||||
|
file(MAKE_DIRECTORY "${plugins_path}")
|
||||||
|
file(COPY "${plugin}" DESTINATION "${plugins_path}")
|
||||||
|
else()
|
||||||
|
if(configurations AND (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE))
|
||||||
|
set(configurations CONFIGURATIONS ${configurations})
|
||||||
|
else()
|
||||||
|
unset(configurations)
|
||||||
|
endif()
|
||||||
|
install(FILES "${plugin}" DESTINATION "${plugins_path}" ${configurations} ${component})
|
||||||
|
endif()
|
||||||
|
set(${installed_plugin_path_var} "${plugins_path}/${plugin_name}" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_qt5_plugin plugin executable copy installed_plugin_path_var)
|
||||||
|
set(plugins_dir ${ARGV4})
|
||||||
|
set(component ${ARGV5})
|
||||||
|
if(EXISTS "${plugin}")
|
||||||
|
install_qt5_plugin_path("${plugin}" "${executable}" "${copy}" "${installed_plugin_path_var}" "${plugins_dir}" "${component}")
|
||||||
|
else()
|
||||||
|
string(TOUPPER "QT_${plugin}_PLUGIN" plugin_var)
|
||||||
|
set(plugin_release_var "${plugin_var}_RELEASE")
|
||||||
|
set(plugin_debug_var "${plugin_var}_DEBUG")
|
||||||
|
set(plugin_release "${${plugin_release_var}}")
|
||||||
|
set(plugin_debug "${${plugin_debug_var}}")
|
||||||
|
if(DEFINED "${plugin_release_var}" AND DEFINED "${plugin_debug_var}" AND NOT EXISTS "${plugin_release}" AND NOT EXISTS "${plugin_debug}")
|
||||||
|
message(WARNING "Qt plugin \"${plugin}\" not recognized or found.")
|
||||||
|
endif()
|
||||||
|
if(NOT EXISTS "${${plugin_debug_var}}")
|
||||||
|
set(plugin_debug "${plugin_release}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
|
||||||
|
install_qt5_plugin_path("${plugin_release}" "${executable}" "${copy}" "${installed_plugin_path_var}_release" "${plugins_dir}" "${component}" "Release|RelWithDebInfo|MinSizeRel")
|
||||||
|
install_qt5_plugin_path("${plugin_debug}" "${executable}" "${copy}" "${installed_plugin_path_var}_debug" "${plugins_dir}" "${component}" "Debug")
|
||||||
|
|
||||||
|
if(CMAKE_BUILD_TYPE MATCHES "^Debug$")
|
||||||
|
set(${installed_plugin_path_var} ${${installed_plugin_path_var}_debug})
|
||||||
|
else()
|
||||||
|
set(${installed_plugin_path_var} ${${installed_plugin_path_var}_release})
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
install_qt5_plugin_path("${plugin_release}" "${executable}" "${copy}" "${installed_plugin_path_var}" "${plugins_dir}" "${component}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
set(${installed_plugin_path_var} ${${installed_plugin_path_var}} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_qt5_executable executable)
|
||||||
|
set(qtplugins ${ARGV1})
|
||||||
|
set(libs ${ARGV2})
|
||||||
|
set(dirs ${ARGV3})
|
||||||
|
set(plugins_dir ${ARGV4})
|
||||||
|
set(request_qt_conf ${ARGV5})
|
||||||
|
set(component ${ARGV6})
|
||||||
|
if(QT_LIBRARY_DIR)
|
||||||
|
list(APPEND dirs "${QT_LIBRARY_DIR}")
|
||||||
|
endif()
|
||||||
|
if(QT_BINARY_DIR)
|
||||||
|
list(APPEND dirs "${QT_BINARY_DIR}")
|
||||||
|
endif()
|
||||||
|
if(TARGET Qt5::Core)
|
||||||
|
get_property(_locCore TARGET Qt5::Core PROPERTY LOCATION_RELEASE)
|
||||||
|
get_filename_component(_loc ${_locCore} DIRECTORY)
|
||||||
|
message(STATUS "Adding Qt 5 directory: ${_loc}")
|
||||||
|
list(APPEND dirs "${_loc}")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "No Qt5::Core target found, ensure it is available")
|
||||||
|
endif()
|
||||||
|
if(component)
|
||||||
|
set(component COMPONENT ${component})
|
||||||
|
else()
|
||||||
|
unset(component)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_filename_component(executable_absolute "${executable}" ABSOLUTE)
|
||||||
|
if(EXISTS "${QT_QTCORE_LIBRARY_RELEASE}")
|
||||||
|
gp_file_type("${executable_absolute}" "${QT_QTCORE_LIBRARY_RELEASE}" qtcore_type)
|
||||||
|
elseif(EXISTS "${QT_QTCORE_LIBRARY_DEBUG}")
|
||||||
|
gp_file_type("${executable_absolute}" "${QT_QTCORE_LIBRARY_DEBUG}" qtcore_type)
|
||||||
|
endif()
|
||||||
|
if(qtcore_type STREQUAL "system")
|
||||||
|
set(qt_plugins_dir "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(QT_IS_STATIC)
|
||||||
|
message(WARNING "Qt built statically: not installing plugins.")
|
||||||
|
else()
|
||||||
|
if(APPLE)
|
||||||
|
get_property(loc TARGET Qt5::QCocoaIntegrationPlugin
|
||||||
|
PROPERTY LOCATION_RELEASE)
|
||||||
|
install_qt5_plugin("${loc}" "${executable}" 0 installed_plugin_paths
|
||||||
|
"PlugIns" "${component}")
|
||||||
|
list(APPEND libs ${installed_plugin_paths})
|
||||||
|
elseif(WIN32)
|
||||||
|
get_property(loc TARGET Qt5::QWindowsIntegrationPlugin
|
||||||
|
PROPERTY LOCATION_RELEASE)
|
||||||
|
install_qt5_plugin("${loc}" "${executable}" 0 installed_plugin_paths
|
||||||
|
"" "${component}")
|
||||||
|
list(APPEND libs ${installed_plugin_paths})
|
||||||
|
endif()
|
||||||
|
foreach(plugin ${qtplugins})
|
||||||
|
set(installed_plugin_paths "")
|
||||||
|
install_qt5_plugin("${plugin}" "${executable}" 0 installed_plugin_paths "${plugins_dir}" "${component}")
|
||||||
|
list(APPEND libs ${installed_plugin_paths})
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
resolve_qt5_paths(libs "")
|
||||||
|
|
||||||
|
install(CODE
|
||||||
|
"include(\"${DeployQt5_cmake_dir}/DeployQt5.cmake\")
|
||||||
|
set(BU_CHMOD_BUNDLE_ITEMS TRUE)
|
||||||
|
fixup_qt5_executable(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${executable}\" \"\" \"${libs}\" \"${dirs}\" \"${plugins_dir}\" \"${request_qt_conf}\")"
|
||||||
|
${component}
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
@@ -30,9 +30,9 @@ IF(QT4_FOUND)
|
|||||||
NAMES ${QTSINGLEAPPLICATION_NAMES}
|
NAMES ${QTSINGLEAPPLICATION_NAMES}
|
||||||
PATHS ${QT_LIBRARY_DIR}
|
PATHS ${QT_LIBRARY_DIR}
|
||||||
)
|
)
|
||||||
ELSEIF(Qt5Widgets_FOUND)
|
ELSEIF(Qt5Core_FOUND)
|
||||||
message(STATUS "Looking for Qt5 single application library")
|
message(STATUS "Looking for Qt5 single application library")
|
||||||
FOREACH(TOP_INCLUDE_PATH in ${Qt5Widgets_INCLUDE_DIRS} ${FRAMEWORK_INCLUDE_DIR})
|
FOREACH(TOP_INCLUDE_PATH in ${Qt5Core_INCLUDE_DIRS} ${FRAMEWORK_INCLUDE_DIR})
|
||||||
FIND_PATH(QTSINGLEAPPLICATION_INCLUDE_DIR QtSingleApplication ${TOP_INCLUDE_PATH}/QtSolutions)
|
FIND_PATH(QTSINGLEAPPLICATION_INCLUDE_DIR QtSingleApplication ${TOP_INCLUDE_PATH}/QtSolutions)
|
||||||
|
|
||||||
IF(QTSINGLEAPPLICATION_INCLUDE_DIR)
|
IF(QTSINGLEAPPLICATION_INCLUDE_DIR)
|
||||||
@@ -43,12 +43,12 @@ ELSEIF(Qt5Widgets_FOUND)
|
|||||||
SET(QTSINGLEAPPLICATION_NAMES ${QTSINGLEAPPLICATION_NAMES}
|
SET(QTSINGLEAPPLICATION_NAMES ${QTSINGLEAPPLICATION_NAMES}
|
||||||
Qt5Solutions_SingleApplication-2.6 libQt5Solutions_SingleApplication-2.6
|
Qt5Solutions_SingleApplication-2.6 libQt5Solutions_SingleApplication-2.6
|
||||||
QtSolutions_SingleApplication-2.6 libQtSolutions_SingleApplication-2.6)
|
QtSolutions_SingleApplication-2.6 libQtSolutions_SingleApplication-2.6)
|
||||||
GET_TARGET_PROPERTY(QT5_WIDGETSLIBRARY Qt5::Widgets LOCATION)
|
GET_TARGET_PROPERTY(_QT5_CORELIBRARY Qt5::Core LOCATION)
|
||||||
GET_FILENAME_COMPONENT(QT5_WIDGETSLIBRARYPATH ${QT5_WIDGETSLIBRARY} PATH)
|
GET_FILENAME_COMPONENT(_QT5_CORELIBRARYPATH ${_QT5_CORELIBRARY} PATH)
|
||||||
|
|
||||||
FIND_LIBRARY(QTSINGLEAPPLICATION_LIBRARY
|
FIND_LIBRARY(QTSINGLEAPPLICATION_LIBRARY
|
||||||
NAMES ${QTSINGLEAPPLICATION_NAMES}
|
NAMES ${QTSINGLEAPPLICATION_NAMES}
|
||||||
PATHS ${QT5_WIDGETSLIBRARYPATH}
|
PATHS ${_QT5_CORELIBRARYPATH}
|
||||||
)
|
)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ macro(qbt_set_compiler_options)
|
|||||||
# "-Weffc++"
|
# "-Weffc++"
|
||||||
"-Werror -Wno-error=cpp"
|
"-Werror -Wno-error=cpp"
|
||||||
# we should modify code to make these ones obsolete
|
# we should modify code to make these ones obsolete
|
||||||
"-Wno-error=old-style-cast -Wno-error=sign-conversion -Wno-error=float-equal"
|
"-Wno-error=sign-conversion -Wno-error=float-equal"
|
||||||
)
|
)
|
||||||
|
|
||||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
# a helper function which appends source to the main qBt target
|
# a helper function which appends source to the main qBt target
|
||||||
# the target name is read from QBT_TARGET_NAME variable
|
# sources file names are relative to the the ${qBittorrent_SOURCE_DIR}
|
||||||
# sources file names are relative to the the ${qbt_executable_SOURCE_DIR}
|
|
||||||
|
|
||||||
function (qbt_target_sources)
|
function (qbt_target_sources)
|
||||||
set (_sources_rel "")
|
set (_sources_rel "")
|
||||||
@@ -13,5 +12,5 @@ function (qbt_target_sources)
|
|||||||
file (RELATIVE_PATH _source_rel "${qbt_executable_SOURCE_DIR}" "${_source_abs}")
|
file (RELATIVE_PATH _source_rel "${qbt_executable_SOURCE_DIR}" "${_source_abs}")
|
||||||
list (APPEND _sources_rel "${_source_rel}")
|
list (APPEND _sources_rel "${_source_rel}")
|
||||||
endforeach()
|
endforeach()
|
||||||
target_sources (${QBT_TARGET_NAME} PRIVATE "${_sources_rel}")
|
target_sources (qBittorrent PRIVATE "${_sources_rel}")
|
||||||
endfunction (qbt_target_sources)
|
endfunction (qbt_target_sources)
|
||||||
|
|||||||
21
cmake/Modules/bundle.cmake
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
||||||
|
include(DeployQt5)
|
||||||
|
|
||||||
|
set(plugins "")
|
||||||
|
|
||||||
|
get_property(svgIconPluginLocation TARGET Qt5::QSvgIconPlugin
|
||||||
|
PROPERTY LOCATION_RELEASE)
|
||||||
|
list(APPEND plugins "${svgIconPluginLocation}")
|
||||||
|
get_property(svgPluginLocation TARGET Qt5::QSvgPlugin
|
||||||
|
PROPERTY LOCATION_RELEASE)
|
||||||
|
list(APPEND plugins "${svgPluginLocation}")
|
||||||
|
|
||||||
|
set(sfx "")
|
||||||
|
if(APPLE)
|
||||||
|
set(sfx ".app")
|
||||||
|
elseif(WIN32)
|
||||||
|
set(sfx "${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_target_property(exe qBittorrent OUTPUT_NAME)
|
||||||
|
install_qt5_executable("${exe}${sfx}" "${plugins}" "" "" "")
|
||||||
@@ -24,6 +24,7 @@ add_definitions(-DUNICODE
|
|||||||
-D_WIN32_IE=0x0501
|
-D_WIN32_IE=0x0501
|
||||||
-D_CRT_SECURE_NO_DEPRECATE
|
-D_CRT_SECURE_NO_DEPRECATE
|
||||||
-D_SCL_SECURE_NO_DEPRECATE
|
-D_SCL_SECURE_NO_DEPRECATE
|
||||||
|
-DNOMINMAX
|
||||||
)
|
)
|
||||||
# and boost
|
# and boost
|
||||||
set(Boost_USE_STATIC_LIBS True)
|
set(Boost_USE_STATIC_LIBS True)
|
||||||
|
|||||||
61
conf.pri.windows
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# Adapt these paths
|
||||||
|
# Point these to the include folders
|
||||||
|
INCLUDEPATH += $$quote(C:/qBittorrent/boost)
|
||||||
|
INCLUDEPATH += $$quote(C:/qBittorrent/libtorrent/include)
|
||||||
|
INCLUDEPATH += $$quote(C:/qBittorrent/zlib/include)
|
||||||
|
INCLUDEPATH += $$quote(C:/qBittorrent/openssl/include)
|
||||||
|
# Point these to the lib folders
|
||||||
|
LIBS += $$quote(-LC:/qBittorrent/boost/stage/lib)
|
||||||
|
LIBS += $$quote(-LC:/qBittorrent/libtorrent/lib)
|
||||||
|
LIBS += $$quote(-LC:/qBittorrent/zlib/lib)
|
||||||
|
LIBS += $$quote(-LC:/qBittorrent/openssl/lib)
|
||||||
|
|
||||||
|
# Adapt the lib names/versions accordingly
|
||||||
|
# If you want to use Boost auto-linking then disable
|
||||||
|
# BOOST_ALL_NO_LIB below and omit Boost libraries here
|
||||||
|
CONFIG(debug, debug|release) {
|
||||||
|
LIBS += libtorrentd.lib \
|
||||||
|
libboost_system-vc140-mt-sgd-1_64.lib
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LIBS += libtorrent.lib \
|
||||||
|
libboost_system-vc140-mt-s-1_64.lib
|
||||||
|
}
|
||||||
|
LIBS += libeay32.lib ssleay32.lib
|
||||||
|
LIBS += zlib.lib
|
||||||
|
# ...or if you use MinGW
|
||||||
|
#CONFIG(debug, debug|release) {
|
||||||
|
# LIBS += libtorrent-rasterbar \
|
||||||
|
# libboost_system-mt
|
||||||
|
#}
|
||||||
|
#else {
|
||||||
|
# LIBS += libtorrent-rasterbar \
|
||||||
|
# libboost_system-mt
|
||||||
|
#}
|
||||||
|
#LIBS += libcrypto libssl
|
||||||
|
#LIBS += libz
|
||||||
|
|
||||||
|
DEFINES += NTDDI_VERSION=0x05010000
|
||||||
|
DEFINES += _WIN32_WINNT=0x0501
|
||||||
|
DEFINES += _WIN32_IE=0x0501
|
||||||
|
|
||||||
|
# Disable to use Boost auto-linking
|
||||||
|
DEFINES += BOOST_ALL_NO_LIB
|
||||||
|
# Use one of the following options
|
||||||
|
DEFINES += BOOST_SYSTEM_STATIC_LINK
|
||||||
|
#DEFINES += BOOST_SYSTEM_DYN_LINK
|
||||||
|
# Boost 1.60+ defaults to Vista+ support. The define below enables XP support again.
|
||||||
|
DEFINES += BOOST_USE_WINAPI_VERSION=0x0501
|
||||||
|
# Enable if building against libtorrent 1.0.x (RC_1_0) (static linking)
|
||||||
|
#DEFINES += BOOST_ASIO_SEPARATE_COMPILATION
|
||||||
|
# Enable if building against libtorrent 1.0.x (RC_1_0) (dynamic linking)
|
||||||
|
#DEFINES += BOOST_ASIO_DYN_LINK
|
||||||
|
|
||||||
|
# Enable if building against libtorrent 1.1.x (RC_1_1)
|
||||||
|
# built with this flag defined
|
||||||
|
#DEFINES += TORRENT_NO_DEPRECATE
|
||||||
|
# Enable if linking dynamically against libtorrent
|
||||||
|
#DEFINES += TORRENT_LINKING_SHARED
|
||||||
|
|
||||||
|
# Enable stack trace support
|
||||||
|
CONFIG += strace_win
|
||||||
630
configure
vendored
@@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for qbittorrent v3.2.0alpha.
|
# Generated by GNU Autoconf 2.69 for qbittorrent v4.0.4.
|
||||||
#
|
#
|
||||||
# Report bugs to <bugs.qbittorrent.org>.
|
# Report bugs to <bugs.qbittorrent.org>.
|
||||||
#
|
#
|
||||||
@@ -580,10 +580,10 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='qbittorrent'
|
PACKAGE_NAME='qbittorrent'
|
||||||
PACKAGE_TARNAME='qbittorrent'
|
PACKAGE_TARNAME='qbittorrent'
|
||||||
PACKAGE_VERSION='v3.2.0alpha'
|
PACKAGE_VERSION='v4.0.4'
|
||||||
PACKAGE_STRING='qbittorrent v3.2.0alpha'
|
PACKAGE_STRING='qbittorrent v4.0.4'
|
||||||
PACKAGE_BUGREPORT='bugs.qbittorrent.org'
|
PACKAGE_BUGREPORT='bugs.qbittorrent.org'
|
||||||
PACKAGE_URL='http://www.qbittorrent.org/'
|
PACKAGE_URL='https://www.qbittorrent.org/'
|
||||||
|
|
||||||
ac_subst_vars='am__EXEEXT_FALSE
|
ac_subst_vars='am__EXEEXT_FALSE
|
||||||
am__EXEEXT_TRUE
|
am__EXEEXT_TRUE
|
||||||
@@ -603,11 +603,11 @@ zlib_LIBS
|
|||||||
zlib_CFLAGS
|
zlib_CFLAGS
|
||||||
libtorrent_LIBS
|
libtorrent_LIBS
|
||||||
libtorrent_CFLAGS
|
libtorrent_CFLAGS
|
||||||
qjson_LIBS
|
|
||||||
qjson_CFLAGS
|
|
||||||
BOOST_SYSTEM_LIB
|
BOOST_SYSTEM_LIB
|
||||||
BOOST_LDFLAGS
|
BOOST_LDFLAGS
|
||||||
BOOST_CPPFLAGS
|
BOOST_CPPFLAGS
|
||||||
|
Qt5Svg_LIBS
|
||||||
|
Qt5Svg_CFLAGS
|
||||||
QT_QMAKE
|
QT_QMAKE
|
||||||
PKG_CONFIG_LIBDIR
|
PKG_CONFIG_LIBDIR
|
||||||
PKG_CONFIG_PATH
|
PKG_CONFIG_PATH
|
||||||
@@ -715,9 +715,7 @@ ac_user_opts='
|
|||||||
enable_option_checking
|
enable_option_checking
|
||||||
enable_dependency_tracking
|
enable_dependency_tracking
|
||||||
enable_silent_rules
|
enable_silent_rules
|
||||||
with_qt4
|
|
||||||
with_qtsingleapplication
|
with_qtsingleapplication
|
||||||
with_qjson
|
|
||||||
enable_debug
|
enable_debug
|
||||||
enable_gui
|
enable_gui
|
||||||
enable_systemd
|
enable_systemd
|
||||||
@@ -742,8 +740,8 @@ PKG_CONFIG
|
|||||||
PKG_CONFIG_PATH
|
PKG_CONFIG_PATH
|
||||||
PKG_CONFIG_LIBDIR
|
PKG_CONFIG_LIBDIR
|
||||||
QT_QMAKE
|
QT_QMAKE
|
||||||
qjson_CFLAGS
|
Qt5Svg_CFLAGS
|
||||||
qjson_LIBS
|
Qt5Svg_LIBS
|
||||||
libtorrent_CFLAGS
|
libtorrent_CFLAGS
|
||||||
libtorrent_LIBS
|
libtorrent_LIBS
|
||||||
zlib_CFLAGS
|
zlib_CFLAGS
|
||||||
@@ -1298,7 +1296,7 @@ if test "$ac_init_help" = "long"; then
|
|||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures qbittorrent v3.2.0alpha to adapt to many kinds of systems.
|
\`configure' configures qbittorrent v4.0.4 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@@ -1369,7 +1367,7 @@ fi
|
|||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of qbittorrent v3.2.0alpha:";;
|
short | recursive ) echo "Configuration of qbittorrent v4.0.4:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@@ -1393,13 +1391,9 @@ Optional Features:
|
|||||||
Optional Packages:
|
Optional Packages:
|
||||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||||
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
||||||
--with-qt4 Compile using Qt4 (default=no)
|
|
||||||
--with-qtsingleapplication=[system|shipped]
|
--with-qtsingleapplication=[system|shipped]
|
||||||
Use the shipped qtsingleapplication library or the
|
Use the shipped qtsingleapplication library or the
|
||||||
system one (default=shipped)
|
system one (default=shipped)
|
||||||
--with-qjson=[system|shipped]
|
|
||||||
Use the shipped qjson library or the system one
|
|
||||||
(default=shipped) (Qt4 only)
|
|
||||||
--with-boost[=ARG] use Boost library from a standard location
|
--with-boost[=ARG] use Boost library from a standard location
|
||||||
(ARG=yes), from the specified location (ARG=<path>),
|
(ARG=yes), from the specified location (ARG=<path>),
|
||||||
or disable it (ARG=no) [ARG=yes]
|
or disable it (ARG=no) [ARG=yes]
|
||||||
@@ -1429,10 +1423,10 @@ Some influential environment variables:
|
|||||||
directories to add to pkg-config's search path
|
directories to add to pkg-config's search path
|
||||||
PKG_CONFIG_LIBDIR
|
PKG_CONFIG_LIBDIR
|
||||||
path overriding pkg-config's built-in search path
|
path overriding pkg-config's built-in search path
|
||||||
QT_QMAKE value of host_bins for Qt5Core >= 5.2.0, overriding pkg-config
|
QT_QMAKE value of host_bins for Qt5Core >= 5.5.1, overriding pkg-config
|
||||||
qjson_CFLAGS
|
Qt5Svg_CFLAGS
|
||||||
C compiler flags for qjson, overriding pkg-config
|
C compiler flags for Qt5Svg, overriding pkg-config
|
||||||
qjson_LIBS linker flags for qjson, overriding pkg-config
|
Qt5Svg_LIBS linker flags for Qt5Svg, overriding pkg-config
|
||||||
libtorrent_CFLAGS
|
libtorrent_CFLAGS
|
||||||
C compiler flags for libtorrent, overriding pkg-config
|
C compiler flags for libtorrent, overriding pkg-config
|
||||||
libtorrent_LIBS
|
libtorrent_LIBS
|
||||||
@@ -1444,7 +1438,7 @@ Use these variables to override the choices made by `configure' or to help
|
|||||||
it to find libraries and programs with nonstandard names/locations.
|
it to find libraries and programs with nonstandard names/locations.
|
||||||
|
|
||||||
Report bugs to <bugs.qbittorrent.org>.
|
Report bugs to <bugs.qbittorrent.org>.
|
||||||
qbittorrent home page: <http://www.qbittorrent.org/>.
|
qbittorrent home page: <https://www.qbittorrent.org/>.
|
||||||
_ACEOF
|
_ACEOF
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
fi
|
fi
|
||||||
@@ -1507,7 +1501,7 @@ fi
|
|||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
qbittorrent configure v3.2.0alpha
|
qbittorrent configure v4.0.4
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
@@ -1646,7 +1640,7 @@ cat >config.log <<_ACEOF
|
|||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by qbittorrent $as_me v3.2.0alpha, which was
|
It was created by qbittorrent $as_me v4.0.4, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
@@ -3824,7 +3818,7 @@ fi
|
|||||||
|
|
||||||
# Define the identity of the package.
|
# Define the identity of the package.
|
||||||
PACKAGE='qbittorrent'
|
PACKAGE='qbittorrent'
|
||||||
VERSION='v3.2.0alpha'
|
VERSION='v4.0.4'
|
||||||
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
@@ -4179,15 +4173,6 @@ fi
|
|||||||
# Define --wth-* and --enable-* arguments
|
# Define --wth-* and --enable-* arguments
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-qt4 was given.
|
|
||||||
if test "${with_qt4+set}" = set; then :
|
|
||||||
withval=$with_qt4;
|
|
||||||
else
|
|
||||||
with_qt4=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-qtsingleapplication was given.
|
# Check whether --with-qtsingleapplication was given.
|
||||||
if test "${with_qtsingleapplication+set}" = set; then :
|
if test "${with_qtsingleapplication+set}" = set; then :
|
||||||
withval=$with_qtsingleapplication;
|
withval=$with_qtsingleapplication;
|
||||||
@@ -4196,15 +4181,6 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-qjson was given.
|
|
||||||
if test "${with_qjson+set}" = set; then :
|
|
||||||
withval=$with_qjson;
|
|
||||||
else
|
|
||||||
with_qjson=shipped
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Check whether --enable-debug was given.
|
# Check whether --enable-debug was given.
|
||||||
if test "${enable_debug+set}" = set; then :
|
if test "${enable_debug+set}" = set; then :
|
||||||
enableval=$enable_debug;
|
enableval=$enable_debug;
|
||||||
@@ -4466,15 +4442,9 @@ $as_echo "$enable_webui" >&6; }
|
|||||||
as_fn_error $? "Unknown option \"$enable_webui\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;;
|
as_fn_error $? "Unknown option \"$enable_webui\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Qt4 should be enabled" >&5
|
|
||||||
$as_echo_n "checking whether Qt4 should be enabled... " >&6; }
|
|
||||||
case "x$with_qt4" in #(
|
|
||||||
"xno") :
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
||||||
$as_echo "no" >&6; }
|
|
||||||
if test -n "$PKG_CONFIG" && \
|
if test -n "$PKG_CONFIG" && \
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.2.0\""; } >&5
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.5.1\""; } >&5
|
||||||
($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.2.0") 2>&5
|
($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.5.1") 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
test $ac_status = 0; }; then
|
test $ac_status = 0; }; then
|
||||||
@@ -4483,12 +4453,12 @@ if test -n "$QT_QMAKE"; then
|
|||||||
pkg_cv_QT_QMAKE="$QT_QMAKE"
|
pkg_cv_QT_QMAKE="$QT_QMAKE"
|
||||||
elif test -n "$PKG_CONFIG"; then
|
elif test -n "$PKG_CONFIG"; then
|
||||||
if test -n "$PKG_CONFIG" && \
|
if test -n "$PKG_CONFIG" && \
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.2.0\""; } >&5
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.5.1\""; } >&5
|
||||||
($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.2.0") 2>&5
|
($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.5.1") 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
test $ac_status = 0; }; then
|
test $ac_status = 0; }; then
|
||||||
pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="host_bins" "Qt5Core >= 5.2.0" 2>/dev/null`
|
pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="host_bins" "Qt5Core >= 5.5.1" 2>/dev/null`
|
||||||
test "x$?" != "x0" && pkg_failed=yes
|
test "x$?" != "x0" && pkg_failed=yes
|
||||||
else
|
else
|
||||||
pkg_failed=yes
|
pkg_failed=yes
|
||||||
@@ -4515,8 +4485,8 @@ fi
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5 qmake >= 5.2.0" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5 qmake >= 5.5.1" >&5
|
||||||
$as_echo_n "checking for Qt5 qmake >= 5.2.0... " >&6; }
|
$as_echo_n "checking for Qt5 qmake >= 5.5.1... " >&6; }
|
||||||
if test "x$QT_QMAKE" != "x"; then :
|
if test "x$QT_QMAKE" != "x"; then :
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_QMAKE" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_QMAKE" >&5
|
||||||
$as_echo "$QT_QMAKE" >&6; }
|
$as_echo "$QT_QMAKE" >&6; }
|
||||||
@@ -4525,27 +4495,27 @@ else
|
|||||||
$as_echo "not found" >&6; }
|
$as_echo "not found" >&6; }
|
||||||
|
|
||||||
fi
|
fi
|
||||||
;; #(
|
|
||||||
"xyes") :
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|
||||||
$as_echo "yes" >&6; }
|
|
||||||
if test -n "$PKG_CONFIG" && \
|
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.8.0\""; } >&5
|
|
||||||
($PKG_CONFIG --exists --print-errors "QtCore >= 4.8.0") 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; then
|
|
||||||
|
|
||||||
if test -n "$QT_QMAKE"; then
|
if test "x$QT_QMAKE" = "x"; then :
|
||||||
pkg_cv_QT_QMAKE="$QT_QMAKE"
|
as_fn_error $? "Could not find qmake" "$LINENO" 5
|
||||||
|
|
||||||
|
fi
|
||||||
|
if test "x$enable_gui" = "xyes"; then :
|
||||||
|
|
||||||
|
pkg_failed=no
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5Svg" >&5
|
||||||
|
$as_echo_n "checking for Qt5Svg... " >&6; }
|
||||||
|
|
||||||
|
if test -n "$Qt5Svg_CFLAGS"; then
|
||||||
|
pkg_cv_Qt5Svg_CFLAGS="$Qt5Svg_CFLAGS"
|
||||||
elif test -n "$PKG_CONFIG"; then
|
elif test -n "$PKG_CONFIG"; then
|
||||||
if test -n "$PKG_CONFIG" && \
|
if test -n "$PKG_CONFIG" && \
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.8.0\""; } >&5
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Svg >= 5.5.1\""; } >&5
|
||||||
($PKG_CONFIG --exists --print-errors "QtCore >= 4.8.0") 2>&5
|
($PKG_CONFIG --exists --print-errors "Qt5Svg >= 5.5.1") 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
test $ac_status = 0; }; then
|
test $ac_status = 0; }; then
|
||||||
pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="moc_location" "QtCore >= 4.8.0" 2>/dev/null`
|
pkg_cv_Qt5Svg_CFLAGS=`$PKG_CONFIG --cflags "Qt5Svg >= 5.5.1" 2>/dev/null`
|
||||||
test "x$?" != "x0" && pkg_failed=yes
|
test "x$?" != "x0" && pkg_failed=yes
|
||||||
else
|
else
|
||||||
pkg_failed=yes
|
pkg_failed=yes
|
||||||
@@ -4553,82 +4523,88 @@ fi
|
|||||||
else
|
else
|
||||||
pkg_failed=untried
|
pkg_failed=untried
|
||||||
fi
|
fi
|
||||||
QT_QMAKE=$pkg_cv_QT_QMAKE
|
if test -n "$Qt5Svg_LIBS"; then
|
||||||
|
pkg_cv_Qt5Svg_LIBS="$Qt5Svg_LIBS"
|
||||||
if test "x$QT_QMAKE" = x""; then :
|
elif test -n "$PKG_CONFIG"; then
|
||||||
|
if test -n "$PKG_CONFIG" && \
|
||||||
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Svg >= 5.5.1\""; } >&5
|
||||||
|
($PKG_CONFIG --exists --print-errors "Qt5Svg >= 5.5.1") 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
|
test $ac_status = 0; }; then
|
||||||
|
pkg_cv_Qt5Svg_LIBS=`$PKG_CONFIG --libs "Qt5Svg >= 5.5.1" 2>/dev/null`
|
||||||
|
test "x$?" != "x0" && pkg_failed=yes
|
||||||
else
|
else
|
||||||
QT_QMAKE=`$as_dirname -- "$QT_QMAKE" ||
|
pkg_failed=yes
|
||||||
$as_expr X"$QT_QMAKE" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$QT_QMAKE" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$QT_QMAKE" : 'X\(//\)$' \| \
|
|
||||||
X"$QT_QMAKE" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
$as_echo X"$QT_QMAKE" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'`
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -f "$QT_QMAKE/qmake"; then :
|
|
||||||
QT_QMAKE="$QT_QMAKE/qmake"
|
|
||||||
else
|
else
|
||||||
if test -f "$QT_QMAKE/qmake-qt4"; then :
|
pkg_failed=untried
|
||||||
QT_QMAKE="$QT_QMAKE/qmake-qt4"
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if test $pkg_failed = yes; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
|
||||||
|
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||||
|
_pkg_short_errors_supported=yes
|
||||||
else
|
else
|
||||||
QT_QMAKE=""
|
_pkg_short_errors_supported=no
|
||||||
fi
|
fi
|
||||||
|
if test $_pkg_short_errors_supported = yes; then
|
||||||
fi
|
Qt5Svg_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "Qt5Svg >= 5.5.1" 2>&1`
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4 qmake >= 4.8.0" >&5
|
|
||||||
$as_echo_n "checking for Qt4 qmake >= 4.8.0... " >&6; }
|
|
||||||
if test "x$QT_QMAKE" != "x"; then :
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_QMAKE" >&5
|
|
||||||
$as_echo "$QT_QMAKE" >&6; }
|
|
||||||
else
|
else
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
Qt5Svg_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "Qt5Svg >= 5.5.1" 2>&1`
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
;; #(
|
# Put the nasty error message in config.log where it belongs
|
||||||
*) :
|
echo "$Qt5Svg_PKG_ERRORS" >&5
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_qt4" >&5
|
|
||||||
$as_echo "$with_qt4" >&6; }
|
as_fn_error $? "Package requirements (Qt5Svg >= 5.5.1) were not met:
|
||||||
as_fn_error $? "Unknown option \"$with_qt4\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;;
|
|
||||||
esac
|
$Qt5Svg_PKG_ERRORS
|
||||||
if test "x$QT_QMAKE" = "x"; then :
|
|
||||||
as_fn_error $? "Could not find qmake" "$LINENO" 5
|
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
||||||
|
installed software in a non-standard prefix.
|
||||||
|
|
||||||
|
Alternatively, you may set the environment variables Qt5Svg_CFLAGS
|
||||||
|
and Qt5Svg_LIBS to avoid the need to call pkg-config.
|
||||||
|
See the pkg-config man page for more details." "$LINENO" 5
|
||||||
|
elif test $pkg_failed = untried; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||||
|
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||||
|
as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
|
||||||
|
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||||
|
path to pkg-config.
|
||||||
|
|
||||||
|
Alternatively, you may set the environment variables Qt5Svg_CFLAGS
|
||||||
|
and Qt5Svg_LIBS to avoid the need to call pkg-config.
|
||||||
|
See the pkg-config man page for more details.
|
||||||
|
|
||||||
|
To get pkg-config, see <http://pkg-config.freedesktop.org/>.
|
||||||
|
See \`config.log' for more details" "$LINENO" 5; }
|
||||||
|
else
|
||||||
|
Qt5Svg_CFLAGS=$pkg_cv_Qt5Svg_CFLAGS
|
||||||
|
Qt5Svg_LIBS=$pkg_cv_Qt5Svg_LIBS
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether QtDBus should be enabled" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether QtDBus should be enabled" >&5
|
||||||
$as_echo_n "checking whether QtDBus should be enabled... " >&6; }
|
$as_echo_n "checking whether QtDBus should be enabled... " >&6; }
|
||||||
case "x$enable_qt_dbus" in #(
|
case "x$enable_qt_dbus" in #(
|
||||||
"xyes") :
|
"xyes") :
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
$as_echo "yes" >&6; }
|
$as_echo "yes" >&6; }
|
||||||
if test "x$with_qt4" = "xno"; then :
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5DBus >= 5.5.1" >&5
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5DBus >= 5.2.0" >&5
|
$as_echo_n "checking for Qt5DBus >= 5.5.1... " >&6; }
|
||||||
$as_echo_n "checking for Qt5DBus >= 5.2.0... " >&6; }
|
|
||||||
if test -n "$PKG_CONFIG" && \
|
if test -n "$PKG_CONFIG" && \
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5DBus >= 5.2.0\""; } >&5
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5DBus >= 5.5.1\""; } >&5
|
||||||
($PKG_CONFIG --exists --print-errors "Qt5DBus >= 5.2.0") 2>&5
|
($PKG_CONFIG --exists --print-errors "Qt5DBus >= 5.5.1") 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
test $ac_status = 0; }; then
|
test $ac_status = 0; }; then
|
||||||
@@ -4639,26 +4615,6 @@ else
|
|||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
||||||
$as_echo "not found" >&6; }
|
$as_echo "not found" >&6; }
|
||||||
HAVE_QTDBUS=false
|
HAVE_QTDBUS=false
|
||||||
fi
|
|
||||||
|
|
||||||
else
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QtDBus >= 4.8.0" >&5
|
|
||||||
$as_echo_n "checking for QtDBus >= 4.8.0... " >&6; }
|
|
||||||
if test -n "$PKG_CONFIG" && \
|
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtDBus >= 4.8.0\""; } >&5
|
|
||||||
($PKG_CONFIG --exists --print-errors "QtDBus >= 4.8.0") 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
|
|
||||||
$as_echo "found" >&6; }
|
|
||||||
HAVE_QTDBUS=true
|
|
||||||
else
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
HAVE_QTDBUS=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$HAVE_QTDBUS" = "xfalse"; then :
|
if test "x$HAVE_QTDBUS" = "xfalse"; then :
|
||||||
@@ -4684,15 +4640,14 @@ esac
|
|||||||
# Check whether --with-boost was given.
|
# Check whether --with-boost was given.
|
||||||
if test "${with_boost+set}" = set; then :
|
if test "${with_boost+set}" = set; then :
|
||||||
withval=$with_boost;
|
withval=$with_boost;
|
||||||
if test "$withval" = "no"; then
|
case $withval in #(
|
||||||
want_boost="no"
|
no) :
|
||||||
elif test "$withval" = "yes"; then
|
want_boost="no";_AX_BOOST_BASE_boost_path="" ;; #(
|
||||||
want_boost="yes"
|
yes) :
|
||||||
ac_boost_path=""
|
want_boost="yes";_AX_BOOST_BASE_boost_path="" ;; #(
|
||||||
else
|
*) :
|
||||||
want_boost="yes"
|
want_boost="yes";_AX_BOOST_BASE_boost_path="$withval" ;;
|
||||||
ac_boost_path="$withval"
|
esac
|
||||||
fi
|
|
||||||
|
|
||||||
else
|
else
|
||||||
want_boost="yes"
|
want_boost="yes"
|
||||||
@@ -4704,78 +4659,121 @@ fi
|
|||||||
# Check whether --with-boost-libdir was given.
|
# Check whether --with-boost-libdir was given.
|
||||||
if test "${with_boost_libdir+set}" = set; then :
|
if test "${with_boost_libdir+set}" = set; then :
|
||||||
withval=$with_boost_libdir;
|
withval=$with_boost_libdir;
|
||||||
if test -d "$withval"
|
if test -d "$withval"; then :
|
||||||
then
|
_AX_BOOST_BASE_boost_lib_path="$withval"
|
||||||
ac_boost_lib_path="$withval"
|
|
||||||
else
|
else
|
||||||
as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5
|
as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5
|
||||||
fi
|
fi
|
||||||
|
|
||||||
else
|
else
|
||||||
ac_boost_lib_path=""
|
_AX_BOOST_BASE_boost_lib_path=""
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if test "x$want_boost" = "xyes"; then
|
BOOST_LDFLAGS=""
|
||||||
boost_lib_version_req=1.35
|
BOOST_CPPFLAGS=""
|
||||||
boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([0-9]*\.[0-9]*\)'`
|
if test "x$want_boost" = "xyes"; then :
|
||||||
boost_lib_version_req_major=`expr $boost_lib_version_req : '\([0-9]*\)'`
|
|
||||||
boost_lib_version_req_minor=`expr $boost_lib_version_req : '[0-9]*\.\([0-9]*\)'`
|
|
||||||
boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
|
if test "x1.35" = "x"; then :
|
||||||
if test "x$boost_lib_version_req_sub_minor" = "x" ; then
|
_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"
|
||||||
boost_lib_version_req_sub_minor="0"
|
else
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req="1.35"
|
||||||
fi
|
fi
|
||||||
WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
|
_AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\.[0-9]*\)'`
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= $boost_lib_version_req" >&5
|
_AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\)'`
|
||||||
$as_echo_n "checking for boostlib >= $boost_lib_version_req... " >&6; }
|
if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"; then :
|
||||||
|
as_fn_error $? "You should at least specify libboost major version" "$LINENO" 5
|
||||||
|
fi
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.\([0-9]*\)'`
|
||||||
|
if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"; then :
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"
|
||||||
|
fi
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
|
||||||
|
if test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"; then :
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"
|
||||||
|
fi
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor`
|
||||||
|
WANT_BOOST_VERSION=$_AX_BOOST_BASE_TONUMERICVERSION_RET
|
||||||
|
|
||||||
succeeded=no
|
succeeded=no
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
case ${host_cpu} in #(
|
||||||
|
x86_64) :
|
||||||
|
libsubdirs="lib64 libx32 lib lib64" ;; #(
|
||||||
|
ppc64|s390x|sparc64|aarch64|ppc64le) :
|
||||||
|
libsubdirs="lib64 lib lib64" ;; #(
|
||||||
|
*) :
|
||||||
libsubdirs="lib"
|
libsubdirs="lib"
|
||||||
ax_arch=`uname -m`
|
|
||||||
case $ax_arch in
|
|
||||||
x86_64)
|
|
||||||
libsubdirs="lib64 libx32 lib lib64"
|
|
||||||
;;
|
|
||||||
ppc64|s390x|sparc64|aarch64|ppc64le)
|
|
||||||
libsubdirs="lib64 lib lib64 ppc64le"
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
case ${host_cpu} in #(
|
||||||
libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
|
i?86) :
|
||||||
|
multiarch_libsubdir="lib/i386-${host_os}" ;; #(
|
||||||
case ${host_cpu} in
|
*) :
|
||||||
i?86)
|
multiarch_libsubdir="lib/${host_cpu}-${host_os}"
|
||||||
libsubdirs="lib/i386-${host_os} $libsubdirs"
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if test "$ac_boost_path" != ""; then
|
if test "x$_AX_BOOST_BASE_boost_path" != "x"; then :
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path/include"
|
|
||||||
for ac_boost_path_tmp in $libsubdirs; do
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"" >&5
|
||||||
if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
|
$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"... " >&6; }
|
||||||
BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
|
if test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"; then :
|
||||||
break
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
|
||||||
|
for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"" >&5
|
||||||
|
$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"... " >&6; }
|
||||||
|
if test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ; then :
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
|
||||||
|
break;
|
||||||
|
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
elif test "$cross_compiling" != yes; then
|
else
|
||||||
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
|
||||||
if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
for libsubdir in $libsubdirs ; do
|
$as_echo "no" >&6; }
|
||||||
if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if test X"$cross_compiling" = Xyes; then
|
||||||
|
search_libsubdirs=$multiarch_libsubdir
|
||||||
|
else
|
||||||
|
search_libsubdirs="$multiarch_libsubdir $libsubdirs"
|
||||||
|
fi
|
||||||
|
for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
||||||
|
if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then
|
||||||
|
for libsubdir in $search_libsubdirs ; do
|
||||||
|
if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||||
done
|
done
|
||||||
BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
|
||||||
break;
|
break;
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$ac_boost_lib_path" != ""; then
|
if test "x$_AX_BOOST_BASE_boost_lib_path" != "x"; then :
|
||||||
BOOST_LDFLAGS="-L$ac_boost_lib_path"
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION)" >&5
|
||||||
|
$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION)... " >&6; }
|
||||||
CPPFLAGS_SAVED="$CPPFLAGS"
|
CPPFLAGS_SAVED="$CPPFLAGS"
|
||||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||||
export CPPFLAGS
|
export CPPFLAGS
|
||||||
@@ -4800,11 +4798,7 @@ int
|
|||||||
main ()
|
main ()
|
||||||
{
|
{
|
||||||
|
|
||||||
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))]));
|
||||||
// Everything is okay
|
|
||||||
#else
|
|
||||||
# error Boost version is too old
|
|
||||||
#endif
|
|
||||||
|
|
||||||
;
|
;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -4832,35 +4826,43 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|||||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
LDFLAGS="$LDFLAGS_SAVED"
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
BOOST_CPPFLAGS=
|
BOOST_CPPFLAGS=
|
||||||
|
if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
|
||||||
BOOST_LDFLAGS=
|
BOOST_LDFLAGS=
|
||||||
|
fi
|
||||||
_version=0
|
_version=0
|
||||||
if test "$ac_boost_path" != ""; then
|
if test -n "$_AX_BOOST_BASE_boost_path" ; then
|
||||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then
|
||||||
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
|
||||||
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
_version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||||
V_CHECK=`expr $_version_tmp \> $_version`
|
V_CHECK=`expr $_version_tmp \> $_version`
|
||||||
if test "$V_CHECK" = "1" ; then
|
if test "x$V_CHECK" = "x1" ; then
|
||||||
_version=$_version_tmp
|
_version=$_version_tmp
|
||||||
fi
|
fi
|
||||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
|
||||||
done
|
done
|
||||||
if test -z "$BOOST_CPPFLAGS"; then
|
if test -z "$BOOST_CPPFLAGS"; then
|
||||||
if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then
|
if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path"
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then
|
||||||
|
for libsubdir in $libsubdirs ; do
|
||||||
|
if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||||
|
done
|
||||||
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if test "$cross_compiling" != yes; then
|
if test "x$cross_compiling" != "xyes" ; then
|
||||||
for ac_boost_path in /usr /usr/local /opt /opt/local ; do
|
for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do
|
||||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then
|
||||||
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
|
||||||
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
_version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||||
V_CHECK=`expr $_version_tmp \> $_version`
|
V_CHECK=`expr $_version_tmp \> $_version`
|
||||||
if test "$V_CHECK" = "1" ; then
|
if test "x$V_CHECK" = "x1" ; then
|
||||||
_version=$_version_tmp
|
_version=$_version_tmp
|
||||||
best_path=$ac_boost_path
|
best_path=$_AX_BOOST_BASE_boost_path
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
@@ -4868,7 +4870,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|||||||
|
|
||||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||||
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
|
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
|
||||||
if test "$ac_boost_lib_path" = ""; then
|
if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
|
||||||
for libsubdir in $libsubdirs ; do
|
for libsubdir in $libsubdirs ; do
|
||||||
if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||||
done
|
done
|
||||||
@@ -4876,7 +4878,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$BOOST_ROOT" != "x"; then
|
if test -n "$BOOST_ROOT" ; then
|
||||||
for libsubdir in $libsubdirs ; do
|
for libsubdir in $libsubdirs ; do
|
||||||
if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||||
done
|
done
|
||||||
@@ -4885,7 +4887,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|||||||
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
|
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
|
||||||
stage_version_shorten=`expr $stage_version : '\([0-9]*\.[0-9]*\)'`
|
stage_version_shorten=`expr $stage_version : '\([0-9]*\.[0-9]*\)'`
|
||||||
V_CHECK=`expr $stage_version_shorten \>\= $_version`
|
V_CHECK=`expr $stage_version_shorten \>\= $_version`
|
||||||
if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
|
if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: We will use a staged boost library from $BOOST_ROOT" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: We will use a staged boost library from $BOOST_ROOT" >&5
|
||||||
$as_echo "$as_me: We will use a staged boost library from $BOOST_ROOT" >&6;}
|
$as_echo "$as_me: We will use a staged boost library from $BOOST_ROOT" >&6;}
|
||||||
BOOST_CPPFLAGS="-I$BOOST_ROOT"
|
BOOST_CPPFLAGS="-I$BOOST_ROOT"
|
||||||
@@ -4915,11 +4917,7 @@ int
|
|||||||
main ()
|
main ()
|
||||||
{
|
{
|
||||||
|
|
||||||
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))]));
|
||||||
// Everything is okay
|
|
||||||
#else
|
|
||||||
# error Boost version is too old
|
|
||||||
#endif
|
|
||||||
|
|
||||||
;
|
;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -4942,41 +4940,37 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$succeeded" != "yes" ; then
|
if test "x$succeeded" != "xyes" ; then
|
||||||
if test "$_version" = "0" ; then
|
if test "x$_version" = "x0" ; then
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation." >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version 1.35 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation." >&5
|
||||||
$as_echo "$as_me: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation." >&6;}
|
$as_echo "$as_me: We could not detect the boost libraries (version 1.35 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation." >&6;}
|
||||||
else
|
else
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Your boost libraries seems to old (version $_version)." >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Your boost libraries seems to old (version $_version)." >&5
|
||||||
$as_echo "$as_me: Your boost libraries seems to old (version $_version)." >&6;}
|
$as_echo "$as_me: Your boost libraries seems to old (version $_version)." >&6;}
|
||||||
fi
|
fi
|
||||||
# execute ACTION-IF-NOT-FOUND (if present):
|
# execute ACTION-IF-NOT-FOUND (if present):
|
||||||
:
|
as_fn_error $? "Could not find Boost" "$LINENO" 5
|
||||||
else
|
else
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$as_echo "#define HAVE_BOOST /**/" >>confdefs.h
|
$as_echo "#define HAVE_BOOST /**/" >>confdefs.h
|
||||||
|
|
||||||
# execute ACTION-IF-FOUND (if present):
|
# execute ACTION-IF-FOUND (if present):
|
||||||
:
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Boost CPPFLAGS: \"$BOOST_CPPFLAGS\"
|
||||||
|
Boost LDFLAGS: \"$BOOST_LDFLAGS\"" >&5
|
||||||
|
$as_echo "$as_me: Boost CPPFLAGS: \"$BOOST_CPPFLAGS\"
|
||||||
|
Boost LDFLAGS: \"$BOOST_LDFLAGS\"" >&6;}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
LDFLAGS="$LDFLAGS_SAVED"
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# HAVE_BOOST is set to an empty value when Boost is found. I don't know
|
|
||||||
# how to test for a set vs unset variable.
|
|
||||||
if test "x$BOOST_CPPFLAGS" = "x"; then :
|
|
||||||
as_fn_error $? "Could not find Boost" "$LINENO" 5
|
|
||||||
else
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Boost CPPFLAGS: $BOOST_CPPFLAGS" >&5
|
|
||||||
$as_echo "$as_me: Boost CPPFLAGS: $BOOST_CPPFLAGS" >&6;}
|
|
||||||
CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
|
CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
|
||||||
LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
|
LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -5220,15 +5214,9 @@ fi
|
|||||||
LDFLAGS="$LDFLAGS_SAVED"
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# HAVE_BOOST_SYSTEM is set to an empty value when Boost.System is found.
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Boost.System LIB: \"$BOOST_SYSTEM_LIB\"" >&5
|
||||||
# I don't know how to test for a set vs unset variable.
|
$as_echo "$as_me: Boost.System LIB: \"$BOOST_SYSTEM_LIB\"" >&6;}
|
||||||
if test "x$BOOST_SYSTEM_LIB" = "x"; then :
|
|
||||||
as_fn_error $? "Could not find Boost.System" "$LINENO" 5
|
|
||||||
else
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Boost.System LIB: $BOOST_SYSTEM_LIB" >&5
|
|
||||||
$as_echo "$as_me: Boost.System LIB: $BOOST_SYSTEM_LIB" >&6;}
|
|
||||||
LIBS="$BOOST_SYSTEM_LIB $LIBS"
|
LIBS="$BOOST_SYSTEM_LIB $LIBS"
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which qtsingleapplication to use" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which qtsingleapplication to use" >&5
|
||||||
$as_echo_n "checking which qtsingleapplication to use... " >&6; }
|
$as_echo_n "checking which qtsingleapplication to use... " >&6; }
|
||||||
@@ -5247,118 +5235,6 @@ $as_echo "$with_qtsingleapplication" >&6; }
|
|||||||
as_fn_error $? "Unknown option \"$with_qtsingleapplication\". Use either \"system\" or \"shipped\"." "$LINENO" 5 ;;
|
as_fn_error $? "Unknown option \"$with_qtsingleapplication\". Use either \"system\" or \"shipped\"." "$LINENO" 5 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if test "x$with_qt4" = "xyes"; then :
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which qjson to use" >&5
|
|
||||||
$as_echo_n "checking which qjson to use... " >&6; }
|
|
||||||
case "x$with_qjson" in #(
|
|
||||||
"xshipped") :
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: shipped" >&5
|
|
||||||
$as_echo "shipped" >&6; }
|
|
||||||
QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG usesystemqjson" ;; #(
|
|
||||||
"xsystem") :
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: system" >&5
|
|
||||||
$as_echo "system" >&6; }
|
|
||||||
|
|
||||||
pkg_failed=no
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for qjson" >&5
|
|
||||||
$as_echo_n "checking for qjson... " >&6; }
|
|
||||||
|
|
||||||
if test -n "$qjson_CFLAGS"; then
|
|
||||||
pkg_cv_qjson_CFLAGS="$qjson_CFLAGS"
|
|
||||||
elif test -n "$PKG_CONFIG"; then
|
|
||||||
if test -n "$PKG_CONFIG" && \
|
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QJson >= 0.8.1\""; } >&5
|
|
||||||
($PKG_CONFIG --exists --print-errors "QJson >= 0.8.1") 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; then
|
|
||||||
pkg_cv_qjson_CFLAGS=`$PKG_CONFIG --cflags "QJson >= 0.8.1" 2>/dev/null`
|
|
||||||
test "x$?" != "x0" && pkg_failed=yes
|
|
||||||
else
|
|
||||||
pkg_failed=yes
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
pkg_failed=untried
|
|
||||||
fi
|
|
||||||
if test -n "$qjson_LIBS"; then
|
|
||||||
pkg_cv_qjson_LIBS="$qjson_LIBS"
|
|
||||||
elif test -n "$PKG_CONFIG"; then
|
|
||||||
if test -n "$PKG_CONFIG" && \
|
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QJson >= 0.8.1\""; } >&5
|
|
||||||
($PKG_CONFIG --exists --print-errors "QJson >= 0.8.1") 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; then
|
|
||||||
pkg_cv_qjson_LIBS=`$PKG_CONFIG --libs "QJson >= 0.8.1" 2>/dev/null`
|
|
||||||
test "x$?" != "x0" && pkg_failed=yes
|
|
||||||
else
|
|
||||||
pkg_failed=yes
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
pkg_failed=untried
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if test $pkg_failed = yes; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
||||||
$as_echo "no" >&6; }
|
|
||||||
|
|
||||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
|
||||||
_pkg_short_errors_supported=yes
|
|
||||||
else
|
|
||||||
_pkg_short_errors_supported=no
|
|
||||||
fi
|
|
||||||
if test $_pkg_short_errors_supported = yes; then
|
|
||||||
qjson_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QJson >= 0.8.1" 2>&1`
|
|
||||||
else
|
|
||||||
qjson_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QJson >= 0.8.1" 2>&1`
|
|
||||||
fi
|
|
||||||
# Put the nasty error message in config.log where it belongs
|
|
||||||
echo "$qjson_PKG_ERRORS" >&5
|
|
||||||
|
|
||||||
as_fn_error $? "Package requirements (QJson >= 0.8.1) were not met:
|
|
||||||
|
|
||||||
$qjson_PKG_ERRORS
|
|
||||||
|
|
||||||
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
|
||||||
installed software in a non-standard prefix.
|
|
||||||
|
|
||||||
Alternatively, you may set the environment variables qjson_CFLAGS
|
|
||||||
and qjson_LIBS to avoid the need to call pkg-config.
|
|
||||||
See the pkg-config man page for more details." "$LINENO" 5
|
|
||||||
elif test $pkg_failed = untried; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
||||||
$as_echo "no" >&6; }
|
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
|
||||||
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
|
||||||
as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
|
|
||||||
is in your PATH or set the PKG_CONFIG environment variable to the full
|
|
||||||
path to pkg-config.
|
|
||||||
|
|
||||||
Alternatively, you may set the environment variables qjson_CFLAGS
|
|
||||||
and qjson_LIBS to avoid the need to call pkg-config.
|
|
||||||
See the pkg-config man page for more details.
|
|
||||||
|
|
||||||
To get pkg-config, see <http://pkg-config.freedesktop.org/>.
|
|
||||||
See \`config.log' for more details" "$LINENO" 5; }
|
|
||||||
else
|
|
||||||
qjson_CFLAGS=$pkg_cv_qjson_CFLAGS
|
|
||||||
qjson_LIBS=$pkg_cv_qjson_LIBS
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|
||||||
$as_echo "yes" >&6; }
|
|
||||||
CPPFLAGS="$qjson_CFLAGS $CPPFLAGS"
|
|
||||||
LIBS="$qjson_LIBS $LIBS"
|
|
||||||
fi
|
|
||||||
QBT_ADD_CONFIG="$QBT_ADD_CONFIG usesystemqjson" ;; #(
|
|
||||||
*) :
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_qjson" >&5
|
|
||||||
$as_echo "$with_qjson" >&6; }
|
|
||||||
as_fn_error $? "Unknown option \"$with_qjson\". Use either \"system\" or \"shipped\"." "$LINENO" 5 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
pkg_failed=no
|
pkg_failed=no
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libtorrent" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libtorrent" >&5
|
||||||
@@ -5625,7 +5501,7 @@ extract() {
|
|||||||
new_line='
|
new_line='
|
||||||
'
|
'
|
||||||
# Convert " -" to "\n" if not between quotes and remove possible leading white spaces
|
# Convert " -" to "\n" if not between quotes and remove possible leading white spaces
|
||||||
string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[:space:]*//')
|
string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[:space:]]*//')
|
||||||
SAVEIFS=$IFS
|
SAVEIFS=$IFS
|
||||||
IFS=$(printf "\n\b")
|
IFS=$(printf "\n\b")
|
||||||
for i in $string; do
|
for i in $string; do
|
||||||
@@ -5639,9 +5515,8 @@ extract() {
|
|||||||
IFS=$SAVEIFS
|
IFS=$SAVEIFS
|
||||||
}
|
}
|
||||||
|
|
||||||
extract $CPPFLAGS
|
extract "$CFLAGS $CPPFLAGS $CXXFLAGS"
|
||||||
QBT_ADD_DEFINES="$QBT_ADD_DEFINES $QBT_CONF_DEFINES"
|
QBT_ADD_DEFINES="$QBT_ADD_DEFINES $QBT_CONF_DEFINES"
|
||||||
QBT_CONF_EXTRA_CFLAGS="$QBT_CONF_EXTRA_CFLAGS $CXXFLAGS"
|
|
||||||
|
|
||||||
# Substitute the values of these vars in conf.pri.in
|
# Substitute the values of these vars in conf.pri.in
|
||||||
|
|
||||||
@@ -6223,7 +6098,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by qbittorrent $as_me v3.2.0alpha, which was
|
This file was extended by qbittorrent $as_me v4.0.4, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@@ -6275,13 +6150,13 @@ Configuration commands:
|
|||||||
$config_commands
|
$config_commands
|
||||||
|
|
||||||
Report bugs to <bugs.qbittorrent.org>.
|
Report bugs to <bugs.qbittorrent.org>.
|
||||||
qbittorrent home page: <http://www.qbittorrent.org/>."
|
qbittorrent home page: <https://www.qbittorrent.org/>."
|
||||||
|
|
||||||
_ACEOF
|
_ACEOF
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
qbittorrent config.status v3.2.0alpha
|
qbittorrent config.status v4.0.4
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
@@ -6962,7 +6837,7 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$enable_systemd" = "xyes"; then :
|
if test "x$enable_systemd" = "xyes"; then :
|
||||||
ac_config_files="$ac_config_files dist/unix/systemd/qbittorrent-nox.service"
|
ac_config_files="$ac_config_files dist/unix/systemd/qbittorrent-nox@.service"
|
||||||
|
|
||||||
cat >confcache <<\_ACEOF
|
cat >confcache <<\_ACEOF
|
||||||
# This file is a shell script that caches the results of configure
|
# This file is a shell script that caches the results of configure
|
||||||
@@ -7538,7 +7413,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by qbittorrent $as_me v3.2.0alpha, which was
|
This file was extended by qbittorrent $as_me v4.0.4, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@@ -7590,13 +7465,13 @@ Configuration commands:
|
|||||||
$config_commands
|
$config_commands
|
||||||
|
|
||||||
Report bugs to <bugs.qbittorrent.org>.
|
Report bugs to <bugs.qbittorrent.org>.
|
||||||
qbittorrent home page: <http://www.qbittorrent.org/>."
|
qbittorrent home page: <https://www.qbittorrent.org/>."
|
||||||
|
|
||||||
_ACEOF
|
_ACEOF
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
qbittorrent config.status v3.2.0alpha
|
qbittorrent config.status v4.0.4
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
@@ -7716,7 +7591,7 @@ do
|
|||||||
case $ac_config_target in
|
case $ac_config_target in
|
||||||
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
|
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
|
||||||
"conf.pri") CONFIG_FILES="$CONFIG_FILES conf.pri" ;;
|
"conf.pri") CONFIG_FILES="$CONFIG_FILES conf.pri" ;;
|
||||||
"dist/unix/systemd/qbittorrent-nox.service") CONFIG_FILES="$CONFIG_FILES dist/unix/systemd/qbittorrent-nox.service" ;;
|
"dist/unix/systemd/qbittorrent-nox@.service") CONFIG_FILES="$CONFIG_FILES dist/unix/systemd/qbittorrent-nox@.service" ;;
|
||||||
|
|
||||||
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
||||||
esac
|
esac
|
||||||
@@ -8297,4 +8172,3 @@ else
|
|||||||
as_fn_error $? "Failed running $QT_QMAKE to generate the makefile" "$LINENO" 5
|
as_fn_error $? "Failed running $QT_QMAKE to generate the makefile" "$LINENO" 5
|
||||||
fi
|
fi
|
||||||
$as_echo
|
$as_echo
|
||||||
|
|
||||||
|
|||||||
74
configure.ac
@@ -1,4 +1,4 @@
|
|||||||
AC_INIT([qbittorrent], [v3.2.0alpha], [bugs.qbittorrent.org], [], [http://www.qbittorrent.org/])
|
AC_INIT([qbittorrent], [v4.0.4], [bugs.qbittorrent.org], [], [https://www.qbittorrent.org/])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
@@ -12,24 +12,12 @@ AM_INIT_AUTOMAKE
|
|||||||
|
|
||||||
# Define --wth-* and --enable-* arguments
|
# Define --wth-* and --enable-* arguments
|
||||||
|
|
||||||
AC_ARG_WITH(qt4,
|
|
||||||
[AS_HELP_STRING([--with-qt4],
|
|
||||||
[Compile using Qt4 (default=no)])],
|
|
||||||
[],
|
|
||||||
[with_qt4=no])
|
|
||||||
|
|
||||||
AC_ARG_WITH(qtsingleapplication,
|
AC_ARG_WITH(qtsingleapplication,
|
||||||
[AS_HELP_STRING([--with-qtsingleapplication=@<:@system|shipped@:>@],
|
[AS_HELP_STRING([--with-qtsingleapplication=@<:@system|shipped@:>@],
|
||||||
[Use the shipped qtsingleapplication library or the system one (default=shipped)])],
|
[Use the shipped qtsingleapplication library or the system one (default=shipped)])],
|
||||||
[],
|
[],
|
||||||
[with_qtsingleapplication=shipped])
|
[with_qtsingleapplication=shipped])
|
||||||
|
|
||||||
AC_ARG_WITH(qjson,
|
|
||||||
[AS_HELP_STRING([--with-qjson=@<:@system|shipped@:>@],
|
|
||||||
[Use the shipped qjson library or the system one (default=shipped) (Qt4 only)])],
|
|
||||||
[],
|
|
||||||
[with_qjson=shipped])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(debug,
|
AC_ARG_ENABLE(debug,
|
||||||
[AS_HELP_STRING([--enable-debug],
|
[AS_HELP_STRING([--enable-debug],
|
||||||
[Enable debug build])],
|
[Enable debug build])],
|
||||||
@@ -127,20 +115,13 @@ AS_CASE(["x$enable_webui"],
|
|||||||
[AC_MSG_RESULT([$enable_webui])
|
[AC_MSG_RESULT([$enable_webui])
|
||||||
AC_MSG_ERROR([Unknown option "$enable_webui". Use either "yes" or "no".])])
|
AC_MSG_ERROR([Unknown option "$enable_webui". Use either "yes" or "no".])])
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether Qt4 should be enabled])
|
FIND_QT5()
|
||||||
AS_CASE(["x$with_qt4"],
|
|
||||||
["xno"],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
FIND_QT5()],
|
|
||||||
["xyes"],
|
|
||||||
[AC_MSG_RESULT([yes])
|
|
||||||
FIND_QT4()],
|
|
||||||
[AC_MSG_RESULT([$with_qt4])
|
|
||||||
AC_MSG_ERROR([Unknown option "$with_qt4". Use either "yes" or "no".])])
|
|
||||||
AS_IF([test "x$QT_QMAKE" = "x"],
|
AS_IF([test "x$QT_QMAKE" = "x"],
|
||||||
[AC_MSG_ERROR([Could not find qmake])
|
[AC_MSG_ERROR([Could not find qmake])
|
||||||
])
|
])
|
||||||
|
AS_IF([test "x$enable_gui" = "xyes"],
|
||||||
|
[PKG_CHECK_MODULES(Qt5Svg, [Qt5Svg >= 5.5.1])
|
||||||
|
])
|
||||||
AC_MSG_CHECKING([whether QtDBus should be enabled])
|
AC_MSG_CHECKING([whether QtDBus should be enabled])
|
||||||
AS_CASE(["x$enable_qt_dbus"],
|
AS_CASE(["x$enable_qt_dbus"],
|
||||||
["xyes"],
|
["xyes"],
|
||||||
@@ -157,22 +138,16 @@ AS_CASE(["x$enable_qt_dbus"],
|
|||||||
AC_MSG_ERROR([Unknown option "$enable_qt_dbus". Use either "yes" or "no".])])
|
AC_MSG_ERROR([Unknown option "$enable_qt_dbus". Use either "yes" or "no".])])
|
||||||
|
|
||||||
|
|
||||||
AX_BOOST_BASE([1.35])
|
AX_BOOST_BASE([1.35],
|
||||||
# HAVE_BOOST is set to an empty value when Boost is found. I don't know
|
[AC_MSG_NOTICE([Boost CPPFLAGS: "$BOOST_CPPFLAGS"
|
||||||
# how to test for a set vs unset variable.
|
Boost LDFLAGS: "$BOOST_LDFLAGS"])],
|
||||||
AS_IF([test "x$BOOST_CPPFLAGS" = "x"],
|
[AC_MSG_ERROR([Could not find Boost])])
|
||||||
[AC_MSG_ERROR([Could not find Boost])],
|
|
||||||
[AC_MSG_NOTICE([Boost CPPFLAGS: $BOOST_CPPFLAGS])
|
|
||||||
CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
|
CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
|
||||||
LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"])
|
LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
|
||||||
|
|
||||||
AX_BOOST_SYSTEM()
|
AX_BOOST_SYSTEM()
|
||||||
# HAVE_BOOST_SYSTEM is set to an empty value when Boost.System is found.
|
AC_MSG_NOTICE([Boost.System LIB: "$BOOST_SYSTEM_LIB"])
|
||||||
# I don't know how to test for a set vs unset variable.
|
LIBS="$BOOST_SYSTEM_LIB $LIBS"
|
||||||
AS_IF([test "x$BOOST_SYSTEM_LIB" = "x"],
|
|
||||||
[AC_MSG_ERROR([Could not find Boost.System])],
|
|
||||||
[AC_MSG_NOTICE([Boost.System LIB: $BOOST_SYSTEM_LIB])
|
|
||||||
LIBS="$BOOST_SYSTEM_LIB $LIBS"])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([which qtsingleapplication to use])
|
AC_MSG_CHECKING([which qtsingleapplication to use])
|
||||||
AS_CASE(["x$with_qtsingleapplication"],
|
AS_CASE(["x$with_qtsingleapplication"],
|
||||||
@@ -185,23 +160,6 @@ AS_CASE(["x$with_qtsingleapplication"],
|
|||||||
[AC_MSG_RESULT([$with_qtsingleapplication])
|
[AC_MSG_RESULT([$with_qtsingleapplication])
|
||||||
AC_MSG_ERROR([Unknown option "$with_qtsingleapplication". Use either "system" or "shipped".])])
|
AC_MSG_ERROR([Unknown option "$with_qtsingleapplication". Use either "system" or "shipped".])])
|
||||||
|
|
||||||
AS_IF([test "x$with_qt4" = "xyes"],
|
|
||||||
[AC_MSG_CHECKING([which qjson to use])
|
|
||||||
AS_CASE(["x$with_qjson"],
|
|
||||||
["xshipped"],
|
|
||||||
[AC_MSG_RESULT([shipped])
|
|
||||||
QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG usesystemqjson"],
|
|
||||||
["xsystem"],
|
|
||||||
[AC_MSG_RESULT([system])
|
|
||||||
PKG_CHECK_MODULES(qjson,
|
|
||||||
[QJson >= 0.8.1],
|
|
||||||
[CPPFLAGS="$qjson_CFLAGS $CPPFLAGS"
|
|
||||||
LIBS="$qjson_LIBS $LIBS"])
|
|
||||||
QBT_ADD_CONFIG="$QBT_ADD_CONFIG usesystemqjson"],
|
|
||||||
[AC_MSG_RESULT([$with_qjson])
|
|
||||||
AC_MSG_ERROR([Unknown option "$with_qjson". Use either "system" or "shipped".])])
|
|
||||||
])
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(libtorrent,
|
PKG_CHECK_MODULES(libtorrent,
|
||||||
[libtorrent-rasterbar >= 1.0.6],
|
[libtorrent-rasterbar >= 1.0.6],
|
||||||
[CPPFLAGS="$libtorrent_CFLAGS $CPPFLAGS"
|
[CPPFLAGS="$libtorrent_CFLAGS $CPPFLAGS"
|
||||||
@@ -232,7 +190,7 @@ extract() {
|
|||||||
new_line='
|
new_line='
|
||||||
'
|
'
|
||||||
# Convert " -" to "\n" if not between quotes and remove possible leading white spaces
|
# Convert " -" to "\n" if not between quotes and remove possible leading white spaces
|
||||||
string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[:space:]]*//')
|
string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[[:space:]]]*//')
|
||||||
SAVEIFS=$IFS
|
SAVEIFS=$IFS
|
||||||
IFS=$(printf "\n\b")
|
IFS=$(printf "\n\b")
|
||||||
for i in $string; do
|
for i in $string; do
|
||||||
@@ -246,9 +204,8 @@ extract() {
|
|||||||
IFS=$SAVEIFS
|
IFS=$SAVEIFS
|
||||||
}
|
}
|
||||||
|
|
||||||
extract $CPPFLAGS
|
extract "$CFLAGS $CPPFLAGS $CXXFLAGS"
|
||||||
QBT_ADD_DEFINES="$QBT_ADD_DEFINES $QBT_CONF_DEFINES"
|
QBT_ADD_DEFINES="$QBT_ADD_DEFINES $QBT_CONF_DEFINES"
|
||||||
QBT_CONF_EXTRA_CFLAGS="$QBT_CONF_EXTRA_CFLAGS $CXXFLAGS"
|
|
||||||
|
|
||||||
# Substitute the values of these vars in conf.pri.in
|
# Substitute the values of these vars in conf.pri.in
|
||||||
AC_SUBST(QBT_CONF_INCLUDES)
|
AC_SUBST(QBT_CONF_INCLUDES)
|
||||||
@@ -260,7 +217,7 @@ AC_SUBST(QBT_REMOVE_DEFINES)
|
|||||||
|
|
||||||
AC_OUTPUT(conf.pri)
|
AC_OUTPUT(conf.pri)
|
||||||
AS_IF([test "x$enable_systemd" = "xyes"],
|
AS_IF([test "x$enable_systemd" = "xyes"],
|
||||||
[AC_OUTPUT(dist/unix/systemd/qbittorrent-nox.service)])
|
[AC_OUTPUT(dist/unix/systemd/qbittorrent-nox@.service)])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -276,4 +233,3 @@ AS_IF([test "x$ret" = "x0"],
|
|||||||
[AC_MSG_NOTICE([Good, your configure finished.])],
|
[AC_MSG_NOTICE([Good, your configure finished.])],
|
||||||
[AC_MSG_ERROR([Failed running $QT_QMAKE to generate the makefile])])
|
[AC_MSG_ERROR([Failed running $QT_QMAKE to generate the makefile])])
|
||||||
AS_ECHO()
|
AS_ECHO()
|
||||||
|
|
||||||
|
|||||||
4
dist/mac/Info.plist
vendored
@@ -45,7 +45,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>3.3.13</string>
|
<string>4.0.4</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>qBit</string>
|
<string>qBit</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
<key>NSAppleScriptEnabled</key>
|
<key>NSAppleScriptEnabled</key>
|
||||||
<string>YES</string>
|
<string>YES</string>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>Copyright © 2006-2017 The qBittorrent project</string>
|
<string>Copyright © 2006-2018 The qBittorrent project</string>
|
||||||
<key>UTExportedTypeDeclarations</key>
|
<key>UTExportedTypeDeclarations</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
|
|||||||
3
dist/mac/bundle.cmake
vendored
@@ -1,3 +0,0 @@
|
|||||||
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
|
||||||
include(BundleUtilities)
|
|
||||||
fixup_bundle("$ENV{DESTDIR}/${CMAKE_INSTALL_PREFIX}/qbittorrent.app" "" "")
|
|
||||||
BIN
dist/mac/qBitTorrentDocument.icns
vendored
BIN
dist/mac/qbittorrent_mac.icns
vendored
15
dist/unix/CMakeLists.txt
vendored
@@ -2,8 +2,8 @@ if (SYSTEMD)
|
|||||||
find_package(Systemd)
|
find_package(Systemd)
|
||||||
if (SYSTEMD_FOUND)
|
if (SYSTEMD_FOUND)
|
||||||
set(EXPAND_BINDIR ${CMAKE_INSTALL_FULL_BINDIR})
|
set(EXPAND_BINDIR ${CMAKE_INSTALL_FULL_BINDIR})
|
||||||
configure_file(systemd/qbittorrent-nox.service.in ${CMAKE_CURRENT_BINARY_DIR}/qbittorrent-nox.service @ONLY)
|
configure_file(systemd/qbittorrent-nox@.service.in ${CMAKE_CURRENT_BINARY_DIR}/qbittorrent-nox@.service @ONLY)
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qbittorrent-nox.service
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qbittorrent-nox@.service
|
||||||
DESTINATION ${SYSTEMD_SERVICES_INSTALL_DIR}
|
DESTINATION ${SYSTEMD_SERVICES_INSTALL_DIR}
|
||||||
COMPONENT data)
|
COMPONENT data)
|
||||||
endif(SYSTEMD_FOUND)
|
endif(SYSTEMD_FOUND)
|
||||||
@@ -25,10 +25,6 @@ if (GUI)
|
|||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor
|
||||||
FILES_MATCHING PATTERN "*.png")
|
FILES_MATCHING PATTERN "*.png")
|
||||||
|
|
||||||
install(FILES ${qBittorrent_SOURCE_DIR}/src/icons/qbittorrent.png
|
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps/
|
|
||||||
COMPONENT data)
|
|
||||||
|
|
||||||
install(FILES ${qBittorrent_SOURCE_DIR}/src/icons/qbittorrent.desktop
|
install(FILES ${qBittorrent_SOURCE_DIR}/src/icons/qbittorrent.desktop
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications/
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications/
|
||||||
COMPONENT data)
|
COMPONENT data)
|
||||||
@@ -36,4 +32,11 @@ if (GUI)
|
|||||||
install(FILES qbittorrent.appdata.xml
|
install(FILES qbittorrent.appdata.xml
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/appdata/
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/appdata/
|
||||||
COMPONENT data)
|
COMPONENT data)
|
||||||
|
|
||||||
|
install(FILES
|
||||||
|
${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray.svg
|
||||||
|
${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray-dark.svg
|
||||||
|
${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray-light.svg
|
||||||
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status
|
||||||
|
COMPONENT data)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
BIN
dist/unix/menuicons/128x128/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 7.6 KiB |
BIN
dist/unix/menuicons/16x16/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 893 B After Width: | Height: | Size: 986 B |
|
Before Width: | Height: | Size: 893 B After Width: | Height: | Size: 986 B |
BIN
dist/unix/menuicons/192x192/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 11 KiB |
BIN
dist/unix/menuicons/22x22/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
dist/unix/menuicons/24x24/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.2 KiB |
BIN
dist/unix/menuicons/32x32/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.7 KiB |
BIN
dist/unix/menuicons/36x36/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.0 KiB |
BIN
dist/unix/menuicons/48x48/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.9 KiB |
BIN
dist/unix/menuicons/64x64/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 3.8 KiB |
BIN
dist/unix/menuicons/72x72/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 4.2 KiB |
BIN
dist/unix/menuicons/96x96/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 5.6 KiB |
4
dist/unix/qbittorrent.appdata.xml
vendored
@@ -11,7 +11,7 @@
|
|||||||
Aiming to be a good alternative to all other bittorrent clients out
|
Aiming to be a good alternative to all other bittorrent clients out
|
||||||
there, qBittorrent is fast, stable and provides unicode support as well
|
there, qBittorrent is fast, stable and provides unicode support as well
|
||||||
as many other features. Additionally, qBittorrent runs and provides those
|
as many other features. Additionally, qBittorrent runs and provides those
|
||||||
same features on all major platforms (Linux, Mac OS X, Windows, OS/2, FreeBSD).
|
same features on all major platforms (Linux, Mac OS X, Windows, FreeBSD).
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
It is programmed in C++ / Qt and uses libtorrent (sometimes called
|
It is programmed in C++ / Qt and uses libtorrent (sometimes called
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
</image>
|
</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
<url type="homepage">http://www.qbittorrent.org/</url>
|
<url type="homepage">https://www.qbittorrent.org/</url>
|
||||||
<update_contact>sledgehammer999@qbittorrent.org</update_contact>
|
<update_contact>sledgehammer999@qbittorrent.org</update_contact>
|
||||||
<developer_name>The qBittorrent Project</developer_name>
|
<developer_name>The qBittorrent Project</developer_name>
|
||||||
<url type="bugtracker">http://bugs.qbittorrent.org/</url>
|
<url type="bugtracker">http://bugs.qbittorrent.org/</url>
|
||||||
|
|||||||
11
dist/unix/systemd/qbittorrent-nox.service.in
vendored
@@ -1,11 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=qBittorrent Daemon Service
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=forking
|
|
||||||
User=1000
|
|
||||||
ExecStart=@EXPAND_BINDIR@/qbittorrent-nox -d
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
14
dist/unix/systemd/qbittorrent-nox@.service.in
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=qBittorrenti-nox service for user %I
|
||||||
|
|
||||||
|
Documentation=man:qbittorrent-nox(1)
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
PrivateTmp=false
|
||||||
|
User=%i
|
||||||
|
ExecStart=@EXPAND_BINDIR@/qbittorrent-nox
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -17,13 +17,13 @@ LangString inst_firewallinfo ${LANG_ARABIC} "جاري اضافة القاعدة
|
|||||||
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
||||||
LangString inst_warning ${LANG_ARABIC} "البرنامج يعمل. يرجى اغلاقه قبل البدء في التنصيب"
|
LangString inst_warning ${LANG_ARABIC} "البرنامج يعمل. يرجى اغلاقه قبل البدء في التنصيب"
|
||||||
;LangString inst_uninstall_question ${LANG_ENGLISH} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
;LangString inst_uninstall_question ${LANG_ENGLISH} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
||||||
LangString inst_uninstall_question ${LANG_ARABIC} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
LangString inst_uninstall_question ${LANG_ARABIC} "يوجد نسخة سابقة من البرنامج. سيتم إزالتها دون حذف إعدادات المستخدم"
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_ARABIC} "جاري ازالة النسخة السابقة من البرنامج"
|
LangString inst_unist ${LANG_ARABIC} "جاري ازالة النسخة السابقة من البرنامج"
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_ARABIC} "تشغيل البرنامج"
|
LangString launch_qbt ${LANG_ARABIC} "تشغيل البرنامج"
|
||||||
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
||||||
LangString inst_requires_64bit ${LANG_ARABIC} "This installer works only in 64-bit Windows versions."
|
LangString inst_requires_64bit ${LANG_ARABIC} "هذا المثبت يعمل فقط في نسخ ويندوز 64 بت"
|
||||||
|
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
|
|||||||
46
dist/windows/installer-translations/danish.nsi
vendored
@@ -1,53 +1,53 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_DANISH} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_DANISH} "qBittorrent (påkrævet)"
|
||||||
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
||||||
LangString inst_dekstop ${LANG_DANISH} "Create Desktop Shortcut"
|
LangString inst_dekstop ${LANG_DANISH} "Opret skrivebordsgenvej"
|
||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_DANISH} "Create Start Menu Shortcut"
|
LangString inst_startmenu ${LANG_DANISH} "Opret genvej i menuen Start"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_DANISH} "Open .torrent files with qBittorrent"
|
LangString inst_torrent ${LANG_DANISH} "Åbn .torrent-filer med qBittorrent"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
LangString inst_magnet ${LANG_DANISH} "Open magnet links with qBittorrent"
|
LangString inst_magnet ${LANG_DANISH} "Åbn magnet-links med qBittorrent"
|
||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_DANISH} "Add Windows Firewall rule"
|
LangString inst_firewall ${LANG_DANISH} "Tilføj Windows Firewall-regel"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_DANISH} "Adding Windows Firewall rule"
|
LangString inst_firewallinfo ${LANG_DANISH} "Tilføjer Windows Firewall-regel"
|
||||||
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
||||||
LangString inst_warning ${LANG_DANISH} "qBittorrent is running. Please close the application before installing."
|
LangString inst_warning ${LANG_DANISH} "qBittorrent kører. Luk venligst programmet inden installation."
|
||||||
;LangString inst_uninstall_question ${LANG_ENGLISH} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
;LangString inst_uninstall_question ${LANG_ENGLISH} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
||||||
LangString inst_uninstall_question ${LANG_DANISH} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
LangString inst_uninstall_question ${LANG_DANISH} "En tidligere installation blev registreret. Den vil blive afinstalleret uden at brugerindstillingerne slettes."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_DANISH} "Uninstalling previous version."
|
LangString inst_unist ${LANG_DANISH} "Afinstallerer tidligere version."
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_DANISH} "Launch qBittorrent."
|
LangString launch_qbt ${LANG_DANISH} "Start qBittorrent."
|
||||||
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
||||||
LangString inst_requires_64bit ${LANG_DANISH} "This installer works only in 64-bit Windows versions."
|
LangString inst_requires_64bit ${LANG_DANISH} "Dette installationsprogram virker kun i 64-bit Windows versioner."
|
||||||
|
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
;Uninstaller strings
|
;Uninstaller strings
|
||||||
|
|
||||||
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
||||||
LangString remove_files ${LANG_DANISH} "Remove files"
|
LangString remove_files ${LANG_DANISH} "Fjern filer"
|
||||||
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
||||||
LangString remove_shortcuts ${LANG_DANISH} "Remove shortcuts"
|
LangString remove_shortcuts ${LANG_DANISH} "Fjern genveje"
|
||||||
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
||||||
LangString remove_associations ${LANG_DANISH} "Remove file associations"
|
LangString remove_associations ${LANG_DANISH} "Fjern filtilknytninger"
|
||||||
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
||||||
LangString remove_registry ${LANG_DANISH} "Remove registry keys"
|
LangString remove_registry ${LANG_DANISH} "Fjern registreringsnøgler"
|
||||||
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
||||||
LangString remove_conf ${LANG_DANISH} "Remove configuration files"
|
LangString remove_conf ${LANG_DANISH} "Fjern konfigurationsfiler"
|
||||||
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
||||||
LangString remove_firewall ${LANG_DANISH} "Remove Windows Firewall rule"
|
LangString remove_firewall ${LANG_DANISH} "Fjern Windows Firewall-regel"
|
||||||
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
||||||
LangString remove_firewallinfo ${LANG_DANISH} "Removing Windows Firewall rule"
|
LangString remove_firewallinfo ${LANG_DANISH} "Fjerner Windows Firewall-regel"
|
||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_DANISH} "Remove torrents and cached data"
|
LangString remove_cache ${LANG_DANISH} "Fjern torrents og mellemlagret data"
|
||||||
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
||||||
LangString uninst_warning ${LANG_DANISH} "qBittorrent is running. Please close the application before uninstalling."
|
LangString uninst_warning ${LANG_DANISH} "qBittorrent kører. Luk venligst programmet inden afinstallation."
|
||||||
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
||||||
LangString uninst_tor_warn ${LANG_DANISH} "Not removing .torrent association. It is associated with:"
|
LangString uninst_tor_warn ${LANG_DANISH} "Fjerner ikke .torrent-tilknytning. Det er tilknyttet:"
|
||||||
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
||||||
LangString uninst_mag_warn ${LANG_DANISH} "Not removing magnet association. It is associated with:"
|
LangString uninst_mag_warn ${LANG_DANISH} "Fjerner ikke magnet-tilknytning. Det er tilknyttet:"
|
||||||
|
|||||||
46
dist/windows/installer-translations/greek.nsi
vendored
@@ -1,53 +1,53 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_GREEK} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_GREEK} "qBittorrent (απαιτείται)"
|
||||||
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
||||||
LangString inst_dekstop ${LANG_GREEK} "Create Desktop Shortcut"
|
LangString inst_dekstop ${LANG_GREEK} "Δημιουργία συντόμευσης στην Επιφάνεια Εργασίας"
|
||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_GREEK} "Create Start Menu Shortcut"
|
LangString inst_startmenu ${LANG_GREEK} "Δημιουργία συντόμευσης στο Μενού Έναρξης"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_GREEK} "Open .torrent files with qBittorrent"
|
LangString inst_torrent ${LANG_GREEK} "Άνοιγμα των αρχείων .torrent με το qBittorrent"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
LangString inst_magnet ${LANG_GREEK} "Open magnet links with qBittorrent"
|
LangString inst_magnet ${LANG_GREEK} "Άνοιγμα των μαγνητικών συνδέσμων με το qBittorrent"
|
||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_GREEK} "Add Windows Firewall rule"
|
LangString inst_firewall ${LANG_GREEK} "Προσθήκη κανόνα εξαίρεσης στο Τείχος Προστασίας των Windows"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_GREEK} "Adding Windows Firewall rule"
|
LangString inst_firewallinfo ${LANG_GREEK} "Προστίθεται κανόνας εξαίρεσης στο Τείχος Προστασίας των Windows"
|
||||||
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
||||||
LangString inst_warning ${LANG_GREEK} "qBittorrent is running. Please close the application before installing."
|
LangString inst_warning ${LANG_GREEK} "Το qBittorrent βρίσκεται σε εκτέλεση. Παρακαλούμε κλείστε την εφαρμογή πριν την εγκατάσταση."
|
||||||
;LangString inst_uninstall_question ${LANG_ENGLISH} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
;LangString inst_uninstall_question ${LANG_ENGLISH} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
||||||
LangString inst_uninstall_question ${LANG_GREEK} "A previous installation was detected. It will be uninstalled without deleting user settings."
|
LangString inst_uninstall_question ${LANG_GREEK} "Ανιχνεύθηκε προηγούμενη εγκατάσταση. Θα απεγκατασταθεί χωρίς να διαγραφούν οι ρυθμίσεις του χρήστη."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_GREEK} "Uninstalling previous version."
|
LangString inst_unist ${LANG_GREEK} "Γίνεται απεγκατάσταση της προηγούμενης έκδοσης."
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_GREEK} "Launch qBittorrent."
|
LangString launch_qbt ${LANG_GREEK} "Εκκίνηση του qBittorrent."
|
||||||
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
||||||
LangString inst_requires_64bit ${LANG_GREEK} "This installer works only in 64-bit Windows versions."
|
LangString inst_requires_64bit ${LANG_GREEK} "Αυτό το αρχείο εγκατάστασης λειτουργεί μόνο σε 64-bit εκδόσεις των Windows."
|
||||||
|
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
;Uninstaller strings
|
;Uninstaller strings
|
||||||
|
|
||||||
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
||||||
LangString remove_files ${LANG_GREEK} "Remove files"
|
LangString remove_files ${LANG_GREEK} "Να διαγραφούν τα αρχεία"
|
||||||
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
||||||
LangString remove_shortcuts ${LANG_GREEK} "Remove shortcuts"
|
LangString remove_shortcuts ${LANG_GREEK} "Να διαγραφούν οι συντομεύσεις"
|
||||||
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
||||||
LangString remove_associations ${LANG_GREEK} "Remove file associations"
|
LangString remove_associations ${LANG_GREEK} "Να καταργηθούν οι συσχετίσεις αρχείων"
|
||||||
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
||||||
LangString remove_registry ${LANG_GREEK} "Remove registry keys"
|
LangString remove_registry ${LANG_GREEK} "Να διαγραφούν τα κλειδιά μητρώου"
|
||||||
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
||||||
LangString remove_conf ${LANG_GREEK} "Remove configuration files"
|
LangString remove_conf ${LANG_GREEK} "Να διαγραφούν τα αρχεία ρυθμίσεων"
|
||||||
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
||||||
LangString remove_firewall ${LANG_GREEK} "Remove Windows Firewall rule"
|
LangString remove_firewall ${LANG_GREEK} "Να διαγραφεί ο κανόνας εξαίρεσης στο Τείχος Προστασίας των Windows"
|
||||||
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
||||||
LangString remove_firewallinfo ${LANG_GREEK} "Removing Windows Firewall rule"
|
LangString remove_firewallinfo ${LANG_GREEK} "Γίνεται διαγραφή του κανόνα εξαίρεσης στο Τείχος Προστασίας των Windows"
|
||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_GREEK} "Remove torrents and cached data"
|
LangString remove_cache ${LANG_GREEK} "Να διαγραφούν τα torrents και τα δεδομένα προσωρινής αποθήκευσης"
|
||||||
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
||||||
LangString uninst_warning ${LANG_GREEK} "qBittorrent is running. Please close the application before uninstalling."
|
LangString uninst_warning ${LANG_GREEK} "Το qBittorrent βρίσκεται σε εκτέλεση. Παρακαλούμε κλείστε την εφαρμογή πριν την απεγκατάσταση."
|
||||||
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
||||||
LangString uninst_tor_warn ${LANG_GREEK} "Not removing .torrent association. It is associated with:"
|
LangString uninst_tor_warn ${LANG_GREEK} "Δεν θα καταργηθεί η συσχέτιση με τα αρχεία .torrent. Είναι συσχετισμένα με το:"
|
||||||
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
||||||
LangString uninst_mag_warn ${LANG_GREEK} "Not removing magnet association. It is associated with:"
|
LangString uninst_mag_warn ${LANG_GREEK} "Δεν θα καταργηθεί η συσχέτιση με τους μαγνητικούς συνδέσμους. Είναι συσχετισμένοι με το:"
|
||||||
|
|||||||
12
dist/windows/installer-translations/russian.nsi
vendored
@@ -7,9 +7,9 @@ LangString inst_dekstop ${LANG_RUSSIAN} "Создать ярлык на рабо
|
|||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_RUSSIAN} "Создать ярлык в меню Пуск"
|
LangString inst_startmenu ${LANG_RUSSIAN} "Создать ярлык в меню Пуск"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_RUSSIAN} "Открывать торрент файлы с помощью qBittorrent"
|
LangString inst_torrent ${LANG_RUSSIAN} "Открывать торрент-файлы с помощью qBittorrent"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
LangString inst_magnet ${LANG_RUSSIAN} "Открывать magnet ссылки с помощью qBittorrent"
|
LangString inst_magnet ${LANG_RUSSIAN} "Открывать magnet-ссылки с помощью qBittorrent"
|
||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_RUSSIAN} "Добавить в список исключений брандмауера"
|
LangString inst_firewall ${LANG_RUSSIAN} "Добавить в список исключений брандмауера"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
@@ -23,7 +23,7 @@ LangString inst_unist ${LANG_RUSSIAN} "Деинсталлируем старую
|
|||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_RUSSIAN} "Запустить qBittorrent."
|
LangString launch_qbt ${LANG_RUSSIAN} "Запустить qBittorrent."
|
||||||
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
||||||
LangString inst_requires_64bit ${LANG_RUSSIAN} "This installer works only in 64-bit Windows versions."
|
LangString inst_requires_64bit ${LANG_RUSSIAN} "Этот установщик работает только на 64-битных версиях Windows."
|
||||||
|
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
@@ -44,10 +44,10 @@ LangString remove_firewall ${LANG_RUSSIAN} "Удалить из списка и
|
|||||||
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
||||||
LangString remove_firewallinfo ${LANG_RUSSIAN} "Удаление из списка исключений брандмауера"
|
LangString remove_firewallinfo ${LANG_RUSSIAN} "Удаление из списка исключений брандмауера"
|
||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_RUSSIAN} "Удалить сохраненные торрент файлы"
|
LangString remove_cache ${LANG_RUSSIAN} "Удалить сохранённые торрент-файлы"
|
||||||
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
||||||
LangString uninst_warning ${LANG_RUSSIAN} "qBittorrent запущен. Пожалуйста, закройте qBittorrent и перезапустите программу удаления."
|
LangString uninst_warning ${LANG_RUSSIAN} "qBittorrent запущен. Пожалуйста, закройте qBittorrent и перезапустите программу удаления."
|
||||||
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
||||||
LangString uninst_tor_warn ${LANG_RUSSIAN} "Ассоциации торрент файлов не сброшены. Уже ассоциированы с:"
|
LangString uninst_tor_warn ${LANG_RUSSIAN} "Ассоциации торрент-файлов не сброшены. Уже ассоциированы с:"
|
||||||
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
||||||
LangString uninst_mag_warn ${LANG_RUSSIAN} "Ассоциации magnet ссылок не сброшены. Уже ассоциированы с:"
|
LangString uninst_mag_warn ${LANG_RUSSIAN} "Ассоциации magnet-ссылок не сброшены. Уже ассоциированы с:"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ LangString inst_unist ${LANG_TURKISH} "Önceki sürüm kaldırılıyor."
|
|||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_TURKISH} "qBittorrent'i çalıştır."
|
LangString launch_qbt ${LANG_TURKISH} "qBittorrent'i çalıştır."
|
||||||
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
||||||
LangString inst_requires_64bit ${LANG_TURKISH} "This installer works only in 64-bit Windows versions."
|
LangString inst_requires_64bit ${LANG_TURKISH} "Bu yükleyici sadece 64-bit Windows sürümlerinde çalışır."
|
||||||
|
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
|
|||||||
2
dist/windows/installer.nsi
vendored
@@ -86,7 +86,7 @@ Section $(inst_qbt_req) ;"qBittorrent (required)"
|
|||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "UninstallString" '"$INSTDIR\uninst.exe"'
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "UninstallString" '"$INSTDIR\uninst.exe"'
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayIcon" '"$INSTDIR\qbittorrent.exe",0'
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayIcon" '"$INSTDIR\qbittorrent.exe",0'
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "Publisher" "The qBittorrent project"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "Publisher" "The qBittorrent project"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "URLInfoAbout" "http://www.qbittorrent.org"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "URLInfoAbout" "https://www.qbittorrent.org"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayVersion" "${PROG_VERSION}"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayVersion" "${PROG_VERSION}"
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "NoModify" 1
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "NoModify" 1
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "NoRepair" 1
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "NoRepair" 1
|
||||||
|
|||||||
BIN
dist/windows/nsis plugins/FindProcDLL_mod_by_hnedka.7z
vendored
Normal file
4
dist/windows/options.nsi
vendored
@@ -27,7 +27,7 @@ XPStyle on
|
|||||||
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
|
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
|
||||||
|
|
||||||
; Program specific
|
; Program specific
|
||||||
!define PROG_VERSION "3.3.13"
|
!define PROG_VERSION "4.0.4"
|
||||||
|
|
||||||
!define MUI_FINISHPAGE_RUN
|
!define MUI_FINISHPAGE_RUN
|
||||||
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
||||||
@@ -50,7 +50,7 @@ XPStyle on
|
|||||||
;Installer Version Information
|
;Installer Version Information
|
||||||
VIAddVersionKey "ProductName" "qBittorrent"
|
VIAddVersionKey "ProductName" "qBittorrent"
|
||||||
VIAddVersionKey "CompanyName" "The qBittorrent project"
|
VIAddVersionKey "CompanyName" "The qBittorrent project"
|
||||||
VIAddVersionKey "LegalCopyright" "Copyright ©2006-2017 The qBittorrent project"
|
VIAddVersionKey "LegalCopyright" "Copyright ©2006-2018 The qBittorrent project"
|
||||||
VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client"
|
VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client"
|
||||||
VIAddVersionKey "FileVersion" "${PROG_VERSION}"
|
VIAddVersionKey "FileVersion" "${PROG_VERSION}"
|
||||||
|
|
||||||
|
|||||||
2
dist/windows/qt.conf
vendored
@@ -2,4 +2,4 @@
|
|||||||
Translations = translations
|
Translations = translations
|
||||||
|
|
||||||
[Platforms]
|
[Platforms]
|
||||||
WindowsArguments = dpiawareness=0
|
;WindowsArguments = dpiawareness=1
|
||||||
|
|||||||
187
install.os2
@@ -1,187 +0,0 @@
|
|||||||
QBittorrent installation
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
0. CONTENTS OF THIS FILE
|
|
||||||
========================
|
|
||||||
|
|
||||||
1. INTRODUCTION
|
|
||||||
|
|
||||||
2. REQUIREMENTS
|
|
||||||
|
|
||||||
3. INSTALLATION
|
|
||||||
|
|
||||||
4. BUGREPORTS
|
|
||||||
|
|
||||||
5. CREDITS
|
|
||||||
|
|
||||||
6. SUPPORT AND DONATIONS
|
|
||||||
|
|
||||||
7. HISTORY
|
|
||||||
|
|
||||||
|
|
||||||
1. INTRODUCTION
|
|
||||||
===============
|
|
||||||
|
|
||||||
Welcome to QBittorrent port for OS/2 and eComStation.
|
|
||||||
|
|
||||||
|
|
||||||
2. REQUIREMENTS
|
|
||||||
===============
|
|
||||||
|
|
||||||
The following requirements can be installed either by rpm or by zip files.
|
|
||||||
|
|
||||||
RPM Installation:
|
|
||||||
|
|
||||||
klibc
|
|
||||||
-----
|
|
||||||
|
|
||||||
1. yum install libc
|
|
||||||
|
|
||||||
openssl 1.0
|
|
||||||
-----------
|
|
||||||
|
|
||||||
1. yum install openssl
|
|
||||||
|
|
||||||
pthread
|
|
||||||
-------
|
|
||||||
|
|
||||||
1. yum install pthread
|
|
||||||
|
|
||||||
GCC4Core
|
|
||||||
--------
|
|
||||||
|
|
||||||
1. yum install libgcc
|
|
||||||
2. yum install gcc-stack-protector
|
|
||||||
3. yum install gcc-stdc++-shared-library
|
|
||||||
4. yum install gcc-supc++-shared-library
|
|
||||||
|
|
||||||
Qt4 dll
|
|
||||||
-------
|
|
||||||
|
|
||||||
1. yum install libqt4
|
|
||||||
|
|
||||||
|
|
||||||
ZIP Installation:
|
|
||||||
|
|
||||||
klibc
|
|
||||||
-----
|
|
||||||
|
|
||||||
1. Download klibc 0.6.5 or better (see http://svn.netlabs.org/libc for more information)
|
|
||||||
2. Install the files to your libpath eg x:\ecs\dll
|
|
||||||
|
|
||||||
openssl 1.0
|
|
||||||
-----------
|
|
||||||
|
|
||||||
1. Download the zip file from http://rpm.netlabs.org/release/00/zip
|
|
||||||
2. Install the files to your libpath eg. x:\ecs\dll
|
|
||||||
|
|
||||||
pthread
|
|
||||||
-------
|
|
||||||
|
|
||||||
1. Download pthread 2012-03-13 or better from http://rpm.netlabs.org/release/00/zip
|
|
||||||
2. Install the files to your libpath eg. x:\ecs\dll
|
|
||||||
|
|
||||||
GCC4Core
|
|
||||||
--------
|
|
||||||
|
|
||||||
1. Download GCC4Core 1.2.1 or better from http://ftp.netlabs.org/pub/gcc
|
|
||||||
2. Install the files to your libpath eg. x:\ecs\dll
|
|
||||||
|
|
||||||
Qt4 dll
|
|
||||||
-------
|
|
||||||
|
|
||||||
1. Download Qt4 4.7.3 or better (see http://svn.netlabs.org/qt4 for more information)
|
|
||||||
2. Install the files according to the readme
|
|
||||||
|
|
||||||
|
|
||||||
3. INSTALLATION
|
|
||||||
===============
|
|
||||||
|
|
||||||
To install QBittorrent, do the following:
|
|
||||||
|
|
||||||
1. Create a directory for QBittorrent.
|
|
||||||
2. Extract the QBittorrent package to the new directory.
|
|
||||||
3. Create a WPS object for QBittorrent.exe.
|
|
||||||
4. Start QBittorrent
|
|
||||||
5. Happy torrenting
|
|
||||||
|
|
||||||
|
|
||||||
4. BUGREPORTS
|
|
||||||
=============
|
|
||||||
|
|
||||||
Please create bugreports at http://svn.netlabs.org/qtapps
|
|
||||||
Only bug reports with a reproducible bug are accepted. :-)
|
|
||||||
|
|
||||||
|
|
||||||
5. CREDITS
|
|
||||||
==========
|
|
||||||
|
|
||||||
The port was done by:
|
|
||||||
|
|
||||||
Silvan Scherrer aka _diver
|
|
||||||
|
|
||||||
Thanks go to:
|
|
||||||
|
|
||||||
* Dmitry A. Kuminov
|
|
||||||
|
|
||||||
They either helped me when I had some nasty questions or did some testing for
|
|
||||||
me.
|
|
||||||
|
|
||||||
|
|
||||||
6. SUPPORT AND DONATIONS
|
|
||||||
========================
|
|
||||||
|
|
||||||
QBittorrent port is based on volunteer work. If you would like to support further
|
|
||||||
development, you can do so in one of the following ways:
|
|
||||||
|
|
||||||
|
|
||||||
* Donate to the Qt4 project: see qt.netlabs.org for more information
|
|
||||||
|
|
||||||
* Contribute to the project: Besides actual development, this also includes
|
|
||||||
maintaining the documentation and the project web site as well as help
|
|
||||||
for users.
|
|
||||||
|
|
||||||
|
|
||||||
7. HISTORY
|
|
||||||
==========
|
|
||||||
|
|
||||||
2012-09-19
|
|
||||||
|
|
||||||
* updated to 3.0.4 code level of QBittorrent
|
|
||||||
* updated libtorrent to 0.16.3 level
|
|
||||||
|
|
||||||
2012-09-06
|
|
||||||
|
|
||||||
* updated to 3.0.2 code level of QBittorrent
|
|
||||||
|
|
||||||
2012-05-14
|
|
||||||
|
|
||||||
* updated to 2.9.8 code level of QBittorrent
|
|
||||||
|
|
||||||
2012-03-15
|
|
||||||
|
|
||||||
* updated to 2.9.5 code level of QBittorrent
|
|
||||||
|
|
||||||
2011-09-26
|
|
||||||
|
|
||||||
* updated to 2.8.5 code level of QBittorrent
|
|
||||||
* updated to Qt 4.7.3
|
|
||||||
|
|
||||||
2011-06-20
|
|
||||||
|
|
||||||
* updated to 2.7.3 code level of QBittorrent
|
|
||||||
* updated libtorrent to 0.15.6 level
|
|
||||||
|
|
||||||
2010-12-23
|
|
||||||
|
|
||||||
* updated to 2.5.2 code level of QBittorrent
|
|
||||||
|
|
||||||
2010-11-22
|
|
||||||
|
|
||||||
* updated to 2.4.11 code level of QBittorrent
|
|
||||||
|
|
||||||
2010-xx-xx
|
|
||||||
|
|
||||||
* initial port
|
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_boost_base.html
|
# https://www.gnu.org/software/autoconf-archive/ax_boost_base.html
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
#
|
#
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
@@ -33,7 +33,15 @@
|
|||||||
# and this notice are preserved. This file is offered as-is, without any
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
# warranty.
|
# warranty.
|
||||||
|
|
||||||
#serial 26
|
#serial 42
|
||||||
|
|
||||||
|
# example boost program (need to pass version)
|
||||||
|
m4_define([_AX_BOOST_BASE_PROGRAM],
|
||||||
|
[AC_LANG_PROGRAM([[
|
||||||
|
#include <boost/version.hpp>
|
||||||
|
]],[[
|
||||||
|
(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))]));
|
||||||
|
]])])
|
||||||
|
|
||||||
AC_DEFUN([AX_BOOST_BASE],
|
AC_DEFUN([AX_BOOST_BASE],
|
||||||
[
|
[
|
||||||
@@ -44,104 +52,121 @@ AC_ARG_WITH([boost],
|
|||||||
or disable it (ARG=no)
|
or disable it (ARG=no)
|
||||||
@<:@ARG=yes@:>@ ])],
|
@<:@ARG=yes@:>@ ])],
|
||||||
[
|
[
|
||||||
if test "$withval" = "no"; then
|
AS_CASE([$withval],
|
||||||
want_boost="no"
|
[no],[want_boost="no";_AX_BOOST_BASE_boost_path=""],
|
||||||
elif test "$withval" = "yes"; then
|
[yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""],
|
||||||
want_boost="yes"
|
[want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"])
|
||||||
ac_boost_path=""
|
|
||||||
else
|
|
||||||
want_boost="yes"
|
|
||||||
ac_boost_path="$withval"
|
|
||||||
fi
|
|
||||||
],
|
],
|
||||||
[want_boost="yes"])
|
[want_boost="yes"])
|
||||||
|
|
||||||
|
|
||||||
AC_ARG_WITH([boost-libdir],
|
AC_ARG_WITH([boost-libdir],
|
||||||
AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
|
[AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
|
||||||
[Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
|
[Force given directory for boost libraries.
|
||||||
|
Note that this will override library path detection,
|
||||||
|
so use this parameter only if default library detection fails
|
||||||
|
and you know exactly where your boost libraries are located.])],
|
||||||
[
|
[
|
||||||
if test -d "$withval"
|
AS_IF([test -d "$withval"],
|
||||||
then
|
[_AX_BOOST_BASE_boost_lib_path="$withval"],
|
||||||
ac_boost_lib_path="$withval"
|
[AC_MSG_ERROR([--with-boost-libdir expected directory name])])
|
||||||
else
|
|
||||||
AC_MSG_ERROR(--with-boost-libdir expected directory name)
|
|
||||||
fi
|
|
||||||
],
|
],
|
||||||
[ac_boost_lib_path=""]
|
[_AX_BOOST_BASE_boost_lib_path=""])
|
||||||
)
|
|
||||||
|
|
||||||
if test "x$want_boost" = "xyes"; then
|
BOOST_LDFLAGS=""
|
||||||
boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
|
BOOST_CPPFLAGS=""
|
||||||
boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
|
AS_IF([test "x$want_boost" = "xyes"],
|
||||||
boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
|
[_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])])
|
||||||
boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
|
AC_SUBST(BOOST_CPPFLAGS)
|
||||||
boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
|
AC_SUBST(BOOST_LDFLAGS)
|
||||||
if test "x$boost_lib_version_req_sub_minor" = "x" ; then
|
])
|
||||||
boost_lib_version_req_sub_minor="0"
|
|
||||||
fi
|
|
||||||
WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
|
# convert a version string in $2 to numeric and affect to polymorphic var $1
|
||||||
AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
|
AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[
|
||||||
|
AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"])
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'`
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'`
|
||||||
|
AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"],
|
||||||
|
[AC_MSG_ERROR([You should at least specify libboost major version])])
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'`
|
||||||
|
AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"],
|
||||||
|
[_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"])
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
|
||||||
|
AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"],
|
||||||
|
[_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"])
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor`
|
||||||
|
AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET)
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Run the detection of boost should be run only if $want_boost
|
||||||
|
AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[
|
||||||
|
_AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1])
|
||||||
succeeded=no
|
succeeded=no
|
||||||
|
|
||||||
|
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
dnl On 64-bit systems check for system libraries in both lib64 and lib.
|
dnl On 64-bit systems check for system libraries in both lib64 and lib.
|
||||||
dnl The former is specified by FHS, but e.g. Debian does not adhere to
|
dnl The former is specified by FHS, but e.g. Debian does not adhere to
|
||||||
dnl this (as it rises problems for generic multi-arch support).
|
dnl this (as it rises problems for generic multi-arch support).
|
||||||
dnl The last entry in the list is chosen by default when no libraries
|
dnl The last entry in the list is chosen by default when no libraries
|
||||||
dnl are found, e.g. when only header-only libraries are installed!
|
dnl are found, e.g. when only header-only libraries are installed!
|
||||||
libsubdirs="lib"
|
AS_CASE([${host_cpu}],
|
||||||
ax_arch=`uname -m`
|
[x86_64],[libsubdirs="lib64 libx32 lib lib64"],
|
||||||
case $ax_arch in
|
[ppc64|s390x|sparc64|aarch64|ppc64le],[libsubdirs="lib64 lib lib64"],
|
||||||
x86_64)
|
[libsubdirs="lib"]
|
||||||
libsubdirs="lib64 libx32 lib lib64"
|
)
|
||||||
;;
|
|
||||||
ppc64|s390x|sparc64|aarch64|ppc64le)
|
|
||||||
libsubdirs="lib64 lib lib64 ppc64le"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
|
dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
|
||||||
dnl them priority over the other paths since, if libs are found there, they
|
dnl them priority over the other paths since, if libs are found there, they
|
||||||
dnl are almost assuredly the ones desired.
|
dnl are almost assuredly the ones desired.
|
||||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
AS_CASE([${host_cpu}],
|
||||||
libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
|
[i?86],[multiarch_libsubdir="lib/i386-${host_os}"],
|
||||||
|
[multiarch_libsubdir="lib/${host_cpu}-${host_os}"]
|
||||||
case ${host_cpu} in
|
)
|
||||||
i?86)
|
|
||||||
libsubdirs="lib/i386-${host_os} $libsubdirs"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
dnl first we check the system location for boost libraries
|
dnl first we check the system location for boost libraries
|
||||||
dnl this location ist chosen if boost libraries are installed with the --layout=system option
|
dnl this location ist chosen if boost libraries are installed with the --layout=system option
|
||||||
dnl or if you install boost with RPM
|
dnl or if you install boost with RPM
|
||||||
if test "$ac_boost_path" != ""; then
|
AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path/include"
|
AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"])
|
||||||
for ac_boost_path_tmp in $libsubdirs; do
|
AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[
|
||||||
if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
|
AC_MSG_RESULT([yes])
|
||||||
BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
|
||||||
break
|
for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do
|
||||||
|
AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"])
|
||||||
|
AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
|
||||||
|
break;
|
||||||
|
],
|
||||||
|
[AC_MSG_RESULT([no])])
|
||||||
|
done],[
|
||||||
|
AC_MSG_RESULT([no])])
|
||||||
|
],[
|
||||||
|
if test X"$cross_compiling" = Xyes; then
|
||||||
|
search_libsubdirs=$multiarch_libsubdir
|
||||||
|
else
|
||||||
|
search_libsubdirs="$multiarch_libsubdir $libsubdirs"
|
||||||
fi
|
fi
|
||||||
|
for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
||||||
|
if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then
|
||||||
|
for libsubdir in $search_libsubdirs ; do
|
||||||
|
if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||||
done
|
done
|
||||||
elif test "$cross_compiling" != yes; then
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
|
||||||
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
|
||||||
if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
|
|
||||||
for libsubdir in $libsubdirs ; do
|
|
||||||
if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
|
||||||
done
|
|
||||||
BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
|
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
|
|
||||||
break;
|
break;
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
])
|
||||||
|
|
||||||
dnl overwrite ld flags if we have required special directory with
|
dnl overwrite ld flags if we have required special directory with
|
||||||
dnl --with-boost-libdir parameter
|
dnl --with-boost-libdir parameter
|
||||||
if test "$ac_boost_lib_path" != ""; then
|
AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"],
|
||||||
BOOST_LDFLAGS="-L$ac_boost_lib_path"
|
[BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"])
|
||||||
fi
|
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)])
|
||||||
CPPFLAGS_SAVED="$CPPFLAGS"
|
CPPFLAGS_SAVED="$CPPFLAGS"
|
||||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||||
export CPPFLAGS
|
export CPPFLAGS
|
||||||
@@ -152,15 +177,7 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
|
|
||||||
AC_REQUIRE([AC_PROG_CXX])
|
AC_REQUIRE([AC_PROG_CXX])
|
||||||
AC_LANG_PUSH(C++)
|
AC_LANG_PUSH(C++)
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
|
||||||
@%:@include <boost/version.hpp>
|
|
||||||
]], [[
|
|
||||||
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
|
||||||
// Everything is okay
|
|
||||||
#else
|
|
||||||
# error Boost version is too old
|
|
||||||
#endif
|
|
||||||
]])],[
|
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
succeeded=yes
|
succeeded=yes
|
||||||
found_system=yes
|
found_system=yes
|
||||||
@@ -176,36 +193,46 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
LDFLAGS="$LDFLAGS_SAVED"
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
BOOST_CPPFLAGS=
|
BOOST_CPPFLAGS=
|
||||||
|
if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
|
||||||
BOOST_LDFLAGS=
|
BOOST_LDFLAGS=
|
||||||
|
fi
|
||||||
_version=0
|
_version=0
|
||||||
if test "$ac_boost_path" != ""; then
|
if test -n "$_AX_BOOST_BASE_boost_path" ; then
|
||||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then
|
||||||
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
|
||||||
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
_version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||||
V_CHECK=`expr $_version_tmp \> $_version`
|
V_CHECK=`expr $_version_tmp \> $_version`
|
||||||
if test "$V_CHECK" = "1" ; then
|
if test "x$V_CHECK" = "x1" ; then
|
||||||
_version=$_version_tmp
|
_version=$_version_tmp
|
||||||
fi
|
fi
|
||||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
|
||||||
done
|
done
|
||||||
dnl if nothing found search for layout used in Windows distributions
|
dnl if nothing found search for layout used in Windows distributions
|
||||||
if test -z "$BOOST_CPPFLAGS"; then
|
if test -z "$BOOST_CPPFLAGS"; then
|
||||||
if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then
|
if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path"
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
dnl if we found something and BOOST_LDFLAGS was unset before
|
||||||
|
dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here.
|
||||||
|
if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then
|
||||||
|
for libsubdir in $libsubdirs ; do
|
||||||
|
if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||||
|
done
|
||||||
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if test "$cross_compiling" != yes; then
|
if test "x$cross_compiling" != "xyes" ; then
|
||||||
for ac_boost_path in /usr /usr/local /opt /opt/local ; do
|
for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do
|
||||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then
|
||||||
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
|
||||||
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
_version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||||
V_CHECK=`expr $_version_tmp \> $_version`
|
V_CHECK=`expr $_version_tmp \> $_version`
|
||||||
if test "$V_CHECK" = "1" ; then
|
if test "x$V_CHECK" = "x1" ; then
|
||||||
_version=$_version_tmp
|
_version=$_version_tmp
|
||||||
best_path=$ac_boost_path
|
best_path=$_AX_BOOST_BASE_boost_path
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
@@ -213,7 +240,7 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
|
|
||||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||||
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
|
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
|
||||||
if test "$ac_boost_lib_path" = ""; then
|
if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
|
||||||
for libsubdir in $libsubdirs ; do
|
for libsubdir in $libsubdirs ; do
|
||||||
if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||||
done
|
done
|
||||||
@@ -221,7 +248,7 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$BOOST_ROOT" != "x"; then
|
if test -n "$BOOST_ROOT" ; then
|
||||||
for libsubdir in $libsubdirs ; do
|
for libsubdir in $libsubdirs ; do
|
||||||
if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||||
done
|
done
|
||||||
@@ -230,7 +257,7 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
|
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
|
||||||
stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
|
stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
|
||||||
V_CHECK=`expr $stage_version_shorten \>\= $_version`
|
V_CHECK=`expr $stage_version_shorten \>\= $_version`
|
||||||
if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
|
if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
|
||||||
AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
|
AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
|
||||||
BOOST_CPPFLAGS="-I$BOOST_ROOT"
|
BOOST_CPPFLAGS="-I$BOOST_ROOT"
|
||||||
BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
|
BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
|
||||||
@@ -245,15 +272,7 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
export LDFLAGS
|
export LDFLAGS
|
||||||
|
|
||||||
AC_LANG_PUSH(C++)
|
AC_LANG_PUSH(C++)
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
|
||||||
@%:@include <boost/version.hpp>
|
|
||||||
]], [[
|
|
||||||
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
|
||||||
// Everything is okay
|
|
||||||
#else
|
|
||||||
# error Boost version is too old
|
|
||||||
#endif
|
|
||||||
]])],[
|
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
succeeded=yes
|
succeeded=yes
|
||||||
found_system=yes
|
found_system=yes
|
||||||
@@ -262,17 +281,15 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
AC_LANG_POP([C++])
|
AC_LANG_POP([C++])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$succeeded" != "yes" ; then
|
if test "x$succeeded" != "xyes" ; then
|
||||||
if test "$_version" = "0" ; then
|
if test "x$_version" = "x0" ; then
|
||||||
AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
|
AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
|
||||||
else
|
else
|
||||||
AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
|
AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
|
||||||
fi
|
fi
|
||||||
# execute ACTION-IF-NOT-FOUND (if present):
|
# execute ACTION-IF-NOT-FOUND (if present):
|
||||||
ifelse([$3], , :, [$3])
|
ifelse([$3], , :, [$3])
|
||||||
else
|
else
|
||||||
AC_SUBST(BOOST_CPPFLAGS)
|
|
||||||
AC_SUBST(BOOST_LDFLAGS)
|
|
||||||
AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
|
AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
|
||||||
# execute ACTION-IF-FOUND (if present):
|
# execute ACTION-IF-FOUND (if present):
|
||||||
ifelse([$2], , :, [$2])
|
ifelse([$2], , :, [$2])
|
||||||
@@ -280,6 +297,5 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
|
|
||||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
LDFLAGS="$LDFLAGS_SAVED"
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
fi
|
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_boost_system.html
|
# https://www.gnu.org/software/autoconf-archive/ax_boost_system.html
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
#
|
#
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
# and this notice are preserved. This file is offered as-is, without any
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
# warranty.
|
# warranty.
|
||||||
|
|
||||||
#serial 18
|
#serial 19
|
||||||
|
|
||||||
AC_DEFUN([AX_BOOST_SYSTEM],
|
AC_DEFUN([AX_BOOST_SYSTEM],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -1,38 +1,13 @@
|
|||||||
# Checking for pkg-config. If found, check for QtCore and query pkg-config
|
# Checking for pkg-config. If found, check for QtCore and query pkg-config
|
||||||
# for its exec-prefix variable.
|
# for its exec-prefix variable.
|
||||||
|
|
||||||
# FIND_QT4()
|
|
||||||
# Sets the QT_QMAKE variable to the path of Qt4 qmake if found.
|
|
||||||
# --------------------------------------
|
|
||||||
AC_DEFUN([FIND_QT4],
|
|
||||||
[PKG_CHECK_EXISTS([QtCore >= 4.8.0],
|
|
||||||
[PKG_CHECK_VAR(QT_QMAKE,
|
|
||||||
[QtCore >= 4.8.0],
|
|
||||||
[moc_location],
|
|
||||||
[QT_QMAKE=`AS_DIRNAME(["$QT_QMAKE"])`])
|
|
||||||
])
|
|
||||||
|
|
||||||
AS_IF([test -f "$QT_QMAKE/qmake"],
|
|
||||||
[QT_QMAKE="$QT_QMAKE/qmake"],
|
|
||||||
[AS_IF([test -f "$QT_QMAKE/qmake-qt4"],
|
|
||||||
[QT_QMAKE="$QT_QMAKE/qmake-qt4"],
|
|
||||||
[QT_QMAKE=""])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for Qt4 qmake >= 4.8.0])
|
|
||||||
AS_IF([test "x$QT_QMAKE" != "x"],
|
|
||||||
[AC_MSG_RESULT([$QT_QMAKE])],
|
|
||||||
[AC_MSG_RESULT([not found])]
|
|
||||||
)
|
|
||||||
])
|
|
||||||
|
|
||||||
# FIND_QT5()
|
# FIND_QT5()
|
||||||
# Sets the QT_QMAKE variable to the path of Qt5 qmake if found.
|
# Sets the QT_QMAKE variable to the path of Qt5 qmake if found.
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
AC_DEFUN([FIND_QT5],
|
AC_DEFUN([FIND_QT5],
|
||||||
[PKG_CHECK_EXISTS([Qt5Core >= 5.2.0],
|
[PKG_CHECK_EXISTS([Qt5Core >= 5.5.1],
|
||||||
[PKG_CHECK_VAR(QT_QMAKE,
|
[PKG_CHECK_VAR(QT_QMAKE,
|
||||||
[Qt5Core >= 5.2.0],
|
[Qt5Core >= 5.5.1],
|
||||||
[host_bins])
|
[host_bins])
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -43,7 +18,7 @@ AS_IF([test -f "$QT_QMAKE/qmake"],
|
|||||||
[QT_QMAKE=""])
|
[QT_QMAKE=""])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_MSG_CHECKING([for Qt5 qmake >= 5.2.0])
|
AC_MSG_CHECKING([for Qt5 qmake >= 5.5.1])
|
||||||
AS_IF([test "x$QT_QMAKE" != "x"],
|
AS_IF([test "x$QT_QMAKE" != "x"],
|
||||||
[AC_MSG_RESULT([$QT_QMAKE])],
|
[AC_MSG_RESULT([$QT_QMAKE])],
|
||||||
[AC_MSG_RESULT([not found])]
|
[AC_MSG_RESULT([not found])]
|
||||||
@@ -54,19 +29,10 @@ AS_IF([test "x$QT_QMAKE" != "x"],
|
|||||||
# Sets the HAVE_QTDBUS variable to true or false.
|
# Sets the HAVE_QTDBUS variable to true or false.
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
AC_DEFUN([FIND_QTDBUS],
|
AC_DEFUN([FIND_QTDBUS],
|
||||||
[AS_IF([test "x$with_qt4" = "xno"],
|
[AC_MSG_CHECKING([for Qt5DBus >= 5.5.1])
|
||||||
[AC_MSG_CHECKING([for Qt5DBus >= 5.2.0])
|
PKG_CHECK_EXISTS([Qt5DBus >= 5.5.1],
|
||||||
PKG_CHECK_EXISTS([Qt5DBus >= 5.2.0],
|
|
||||||
[AC_MSG_RESULT([found])
|
|
||||||
HAVE_QTDBUS=[true]],
|
|
||||||
[AC_MSG_RESULT([not found])
|
|
||||||
HAVE_QTDBUS=[false]])
|
|
||||||
],
|
|
||||||
[AC_MSG_CHECKING([for QtDBus >= 4.8.0])
|
|
||||||
PKG_CHECK_EXISTS([QtDBus >= 4.8.0],
|
|
||||||
[AC_MSG_RESULT([found])
|
[AC_MSG_RESULT([found])
|
||||||
HAVE_QTDBUS=[true]],
|
HAVE_QTDBUS=[true]],
|
||||||
[AC_MSG_RESULT([not found])
|
[AC_MSG_RESULT([not found])
|
||||||
HAVE_QTDBUS=[false]])
|
HAVE_QTDBUS=[false]])
|
||||||
])
|
])
|
||||||
])
|
|
||||||
|
|||||||
@@ -9,10 +9,7 @@ exists($$OUT_PWD/../conf.pri) {
|
|||||||
include(conf.pri)
|
include(conf.pri)
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBS += -framework Carbon -framework IOKit
|
LIBS += -framework Carbon -framework IOKit -framework AppKit
|
||||||
|
|
||||||
# C++11 support
|
|
||||||
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
|
|
||||||
|
|
||||||
QT_LANG_PATH = ../dist/qt-translations
|
QT_LANG_PATH = ../dist/qt-translations
|
||||||
DIST_PATH = ../dist/mac
|
DIST_PATH = ../dist/mac
|
||||||
|
|||||||
19
os2conf.pri
@@ -1,19 +0,0 @@
|
|||||||
# C++11 support
|
|
||||||
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
|
|
||||||
|
|
||||||
exists(conf.pri) {
|
|
||||||
# to the conf.pri goes all system dependent stuff
|
|
||||||
include(conf.pri)
|
|
||||||
}
|
|
||||||
|
|
||||||
LIBS += \
|
|
||||||
-ltorrent-rasterbar \
|
|
||||||
-lboost_thread \
|
|
||||||
-lboost_system \
|
|
||||||
-lboost_filesystem \
|
|
||||||
-lssl -lcrypto -lidn -lpthread -lz
|
|
||||||
|
|
||||||
RC_FILE = qbittorrent_os2.rc
|
|
||||||
|
|
||||||
# LIBTORRENT DEFINES
|
|
||||||
DEFINES += BOOST_ASIO_DYN_LINK
|
|
||||||
@@ -2,12 +2,9 @@ TS_IN = $$fromfile(src/src.pro,TRANSLATIONS)
|
|||||||
TS_IN_NOEXT = $$replace(TS_IN,".ts","")
|
TS_IN_NOEXT = $$replace(TS_IN,".ts","")
|
||||||
|
|
||||||
isEmpty(QMAKE_LRELEASE) {
|
isEmpty(QMAKE_LRELEASE) {
|
||||||
win32|os2:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe
|
win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe
|
||||||
else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
|
else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
|
||||||
unix {
|
unix {
|
||||||
equals(QT_MAJOR_VERSION, 4) {
|
|
||||||
!exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt4 }
|
|
||||||
}
|
|
||||||
equals(QT_MAJOR_VERSION, 5) {
|
equals(QT_MAJOR_VERSION, 5) {
|
||||||
!exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 }
|
!exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,28 +11,27 @@ include(QbtTargetSources)
|
|||||||
find_package(LibtorrentRasterbar REQUIRED)
|
find_package(LibtorrentRasterbar REQUIRED)
|
||||||
|
|
||||||
# Qt
|
# Qt
|
||||||
if (QT5)
|
|
||||||
add_definitions(-DQBT_USES_QT5)
|
|
||||||
list(APPEND QBT_QT_COMPONENTS Core Network Xml)
|
list(APPEND QBT_QT_COMPONENTS Core Network Xml)
|
||||||
if (GUI)
|
if (GUI)
|
||||||
list (APPEND QBT_QT_COMPONENTS Concurrent Gui Widgets)
|
list (APPEND QBT_QT_COMPONENTS Gui Svg Widgets)
|
||||||
|
if (WIN32)
|
||||||
|
list (APPEND QBT_QT_COMPONENTS WinExtras)
|
||||||
|
endif(WIN32)
|
||||||
|
if (APPLE)
|
||||||
|
list (APPEND QBT_GUI_OPTIONAL_LINK_LIBRARIES objc)
|
||||||
|
list (APPEND QBT_QT_COMPONENTS MacExtras)
|
||||||
|
endif (APPLE)
|
||||||
endif (GUI)
|
endif (GUI)
|
||||||
if (DBUS)
|
if (DBUS)
|
||||||
list (APPEND QBT_QT_COMPONENTS DBus)
|
list (APPEND QBT_QT_COMPONENTS DBus)
|
||||||
endif (DBUS)
|
endif (DBUS)
|
||||||
find_package(Qt5 5.2.0 COMPONENTS ${QBT_QT_COMPONENTS} REQUIRED)
|
find_package(Qt5 5.5.1 COMPONENTS ${QBT_QT_COMPONENTS} REQUIRED)
|
||||||
else (QT5)
|
|
||||||
list(APPEND QBT_QT_COMPONENTS QtCore QtNetwork QtXml)
|
if (GUI AND APPLE)
|
||||||
if (GUI)
|
# Fix MOC inability to detect macOS. This seems to only affect cmake.
|
||||||
list (APPEND QBT_QT_COMPONENTS QtGui)
|
# Relevant issue: https://bugreports.qt.io/browse/QTBUG-58325
|
||||||
endif (GUI)
|
set(CMAKE_AUTOMOC_MOC_OPTIONS ${CMAKE_AUTOMOC_MOC_OPTIONS} -DQ_OS_MAC)
|
||||||
if (DBUS)
|
endif ()
|
||||||
list (APPEND QBT_QT_COMPONENTS QtDBus)
|
|
||||||
endif (DBUS)
|
|
||||||
find_package(Qt4 4.8.0 COMPONENTS ${QBT_QT_COMPONENTS} REQUIRED)
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
add_definitions(-DQStringLiteral=QLatin1String)
|
|
||||||
endif (QT5)
|
|
||||||
|
|
||||||
set(CMAKE_AUTOMOC True)
|
set(CMAKE_AUTOMOC True)
|
||||||
list(APPEND CMAKE_AUTORCC_OPTIONS -compress 9 -threshold 5)
|
list(APPEND CMAKE_AUTORCC_OPTIONS -compress 9 -threshold 5)
|
||||||
@@ -41,11 +40,8 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
|||||||
|
|
||||||
# defines
|
# defines
|
||||||
add_definitions(-DQT_NO_CAST_TO_ASCII)
|
add_definitions(-DQT_NO_CAST_TO_ASCII)
|
||||||
# Fast concatenation (Qt >= 4.6)
|
# Efficient construction for QString & QByteArray (Qt >= 4.8)
|
||||||
add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS)
|
add_definitions(-DQT_USE_QSTRINGBUILDER)
|
||||||
if (WIN32)
|
|
||||||
add_definitions(-DNOMINMAX)
|
|
||||||
endif (WIN32)
|
|
||||||
|
|
||||||
if (NOT GUI)
|
if (NOT GUI)
|
||||||
add_definitions(-DDISABLE_GUI -DDISABLE_COUNTRIES_RESOLUTION)
|
add_definitions(-DDISABLE_GUI -DDISABLE_COUNTRIES_RESOLUTION)
|
||||||
@@ -82,17 +78,9 @@ endif (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|||||||
|
|
||||||
set(QBT_USE_GUI ${GUI})
|
set(QBT_USE_GUI ${GUI})
|
||||||
set(QBT_USE_WEBUI ${WEBUI})
|
set(QBT_USE_WEBUI ${WEBUI})
|
||||||
set(QBT_USES_QT5 ${QT5})
|
|
||||||
|
|
||||||
configure_file(config.h.cmakein ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
configure_file(config.h.cmakein ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
||||||
|
|
||||||
if (GUI)
|
|
||||||
set(QBT_TARGET_NAME qbittorrent)
|
|
||||||
else (GUI)
|
|
||||||
set(QBT_TARGET_NAME qbittorrent-nox)
|
|
||||||
endif (GUI)
|
|
||||||
|
|
||||||
|
|
||||||
if (SYSTEM_QTSINGLEAPPLICATION)
|
if (SYSTEM_QTSINGLEAPPLICATION)
|
||||||
find_package(QtSingleApplication REQUIRED)
|
find_package(QtSingleApplication REQUIRED)
|
||||||
else (SYSTEM_QTSINGLEAPPLICATION)
|
else (SYSTEM_QTSINGLEAPPLICATION)
|
||||||
|
|||||||
@@ -3,11 +3,13 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
|||||||
|
|
||||||
set(QBT_APP_HEADERS
|
set(QBT_APP_HEADERS
|
||||||
application.h
|
application.h
|
||||||
|
cmdoptions.h
|
||||||
filelogger.h
|
filelogger.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(QBT_APP_SOURCES
|
set(QBT_APP_SOURCES
|
||||||
application.cpp
|
application.cpp
|
||||||
|
cmdoptions.cpp
|
||||||
filelogger.cpp
|
filelogger.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
)
|
)
|
||||||
@@ -17,12 +19,8 @@ file(GLOB QBT_TS_FILES ../lang/*.ts)
|
|||||||
get_filename_component(QBT_QM_FILES_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/../lang" ABSOLUTE)
|
get_filename_component(QBT_QM_FILES_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/../lang" ABSOLUTE)
|
||||||
set_source_files_properties(${QBT_TS_FILES} PROPERTIES OUTPUT_LOCATION "${QBT_QM_FILES_BINARY_DIR}")
|
set_source_files_properties(${QBT_TS_FILES} PROPERTIES OUTPUT_LOCATION "${QBT_QM_FILES_BINARY_DIR}")
|
||||||
|
|
||||||
if (QT5)
|
|
||||||
find_package(Qt5 COMPONENTS LinguistTools REQUIRED)
|
find_package(Qt5 COMPONENTS LinguistTools REQUIRED)
|
||||||
qt5_add_translation(QBT_QM_FILES ${QBT_TS_FILES})
|
qt5_add_translation(QBT_QM_FILES ${QBT_TS_FILES})
|
||||||
else (QT5)
|
|
||||||
qt4_add_translation(QBT_QM_FILES ${QBT_TS_FILES})
|
|
||||||
endif (QT5)
|
|
||||||
|
|
||||||
get_filename_component(_lang_qrc_src "${CMAKE_CURRENT_SOURCE_DIR}/../lang.qrc" ABSOLUTE)
|
get_filename_component(_lang_qrc_src "${CMAKE_CURRENT_SOURCE_DIR}/../lang.qrc" ABSOLUTE)
|
||||||
get_filename_component(_lang_qrc_dst "${CMAKE_CURRENT_BINARY_DIR}/../lang.qrc" ABSOLUTE)
|
get_filename_component(_lang_qrc_dst "${CMAKE_CURRENT_BINARY_DIR}/../lang.qrc" ABSOLUTE)
|
||||||
@@ -44,11 +42,7 @@ set(QBT_APP_RESOURCES
|
|||||||
|
|
||||||
# With AUTORCC rcc is ran by cmake before language files are generated,
|
# With AUTORCC rcc is ran by cmake before language files are generated,
|
||||||
# and thus we call rcc explicitly
|
# and thus we call rcc explicitly
|
||||||
if (QT5)
|
|
||||||
qt5_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES})
|
qt5_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES})
|
||||||
else (QT5)
|
|
||||||
qt4_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES})
|
|
||||||
endif (QT5)
|
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
@@ -148,39 +142,50 @@ if (APPLE)
|
|||||||
PROPERTIES MACOSX_PACKAGE_LOCATION translations)
|
PROPERTIES MACOSX_PACKAGE_LOCATION translations)
|
||||||
endif (APPLE)
|
endif (APPLE)
|
||||||
|
|
||||||
add_executable(${QBT_TARGET_NAME} ${QBT_APP_HEADERS} ${QBT_APP_SOURCES} ${QBT_QM_FILES} ${QBT_APP_RESOURCE_SOURCE})
|
add_executable(qBittorrent ${QBT_APP_HEADERS} ${QBT_APP_SOURCES} ${QBT_QM_FILES} ${QBT_APP_RESOURCE_SOURCE})
|
||||||
set_target_properties(${QBT_TARGET_NAME}
|
if (GUI)
|
||||||
|
set_target_properties(qBittorrent
|
||||||
|
PROPERTIES
|
||||||
|
OUTPUT_NAME qbittorrent
|
||||||
|
WIN32_EXECUTABLE True
|
||||||
|
)
|
||||||
|
else (GUI)
|
||||||
|
set_target_properties(qBittorrent
|
||||||
|
PROPERTIES
|
||||||
|
OUTPUT_NAME qbittorrent-nox
|
||||||
|
)
|
||||||
|
endif (GUI)
|
||||||
|
|
||||||
|
set_target_properties(qBittorrent
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
AUTOUIC True
|
AUTOUIC True
|
||||||
AUTORCC True
|
AUTORCC True
|
||||||
MACOSX_BUNDLE True
|
MACOSX_BUNDLE True
|
||||||
)
|
)
|
||||||
|
|
||||||
if (GUI AND WIN32)
|
get_target_property(QBT_EXECUTABLE_NAME qBittorrent OUTPUT_NAME)
|
||||||
set_target_properties(${QBT_TARGET_NAME} PROPERTIES WIN32_EXECUTABLE True)
|
|
||||||
endif (GUI AND WIN32)
|
|
||||||
|
|
||||||
target_link_libraries(${QBT_TARGET_NAME} ${QBT_TARGET_LIBRARIES} QtSingleApplication::QtSingleApplication)
|
target_link_libraries(qBittorrent ${QBT_TARGET_LIBRARIES} QtSingleApplication::QtSingleApplication)
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
set(qbt_BUNDLE_NAME "${QBT_TARGET_NAME}")
|
set(qbt_BUNDLE_NAME ${QBT_EXECUTABLE_NAME})
|
||||||
|
|
||||||
# substitute @EXECUTABLE@ in dist/mac/Info.plist
|
# substitute @EXECUTABLE@ in dist/mac/Info.plist
|
||||||
set(EXECUTABLE ${qbt_BUNDLE_NAME})
|
set(EXECUTABLE ${qbt_BUNDLE_NAME})
|
||||||
configure_file(${qBittorrent_SOURCE_DIR}/dist/mac/Info.plist ${qBittorrent_BINARY_DIR}/dist/mac/Info.plist @ONLY)
|
configure_file(${qBittorrent_SOURCE_DIR}/dist/mac/Info.plist ${qBittorrent_BINARY_DIR}/dist/mac/Info.plist @ONLY)
|
||||||
|
|
||||||
set_target_properties(${QBT_TARGET_NAME} PROPERTIES
|
set_target_properties(qBittorrent PROPERTIES
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME "${qbt_BUNDLE_NAME}"
|
MACOSX_BUNDLE_BUNDLE_NAME "${qbt_BUNDLE_NAME}"
|
||||||
MACOSX_BUNDLE_INFO_PLIST ${qBittorrent_BINARY_DIR}/dist/mac/Info.plist
|
MACOSX_BUNDLE_INFO_PLIST ${qBittorrent_BINARY_DIR}/dist/mac/Info.plist
|
||||||
)
|
)
|
||||||
endif (APPLE)
|
endif (APPLE)
|
||||||
|
|
||||||
# installation
|
# installation
|
||||||
install(TARGETS ${QBT_TARGET_NAME}
|
install(TARGETS qBittorrent
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
BUNDLE DESTINATION .
|
BUNDLE DESTINATION .
|
||||||
COMPONENT runtime)
|
COMPONENT runtime)
|
||||||
|
|
||||||
if (APPLE AND GUI)
|
if (GUI AND APPLE)
|
||||||
install(SCRIPT ${OSX_RES_SRC_DIR}/bundle.cmake)
|
include(bundle)
|
||||||
endif (APPLE AND GUI)
|
endif (GUI AND APPLE)
|
||||||
|
|||||||
@@ -16,10 +16,12 @@ usesystemqtsingleapplication {
|
|||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
$$PWD/application.h \
|
$$PWD/application.h \
|
||||||
|
$$PWD/cmdoptions.h \
|
||||||
$$PWD/filelogger.h
|
$$PWD/filelogger.h
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
$$PWD/application.cpp \
|
$$PWD/application.cpp \
|
||||||
|
$$PWD/cmdoptions.cpp \
|
||||||
$$PWD/filelogger.cpp \
|
$$PWD/filelogger.cpp \
|
||||||
$$PWD/main.cpp
|
$$PWD/main.cpp
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,7 @@
|
|||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
#include "base/preferences.h"
|
#include "base/preferences.h"
|
||||||
#include "base/settingsstorage.h"
|
#include "base/settingsstorage.h"
|
||||||
|
#include "base/profile.h"
|
||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/misc.h"
|
#include "base/utils/misc.h"
|
||||||
#include "base/iconprovider.h"
|
#include "base/iconprovider.h"
|
||||||
@@ -73,6 +74,8 @@
|
|||||||
#include "base/net/proxyconfigurationmanager.h"
|
#include "base/net/proxyconfigurationmanager.h"
|
||||||
#include "base/bittorrent/session.h"
|
#include "base/bittorrent/session.h"
|
||||||
#include "base/bittorrent/torrenthandle.h"
|
#include "base/bittorrent/torrenthandle.h"
|
||||||
|
#include "base/rss/rss_autodownloader.h"
|
||||||
|
#include "base/rss/rss_session.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@@ -84,7 +87,7 @@ namespace
|
|||||||
const QString KEY_FILELOGGER_PATH = FILELOGGER_SETTINGS_KEY("Path");
|
const QString KEY_FILELOGGER_PATH = FILELOGGER_SETTINGS_KEY("Path");
|
||||||
const QString KEY_FILELOGGER_BACKUP = FILELOGGER_SETTINGS_KEY("Backup");
|
const QString KEY_FILELOGGER_BACKUP = FILELOGGER_SETTINGS_KEY("Backup");
|
||||||
const QString KEY_FILELOGGER_DELETEOLD = FILELOGGER_SETTINGS_KEY("DeleteOld");
|
const QString KEY_FILELOGGER_DELETEOLD = FILELOGGER_SETTINGS_KEY("DeleteOld");
|
||||||
const QString KEY_FILELOGGER_MAXSIZE = FILELOGGER_SETTINGS_KEY("MaxSize");
|
const QString KEY_FILELOGGER_MAXSIZEBYTES = FILELOGGER_SETTINGS_KEY("MaxSizeBytes");
|
||||||
const QString KEY_FILELOGGER_AGE = FILELOGGER_SETTINGS_KEY("Age");
|
const QString KEY_FILELOGGER_AGE = FILELOGGER_SETTINGS_KEY("Age");
|
||||||
const QString KEY_FILELOGGER_AGETYPE = FILELOGGER_SETTINGS_KEY("AgeType");
|
const QString KEY_FILELOGGER_AGETYPE = FILELOGGER_SETTINGS_KEY("AgeType");
|
||||||
|
|
||||||
@@ -93,32 +96,46 @@ namespace
|
|||||||
|
|
||||||
const QString LOG_FOLDER("logs");
|
const QString LOG_FOLDER("logs");
|
||||||
const char PARAMS_SEPARATOR[] = "|";
|
const char PARAMS_SEPARATOR[] = "|";
|
||||||
|
|
||||||
|
const QString DEFAULT_PORTABLE_MODE_PROFILE_DIR = QLatin1String("profile");
|
||||||
|
|
||||||
|
const int MIN_FILELOG_SIZE = 1024; // 1KiB
|
||||||
|
const int MAX_FILELOG_SIZE = 1000 * 1024 * 1024; // 1000MiB
|
||||||
|
const int DEFAULT_FILELOG_SIZE = 65 * 1024; // 65KiB
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::Application(const QString &id, int &argc, char **argv)
|
Application::Application(const QString &id, int &argc, char **argv)
|
||||||
: BaseApplication(id, argc, argv)
|
: BaseApplication(id, argc, argv)
|
||||||
, m_running(false)
|
, m_running(false)
|
||||||
, m_shutdownAct(ShutdownDialogAction::Exit)
|
, m_shutdownAct(ShutdownDialogAction::Exit)
|
||||||
|
, m_commandLineArgs(parseCommandLine(this->arguments()))
|
||||||
|
#ifndef DISABLE_WEBUI
|
||||||
|
, m_webui(nullptr)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
|
qRegisterMetaType<Log::Msg>("Log::Msg");
|
||||||
|
|
||||||
|
setApplicationName("qBittorrent");
|
||||||
|
validateCommandLineParameters();
|
||||||
|
|
||||||
|
QString profileDir = m_commandLineArgs.portableMode
|
||||||
|
? QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(DEFAULT_PORTABLE_MODE_PROFILE_DIR)
|
||||||
|
: m_commandLineArgs.profileDir;
|
||||||
|
|
||||||
|
Profile::initialize(profileDir, m_commandLineArgs.configurationName,
|
||||||
|
m_commandLineArgs.relativeFastresumePaths || m_commandLineArgs.portableMode);
|
||||||
|
|
||||||
Logger::initInstance();
|
Logger::initInstance();
|
||||||
SettingsStorage::initInstance();
|
SettingsStorage::initInstance();
|
||||||
Preferences::initInstance();
|
Preferences::initInstance();
|
||||||
|
|
||||||
#if defined(Q_OS_MACX) && !defined(DISABLE_GUI)
|
if (m_commandLineArgs.webUiPort > 0) // it will be -1 when user did not set any value
|
||||||
if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) {
|
Preferences::instance()->setWebUiPort(m_commandLineArgs.webUiPort);
|
||||||
// fix Mac OS X 10.9 (mavericks) font issue
|
|
||||||
// https://bugreports.qt-project.org/browse/QTBUG-32789
|
|
||||||
QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
setApplicationName("qBittorrent");
|
|
||||||
initializeTranslation();
|
initializeTranslation();
|
||||||
|
|
||||||
#if !defined(DISABLE_GUI)
|
#if !defined(DISABLE_GUI)
|
||||||
#ifdef QBT_USES_QT5
|
|
||||||
setAttribute(Qt::AA_UseHighDpiPixmaps, true); // opt-in to the high DPI pixmap support
|
setAttribute(Qt::AA_UseHighDpiPixmaps, true); // opt-in to the high DPI pixmap support
|
||||||
#endif // QBT_USES_QT5
|
|
||||||
setQuitOnLastWindowClosed(false);
|
setQuitOnLastWindowClosed(false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -135,6 +152,13 @@ Application::Application(const QString &id, int &argc, char **argv)
|
|||||||
Logger::instance()->addMessage(tr("qBittorrent %1 started", "qBittorrent v3.2.0alpha started").arg(QBT_VERSION));
|
Logger::instance()->addMessage(tr("qBittorrent %1 started", "qBittorrent v3.2.0alpha started").arg(QBT_VERSION));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Application::~Application()
|
||||||
|
{
|
||||||
|
// we still need to call cleanup()
|
||||||
|
// in case the App failed to start
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
QPointer<MainWindow> Application::mainWindow()
|
QPointer<MainWindow> Application::mainWindow()
|
||||||
{
|
{
|
||||||
@@ -142,6 +166,11 @@ QPointer<MainWindow> Application::mainWindow()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const QBtCommandLineParameters &Application::commandLineArgs() const
|
||||||
|
{
|
||||||
|
return m_commandLineArgs;
|
||||||
|
}
|
||||||
|
|
||||||
bool Application::isFileLoggerEnabled() const
|
bool Application::isFileLoggerEnabled() const
|
||||||
{
|
{
|
||||||
return settings()->loadValue(KEY_FILELOGGER_ENABLED, true).toBool();
|
return settings()->loadValue(KEY_FILELOGGER_ENABLED, true).toBool();
|
||||||
@@ -158,14 +187,15 @@ void Application::setFileLoggerEnabled(bool value)
|
|||||||
|
|
||||||
QString Application::fileLoggerPath() const
|
QString Application::fileLoggerPath() const
|
||||||
{
|
{
|
||||||
return settings()->loadValue(KEY_FILELOGGER_PATH, QVariant(Utils::Fs::QDesktopServicesDataLocation() + LOG_FOLDER)).toString();
|
return settings()->loadValue(KEY_FILELOGGER_PATH,
|
||||||
|
QVariant(specialFolderLocation(SpecialFolder::Data) + LOG_FOLDER)).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerPath(const QString &value)
|
void Application::setFileLoggerPath(const QString &path)
|
||||||
{
|
{
|
||||||
if (m_fileLogger)
|
if (m_fileLogger)
|
||||||
m_fileLogger->changePath(value);
|
m_fileLogger->changePath(path);
|
||||||
settings()->storeValue(KEY_FILELOGGER_PATH, value);
|
settings()->storeValue(KEY_FILELOGGER_PATH, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Application::isFileLoggerBackup() const
|
bool Application::isFileLoggerBackup() const
|
||||||
@@ -194,29 +224,22 @@ void Application::setFileLoggerDeleteOld(bool value)
|
|||||||
|
|
||||||
int Application::fileLoggerMaxSize() const
|
int Application::fileLoggerMaxSize() const
|
||||||
{
|
{
|
||||||
int val = settings()->loadValue(KEY_FILELOGGER_MAXSIZE, 10).toInt();
|
int val = settings()->loadValue(KEY_FILELOGGER_MAXSIZEBYTES, DEFAULT_FILELOG_SIZE).toInt();
|
||||||
if (val < 1)
|
return std::min(std::max(val, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE);
|
||||||
return 1;
|
|
||||||
if (val > 1000)
|
|
||||||
return 1000;
|
|
||||||
return val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerMaxSize(const int value)
|
void Application::setFileLoggerMaxSize(const int bytes)
|
||||||
{
|
{
|
||||||
|
int clampedValue = std::min(std::max(bytes, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE);
|
||||||
if (m_fileLogger)
|
if (m_fileLogger)
|
||||||
m_fileLogger->setMaxSize(value);
|
m_fileLogger->setMaxSize(clampedValue);
|
||||||
settings()->storeValue(KEY_FILELOGGER_MAXSIZE, std::min(std::max(value, 1), 1000));
|
settings()->storeValue(KEY_FILELOGGER_MAXSIZEBYTES, clampedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Application::fileLoggerAge() const
|
int Application::fileLoggerAge() const
|
||||||
{
|
{
|
||||||
int val = settings()->loadValue(KEY_FILELOGGER_AGE, 6).toInt();
|
int val = settings()->loadValue(KEY_FILELOGGER_AGE, 1).toInt();
|
||||||
if (val < 1)
|
return std::min(std::max(val, 1), 365);
|
||||||
return 1;
|
|
||||||
if (val > 365)
|
|
||||||
return 365;
|
|
||||||
return val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerAge(const int value)
|
void Application::setFileLoggerAge(const int value)
|
||||||
@@ -264,48 +287,27 @@ void Application::runExternalProgram(BitTorrent::TorrentHandle *const torrent) c
|
|||||||
|
|
||||||
#if defined(Q_OS_UNIX)
|
#if defined(Q_OS_UNIX)
|
||||||
QProcess::startDetached(QLatin1String("/bin/sh"), {QLatin1String("-c"), program});
|
QProcess::startDetached(QLatin1String("/bin/sh"), {QLatin1String("-c"), program});
|
||||||
#elif defined(Q_OS_WIN) // test cmd: `echo "%F" > "c:\ab ba.txt"`
|
|
||||||
program.prepend(QLatin1String("\"")).append(QLatin1String("\""));
|
|
||||||
program.prepend(Utils::Misc::windowsSystemPath() + QLatin1String("\\cmd.exe /C "));
|
|
||||||
const int cmdMaxLength = 32768; // max length (incl. terminate char) for `lpCommandLine` in `CreateProcessW()`
|
|
||||||
if ((program.size() + 1) > cmdMaxLength) {
|
|
||||||
logger->addMessage(tr("Torrent: %1, run external program command too long (length > %2), execution failed.").arg(torrent->name()).arg(cmdMaxLength), Log::CRITICAL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
STARTUPINFOW si = {0};
|
|
||||||
si.cb = sizeof(si);
|
|
||||||
PROCESS_INFORMATION pi = {0};
|
|
||||||
|
|
||||||
WCHAR *arg = new WCHAR[program.size() + 1];
|
|
||||||
program.toWCharArray(arg);
|
|
||||||
arg[program.size()] = L'\0';
|
|
||||||
if (CreateProcessW(NULL, arg, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
|
|
||||||
CloseHandle(pi.hProcess);
|
|
||||||
CloseHandle(pi.hThread);
|
|
||||||
}
|
|
||||||
delete[] arg;
|
|
||||||
#else
|
#else
|
||||||
QProcess::startDetached(program);
|
QProcess::startDetached(program);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::sendNotificationEmail(BitTorrent::TorrentHandle *const torrent)
|
void Application::sendNotificationEmail(const BitTorrent::TorrentHandle *torrent)
|
||||||
{
|
{
|
||||||
// Prepare mail content
|
// Prepare mail content
|
||||||
QString content = QObject::tr("Torrent name: %1").arg(torrent->name()) + "\n";
|
const QString content = tr("Torrent name: %1").arg(torrent->name()) + "\n"
|
||||||
content += QObject::tr("Torrent size: %1").arg(Utils::Misc::friendlyUnit(torrent->wantedSize())) + "\n";
|
+ tr("Torrent size: %1").arg(Utils::Misc::friendlyUnit(torrent->wantedSize())) + "\n"
|
||||||
content += QObject::tr("Save path: %1").arg(torrent->savePath()) + "\n\n";
|
+ tr("Save path: %1").arg(torrent->savePath()) + "\n\n"
|
||||||
content += QObject::tr("The torrent was downloaded in %1.",
|
+ tr("The torrent was downloaded in %1.", "The torrent was downloaded in 1 hour and 20 seconds")
|
||||||
"The torrent was downloaded in 1 hour and 20 seconds")
|
.arg(Utils::Misc::userFriendlyDuration(torrent->activeTime())) + "\n\n\n"
|
||||||
.arg(Utils::Misc::userFriendlyDuration(torrent->activeTime())) + "\n\n\n";
|
+ tr("Thank you for using qBittorrent.") + "\n";
|
||||||
content += QObject::tr("Thank you for using qBittorrent.") + "\n";
|
|
||||||
|
|
||||||
// Send the notification email
|
// Send the notification email
|
||||||
Net::Smtp *sender = new Net::Smtp;
|
const Preferences *pref = Preferences::instance();
|
||||||
sender->sendMail("notification@qbittorrent.org",
|
Net::Smtp *smtp = new Net::Smtp(this);
|
||||||
Preferences::instance()->getMailNotificationEmail(),
|
smtp->sendMail(pref->getMailNotificationSender(),
|
||||||
QObject::tr("[qBittorrent] '%1' has finished downloading").arg(torrent->name()),
|
pref->getMailNotificationEmail(),
|
||||||
|
tr("[qBittorrent] '%1' has finished downloading").arg(torrent->name()),
|
||||||
content);
|
content);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,7 +351,7 @@ void Application::allTorrentsFinished()
|
|||||||
// do nothing & skip confirm
|
// do nothing & skip confirm
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!ShutdownConfirmDlg::askForConfirmation(action)) return;
|
if (!ShutdownConfirmDlg::askForConfirmation(m_window, action)) return;
|
||||||
}
|
}
|
||||||
#endif // DISABLE_GUI
|
#endif // DISABLE_GUI
|
||||||
|
|
||||||
@@ -385,15 +387,63 @@ void Application::processParams(const QStringList ¶ms)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
BitTorrent::AddTorrentParams torrentParams;
|
||||||
|
TriStateBool skipTorrentDialog;
|
||||||
|
|
||||||
foreach (QString param, params) {
|
foreach (QString param, params) {
|
||||||
param = param.trimmed();
|
param = param.trimmed();
|
||||||
|
|
||||||
|
// Process strings indicating options specified by the user.
|
||||||
|
|
||||||
|
if (param.startsWith(QLatin1String("@savePath="))) {
|
||||||
|
torrentParams.savePath = param.mid(10);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param.startsWith(QLatin1String("@addPaused="))) {
|
||||||
|
torrentParams.addPaused = param.mid(11).toInt() ? TriStateBool::True : TriStateBool::False;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param == QLatin1String("@skipChecking")) {
|
||||||
|
torrentParams.skipChecking = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param.startsWith(QLatin1String("@category="))) {
|
||||||
|
torrentParams.category = param.mid(10);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param == QLatin1String("@sequential")) {
|
||||||
|
torrentParams.sequential = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param == QLatin1String("@firstLastPiecePriority")) {
|
||||||
|
torrentParams.firstLastPiecePriority = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param.startsWith(QLatin1String("@skipDialog="))) {
|
||||||
|
skipTorrentDialog = param.mid(12).toInt() ? TriStateBool::True : TriStateBool::False;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
if (AddNewTorrentDialog::isEnabled())
|
// There are two circumstances in which we want to show the torrent
|
||||||
AddNewTorrentDialog::show(param, m_window);
|
// dialog. One is when the application settings specify that it should
|
||||||
|
// be shown and skipTorrentDialog is undefined. The other is when
|
||||||
|
// skipTorrentDialog is false, meaning that the application setting
|
||||||
|
// should be overridden.
|
||||||
|
const bool showDialogForThisTorrent =
|
||||||
|
((AddNewTorrentDialog::isEnabled() && skipTorrentDialog == TriStateBool::Undefined)
|
||||||
|
|| skipTorrentDialog == TriStateBool::False);
|
||||||
|
if (showDialogForThisTorrent)
|
||||||
|
AddNewTorrentDialog::show(param, torrentParams, m_window);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
BitTorrent::Session::instance()->addTorrent(param);
|
BitTorrent::Session::instance()->addTorrent(param, torrentParams);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -418,7 +468,15 @@ int Application::exec(const QStringList ¶ms)
|
|||||||
|
|
||||||
#ifndef DISABLE_WEBUI
|
#ifndef DISABLE_WEBUI
|
||||||
m_webui = new WebUI;
|
m_webui = new WebUI;
|
||||||
#endif
|
#ifdef DISABLE_GUI
|
||||||
|
if (m_webui->isErrored())
|
||||||
|
return 1;
|
||||||
|
connect(m_webui, &WebUI::fatalError, this, []() { QCoreApplication::exit(1); });
|
||||||
|
#endif // DISABLE_GUI
|
||||||
|
#endif // DISABLE_WEBUI
|
||||||
|
|
||||||
|
new RSS::Session; // create RSS::Session singleton
|
||||||
|
new RSS::AutoDownloader; // create RSS::AutoDownloader singleton
|
||||||
|
|
||||||
#ifdef DISABLE_GUI
|
#ifdef DISABLE_GUI
|
||||||
#ifndef DISABLE_WEBUI
|
#ifndef DISABLE_WEBUI
|
||||||
@@ -438,15 +496,15 @@ int Application::exec(const QStringList ¶ms)
|
|||||||
#endif // DISABLE_GUI
|
#endif // DISABLE_GUI
|
||||||
|
|
||||||
m_running = true;
|
m_running = true;
|
||||||
|
|
||||||
|
// Now UI is ready to process signals from Session
|
||||||
|
BitTorrent::Session::instance()->startUpTorrents();
|
||||||
|
|
||||||
m_paramsQueue = params + m_paramsQueue;
|
m_paramsQueue = params + m_paramsQueue;
|
||||||
if (!m_paramsQueue.isEmpty()) {
|
if (!m_paramsQueue.isEmpty()) {
|
||||||
processParams(m_paramsQueue);
|
processParams(m_paramsQueue);
|
||||||
m_paramsQueue.clear();
|
m_paramsQueue.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now UI is ready to process signals from Session
|
|
||||||
BitTorrent::Session::instance()->startUpTorrents();
|
|
||||||
|
|
||||||
return BaseApplication::exec();
|
return BaseApplication::exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,7 +544,7 @@ bool Application::event(QEvent *ev)
|
|||||||
if (path.isEmpty())
|
if (path.isEmpty())
|
||||||
// Get the url instead
|
// Get the url instead
|
||||||
path = static_cast<QFileOpenEvent *>(ev)->url().toString();
|
path = static_cast<QFileOpenEvent *>(ev)->url().toString();
|
||||||
qDebug("Received a mac file open event: %s", qPrintable(path));
|
qDebug("Received a mac file open event: %s", qUtf8Printable(path));
|
||||||
if (m_running)
|
if (m_running)
|
||||||
processParams(QStringList(path));
|
processParams(QStringList(path));
|
||||||
else
|
else
|
||||||
@@ -519,20 +577,18 @@ void Application::initializeTranslation()
|
|||||||
// Load translation
|
// Load translation
|
||||||
QString localeStr = pref->getLocale();
|
QString localeStr = pref->getLocale();
|
||||||
|
|
||||||
if (
|
if (m_qtTranslator.load(QLatin1String("qtbase_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) ||
|
||||||
#ifdef QBT_USES_QT5
|
m_qtTranslator.load(QLatin1String("qt_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
|
||||||
m_qtTranslator.load(QString::fromUtf8("qtbase_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) ||
|
qDebug("Qt %s locale recognized, using translation.", qUtf8Printable(localeStr));
|
||||||
#endif
|
|
||||||
m_qtTranslator.load(QString::fromUtf8("qt_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
|
|
||||||
qDebug("Qt %s locale recognized, using translation.", qPrintable(localeStr));
|
|
||||||
else
|
else
|
||||||
qDebug("Qt %s locale unrecognized, using default (en).", qPrintable(localeStr));
|
qDebug("Qt %s locale unrecognized, using default (en).", qUtf8Printable(localeStr));
|
||||||
|
|
||||||
installTranslator(&m_qtTranslator);
|
installTranslator(&m_qtTranslator);
|
||||||
|
|
||||||
if (m_translator.load(QString::fromUtf8(":/lang/qbittorrent_") + localeStr))
|
if (m_translator.load(QLatin1String(":/lang/qbittorrent_") + localeStr))
|
||||||
qDebug("%s locale recognized, using translation.", qPrintable(localeStr));
|
qDebug("%s locale recognized, using translation.", qUtf8Printable(localeStr));
|
||||||
else
|
else
|
||||||
qDebug("%s locale unrecognized, using default (en).", qPrintable(localeStr));
|
qDebug("%s locale unrecognized, using default (en).", qUtf8Printable(localeStr));
|
||||||
installTranslator(&m_translator);
|
installTranslator(&m_translator);
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
@@ -576,14 +632,13 @@ void Application::shutdownCleanup(QSessionManager &manager)
|
|||||||
|
|
||||||
void Application::cleanup()
|
void Application::cleanup()
|
||||||
{
|
{
|
||||||
#ifndef DISABLE_GUI
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
// cleanup() can be called multiple times during shutdown. We only need it once.
|
// cleanup() can be called multiple times during shutdown. We only need it once.
|
||||||
static QAtomicInt alreadyDone;
|
static QAtomicInt alreadyDone;
|
||||||
if (!alreadyDone.testAndSetAcquire(0, 1))
|
if (!alreadyDone.testAndSetAcquire(0, 1))
|
||||||
return;
|
return;
|
||||||
#endif // Q_OS_WIN
|
|
||||||
|
|
||||||
|
#ifndef DISABLE_GUI
|
||||||
|
if (m_window) {
|
||||||
// Hide the window and not leave it on screen as
|
// Hide the window and not leave it on screen as
|
||||||
// unresponsive. Also for Windows take the WinId
|
// unresponsive. Also for Windows take the WinId
|
||||||
// after it's hidden, because hide() may cause a
|
// after it's hidden, because hide() may cause a
|
||||||
@@ -606,13 +661,16 @@ void Application::cleanup()
|
|||||||
// otherwise the system shutdown will continue even
|
// otherwise the system shutdown will continue even
|
||||||
// though we created a ShutdownBlockReason
|
// though we created a ShutdownBlockReason
|
||||||
m_window->cleanup();
|
m_window->cleanup();
|
||||||
|
}
|
||||||
#endif // DISABLE_GUI
|
#endif // DISABLE_GUI
|
||||||
|
|
||||||
#ifndef DISABLE_WEBUI
|
#ifndef DISABLE_WEBUI
|
||||||
delete m_webui;
|
delete m_webui;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
delete RSS::AutoDownloader::instance();
|
||||||
|
delete RSS::Session::instance();
|
||||||
|
|
||||||
ScanFoldersModel::freeInstance();
|
ScanFoldersModel::freeInstance();
|
||||||
BitTorrent::Session::freeInstance();
|
BitTorrent::Session::freeInstance();
|
||||||
#ifndef DISABLE_COUNTRIES_RESOLUTION
|
#ifndef DISABLE_COUNTRIES_RESOLUTION
|
||||||
@@ -628,6 +686,7 @@ void Application::cleanup()
|
|||||||
Utils::Fs::removeDirRecursive(Utils::Fs::tempPath());
|
Utils::Fs::removeDirRecursive(Utils::Fs::tempPath());
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
|
if (m_window) {
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND);
|
typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND);
|
||||||
PSHUTDOWNBRDESTROY shutdownBRDestroy = (PSHUTDOWNBRDESTROY)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonDestroy");
|
PSHUTDOWNBRDESTROY shutdownBRDestroy = (PSHUTDOWNBRDESTROY)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonDestroy");
|
||||||
@@ -636,6 +695,7 @@ void Application::cleanup()
|
|||||||
shutdownBRDestroy((HWND)m_window->effectiveWinId());
|
shutdownBRDestroy((HWND)m_window->effectiveWinId());
|
||||||
#endif // Q_OS_WIN
|
#endif // Q_OS_WIN
|
||||||
delete m_window;
|
delete m_window;
|
||||||
|
}
|
||||||
#endif // DISABLE_GUI
|
#endif // DISABLE_GUI
|
||||||
|
|
||||||
if (m_shutdownAct != ShutdownDialogAction::Exit) {
|
if (m_shutdownAct != ShutdownDialogAction::Exit) {
|
||||||
@@ -643,3 +703,12 @@ void Application::cleanup()
|
|||||||
Utils::Misc::shutdownComputer(m_shutdownAct);
|
Utils::Misc::shutdownComputer(m_shutdownAct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Application::validateCommandLineParameters()
|
||||||
|
{
|
||||||
|
if (m_commandLineArgs.portableMode && !m_commandLineArgs.profileDir.isEmpty())
|
||||||
|
throw CommandLineParameterError(tr("Portable mode and explicit profile directory options are mutually exclusive"));
|
||||||
|
|
||||||
|
if (m_commandLineArgs.portableMode && m_commandLineArgs.relativeFastresumePaths)
|
||||||
|
Logger::instance()->addMessage(tr("Portable mode implies relative fastresume"), Log::WARNING);
|
||||||
|
}
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ typedef QtSingleCoreApplication BaseApplication;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "base/utils/misc.h"
|
#include "base/utils/misc.h"
|
||||||
|
#include "cmdoptions.h"
|
||||||
|
|
||||||
#ifndef DISABLE_WEBUI
|
#ifndef DISABLE_WEBUI
|
||||||
class WebUI;
|
class WebUI;
|
||||||
@@ -63,12 +64,20 @@ namespace BitTorrent
|
|||||||
class TorrentHandle;
|
class TorrentHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace RSS
|
||||||
|
{
|
||||||
|
class Session;
|
||||||
|
class AutoDownloader;
|
||||||
|
}
|
||||||
|
|
||||||
class Application : public BaseApplication
|
class Application : public BaseApplication
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
Q_DISABLE_COPY(Application)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Application(const QString &id, int &argc, char **argv);
|
Application(const QString &id, int &argc, char **argv);
|
||||||
|
~Application() override;
|
||||||
|
|
||||||
#if (defined(Q_OS_WIN) && !defined(DISABLE_GUI))
|
#if (defined(Q_OS_WIN) && !defined(DISABLE_GUI))
|
||||||
bool isRunning();
|
bool isRunning();
|
||||||
@@ -80,6 +89,8 @@ public:
|
|||||||
QPointer<MainWindow> mainWindow();
|
QPointer<MainWindow> mainWindow();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const QBtCommandLineParameters &commandLineArgs() const;
|
||||||
|
|
||||||
// FileLogger properties
|
// FileLogger properties
|
||||||
bool isFileLoggerEnabled() const;
|
bool isFileLoggerEnabled() const;
|
||||||
void setFileLoggerEnabled(bool value);
|
void setFileLoggerEnabled(bool value);
|
||||||
@@ -90,7 +101,7 @@ public:
|
|||||||
bool isFileLoggerDeleteOld() const;
|
bool isFileLoggerDeleteOld() const;
|
||||||
void setFileLoggerDeleteOld(bool value);
|
void setFileLoggerDeleteOld(bool value);
|
||||||
int fileLoggerMaxSize() const;
|
int fileLoggerMaxSize() const;
|
||||||
void setFileLoggerMaxSize(const int value);
|
void setFileLoggerMaxSize(const int bytes);
|
||||||
int fileLoggerAge() const;
|
int fileLoggerAge() const;
|
||||||
void setFileLoggerAge(const int value);
|
void setFileLoggerAge(const int value);
|
||||||
int fileLoggerAgeType() const;
|
int fileLoggerAgeType() const;
|
||||||
@@ -116,13 +127,14 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
bool m_running;
|
bool m_running;
|
||||||
ShutdownDialogAction m_shutdownAct;
|
ShutdownDialogAction m_shutdownAct;
|
||||||
|
QBtCommandLineParameters m_commandLineArgs;
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
QPointer<MainWindow> m_window;
|
QPointer<MainWindow> m_window;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DISABLE_WEBUI
|
#ifndef DISABLE_WEBUI
|
||||||
QPointer<WebUI> m_webui;
|
WebUI *m_webui;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// FileLog
|
// FileLog
|
||||||
@@ -135,7 +147,8 @@ private:
|
|||||||
void initializeTranslation();
|
void initializeTranslation();
|
||||||
void processParams(const QStringList ¶ms);
|
void processParams(const QStringList ¶ms);
|
||||||
void runExternalProgram(BitTorrent::TorrentHandle *const torrent) const;
|
void runExternalProgram(BitTorrent::TorrentHandle *const torrent) const;
|
||||||
void sendNotificationEmail(BitTorrent::TorrentHandle *const torrent);
|
void sendNotificationEmail(const BitTorrent::TorrentHandle *torrent);
|
||||||
|
void validateCommandLineParameters();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // APPLICATION_H
|
#endif // APPLICATION_H
|
||||||
|
|||||||
588
src/app/cmdoptions.cpp
Normal file
@@ -0,0 +1,588 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2016 Eugene Shalygin <eugene.shalygin@gmail.com>
|
||||||
|
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cmdoptions.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QProcessEnvironment>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#include <QMessageBox>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "base/utils/misc.h"
|
||||||
|
#include "base/utils/string.h"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
const int USAGE_INDENTATION = 4;
|
||||||
|
const int USAGE_TEXT_COLUMN = 31;
|
||||||
|
const int WRAP_AT_COLUMN = 80;
|
||||||
|
|
||||||
|
// Base option class. Encapsulates name operations.
|
||||||
|
class Option
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
constexpr Option(const char *name, char shortcut = 0)
|
||||||
|
: m_name {name}
|
||||||
|
, m_shortcut {shortcut}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString fullParameter() const
|
||||||
|
{
|
||||||
|
return QLatin1String("--") + QLatin1String(m_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString shortcutParameter() const
|
||||||
|
{
|
||||||
|
return QLatin1String("-") + QLatin1Char(m_shortcut);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasShortcut() const
|
||||||
|
{
|
||||||
|
return m_shortcut != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString envVarName() const
|
||||||
|
{
|
||||||
|
return QLatin1String("QBT_")
|
||||||
|
+ QString(QLatin1String(m_name)).toUpper().replace(QLatin1Char('-'), QLatin1Char('_'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
static QString padUsageText(const QString &usage)
|
||||||
|
{
|
||||||
|
QString res = QString(USAGE_INDENTATION, ' ') + usage;
|
||||||
|
|
||||||
|
if ((USAGE_TEXT_COLUMN - usage.length() - 4) > 0)
|
||||||
|
return res + QString(USAGE_TEXT_COLUMN - usage.length() - 4, ' ');
|
||||||
|
else
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const char *m_name;
|
||||||
|
const char m_shortcut;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Boolean option.
|
||||||
|
class BoolOption: protected Option
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constexpr BoolOption(const char *name, char shortcut = 0)
|
||||||
|
: Option {name, shortcut}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const QString &arg) const
|
||||||
|
{
|
||||||
|
return (hasShortcut() && ((arg.size() == 2) && (arg == shortcutParameter())))
|
||||||
|
|| (arg == fullParameter());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool value(const QProcessEnvironment &env) const
|
||||||
|
{
|
||||||
|
QString val = env.value(envVarName());
|
||||||
|
// we accept "1" and "true" (upper or lower cased) as boolean 'true' values
|
||||||
|
return (val == QLatin1String("1") || val.toUpper() == QLatin1String("TRUE"));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString usage() const
|
||||||
|
{
|
||||||
|
QString res;
|
||||||
|
if (hasShortcut())
|
||||||
|
res += shortcutParameter() + QLatin1String(" | ");
|
||||||
|
res += fullParameter();
|
||||||
|
return padUsageText(res);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const QString &s, const BoolOption &o)
|
||||||
|
{
|
||||||
|
return o == s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Option with string value. May not have a shortcut
|
||||||
|
struct StringOption: protected Option
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constexpr StringOption(const char *name)
|
||||||
|
: Option {name, 0}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const QString &arg) const
|
||||||
|
{
|
||||||
|
return arg.startsWith(parameterAssignment());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString value(const QString &arg) const
|
||||||
|
{
|
||||||
|
QStringList parts = arg.split(QLatin1Char('='));
|
||||||
|
if (parts.size() == 2)
|
||||||
|
return Utils::String::unquote(parts[1], QLatin1String("'\""));
|
||||||
|
throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'",
|
||||||
|
"e.g. Parameter '--webui-port' must follow syntax '--webui-port=value'")
|
||||||
|
.arg(fullParameter()).arg(QLatin1String("<value>")));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString value(const QProcessEnvironment &env, const QString &defaultValue = QString()) const
|
||||||
|
{
|
||||||
|
QString val = env.value(envVarName());
|
||||||
|
return val.isEmpty() ? defaultValue : Utils::String::unquote(val, QLatin1String("'\""));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString usage(const QString &valueName) const
|
||||||
|
{
|
||||||
|
return padUsageText(parameterAssignment() + QLatin1Char('<') + valueName + QLatin1Char('>'));
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString parameterAssignment() const
|
||||||
|
{
|
||||||
|
return fullParameter() + QLatin1Char('=');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const QString &s, const StringOption &o)
|
||||||
|
{
|
||||||
|
return o == s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Option with integer value. May not have a shortcut
|
||||||
|
class IntOption: protected StringOption
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constexpr IntOption(const char *name)
|
||||||
|
: StringOption {name}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
using StringOption::operator==;
|
||||||
|
using StringOption::usage;
|
||||||
|
|
||||||
|
int value(const QString &arg) const
|
||||||
|
{
|
||||||
|
QString val = StringOption::value(arg);
|
||||||
|
bool ok = false;
|
||||||
|
int res = val.toInt(&ok);
|
||||||
|
if (!ok)
|
||||||
|
throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'",
|
||||||
|
"e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>'")
|
||||||
|
.arg(fullParameter()).arg(QLatin1String("<integer value>")));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int value(const QProcessEnvironment &env, int defaultValue) const
|
||||||
|
{
|
||||||
|
QString val = env.value(envVarName());
|
||||||
|
if (val.isEmpty()) return defaultValue;
|
||||||
|
|
||||||
|
bool ok;
|
||||||
|
int res = val.toInt(&ok);
|
||||||
|
if (!ok) {
|
||||||
|
qDebug() << QObject::tr("Expected integer number in environment variable '%1', but got '%2'")
|
||||||
|
.arg(envVarName()).arg(val);
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const QString &s, const IntOption &o)
|
||||||
|
{
|
||||||
|
return o == s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Option that is explicitly set to true or false, and whose value is undefined when unspecified.
|
||||||
|
// May not have a shortcut.
|
||||||
|
class TriStateBoolOption: protected Option
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constexpr TriStateBoolOption(const char *name, bool defaultValue)
|
||||||
|
: Option {name, 0}
|
||||||
|
, m_defaultValue(defaultValue)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const QString &arg) const
|
||||||
|
{
|
||||||
|
QStringList parts = arg.split(QLatin1Char('='));
|
||||||
|
return parts[0] == fullParameter();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString usage() const
|
||||||
|
{
|
||||||
|
return padUsageText(fullParameter() + QLatin1String("=<true|false>"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TriStateBool value(const QString &arg) const
|
||||||
|
{
|
||||||
|
QStringList parts = arg.split(QLatin1Char('='));
|
||||||
|
|
||||||
|
if (parts.size() == 1) {
|
||||||
|
return TriStateBool(m_defaultValue);
|
||||||
|
}
|
||||||
|
else if (parts.size() == 2) {
|
||||||
|
QString val = parts[1];
|
||||||
|
|
||||||
|
if (val.toUpper() == QLatin1String("TRUE") || val == QLatin1String("1")) {
|
||||||
|
return TriStateBool::True;
|
||||||
|
}
|
||||||
|
else if (val.toUpper() == QLatin1String("FALSE") || val == QLatin1String("0")) {
|
||||||
|
return TriStateBool::False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'",
|
||||||
|
"e.g. Parameter '--add-paused' must follow syntax "
|
||||||
|
"'--add-paused=<true|false>'")
|
||||||
|
.arg(fullParameter())
|
||||||
|
.arg(QLatin1String("<true|false>")));
|
||||||
|
}
|
||||||
|
|
||||||
|
TriStateBool value(const QProcessEnvironment &env) const
|
||||||
|
{
|
||||||
|
QString val = env.value(envVarName(), "-1");
|
||||||
|
|
||||||
|
if (val.isEmpty()) {
|
||||||
|
return TriStateBool(m_defaultValue);
|
||||||
|
}
|
||||||
|
else if (val == QLatin1String("-1")) {
|
||||||
|
return TriStateBool::Undefined;
|
||||||
|
}
|
||||||
|
else if (val.toUpper() == QLatin1String("TRUE") || val == QLatin1String("1")) {
|
||||||
|
return TriStateBool::True;
|
||||||
|
}
|
||||||
|
else if (val.toUpper() == QLatin1String("FALSE") || val == QLatin1String("0")) {
|
||||||
|
return TriStateBool::False;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug() << QObject::tr("Expected %1 in environment variable '%2', but got '%3'")
|
||||||
|
.arg(QLatin1String("true|false")).arg(envVarName()).arg(val);
|
||||||
|
return TriStateBool::Undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool m_defaultValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const QString &s, const TriStateBoolOption &o)
|
||||||
|
{
|
||||||
|
return o == s;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const BoolOption SHOW_HELP_OPTION = {"help", 'h'};
|
||||||
|
constexpr const BoolOption SHOW_VERSION_OPTION = {"version", 'v'};
|
||||||
|
#ifdef DISABLE_GUI
|
||||||
|
constexpr const BoolOption DAEMON_OPTION = {"daemon", 'd'};
|
||||||
|
#else
|
||||||
|
constexpr const BoolOption NO_SPLASH_OPTION = {"no-splash"};
|
||||||
|
#endif
|
||||||
|
constexpr const IntOption WEBUI_PORT_OPTION = {"webui-port"};
|
||||||
|
constexpr const StringOption PROFILE_OPTION = {"profile"};
|
||||||
|
constexpr const StringOption CONFIGURATION_OPTION = {"configuration"};
|
||||||
|
constexpr const BoolOption PORTABLE_OPTION = {"portable"};
|
||||||
|
constexpr const BoolOption RELATIVE_FASTRESUME = {"relative-fastresume"};
|
||||||
|
constexpr const StringOption SAVE_PATH_OPTION = {"save-path"};
|
||||||
|
constexpr const TriStateBoolOption PAUSED_OPTION = {"add-paused", true};
|
||||||
|
constexpr const BoolOption SKIP_HASH_CHECK_OPTION = {"skip-hash-check"};
|
||||||
|
constexpr const StringOption CATEGORY_OPTION = {"category"};
|
||||||
|
constexpr const BoolOption SEQUENTIAL_OPTION = {"sequential"};
|
||||||
|
constexpr const BoolOption FIRST_AND_LAST_OPTION = {"first-and-last"};
|
||||||
|
constexpr const TriStateBoolOption SKIP_DIALOG_OPTION = {"skip-dialog", true};
|
||||||
|
}
|
||||||
|
|
||||||
|
QBtCommandLineParameters::QBtCommandLineParameters(const QProcessEnvironment &env)
|
||||||
|
: showHelp(false)
|
||||||
|
, relativeFastresumePaths(RELATIVE_FASTRESUME.value(env))
|
||||||
|
, portableMode(PORTABLE_OPTION.value(env))
|
||||||
|
, skipChecking(SKIP_HASH_CHECK_OPTION.value(env))
|
||||||
|
, sequential(SEQUENTIAL_OPTION.value(env))
|
||||||
|
, firstLastPiecePriority(FIRST_AND_LAST_OPTION.value(env))
|
||||||
|
#ifndef Q_OS_WIN
|
||||||
|
, showVersion(false)
|
||||||
|
#endif
|
||||||
|
#ifndef DISABLE_GUI
|
||||||
|
, noSplash(NO_SPLASH_OPTION.value(env))
|
||||||
|
#else
|
||||||
|
, shouldDaemonize(DAEMON_OPTION.value(env))
|
||||||
|
#endif
|
||||||
|
, webUiPort(WEBUI_PORT_OPTION.value(env, -1))
|
||||||
|
, addPaused(PAUSED_OPTION.value(env))
|
||||||
|
, skipDialog(SKIP_DIALOG_OPTION.value(env))
|
||||||
|
, profileDir(PROFILE_OPTION.value(env))
|
||||||
|
, configurationName(CONFIGURATION_OPTION.value(env))
|
||||||
|
, savePath(SAVE_PATH_OPTION.value(env))
|
||||||
|
, category(CATEGORY_OPTION.value(env))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList QBtCommandLineParameters::paramList() const
|
||||||
|
{
|
||||||
|
QStringList result;
|
||||||
|
// Because we're passing a string list to the currently running
|
||||||
|
// qBittorrent process, we need some way of passing along the options
|
||||||
|
// the user has specified. Here we place special strings that are
|
||||||
|
// almost certainly not going to collide with a file path or URL
|
||||||
|
// specified by the user, and placing them at the beginning of the
|
||||||
|
// string listr so that they will be processed before the list of
|
||||||
|
// torrent paths or URLs.
|
||||||
|
|
||||||
|
if (!savePath.isEmpty())
|
||||||
|
result.append(QString("@savePath=%1").arg(savePath));
|
||||||
|
|
||||||
|
if (addPaused == TriStateBool::True) {
|
||||||
|
result.append(QLatin1String("@addPaused=1"));
|
||||||
|
}
|
||||||
|
else if (addPaused == TriStateBool::False) {
|
||||||
|
result.append(QLatin1String("@addPaused=0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skipChecking)
|
||||||
|
result.append(QLatin1String("@skipChecking"));
|
||||||
|
|
||||||
|
if (!category.isEmpty())
|
||||||
|
result.append(QString("@category=%1").arg(category));
|
||||||
|
|
||||||
|
if (sequential)
|
||||||
|
result.append(QLatin1String("@sequential"));
|
||||||
|
|
||||||
|
if (firstLastPiecePriority)
|
||||||
|
result.append(QLatin1String("@firstLastPiecePriority"));
|
||||||
|
|
||||||
|
if (skipDialog == TriStateBool::True) {
|
||||||
|
result.append(QLatin1String("@skipDialog=1"));
|
||||||
|
}
|
||||||
|
else if (skipDialog == TriStateBool::False) {
|
||||||
|
result.append(QLatin1String("@skipDialog=0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
result += torrents;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QBtCommandLineParameters parseCommandLine(const QStringList &args)
|
||||||
|
{
|
||||||
|
QBtCommandLineParameters result {QProcessEnvironment::systemEnvironment()};
|
||||||
|
|
||||||
|
for (int i = 1; i < args.count(); ++i) {
|
||||||
|
const QString &arg = args[i];
|
||||||
|
|
||||||
|
if ((arg.startsWith("--") && !arg.endsWith(".torrent"))
|
||||||
|
|| (arg.startsWith("-") && (arg.size() == 2))) {
|
||||||
|
// Parse known parameters
|
||||||
|
if ((arg == SHOW_HELP_OPTION)) {
|
||||||
|
result.showHelp = true;
|
||||||
|
}
|
||||||
|
#ifndef Q_OS_WIN
|
||||||
|
else if (arg == SHOW_VERSION_OPTION) {
|
||||||
|
result.showVersion = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else if (arg == WEBUI_PORT_OPTION) {
|
||||||
|
result.webUiPort = WEBUI_PORT_OPTION.value(arg);
|
||||||
|
if ((result.webUiPort < 1) || (result.webUiPort > 65535))
|
||||||
|
throw CommandLineParameterError(QObject::tr("%1 must specify a valid port (1 to 65535).")
|
||||||
|
.arg(QLatin1String("--webui-port")));
|
||||||
|
}
|
||||||
|
#ifndef DISABLE_GUI
|
||||||
|
else if (arg == NO_SPLASH_OPTION) {
|
||||||
|
result.noSplash = true;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
else if (arg == DAEMON_OPTION) {
|
||||||
|
result.shouldDaemonize = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else if (arg == PROFILE_OPTION) {
|
||||||
|
result.profileDir = PROFILE_OPTION.value(arg);
|
||||||
|
}
|
||||||
|
else if (arg == RELATIVE_FASTRESUME) {
|
||||||
|
result.relativeFastresumePaths = true;
|
||||||
|
}
|
||||||
|
else if (arg == PORTABLE_OPTION) {
|
||||||
|
result.portableMode = true;
|
||||||
|
}
|
||||||
|
else if (arg == CONFIGURATION_OPTION) {
|
||||||
|
result.configurationName = CONFIGURATION_OPTION.value(arg);
|
||||||
|
}
|
||||||
|
else if (arg == SAVE_PATH_OPTION) {
|
||||||
|
result.savePath = SAVE_PATH_OPTION.value(arg);
|
||||||
|
}
|
||||||
|
else if (arg == PAUSED_OPTION) {
|
||||||
|
result.addPaused = PAUSED_OPTION.value(arg);
|
||||||
|
}
|
||||||
|
else if (arg == SKIP_HASH_CHECK_OPTION) {
|
||||||
|
result.skipChecking = true;
|
||||||
|
}
|
||||||
|
else if (arg == CATEGORY_OPTION) {
|
||||||
|
result.category = CATEGORY_OPTION.value(arg);
|
||||||
|
}
|
||||||
|
else if (arg == SEQUENTIAL_OPTION) {
|
||||||
|
result.sequential = true;
|
||||||
|
}
|
||||||
|
else if (arg == FIRST_AND_LAST_OPTION) {
|
||||||
|
result.firstLastPiecePriority = true;
|
||||||
|
}
|
||||||
|
else if (arg == SKIP_DIALOG_OPTION) {
|
||||||
|
result.skipDialog = SKIP_DIALOG_OPTION.value(arg);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Unknown argument
|
||||||
|
result.unknownParameter = arg;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QFileInfo torrentPath;
|
||||||
|
torrentPath.setFile(arg);
|
||||||
|
|
||||||
|
if (torrentPath.exists())
|
||||||
|
result.torrents += torrentPath.absoluteFilePath();
|
||||||
|
else
|
||||||
|
result.torrents += arg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
CommandLineParameterError::CommandLineParameterError(const QString &messageForUser)
|
||||||
|
: std::runtime_error(messageForUser.toLocal8Bit().data())
|
||||||
|
, m_messageForUser(messageForUser)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString& CommandLineParameterError::messageForUser() const
|
||||||
|
{
|
||||||
|
return m_messageForUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString wrapText(const QString &text, int initialIndentation = USAGE_TEXT_COLUMN, int wrapAtColumn = WRAP_AT_COLUMN)
|
||||||
|
{
|
||||||
|
QStringList words = text.split(' ');
|
||||||
|
QStringList lines = {words.first()};
|
||||||
|
int currentLineMaxLength = wrapAtColumn - initialIndentation;
|
||||||
|
|
||||||
|
foreach (const QString &word, words.mid(1)) {
|
||||||
|
if (lines.last().length() + word.length() + 1 < currentLineMaxLength) {
|
||||||
|
lines.last().append(" " + word);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lines.append(QString(initialIndentation, ' ') + word);
|
||||||
|
currentLineMaxLength = wrapAtColumn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines.join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString makeUsage(const QString &prgName)
|
||||||
|
{
|
||||||
|
QString text;
|
||||||
|
QTextStream stream(&text, QIODevice::WriteOnly);
|
||||||
|
QString indentation = QString(USAGE_INDENTATION, ' ');
|
||||||
|
|
||||||
|
stream << QObject::tr("Usage:") << '\n';
|
||||||
|
stream << indentation << prgName << QLatin1String(" [options] [(<filename> | <url>)...]") << '\n';
|
||||||
|
|
||||||
|
stream << QObject::tr("Options:") << '\n';
|
||||||
|
#ifndef Q_OS_WIN
|
||||||
|
stream << SHOW_VERSION_OPTION.usage() << wrapText(QObject::tr("Display program version and exit")) << '\n';
|
||||||
|
#endif
|
||||||
|
stream << SHOW_HELP_OPTION.usage() << wrapText(QObject::tr("Display this help message and exit")) << '\n';
|
||||||
|
stream << WEBUI_PORT_OPTION.usage(QObject::tr("port"))
|
||||||
|
<< wrapText(QObject::tr("Change the Web UI port"))
|
||||||
|
<< '\n';
|
||||||
|
#ifndef DISABLE_GUI
|
||||||
|
stream << NO_SPLASH_OPTION.usage() << wrapText(QObject::tr("Disable splash screen")) << '\n';
|
||||||
|
#else
|
||||||
|
stream << DAEMON_OPTION.usage() << wrapText(QObject::tr("Run in daemon-mode (background)")) << '\n';
|
||||||
|
#endif
|
||||||
|
//: Use appropriate short form or abbreviation of "directory"
|
||||||
|
stream << PROFILE_OPTION.usage(QObject::tr("dir"))
|
||||||
|
<< wrapText(QObject::tr("Store configuration files in <dir>")) << '\n';
|
||||||
|
stream << CONFIGURATION_OPTION.usage(QObject::tr("name"))
|
||||||
|
<< wrapText(QObject::tr("Store configuration files in directories qBittorrent_<name>")) << '\n';
|
||||||
|
stream << RELATIVE_FASTRESUME.usage()
|
||||||
|
<< wrapText(QObject::tr("Hack into libtorrent fastresume files and make file paths relative "
|
||||||
|
"to the profile directory")) << '\n';
|
||||||
|
stream << PORTABLE_OPTION.usage()
|
||||||
|
<< wrapText(QObject::tr("Shortcut for %1", "Shortcut for --profile=<exe dir>/profile --relative-fastresume")
|
||||||
|
.arg(QLatin1String("--profile=<exe dir>/profile --relative-fastresume"))) << '\n';
|
||||||
|
stream << Option::padUsageText(QObject::tr("files or URLs"))
|
||||||
|
<< wrapText(QObject::tr("Download the torrents passed by the user")) << '\n'
|
||||||
|
<< '\n';
|
||||||
|
|
||||||
|
stream << wrapText(QObject::tr("Options when adding new torrents:"), 0) << '\n';
|
||||||
|
stream << SAVE_PATH_OPTION.usage(QObject::tr("path")) << wrapText(QObject::tr("Torrent save path")) << '\n';
|
||||||
|
stream << PAUSED_OPTION.usage() << wrapText(QObject::tr("Add torrents as started or paused")) << '\n';
|
||||||
|
stream << SKIP_HASH_CHECK_OPTION.usage() << wrapText(QObject::tr("Skip hash check")) << '\n';
|
||||||
|
stream << CATEGORY_OPTION.usage(QObject::tr("name"))
|
||||||
|
<< wrapText(QObject::tr("Assign torrents to category. If the category doesn't exist, it will be "
|
||||||
|
"created.")) << '\n';
|
||||||
|
stream << SEQUENTIAL_OPTION.usage() << wrapText(QObject::tr("Download files in sequential order")) << '\n';
|
||||||
|
stream << FIRST_AND_LAST_OPTION.usage()
|
||||||
|
<< wrapText(QObject::tr("Download first and last pieces first")) << '\n';
|
||||||
|
stream << SKIP_DIALOG_OPTION.usage()
|
||||||
|
<< wrapText(QObject::tr("Specify whether the \"Add New Torrent\" dialog opens when adding a "
|
||||||
|
"torrent.")) << '\n';
|
||||||
|
stream << '\n';
|
||||||
|
|
||||||
|
stream << wrapText(QObject::tr("Option values may be supplied via environment variables. For option named "
|
||||||
|
"'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper "
|
||||||
|
"case, '-' replaced with '_'). To pass flag values, set the variable to '1' or "
|
||||||
|
"'TRUE'. For example, to disable the splash screen: "), 0) << "\n"
|
||||||
|
<< QLatin1String("QBT_NO_SPLASH=1 ") << prgName << '\n'
|
||||||
|
<< wrapText(QObject::tr("Command line parameters take precedence over environment variables"), 0) << '\n';
|
||||||
|
|
||||||
|
stream << flush;
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayUsage(const QString &prgName)
|
||||||
|
{
|
||||||
|
#ifndef Q_OS_WIN
|
||||||
|
std::cout << qPrintable(makeUsage(prgName)) << std::endl;
|
||||||
|
#else
|
||||||
|
QMessageBox msgBox(QMessageBox::Information, QObject::tr("Help"), makeUsage(prgName), QMessageBox::Ok);
|
||||||
|
msgBox.show(); // Need to be shown or to moveToCenter does not work
|
||||||
|
msgBox.move(Utils::Misc::screenCenter(&msgBox));
|
||||||
|
msgBox.exec();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt4 and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2016 Eugene Shalygin <eugene.shalygin@gmail.com>
|
||||||
|
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006 Christophe Dumez
|
* Copyright (C) 2006 Christophe Dumez
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
@@ -28,46 +30,49 @@
|
|||||||
* Contact : chris@qbittorrent.org
|
* Contact : chris@qbittorrent.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef QINISETTINGS_H
|
#ifndef APP_OPTIONS_H
|
||||||
#define QINISETTINGS_H
|
#define APP_OPTIONS_H
|
||||||
|
|
||||||
#include <QSettings>
|
#include <stdexcept>
|
||||||
|
|
||||||
class QIniSettings : public QSettings {
|
#include <QString>
|
||||||
Q_OBJECT
|
#include <QStringList>
|
||||||
Q_DISABLE_COPY (QIniSettings)
|
|
||||||
|
|
||||||
public:
|
#include "base/tristatebool.h"
|
||||||
QIniSettings(const QString &organization = "qBittorrent", const QString &application = "qBittorrent", QObject *parent = 0 ):
|
|
||||||
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
|
class QProcessEnvironment;
|
||||||
QSettings(QSettings::IniFormat, QSettings::UserScope, organization, application, parent)
|
|
||||||
#else
|
struct QBtCommandLineParameters
|
||||||
QSettings(organization, application, parent)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
|
bool showHelp, relativeFastresumePaths, portableMode, skipChecking, sequential, firstLastPiecePriority;
|
||||||
}
|
#ifndef Q_OS_WIN
|
||||||
|
bool showVersion;
|
||||||
QIniSettings(const QString &fileName, Format format, QObject *parent = 0 ) : QSettings(fileName, format, parent) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
QVariant value(const QString & key, const QVariant &defaultValue = QVariant()) const {
|
|
||||||
QString key_tmp(key);
|
|
||||||
QVariant ret = QSettings::value(key_tmp);
|
|
||||||
if (ret.isNull())
|
|
||||||
return defaultValue;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setValue(const QString &key, const QVariant &val) {
|
|
||||||
QString key_tmp(key);
|
|
||||||
if (format() == QSettings::NativeFormat) // Using registry, don't touch replace here
|
|
||||||
key_tmp.replace("\\", "/");
|
|
||||||
QSettings::setValue(key_tmp, val);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef DISABLE_GUI
|
||||||
|
bool noSplash;
|
||||||
|
#else
|
||||||
|
bool shouldDaemonize;
|
||||||
|
#endif
|
||||||
|
int webUiPort;
|
||||||
|
TriStateBool addPaused, skipDialog;
|
||||||
|
QStringList torrents;
|
||||||
|
QString profileDir, configurationName, savePath, category, unknownParameter;
|
||||||
|
|
||||||
|
QBtCommandLineParameters(const QProcessEnvironment&);
|
||||||
|
QStringList paramList() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QINISETTINGS_H
|
class CommandLineParameterError: public std::runtime_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CommandLineParameterError(const QString &messageForUser);
|
||||||
|
const QString& messageForUser() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const QString m_messageForUser;
|
||||||
|
};
|
||||||
|
|
||||||
|
QBtCommandLineParameters parseCommandLine(const QStringList &args);
|
||||||
|
void displayUsage(const QString &prgName);
|
||||||
|
|
||||||
|
#endif // APP_OPTIONS_H
|
||||||
@@ -135,7 +135,7 @@ void FileLogger::addLogMessage(const Log::Msg &msg)
|
|||||||
|
|
||||||
str << QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString(Qt::ISODate) << " - " << msg.message << endl;
|
str << QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString(Qt::ISODate) << " - " << msg.message << endl;
|
||||||
|
|
||||||
if (m_backup && (m_logFile->size() >= (m_maxSize * 1024 * 1024))) {
|
if (m_backup && (m_logFile->size() >= m_maxSize)) {
|
||||||
closeLogFile();
|
closeLogFile();
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
QString backupLogFilename = m_path + ".bak";
|
QString backupLogFilename = m_path + ".bak";
|
||||||
|
|||||||
236
src/app/main.cpp
@@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QScopedPointer>
|
#include <QScopedPointer>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
// GUI-only includes
|
// GUI-only includes
|
||||||
@@ -43,11 +44,7 @@
|
|||||||
|
|
||||||
#ifdef QBT_STATIC_QT
|
#ifdef QBT_STATIC_QT
|
||||||
#include <QtPlugin>
|
#include <QtPlugin>
|
||||||
#ifdef QBT_USES_QT5
|
|
||||||
Q_IMPORT_PLUGIN(QICOPlugin)
|
Q_IMPORT_PLUGIN(QICOPlugin)
|
||||||
#else
|
|
||||||
Q_IMPORT_PLUGIN(qico)
|
|
||||||
#endif
|
|
||||||
#endif // QBT_STATIC_QT
|
#endif // QBT_STATIC_QT
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -72,9 +69,12 @@ Q_IMPORT_PLUGIN(qico)
|
|||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "application.h"
|
#include "application.h"
|
||||||
|
#include "base/profile.h"
|
||||||
#include "base/utils/misc.h"
|
#include "base/utils/misc.h"
|
||||||
#include "base/preferences.h"
|
#include "base/preferences.h"
|
||||||
|
#include "cmdoptions.h"
|
||||||
|
|
||||||
#include "upgrade.h"
|
#include "upgrade.h"
|
||||||
|
|
||||||
@@ -84,52 +84,27 @@ void sigNormalHandler(int signum);
|
|||||||
void sigAbnormalHandler(int signum);
|
void sigAbnormalHandler(int signum);
|
||||||
// sys_signame[] is only defined in BSD
|
// sys_signame[] is only defined in BSD
|
||||||
const char *sysSigName[] = {
|
const char *sysSigName[] = {
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
"", "", "SIGINT", "", "SIGILL", "", "SIGABRT_COMPAT", "", "SIGFPE", "",
|
||||||
|
"", "SIGSEGV", "", "", "", "SIGTERM", "", "", "", "",
|
||||||
|
"", "SIGBREAK", "SIGABRT", "", "", "", "", "", "", "",
|
||||||
|
"", ""
|
||||||
|
#else
|
||||||
"", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", "SIGBUS", "SIGFPE", "SIGKILL",
|
"", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", "SIGBUS", "SIGFPE", "SIGKILL",
|
||||||
"SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT", "SIGSTOP",
|
"SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT", "SIGSTOP",
|
||||||
"SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGIO",
|
"SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGIO",
|
||||||
"SIGPWR", "SIGUNUSED"
|
"SIGPWR", "SIGUNUSED"
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct QBtCommandLineParameters
|
|
||||||
{
|
|
||||||
bool showHelp;
|
|
||||||
#ifndef Q_OS_WIN
|
|
||||||
bool showVersion;
|
|
||||||
#endif
|
|
||||||
#ifndef DISABLE_GUI
|
|
||||||
bool noSplash;
|
|
||||||
#else
|
|
||||||
bool shouldDaemonize;
|
|
||||||
#endif
|
|
||||||
int webUiPort;
|
|
||||||
QStringList torrents;
|
|
||||||
QString unknownParameter;
|
|
||||||
|
|
||||||
QBtCommandLineParameters()
|
|
||||||
: showHelp(false)
|
|
||||||
#ifndef Q_OS_WIN
|
|
||||||
, showVersion(false)
|
|
||||||
#endif
|
|
||||||
#ifndef DISABLE_GUI
|
|
||||||
, noSplash(Preferences::instance()->isSplashScreenDisabled())
|
|
||||||
#else
|
|
||||||
, shouldDaemonize(false)
|
|
||||||
#endif
|
|
||||||
, webUiPort(Preferences::instance()->getWebUiPort())
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
void reportToUser(const char* str);
|
void reportToUser(const char* str);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void displayVersion();
|
void displayVersion();
|
||||||
void displayUsage(const QString &prg_name);
|
|
||||||
bool userAgreesWithLegalNotice();
|
bool userAgreesWithLegalNotice();
|
||||||
void displayBadArgMessage(const QString &message);
|
void displayBadArgMessage(const QString &message);
|
||||||
QBtCommandLineParameters parseCommandLine();
|
|
||||||
|
|
||||||
#if !defined(DISABLE_GUI)
|
#if !defined(DISABLE_GUI)
|
||||||
void showSplashScreen();
|
void showSplashScreen();
|
||||||
@@ -155,56 +130,41 @@ int main(int argc, char *argv[])
|
|||||||
setupDpi();
|
setupDpi();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
try {
|
||||||
#ifndef DISABLE_GUI
|
|
||||||
migrateRSS();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Create Application
|
// Create Application
|
||||||
QString appId = QLatin1String("qBittorrent-") + Utils::Misc::getUserIDString();
|
QString appId = QLatin1String("qBittorrent-") + Utils::Misc::getUserIDString();
|
||||||
QScopedPointer<Application> app(new Application(appId, argc, argv));
|
QScopedPointer<Application> app(new Application(appId, argc, argv));
|
||||||
|
|
||||||
const QBtCommandLineParameters params = parseCommandLine();
|
#ifndef DISABLE_GUI
|
||||||
|
// after the application object creation because we need a profile to be set already
|
||||||
|
// for the migration
|
||||||
|
migrateRSS();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const QBtCommandLineParameters params = app->commandLineArgs();
|
||||||
|
|
||||||
if (!params.unknownParameter.isEmpty()) {
|
if (!params.unknownParameter.isEmpty()) {
|
||||||
displayBadArgMessage(QObject::tr("%1 is an unknown command line parameter.", "--random-parameter is an unknown command line parameter.")
|
throw CommandLineParameterError(QObject::tr("%1 is an unknown command line parameter.",
|
||||||
|
"--random-parameter is an unknown command line parameter.")
|
||||||
.arg(params.unknownParameter));
|
.arg(params.unknownParameter));
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef Q_OS_WIN
|
#ifndef Q_OS_WIN
|
||||||
if (params.showVersion) {
|
if (params.showVersion) {
|
||||||
if (isOneArg) {
|
if (isOneArg) {
|
||||||
displayVersion();
|
displayVersion();
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
else {
|
throw CommandLineParameterError(QObject::tr("%1 must be the single command line parameter.")
|
||||||
displayBadArgMessage(QObject::tr("%1 must be the single command line parameter.")
|
|
||||||
.arg(QLatin1String("-v (or --version)")));
|
.arg(QLatin1String("-v (or --version)")));
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (params.showHelp) {
|
if (params.showHelp) {
|
||||||
if (isOneArg) {
|
if (isOneArg) {
|
||||||
displayUsage(argv[0]);
|
displayUsage(argv[0]);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
else {
|
throw CommandLineParameterError(QObject::tr("%1 must be the single command line parameter.")
|
||||||
displayBadArgMessage(QObject::tr("%1 must be the single command line parameter.")
|
|
||||||
.arg(QLatin1String("-h (or --help)")));
|
.arg(QLatin1String("-h (or --help)")));
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((params.webUiPort > 0) && (params.webUiPort <= 65535)) {
|
|
||||||
Preferences::instance()->setWebUiPort(params.webUiPort);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
displayBadArgMessage(QObject::tr("%1 must specify the correct port (1 to 65535).")
|
|
||||||
.arg(QLatin1String("--webui-port")));
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set environment variable
|
// Set environment variable
|
||||||
@@ -226,21 +186,20 @@ int main(int argc, char *argv[])
|
|||||||
if (app->isRunning()) {
|
if (app->isRunning()) {
|
||||||
#ifdef DISABLE_GUI
|
#ifdef DISABLE_GUI
|
||||||
if (params.shouldDaemonize) {
|
if (params.shouldDaemonize) {
|
||||||
displayBadArgMessage(QObject::tr("You cannot use %1: qBittorrent is already running for this user.")
|
throw CommandLineParameterError(QObject::tr("You cannot use %1: qBittorrent is already running for this user.")
|
||||||
.arg(QLatin1String("-d (or --daemon)")));
|
.arg(QLatin1String("-d (or --daemon)")));
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
qDebug("qBittorrent is already running for this user.");
|
qDebug("qBittorrent is already running for this user.");
|
||||||
|
|
||||||
Utils::Misc::msleep(300);
|
QThread::msleep(300);
|
||||||
app->sendParams(params.torrents);
|
app->sendParams(params.paramList());
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) && defined(QBT_USES_QT5)
|
#if defined(Q_OS_WIN)
|
||||||
// This affects only Windows apparently and Qt5.
|
// This affects only Windows apparently and Qt5.
|
||||||
// When QNetworkAccessManager is instantiated it regularly starts polling
|
// When QNetworkAccessManager is instantiated it regularly starts polling
|
||||||
// the network interfaces to see what's available and their status.
|
// the network interfaces to see what's available and their status.
|
||||||
@@ -253,17 +212,22 @@ int main(int argc, char *argv[])
|
|||||||
// 3. https://bugreports.qt.io/browse/QTBUG-46015
|
// 3. https://bugreports.qt.io/browse/QTBUG-46015
|
||||||
|
|
||||||
qputenv("QT_BEARER_POLL_TIMEOUT", QByteArray::number(-1));
|
qputenv("QT_BEARER_POLL_TIMEOUT", QByteArray::number(-1));
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
|
||||||
|
// this is the default in Qt6
|
||||||
|
app->setAttribute(Qt::AA_DisableWindowContextHelpButton);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_MAC)
|
#if defined(Q_OS_MAC)
|
||||||
{
|
|
||||||
// Since Apple made difficult for users to set PATH, we set here for convenience.
|
// Since Apple made difficult for users to set PATH, we set here for convenience.
|
||||||
// Users are supposed to install Homebrew Python for search function.
|
// Users are supposed to install Homebrew Python for search function.
|
||||||
// For more info see issue #5571.
|
// For more info see issue #5571.
|
||||||
QByteArray path = "/usr/local/bin:";
|
QByteArray path = "/usr/local/bin:";
|
||||||
path += qgetenv("PATH");
|
path += qgetenv("PATH");
|
||||||
qputenv("PATH", path.constData());
|
qputenv("PATH", path.constData());
|
||||||
}
|
|
||||||
|
// On OS X the standard is to not show icons in the menus
|
||||||
|
app->setAttribute(Qt::AA_DontShowIconsInMenus);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
@@ -273,7 +237,6 @@ int main(int argc, char *argv[])
|
|||||||
&& isatty(fileno(stdin))
|
&& isatty(fileno(stdin))
|
||||||
&& isatty(fileno(stdout)))) return EXIT_FAILURE;
|
&& isatty(fileno(stdout)))) return EXIT_FAILURE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISABLE_GUI
|
#ifdef DISABLE_GUI
|
||||||
if (params.shouldDaemonize) {
|
if (params.shouldDaemonize) {
|
||||||
app.reset(); // Destroy current application
|
app.reset(); // Destroy current application
|
||||||
@@ -290,7 +253,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (!params.noSplash)
|
if (!(params.noSplash || Preferences::instance()->isSplashScreenDisabled()))
|
||||||
showSplashScreen();
|
showSplashScreen();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -301,60 +264,12 @@ int main(int argc, char *argv[])
|
|||||||
signal(SIGSEGV, sigAbnormalHandler);
|
signal(SIGSEGV, sigAbnormalHandler);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return app->exec(params.torrents);
|
return app->exec(params.paramList());
|
||||||
}
|
}
|
||||||
|
catch (CommandLineParameterError &er) {
|
||||||
QBtCommandLineParameters parseCommandLine()
|
displayBadArgMessage(er.messageForUser());
|
||||||
{
|
return EXIT_FAILURE;
|
||||||
QBtCommandLineParameters result;
|
|
||||||
QStringList appArguments = qApp->arguments();
|
|
||||||
|
|
||||||
for (int i = 1; i < appArguments.size(); ++i) {
|
|
||||||
const QString& arg = appArguments[i];
|
|
||||||
|
|
||||||
if ((arg.startsWith("--") && !arg.endsWith(".torrent")) ||
|
|
||||||
(arg.startsWith("-") && arg.size() == 2)) {
|
|
||||||
//Parse known parameters
|
|
||||||
if ((arg == QLatin1String("-h")) || (arg == QLatin1String("--help"))) {
|
|
||||||
result.showHelp = true;
|
|
||||||
}
|
}
|
||||||
#ifndef Q_OS_WIN
|
|
||||||
else if ((arg == QLatin1String("-v")) || (arg == QLatin1String("--version"))) {
|
|
||||||
result.showVersion = true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else if (arg.startsWith(QLatin1String("--webui-port="))) {
|
|
||||||
QStringList parts = arg.split(QLatin1Char('='));
|
|
||||||
if (parts.size() == 2)
|
|
||||||
result.webUiPort = parts.last().toInt();
|
|
||||||
}
|
|
||||||
#ifndef DISABLE_GUI
|
|
||||||
else if (arg == QLatin1String("--no-splash")) {
|
|
||||||
result.noSplash = true;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
else if ((arg == QLatin1String("-d")) || (arg == QLatin1String("--daemon"))) {
|
|
||||||
result.shouldDaemonize = true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else {
|
|
||||||
//Unknown argument
|
|
||||||
result.unknownParameter = arg;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
QFileInfo torrentPath;
|
|
||||||
torrentPath.setFile(arg);
|
|
||||||
|
|
||||||
if (torrentPath.exists())
|
|
||||||
result.torrents += torrentPath.absoluteFilePath();
|
|
||||||
else
|
|
||||||
result.torrents += arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
@@ -372,12 +287,11 @@ void reportToUser(const char* str)
|
|||||||
void sigNormalHandler(int signum)
|
void sigNormalHandler(int signum)
|
||||||
{
|
{
|
||||||
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
const char str1[] = "Catching signal: ";
|
const char msg1[] = "Catching signal: ";
|
||||||
const char *sigName = sysSigName[signum];
|
const char msg2[] = "\nExiting cleanly\n";
|
||||||
const char str2[] = "\nExiting cleanly\n";
|
reportToUser(msg1);
|
||||||
reportToUser(str1);
|
reportToUser(sysSigName[signum]);
|
||||||
reportToUser(sigName);
|
reportToUser(msg2);
|
||||||
reportToUser(str2);
|
|
||||||
#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
signal(signum, SIG_DFL);
|
signal(signum, SIG_DFL);
|
||||||
qApp->exit(); // unsafe, but exit anyway
|
qApp->exit(); // unsafe, but exit anyway
|
||||||
@@ -385,19 +299,20 @@ void sigNormalHandler(int signum)
|
|||||||
|
|
||||||
void sigAbnormalHandler(int signum)
|
void sigAbnormalHandler(int signum)
|
||||||
{
|
{
|
||||||
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
|
||||||
const char str1[] = "\n\n*************************************************************\nCatching signal: ";
|
|
||||||
const char *sigName = sysSigName[signum];
|
const char *sigName = sysSigName[signum];
|
||||||
const char str2[] = "\nPlease file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n"
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
"qBittorrent version: " QBT_VERSION "\n";
|
const char msg[] = "\n\n*************************************************************\n"
|
||||||
reportToUser(str1);
|
"Please file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n"
|
||||||
|
"qBittorrent version: " QBT_VERSION "\n\n"
|
||||||
|
"Caught signal: ";
|
||||||
|
reportToUser(msg);
|
||||||
reportToUser(sigName);
|
reportToUser(sigName);
|
||||||
reportToUser(str2);
|
reportToUser("\n");
|
||||||
print_stacktrace(); // unsafe
|
print_stacktrace(); // unsafe
|
||||||
#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
#ifdef STACKTRACE_WIN
|
#ifdef STACKTRACE_WIN
|
||||||
StraceDlg dlg; // unsafe
|
StraceDlg dlg; // unsafe
|
||||||
dlg.setStacktraceString(straceWin::getBacktrace());
|
dlg.setStacktraceString(QLatin1String(sigName), straceWin::getBacktrace());
|
||||||
dlg.exec();
|
dlg.exec();
|
||||||
#endif // STACKTRACE_WIN
|
#endif // STACKTRACE_WIN
|
||||||
signal(signum, SIG_DFL);
|
signal(signum, SIG_DFL);
|
||||||
@@ -434,53 +349,6 @@ void displayVersion()
|
|||||||
std::cout << qPrintable(qApp->applicationName()) << " " << QBT_VERSION << std::endl;
|
std::cout << qPrintable(qApp->applicationName()) << " " << QBT_VERSION << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString makeUsage(const QString &prg_name)
|
|
||||||
{
|
|
||||||
QString text;
|
|
||||||
|
|
||||||
text += QObject::tr("Usage:") + QLatin1Char('\n');
|
|
||||||
#ifndef Q_OS_WIN
|
|
||||||
text += QLatin1Char('\t') + prg_name + QLatin1String(" (-v | --version)") + QLatin1Char('\n');
|
|
||||||
#endif
|
|
||||||
text += QLatin1Char('\t') + prg_name + QLatin1String(" (-h | --help)") + QLatin1Char('\n');
|
|
||||||
text += QLatin1Char('\t') + prg_name
|
|
||||||
+ QLatin1String(" [--webui-port=<port>]")
|
|
||||||
#ifndef DISABLE_GUI
|
|
||||||
+ QLatin1String(" [--no-splash]")
|
|
||||||
#else
|
|
||||||
+ QLatin1String(" [-d | --daemon]")
|
|
||||||
#endif
|
|
||||||
+ QLatin1String("[(<filename> | <url>)...]") + QLatin1Char('\n');
|
|
||||||
text += QObject::tr("Options:") + QLatin1Char('\n');
|
|
||||||
#ifndef Q_OS_WIN
|
|
||||||
text += QLatin1String("\t-v | --version\t\t") + QObject::tr("Displays program version") + QLatin1Char('\n');
|
|
||||||
#endif
|
|
||||||
text += QLatin1String("\t-h | --help\t\t") + QObject::tr("Displays this help message") + QLatin1Char('\n');
|
|
||||||
text += QLatin1String("\t--webui-port=<port>\t")
|
|
||||||
+ QObject::tr("Changes the Web UI port (current: %1)").arg(QString::number(Preferences::instance()->getWebUiPort()))
|
|
||||||
+ QLatin1Char('\n');
|
|
||||||
#ifndef DISABLE_GUI
|
|
||||||
text += QLatin1String("\t--no-splash\t\t") + QObject::tr("Disable splash screen") + QLatin1Char('\n');
|
|
||||||
#else
|
|
||||||
text += QLatin1String("\t-d | --daemon\t\t") + QObject::tr("Run in daemon-mode (background)") + QLatin1Char('\n');
|
|
||||||
#endif
|
|
||||||
text += QLatin1String("\tfiles or urls\t\t") + QObject::tr("Downloads the torrents passed by the user");
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayUsage(const QString& prg_name)
|
|
||||||
{
|
|
||||||
#ifndef Q_OS_WIN
|
|
||||||
std::cout << qPrintable(makeUsage(prg_name)) << std::endl;
|
|
||||||
#else
|
|
||||||
QMessageBox msgBox(QMessageBox::Information, QObject::tr("Help"), makeUsage(prg_name), QMessageBox::Ok);
|
|
||||||
msgBox.show(); // Need to be shown or to moveToCenter does not work
|
|
||||||
msgBox.move(Utils::Misc::screenCenter(&msgBox));
|
|
||||||
msgBox.exec();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayBadArgMessage(const QString& message)
|
void displayBadArgMessage(const QString& message)
|
||||||
{
|
{
|
||||||
QString help = QObject::tr("Run application with -h option to read about command line parameters.");
|
QString help = QObject::tr("Run application with -h option to read about command line parameters.");
|
||||||
|
|||||||
@@ -16,21 +16,16 @@ else (GUI)
|
|||||||
list(APPEND QBT_QTSINGLEAPPLICATION_SOURCES qtsinglecoreapplication.cpp)
|
list(APPEND QBT_QTSINGLEAPPLICATION_SOURCES qtsinglecoreapplication.cpp)
|
||||||
endif (GUI)
|
endif (GUI)
|
||||||
|
|
||||||
add_library(qtsingleapplication ${QBT_QTSINGLEAPPLICATION_HEADERS} ${QBT_QTSINGLEAPPLICATION_SOURCES})
|
add_library(qtsingleapplication STATIC ${QBT_QTSINGLEAPPLICATION_HEADERS} ${QBT_QTSINGLEAPPLICATION_SOURCES})
|
||||||
target_include_directories(qtsingleapplication INTERFACE "${qtsingleapplication_SOURCE_DIR}")
|
target_include_directories(qtsingleapplication INTERFACE "${qtsingleapplication_SOURCE_DIR}")
|
||||||
|
target_link_qt_components(qtsingleapplication Network)
|
||||||
|
|
||||||
if (QT4_FOUND)
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||||
target_link_libraries(qtsingleapplication Qt4::QtNetwork)
|
target_compile_options(qtsingleapplication PRIVATE "-w") # disable warning for 3rdparty code
|
||||||
else (QT4_FOUND)
|
endif()
|
||||||
target_link_libraries(qtsingleapplication Qt5::Network)
|
|
||||||
endif (QT4_FOUND)
|
|
||||||
|
|
||||||
if (GUI)
|
if (GUI)
|
||||||
if (QT4_FOUND)
|
target_link_qt_components(qtsingleapplication Widgets)
|
||||||
target_link_libraries(qtsingleapplication Qt4::QtGui)
|
|
||||||
else (QT4_FOUND)
|
|
||||||
target_link_libraries(qtsingleapplication Qt5::Widgets)
|
|
||||||
endif(QT4_FOUND)
|
|
||||||
endif (GUI)
|
endif (GUI)
|
||||||
|
|
||||||
add_library(QtSingleApplication::QtSingleApplication ALIAS qtsingleapplication)
|
add_library(QtSingleApplication::QtSingleApplication ALIAS qtsingleapplication)
|
||||||
|
|||||||
@@ -176,8 +176,17 @@ void QtLocalPeer::receiveConnection()
|
|||||||
if (!socket)
|
if (!socket)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (socket->bytesAvailable() < (int)sizeof(quint32))
|
while (true) {
|
||||||
|
if (socket->state() == QLocalSocket::UnconnectedState) {
|
||||||
|
qWarning("QtLocalPeer: Peer disconnected");
|
||||||
|
delete socket;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (socket->bytesAvailable() >= qint64(sizeof(quint32)))
|
||||||
|
break;
|
||||||
socket->waitForReadyRead();
|
socket->waitForReadyRead();
|
||||||
|
}
|
||||||
|
|
||||||
QDataStream ds(socket);
|
QDataStream ds(socket);
|
||||||
QByteArray uMsg;
|
QByteArray uMsg;
|
||||||
quint32 remaining;
|
quint32 remaining;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
/** Print a demangled stack backtrace of the caller function to FILE* out. */
|
/** Print a demangled stack backtrace of the caller function to FILE* out. */
|
||||||
static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63)
|
static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63)
|
||||||
{
|
{
|
||||||
fprintf(out, "stack trace:\n");
|
fprintf(out, "Stack trace:\n");
|
||||||
|
|
||||||
// storage array for stack trace address data
|
// storage array for stack trace address data
|
||||||
std::vector<void *> addrlist(max_frames + 1);
|
std::vector<void *> addrlist(max_frames + 1);
|
||||||
@@ -33,7 +33,7 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
|
|||||||
|
|
||||||
// allocate string which will be filled with the demangled function name
|
// allocate string which will be filled with the demangled function name
|
||||||
size_t funcnamesize = 256;
|
size_t funcnamesize = 256;
|
||||||
char *funcname = (char *)malloc(funcnamesize);
|
char *funcname = static_cast<char *>(malloc(funcnamesize));
|
||||||
|
|
||||||
int functionNamesFound = 0;
|
int functionNamesFound = 0;
|
||||||
// iterate over the returned symbol lines. skip the first, it is the
|
// iterate over the returned symbol lines. skip the first, it is the
|
||||||
|
|||||||
@@ -40,13 +40,13 @@ class StraceDlg : public QDialog, private Ui::errorDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StraceDlg(QWidget* parent = 0)
|
StraceDlg(QWidget *parent = nullptr)
|
||||||
: QDialog(parent)
|
: QDialog(parent)
|
||||||
{
|
{
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setStacktraceString(const QString& trace)
|
void setStacktraceString(const QString &sigName, const QString &trace)
|
||||||
{
|
{
|
||||||
// try to call Qt function as less as possible
|
// try to call Qt function as less as possible
|
||||||
QString htmlStr = QString(
|
QString htmlStr = QString(
|
||||||
@@ -68,13 +68,15 @@ public:
|
|||||||
"Libtorrent version: %1<br/>"
|
"Libtorrent version: %1<br/>"
|
||||||
"Qt version: " QT_VERSION_STR "<br/>"
|
"Qt version: " QT_VERSION_STR "<br/>"
|
||||||
"Boost version: %2<br/>"
|
"Boost version: %2<br/>"
|
||||||
"OS version: %3"
|
"OS version: %3<br/><br/>"
|
||||||
"</font></p><br/>"
|
"Caught signal: %4"
|
||||||
"<pre><code>%4</code></pre>"
|
"</font></p>"
|
||||||
|
"<pre><code>%5</code></pre>"
|
||||||
"<br/><hr><br/><br/>")
|
"<br/><hr><br/><br/>")
|
||||||
.arg(Utils::Misc::libtorrentVersionString())
|
.arg(Utils::Misc::libtorrentVersionString())
|
||||||
.arg(Utils::Misc::boostVersionString())
|
.arg(Utils::Misc::boostVersionString())
|
||||||
.arg(Utils::Misc::osName())
|
.arg(Utils::Misc::osName())
|
||||||
|
.arg(sigName)
|
||||||
.arg(trace);
|
.arg(trace);
|
||||||
|
|
||||||
errorText->setHtml(htmlStr);
|
errorText->setHtml(htmlStr);
|
||||||
|
|||||||
@@ -47,13 +47,16 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
#include <QSettings>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
|
#include "base/profile.h"
|
||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/misc.h"
|
#include "base/utils/misc.h"
|
||||||
#include "base/utils/string.h"
|
#include "base/utils/string.h"
|
||||||
#include "base/preferences.h"
|
#include "base/preferences.h"
|
||||||
#include "base/qinisettings.h"
|
|
||||||
|
|
||||||
bool userAcceptsUpgrade()
|
bool userAcceptsUpgrade()
|
||||||
{
|
{
|
||||||
@@ -119,7 +122,7 @@ bool upgradeResumeFile(const QString &filepath, const QVariantHash &oldTorrent =
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
queuePosition = fastOld.dict_find_int_value("qBt-queuePosition", 0);
|
queuePosition = fastOld.dict_find_int_value("qBt-queuePosition", 0);
|
||||||
fastNew["qBt-name"] = Utils::String::toStdString(oldTorrent.value("name").toString());
|
fastNew["qBt-name"] = oldTorrent.value("name").toString().toStdString();
|
||||||
fastNew["qBt-tempPathDisabled"] = false;
|
fastNew["qBt-tempPathDisabled"] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +148,7 @@ bool upgrade(bool ask = true)
|
|||||||
// Upgrade preferences
|
// Upgrade preferences
|
||||||
Preferences::instance()->upgrade();
|
Preferences::instance()->upgrade();
|
||||||
|
|
||||||
QString backupFolderPath = Utils::Fs::expandPathAbs(Utils::Fs::QDesktopServicesDataLocation() + "BT_backup");
|
QString backupFolderPath = Utils::Fs::expandPathAbs(specialFolderLocation(SpecialFolder::Data) + "BT_backup");
|
||||||
QDir backupFolderDir(backupFolderPath);
|
QDir backupFolderDir(backupFolderPath);
|
||||||
|
|
||||||
// ****************************************************************************************
|
// ****************************************************************************************
|
||||||
@@ -156,15 +159,10 @@ bool upgrade(bool ask = true)
|
|||||||
upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile));
|
upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile));
|
||||||
// ****************************************************************************************
|
// ****************************************************************************************
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
SettingsPtr oldResumeSettings = Profile::instance().applicationSettings(QLatin1String("qBittorrent-resume"));
|
||||||
// native .plist
|
|
||||||
QSettings *oldResumeSettings = new QSettings("qBittorrent", "qBittorrent-resume");
|
|
||||||
#else
|
|
||||||
QIniSettings *oldResumeSettings = new QIniSettings("qBittorrent", "qBittorrent-resume");
|
|
||||||
#endif
|
|
||||||
QString oldResumeFilename = oldResumeSettings->fileName();
|
QString oldResumeFilename = oldResumeSettings->fileName();
|
||||||
QVariantHash oldResumeData = oldResumeSettings->value("torrents").toHash();
|
QVariantHash oldResumeData = oldResumeSettings->value("torrents").toHash();
|
||||||
delete oldResumeSettings;
|
oldResumeSettings.reset();
|
||||||
|
|
||||||
if (oldResumeData.isEmpty()) {
|
if (oldResumeData.isEmpty()) {
|
||||||
Utils::Fs::forceRemove(oldResumeFilename);
|
Utils::Fs::forceRemove(oldResumeFilename);
|
||||||
@@ -192,14 +190,14 @@ bool upgrade(bool ask = true)
|
|||||||
QVariantHash oldTorrent = oldResumeData[hash].toHash();
|
QVariantHash oldTorrent = oldResumeData[hash].toHash();
|
||||||
if (oldTorrent.value("is_magnet", false).toBool()) {
|
if (oldTorrent.value("is_magnet", false).toBool()) {
|
||||||
libtorrent::entry resumeData;
|
libtorrent::entry resumeData;
|
||||||
resumeData["qBt-magnetUri"] = Utils::String::toStdString(oldTorrent.value("magnet_uri").toString());
|
resumeData["qBt-magnetUri"] = oldTorrent.value("magnet_uri").toString().toStdString();
|
||||||
resumeData["qBt-paused"] = false;
|
resumeData["qBt-paused"] = false;
|
||||||
resumeData["qBt-forced"] = false;
|
resumeData["qBt-forced"] = false;
|
||||||
|
|
||||||
resumeData["qBt-savePath"] = Utils::String::toStdString(oldTorrent.value("save_path").toString());
|
resumeData["qBt-savePath"] = oldTorrent.value("save_path").toString().toStdString();
|
||||||
resumeData["qBt-ratioLimit"] = Utils::String::toStdString(QString::number(oldTorrent.value("max_ratio", -2).toReal()));
|
resumeData["qBt-ratioLimit"] = static_cast<int>(oldTorrent.value("max_ratio", -2).toReal() * 1000);
|
||||||
resumeData["qBt-label"] = Utils::String::toStdString(oldTorrent.value("label").toString());
|
resumeData["qBt-label"] = oldTorrent.value("label").toString().toStdString();
|
||||||
resumeData["qBt-name"] = Utils::String::toStdString(oldTorrent.value("name").toString());
|
resumeData["qBt-name"] = oldTorrent.value("name").toString().toStdString();
|
||||||
resumeData["qBt-seedStatus"] = oldTorrent.value("seed").toBool();
|
resumeData["qBt-seedStatus"] = oldTorrent.value("seed").toBool();
|
||||||
resumeData["qBt-tempPathDisabled"] = false;
|
resumeData["qBt-tempPathDisabled"] = false;
|
||||||
|
|
||||||
@@ -231,7 +229,7 @@ bool upgrade(bool ask = true)
|
|||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
void migratePlistToIni(const QString &application)
|
void migratePlistToIni(const QString &application)
|
||||||
{
|
{
|
||||||
QIniSettings iniFile("qBittorrent", application);
|
QSettings iniFile(QSettings::IniFormat, QSettings::UserScope, "qBittorrent", application);
|
||||||
if (!iniFile.allKeys().isEmpty()) return; // We copy the contents of plist, only if inifile does not exist(is empty).
|
if (!iniFile.allKeys().isEmpty()) return; // We copy the contents of plist, only if inifile does not exist(is empty).
|
||||||
|
|
||||||
QSettings *plistFile = new QSettings("qBittorrent", application);
|
QSettings *plistFile = new QSettings("qBittorrent", application);
|
||||||
@@ -260,16 +258,16 @@ void macMigratePlists()
|
|||||||
void migrateRSS()
|
void migrateRSS()
|
||||||
{
|
{
|
||||||
// Copy old feed items to new file if needed
|
// Copy old feed items to new file if needed
|
||||||
QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss-feeds");
|
SettingsPtr qBTRSS = Profile::instance().applicationSettings(QLatin1String("qBittorrent-rss-feeds"));
|
||||||
if (!qBTRSS.allKeys().isEmpty()) return; // We move the contents of RSS old_items only if inifile does not exist (is empty).
|
if (!qBTRSS->allKeys().isEmpty()) return; // We move the contents of RSS old_items only if inifile does not exist (is empty).
|
||||||
|
|
||||||
QIniSettings qBTRSSLegacy("qBittorrent", "qBittorrent-rss");
|
SettingsPtr qBTRSSLegacy = Profile::instance().applicationSettings(QLatin1String("qBittorrent-rss"));
|
||||||
QHash<QString, QVariant> allOldItems = qBTRSSLegacy.value("old_items", QHash<QString, QVariant>()).toHash();
|
QHash<QString, QVariant> allOldItems = qBTRSSLegacy->value("old_items", QHash<QString, QVariant>()).toHash();
|
||||||
|
|
||||||
if (!allOldItems.empty()) {
|
if (!allOldItems.empty()) {
|
||||||
qDebug("Moving %d old items for feeds to qBittorrent-rss-feeds", allOldItems.size());
|
qDebug("Moving %d old items for feeds to qBittorrent-rss-feeds", allOldItems.size());
|
||||||
qBTRSS.setValue("old_items", allOldItems);
|
qBTRSS->setValue("old_items", allOldItems);
|
||||||
qBTRSSLegacy.remove("old_items");
|
qBTRSSLegacy->remove("old_items");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
find_package(ZLIB 1.2.5.2 REQUIRED)
|
find_package(ZLIB 1.2.5.2 REQUIRED)
|
||||||
|
|
||||||
set(QBT_BASE_HEADERS
|
set(QBT_BASE_HEADERS
|
||||||
|
bittorrent/addtorrentparams.h
|
||||||
bittorrent/cachestatus.h
|
bittorrent/cachestatus.h
|
||||||
bittorrent/infohash.h
|
bittorrent/infohash.h
|
||||||
bittorrent/magneturi.h
|
bittorrent/magneturi.h
|
||||||
@@ -33,25 +34,30 @@ net/private/geoipdatabase.h
|
|||||||
net/proxyconfigurationmanager.h
|
net/proxyconfigurationmanager.h
|
||||||
net/reverseresolution.h
|
net/reverseresolution.h
|
||||||
net/smtp.h
|
net/smtp.h
|
||||||
rss/private/rssparser.h
|
private/profile_p.h
|
||||||
rss/rssarticle.h
|
rss/private/rss_parser.h
|
||||||
rss/rssdownloadrule.h
|
rss/rss_article.h
|
||||||
rss/rssdownloadrulelist.h
|
rss/rss_autodownloader.h
|
||||||
rss/rssfeed.h
|
rss/rss_autodownloadrule.h
|
||||||
rss/rssfile.h
|
rss/rss_feed.h
|
||||||
rss/rssfolder.h
|
rss/rss_folder.h
|
||||||
rss/rssmanager.h
|
rss/rss_item.h
|
||||||
|
rss/rss_session.h
|
||||||
utils/fs.h
|
utils/fs.h
|
||||||
utils/gzip.h
|
utils/gzip.h
|
||||||
utils/misc.h
|
utils/misc.h
|
||||||
|
utils/net.h
|
||||||
utils/random.h
|
utils/random.h
|
||||||
utils/string.h
|
utils/string.h
|
||||||
|
utils/version.h
|
||||||
|
asyncfilestorage.h
|
||||||
filesystemwatcher.h
|
filesystemwatcher.h
|
||||||
|
global.h
|
||||||
iconprovider.h
|
iconprovider.h
|
||||||
indexrange.h
|
indexrange.h
|
||||||
logger.h
|
logger.h
|
||||||
preferences.h
|
preferences.h
|
||||||
qinisettings.h
|
profile.h
|
||||||
scanfoldersmodel.h
|
scanfoldersmodel.h
|
||||||
searchengine.h
|
searchengine.h
|
||||||
settingsstorage.h
|
settingsstorage.h
|
||||||
@@ -63,7 +69,6 @@ unicodestrings.h
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(QBT_BASE_SOURCES
|
set(QBT_BASE_SOURCES
|
||||||
bittorrent/cachestatus.cpp
|
|
||||||
bittorrent/infohash.cpp
|
bittorrent/infohash.cpp
|
||||||
bittorrent/magneturi.cpp
|
bittorrent/magneturi.cpp
|
||||||
bittorrent/peerinfo.cpp
|
bittorrent/peerinfo.cpp
|
||||||
@@ -73,7 +78,6 @@ bittorrent/private/resumedatasavingmanager.cpp
|
|||||||
bittorrent/private/speedmonitor.cpp
|
bittorrent/private/speedmonitor.cpp
|
||||||
bittorrent/private/statistics.cpp
|
bittorrent/private/statistics.cpp
|
||||||
bittorrent/session.cpp
|
bittorrent/session.cpp
|
||||||
bittorrent/sessionstatus.cpp
|
|
||||||
bittorrent/torrentcreatorthread.cpp
|
bittorrent/torrentcreatorthread.cpp
|
||||||
bittorrent/torrenthandle.cpp
|
bittorrent/torrenthandle.cpp
|
||||||
bittorrent/torrentinfo.cpp
|
bittorrent/torrentinfo.cpp
|
||||||
@@ -93,23 +97,27 @@ net/private/geoipdatabase.cpp
|
|||||||
net/proxyconfigurationmanager.cpp
|
net/proxyconfigurationmanager.cpp
|
||||||
net/reverseresolution.cpp
|
net/reverseresolution.cpp
|
||||||
net/smtp.cpp
|
net/smtp.cpp
|
||||||
rss/private/rssparser.cpp
|
private/profile_p.cpp
|
||||||
rss/rssarticle.cpp
|
rss/private/rss_parser.cpp
|
||||||
rss/rssdownloadrule.cpp
|
rss/rss_article.cpp
|
||||||
rss/rssdownloadrulelist.cpp
|
rss/rss_autodownloader.cpp
|
||||||
rss/rssfeed.cpp
|
rss/rss_autodownloadrule.cpp
|
||||||
rss/rssfile.cpp
|
rss/rss_feed.cpp
|
||||||
rss/rssfolder.cpp
|
rss/rss_folder.cpp
|
||||||
rss/rssmanager.cpp
|
rss/rss_item.cpp
|
||||||
|
rss/rss_session.cpp
|
||||||
utils/fs.cpp
|
utils/fs.cpp
|
||||||
utils/gzip.cpp
|
utils/gzip.cpp
|
||||||
utils/misc.cpp
|
utils/misc.cpp
|
||||||
|
utils/net.cpp
|
||||||
utils/random.cpp
|
utils/random.cpp
|
||||||
utils/string.cpp
|
utils/string.cpp
|
||||||
|
asyncfilestorage.cpp
|
||||||
filesystemwatcher.cpp
|
filesystemwatcher.cpp
|
||||||
iconprovider.cpp
|
iconprovider.cpp
|
||||||
logger.cpp
|
logger.cpp
|
||||||
preferences.cpp
|
preferences.cpp
|
||||||
|
profile.cpp
|
||||||
scanfoldersmodel.cpp
|
scanfoldersmodel.cpp
|
||||||
searchengine.cpp
|
searchengine.cpp
|
||||||
settingsstorage.cpp
|
settingsstorage.cpp
|
||||||
@@ -121,15 +129,10 @@ tristatebool.cpp
|
|||||||
add_library(qbt_base STATIC ${QBT_BASE_HEADERS} ${QBT_BASE_SOURCES})
|
add_library(qbt_base STATIC ${QBT_BASE_HEADERS} ${QBT_BASE_SOURCES})
|
||||||
target_link_libraries(qbt_base PRIVATE ZLIB::ZLIB PUBLIC LibtorrentRasterbar::LibTorrent)
|
target_link_libraries(qbt_base PRIVATE ZLIB::ZLIB PUBLIC LibtorrentRasterbar::LibTorrent)
|
||||||
target_link_qt_components(qbt_base PUBLIC Core Network Xml)
|
target_link_qt_components(qbt_base PUBLIC Core Network Xml)
|
||||||
if (QT4_FOUND)
|
|
||||||
if (GUI)
|
|
||||||
target_link_libraries(qbt_base PUBLIC Qt4::QtGui)
|
|
||||||
endif (GUI)
|
|
||||||
else (QT4_FOUND)
|
|
||||||
if (GUI)
|
if (GUI)
|
||||||
target_link_libraries(qbt_base PUBLIC Qt5::Gui Qt5::Widgets)
|
target_link_libraries(qbt_base PUBLIC Qt5::Gui Qt5::Widgets)
|
||||||
endif (GUI)
|
endif (GUI)
|
||||||
endif (QT4_FOUND)
|
|
||||||
|
|
||||||
if (DBUS)
|
if (DBUS)
|
||||||
target_link_qt_components(qbt_base PRIVATE DBus)
|
target_link_qt_components(qbt_base PRIVATE DBus)
|
||||||
@@ -138,5 +141,6 @@ endif ()
|
|||||||
if (APPLE)
|
if (APPLE)
|
||||||
find_library(IOKit_LIBRARY IOKit)
|
find_library(IOKit_LIBRARY IOKit)
|
||||||
find_library(Carbon_LIBRARY Carbon)
|
find_library(Carbon_LIBRARY Carbon)
|
||||||
target_link_libraries(qbt_base PRIVATE ${Carbon_LIBRARY} ${IOKit_LIBRARY})
|
find_library(AppKit_LIBRARY AppKit)
|
||||||
|
target_link_libraries(qbt_base PRIVATE ${Carbon_LIBRARY} ${IOKit_LIBRARY} ${AppKit_LIBRARY})
|
||||||
endif (APPLE)
|
endif (APPLE)
|
||||||
|
|||||||
88
src/base/asyncfilestorage.cpp
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "asyncfilestorage.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QMetaObject>
|
||||||
|
#include <QSaveFile>
|
||||||
|
|
||||||
|
AsyncFileStorage::AsyncFileStorage(const QString &storageFolderPath, QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
, m_storageDir(storageFolderPath)
|
||||||
|
, m_lockFile(m_storageDir.absoluteFilePath(QStringLiteral("storage.lock")))
|
||||||
|
{
|
||||||
|
if (!m_storageDir.mkpath(m_storageDir.absolutePath()))
|
||||||
|
throw AsyncFileStorageError(
|
||||||
|
QString("Could not create directory '%1'.").arg(m_storageDir.absolutePath()));
|
||||||
|
|
||||||
|
// TODO: This folder locking approach does not work for UNIX systems. Implement it.
|
||||||
|
if (!m_lockFile.open(QFile::WriteOnly))
|
||||||
|
throw AsyncFileStorageError(m_lockFile.errorString());
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncFileStorage::~AsyncFileStorage()
|
||||||
|
{
|
||||||
|
m_lockFile.close();
|
||||||
|
m_lockFile.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AsyncFileStorage::store(const QString &fileName, const QByteArray &data)
|
||||||
|
{
|
||||||
|
QMetaObject::invokeMethod(this, "store_impl", Qt::QueuedConnection
|
||||||
|
, Q_ARG(QString, fileName), Q_ARG(QByteArray, data));
|
||||||
|
}
|
||||||
|
|
||||||
|
QDir AsyncFileStorage::storageDir() const
|
||||||
|
{
|
||||||
|
return m_storageDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AsyncFileStorage::store_impl(const QString &fileName, const QByteArray &data)
|
||||||
|
{
|
||||||
|
const QString filePath = m_storageDir.absoluteFilePath(fileName);
|
||||||
|
QSaveFile file(filePath);
|
||||||
|
qDebug() << "AsyncFileStorage: Saving data to" << filePath;
|
||||||
|
if (file.open(QIODevice::WriteOnly)) {
|
||||||
|
file.write(data);
|
||||||
|
if (!file.commit()) {
|
||||||
|
qDebug() << "AsyncFileStorage: Failed to save data";
|
||||||
|
emit failed(filePath, file.errorString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncFileStorageError::AsyncFileStorageError(const QString &message)
|
||||||
|
: std::runtime_error(message.toUtf8().data())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AsyncFileStorageError::message() const
|
||||||
|
{
|
||||||
|
return what();
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt4 and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2006 Christophe Dumez
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -24,45 +24,41 @@
|
|||||||
* modify file(s), you may extend this exception to your version of the file(s),
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*
|
|
||||||
* Contact : chris@qbittorrent.org
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PREVIEWSELECT_H
|
#pragma once
|
||||||
#define PREVIEWSELECT_H
|
|
||||||
|
|
||||||
#include <QDialog>
|
#include <stdexcept>
|
||||||
#include <QList>
|
|
||||||
#include "ui_preview.h"
|
|
||||||
#include "base/bittorrent/torrenthandle.h"
|
|
||||||
|
|
||||||
class PreviewListDelegate;
|
#include <QDir>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
class AsyncFileStorageError: public std::runtime_error
|
||||||
class QStandardItemModel;
|
{
|
||||||
QT_END_NAMESPACE
|
public:
|
||||||
|
explicit AsyncFileStorageError(const QString &message);
|
||||||
|
QString message() const;
|
||||||
|
};
|
||||||
|
|
||||||
class PreviewSelect: public QDialog, private Ui::preview {
|
class AsyncFileStorage: public QObject
|
||||||
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum PreviewColumn { NAME, SIZE, PROGRESS, FILE_INDEX, NB_COLUMNS };
|
explicit AsyncFileStorage(const QString &storageFolderPath, QObject *parent = nullptr);
|
||||||
|
~AsyncFileStorage() override;
|
||||||
|
|
||||||
public:
|
void store(const QString &fileName, const QByteArray &data);
|
||||||
PreviewSelect(QWidget* parent, BitTorrent::TorrentHandle *const torrent);
|
|
||||||
~PreviewSelect();
|
QDir storageDir() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void readyToPreviewFile(QString) const;
|
void failed(const QString &fileName, const QString &errorString);
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void on_previewButton_clicked();
|
|
||||||
void on_cancelButton_clicked();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QStandardItemModel *previewListModel;
|
Q_INVOKABLE void store_impl(const QString &fileName, const QByteArray &data);
|
||||||
PreviewListDelegate *listDelegate;
|
|
||||||
BitTorrent::TorrentHandle *const m_torrent;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
QDir m_storageDir;
|
||||||
|
QFile m_lockFile;
|
||||||
|
};
|
||||||
@@ -1,116 +1,124 @@
|
|||||||
HEADERS += \
|
HEADERS += \
|
||||||
$$PWD/types.h \
|
$$PWD/asyncfilestorage.h \
|
||||||
$$PWD/tristatebool.h \
|
$$PWD/bittorrent/addtorrentparams.h \
|
||||||
|
$$PWD/bittorrent/cachestatus.h \
|
||||||
|
$$PWD/bittorrent/infohash.h \
|
||||||
|
$$PWD/bittorrent/magneturi.h \
|
||||||
|
$$PWD/bittorrent/peerinfo.h \
|
||||||
|
$$PWD/bittorrent/private/bandwidthscheduler.h \
|
||||||
|
$$PWD/bittorrent/private/filterparserthread.h \
|
||||||
|
$$PWD/bittorrent/private/resumedatasavingmanager.h \
|
||||||
|
$$PWD/bittorrent/private/speedmonitor.h \
|
||||||
|
$$PWD/bittorrent/private/statistics.h \
|
||||||
|
$$PWD/bittorrent/session.h \
|
||||||
|
$$PWD/bittorrent/sessionstatus.h \
|
||||||
|
$$PWD/bittorrent/torrentcreatorthread.h \
|
||||||
|
$$PWD/bittorrent/torrenthandle.h \
|
||||||
|
$$PWD/bittorrent/torrentinfo.h \
|
||||||
|
$$PWD/bittorrent/tracker.h \
|
||||||
|
$$PWD/bittorrent/trackerentry.h \
|
||||||
$$PWD/filesystemwatcher.h \
|
$$PWD/filesystemwatcher.h \
|
||||||
$$PWD/qinisettings.h \
|
$$PWD/global.h \
|
||||||
$$PWD/logger.h \
|
|
||||||
$$PWD/settingsstorage.h \
|
|
||||||
$$PWD/settingvalue.h \
|
|
||||||
$$PWD/preferences.h \
|
|
||||||
$$PWD/indexrange.h \
|
|
||||||
$$PWD/iconprovider.h \
|
|
||||||
$$PWD/http/irequesthandler.h \
|
|
||||||
$$PWD/http/connection.h \
|
$$PWD/http/connection.h \
|
||||||
|
$$PWD/http/irequesthandler.h \
|
||||||
$$PWD/http/requestparser.h \
|
$$PWD/http/requestparser.h \
|
||||||
|
$$PWD/http/responsebuilder.h \
|
||||||
$$PWD/http/responsegenerator.h \
|
$$PWD/http/responsegenerator.h \
|
||||||
$$PWD/http/server.h \
|
$$PWD/http/server.h \
|
||||||
$$PWD/http/types.h \
|
$$PWD/http/types.h \
|
||||||
$$PWD/http/responsebuilder.h \
|
$$PWD/iconprovider.h \
|
||||||
|
$$PWD/indexrange.h \
|
||||||
|
$$PWD/logger.h \
|
||||||
$$PWD/net/dnsupdater.h \
|
$$PWD/net/dnsupdater.h \
|
||||||
$$PWD/net/downloadmanager.h \
|
|
||||||
$$PWD/net/downloadhandler.h \
|
$$PWD/net/downloadhandler.h \
|
||||||
|
$$PWD/net/downloadmanager.h \
|
||||||
$$PWD/net/geoipmanager.h \
|
$$PWD/net/geoipmanager.h \
|
||||||
$$PWD/net/portforwarder.h \
|
$$PWD/net/portforwarder.h \
|
||||||
|
$$PWD/net/private/geoipdatabase.h \
|
||||||
$$PWD/net/proxyconfigurationmanager.h \
|
$$PWD/net/proxyconfigurationmanager.h \
|
||||||
$$PWD/net/reverseresolution.h \
|
$$PWD/net/reverseresolution.h \
|
||||||
$$PWD/net/smtp.h \
|
$$PWD/net/smtp.h \
|
||||||
$$PWD/net/private/geoipdatabase.h \
|
$$PWD/preferences.h \
|
||||||
$$PWD/bittorrent/infohash.h \
|
$$PWD/private/profile_p.h \
|
||||||
$$PWD/bittorrent/session.h \
|
$$PWD/profile.h \
|
||||||
$$PWD/bittorrent/sessionstatus.h \
|
$$PWD/rss/private/rss_parser.h \
|
||||||
$$PWD/bittorrent/cachestatus.h \
|
$$PWD/rss/rss_article.h \
|
||||||
$$PWD/bittorrent/magneturi.h \
|
$$PWD/rss/rss_autodownloader.h \
|
||||||
$$PWD/bittorrent/torrentinfo.h \
|
$$PWD/rss/rss_autodownloadrule.h \
|
||||||
$$PWD/bittorrent/torrenthandle.h \
|
$$PWD/rss/rss_feed.h \
|
||||||
$$PWD/bittorrent/peerinfo.h \
|
$$PWD/rss/rss_folder.h \
|
||||||
$$PWD/bittorrent/trackerentry.h \
|
$$PWD/rss/rss_item.h \
|
||||||
$$PWD/bittorrent/tracker.h \
|
$$PWD/rss/rss_session.h \
|
||||||
$$PWD/bittorrent/torrentcreatorthread.h \
|
$$PWD/scanfoldersmodel.h \
|
||||||
$$PWD/bittorrent/private/speedmonitor.h \
|
$$PWD/searchengine.h \
|
||||||
$$PWD/bittorrent/private/bandwidthscheduler.h \
|
$$PWD/settingsstorage.h \
|
||||||
$$PWD/bittorrent/private/filterparserthread.h \
|
$$PWD/settingvalue.h \
|
||||||
$$PWD/bittorrent/private/statistics.h \
|
$$PWD/torrentfileguard.h \
|
||||||
$$PWD/bittorrent/private/resumedatasavingmanager.h \
|
$$PWD/torrentfilter.h \
|
||||||
$$PWD/rss/rssmanager.h \
|
$$PWD/tristatebool.h \
|
||||||
$$PWD/rss/rssfeed.h \
|
$$PWD/types.h \
|
||||||
$$PWD/rss/rssfolder.h \
|
$$PWD/unicodestrings.h \
|
||||||
$$PWD/rss/rssfile.h \
|
|
||||||
$$PWD/rss/rssarticle.h \
|
|
||||||
$$PWD/rss/rssdownloadrule.h \
|
|
||||||
$$PWD/rss/rssdownloadrulelist.h \
|
|
||||||
$$PWD/rss/private/rssparser.h \
|
|
||||||
$$PWD/utils/fs.h \
|
$$PWD/utils/fs.h \
|
||||||
$$PWD/utils/gzip.h \
|
$$PWD/utils/gzip.h \
|
||||||
$$PWD/utils/misc.h \
|
$$PWD/utils/misc.h \
|
||||||
|
$$PWD/utils/net.h \
|
||||||
$$PWD/utils/random.h \
|
$$PWD/utils/random.h \
|
||||||
$$PWD/utils/string.h \
|
$$PWD/utils/string.h \
|
||||||
$$PWD/unicodestrings.h \
|
$$PWD/utils/version.h
|
||||||
$$PWD/torrentfileguard.h \
|
|
||||||
$$PWD/torrentfilter.h \
|
|
||||||
$$PWD/scanfoldersmodel.h \
|
|
||||||
$$PWD/searchengine.h
|
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
$$PWD/tristatebool.cpp \
|
$$PWD/asyncfilestorage.cpp \
|
||||||
|
$$PWD/bittorrent/infohash.cpp \
|
||||||
|
$$PWD/bittorrent/magneturi.cpp \
|
||||||
|
$$PWD/bittorrent/peerinfo.cpp \
|
||||||
|
$$PWD/bittorrent/private/bandwidthscheduler.cpp \
|
||||||
|
$$PWD/bittorrent/private/filterparserthread.cpp \
|
||||||
|
$$PWD/bittorrent/private/resumedatasavingmanager.cpp \
|
||||||
|
$$PWD/bittorrent/private/speedmonitor.cpp \
|
||||||
|
$$PWD/bittorrent/private/statistics.cpp \
|
||||||
|
$$PWD/bittorrent/session.cpp \
|
||||||
|
$$PWD/bittorrent/torrentcreatorthread.cpp \
|
||||||
|
$$PWD/bittorrent/torrenthandle.cpp \
|
||||||
|
$$PWD/bittorrent/torrentinfo.cpp \
|
||||||
|
$$PWD/bittorrent/tracker.cpp \
|
||||||
|
$$PWD/bittorrent/trackerentry.cpp \
|
||||||
$$PWD/filesystemwatcher.cpp \
|
$$PWD/filesystemwatcher.cpp \
|
||||||
$$PWD/logger.cpp \
|
|
||||||
$$PWD/settingsstorage.cpp \
|
|
||||||
$$PWD/preferences.cpp \
|
|
||||||
$$PWD/iconprovider.cpp \
|
|
||||||
$$PWD/http/connection.cpp \
|
$$PWD/http/connection.cpp \
|
||||||
$$PWD/http/requestparser.cpp \
|
$$PWD/http/requestparser.cpp \
|
||||||
|
$$PWD/http/responsebuilder.cpp \
|
||||||
$$PWD/http/responsegenerator.cpp \
|
$$PWD/http/responsegenerator.cpp \
|
||||||
$$PWD/http/server.cpp \
|
$$PWD/http/server.cpp \
|
||||||
$$PWD/http/responsebuilder.cpp \
|
$$PWD/iconprovider.cpp \
|
||||||
|
$$PWD/logger.cpp \
|
||||||
$$PWD/net/dnsupdater.cpp \
|
$$PWD/net/dnsupdater.cpp \
|
||||||
$$PWD/net/downloadmanager.cpp \
|
|
||||||
$$PWD/net/downloadhandler.cpp \
|
$$PWD/net/downloadhandler.cpp \
|
||||||
|
$$PWD/net/downloadmanager.cpp \
|
||||||
$$PWD/net/geoipmanager.cpp \
|
$$PWD/net/geoipmanager.cpp \
|
||||||
$$PWD/net/portforwarder.cpp \
|
$$PWD/net/portforwarder.cpp \
|
||||||
|
$$PWD/net/private/geoipdatabase.cpp \
|
||||||
$$PWD/net/proxyconfigurationmanager.cpp \
|
$$PWD/net/proxyconfigurationmanager.cpp \
|
||||||
$$PWD/net/reverseresolution.cpp \
|
$$PWD/net/reverseresolution.cpp \
|
||||||
$$PWD/net/smtp.cpp \
|
$$PWD/net/smtp.cpp \
|
||||||
$$PWD/net/private/geoipdatabase.cpp \
|
$$PWD/preferences.cpp \
|
||||||
$$PWD/bittorrent/infohash.cpp \
|
$$PWD/private/profile_p.cpp \
|
||||||
$$PWD/bittorrent/session.cpp \
|
$$PWD/profile.cpp \
|
||||||
$$PWD/bittorrent/sessionstatus.cpp \
|
$$PWD/rss/private/rss_parser.cpp \
|
||||||
$$PWD/bittorrent/cachestatus.cpp \
|
$$PWD/rss/rss_article.cpp \
|
||||||
$$PWD/bittorrent/magneturi.cpp \
|
$$PWD/rss/rss_autodownloader.cpp \
|
||||||
$$PWD/bittorrent/torrentinfo.cpp \
|
$$PWD/rss/rss_autodownloadrule.cpp \
|
||||||
$$PWD/bittorrent/torrenthandle.cpp \
|
$$PWD/rss/rss_feed.cpp \
|
||||||
$$PWD/bittorrent/peerinfo.cpp \
|
$$PWD/rss/rss_folder.cpp \
|
||||||
$$PWD/bittorrent/trackerentry.cpp \
|
$$PWD/rss/rss_item.cpp \
|
||||||
$$PWD/bittorrent/tracker.cpp \
|
$$PWD/rss/rss_session.cpp \
|
||||||
$$PWD/bittorrent/torrentcreatorthread.cpp \
|
$$PWD/scanfoldersmodel.cpp \
|
||||||
$$PWD/bittorrent/private/speedmonitor.cpp \
|
$$PWD/searchengine.cpp \
|
||||||
$$PWD/bittorrent/private/bandwidthscheduler.cpp \
|
$$PWD/settingsstorage.cpp \
|
||||||
$$PWD/bittorrent/private/filterparserthread.cpp \
|
$$PWD/torrentfileguard.cpp \
|
||||||
$$PWD/bittorrent/private/statistics.cpp \
|
$$PWD/torrentfilter.cpp \
|
||||||
$$PWD/bittorrent/private/resumedatasavingmanager.cpp \
|
$$PWD/tristatebool.cpp \
|
||||||
$$PWD/rss/rssmanager.cpp \
|
|
||||||
$$PWD/rss/rssfeed.cpp \
|
|
||||||
$$PWD/rss/rssfolder.cpp \
|
|
||||||
$$PWD/rss/rssarticle.cpp \
|
|
||||||
$$PWD/rss/rssdownloadrule.cpp \
|
|
||||||
$$PWD/rss/rssdownloadrulelist.cpp \
|
|
||||||
$$PWD/rss/rssfile.cpp \
|
|
||||||
$$PWD/rss/private/rssparser.cpp \
|
|
||||||
$$PWD/utils/fs.cpp \
|
$$PWD/utils/fs.cpp \
|
||||||
$$PWD/utils/gzip.cpp \
|
$$PWD/utils/gzip.cpp \
|
||||||
$$PWD/utils/misc.cpp \
|
$$PWD/utils/misc.cpp \
|
||||||
|
$$PWD/utils/net.cpp \
|
||||||
$$PWD/utils/random.cpp \
|
$$PWD/utils/random.cpp \
|
||||||
$$PWD/utils/string.cpp \
|
$$PWD/utils/string.cpp
|
||||||
$$PWD/torrentfileguard.cpp \
|
|
||||||
$$PWD/torrentfilter.cpp \
|
|
||||||
$$PWD/scanfoldersmodel.cpp \
|
|
||||||
$$PWD/searchengine.cpp
|
|
||||||
|
|||||||
@@ -26,44 +26,33 @@
|
|||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libtorrent/version.hpp>
|
#pragma once
|
||||||
#include "cachestatus.h"
|
|
||||||
|
|
||||||
using namespace BitTorrent;
|
#include <QSet>
|
||||||
|
#include <QString>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
CacheStatus::CacheStatus(const libtorrent::cache_status &nativeStatus)
|
#include "../tristatebool.h"
|
||||||
: m_nativeStatus(nativeStatus)
|
|
||||||
|
namespace BitTorrent
|
||||||
{
|
{
|
||||||
}
|
struct AddTorrentParams
|
||||||
|
|
||||||
int CacheStatus::totalUsedBuffers() const
|
|
||||||
{
|
{
|
||||||
return m_nativeStatus.total_used_buffers;
|
QString name;
|
||||||
}
|
QString category;
|
||||||
|
QSet<QString> tags;
|
||||||
qreal CacheStatus::readRatio() const
|
QString savePath;
|
||||||
{
|
bool disableTempPath = false; // e.g. for imported torrents
|
||||||
if (m_nativeStatus.blocks_read > 0)
|
bool sequential = false;
|
||||||
return (static_cast<qreal>(m_nativeStatus.blocks_read_hit) / m_nativeStatus.blocks_read);
|
bool firstLastPiecePriority = false;
|
||||||
else
|
TriStateBool addForced;
|
||||||
return -1;
|
TriStateBool addPaused;
|
||||||
}
|
QVector<int> filePriorities; // used if TorrentInfo is set
|
||||||
|
bool ignoreShareLimits = false;
|
||||||
int CacheStatus::jobQueueLength() const
|
bool skipChecking = false;
|
||||||
{
|
TriStateBool createSubfolder;
|
||||||
#if LIBTORRENT_VERSION_NUM < 10100
|
TriStateBool useAutoTMM;
|
||||||
return m_nativeStatus.job_queue_length;
|
int uploadLimit = -1;
|
||||||
#else
|
int downloadLimit = -1;
|
||||||
return m_nativeStatus.queued_jobs;
|
};
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int CacheStatus::averageJobTime() const
|
|
||||||
{
|
|
||||||
return m_nativeStatus.average_job_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
qlonglong CacheStatus::queuedBytes() const
|
|
||||||
{
|
|
||||||
return m_nativeStatus.queued_bytes;
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2015 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2015, 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -30,23 +30,16 @@
|
|||||||
#define BITTORRENT_CACHESTATUS_H
|
#define BITTORRENT_CACHESTATUS_H
|
||||||
|
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
#include <libtorrent/disk_io_thread.hpp>
|
|
||||||
|
|
||||||
namespace BitTorrent
|
namespace BitTorrent
|
||||||
{
|
{
|
||||||
class CacheStatus
|
struct CacheStatus
|
||||||
{
|
{
|
||||||
public:
|
quint64 totalUsedBuffers = 0;
|
||||||
CacheStatus(const libtorrent::cache_status &nativeStatus);
|
quint64 jobQueueLength = 0;
|
||||||
|
quint64 averageJobTime = 0;
|
||||||
int totalUsedBuffers() const;
|
quint64 queuedBytes = 0;
|
||||||
qreal readRatio() const;
|
qreal readRatio = 0.0;
|
||||||
int jobQueueLength() const;
|
|
||||||
int averageJobTime() const;
|
|
||||||
qlonglong queuedBytes() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
libtorrent::cache_status m_nativeStatus;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ InfoHash::InfoHash(const libtorrent::sha1_hash &nativeHash)
|
|||||||
, m_nativeHash(nativeHash)
|
, m_nativeHash(nativeHash)
|
||||||
{
|
{
|
||||||
char out[(libtorrent::sha1_hash::size * 2) + 1];
|
char out[(libtorrent::sha1_hash::size * 2) + 1];
|
||||||
libtorrent::to_hex((char const*)&m_nativeHash[0], libtorrent::sha1_hash::size, out);
|
libtorrent::to_hex(reinterpret_cast<const char*>(&m_nativeHash[0]), libtorrent::sha1_hash::size, out);
|
||||||
m_hashString = QString(out);
|
m_hashString = QString(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ InfoHash::InfoHash(const QString &hashString)
|
|||||||
{
|
{
|
||||||
QByteArray raw = m_hashString.toLatin1();
|
QByteArray raw = m_hashString.toLatin1();
|
||||||
if (raw.size() == 40)
|
if (raw.size() == 40)
|
||||||
m_valid = libtorrent::from_hex(raw.constData(), 40, (char*)&m_nativeHash[0]);
|
m_valid = libtorrent::from_hex(raw.constData(), 40, reinterpret_cast<char*>(&m_nativeHash[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
#ifndef BITTORRENT_INFOHASH_H
|
#ifndef BITTORRENT_INFOHASH_H
|
||||||
#define BITTORRENT_INFOHASH_H
|
#define BITTORRENT_INFOHASH_H
|
||||||
|
|
||||||
#include <libtorrent/sha1_hash.hpp>
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
#include <libtorrent/sha1_hash.hpp>
|
||||||
|
|
||||||
namespace BitTorrent
|
namespace BitTorrent
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -80,10 +80,10 @@ MagnetUri::MagnetUri(const QString &source)
|
|||||||
|
|
||||||
m_valid = true;
|
m_valid = true;
|
||||||
m_hash = m_addTorrentParams.info_hash;
|
m_hash = m_addTorrentParams.info_hash;
|
||||||
m_name = Utils::String::fromStdString(m_addTorrentParams.name);
|
m_name = QString::fromStdString(m_addTorrentParams.name);
|
||||||
|
|
||||||
foreach (const std::string &tracker, m_addTorrentParams.trackers)
|
foreach (const std::string &tracker, m_addTorrentParams.trackers)
|
||||||
m_trackers.append(Utils::String::fromStdString(tracker));
|
m_trackers.append(QString::fromStdString(tracker));
|
||||||
|
|
||||||
foreach (const std::string &urlSeed, m_addTorrentParams.url_seeds)
|
foreach (const std::string &urlSeed, m_addTorrentParams.url_seeds)
|
||||||
m_urlSeeds.append(QUrl(urlSeed.c_str()));
|
m_urlSeeds.append(QUrl(urlSeed.c_str()));
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
#ifndef BITTORRENT_MAGNETURI_H
|
#ifndef BITTORRENT_MAGNETURI_H
|
||||||
#define BITTORRENT_MAGNETURI_H
|
#define BITTORRENT_MAGNETURI_H
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
#include <QString>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
#include <libtorrent/add_torrent_params.hpp>
|
#include <libtorrent/add_torrent_params.hpp>
|
||||||
|
|||||||
@@ -26,12 +26,13 @@
|
|||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "base/net/geoipmanager.h"
|
|
||||||
#include "base/utils/string.h"
|
|
||||||
#include "base/unicodestrings.h"
|
|
||||||
#include "base/bittorrent/torrenthandle.h"
|
|
||||||
#include "peerinfo.h"
|
#include "peerinfo.h"
|
||||||
|
|
||||||
|
#include "base/bittorrent/torrenthandle.h"
|
||||||
|
#include "base/net/geoipmanager.h"
|
||||||
|
#include "base/unicodestrings.h"
|
||||||
|
#include "base/utils/string.h"
|
||||||
|
|
||||||
namespace libt = libtorrent;
|
namespace libt = libtorrent;
|
||||||
using namespace BitTorrent;
|
using namespace BitTorrent;
|
||||||
|
|
||||||
@@ -99,7 +100,6 @@ bool PeerInfo::isRemoteChocked() const
|
|||||||
return (m_nativeInfo.flags & libt::peer_info::remote_choked);
|
return (m_nativeInfo.flags & libt::peer_info::remote_choked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PeerInfo::isSupportsExtensions() const
|
bool PeerInfo::isSupportsExtensions() const
|
||||||
{
|
{
|
||||||
return (m_nativeInfo.flags & libt::peer_info::supports_extensions);
|
return (m_nativeInfo.flags & libt::peer_info::supports_extensions);
|
||||||
@@ -115,18 +115,11 @@ bool PeerInfo::isHandshake() const
|
|||||||
return (m_nativeInfo.flags & libt::peer_info::handshake);
|
return (m_nativeInfo.flags & libt::peer_info::handshake);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PeerInfo::isConnecting() const
|
bool PeerInfo::isConnecting() const
|
||||||
{
|
{
|
||||||
return (m_nativeInfo.flags & libt::peer_info::connecting);
|
return (m_nativeInfo.flags & libt::peer_info::connecting);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PeerInfo::isQueued() const
|
|
||||||
{
|
|
||||||
return (m_nativeInfo.flags & libt::peer_info::queued);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PeerInfo::isOnParole() const
|
bool PeerInfo::isOnParole() const
|
||||||
{
|
{
|
||||||
return (m_nativeInfo.flags & libt::peer_info::on_parole);
|
return (m_nativeInfo.flags & libt::peer_info::on_parole);
|
||||||
@@ -142,7 +135,6 @@ bool PeerInfo::optimisticUnchoke() const
|
|||||||
return (m_nativeInfo.flags & libt::peer_info::optimistic_unchoke);
|
return (m_nativeInfo.flags & libt::peer_info::optimistic_unchoke);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PeerInfo::isSnubbed() const
|
bool PeerInfo::isSnubbed() const
|
||||||
{
|
{
|
||||||
return (m_nativeInfo.flags & libt::peer_info::snubbed);
|
return (m_nativeInfo.flags & libt::peer_info::snubbed);
|
||||||
@@ -158,7 +150,6 @@ bool PeerInfo::isEndgameMode() const
|
|||||||
return (m_nativeInfo.flags & libt::peer_info::endgame_mode);
|
return (m_nativeInfo.flags & libt::peer_info::endgame_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PeerInfo::isHolepunched() const
|
bool PeerInfo::isHolepunched() const
|
||||||
{
|
{
|
||||||
return (m_nativeInfo.flags & libt::peer_info::holepunched);
|
return (m_nativeInfo.flags & libt::peer_info::holepunched);
|
||||||
@@ -189,7 +180,6 @@ bool PeerInfo::isPlaintextEncrypted() const
|
|||||||
return (m_nativeInfo.flags & libt::peer_info::plaintext_encrypted);
|
return (m_nativeInfo.flags & libt::peer_info::plaintext_encrypted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PeerAddress PeerInfo::address() const
|
PeerAddress PeerInfo::address() const
|
||||||
{
|
{
|
||||||
return PeerAddress(QHostAddress(QString::fromStdString(m_nativeInfo.ip.address().to_string())),
|
return PeerAddress(QHostAddress(QString::fromStdString(m_nativeInfo.ip.address().to_string())),
|
||||||
@@ -198,10 +188,9 @@ PeerAddress PeerInfo::address() const
|
|||||||
|
|
||||||
QString PeerInfo::client() const
|
QString PeerInfo::client() const
|
||||||
{
|
{
|
||||||
return Utils::String::fromStdString(m_nativeInfo.client);
|
return QString::fromStdString(m_nativeInfo.client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
qreal PeerInfo::progress() const
|
qreal PeerInfo::progress() const
|
||||||
{
|
{
|
||||||
return m_nativeInfo.progress;
|
return m_nativeInfo.progress;
|
||||||
@@ -212,7 +201,6 @@ int PeerInfo::payloadUpSpeed() const
|
|||||||
return m_nativeInfo.payload_up_speed;
|
return m_nativeInfo.payload_up_speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int PeerInfo::payloadDownSpeed() const
|
int PeerInfo::payloadDownSpeed() const
|
||||||
{
|
{
|
||||||
return m_nativeInfo.payload_down_speed;
|
return m_nativeInfo.payload_down_speed;
|
||||||
@@ -223,7 +211,6 @@ qlonglong PeerInfo::totalUpload() const
|
|||||||
return m_nativeInfo.total_upload;
|
return m_nativeInfo.total_upload;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
qlonglong PeerInfo::totalDownload() const
|
qlonglong PeerInfo::totalDownload() const
|
||||||
{
|
{
|
||||||
return m_nativeInfo.total_download;
|
return m_nativeInfo.total_download;
|
||||||
@@ -286,18 +273,20 @@ qreal PeerInfo::relevance() const
|
|||||||
|
|
||||||
void PeerInfo::determineFlags()
|
void PeerInfo::determineFlags()
|
||||||
{
|
{
|
||||||
|
QStringList flagsDescriptionList;
|
||||||
|
|
||||||
if (isInteresting()) {
|
if (isInteresting()) {
|
||||||
// d = Your client wants to download, but peer doesn't want to send (interested and choked)
|
// d = Your client wants to download, but peer doesn't want to send (interested and choked)
|
||||||
if (isRemoteChocked()) {
|
if (isRemoteChocked()) {
|
||||||
m_flags += "d ";
|
m_flags += "d ";
|
||||||
m_flagsDescription += tr("interested(local) and choked(peer)");
|
flagsDescriptionList += "d = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("Interested(local) and Choked(peer)");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// D = Currently downloading (interested and not choked)
|
// D = Currently downloading (interested and not choked)
|
||||||
m_flags += "D ";
|
m_flags += "D ";
|
||||||
m_flagsDescription += tr("interested(local) and unchoked(peer)");
|
flagsDescriptionList += "D = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("interested(local) and unchoked(peer)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,98 +294,95 @@ void PeerInfo::determineFlags()
|
|||||||
// u = Peer wants your client to upload, but your client doesn't want to (interested and choked)
|
// u = Peer wants your client to upload, but your client doesn't want to (interested and choked)
|
||||||
if (isChocked()) {
|
if (isChocked()) {
|
||||||
m_flags += "u ";
|
m_flags += "u ";
|
||||||
m_flagsDescription += tr("interested(peer) and choked(local)");
|
flagsDescriptionList += "u = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("interested(peer) and choked(local)");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// U = Currently uploading (interested and not choked)
|
// U = Currently uploading (interested and not choked)
|
||||||
m_flags += "U ";
|
m_flags += "U ";
|
||||||
m_flagsDescription += tr("interested(peer) and unchoked(local)");
|
flagsDescriptionList += "U = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("interested(peer) and unchoked(local)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// O = Optimistic unchoke
|
// O = Optimistic unchoke
|
||||||
if (optimisticUnchoke()) {
|
if (optimisticUnchoke()) {
|
||||||
m_flags += "O ";
|
m_flags += "O ";
|
||||||
m_flagsDescription += tr("optimistic unchoke");
|
flagsDescriptionList += "O = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("optimistic unchoke");
|
||||||
}
|
}
|
||||||
|
|
||||||
// S = Peer is snubbed
|
// S = Peer is snubbed
|
||||||
if (isSnubbed()) {
|
if (isSnubbed()) {
|
||||||
m_flags += "S ";
|
m_flags += "S ";
|
||||||
m_flagsDescription += tr("peer snubbed");
|
flagsDescriptionList += "S = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("peer snubbed");
|
||||||
}
|
}
|
||||||
|
|
||||||
// I = Peer is an incoming connection
|
// I = Peer is an incoming connection
|
||||||
if (!isLocalConnection()) {
|
if (!isLocalConnection()) {
|
||||||
m_flags += "I ";
|
m_flags += "I ";
|
||||||
m_flagsDescription += tr("incoming connection");
|
flagsDescriptionList += "I = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("incoming connection");
|
||||||
}
|
}
|
||||||
|
|
||||||
// K = Peer is unchoking your client, but your client is not interested
|
// K = Peer is unchoking your client, but your client is not interested
|
||||||
if (!isRemoteChocked() && !isInteresting()) {
|
if (!isRemoteChocked() && !isInteresting()) {
|
||||||
m_flags += "K ";
|
m_flags += "K ";
|
||||||
m_flagsDescription += tr("not interested(local) and unchoked(peer)");
|
flagsDescriptionList += "K = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("not interested(local) and unchoked(peer)");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ? = Your client unchoked the peer but the peer is not interested
|
// ? = Your client unchoked the peer but the peer is not interested
|
||||||
if (!isChocked() && !isRemoteInterested()) {
|
if (!isChocked() && !isRemoteInterested()) {
|
||||||
m_flags += "? ";
|
m_flags += "? ";
|
||||||
m_flagsDescription += tr("not interested(peer) and unchoked(local)");
|
flagsDescriptionList += "? = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("not interested(peer) and unchoked(local)");
|
||||||
}
|
}
|
||||||
|
|
||||||
// X = Peer was included in peerlists obtained through Peer Exchange (PEX)
|
// X = Peer was included in peerlists obtained through Peer Exchange (PEX)
|
||||||
if (fromPeX()) {
|
if (fromPeX()) {
|
||||||
m_flags += "X ";
|
m_flags += "X ";
|
||||||
m_flagsDescription += tr("peer from PEX");
|
flagsDescriptionList += "X = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("peer from PEX");
|
||||||
}
|
}
|
||||||
|
|
||||||
// H = Peer was obtained through DHT
|
// H = Peer was obtained through DHT
|
||||||
if (fromDHT()) {
|
if (fromDHT()) {
|
||||||
m_flags += "H ";
|
m_flags += "H ";
|
||||||
m_flagsDescription += tr("peer from DHT");
|
flagsDescriptionList += "H = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("peer from DHT");
|
||||||
}
|
}
|
||||||
|
|
||||||
// E = Peer is using Protocol Encryption (all traffic)
|
// E = Peer is using Protocol Encryption (all traffic)
|
||||||
if (isRC4Encrypted()) {
|
if (isRC4Encrypted()) {
|
||||||
m_flags += "E ";
|
m_flags += "E ";
|
||||||
m_flagsDescription += tr("encrypted traffic");
|
flagsDescriptionList += "E = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("encrypted traffic");
|
||||||
}
|
}
|
||||||
|
|
||||||
// e = Peer is using Protocol Encryption (handshake)
|
// e = Peer is using Protocol Encryption (handshake)
|
||||||
if (isPlaintextEncrypted()) {
|
if (isPlaintextEncrypted()) {
|
||||||
m_flags += "e ";
|
m_flags += "e ";
|
||||||
m_flagsDescription += tr("encrypted handshake");
|
flagsDescriptionList += "e = "
|
||||||
m_flagsDescription += ", ";
|
+ tr("encrypted handshake");
|
||||||
}
|
}
|
||||||
|
|
||||||
// P = Peer is using uTorrent uTP
|
// P = Peer is using uTorrent uTP
|
||||||
|
|
||||||
if (useUTPSocket()) {
|
if (useUTPSocket()) {
|
||||||
m_flags += "P ";
|
m_flags += "P ";
|
||||||
m_flagsDescription += QString::fromUtf8(C_UTP);
|
flagsDescriptionList += "P = "
|
||||||
m_flagsDescription += ", ";
|
+ QString::fromUtf8(C_UTP);
|
||||||
}
|
}
|
||||||
|
|
||||||
// L = Peer is local
|
// L = Peer is local
|
||||||
if (fromLSD()) {
|
if (fromLSD()) {
|
||||||
m_flags += "L";
|
m_flags += "L";
|
||||||
m_flagsDescription += tr("peer from LSD");
|
flagsDescriptionList += "L = "
|
||||||
|
+ tr("peer from LSD");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_flags = m_flags.trimmed();
|
m_flags = m_flags.trimmed();
|
||||||
m_flagsDescription = m_flagsDescription.trimmed();
|
m_flagsDescription = flagsDescriptionList.join('\n');
|
||||||
if (m_flagsDescription.endsWith(',', Qt::CaseInsensitive))
|
|
||||||
m_flagsDescription.chop(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString PeerInfo::flags() const
|
QString PeerInfo::flags() const
|
||||||
|
|||||||
@@ -29,11 +29,11 @@
|
|||||||
#ifndef BITTORRENT_PEERINFO_H
|
#ifndef BITTORRENT_PEERINFO_H
|
||||||
#define BITTORRENT_PEERINFO_H
|
#define BITTORRENT_PEERINFO_H
|
||||||
|
|
||||||
#include <libtorrent/peer_info.hpp>
|
|
||||||
|
|
||||||
#include <QHostAddress>
|
|
||||||
#include <QBitArray>
|
#include <QBitArray>
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
|
#include <QHostAddress>
|
||||||
|
|
||||||
|
#include <libtorrent/peer_info.hpp>
|
||||||
|
|
||||||
namespace BitTorrent
|
namespace BitTorrent
|
||||||
{
|
{
|
||||||
@@ -68,7 +68,6 @@ namespace BitTorrent
|
|||||||
|
|
||||||
bool isHandshake() const;
|
bool isHandshake() const;
|
||||||
bool isConnecting() const;
|
bool isConnecting() const;
|
||||||
bool isQueued() const;
|
|
||||||
bool isOnParole() const;
|
bool isOnParole() const;
|
||||||
bool isSeed() const;
|
bool isSeed() const;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2010 Christophe Dumez
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -24,72 +25,78 @@
|
|||||||
* modify file(s), you may extend this exception to your version of the file(s),
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*
|
|
||||||
* Contact : chris@qbittorrent.org
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QTime>
|
|
||||||
#include <QDateTime>
|
|
||||||
|
|
||||||
#include "base/bittorrent/session.h"
|
|
||||||
#include "base/preferences.h"
|
|
||||||
#include "bandwidthscheduler.h"
|
#include "bandwidthscheduler.h"
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include <QDate>
|
||||||
|
#include <QTime>
|
||||||
|
|
||||||
|
#include "base/preferences.h"
|
||||||
|
|
||||||
BandwidthScheduler::BandwidthScheduler(QObject *parent)
|
BandwidthScheduler::BandwidthScheduler(QObject *parent)
|
||||||
: QTimer(parent)
|
: QObject(parent)
|
||||||
|
, m_lastAlternative(false)
|
||||||
{
|
{
|
||||||
// Single shot, we call start() again manually
|
connect(&m_timer, &QTimer::timeout, this, &BandwidthScheduler::onTimeout);
|
||||||
setSingleShot(true);
|
|
||||||
// Connect Signals/Slots
|
|
||||||
connect(this, SIGNAL(timeout()), this, SLOT(start()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BandwidthScheduler::start()
|
void BandwidthScheduler::start()
|
||||||
{
|
{
|
||||||
const Preferences* const pref = Preferences::instance();
|
m_lastAlternative = isTimeForAlternative();
|
||||||
bool alt_bw_enabled = BitTorrent::Session::instance()->isAltGlobalSpeedLimitEnabled();
|
emit bandwidthLimitRequested(m_lastAlternative);
|
||||||
|
|
||||||
QTime start = pref->getSchedulerStartTime();
|
|
||||||
QTime end = pref->getSchedulerEndTime();
|
|
||||||
QTime now = QTime::currentTime();
|
|
||||||
int sched_days = pref->getSchedulerDays();
|
|
||||||
int day = QDateTime::currentDateTime().toLocalTime().date().dayOfWeek();
|
|
||||||
bool new_mode = false;
|
|
||||||
bool reverse = false;
|
|
||||||
|
|
||||||
if (start > end) {
|
|
||||||
QTime temp = start;
|
|
||||||
start = end;
|
|
||||||
end = temp;
|
|
||||||
reverse = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((start <= now) && (end >= now)) {
|
|
||||||
switch(sched_days) {
|
|
||||||
case EVERY_DAY:
|
|
||||||
new_mode = true;
|
|
||||||
break;
|
|
||||||
case WEEK_ENDS:
|
|
||||||
if ((day == 6) || (day == 7))
|
|
||||||
new_mode = true;
|
|
||||||
break;
|
|
||||||
case WEEK_DAYS:
|
|
||||||
if ((day != 6) && (day != 7))
|
|
||||||
new_mode = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (day == (sched_days - 2))
|
|
||||||
new_mode = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reverse)
|
|
||||||
new_mode = !new_mode;
|
|
||||||
|
|
||||||
if (new_mode != alt_bw_enabled)
|
|
||||||
emit switchToAlternativeMode(new_mode);
|
|
||||||
|
|
||||||
// Timeout regularly to accommodate for external system clock changes
|
// Timeout regularly to accommodate for external system clock changes
|
||||||
// eg from the user or from a timesync utility
|
// eg from the user or from a timesync utility
|
||||||
QTimer::start(1500);
|
m_timer.start(30000);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BandwidthScheduler::isTimeForAlternative() const
|
||||||
|
{
|
||||||
|
const Preferences* const pref = Preferences::instance();
|
||||||
|
|
||||||
|
QTime start = pref->getSchedulerStartTime();
|
||||||
|
QTime end = pref->getSchedulerEndTime();
|
||||||
|
const QTime now = QTime::currentTime();
|
||||||
|
const int schedulerDays = pref->getSchedulerDays();
|
||||||
|
const int day = QDate::currentDate().dayOfWeek();
|
||||||
|
bool alternative = false;
|
||||||
|
|
||||||
|
if (start > end) {
|
||||||
|
std::swap(start, end);
|
||||||
|
alternative = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((start <= now) && (end >= now)) {
|
||||||
|
switch (schedulerDays) {
|
||||||
|
case EVERY_DAY:
|
||||||
|
alternative = !alternative;
|
||||||
|
break;
|
||||||
|
case WEEK_ENDS:
|
||||||
|
if ((day == 6) || (day == 7))
|
||||||
|
alternative = !alternative;
|
||||||
|
break;
|
||||||
|
case WEEK_DAYS:
|
||||||
|
if ((day != 6) && (day != 7))
|
||||||
|
alternative = !alternative;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (day == (schedulerDays - 2))
|
||||||
|
alternative = !alternative;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return alternative;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BandwidthScheduler::onTimeout()
|
||||||
|
{
|
||||||
|
bool alternative = isTimeForAlternative();
|
||||||
|
|
||||||
|
if (alternative != m_lastAlternative) {
|
||||||
|
m_lastAlternative = alternative;
|
||||||
|
emit bandwidthLimitRequested(alternative);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2010 Christophe Dumez
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -24,27 +25,32 @@
|
|||||||
* modify file(s), you may extend this exception to your version of the file(s),
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*
|
|
||||||
* Contact : chris@qbittorrent.org
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef BANDWIDTHSCHEDULER_H
|
#ifndef BANDWIDTHSCHEDULER_H
|
||||||
#define BANDWIDTHSCHEDULER_H
|
#define BANDWIDTHSCHEDULER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
class BandwidthScheduler : public QTimer
|
class BandwidthScheduler: public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
Q_DISABLE_COPY(BandwidthScheduler)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BandwidthScheduler(QObject *parent = 0);
|
explicit BandwidthScheduler(QObject *parent = nullptr);
|
||||||
|
|
||||||
public slots:
|
|
||||||
void start();
|
void start();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void switchToAlternativeMode(bool alternative);
|
void bandwidthLimitRequested(bool alternative);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool isTimeForAlternative() const;
|
||||||
|
void onTimeout();
|
||||||
|
|
||||||
|
QTimer m_timer;
|
||||||
|
bool m_lastAlternative;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BANDWIDTHSCHEDULER_H
|
#endif // BANDWIDTHSCHEDULER_H
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libt.
|
* Bittorrent Client using Qt and libt.
|
||||||
* Copyright (C) 2006 Christophe Dumez
|
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -24,26 +24,89 @@
|
|||||||
* modify file(s), you may extend this exception to your version of the file(s),
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*
|
|
||||||
* Contact : chris@qbittorrent.org
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QFile>
|
#include "filterparserthread.h"
|
||||||
#include <QHostAddress>
|
|
||||||
#include <QDataStream>
|
|
||||||
#include <QStringList>
|
|
||||||
|
|
||||||
#include <libtorrent/session.hpp>
|
#include <cctype>
|
||||||
#include <libtorrent/ip_filter.hpp>
|
|
||||||
|
#include <QDataStream>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
#include "filterparserthread.h"
|
|
||||||
|
|
||||||
namespace libt = libtorrent;
|
namespace libt = libtorrent;
|
||||||
|
|
||||||
FilterParserThread::FilterParserThread(libt::session *s, QObject *parent)
|
namespace
|
||||||
|
{
|
||||||
|
class IPv4Parser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool tryParse(const char *str)
|
||||||
|
{
|
||||||
|
unsigned char octetIndex = 0;
|
||||||
|
|
||||||
|
const char *octetStart = str;
|
||||||
|
char *endptr;
|
||||||
|
for (; *str; ++str) {
|
||||||
|
if (*str == '.') {
|
||||||
|
long int extractedNum = strtol(octetStart, &endptr, 10);
|
||||||
|
if ((extractedNum >= 0L) && (extractedNum <= 255L))
|
||||||
|
m_buf[octetIndex++] = static_cast<unsigned char>(extractedNum);
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (endptr != str)
|
||||||
|
return false;
|
||||||
|
if (octetIndex == 4)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
octetStart = str + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str != octetStart) {
|
||||||
|
long int extractedNum = strtol(octetStart, &endptr, 10);
|
||||||
|
if ((extractedNum >= 0L) && (extractedNum <= 255L))
|
||||||
|
m_buf[octetIndex] = static_cast<unsigned char>(strtol(octetStart, &endptr, 10));
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((endptr == str) && (octetIndex == 3))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
libt::address_v4::bytes_type parsed() const
|
||||||
|
{
|
||||||
|
return m_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
libt::address_v4::bytes_type m_buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool parseIPAddress(const char *data, libt::address &address)
|
||||||
|
{
|
||||||
|
IPv4Parser parser;
|
||||||
|
boost::system::error_code ec;
|
||||||
|
|
||||||
|
if (parser.tryParse(data))
|
||||||
|
address = libt::address_v4(parser.parsed());
|
||||||
|
else
|
||||||
|
address = libt::address_v6::from_string(data, ec);
|
||||||
|
|
||||||
|
return !ec;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int BUFFER_SIZE = 2 * 1024 * 1024; // 2 MiB
|
||||||
|
const int MAX_LOGGED_ERRORS = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
FilterParserThread::FilterParserThread(QObject *parent)
|
||||||
: QThread(parent)
|
: QThread(parent)
|
||||||
, m_session(s)
|
|
||||||
, m_abort(false)
|
, m_abort(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -55,181 +118,289 @@ FilterParserThread::~FilterParserThread()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parser for eMule ip filter in DAT format
|
// Parser for eMule ip filter in DAT format
|
||||||
int FilterParserThread::parseDATFilterFile(QString filePath, libt::ip_filter &filter)
|
int FilterParserThread::parseDATFilterFile()
|
||||||
{
|
{
|
||||||
int ruleCount = 0;
|
int ruleCount = 0;
|
||||||
QFile file(filePath);
|
QFile file(m_filePath);
|
||||||
if (!file.exists()) return ruleCount;
|
if (!file.exists()) return ruleCount;
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL);
|
LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int nbLine = 0;
|
std::vector<char> buffer(BUFFER_SIZE, 0); // seems a bit faster than QVector
|
||||||
while (!file.atEnd() && !m_abort) {
|
qint64 bytesRead = 0;
|
||||||
|
int offset = 0;
|
||||||
|
int start = 0;
|
||||||
|
int endOfLine = -1;
|
||||||
|
int nbLine = 0;
|
||||||
|
int parseErrorCount = 0;
|
||||||
|
const auto addLog = [&parseErrorCount](const QString &msg)
|
||||||
|
{
|
||||||
|
if (parseErrorCount <= MAX_LOGGED_ERRORS)
|
||||||
|
LogMsg(msg, Log::CRITICAL);
|
||||||
|
};
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
bytesRead = file.read(buffer.data() + offset, BUFFER_SIZE - offset - 1);
|
||||||
|
if (bytesRead < 0)
|
||||||
|
break;
|
||||||
|
int dataSize = bytesRead + offset;
|
||||||
|
if (bytesRead == 0 && dataSize == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
for (start = 0; start < dataSize; ++start) {
|
||||||
|
endOfLine = -1;
|
||||||
|
// The file might have ended without the last line having a newline
|
||||||
|
if (!(bytesRead == 0 && dataSize > 0)) {
|
||||||
|
for (int i = start; i < dataSize; ++i) {
|
||||||
|
if (buffer[i] == '\n') {
|
||||||
|
endOfLine = i;
|
||||||
|
// We need to NULL the newline in case the line has only an IP range.
|
||||||
|
// In that case the parser won't work for the end IP, because it ends
|
||||||
|
// with the newline and not with a number.
|
||||||
|
buffer[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
endOfLine = dataSize;
|
||||||
|
buffer[dataSize] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endOfLine == -1) {
|
||||||
|
// read the next chunk from file
|
||||||
|
// but first move(copy) the leftover data to the front of the buffer
|
||||||
|
offset = dataSize - start;
|
||||||
|
memmove(buffer.data(), buffer.data() + start, offset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
++nbLine;
|
++nbLine;
|
||||||
QByteArray line = file.readLine();
|
}
|
||||||
// Ignoring empty lines
|
|
||||||
line = line.trimmed();
|
|
||||||
if (line.isEmpty()) continue;
|
|
||||||
// Ignoring commented lines
|
|
||||||
if (line.startsWith('#') || line.startsWith("//")) continue;
|
|
||||||
|
|
||||||
// Line should be split by commas
|
if ((buffer[start] == '#')
|
||||||
QList<QByteArray> partsList = line.split(',');
|
|| ((buffer[start] == '/') && ((start + 1 < dataSize) && (buffer[start + 1] == '/')))) {
|
||||||
const uint nbElem = partsList.size();
|
start = endOfLine;
|
||||||
|
|
||||||
// IP Range should be split by a dash
|
|
||||||
QList<QByteArray> IPs = partsList.first().split('-');
|
|
||||||
if (IPs.size() != 2) {
|
|
||||||
qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
|
|
||||||
qDebug("Line was %s", line.constData());
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::system::error_code ec;
|
// Each line should follow this format:
|
||||||
const QString strStartIP = cleanupIPAddress(IPs.at(0));
|
// 001.009.096.105 - 001.009.096.105 , 000 , Some organization
|
||||||
if (strStartIP.isEmpty()) {
|
// The 3rd entry is access level and if above 127 the IP range isn't blocked.
|
||||||
qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
|
int firstComma = findAndNullDelimiter(buffer.data(), ',', start, endOfLine);
|
||||||
qDebug("Start IP of the range is malformated: %s", qPrintable(strStartIP));
|
if (firstComma != -1)
|
||||||
continue;
|
findAndNullDelimiter(buffer.data(), ',', firstComma + 1, endOfLine);
|
||||||
}
|
|
||||||
libt::address startAddr = libt::address::from_string(qPrintable(strStartIP), ec);
|
|
||||||
if (ec) {
|
|
||||||
qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
|
|
||||||
qDebug("Start IP of the range is malformated: %s", qPrintable(strStartIP));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString strEndIP = cleanupIPAddress(IPs.at(1));
|
|
||||||
if (strEndIP.isEmpty()) {
|
|
||||||
qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
|
|
||||||
qDebug("End IP of the range is malformated: %s", qPrintable(strEndIP));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
libt::address endAddr = libt::address::from_string(qPrintable(strEndIP), ec);
|
|
||||||
if (ec) {
|
|
||||||
qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
|
|
||||||
qDebug("End IP of the range is malformated: %s", qPrintable(strEndIP));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startAddr.is_v4() != endAddr.is_v4()) {
|
|
||||||
qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
|
|
||||||
qDebug("One IP is IPv4 and the other is IPv6!");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if there is an access value (apparently not mandatory)
|
// Check if there is an access value (apparently not mandatory)
|
||||||
int nbAccess = 0;
|
if (firstComma != -1) {
|
||||||
if (nbElem > 1) {
|
|
||||||
// There is possibly one
|
// There is possibly one
|
||||||
nbAccess = partsList.at(1).trimmed().toInt();
|
const long int nbAccess = strtol(buffer.data() + firstComma + 1, nullptr, 10);
|
||||||
}
|
|
||||||
|
|
||||||
if (nbAccess > 127) {
|
|
||||||
// Ignoring this rule because access value is too high
|
// Ignoring this rule because access value is too high
|
||||||
|
if (nbAccess > 127L) {
|
||||||
|
start = endOfLine;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IP Range should be split by a dash
|
||||||
|
int endOfIPRange = ((firstComma == -1) ? (endOfLine - 1) : (firstComma - 1));
|
||||||
|
int delimIP = findAndNullDelimiter(buffer.data(), '-', start, endOfIPRange);
|
||||||
|
if (delimIP == -1) {
|
||||||
|
++parseErrorCount;
|
||||||
|
addLog(tr("IP filter line %1 is malformed.").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
libt::address startAddr;
|
||||||
|
int newStart = trim(buffer.data(), start, delimIP - 1);
|
||||||
|
if (!parseIPAddress(buffer.data() + newStart, startAddr)) {
|
||||||
|
++parseErrorCount;
|
||||||
|
addLog(tr("IP filter line %1 is malformed. Start IP of the range is malformed.").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
libt::address endAddr;
|
||||||
|
newStart = trim(buffer.data(), delimIP + 1, endOfIPRange);
|
||||||
|
if (!parseIPAddress(buffer.data() + newStart, endAddr)) {
|
||||||
|
++parseErrorCount;
|
||||||
|
addLog(tr("IP filter line %1 is malformed. End IP of the range is malformed.").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((startAddr.is_v4() != endAddr.is_v4())
|
||||||
|
|| (startAddr.is_v6() != endAddr.is_v6())) {
|
||||||
|
++parseErrorCount;
|
||||||
|
addLog(tr("IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6!").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
start = endOfLine;
|
||||||
|
|
||||||
// Now Add to the filter
|
// Now Add to the filter
|
||||||
try {
|
try {
|
||||||
filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked);
|
m_filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked);
|
||||||
++ruleCount;
|
++ruleCount;
|
||||||
}
|
}
|
||||||
catch(std::exception &) {
|
catch (std::exception &e) {
|
||||||
qDebug("Bad line in filter file, avoided crash...");
|
++parseErrorCount;
|
||||||
|
addLog(tr("IP filter exception thrown for line %1. Exception is: %2")
|
||||||
|
.arg(nbLine).arg(QString::fromLocal8Bit(e.what())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
file.close();
|
if (start >= dataSize)
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseErrorCount > MAX_LOGGED_ERRORS)
|
||||||
|
LogMsg(tr("%1 extra IP filter parsing errors occurred.", "513 extra IP filter parsing errors occurred.")
|
||||||
|
.arg(parseErrorCount - MAX_LOGGED_ERRORS), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parser for PeerGuardian ip filter in p2p format
|
// Parser for PeerGuardian ip filter in p2p format
|
||||||
int FilterParserThread::parseP2PFilterFile(QString filePath, libt::ip_filter &filter)
|
int FilterParserThread::parseP2PFilterFile()
|
||||||
{
|
{
|
||||||
int ruleCount = 0;
|
int ruleCount = 0;
|
||||||
QFile file(filePath);
|
QFile file(m_filePath);
|
||||||
if (!file.exists()) return ruleCount;
|
if (!file.exists()) return ruleCount;
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL);
|
LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int nbLine = 0;
|
std::vector<char> buffer(BUFFER_SIZE, 0); // seems a bit faster than QVector
|
||||||
while (!file.atEnd() && !m_abort) {
|
qint64 bytesRead = 0;
|
||||||
|
int offset = 0;
|
||||||
|
int start = 0;
|
||||||
|
int endOfLine = -1;
|
||||||
|
int nbLine = 0;
|
||||||
|
int parseErrorCount = 0;
|
||||||
|
const auto addLog = [&parseErrorCount](const QString &msg)
|
||||||
|
{
|
||||||
|
if (parseErrorCount <= MAX_LOGGED_ERRORS)
|
||||||
|
LogMsg(msg, Log::CRITICAL);
|
||||||
|
};
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
bytesRead = file.read(buffer.data() + offset, BUFFER_SIZE - offset - 1);
|
||||||
|
if (bytesRead < 0)
|
||||||
|
break;
|
||||||
|
int dataSize = bytesRead + offset;
|
||||||
|
if (bytesRead == 0 && dataSize == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
for (start = 0; start < dataSize; ++start) {
|
||||||
|
endOfLine = -1;
|
||||||
|
// The file might have ended without the last line having a newline
|
||||||
|
if (!(bytesRead == 0 && dataSize > 0)) {
|
||||||
|
for (int i = start; i < dataSize; ++i) {
|
||||||
|
if (buffer[i] == '\n') {
|
||||||
|
endOfLine = i;
|
||||||
|
// We need to NULL the newline in case the line has only an IP range.
|
||||||
|
// In that case the parser won't work for the end IP, because it ends
|
||||||
|
// with the newline and not with a number.
|
||||||
|
buffer[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
endOfLine = dataSize;
|
||||||
|
buffer[dataSize] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endOfLine == -1) {
|
||||||
|
// read the next chunk from file
|
||||||
|
// but first move(copy) the leftover data to the front of the buffer
|
||||||
|
offset = dataSize - start;
|
||||||
|
memmove(buffer.data(), buffer.data() + start, offset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
++nbLine;
|
++nbLine;
|
||||||
QByteArray line = file.readLine().trimmed();
|
}
|
||||||
if (line.isEmpty()) continue;
|
|
||||||
// Ignoring commented lines
|
|
||||||
if (line.startsWith('#') || line.startsWith("//")) continue;
|
|
||||||
|
|
||||||
// Line is split by :
|
if ((buffer[start] == '#')
|
||||||
QList<QByteArray> partsList = line.split(':');
|
|| ((buffer[start] == '/') && ((start + 1 < dataSize) && (buffer[start + 1] == '/')))) {
|
||||||
if (partsList.size() < 2) {
|
start = endOfLine;
|
||||||
qDebug("p2p file: line %d is malformed.", nbLine);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get IP range
|
// Each line should follow this format:
|
||||||
QList<QByteArray> IPs = partsList.last().split('-');
|
// Some organization:1.0.0.0-1.255.255.255
|
||||||
if (IPs.size() != 2) {
|
// The "Some organization" part might contain a ':' char itself so we find the last occurrence
|
||||||
qDebug("p2p file: line %d is malformed.", nbLine);
|
int partsDelimiter = findAndNullDelimiter(buffer.data(), ':', start, endOfLine, true);
|
||||||
qDebug("line was: %s", line.constData());
|
if (partsDelimiter == -1) {
|
||||||
|
++parseErrorCount;
|
||||||
|
addLog(tr("IP filter line %1 is malformed.").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::system::error_code ec;
|
// IP Range should be split by a dash
|
||||||
QString strStartIP = cleanupIPAddress(IPs.at(0));
|
int delimIP = findAndNullDelimiter(buffer.data(), '-', partsDelimiter + 1, endOfLine);
|
||||||
if (strStartIP.isEmpty()) {
|
if (delimIP == -1) {
|
||||||
qDebug("p2p file: line %d is malformed.", nbLine);
|
++parseErrorCount;
|
||||||
qDebug("Start IP is invalid: %s", qPrintable(strStartIP));
|
addLog(tr("IP filter line %1 is malformed.").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
libt::address startAddr = libt::address::from_string(qPrintable(strStartIP), ec);
|
libt::address startAddr;
|
||||||
if (ec) {
|
int newStart = trim(buffer.data(), partsDelimiter + 1, delimIP - 1);
|
||||||
qDebug("p2p file: line %d is malformed.", nbLine);
|
if (!parseIPAddress(buffer.data() + newStart, startAddr)) {
|
||||||
qDebug("Start IP is invalid: %s", qPrintable(strStartIP));
|
++parseErrorCount;
|
||||||
|
addLog(tr("IP filter line %1 is malformed. Start IP of the range is malformed.").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString strEndIP = cleanupIPAddress(IPs.at(1));
|
libt::address endAddr;
|
||||||
if (strEndIP.isEmpty()) {
|
newStart = trim(buffer.data(), delimIP + 1, endOfLine);
|
||||||
qDebug("p2p file: line %d is malformed.", nbLine);
|
if (!parseIPAddress(buffer.data() + newStart, endAddr)) {
|
||||||
qDebug("End IP is invalid: %s", qPrintable(strStartIP));
|
++parseErrorCount;
|
||||||
|
addLog(tr("IP filter line %1 is malformed. End IP of the range is malformed.").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
libt::address endAddr = libt::address::from_string(qPrintable(strEndIP), ec);
|
if ((startAddr.is_v4() != endAddr.is_v4())
|
||||||
if (ec) {
|
|| (startAddr.is_v6() != endAddr.is_v6())) {
|
||||||
qDebug("p2p file: line %d is malformed.", nbLine);
|
++parseErrorCount;
|
||||||
qDebug("End IP is invalid: %s", qPrintable(strStartIP));
|
addLog(tr("IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6!").arg(nbLine));
|
||||||
|
start = endOfLine;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (startAddr.is_v4() != endAddr.is_v4()) {
|
start = endOfLine;
|
||||||
qDebug("p2p file: line %d is malformed.", nbLine);
|
|
||||||
qDebug("Line was: %s", line.constData());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked);
|
m_filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked);
|
||||||
++ruleCount;
|
++ruleCount;
|
||||||
}
|
}
|
||||||
catch(std::exception &) {
|
catch (std::exception &e) {
|
||||||
qDebug("p2p file: line %d is malformed.", nbLine);
|
++parseErrorCount;
|
||||||
qDebug("Line was: %s", line.constData());
|
addLog(tr("IP filter exception thrown for line %1. Exception is: %2")
|
||||||
continue;
|
.arg(nbLine).arg(QString::fromLocal8Bit(e.what())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
file.close();
|
if (start >= dataSize)
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseErrorCount > MAX_LOGGED_ERRORS)
|
||||||
|
LogMsg(tr("%1 extra IP filter parsing errors occurred.", "513 extra IP filter parsing errors occurred.")
|
||||||
|
.arg(parseErrorCount - MAX_LOGGED_ERRORS), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,14 +428,14 @@ int FilterParserThread::getlineInStream(QDataStream &stream, std::string &name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parser for PeerGuardian ip filter in p2p format
|
// Parser for PeerGuardian ip filter in p2p format
|
||||||
int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &filter)
|
int FilterParserThread::parseP2BFilterFile()
|
||||||
{
|
{
|
||||||
int ruleCount = 0;
|
int ruleCount = 0;
|
||||||
QFile file(filePath);
|
QFile file(m_filePath);
|
||||||
if (!file.exists()) return ruleCount;
|
if (!file.exists()) return ruleCount;
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly)) {
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL);
|
LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,8 +445,8 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
unsigned char version;
|
unsigned char version;
|
||||||
if (!stream.readRawData(buf, sizeof(buf))
|
if (!stream.readRawData(buf, sizeof(buf))
|
||||||
|| memcmp(buf, "\xFF\xFF\xFF\xFFP2B", 7)
|
|| memcmp(buf, "\xFF\xFF\xFF\xFFP2B", 7)
|
||||||
|| !stream.readRawData((char*)&version, sizeof(version))) {
|
|| !stream.readRawData(reinterpret_cast<char*>(&version), sizeof(version))) {
|
||||||
Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,9 +456,9 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
while(getlineInStream(stream, name, '\0') && !m_abort) {
|
while(getlineInStream(stream, name, '\0') && !m_abort) {
|
||||||
if (!stream.readRawData((char*)&start, sizeof(start))
|
if (!stream.readRawData(reinterpret_cast<char*>(&start), sizeof(start))
|
||||||
|| !stream.readRawData((char*)&end, sizeof(end))) {
|
|| !stream.readRawData(reinterpret_cast<char*>(&end), sizeof(end))) {
|
||||||
Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,7 +469,7 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
libt::address_v4 last(ntohl(end));
|
libt::address_v4 last(ntohl(end));
|
||||||
// Apply to bittorrent session
|
// Apply to bittorrent session
|
||||||
try {
|
try {
|
||||||
filter.add_rule(first, last, libt::ip_filter::blocked);
|
m_filter.add_rule(first, last, libt::ip_filter::blocked);
|
||||||
++ruleCount;
|
++ruleCount;
|
||||||
}
|
}
|
||||||
catch (std::exception &) {}
|
catch (std::exception &) {}
|
||||||
@@ -307,8 +478,8 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
else if (version == 3) {
|
else if (version == 3) {
|
||||||
qDebug ("p2b version 3");
|
qDebug ("p2b version 3");
|
||||||
unsigned int namecount;
|
unsigned int namecount;
|
||||||
if (!stream.readRawData((char*)&namecount, sizeof(namecount))) {
|
if (!stream.readRawData(reinterpret_cast<char*>(&namecount), sizeof(namecount))) {
|
||||||
Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,7 +488,7 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
for (unsigned int i = 0; i < namecount; ++i) {
|
for (unsigned int i = 0; i < namecount; ++i) {
|
||||||
std::string name;
|
std::string name;
|
||||||
if (!getlineInStream(stream, name, '\0')) {
|
if (!getlineInStream(stream, name, '\0')) {
|
||||||
Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,18 +497,18 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
|
|
||||||
// Reading the ranges
|
// Reading the ranges
|
||||||
unsigned int rangecount;
|
unsigned int rangecount;
|
||||||
if (!stream.readRawData((char*)&rangecount, sizeof(rangecount))) {
|
if (!stream.readRawData(reinterpret_cast<char*>(&rangecount), sizeof(rangecount))) {
|
||||||
Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
rangecount = ntohl(rangecount);
|
rangecount = ntohl(rangecount);
|
||||||
unsigned int name, start, end;
|
unsigned int name, start, end;
|
||||||
for (unsigned int i = 0; i < rangecount; ++i) {
|
for (unsigned int i = 0; i < rangecount; ++i) {
|
||||||
if (!stream.readRawData((char*)&name, sizeof(name))
|
if (!stream.readRawData(reinterpret_cast<char*>(&name), sizeof(name))
|
||||||
|| !stream.readRawData((char*)&start, sizeof(start))
|
|| !stream.readRawData(reinterpret_cast<char*>(&start), sizeof(start))
|
||||||
|| !stream.readRawData((char*)&end, sizeof(end))) {
|
|| !stream.readRawData(reinterpret_cast<char*>(&end), sizeof(end))) {
|
||||||
Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,7 +519,7 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
libt::address_v4 last(ntohl(end));
|
libt::address_v4 last(ntohl(end));
|
||||||
// Apply to bittorrent session
|
// Apply to bittorrent session
|
||||||
try {
|
try {
|
||||||
filter.add_rule(first, last, libt::ip_filter::blocked);
|
m_filter.add_rule(first, last, libt::ip_filter::blocked);
|
||||||
++ruleCount;
|
++ruleCount;
|
||||||
}
|
}
|
||||||
catch (std::exception &) {}
|
catch (std::exception &) {}
|
||||||
@@ -357,10 +528,9 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
file.close();
|
|
||||||
return ruleCount;
|
return ruleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -369,7 +539,7 @@ int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &fi
|
|||||||
// * eMule IP list (DAT): http://wiki.phoenixlabs.org/wiki/DAT_Format
|
// * eMule IP list (DAT): http://wiki.phoenixlabs.org/wiki/DAT_Format
|
||||||
// * PeerGuardian Text (P2P): http://wiki.phoenixlabs.org/wiki/P2P_Format
|
// * PeerGuardian Text (P2P): http://wiki.phoenixlabs.org/wiki/P2P_Format
|
||||||
// * PeerGuardian Binary (P2B): http://wiki.phoenixlabs.org/wiki/P2B_Format
|
// * PeerGuardian Binary (P2B): http://wiki.phoenixlabs.org/wiki/P2B_Format
|
||||||
void FilterParserThread::processFilterFile(QString filePath)
|
void FilterParserThread::processFilterFile(const QString &filePath)
|
||||||
{
|
{
|
||||||
if (isRunning()) {
|
if (isRunning()) {
|
||||||
// Already parsing a filter, m_abort first
|
// Already parsing a filter, m_abort first
|
||||||
@@ -379,63 +549,36 @@ void FilterParserThread::processFilterFile(QString filePath)
|
|||||||
|
|
||||||
m_abort = false;
|
m_abort = false;
|
||||||
m_filePath = filePath;
|
m_filePath = filePath;
|
||||||
|
m_filter = libt::ip_filter();
|
||||||
// Run it
|
// Run it
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString FilterParserThread::cleanupIPAddress(QString _ip)
|
libt::ip_filter FilterParserThread::IPfilter()
|
||||||
{
|
{
|
||||||
_ip = _ip.trimmed();
|
return m_filter;
|
||||||
|
|
||||||
// Emule .DAT files contain leading zeroes in IPv4 addresses
|
|
||||||
// eg 001.009.106.186
|
|
||||||
// We need to remove them because both QHostAddress and Boost.Asio fail to parse them.
|
|
||||||
QStringList octets = _ip.split('.', QString::SkipEmptyParts);
|
|
||||||
if (octets.size() == 4) {
|
|
||||||
QString octet; // it is faster to not recreate this object in the loop
|
|
||||||
for (int i = 0; i < 4; i++) {
|
|
||||||
octet = octets[i];
|
|
||||||
if ((octet[0] == QChar('0')) && (octet.count() > 1)) {
|
|
||||||
if ((octet[1] == QChar('0')) && (octet.count() > 2))
|
|
||||||
octet.remove(0, 2);
|
|
||||||
else
|
|
||||||
octet.remove(0, 1);
|
|
||||||
|
|
||||||
octets[i] = octet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_ip = octets.join(".");
|
|
||||||
}
|
|
||||||
|
|
||||||
QHostAddress ip(_ip);
|
|
||||||
if (ip.isNull()) return QString();
|
|
||||||
|
|
||||||
return ip.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilterParserThread::run()
|
void FilterParserThread::run()
|
||||||
{
|
{
|
||||||
qDebug("Processing filter file");
|
qDebug("Processing filter file");
|
||||||
libt::ip_filter filter = m_session->get_ip_filter();
|
|
||||||
int ruleCount = 0;
|
int ruleCount = 0;
|
||||||
if (m_filePath.endsWith(".p2p", Qt::CaseInsensitive)) {
|
if (m_filePath.endsWith(".p2p", Qt::CaseInsensitive)) {
|
||||||
// PeerGuardian p2p file
|
// PeerGuardian p2p file
|
||||||
ruleCount = parseP2PFilterFile(m_filePath, filter);
|
ruleCount = parseP2PFilterFile();
|
||||||
}
|
}
|
||||||
else if (m_filePath.endsWith(".p2b", Qt::CaseInsensitive)) {
|
else if (m_filePath.endsWith(".p2b", Qt::CaseInsensitive)) {
|
||||||
// PeerGuardian p2b file
|
// PeerGuardian p2b file
|
||||||
ruleCount = parseP2BFilterFile(m_filePath, filter);
|
ruleCount = parseP2BFilterFile();
|
||||||
}
|
}
|
||||||
else if (m_filePath.endsWith(".dat", Qt::CaseInsensitive)) {
|
else if (m_filePath.endsWith(".dat", Qt::CaseInsensitive)) {
|
||||||
// eMule DAT format
|
// eMule DAT format
|
||||||
ruleCount = parseDATFilterFile(m_filePath, filter);
|
ruleCount = parseDATFilterFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_abort) return;
|
if (m_abort) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
m_session->set_ip_filter(filter);
|
|
||||||
emit IPFilterParsed(ruleCount);
|
emit IPFilterParsed(ruleCount);
|
||||||
}
|
}
|
||||||
catch (std::exception &) {
|
catch (std::exception &) {
|
||||||
@@ -444,3 +587,50 @@ void FilterParserThread::run()
|
|||||||
|
|
||||||
qDebug("IP Filter thread: finished parsing, filter applied");
|
qDebug("IP Filter thread: finished parsing, filter applied");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int FilterParserThread::findAndNullDelimiter(char *const data, char delimiter, int start, int end, bool reverse)
|
||||||
|
{
|
||||||
|
if (!reverse) {
|
||||||
|
for (int i = start; i <= end; ++i) {
|
||||||
|
if (data[i] == delimiter) {
|
||||||
|
data[i] = '\0';
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (int i = end; i >= start; --i) {
|
||||||
|
if (data[i] == delimiter) {
|
||||||
|
data[i] = '\0';
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FilterParserThread::trim(char* const data, int start, int end)
|
||||||
|
{
|
||||||
|
if (start >= end) return start;
|
||||||
|
int newStart = start;
|
||||||
|
|
||||||
|
for (int i = start; i <= end; ++i) {
|
||||||
|
if (isspace(data[i]) != 0) {
|
||||||
|
data[i] = '\0';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newStart = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = end; i >= start; --i) {
|
||||||
|
if (isspace(data[i]) != 0)
|
||||||
|
data[i] = '\0';
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newStart;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2006 Christophe Dumez
|
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -24,8 +24,6 @@
|
|||||||
* modify file(s), you may extend this exception to your version of the file(s),
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*
|
|
||||||
* Contact : chris@qbittorrent.org
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FILTERPARSERTHREAD_H
|
#ifndef FILTERPARSERTHREAD_H
|
||||||
@@ -33,41 +31,38 @@
|
|||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
class QDataStream;
|
#include <libtorrent/ip_filter.hpp>
|
||||||
class QStringList;
|
|
||||||
|
|
||||||
namespace libtorrent
|
class QDataStream;
|
||||||
{
|
|
||||||
class session;
|
|
||||||
struct ip_filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
class FilterParserThread : public QThread
|
class FilterParserThread : public QThread
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FilterParserThread(libtorrent::session *s, QObject *parent = 0);
|
FilterParserThread(QObject *parent = nullptr);
|
||||||
~FilterParserThread();
|
~FilterParserThread();
|
||||||
void processFilterFile(QString filePath);
|
void processFilterFile(const QString &filePath);
|
||||||
|
libtorrent::ip_filter IPfilter();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void IPFilterParsed(int ruleCount);
|
void IPFilterParsed(int ruleCount);
|
||||||
void IPFilterError();
|
void IPFilterError();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString cleanupIPAddress(QString _ip);
|
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int parseDATFilterFile(QString filePath, libtorrent::ip_filter &filter);
|
int findAndNullDelimiter(char *const data, char delimiter, int start, int end, bool reverse = false);
|
||||||
int parseP2PFilterFile(QString filePath, libtorrent::ip_filter &filter);
|
int trim(char *const data, int start, int end);
|
||||||
|
int parseDATFilterFile();
|
||||||
|
int parseP2PFilterFile();
|
||||||
int getlineInStream(QDataStream &stream, std::string &name, char delim);
|
int getlineInStream(QDataStream &stream, std::string &name, char delim);
|
||||||
int parseP2BFilterFile(QString filePath, libtorrent::ip_filter &filter);
|
int parseP2BFilterFile();
|
||||||
|
|
||||||
libtorrent::session *m_session;
|
|
||||||
bool m_abort;
|
bool m_abort;
|
||||||
QString m_filePath;
|
QString m_filePath;
|
||||||
|
libtorrent::ip_filter m_filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BITTORRENT_FILTERPARSERTHREAD_H
|
#endif // BITTORRENT_FILTERPARSERTHREAD_H
|
||||||
|
|||||||
@@ -27,11 +27,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#ifdef QBT_USES_QT5
|
|
||||||
#include <QSaveFile>
|
#include <QSaveFile>
|
||||||
#else
|
|
||||||
#include <QFile>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
@@ -48,18 +44,12 @@ void ResumeDataSavingManager::saveResumeData(QString infoHash, QByteArray data)
|
|||||||
QString filepath = m_resumeDataDir.absoluteFilePath(filename);
|
QString filepath = m_resumeDataDir.absoluteFilePath(filename);
|
||||||
|
|
||||||
qDebug() << "Saving resume data in" << filepath;
|
qDebug() << "Saving resume data in" << filepath;
|
||||||
#ifdef QBT_USES_QT5
|
|
||||||
QSaveFile resumeFile(filepath);
|
QSaveFile resumeFile(filepath);
|
||||||
#else
|
|
||||||
QFile resumeFile(filepath);
|
|
||||||
#endif
|
|
||||||
if (resumeFile.open(QIODevice::WriteOnly)) {
|
if (resumeFile.open(QIODevice::WriteOnly)) {
|
||||||
resumeFile.write(data);
|
resumeFile.write(data);
|
||||||
#ifdef QBT_USES_QT5
|
|
||||||
if (!resumeFile.commit()) {
|
if (!resumeFile.commit()) {
|
||||||
Logger::instance()->addMessage(QString("Couldn't save resume data in %1. Error: %2")
|
Logger::instance()->addMessage(QString("Couldn't save resume data in %1. Error: %2")
|
||||||
.arg(filepath).arg(resumeFile.errorString()), Log::WARNING);
|
.arg(filepath).arg(resumeFile.errorString()), Log::WARNING);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||