Compare commits
168 Commits
v4_4_x
...
release-4.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
@@ -131,13 +131,13 @@ install:
|
|||||||
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.11+git20172003.8736a59adc.el_capitan.bottle.tar.gz
|
wget https://builds.shiki.hu/homebrew/libtorrent-rasterbar-1.0.11+git20170910.6d5625e0ea.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.11+git20172003.8736a59adc.el_capitan.bottle.tar.gz" "$(brew --cache)"
|
cp "$HOME/hombebrew_cache/libtorrent-rasterbar-1.0.11+git20170910.6d5625e0ea.el_capitan.bottle.tar.gz" "$(brew --cache)"
|
||||||
brew install "$HOME/hombebrew_cache/libtorrent-rasterbar.rb"
|
brew install "$HOME/hombebrew_cache/libtorrent-rasterbar.rb"
|
||||||
|
|
||||||
if [ "$build_system" = "cmake" ]; then
|
if [ "$build_system" = "cmake" ]; then
|
||||||
|
|||||||
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)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ If you make changes in a file that still uses another coding style, make sure th
|
|||||||
```c++
|
```c++
|
||||||
int myFunction(int a)
|
int myFunction(int a)
|
||||||
{
|
{
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
|
|
||||||
void myFunction() {} // empty body
|
void myFunction() {} // empty body
|
||||||
@@ -17,29 +17,29 @@ void myFunction() {} // empty body
|
|||||||
MyClass::MyClass(int *parent)
|
MyClass::MyClass(int *parent)
|
||||||
: m_parent(parent)
|
: m_parent(parent)
|
||||||
{
|
{
|
||||||
//initialize
|
// initialize
|
||||||
}
|
}
|
||||||
|
|
||||||
int MyClass::myMethod(int a)
|
int MyClass::myMethod(int a)
|
||||||
{
|
{
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyOtherClass
|
class MyOtherClass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//code
|
// code
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//code
|
// code
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//code
|
// code
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Name
|
namespace Name
|
||||||
{
|
{
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lambdas
|
// Lambdas
|
||||||
@@ -54,20 +54,20 @@ namespace Name
|
|||||||
#### b. Other code blocks ####
|
#### b. Other code blocks ####
|
||||||
```c++
|
```c++
|
||||||
if (condition) {
|
if (condition) {
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int a = 0; a < b; ++b) {
|
for (int a = 0; a < b; ++b) {
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (a) {
|
switch (a) {
|
||||||
case 1:
|
case 1:
|
||||||
//blah
|
// blah
|
||||||
case 2:
|
case 2:
|
||||||
//blah
|
// blah
|
||||||
default:
|
default:
|
||||||
//blah
|
// blah
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -75,17 +75,17 @@ default:
|
|||||||
```c++
|
```c++
|
||||||
switch (var) {
|
switch (var) {
|
||||||
case 1: {
|
case 1: {
|
||||||
//declare local variables
|
// declare local variables
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: {
|
case 2: {
|
||||||
//declare local variables
|
// declare local variables
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -103,13 +103,13 @@ QVariantMap map {{"key1", 5}, {"key2", 10}};
|
|||||||
#### a. Multiple tests ####
|
#### a. Multiple tests ####
|
||||||
```c++
|
```c++
|
||||||
if (condition) {
|
if (condition) {
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
else if (condition) {
|
else if (condition) {
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
The `else if`/`else` must be on their own lines.
|
The `else if`/`else` must be on their own lines.
|
||||||
@@ -154,7 +154,7 @@ myClass::myClass(int a, int b, int c, int d)
|
|||||||
, m_c(c)
|
, m_c(c)
|
||||||
, m_d(d)
|
, m_d(d)
|
||||||
{
|
{
|
||||||
//code
|
// code
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -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"
|
||||||
@@ -282,20 +282,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
|
||||||
|
|||||||
68
Changelog
@@ -1,4 +1,5 @@
|
|||||||
Unreleased - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.4.0
|
* 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: 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: Drop Qt 4 support. Raise minimum Qt version to 5.5.1 (evsh)
|
||||||
- FEATURE: UI for managing locally banned IP list (dzmat)
|
- FEATURE: UI for managing locally banned IP list (dzmat)
|
||||||
@@ -18,20 +19,85 @@ Unreleased - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.4.0
|
|||||||
- FEATURE: Fetch Favicons via google as a final fallback (KingLucius)
|
- FEATURE: Fetch Favicons via google as a final fallback (KingLucius)
|
||||||
- FEATURE: Add a Tags (multi-label) feature to the GUI. Closes #13. (tgregerson)
|
- 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 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: Adjust icons names to better fit FDO scheme (evsh)
|
||||||
- BUGFIX: Optimized IP filter parsing, making blazingly fast (sledgehammer999, 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: 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: Refactor and improve StatusBar (glassez)
|
||||||
- BUGFIX: Set expiration date for newly added cookie to +2 years from now, instead of +99 years. (Chocobo1)
|
- 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: Trackerlist: Set text alignment of columns with numbers to the right (thalieht)
|
||||||
- COSMETIC: Enable alternatingRowColors for "Manage Cookie" dialog (Chocobo1)
|
- 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: 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: Use explicit class for search plugin versions (evsh)
|
||||||
- SEARCH: Remove all search plugins from repo. There is another repo named 'search-plugins'. (sledgehammer999)
|
- 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: 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: Redesigned RSS subsystem (glassez)
|
||||||
- RSS: Do not use hardcoded colors in RSS feed view (evsh)
|
- 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: 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)
|
||||||
|
|||||||
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>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
399
configure
vendored
@@ -606,6 +606,8 @@ libtorrent_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
|
||||||
@@ -688,6 +690,7 @@ infodir
|
|||||||
docdir
|
docdir
|
||||||
oldincludedir
|
oldincludedir
|
||||||
includedir
|
includedir
|
||||||
|
runstatedir
|
||||||
localstatedir
|
localstatedir
|
||||||
sharedstatedir
|
sharedstatedir
|
||||||
sysconfdir
|
sysconfdir
|
||||||
@@ -737,6 +740,8 @@ PKG_CONFIG
|
|||||||
PKG_CONFIG_PATH
|
PKG_CONFIG_PATH
|
||||||
PKG_CONFIG_LIBDIR
|
PKG_CONFIG_LIBDIR
|
||||||
QT_QMAKE
|
QT_QMAKE
|
||||||
|
Qt5Svg_CFLAGS
|
||||||
|
Qt5Svg_LIBS
|
||||||
libtorrent_CFLAGS
|
libtorrent_CFLAGS
|
||||||
libtorrent_LIBS
|
libtorrent_LIBS
|
||||||
zlib_CFLAGS
|
zlib_CFLAGS
|
||||||
@@ -779,6 +784,7 @@ datadir='${datarootdir}'
|
|||||||
sysconfdir='${prefix}/etc'
|
sysconfdir='${prefix}/etc'
|
||||||
sharedstatedir='${prefix}/com'
|
sharedstatedir='${prefix}/com'
|
||||||
localstatedir='${prefix}/var'
|
localstatedir='${prefix}/var'
|
||||||
|
runstatedir='${localstatedir}/run'
|
||||||
includedir='${prefix}/include'
|
includedir='${prefix}/include'
|
||||||
oldincludedir='/usr/include'
|
oldincludedir='/usr/include'
|
||||||
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
||||||
@@ -1031,6 +1037,15 @@ do
|
|||||||
| -silent | --silent | --silen | --sile | --sil)
|
| -silent | --silent | --silen | --sile | --sil)
|
||||||
silent=yes ;;
|
silent=yes ;;
|
||||||
|
|
||||||
|
-runstatedir | --runstatedir | --runstatedi | --runstated \
|
||||||
|
| --runstate | --runstat | --runsta | --runst | --runs \
|
||||||
|
| --run | --ru | --r)
|
||||||
|
ac_prev=runstatedir ;;
|
||||||
|
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
|
||||||
|
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
|
||||||
|
| --run=* | --ru=* | --r=*)
|
||||||
|
runstatedir=$ac_optarg ;;
|
||||||
|
|
||||||
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
||||||
ac_prev=sbindir ;;
|
ac_prev=sbindir ;;
|
||||||
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
||||||
@@ -1168,7 +1183,7 @@ fi
|
|||||||
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
||||||
datadir sysconfdir sharedstatedir localstatedir includedir \
|
datadir sysconfdir sharedstatedir localstatedir includedir \
|
||||||
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
||||||
libdir localedir mandir
|
libdir localedir mandir runstatedir
|
||||||
do
|
do
|
||||||
eval ac_val=\$$ac_var
|
eval ac_val=\$$ac_var
|
||||||
# Remove trailing slashes.
|
# Remove trailing slashes.
|
||||||
@@ -1321,6 +1336,7 @@ Fine tuning of the installation directories:
|
|||||||
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
||||||
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
||||||
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
||||||
|
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
|
||||||
--libdir=DIR object code libraries [EPREFIX/lib]
|
--libdir=DIR object code libraries [EPREFIX/lib]
|
||||||
--includedir=DIR C header files [PREFIX/include]
|
--includedir=DIR C header files [PREFIX/include]
|
||||||
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
||||||
@@ -1408,6 +1424,9 @@ Some influential environment variables:
|
|||||||
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.5.1, overriding pkg-config
|
QT_QMAKE value of host_bins for Qt5Core >= 5.5.1, overriding pkg-config
|
||||||
|
Qt5Svg_CFLAGS
|
||||||
|
C compiler flags for Qt5Svg, 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
|
||||||
@@ -4477,6 +4496,104 @@ $as_echo "not found" >&6; }
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "x$QT_QMAKE" = "x"; then :
|
||||||
|
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
|
||||||
|
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_CFLAGS=`$PKG_CONFIG --cflags "Qt5Svg >= 5.5.1" 2>/dev/null`
|
||||||
|
test "x$?" != "x0" && pkg_failed=yes
|
||||||
|
else
|
||||||
|
pkg_failed=yes
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
pkg_failed=untried
|
||||||
|
fi
|
||||||
|
if test -n "$Qt5Svg_LIBS"; then
|
||||||
|
pkg_cv_Qt5Svg_LIBS="$Qt5Svg_LIBS"
|
||||||
|
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
|
||||||
|
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
|
||||||
|
Qt5Svg_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "Qt5Svg >= 5.5.1" 2>&1`
|
||||||
|
else
|
||||||
|
Qt5Svg_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "Qt5Svg >= 5.5.1" 2>&1`
|
||||||
|
fi
|
||||||
|
# Put the nasty error message in config.log where it belongs
|
||||||
|
echo "$Qt5Svg_PKG_ERRORS" >&5
|
||||||
|
|
||||||
|
as_fn_error $? "Package requirements (Qt5Svg >= 5.5.1) were not met:
|
||||||
|
|
||||||
|
$Qt5Svg_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 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
|
||||||
{ $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 #(
|
||||||
@@ -4523,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"
|
||||||
@@ -4543,78 +4659,122 @@ 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
|
||||||
fi
|
_AX_BOOST_BASE_TONUMERICVERSION_req="1.35"
|
||||||
WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
|
fi
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= $boost_lib_version_req" >&5
|
_AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\.[0-9]*\)'`
|
||||||
$as_echo_n "checking for boostlib >= $boost_lib_version_req... " >&6; }
|
_AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\)'`
|
||||||
|
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
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
|
case ${host_cpu} in #(
|
||||||
|
x86_64) :
|
||||||
|
libsubdirs="lib64 libx32 lib lib64" ;; #(
|
||||||
|
ppc64|s390x|sparc64|aarch64|ppc64le) :
|
||||||
|
libsubdirs="lib64 lib lib64" ;; #(
|
||||||
|
libsubdirs="lib") :
|
||||||
|
;; #(
|
||||||
|
*) :
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
case ${host_cpu} in
|
case ${host_cpu} in #(
|
||||||
i?86)
|
i?86) :
|
||||||
libsubdirs="lib/i386-${host_os} $libsubdirs"
|
multiarch_libsubdir="lib/i386-${host_os}" ;; #(
|
||||||
;;
|
*) :
|
||||||
esac
|
multiarch_libsubdir="lib/${host_cpu}-${host_os}"
|
||||||
|
;;
|
||||||
|
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
|
|
||||||
fi
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
done
|
$as_echo "yes" >&6; }
|
||||||
elif test "$cross_compiling" != yes; then
|
BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
|
||||||
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; 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}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"" >&5
|
||||||
for libsubdir in $libsubdirs ; do
|
$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 ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
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
|
||||||
|
done
|
||||||
|
else
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
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
|
|
||||||
|
|
||||||
if test "$ac_boost_lib_path" != ""; then
|
fi
|
||||||
BOOST_LDFLAGS="-L$ac_boost_lib_path"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
if test "x$_AX_BOOST_BASE_boost_lib_path" != "x"; then :
|
||||||
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"
|
||||||
|
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
|
||||||
@@ -4633,17 +4793,13 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
|
|
||||||
#include <boost/version.hpp>
|
#include <boost/version.hpp>
|
||||||
|
|
||||||
int
|
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;
|
||||||
@@ -4667,39 +4823,47 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if test "x$succeeded" != "xyes"; then
|
if test "x$succeeded" != "xyes" ; then
|
||||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
LDFLAGS="$LDFLAGS_SAVED"
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
BOOST_CPPFLAGS=
|
BOOST_CPPFLAGS=
|
||||||
BOOST_LDFLAGS=
|
if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
|
||||||
|
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
|
||||||
@@ -4707,7 +4871,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
|
||||||
@@ -4715,7 +4879,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
|
||||||
@@ -4724,7 +4888,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"
|
||||||
@@ -4748,17 +4912,13 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
|
|
||||||
#include <boost/version.hpp>
|
#include <boost/version.hpp>
|
||||||
|
|
||||||
int
|
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;
|
||||||
@@ -4781,41 +4941,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.
|
CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
|
||||||
if test "x$BOOST_CPPFLAGS" = "x"; then :
|
LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
|
||||||
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"
|
|
||||||
LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -5059,15 +5215,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 :
|
LIBS="$BOOST_SYSTEM_LIB $LIBS"
|
||||||
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"
|
|
||||||
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; }
|
||||||
@@ -8024,4 +8174,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
|
||||||
|
|
||||||
|
|||||||
29
configure.ac
@@ -116,6 +116,12 @@ AS_CASE(["x$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".])])
|
||||||
|
|
||||||
FIND_QT5()
|
FIND_QT5()
|
||||||
|
AS_IF([test "x$QT_QMAKE" = "x"],
|
||||||
|
[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"],
|
||||||
@@ -132,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])],
|
CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
|
||||||
[AC_MSG_NOTICE([Boost CPPFLAGS: $BOOST_CPPFLAGS])
|
LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
|
||||||
CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
|
|
||||||
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"],
|
||||||
@@ -234,4 +234,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()
|
||||||
|
|
||||||
|
|||||||
2
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.4.0</string>
|
<string>4.0.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>qBit</string>
|
<string>qBit</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
|
|||||||
BIN
dist/mac/qBitTorrentDocument.icns
vendored
BIN
dist/mac/qbittorrent_mac.icns
vendored
5
dist/unix/CMakeLists.txt
vendored
@@ -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)
|
||||||
@@ -38,6 +34,7 @@ if (GUI)
|
|||||||
COMPONENT data)
|
COMPONENT data)
|
||||||
|
|
||||||
install(FILES
|
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-dark.svg
|
||||||
${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray-light.svg
|
${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray-light.svg
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status
|
||||||
|
|||||||
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 |
2
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
|
||||||
|
|||||||
BIN
dist/windows/nsis plugins/FindProcDLL_mod_by_hnedka.7z
vendored
Normal file
2
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.4.0"
|
!define PROG_VERSION "4.0.0"
|
||||||
|
|
||||||
!define MUI_FINISHPAGE_RUN
|
!define MUI_FINISHPAGE_RUN
|
||||||
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
||||||
|
|||||||
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,
|
||||||
if test -d "$withval"
|
so use this parameter only if default library detection fails
|
||||||
then
|
and you know exactly where your boost libraries are located.])],
|
||||||
ac_boost_lib_path="$withval"
|
[
|
||||||
else
|
AS_IF([test -d "$withval"],
|
||||||
AC_MSG_ERROR(--with-boost-libdir expected directory name)
|
[_AX_BOOST_BASE_boost_lib_path="$withval"],
|
||||||
fi
|
[AC_MSG_ERROR([--with-boost-libdir expected directory name])])
|
||||||
],
|
],
|
||||||
[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
|
||||||
fi
|
AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"])
|
||||||
done
|
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" ],[
|
||||||
elif test "$cross_compiling" != yes; then
|
AC_MSG_RESULT([yes])
|
||||||
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
|
||||||
if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
|
break;
|
||||||
for libsubdir in $libsubdirs ; do
|
],
|
||||||
if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
[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
|
||||||
|
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
|
])
|
||||||
|
|
||||||
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
|
||||||
@@ -172,40 +189,50 @@ if test "x$want_boost" = "xyes"; then
|
|||||||
|
|
||||||
dnl if we found no boost with system layout we search for boost libraries
|
dnl if we found no boost with system layout we search for boost libraries
|
||||||
dnl built and installed without the --layout=system option or for a staged(not installed) version
|
dnl built and installed without the --layout=system option or for a staged(not installed) version
|
||||||
if test "x$succeeded" != "xyes"; then
|
if test "x$succeeded" != "xyes" ; then
|
||||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
LDFLAGS="$LDFLAGS_SAVED"
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
BOOST_CPPFLAGS=
|
BOOST_CPPFLAGS=
|
||||||
BOOST_LDFLAGS=
|
if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
|
||||||
|
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],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -9,7 +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
|
||||||
|
|
||||||
QT_LANG_PATH = ../dist/qt-translations
|
QT_LANG_PATH = ../dist/qt-translations
|
||||||
DIST_PATH = ../dist/mac
|
DIST_PATH = ../dist/mac
|
||||||
|
|||||||
16
os2conf.pri
@@ -1,16 +0,0 @@
|
|||||||
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,7 +2,7 @@ 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, 5) {
|
equals(QT_MAJOR_VERSION, 5) {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ find_package(LibtorrentRasterbar REQUIRED)
|
|||||||
# Qt
|
# Qt
|
||||||
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 Svg Widgets)
|
list (APPEND QBT_QT_COMPONENTS Gui Svg Widgets)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
list (APPEND QBT_QT_COMPONENTS WinExtras)
|
list (APPEND QBT_QT_COMPONENTS WinExtras)
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
@@ -40,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)
|
||||||
|
|||||||
@@ -146,6 +146,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()
|
||||||
{
|
{
|
||||||
@@ -307,22 +314,22 @@ void Application::runExternalProgram(BitTorrent::TorrentHandle *const torrent) c
|
|||||||
#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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,7 +490,12 @@ 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::Session; // create RSS::Session singleton
|
||||||
new RSS::AutoDownloader; // create RSS::AutoDownloader singleton
|
new RSS::AutoDownloader; // create RSS::AutoDownloader singleton
|
||||||
@@ -554,7 +566,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
|
||||||
@@ -589,16 +601,16 @@ void Application::initializeTranslation()
|
|||||||
|
|
||||||
if (m_qtTranslator.load(QString::fromUtf8("qtbase_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) ||
|
if (m_qtTranslator.load(QString::fromUtf8("qtbase_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) ||
|
||||||
m_qtTranslator.load(QString::fromUtf8("qt_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
|
m_qtTranslator.load(QString::fromUtf8("qt_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
|
||||||
qDebug("Qt %s locale recognized, using translation.", qPrintable(localeStr));
|
qDebug("Qt %s locale recognized, using translation.", qUtf8Printable(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(QString::fromUtf8(":/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
|
||||||
@@ -642,37 +654,36 @@ 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
|
|
||||||
|
|
||||||
// Hide the window and not leave it on screen as
|
#ifndef DISABLE_GUI
|
||||||
// unresponsive. Also for Windows take the WinId
|
if (m_window) {
|
||||||
// after it's hidden, because hide() may cause a
|
// Hide the window and not leave it on screen as
|
||||||
// WinId change.
|
// unresponsive. Also for Windows take the WinId
|
||||||
m_window->hide();
|
// after it's hidden, because hide() may cause a
|
||||||
|
// WinId change.
|
||||||
|
m_window->hide();
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
typedef BOOL (WINAPI *PSHUTDOWNBRCREATE)(HWND, LPCWSTR);
|
typedef BOOL (WINAPI *PSHUTDOWNBRCREATE)(HWND, LPCWSTR);
|
||||||
PSHUTDOWNBRCREATE shutdownBRCreate = (PSHUTDOWNBRCREATE)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonCreate");
|
PSHUTDOWNBRCREATE shutdownBRCreate = (PSHUTDOWNBRCREATE)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonCreate");
|
||||||
// Only available on Vista+
|
// Only available on Vista+
|
||||||
if (shutdownBRCreate)
|
if (shutdownBRCreate)
|
||||||
shutdownBRCreate((HWND)m_window->effectiveWinId(), tr("Saving torrent progress...").toStdWString().c_str());
|
shutdownBRCreate((HWND)m_window->effectiveWinId(), tr("Saving torrent progress...").toStdWString().c_str());
|
||||||
#endif // Q_OS_WIN
|
#endif // Q_OS_WIN
|
||||||
|
|
||||||
// Do manual cleanup in MainWindow to force widgets
|
// Do manual cleanup in MainWindow to force widgets
|
||||||
// to save their Preferences, stop all timers and
|
// to save their Preferences, stop all timers and
|
||||||
// delete as many widgets as possible to leave only
|
// delete as many widgets as possible to leave only
|
||||||
// a 'shell' MainWindow.
|
// a 'shell' MainWindow.
|
||||||
// We need a valid window handle for Windows Vista+
|
// We need a valid window handle for Windows Vista+
|
||||||
// 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
|
||||||
@@ -697,14 +708,16 @@ 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");
|
||||||
// Only available on Vista+
|
// Only available on Vista+
|
||||||
if (shutdownBRDestroy)
|
if (shutdownBRDestroy)
|
||||||
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) {
|
||||||
|
|||||||
@@ -73,9 +73,11 @@ namespace RSS
|
|||||||
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();
|
||||||
@@ -132,7 +134,7 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DISABLE_WEBUI
|
#ifndef DISABLE_WEBUI
|
||||||
QPointer<WebUI> m_webui;
|
WebUI *m_webui;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// FileLog
|
// FileLog
|
||||||
@@ -145,7 +147,7 @@ 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();
|
void validateCommandLineParameters();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -417,7 +417,7 @@ QBtCommandLineParameters parseCommandLine(const QStringList &args)
|
|||||||
else if (arg == WEBUI_PORT_OPTION) {
|
else if (arg == WEBUI_PORT_OPTION) {
|
||||||
result.webUiPort = WEBUI_PORT_OPTION.value(arg);
|
result.webUiPort = WEBUI_PORT_OPTION.value(arg);
|
||||||
if ((result.webUiPort < 1) || (result.webUiPort > 65535))
|
if ((result.webUiPort < 1) || (result.webUiPort > 65535))
|
||||||
throw CommandLineParameterError(QObject::tr("%1 must specify the correct port (1 to 65535).")
|
throw CommandLineParameterError(QObject::tr("%1 must specify a valid port (1 to 65535).")
|
||||||
.arg(QLatin1String("--webui-port")));
|
.arg(QLatin1String("--webui-port")));
|
||||||
}
|
}
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
@@ -523,11 +523,11 @@ QString makeUsage(const QString &prgName)
|
|||||||
|
|
||||||
stream << QObject::tr("Options:") << '\n';
|
stream << QObject::tr("Options:") << '\n';
|
||||||
#ifndef Q_OS_WIN
|
#ifndef Q_OS_WIN
|
||||||
stream << SHOW_VERSION_OPTION.usage() << wrapText(QObject::tr("Displays program version and exit")) << '\n';
|
stream << SHOW_VERSION_OPTION.usage() << wrapText(QObject::tr("Display program version and exit")) << '\n';
|
||||||
#endif
|
#endif
|
||||||
stream << SHOW_HELP_OPTION.usage() << wrapText(QObject::tr("Displays this help message and exit")) << '\n';
|
stream << SHOW_HELP_OPTION.usage() << wrapText(QObject::tr("Display this help message and exit")) << '\n';
|
||||||
stream << WEBUI_PORT_OPTION.usage(QObject::tr("port"))
|
stream << WEBUI_PORT_OPTION.usage(QObject::tr("port"))
|
||||||
<< wrapText(QObject::tr("Changes the Web UI port"))
|
<< wrapText(QObject::tr("Change the Web UI port"))
|
||||||
<< '\n';
|
<< '\n';
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
stream << NO_SPLASH_OPTION.usage() << wrapText(QObject::tr("Disable splash screen")) << '\n';
|
stream << NO_SPLASH_OPTION.usage() << wrapText(QObject::tr("Disable splash screen")) << '\n';
|
||||||
@@ -543,9 +543,10 @@ QString makeUsage(const QString &prgName)
|
|||||||
<< wrapText(QObject::tr("Hack into libtorrent fastresume files and make file paths relative "
|
<< wrapText(QObject::tr("Hack into libtorrent fastresume files and make file paths relative "
|
||||||
"to the profile directory")) << '\n';
|
"to the profile directory")) << '\n';
|
||||||
stream << PORTABLE_OPTION.usage()
|
stream << PORTABLE_OPTION.usage()
|
||||||
<< wrapText(QObject::tr("Shortcut for --profile=<exe dir>/profile --relative-fastresume")) << '\n';
|
<< wrapText(QObject::tr("Shortcut for %1", "Shortcut for --profile=<exe dir>/profile --relative-fastresume")
|
||||||
stream << Option::padUsageText(QObject::tr("files or urls"))
|
.arg(QLatin1String("--profile=<exe dir>/profile --relative-fastresume"))) << '\n';
|
||||||
<< wrapText(QObject::tr("Downloads the torrents passed by the user")) << '\n'
|
stream << Option::padUsageText(QObject::tr("files or URLs"))
|
||||||
|
<< wrapText(QObject::tr("Download the torrents passed by the user")) << '\n'
|
||||||
<< '\n';
|
<< '\n';
|
||||||
|
|
||||||
stream << wrapText(QObject::tr("Options when adding new torrents:"), 0) << '\n';
|
stream << wrapText(QObject::tr("Options when adding new torrents:"), 0) << '\n';
|
||||||
@@ -559,7 +560,7 @@ QString makeUsage(const QString &prgName)
|
|||||||
stream << FIRST_AND_LAST_OPTION.usage()
|
stream << FIRST_AND_LAST_OPTION.usage()
|
||||||
<< wrapText(QObject::tr("Download first and last pieces first")) << '\n';
|
<< wrapText(QObject::tr("Download first and last pieces first")) << '\n';
|
||||||
stream << SKIP_DIALOG_OPTION.usage()
|
stream << SKIP_DIALOG_OPTION.usage()
|
||||||
<< wrapText(QObject::tr("Specifies whether the \"Add New Torrent\" dialog opens when adding a "
|
<< wrapText(QObject::tr("Specify whether the \"Add New Torrent\" dialog opens when adding a "
|
||||||
"torrent.")) << '\n';
|
"torrent.")) << '\n';
|
||||||
stream << '\n';
|
stream << '\n';
|
||||||
|
|
||||||
|
|||||||
@@ -84,10 +84,17 @@ 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
|
||||||
|
|
||||||
@@ -214,7 +221,7 @@ int main(int argc, char *argv[])
|
|||||||
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
|
// On OS X the standard is to not show icons in the menus
|
||||||
app->setAttribute(Qt::AA_DontShowIconsInMenus);
|
app->setAttribute(Qt::AA_DontShowIconsInMenus);
|
||||||
#endif
|
#endif
|
||||||
@@ -276,12 +283,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
|
||||||
@@ -289,19 +295,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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,14 +68,16 @@ 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(trace);
|
.arg(sigName)
|
||||||
|
.arg(trace);
|
||||||
|
|
||||||
errorText->setHtml(htmlStr);
|
errorText->setHtml(htmlStr);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ bool upgrade(bool ask = true)
|
|||||||
resumeData["qBt-forced"] = false;
|
resumeData["qBt-forced"] = false;
|
||||||
|
|
||||||
resumeData["qBt-savePath"] = oldTorrent.value("save_path").toString().toStdString();
|
resumeData["qBt-savePath"] = oldTorrent.value("save_path").toString().toStdString();
|
||||||
resumeData["qBt-ratioLimit"] = QString::number(oldTorrent.value("max_ratio", -2).toReal()).toStdString();
|
resumeData["qBt-ratioLimit"] = static_cast<int>(oldTorrent.value("max_ratio", -2).toReal() * 1000);
|
||||||
resumeData["qBt-label"] = oldTorrent.value("label").toString().toStdString();
|
resumeData["qBt-label"] = oldTorrent.value("label").toString().toStdString();
|
||||||
resumeData["qBt-name"] = oldTorrent.value("name").toString().toStdString();
|
resumeData["qBt-name"] = oldTorrent.value("name").toString().toStdString();
|
||||||
resumeData["qBt-seedStatus"] = oldTorrent.value("seed").toBool();
|
resumeData["qBt-seedStatus"] = oldTorrent.value("seed").toBool();
|
||||||
|
|||||||
@@ -141,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)
|
||||||
|
|||||||
@@ -51,5 +51,8 @@ namespace BitTorrent
|
|||||||
bool ignoreShareLimits = false;
|
bool ignoreShareLimits = false;
|
||||||
bool skipChecking = false;
|
bool skipChecking = false;
|
||||||
TriStateBool createSubfolder;
|
TriStateBool createSubfolder;
|
||||||
|
TriStateBool useAutoTMM;
|
||||||
|
int uploadLimit = -1;
|
||||||
|
int downloadLimit = -1;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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,7 +115,6 @@ 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);
|
||||||
@@ -136,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);
|
||||||
@@ -152,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);
|
||||||
@@ -183,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())),
|
||||||
@@ -195,7 +191,6 @@ QString PeerInfo::client() const
|
|||||||
return QString::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;
|
||||||
@@ -206,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;
|
||||||
@@ -217,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;
|
||||||
@@ -239,7 +232,7 @@ QString PeerInfo::connectionType() const
|
|||||||
return QString::fromUtf8(C_UTP);
|
return QString::fromUtf8(C_UTP);
|
||||||
|
|
||||||
QString connection;
|
QString connection;
|
||||||
switch(m_nativeInfo.connection_type) {
|
switch (m_nativeInfo.connection_type) {
|
||||||
case libt::peer_info::http_seed:
|
case libt::peer_info::http_seed:
|
||||||
case libt::peer_info::web_seed:
|
case libt::peer_info::web_seed:
|
||||||
connection = "Web";
|
connection = "Web";
|
||||||
@@ -281,14 +274,14 @@ qreal PeerInfo::relevance() const
|
|||||||
void PeerInfo::determineFlags()
|
void PeerInfo::determineFlags()
|
||||||
{
|
{
|
||||||
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)");
|
m_flagsDescription += tr("interested(local) and choked(peer)");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
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)");
|
m_flagsDescription += tr("interested(local) and unchoked(peer)");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
@@ -296,92 +289,91 @@ void PeerInfo::determineFlags()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isRemoteInterested()) {
|
if (isRemoteInterested()) {
|
||||||
//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)");
|
m_flagsDescription += tr("interested(peer) and choked(local)");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
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)");
|
m_flagsDescription += tr("interested(peer) and unchoked(local)");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//O = Optimistic unchoke
|
// O = Optimistic unchoke
|
||||||
if (optimisticUnchoke()) {
|
if (optimisticUnchoke()) {
|
||||||
m_flags += "O ";
|
m_flags += "O ";
|
||||||
m_flagsDescription += tr("optimistic unchoke");
|
m_flagsDescription += tr("optimistic unchoke");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//S = Peer is snubbed
|
// S = Peer is snubbed
|
||||||
if (isSnubbed()) {
|
if (isSnubbed()) {
|
||||||
m_flags += "S ";
|
m_flags += "S ";
|
||||||
m_flagsDescription += tr("peer snubbed");
|
m_flagsDescription += tr("peer snubbed");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//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");
|
m_flagsDescription += tr("incoming connection");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//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)");
|
m_flagsDescription += tr("not interested(local) and unchoked(peer)");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//? = 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)");
|
m_flagsDescription += tr("not interested(peer) and unchoked(local)");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//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");
|
m_flagsDescription += tr("peer from PEX");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//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");
|
m_flagsDescription += tr("peer from DHT");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//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");
|
m_flagsDescription += tr("encrypted traffic");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//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");
|
m_flagsDescription += tr("encrypted handshake");
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//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);
|
m_flagsDescription += QString::fromUtf8(C_UTP);
|
||||||
m_flagsDescription += ", ";
|
m_flagsDescription += ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
//L = Peer is local
|
// L = Peer is local
|
||||||
if (fromLSD()) {
|
if (fromLSD()) {
|
||||||
m_flags += "L";
|
m_flags += "L";
|
||||||
m_flagsDescription += tr("peer from LSD");
|
m_flagsDescription += tr("peer from LSD");
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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,17 +24,15 @@
|
|||||||
* 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 "filterparserthread.h"
|
#include "filterparserthread.h"
|
||||||
|
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
|
||||||
#include <cctype>
|
|
||||||
|
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
|
|
||||||
namespace libt = libtorrent;
|
namespace libt = libtorrent;
|
||||||
@@ -126,7 +124,7 @@ int FilterParserThread::parseDATFilterFile()
|
|||||||
if (!file.exists()) return ruleCount;
|
if (!file.exists()) return ruleCount;
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
LogMsg(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,7 +258,7 @@ int FilterParserThread::parseP2PFilterFile()
|
|||||||
if (!file.exists()) return ruleCount;
|
if (!file.exists()) return ruleCount;
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
LogMsg(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,7 +405,7 @@ int FilterParserThread::parseP2BFilterFile()
|
|||||||
if (!file.exists()) return ruleCount;
|
if (!file.exists()) return ruleCount;
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly)) {
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
LogMsg(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -444,7 +442,7 @@ int FilterParserThread::parseP2BFilterFile()
|
|||||||
m_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 &) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (version == 3) {
|
else if (version == 3) {
|
||||||
@@ -494,7 +492,7 @@ int FilterParserThread::parseP2BFilterFile()
|
|||||||
m_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 &) {}
|
||||||
|
|
||||||
if (m_abort) return ruleCount;
|
if (m_abort) return ruleCount;
|
||||||
}
|
}
|
||||||
@@ -553,7 +551,7 @@ void FilterParserThread::run()
|
|||||||
try {
|
try {
|
||||||
emit IPFilterParsed(ruleCount);
|
emit IPFilterParsed(ruleCount);
|
||||||
}
|
}
|
||||||
catch(std::exception &) {
|
catch (std::exception &) {
|
||||||
emit IPFilterError();
|
emit IPFilterError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -42,7 +40,7 @@ class FilterParserThread : public QThread
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FilterParserThread(QObject *parent = 0);
|
FilterParserThread(QObject *parent = nullptr);
|
||||||
~FilterParserThread();
|
~FilterParserThread();
|
||||||
void processFilterFile(const QString &filePath);
|
void processFilterFile(const QString &filePath);
|
||||||
libtorrent::ip_filter IPfilter();
|
libtorrent::ip_filter IPfilter();
|
||||||
|
|||||||
@@ -29,11 +29,11 @@
|
|||||||
#ifndef RESUMEDATASAVINGMANAGER_H
|
#ifndef RESUMEDATASAVINGMANAGER_H
|
||||||
#define RESUMEDATASAVINGMANAGER_H
|
#define RESUMEDATASAVINGMANAGER_H
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
class ResumeDataSavingManager: public QObject
|
class ResumeDataSavingManager : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
#include <libtorrent/session.hpp>
|
#include <libtorrent/session.hpp>
|
||||||
|
|
||||||
|
#include "base/bittorrent/session.h"
|
||||||
#include "base/bittorrent/sessionstatus.h"
|
#include "base/bittorrent/sessionstatus.h"
|
||||||
#include "base/profile.h"
|
#include "base/profile.h"
|
||||||
#include "base/bittorrent/session.h"
|
|
||||||
|
|
||||||
static const qint64 SAVE_INTERVAL = 15 * 60 * 1000;
|
static const qint64 SAVE_INTERVAL = 15 * 60 * 1000;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,10 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
namespace BitTorrent { class Session; }
|
namespace BitTorrent
|
||||||
|
{
|
||||||
|
class Session;
|
||||||
|
}
|
||||||
|
|
||||||
class Statistics : QObject
|
class Statistics : QObject
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -151,6 +151,47 @@ namespace BitTorrent
|
|||||||
uint nbErrored = 0;
|
uint nbErrored = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SessionSettingsEnums
|
||||||
|
{
|
||||||
|
Q_GADGET
|
||||||
|
|
||||||
|
public:
|
||||||
|
// TODO: remove `SessionSettingsEnums` wrapper when we can use `Q_ENUM_NS` directly (QT >= 5.8 only)
|
||||||
|
enum class ChokingAlgorithm : int
|
||||||
|
{
|
||||||
|
FixedSlots = 0,
|
||||||
|
RateBased = 1
|
||||||
|
};
|
||||||
|
Q_ENUM(ChokingAlgorithm)
|
||||||
|
|
||||||
|
enum class SeedChokingAlgorithm : int
|
||||||
|
{
|
||||||
|
RoundRobin = 0,
|
||||||
|
FastestUpload = 1,
|
||||||
|
AntiLeech = 2
|
||||||
|
};
|
||||||
|
Q_ENUM(SeedChokingAlgorithm)
|
||||||
|
|
||||||
|
enum class MixedModeAlgorithm : int
|
||||||
|
{
|
||||||
|
TCP = 0,
|
||||||
|
Proportional = 1
|
||||||
|
};
|
||||||
|
Q_ENUM(MixedModeAlgorithm)
|
||||||
|
|
||||||
|
enum class BTProtocol : int
|
||||||
|
{
|
||||||
|
Both = 0,
|
||||||
|
TCP = 1,
|
||||||
|
UTP = 2
|
||||||
|
};
|
||||||
|
Q_ENUM(BTProtocol)
|
||||||
|
};
|
||||||
|
using ChokingAlgorithm = SessionSettingsEnums::ChokingAlgorithm;
|
||||||
|
using SeedChokingAlgorithm = SessionSettingsEnums::SeedChokingAlgorithm;
|
||||||
|
using MixedModeAlgorithm = SessionSettingsEnums::MixedModeAlgorithm;
|
||||||
|
using BTProtocol = SessionSettingsEnums::BTProtocol;
|
||||||
|
|
||||||
#if LIBTORRENT_VERSION_NUM >= 10100
|
#if LIBTORRENT_VERSION_NUM >= 10100
|
||||||
struct SessionMetricIndices
|
struct SessionMetricIndices
|
||||||
{
|
{
|
||||||
@@ -188,6 +229,9 @@ namespace BitTorrent
|
|||||||
int diskBlocksInUse = 0;
|
int diskBlocksInUse = 0;
|
||||||
int numBlocksRead = 0;
|
int numBlocksRead = 0;
|
||||||
int numBlocksCacheHits = 0;
|
int numBlocksCacheHits = 0;
|
||||||
|
int writeJobs = 0;
|
||||||
|
int readJobs = 0;
|
||||||
|
int hashJobs = 0;
|
||||||
int queuedDiskJobs = 0;
|
int queuedDiskJobs = 0;
|
||||||
int diskJobTime = 0;
|
int diskJobTime = 0;
|
||||||
} disk;
|
} disk;
|
||||||
@@ -210,13 +254,13 @@ namespace BitTorrent
|
|||||||
void setTempPath(QString path);
|
void setTempPath(QString path);
|
||||||
bool isTempPathEnabled() const;
|
bool isTempPathEnabled() const;
|
||||||
void setTempPathEnabled(bool enabled);
|
void setTempPathEnabled(bool enabled);
|
||||||
QString torrentTempPath(const InfoHash &hash) const;
|
QString torrentTempPath(const TorrentInfo &torrentInfo) const;
|
||||||
|
|
||||||
static bool isValidCategoryName(const QString &name);
|
static bool isValidCategoryName(const QString &name);
|
||||||
// returns category itself and all top level categories
|
// returns category itself and all top level categories
|
||||||
static QStringList expandCategory(const QString &category);
|
static QStringList expandCategory(const QString &category);
|
||||||
|
|
||||||
QStringList categories() const;
|
const QStringMap &categories() const;
|
||||||
QString categorySavePath(const QString &categoryName) const;
|
QString categorySavePath(const QString &categoryName) const;
|
||||||
bool addCategory(const QString &name, const QString &savePath = "");
|
bool addCategory(const QString &name, const QString &savePath = "");
|
||||||
bool editCategory(const QString &name, const QString &savePath);
|
bool editCategory(const QString &name, const QString &savePath);
|
||||||
@@ -314,6 +358,10 @@ namespace BitTorrent
|
|||||||
void setForceProxyEnabled(bool enabled);
|
void setForceProxyEnabled(bool enabled);
|
||||||
bool isProxyPeerConnectionsEnabled() const;
|
bool isProxyPeerConnectionsEnabled() const;
|
||||||
void setProxyPeerConnectionsEnabled(bool enabled);
|
void setProxyPeerConnectionsEnabled(bool enabled);
|
||||||
|
ChokingAlgorithm chokingAlgorithm() const;
|
||||||
|
void setChokingAlgorithm(ChokingAlgorithm mode);
|
||||||
|
SeedChokingAlgorithm seedChokingAlgorithm() const;
|
||||||
|
void setSeedChokingAlgorithm(SeedChokingAlgorithm mode);
|
||||||
bool isAddTrackersEnabled() const;
|
bool isAddTrackersEnabled() const;
|
||||||
void setAddTrackersEnabled(bool enabled);
|
void setAddTrackersEnabled(bool enabled);
|
||||||
QString additionalTrackers() const;
|
QString additionalTrackers() const;
|
||||||
@@ -324,22 +372,34 @@ namespace BitTorrent
|
|||||||
void setIPFilterFile(QString path);
|
void setIPFilterFile(QString path);
|
||||||
bool announceToAllTrackers() const;
|
bool announceToAllTrackers() const;
|
||||||
void setAnnounceToAllTrackers(bool val);
|
void setAnnounceToAllTrackers(bool val);
|
||||||
uint diskCacheSize() const;
|
bool announceToAllTiers() const;
|
||||||
void setDiskCacheSize(uint size);
|
void setAnnounceToAllTiers(bool val);
|
||||||
uint diskCacheTTL() const;
|
int diskCacheSize() const;
|
||||||
void setDiskCacheTTL(uint ttl);
|
void setDiskCacheSize(int size);
|
||||||
|
int diskCacheTTL() const;
|
||||||
|
void setDiskCacheTTL(int ttl);
|
||||||
bool useOSCache() const;
|
bool useOSCache() const;
|
||||||
void setUseOSCache(bool use);
|
void setUseOSCache(bool use);
|
||||||
|
bool isGuidedReadCacheEnabled() const;
|
||||||
|
void setGuidedReadCacheEnabled(bool enabled);
|
||||||
|
bool isSuggestModeEnabled() const;
|
||||||
|
void setSuggestMode(bool mode);
|
||||||
|
int sendBufferWatermark() const;
|
||||||
|
void setSendBufferWatermark(int value);
|
||||||
|
int sendBufferLowWatermark() const;
|
||||||
|
void setSendBufferLowWatermark(int value);
|
||||||
|
int sendBufferWatermarkFactor() const;
|
||||||
|
void setSendBufferWatermarkFactor(int value);
|
||||||
bool isAnonymousModeEnabled() const;
|
bool isAnonymousModeEnabled() const;
|
||||||
void setAnonymousModeEnabled(bool enabled);
|
void setAnonymousModeEnabled(bool enabled);
|
||||||
bool isQueueingSystemEnabled() const;
|
bool isQueueingSystemEnabled() const;
|
||||||
void setQueueingSystemEnabled(bool enabled);
|
void setQueueingSystemEnabled(bool enabled);
|
||||||
bool ignoreSlowTorrentsForQueueing() const;
|
bool ignoreSlowTorrentsForQueueing() const;
|
||||||
void setIgnoreSlowTorrentsForQueueing(bool ignore);
|
void setIgnoreSlowTorrentsForQueueing(bool ignore);
|
||||||
uint outgoingPortsMin() const;
|
int outgoingPortsMin() const;
|
||||||
void setOutgoingPortsMin(uint min);
|
void setOutgoingPortsMin(int min);
|
||||||
uint outgoingPortsMax() const;
|
int outgoingPortsMax() const;
|
||||||
void setOutgoingPortsMax(uint max);
|
void setOutgoingPortsMax(int max);
|
||||||
bool ignoreLimitsOnLAN() const;
|
bool ignoreLimitsOnLAN() const;
|
||||||
void setIgnoreLimitsOnLAN(bool ignore);
|
void setIgnoreLimitsOnLAN(bool ignore);
|
||||||
bool includeOverheadInLimits() const;
|
bool includeOverheadInLimits() const;
|
||||||
@@ -364,10 +424,14 @@ namespace BitTorrent
|
|||||||
void setMaxActiveUploads(int max);
|
void setMaxActiveUploads(int max);
|
||||||
int maxActiveTorrents() const;
|
int maxActiveTorrents() const;
|
||||||
void setMaxActiveTorrents(int max);
|
void setMaxActiveTorrents(int max);
|
||||||
bool isUTPEnabled() const;
|
BTProtocol btProtocol() const;
|
||||||
void setUTPEnabled(bool enabled);
|
void setBTProtocol(BTProtocol protocol);
|
||||||
bool isUTPRateLimited() const;
|
bool isUTPRateLimited() const;
|
||||||
void setUTPRateLimited(bool limited);
|
void setUTPRateLimited(bool limited);
|
||||||
|
MixedModeAlgorithm utpMixedMode() const;
|
||||||
|
void setUtpMixedMode(MixedModeAlgorithm mode);
|
||||||
|
bool multiConnectionsPerIpEnabled() const;
|
||||||
|
void setMultiConnectionsPerIpEnabled(bool enabled);
|
||||||
bool isTrackerFilteringEnabled() const;
|
bool isTrackerFilteringEnabled() const;
|
||||||
void setTrackerFilteringEnabled(bool enabled);
|
void setTrackerFilteringEnabled(bool enabled);
|
||||||
QStringList bannedIPs() const;
|
QStringList bannedIPs() const;
|
||||||
@@ -477,13 +541,19 @@ namespace BitTorrent
|
|||||||
void handleDownloadFinished(const QString &url, const QString &filePath);
|
void handleDownloadFinished(const QString &url, const QString &filePath);
|
||||||
void handleDownloadFailed(const QString &url, const QString &reason);
|
void handleDownloadFailed(const QString &url, const QString &reason);
|
||||||
void handleRedirectedToMagnet(const QString &url, const QString &magnetUri);
|
void handleRedirectedToMagnet(const QString &url, const QString &magnetUri);
|
||||||
void switchToAlternativeMode(bool alternative);
|
|
||||||
|
|
||||||
// Session reconfiguration triggers
|
// Session reconfiguration triggers
|
||||||
void networkOnlineStateChanged(const bool online);
|
void networkOnlineStateChanged(const bool online);
|
||||||
void networkConfigurationChange(const QNetworkConfiguration&);
|
void networkConfigurationChange(const QNetworkConfiguration&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct RemovingTorrentData
|
||||||
|
{
|
||||||
|
QString name;
|
||||||
|
QString savePathToRemove;
|
||||||
|
bool requestedFileDeletion;
|
||||||
|
};
|
||||||
|
|
||||||
explicit Session(QObject *parent = 0);
|
explicit Session(QObject *parent = 0);
|
||||||
~Session();
|
~Session();
|
||||||
|
|
||||||
@@ -497,17 +567,19 @@ namespace BitTorrent
|
|||||||
#if LIBTORRENT_VERSION_NUM < 10100
|
#if LIBTORRENT_VERSION_NUM < 10100
|
||||||
void configure(libtorrent::session_settings &sessionSettings);
|
void configure(libtorrent::session_settings &sessionSettings);
|
||||||
void adjustLimits(libtorrent::session_settings &sessionSettings);
|
void adjustLimits(libtorrent::session_settings &sessionSettings);
|
||||||
|
void applyBandwidthLimits(libtorrent::session_settings &sessionSettings);
|
||||||
#else
|
#else
|
||||||
void configure(libtorrent::settings_pack &settingsPack);
|
void configure(libtorrent::settings_pack &settingsPack);
|
||||||
void configurePeerClasses();
|
void configurePeerClasses();
|
||||||
void adjustLimits(libtorrent::settings_pack &settingsPack);
|
void adjustLimits(libtorrent::settings_pack &settingsPack);
|
||||||
|
void applyBandwidthLimits(libtorrent::settings_pack &settingsPack);
|
||||||
void initMetrics();
|
void initMetrics();
|
||||||
#endif
|
#endif
|
||||||
void adjustLimits();
|
void adjustLimits();
|
||||||
|
void applyBandwidthLimits();
|
||||||
void processBannedIPs(libtorrent::ip_filter &filter);
|
void processBannedIPs(libtorrent::ip_filter &filter);
|
||||||
const QStringList getListeningIPs();
|
const QStringList getListeningIPs();
|
||||||
void configureListeningInterface();
|
void configureListeningInterface();
|
||||||
void changeSpeedLimitMode_impl(bool alternative);
|
|
||||||
void enableTracker(bool enable);
|
void enableTracker(bool enable);
|
||||||
void enableBandwidthScheduler();
|
void enableBandwidthScheduler();
|
||||||
void populateAdditionalTrackers();
|
void populateAdditionalTrackers();
|
||||||
@@ -569,17 +641,23 @@ namespace BitTorrent
|
|||||||
CachedSettingValue<bool> m_isTrackerFilteringEnabled;
|
CachedSettingValue<bool> m_isTrackerFilteringEnabled;
|
||||||
CachedSettingValue<QString> m_IPFilterFile;
|
CachedSettingValue<QString> m_IPFilterFile;
|
||||||
CachedSettingValue<bool> m_announceToAllTrackers;
|
CachedSettingValue<bool> m_announceToAllTrackers;
|
||||||
CachedSettingValue<uint> m_diskCacheSize;
|
CachedSettingValue<bool> m_announceToAllTiers;
|
||||||
CachedSettingValue<uint> m_diskCacheTTL;
|
CachedSettingValue<int> m_diskCacheSize;
|
||||||
|
CachedSettingValue<int> m_diskCacheTTL;
|
||||||
CachedSettingValue<bool> m_useOSCache;
|
CachedSettingValue<bool> m_useOSCache;
|
||||||
|
CachedSettingValue<bool> m_guidedReadCacheEnabled;
|
||||||
|
CachedSettingValue<bool> m_isSuggestMode;
|
||||||
|
CachedSettingValue<int> m_sendBufferWatermark;
|
||||||
|
CachedSettingValue<int> m_sendBufferLowWatermark;
|
||||||
|
CachedSettingValue<int> m_sendBufferWatermarkFactor;
|
||||||
CachedSettingValue<bool> m_isAnonymousModeEnabled;
|
CachedSettingValue<bool> m_isAnonymousModeEnabled;
|
||||||
CachedSettingValue<bool> m_isQueueingEnabled;
|
CachedSettingValue<bool> m_isQueueingEnabled;
|
||||||
CachedSettingValue<int> m_maxActiveDownloads;
|
CachedSettingValue<int> m_maxActiveDownloads;
|
||||||
CachedSettingValue<int> m_maxActiveUploads;
|
CachedSettingValue<int> m_maxActiveUploads;
|
||||||
CachedSettingValue<int> m_maxActiveTorrents;
|
CachedSettingValue<int> m_maxActiveTorrents;
|
||||||
CachedSettingValue<bool> m_ignoreSlowTorrentsForQueueing;
|
CachedSettingValue<bool> m_ignoreSlowTorrentsForQueueing;
|
||||||
CachedSettingValue<uint> m_outgoingPortsMin;
|
CachedSettingValue<int> m_outgoingPortsMin;
|
||||||
CachedSettingValue<uint> m_outgoingPortsMax;
|
CachedSettingValue<int> m_outgoingPortsMax;
|
||||||
CachedSettingValue<bool> m_ignoreLimitsOnLAN;
|
CachedSettingValue<bool> m_ignoreLimitsOnLAN;
|
||||||
CachedSettingValue<bool> m_includeOverheadInLimits;
|
CachedSettingValue<bool> m_includeOverheadInLimits;
|
||||||
CachedSettingValue<QString> m_announceIP;
|
CachedSettingValue<QString> m_announceIP;
|
||||||
@@ -589,8 +667,10 @@ namespace BitTorrent
|
|||||||
CachedSettingValue<int> m_maxUploads;
|
CachedSettingValue<int> m_maxUploads;
|
||||||
CachedSettingValue<int> m_maxConnectionsPerTorrent;
|
CachedSettingValue<int> m_maxConnectionsPerTorrent;
|
||||||
CachedSettingValue<int> m_maxUploadsPerTorrent;
|
CachedSettingValue<int> m_maxUploadsPerTorrent;
|
||||||
CachedSettingValue<bool> m_isUTPEnabled;
|
CachedSettingValue<BTProtocol> m_btProtocol;
|
||||||
CachedSettingValue<bool> m_isUTPRateLimited;
|
CachedSettingValue<bool> m_isUTPRateLimited;
|
||||||
|
CachedSettingValue<MixedModeAlgorithm> m_utpMixedMode;
|
||||||
|
CachedSettingValue<bool> m_multiConnectionsPerIpEnabled;
|
||||||
CachedSettingValue<bool> m_isAddTrackersEnabled;
|
CachedSettingValue<bool> m_isAddTrackersEnabled;
|
||||||
CachedSettingValue<QString> m_additionalTrackers;
|
CachedSettingValue<QString> m_additionalTrackers;
|
||||||
CachedSettingValue<qreal> m_globalMaxRatio;
|
CachedSettingValue<qreal> m_globalMaxRatio;
|
||||||
@@ -618,6 +698,8 @@ namespace BitTorrent
|
|||||||
CachedSettingValue<int> m_encryption;
|
CachedSettingValue<int> m_encryption;
|
||||||
CachedSettingValue<bool> m_isForceProxyEnabled;
|
CachedSettingValue<bool> m_isForceProxyEnabled;
|
||||||
CachedSettingValue<bool> m_isProxyPeerConnectionsEnabled;
|
CachedSettingValue<bool> m_isProxyPeerConnectionsEnabled;
|
||||||
|
CachedSettingValue<ChokingAlgorithm> m_chokingAlgorithm;
|
||||||
|
CachedSettingValue<SeedChokingAlgorithm> m_seedChokingAlgorithm;
|
||||||
CachedSettingValue<QVariantMap> m_storedCategories;
|
CachedSettingValue<QVariantMap> m_storedCategories;
|
||||||
CachedSettingValue<QStringList> m_storedTags;
|
CachedSettingValue<QStringList> m_storedTags;
|
||||||
CachedSettingValue<int> m_maxRatioAction;
|
CachedSettingValue<int> m_maxRatioAction;
|
||||||
@@ -642,7 +724,6 @@ namespace BitTorrent
|
|||||||
QList<BitTorrent::TrackerEntry> m_additionalTrackerList;
|
QList<BitTorrent::TrackerEntry> m_additionalTrackerList;
|
||||||
QString m_resumeFolderPath;
|
QString m_resumeFolderPath;
|
||||||
QFile m_resumeFolderLock;
|
QFile m_resumeFolderLock;
|
||||||
QHash<InfoHash, QString> m_savePathsToRemove;
|
|
||||||
bool m_useProxy;
|
bool m_useProxy;
|
||||||
|
|
||||||
QTimer *m_refreshTimer;
|
QTimer *m_refreshTimer;
|
||||||
@@ -662,6 +743,7 @@ namespace BitTorrent
|
|||||||
QHash<InfoHash, TorrentHandle *> m_torrents;
|
QHash<InfoHash, TorrentHandle *> m_torrents;
|
||||||
QHash<InfoHash, AddTorrentData> m_addingTorrents;
|
QHash<InfoHash, AddTorrentData> m_addingTorrents;
|
||||||
QHash<QString, AddTorrentParams> m_downloadedTorrents;
|
QHash<QString, AddTorrentParams> m_downloadedTorrents;
|
||||||
|
QHash<InfoHash, RemovingTorrentData> m_removingTorrents;
|
||||||
TorrentStatusReport m_torrentStatusReport;
|
TorrentStatusReport m_torrentStatusReport;
|
||||||
QStringMap m_categories;
|
QStringMap m_categories;
|
||||||
QSet<QString> m_tags;
|
QSet<QString> m_tags;
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ void TorrentCreatorThread::run()
|
|||||||
if (isInterruptionRequested()) return;
|
if (isInterruptionRequested()) return;
|
||||||
|
|
||||||
// create the torrent and print it to out
|
// create the torrent and print it to out
|
||||||
qDebug("Saving to %s", qPrintable(m_savePath));
|
qDebug("Saving to %s", qUtf8Printable(m_savePath));
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
wchar_t *savePathW = new wchar_t[m_savePath.length() + 1];
|
wchar_t *savePathW = new wchar_t[m_savePath.length() + 1];
|
||||||
int len = Utils::Fs::toNativePath(m_savePath).toWCharArray(savePathW);
|
int len = Utils::Fs::toNativePath(m_savePath).toWCharArray(savePathW);
|
||||||
|
|||||||
@@ -27,20 +27,23 @@
|
|||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "torrenthandle.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QByteArray>
|
|
||||||
#include <QBitArray>
|
#include <QBitArray>
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
#include <libtorrent/entry.hpp>
|
|
||||||
#include <libtorrent/bencode.hpp>
|
|
||||||
#include <libtorrent/address.hpp>
|
#include <libtorrent/address.hpp>
|
||||||
#include <libtorrent/alert_types.hpp>
|
#include <libtorrent/alert_types.hpp>
|
||||||
|
#include <libtorrent/bencode.hpp>
|
||||||
#include <libtorrent/create_torrent.hpp>
|
#include <libtorrent/create_torrent.hpp>
|
||||||
|
#include <libtorrent/entry.hpp>
|
||||||
#include <libtorrent/magnet_uri.hpp>
|
#include <libtorrent/magnet_uri.hpp>
|
||||||
#if LIBTORRENT_VERSION_NUM >= 10100
|
#if LIBTORRENT_VERSION_NUM >= 10100
|
||||||
#include <libtorrent/time.hpp>
|
#include <libtorrent/time.hpp>
|
||||||
@@ -55,13 +58,12 @@
|
|||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
#include "base/preferences.h"
|
#include "base/preferences.h"
|
||||||
#include "base/profile.h"
|
#include "base/profile.h"
|
||||||
#include "base/utils/string.h"
|
|
||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/misc.h"
|
#include "base/utils/misc.h"
|
||||||
#include "session.h"
|
#include "base/utils/string.h"
|
||||||
#include "peerinfo.h"
|
#include "peerinfo.h"
|
||||||
|
#include "session.h"
|
||||||
#include "trackerentry.h"
|
#include "trackerentry.h"
|
||||||
#include "torrenthandle.h"
|
|
||||||
|
|
||||||
const QString QB_EXT {".!qB"};
|
const QString QB_EXT {".!qB"};
|
||||||
|
|
||||||
@@ -93,6 +95,8 @@ AddTorrentData::AddTorrentData()
|
|||||||
, hasRootFolder(true)
|
, hasRootFolder(true)
|
||||||
, addForced(false)
|
, addForced(false)
|
||||||
, addPaused(false)
|
, addPaused(false)
|
||||||
|
, uploadLimit(-1)
|
||||||
|
, downloadLimit(-1)
|
||||||
, ratioLimit(TorrentHandle::USE_GLOBAL_RATIO)
|
, ratioLimit(TorrentHandle::USE_GLOBAL_RATIO)
|
||||||
, seedingTimeLimit(TorrentHandle::USE_GLOBAL_SEEDING_TIME)
|
, seedingTimeLimit(TorrentHandle::USE_GLOBAL_SEEDING_TIME)
|
||||||
{
|
{
|
||||||
@@ -116,68 +120,19 @@ AddTorrentData::AddTorrentData(const AddTorrentParams ¶ms)
|
|||||||
, addPaused(params.addPaused == TriStateBool::Undefined
|
, addPaused(params.addPaused == TriStateBool::Undefined
|
||||||
? Session::instance()->isAddTorrentPaused()
|
? Session::instance()->isAddTorrentPaused()
|
||||||
: params.addPaused == TriStateBool::True)
|
: params.addPaused == TriStateBool::True)
|
||||||
|
, uploadLimit(params.uploadLimit)
|
||||||
|
, downloadLimit(params.downloadLimit)
|
||||||
, filePriorities(params.filePriorities)
|
, filePriorities(params.filePriorities)
|
||||||
, ratioLimit(params.ignoreShareLimits ? TorrentHandle::NO_RATIO_LIMIT : TorrentHandle::USE_GLOBAL_RATIO)
|
, ratioLimit(params.ignoreShareLimits ? TorrentHandle::NO_RATIO_LIMIT : TorrentHandle::USE_GLOBAL_RATIO)
|
||||||
, seedingTimeLimit(params.ignoreShareLimits ? TorrentHandle::NO_SEEDING_TIME_LIMIT : TorrentHandle::USE_GLOBAL_SEEDING_TIME)
|
, seedingTimeLimit(params.ignoreShareLimits ? TorrentHandle::NO_SEEDING_TIME_LIMIT : TorrentHandle::USE_GLOBAL_SEEDING_TIME)
|
||||||
{
|
{
|
||||||
}
|
bool useAutoTMM = (params.useAutoTMM == TriStateBool::Undefined
|
||||||
|
? !Session::instance()->isAutoTMMDisabledByDefault()
|
||||||
// TorrentState
|
: params.useAutoTMM == TriStateBool::True);
|
||||||
|
if (useAutoTMM)
|
||||||
TorrentState::TorrentState(int value)
|
savePath = "";
|
||||||
: m_value(value)
|
else if (savePath.trimmed().isEmpty())
|
||||||
{
|
savePath = Session::instance()->defaultSavePath();
|
||||||
}
|
|
||||||
|
|
||||||
QString TorrentState::toString() const
|
|
||||||
{
|
|
||||||
switch (m_value) {
|
|
||||||
case Error:
|
|
||||||
return QLatin1String("error");
|
|
||||||
case MissingFiles:
|
|
||||||
return QLatin1String("missingFiles");
|
|
||||||
case Uploading:
|
|
||||||
return QLatin1String("uploading");
|
|
||||||
case PausedUploading:
|
|
||||||
return QLatin1String("pausedUP");
|
|
||||||
case QueuedUploading:
|
|
||||||
return QLatin1String("queuedUP");
|
|
||||||
case StalledUploading:
|
|
||||||
return QLatin1String("stalledUP");
|
|
||||||
case CheckingUploading:
|
|
||||||
return QLatin1String("checkingUP");
|
|
||||||
case ForcedUploading:
|
|
||||||
return QLatin1String("forcedUP");
|
|
||||||
case Allocating:
|
|
||||||
return QLatin1String("allocating");
|
|
||||||
case Downloading:
|
|
||||||
return QLatin1String("downloading");
|
|
||||||
case DownloadingMetadata:
|
|
||||||
return QLatin1String("metaDL");
|
|
||||||
case PausedDownloading:
|
|
||||||
return QLatin1String("pausedDL");
|
|
||||||
case QueuedDownloading:
|
|
||||||
return QLatin1String("queuedDL");
|
|
||||||
case StalledDownloading:
|
|
||||||
return QLatin1String("stalledDL");
|
|
||||||
case CheckingDownloading:
|
|
||||||
return QLatin1String("checkingDL");
|
|
||||||
case ForcedDownloading:
|
|
||||||
return QLatin1String("forcedDL");
|
|
||||||
#if LIBTORRENT_VERSION_NUM < 10100
|
|
||||||
case QueuedForChecking:
|
|
||||||
return QLatin1String("queuedForChecking");
|
|
||||||
#endif
|
|
||||||
case CheckingResumeData:
|
|
||||||
return QLatin1String("checkingResumeData");
|
|
||||||
default:
|
|
||||||
return QLatin1String("unknown");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TorrentState::operator int() const
|
|
||||||
{
|
|
||||||
return m_value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TorrentHandle
|
// TorrentHandle
|
||||||
@@ -390,7 +345,7 @@ void TorrentHandle::setAutoTMMEnabled(bool enabled)
|
|||||||
m_session->handleTorrentSavingModeChanged(this);
|
m_session->handleTorrentSavingModeChanged(this);
|
||||||
|
|
||||||
if (m_useAutoTMM)
|
if (m_useAutoTMM)
|
||||||
move_impl(m_session->categorySavePath(m_category));
|
move_impl(m_session->categorySavePath(m_category), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TorrentHandle::hasRootFolder() const
|
bool TorrentHandle::hasRootFolder() const
|
||||||
@@ -1101,10 +1056,9 @@ int TorrentHandle::timeSinceDownload() const
|
|||||||
|
|
||||||
int TorrentHandle::timeSinceActivity() const
|
int TorrentHandle::timeSinceActivity() const
|
||||||
{
|
{
|
||||||
if (m_nativeStatus.time_since_upload < m_nativeStatus.time_since_download)
|
return ((m_nativeStatus.time_since_upload < 0) != (m_nativeStatus.time_since_download < 0))
|
||||||
return m_nativeStatus.time_since_upload;
|
? std::max(m_nativeStatus.time_since_upload, m_nativeStatus.time_since_download)
|
||||||
else
|
: std::min(m_nativeStatus.time_since_upload, m_nativeStatus.time_since_download);
|
||||||
return m_nativeStatus.time_since_download;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int TorrentHandle::downloadLimit() const
|
int TorrentHandle::downloadLimit() const
|
||||||
@@ -1173,38 +1127,20 @@ qreal TorrentHandle::distributedCopies() const
|
|||||||
return m_nativeStatus.distributed_copies;
|
return m_nativeStatus.distributed_copies;
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal TorrentHandle::maxRatio(bool *usesGlobalRatio) const
|
qreal TorrentHandle::maxRatio() const
|
||||||
{
|
{
|
||||||
qreal ratioLimit = m_ratioLimit;
|
if (m_ratioLimit == USE_GLOBAL_RATIO)
|
||||||
|
return m_session->globalMaxRatio();
|
||||||
|
|
||||||
if (ratioLimit == USE_GLOBAL_RATIO) {
|
return m_ratioLimit;
|
||||||
ratioLimit = m_session->globalMaxRatio();
|
|
||||||
if (usesGlobalRatio)
|
|
||||||
*usesGlobalRatio = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (usesGlobalRatio)
|
|
||||||
*usesGlobalRatio = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ratioLimit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int TorrentHandle::maxSeedingTime(bool *usesGlobalSeedingTime) const
|
int TorrentHandle::maxSeedingTime() const
|
||||||
{
|
{
|
||||||
int seedingTimeLimit = m_seedingTimeLimit;
|
if (m_seedingTimeLimit == USE_GLOBAL_SEEDING_TIME)
|
||||||
|
return m_session->globalMaxSeedingMinutes();
|
||||||
|
|
||||||
if (seedingTimeLimit == USE_GLOBAL_SEEDING_TIME) {
|
return m_seedingTimeLimit;
|
||||||
seedingTimeLimit = m_session->globalMaxSeedingMinutes();
|
|
||||||
if (usesGlobalSeedingTime)
|
|
||||||
*usesGlobalSeedingTime = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (usesGlobalSeedingTime)
|
|
||||||
*usesGlobalSeedingTime = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return seedingTimeLimit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal TorrentHandle::realRatio() const
|
qreal TorrentHandle::realRatio() const
|
||||||
@@ -1285,7 +1221,7 @@ bool TorrentHandle::setCategory(const QString &category)
|
|||||||
|
|
||||||
if (m_useAutoTMM) {
|
if (m_useAutoTMM) {
|
||||||
if (!m_session->isDisableAutoTMMWhenCategoryChanged())
|
if (!m_session->isDisableAutoTMMWhenCategoryChanged())
|
||||||
move_impl(m_session->categorySavePath(m_category));
|
move_impl(m_session->categorySavePath(m_category), true);
|
||||||
else
|
else
|
||||||
setAutoTMMEnabled(false);
|
setAutoTMMEnabled(false);
|
||||||
}
|
}
|
||||||
@@ -1305,16 +1241,16 @@ void TorrentHandle::move(QString path)
|
|||||||
if (!path.endsWith('/'))
|
if (!path.endsWith('/'))
|
||||||
path += '/';
|
path += '/';
|
||||||
|
|
||||||
move_impl(path);
|
move_impl(path, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TorrentHandle::move_impl(QString path)
|
void TorrentHandle::move_impl(QString path, bool overwrite)
|
||||||
{
|
{
|
||||||
path = Utils::Fs::toNativePath(path);
|
|
||||||
if (path == savePath()) return;
|
if (path == savePath()) return;
|
||||||
|
path = Utils::Fs::toNativePath(path);
|
||||||
|
|
||||||
if (!useTempPath()) {
|
if (!useTempPath()) {
|
||||||
moveStorage(path);
|
moveStorage(path, overwrite);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_savePath = path;
|
m_savePath = path;
|
||||||
@@ -1416,21 +1352,23 @@ void TorrentHandle::resume(bool forced)
|
|||||||
m_nativeHandle.resume();
|
m_nativeHandle.resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TorrentHandle::moveStorage(const QString &newPath)
|
void TorrentHandle::moveStorage(const QString &newPath, bool overwrite)
|
||||||
{
|
{
|
||||||
if (isMoveInProgress()) {
|
if (isMoveInProgress()) {
|
||||||
qDebug("enqueue move storage to %s", qPrintable(newPath));
|
qDebug("enqueue move storage to %s", qUtf8Printable(newPath));
|
||||||
m_queuedPath = newPath;
|
m_moveStorageInfo.queuedPath = newPath;
|
||||||
|
m_moveStorageInfo.queuedOverwrite = overwrite;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const QString oldPath = nativeActualSavePath();
|
const QString oldPath = nativeActualSavePath();
|
||||||
if (QDir(oldPath) == QDir(newPath)) return;
|
if (QDir(oldPath) == QDir(newPath)) return;
|
||||||
|
|
||||||
qDebug("move storage: %s to %s", qPrintable(oldPath), qPrintable(newPath));
|
qDebug("move storage: %s to %s", qUtf8Printable(oldPath), qUtf8Printable(newPath));
|
||||||
// Actually move the storage
|
// Actually move the storage
|
||||||
m_nativeHandle.move_storage(newPath.toUtf8().constData());
|
m_nativeHandle.move_storage(newPath.toUtf8().constData()
|
||||||
m_oldPath = oldPath;
|
, (overwrite ? libt::always_replace_files : libt::dont_replace));
|
||||||
m_newPath = newPath;
|
m_moveStorageInfo.oldPath = oldPath;
|
||||||
|
m_moveStorageInfo.newPath = newPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1492,22 +1430,27 @@ void TorrentHandle::handleStorageMovedAlert(libtorrent::storage_moved_alert *p)
|
|||||||
#else
|
#else
|
||||||
const QString newPath(p->storage_path());
|
const QString newPath(p->storage_path());
|
||||||
#endif
|
#endif
|
||||||
if (newPath != m_newPath) {
|
if (newPath != m_moveStorageInfo.newPath) {
|
||||||
qWarning() << Q_FUNC_INFO << ": New path doesn't match a path in a queue.";
|
qWarning() << Q_FUNC_INFO << ": New path doesn't match a path in a queue.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("Torrent is successfully moved from %s to %s", qPrintable(m_oldPath), qPrintable(m_newPath));
|
qDebug("Torrent is successfully moved from %s to %s"
|
||||||
if (m_oldPath == m_session->torrentTempPath(hash())) {
|
, qUtf8Printable(m_moveStorageInfo.oldPath), qUtf8Printable(m_moveStorageInfo.newPath));
|
||||||
qDebug() << "Removing torrent temp folder:" << m_oldPath;
|
const QDir oldDir {m_moveStorageInfo.oldPath};
|
||||||
Utils::Fs::smartRemoveEmptyFolderTree(m_oldPath);
|
if ((oldDir == QDir(m_session->torrentTempPath(info())))
|
||||||
|
&& (oldDir != QDir(m_session->tempPath()))) {
|
||||||
|
// torrent without root folder still has it in its temporary save path
|
||||||
|
// so its temp path isn't equal to temp path root
|
||||||
|
qDebug() << "Removing torrent temp folder:" << m_moveStorageInfo.oldPath;
|
||||||
|
Utils::Fs::smartRemoveEmptyFolderTree(m_moveStorageInfo.oldPath);
|
||||||
}
|
}
|
||||||
updateStatus();
|
updateStatus();
|
||||||
|
|
||||||
m_newPath.clear();
|
m_moveStorageInfo.newPath.clear();
|
||||||
if (!m_queuedPath.isEmpty()) {
|
if (!m_moveStorageInfo.queuedPath.isEmpty()) {
|
||||||
moveStorage(m_queuedPath);
|
moveStorage(m_moveStorageInfo.queuedPath, m_moveStorageInfo.queuedOverwrite);
|
||||||
m_queuedPath.clear();
|
m_moveStorageInfo.queuedPath.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!useTempPath()) {
|
if (!useTempPath()) {
|
||||||
@@ -1529,10 +1472,10 @@ void TorrentHandle::handleStorageMovedFailedAlert(libtorrent::storage_moved_fail
|
|||||||
Logger::instance()->addMessage(tr("Could not move torrent: '%1'. Reason: %2")
|
Logger::instance()->addMessage(tr("Could not move torrent: '%1'. Reason: %2")
|
||||||
.arg(name()).arg(QString::fromStdString(p->message())), Log::CRITICAL);
|
.arg(name()).arg(QString::fromStdString(p->message())), Log::CRITICAL);
|
||||||
|
|
||||||
m_newPath.clear();
|
m_moveStorageInfo.newPath.clear();
|
||||||
if (!m_queuedPath.isEmpty()) {
|
if (!m_moveStorageInfo.queuedPath.isEmpty()) {
|
||||||
moveStorage(m_queuedPath);
|
moveStorage(m_moveStorageInfo.queuedPath, m_moveStorageInfo.queuedOverwrite);
|
||||||
m_queuedPath.clear();
|
m_moveStorageInfo.queuedPath.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!isMoveInProgress() && (m_renameCount == 0) && !m_moveFinishedTriggers.isEmpty())
|
while (!isMoveInProgress() && (m_renameCount == 0) && !m_moveFinishedTriggers.isEmpty())
|
||||||
@@ -1546,7 +1489,7 @@ void TorrentHandle::handleTrackerReplyAlert(libtorrent::tracker_reply_alert *p)
|
|||||||
#else
|
#else
|
||||||
QString trackerUrl(p->tracker_url());
|
QString trackerUrl(p->tracker_url());
|
||||||
#endif
|
#endif
|
||||||
qDebug("Received a tracker reply from %s (Num_peers = %d)", qPrintable(trackerUrl), p->num_peers);
|
qDebug("Received a tracker reply from %s (Num_peers = %d)", qUtf8Printable(trackerUrl), p->num_peers);
|
||||||
// Connection was successful now. Remove possible old errors
|
// Connection was successful now. Remove possible old errors
|
||||||
m_trackerInfos[trackerUrl].lastMessage.clear(); // Reset error/warning message
|
m_trackerInfos[trackerUrl].lastMessage.clear(); // Reset error/warning message
|
||||||
m_trackerInfos[trackerUrl].numPeers = p->num_peers;
|
m_trackerInfos[trackerUrl].numPeers = p->num_peers;
|
||||||
@@ -1563,7 +1506,7 @@ void TorrentHandle::handleTrackerWarningAlert(libtorrent::tracker_warning_alert
|
|||||||
QString trackerUrl(p->tracker_url());
|
QString trackerUrl(p->tracker_url());
|
||||||
QString message = QString::fromStdString(p->message());
|
QString message = QString::fromStdString(p->message());
|
||||||
#endif
|
#endif
|
||||||
qDebug("Received a tracker warning for %s: %s", qPrintable(trackerUrl), qPrintable(message));
|
qDebug("Received a tracker warning for %s: %s", qUtf8Printable(trackerUrl), qUtf8Printable(message));
|
||||||
// Connection was successful now but there is a warning message
|
// Connection was successful now but there is a warning message
|
||||||
m_trackerInfos[trackerUrl].lastMessage = message; // Store warning message
|
m_trackerInfos[trackerUrl].lastMessage = message; // Store warning message
|
||||||
|
|
||||||
@@ -1579,7 +1522,7 @@ void TorrentHandle::handleTrackerErrorAlert(libtorrent::tracker_error_alert *p)
|
|||||||
QString trackerUrl(p->tracker_url());
|
QString trackerUrl(p->tracker_url());
|
||||||
QString message = QString::fromStdString(p->message());
|
QString message = QString::fromStdString(p->message());
|
||||||
#endif
|
#endif
|
||||||
qDebug("Received a tracker error for %s: %s", qPrintable(trackerUrl), qPrintable(message));
|
qDebug("Received a tracker error for %s: %s", qUtf8Printable(trackerUrl), qUtf8Printable(message));
|
||||||
m_trackerInfos[trackerUrl].lastMessage = message;
|
m_trackerInfos[trackerUrl].lastMessage = message;
|
||||||
|
|
||||||
if (p->status_code == 401)
|
if (p->status_code == 401)
|
||||||
@@ -1591,7 +1534,7 @@ void TorrentHandle::handleTrackerErrorAlert(libtorrent::tracker_error_alert *p)
|
|||||||
void TorrentHandle::handleTorrentCheckedAlert(libtorrent::torrent_checked_alert *p)
|
void TorrentHandle::handleTorrentCheckedAlert(libtorrent::torrent_checked_alert *p)
|
||||||
{
|
{
|
||||||
Q_UNUSED(p);
|
Q_UNUSED(p);
|
||||||
qDebug("%s have just finished checking", qPrintable(hash()));
|
qDebug("%s have just finished checking", qUtf8Printable(hash()));
|
||||||
|
|
||||||
updateStatus();
|
updateStatus();
|
||||||
|
|
||||||
@@ -1614,7 +1557,7 @@ void TorrentHandle::handleTorrentCheckedAlert(libtorrent::torrent_checked_alert
|
|||||||
void TorrentHandle::handleTorrentFinishedAlert(libtorrent::torrent_finished_alert *p)
|
void TorrentHandle::handleTorrentFinishedAlert(libtorrent::torrent_finished_alert *p)
|
||||||
{
|
{
|
||||||
Q_UNUSED(p);
|
Q_UNUSED(p);
|
||||||
qDebug("Got a torrent finished alert for %s", qPrintable(name()));
|
qDebug("Got a torrent finished alert for %s", qUtf8Printable(name()));
|
||||||
qDebug("Torrent has seed status: %s", m_hasSeedStatus ? "yes" : "no");
|
qDebug("Torrent has seed status: %s", m_hasSeedStatus ? "yes" : "no");
|
||||||
if (m_hasSeedStatus) return;
|
if (m_hasSeedStatus) return;
|
||||||
|
|
||||||
@@ -1673,8 +1616,8 @@ void TorrentHandle::handleSaveResumeDataAlert(libtorrent::save_resume_data_alert
|
|||||||
resumeData["save_path"] = Profile::instance().toPortablePath(QString::fromStdString(savePath)).toStdString();
|
resumeData["save_path"] = Profile::instance().toPortablePath(QString::fromStdString(savePath)).toStdString();
|
||||||
}
|
}
|
||||||
resumeData["qBt-savePath"] = m_useAutoTMM ? "" : Profile::instance().toPortablePath(m_savePath).toStdString();
|
resumeData["qBt-savePath"] = m_useAutoTMM ? "" : Profile::instance().toPortablePath(m_savePath).toStdString();
|
||||||
resumeData["qBt-ratioLimit"] = QString::number(m_ratioLimit).toStdString();
|
resumeData["qBt-ratioLimit"] = static_cast<int>(m_ratioLimit * 1000);
|
||||||
resumeData["qBt-seedingTimeLimit"] = QString::number(m_seedingTimeLimit).toStdString();
|
resumeData["qBt-seedingTimeLimit"] = m_seedingTimeLimit;
|
||||||
resumeData["qBt-category"] = m_category.toStdString();
|
resumeData["qBt-category"] = m_category.toStdString();
|
||||||
resumeData["qBt-tags"] = setToEntryList(m_tags);
|
resumeData["qBt-tags"] = setToEntryList(m_tags);
|
||||||
resumeData["qBt-name"] = m_name.toStdString();
|
resumeData["qBt-name"] = m_name.toStdString();
|
||||||
@@ -1698,7 +1641,7 @@ void TorrentHandle::handleSaveResumeDataFailedAlert(libtorrent::save_resume_data
|
|||||||
|
|
||||||
void TorrentHandle::handleFastResumeRejectedAlert(libtorrent::fastresume_rejected_alert *p)
|
void TorrentHandle::handleFastResumeRejectedAlert(libtorrent::fastresume_rejected_alert *p)
|
||||||
{
|
{
|
||||||
qDebug("/!\\ Fast resume failed for %s, reason: %s", qPrintable(name()), p->message().c_str());
|
qDebug("/!\\ Fast resume failed for %s, reason: %s", qUtf8Printable(name()), p->message().c_str());
|
||||||
Logger *const logger = Logger::instance();
|
Logger *const logger = Logger::instance();
|
||||||
|
|
||||||
updateStatus();
|
updateStatus();
|
||||||
@@ -1733,9 +1676,9 @@ void TorrentHandle::handleFileRenamedAlert(libtorrent::file_renamed_alert *p)
|
|||||||
newPathParts.removeLast();
|
newPathParts.removeLast();
|
||||||
QString newPath = newPathParts.join("/");
|
QString newPath = newPathParts.join("/");
|
||||||
if (!newPathParts.isEmpty() && (oldPath != newPath)) {
|
if (!newPathParts.isEmpty() && (oldPath != newPath)) {
|
||||||
qDebug("oldPath(%s) != newPath(%s)", qPrintable(oldPath), qPrintable(newPath));
|
qDebug("oldPath(%s) != newPath(%s)", qUtf8Printable(oldPath), qUtf8Printable(newPath));
|
||||||
oldPath = QString("%1/%2").arg(savePath(true)).arg(oldPath);
|
oldPath = QString("%1/%2").arg(savePath(true)).arg(oldPath);
|
||||||
qDebug("Detected folder renaming, attempt to delete old folder: %s", qPrintable(oldPath));
|
qDebug("Detected folder renaming, attempt to delete old folder: %s", qUtf8Printable(oldPath));
|
||||||
QDir().rmpath(oldPath);
|
QDir().rmpath(oldPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1760,13 +1703,13 @@ void TorrentHandle::handleFileCompletedAlert(libtorrent::file_completed_alert *p
|
|||||||
{
|
{
|
||||||
updateStatus();
|
updateStatus();
|
||||||
|
|
||||||
qDebug("A file completed download in torrent \"%s\"", qPrintable(name()));
|
qDebug("A file completed download in torrent \"%s\"", qUtf8Printable(name()));
|
||||||
if (m_session->isAppendExtensionEnabled()) {
|
if (m_session->isAppendExtensionEnabled()) {
|
||||||
QString name = filePath(p->index);
|
QString name = filePath(p->index);
|
||||||
if (name.endsWith(QB_EXT)) {
|
if (name.endsWith(QB_EXT)) {
|
||||||
const QString oldName = name;
|
const QString oldName = name;
|
||||||
name.chop(QB_EXT.size());
|
name.chop(QB_EXT.size());
|
||||||
qDebug("Renaming %s to %s", qPrintable(oldName), qPrintable(name));
|
qDebug("Renaming %s to %s", qUtf8Printable(oldName), qUtf8Printable(name));
|
||||||
renameFile(p->index, name);
|
renameFile(p->index, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1783,7 +1726,7 @@ void TorrentHandle::handleStatsAlert(libtorrent::stats_alert *p)
|
|||||||
void TorrentHandle::handleMetadataReceivedAlert(libt::metadata_received_alert *p)
|
void TorrentHandle::handleMetadataReceivedAlert(libt::metadata_received_alert *p)
|
||||||
{
|
{
|
||||||
Q_UNUSED(p);
|
Q_UNUSED(p);
|
||||||
qDebug("Metadata received for torrent %s.", qPrintable(name()));
|
qDebug("Metadata received for torrent %s.", qUtf8Printable(name()));
|
||||||
updateStatus();
|
updateStatus();
|
||||||
if (m_session->isAppendExtensionEnabled())
|
if (m_session->isAppendExtensionEnabled())
|
||||||
manageIncompleteFiles();
|
manageIncompleteFiles();
|
||||||
@@ -1816,7 +1759,7 @@ void TorrentHandle::handleTempPathChanged()
|
|||||||
void TorrentHandle::handleCategorySavePathChanged()
|
void TorrentHandle::handleCategorySavePathChanged()
|
||||||
{
|
{
|
||||||
if (m_useAutoTMM)
|
if (m_useAutoTMM)
|
||||||
move_impl(m_session->categorySavePath(m_category));
|
move_impl(m_session->categorySavePath(m_category), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TorrentHandle::handleAppendExtensionToggled()
|
void TorrentHandle::handleAppendExtensionToggled()
|
||||||
@@ -1926,12 +1869,12 @@ void TorrentHandle::adjustActualSavePath_impl()
|
|||||||
path = savePath();
|
path = savePath();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Moving all downloading torrents to temporary save path
|
// Moving all downloading torrents to temporary folder
|
||||||
path = m_session->torrentTempPath(hash());
|
path = m_session->torrentTempPath(info());
|
||||||
qDebug() << "Moving torrent to its temp save path:" << path;
|
qDebug() << "Moving torrent to its temporary folder:" << path;
|
||||||
}
|
}
|
||||||
|
|
||||||
moveStorage(Utils::Fs::toNativePath(path));
|
moveStorage(Utils::Fs::toNativePath(path), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
libtorrent::torrent_handle TorrentHandle::nativeHandle() const
|
libtorrent::torrent_handle TorrentHandle::nativeHandle() const
|
||||||
@@ -1951,7 +1894,7 @@ void TorrentHandle::updateTorrentInfo()
|
|||||||
|
|
||||||
bool TorrentHandle::isMoveInProgress() const
|
bool TorrentHandle::isMoveInProgress() const
|
||||||
{
|
{
|
||||||
return !m_newPath.isEmpty();
|
return !m_moveStorageInfo.newPath.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TorrentHandle::useTempPath() const
|
bool TorrentHandle::useTempPath() const
|
||||||
|
|||||||
@@ -104,6 +104,8 @@ namespace BitTorrent
|
|||||||
bool hasRootFolder;
|
bool hasRootFolder;
|
||||||
bool addForced;
|
bool addForced;
|
||||||
bool addPaused;
|
bool addPaused;
|
||||||
|
int uploadLimit;
|
||||||
|
int downloadLimit;
|
||||||
// for new torrents
|
// for new torrents
|
||||||
QVector<int> filePriorities;
|
QVector<int> filePriorities;
|
||||||
// for resumed torrents
|
// for resumed torrents
|
||||||
@@ -120,48 +122,35 @@ namespace BitTorrent
|
|||||||
quint32 numPeers = 0;
|
quint32 numPeers = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TorrentState
|
enum class TorrentState
|
||||||
{
|
{
|
||||||
public:
|
Unknown = -1,
|
||||||
enum
|
|
||||||
{
|
|
||||||
Unknown = -1,
|
|
||||||
|
|
||||||
ForcedDownloading,
|
ForcedDownloading,
|
||||||
Downloading,
|
Downloading,
|
||||||
DownloadingMetadata,
|
DownloadingMetadata,
|
||||||
Allocating,
|
Allocating,
|
||||||
StalledDownloading,
|
StalledDownloading,
|
||||||
|
|
||||||
ForcedUploading,
|
ForcedUploading,
|
||||||
Uploading,
|
Uploading,
|
||||||
StalledUploading,
|
StalledUploading,
|
||||||
|
|
||||||
QueuedDownloading,
|
|
||||||
QueuedUploading,
|
|
||||||
|
|
||||||
CheckingUploading,
|
|
||||||
CheckingDownloading,
|
|
||||||
|
|
||||||
#if LIBTORRENT_VERSION_NUM < 10100
|
#if LIBTORRENT_VERSION_NUM < 10100
|
||||||
QueuedForChecking,
|
QueuedForChecking,
|
||||||
#endif
|
#endif
|
||||||
CheckingResumeData,
|
CheckingResumeData,
|
||||||
|
QueuedDownloading,
|
||||||
|
QueuedUploading,
|
||||||
|
|
||||||
PausedDownloading,
|
CheckingUploading,
|
||||||
PausedUploading,
|
CheckingDownloading,
|
||||||
|
|
||||||
MissingFiles,
|
PausedDownloading,
|
||||||
Error
|
PausedUploading,
|
||||||
};
|
|
||||||
|
|
||||||
TorrentState(int value);
|
MissingFiles,
|
||||||
|
Error
|
||||||
operator int() const;
|
|
||||||
QString toString() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_value;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class TorrentHandle : public QObject
|
class TorrentHandle : public QObject
|
||||||
@@ -244,6 +233,8 @@ namespace BitTorrent
|
|||||||
QString rootPath(bool actual = false) const;
|
QString rootPath(bool actual = false) const;
|
||||||
QString contentPath(bool actual = false) const;
|
QString contentPath(bool actual = false) const;
|
||||||
|
|
||||||
|
bool useTempPath() const;
|
||||||
|
|
||||||
bool isAutoTMMEnabled() const;
|
bool isAutoTMMEnabled() const;
|
||||||
void setAutoTMMEnabled(bool enabled);
|
void setAutoTMMEnabled(bool enabled);
|
||||||
QString category() const;
|
QString category() const;
|
||||||
@@ -326,8 +317,8 @@ namespace BitTorrent
|
|||||||
QBitArray downloadingPieces() const;
|
QBitArray downloadingPieces() const;
|
||||||
QVector<int> pieceAvailability() const;
|
QVector<int> pieceAvailability() const;
|
||||||
qreal distributedCopies() const;
|
qreal distributedCopies() const;
|
||||||
qreal maxRatio(bool *usesGlobalRatio = 0) const;
|
qreal maxRatio() const;
|
||||||
int maxSeedingTime(bool *usesGlobalSeedingTime = 0) const;
|
int maxSeedingTime() const;
|
||||||
qreal realRatio() const;
|
qreal realRatio() const;
|
||||||
int uploadPayloadRate() const;
|
int uploadPayloadRate() const;
|
||||||
int downloadPayloadRate() const;
|
int downloadPayloadRate() const;
|
||||||
@@ -416,13 +407,12 @@ namespace BitTorrent
|
|||||||
void handleStatsAlert(libtorrent::stats_alert *p);
|
void handleStatsAlert(libtorrent::stats_alert *p);
|
||||||
|
|
||||||
bool isMoveInProgress() const;
|
bool isMoveInProgress() const;
|
||||||
bool useTempPath() const;
|
|
||||||
QString nativeActualSavePath() const;
|
QString nativeActualSavePath() const;
|
||||||
|
|
||||||
void adjustActualSavePath();
|
void adjustActualSavePath();
|
||||||
void adjustActualSavePath_impl();
|
void adjustActualSavePath_impl();
|
||||||
void move_impl(QString path);
|
void move_impl(QString path, bool overwrite);
|
||||||
void moveStorage(const QString &newPath);
|
void moveStorage(const QString &newPath, bool overwrite);
|
||||||
void manageIncompleteFiles();
|
void manageIncompleteFiles();
|
||||||
bool addTracker(const TrackerEntry &tracker);
|
bool addTracker(const TrackerEntry &tracker);
|
||||||
bool addUrlSeed(const QUrl &urlSeed);
|
bool addUrlSeed(const QUrl &urlSeed);
|
||||||
@@ -437,11 +427,16 @@ namespace BitTorrent
|
|||||||
|
|
||||||
InfoHash m_hash;
|
InfoHash m_hash;
|
||||||
|
|
||||||
QString m_oldPath;
|
struct
|
||||||
QString m_newPath;
|
{
|
||||||
// m_queuedPath is where files should be moved to,
|
QString oldPath;
|
||||||
// when current moving is completed
|
QString newPath;
|
||||||
QString m_queuedPath;
|
// queuedPath is where files should be moved to,
|
||||||
|
// when current moving is completed
|
||||||
|
QString queuedPath;
|
||||||
|
bool queuedOverwrite = true;
|
||||||
|
} m_moveStorageInfo;
|
||||||
|
|
||||||
// m_moveFinishedTriggers is activated only when the following conditions are met:
|
// m_moveFinishedTriggers is activated only when the following conditions are met:
|
||||||
// all file rename jobs complete, all file move jobs complete
|
// all file rename jobs complete, all file move jobs complete
|
||||||
QQueue<EventTrigger> m_moveFinishedTriggers;
|
QQueue<EventTrigger> m_moveFinishedTriggers;
|
||||||
@@ -468,4 +463,6 @@ namespace BitTorrent
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(BitTorrent::TorrentState)
|
||||||
|
|
||||||
#endif // BITTORRENT_TORRENTHANDLE_H
|
#endif // BITTORRENT_TORRENTHANDLE_H
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ TorrentInfo TorrentInfo::loadFromFile(const QString &path, QString &error)
|
|||||||
TorrentInfo info(NativePtr(new libt::torrent_info(Utils::Fs::toNativePath(path).toStdString(), ec)));
|
TorrentInfo info(NativePtr(new libt::torrent_info(Utils::Fs::toNativePath(path).toStdString(), ec)));
|
||||||
if (ec) {
|
if (ec) {
|
||||||
error = QString::fromUtf8(ec.message().c_str());
|
error = QString::fromUtf8(ec.message().c_str());
|
||||||
qDebug("Cannot load .torrent file: %s", qPrintable(error));
|
qDebug("Cannot load .torrent file: %s", qUtf8Printable(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
@@ -308,9 +308,29 @@ int BitTorrent::TorrentInfo::fileIndex(const QString& fileName) const
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TorrentInfo::hasRootFolder() const
|
||||||
|
{
|
||||||
|
QString testRootFolder;
|
||||||
|
for (int i = 0; i < filesCount(); ++i) {
|
||||||
|
const QString filePath = this->filePath(i);
|
||||||
|
if (QDir::isAbsolutePath(filePath)) continue;
|
||||||
|
|
||||||
|
const auto filePathElements = filePath.splitRef('/');
|
||||||
|
// if at least one file has no root folder, no common root folder exists
|
||||||
|
if (filePathElements.count() <= 1) return false;
|
||||||
|
|
||||||
|
if (testRootFolder.isEmpty())
|
||||||
|
testRootFolder = filePathElements.at(0).toString();
|
||||||
|
else if (testRootFolder != filePathElements.at(0))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void TorrentInfo::stripRootFolder()
|
void TorrentInfo::stripRootFolder()
|
||||||
{
|
{
|
||||||
if (filesCount() <= 1) return;
|
if (!hasRootFolder()) return;
|
||||||
|
|
||||||
libtorrent::file_storage files = m_nativeInfo->files();
|
libtorrent::file_storage files = m_nativeInfo->files();
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,8 @@ namespace BitTorrent
|
|||||||
PieceRange filePieces(int fileIndex) const;
|
PieceRange filePieces(int fileIndex) const;
|
||||||
|
|
||||||
void renameFile(uint index, const QString &newPath);
|
void renameFile(uint index, const QString &newPath);
|
||||||
|
|
||||||
|
bool hasRootFolder() const;
|
||||||
void stripRootFolder();
|
void stripRootFolder();
|
||||||
|
|
||||||
NativePtr nativeInfo() const;
|
NativePtr nativeInfo() const;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt4 and libtorrent.
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
* Copyright (C) 2015 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2015 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* 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
|
||||||
@@ -25,16 +25,15 @@
|
|||||||
* 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 <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <libtorrent/bencode.hpp>
|
#include <libtorrent/bencode.hpp>
|
||||||
#include <libtorrent/entry.hpp>
|
#include <libtorrent/entry.hpp>
|
||||||
|
|
||||||
#include "base/preferences.h"
|
|
||||||
#include "base/http/server.h"
|
#include "base/http/server.h"
|
||||||
|
#include "base/preferences.h"
|
||||||
#include "base/utils/string.h"
|
#include "base/utils/string.h"
|
||||||
#include "tracker.h"
|
#include "tracker.h"
|
||||||
|
|
||||||
@@ -109,14 +108,14 @@ Http::Response Tracker::processRequest(const Http::Request &request, const Http:
|
|||||||
{
|
{
|
||||||
clear(); // clear response
|
clear(); // clear response
|
||||||
|
|
||||||
//qDebug("Tracker received the following request:\n%s", qPrintable(parser.toString()));
|
//qDebug("Tracker received the following request:\n%s", qUtf8Printable(parser.toString()));
|
||||||
// Is request a GET request?
|
// Is request a GET request?
|
||||||
if (request.method != "GET") {
|
if (request.method != "GET") {
|
||||||
qDebug("Tracker: Unsupported HTTP request: %s", qPrintable(request.method));
|
qDebug("Tracker: Unsupported HTTP request: %s", qUtf8Printable(request.method));
|
||||||
status(100, "Invalid request type");
|
status(100, "Invalid request type");
|
||||||
}
|
}
|
||||||
else if (!request.path.startsWith("/announce", Qt::CaseInsensitive)) {
|
else if (!request.path.startsWith("/announce", Qt::CaseInsensitive)) {
|
||||||
qDebug("Tracker: Unrecognized path: %s", qPrintable(request.path));
|
qDebug("Tracker: Unrecognized path: %s", qUtf8Printable(request.path));
|
||||||
status(100, "Invalid request type");
|
status(100, "Invalid request type");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -146,7 +145,7 @@ void Tracker::respondToAnnounceRequest()
|
|||||||
annonceReq.infoHash = gets.value("info_hash");
|
annonceReq.infoHash = gets.value("info_hash");
|
||||||
// info_hash cannot be longer than 20 bytes
|
// info_hash cannot be longer than 20 bytes
|
||||||
/*if (annonce_req.info_hash.toLatin1().length() > 20) {
|
/*if (annonce_req.info_hash.toLatin1().length() > 20) {
|
||||||
qDebug("Tracker: Info_hash is not 20 byte long: %s (%d)", qPrintable(annonce_req.info_hash), annonce_req.info_hash.toLatin1().length());
|
qDebug("Tracker: Info_hash is not 20 byte long: %s (%d)", qUtf8Printable(annonce_req.info_hash), annonce_req.info_hash.toLatin1().length());
|
||||||
status(150, "Invalid infohash");
|
status(150, "Invalid infohash");
|
||||||
return;
|
return;
|
||||||
}*/
|
}*/
|
||||||
@@ -160,7 +159,7 @@ void Tracker::respondToAnnounceRequest()
|
|||||||
annonceReq.peer.peerId = gets.value("peer_id");
|
annonceReq.peer.peerId = gets.value("peer_id");
|
||||||
// peer_id cannot be longer than 20 bytes
|
// peer_id cannot be longer than 20 bytes
|
||||||
/*if (annonce_req.peer.peer_id.length() > 20) {
|
/*if (annonce_req.peer.peer_id.length() > 20) {
|
||||||
qDebug("Tracker: peer_id is not 20 byte long: %s", qPrintable(annonce_req.peer.peer_id));
|
qDebug("Tracker: peer_id is not 20 byte long: %s", qUtf8Printable(annonce_req.peer.peer_id));
|
||||||
status(151, "Invalid peerid");
|
status(151, "Invalid peerid");
|
||||||
return;
|
return;
|
||||||
}*/
|
}*/
|
||||||
@@ -183,7 +182,7 @@ void Tracker::respondToAnnounceRequest()
|
|||||||
annonceReq.event = "";
|
annonceReq.event = "";
|
||||||
if (gets.contains("event")) {
|
if (gets.contains("event")) {
|
||||||
annonceReq.event = gets.value("event");
|
annonceReq.event = gets.value("event");
|
||||||
qDebug("Tracker: event is %s", qPrintable(annonceReq.event));
|
qDebug("Tracker: event is %s", qUtf8Printable(annonceReq.event));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. Get numwant
|
// 5. Get numwant
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2015 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2015 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2010 Christophe Dumez
|
* 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
|
||||||
@@ -25,17 +25,16 @@
|
|||||||
* 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 BITTORRENT_TRACKER_H
|
#ifndef BITTORRENT_TRACKER_H
|
||||||
#define BITTORRENT_TRACKER_H
|
#define BITTORRENT_TRACKER_H
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include "base/http/types.h"
|
|
||||||
#include "base/http/responsebuilder.h"
|
|
||||||
#include "base/http/irequesthandler.h"
|
#include "base/http/irequesthandler.h"
|
||||||
|
#include "base/http/responsebuilder.h"
|
||||||
|
#include "base/http/types.h"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
@@ -82,7 +81,7 @@ namespace BitTorrent
|
|||||||
Q_DISABLE_COPY(Tracker)
|
Q_DISABLE_COPY(Tracker)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Tracker(QObject *parent = 0);
|
explicit Tracker(QObject *parent = nullptr);
|
||||||
~Tracker();
|
~Tracker();
|
||||||
|
|
||||||
bool start();
|
bool start();
|
||||||
|
|||||||
@@ -12,9 +12,9 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "base/preferences.h"
|
|
||||||
#include "base/bittorrent/torrentinfo.h"
|
|
||||||
#include "base/bittorrent/magneturi.h"
|
#include "base/bittorrent/magneturi.h"
|
||||||
|
#include "base/bittorrent/torrentinfo.h"
|
||||||
|
#include "base/preferences.h"
|
||||||
#include "filesystemwatcher.h"
|
#include "filesystemwatcher.h"
|
||||||
|
|
||||||
#ifndef CIFS_MAGIC_NUMBER
|
#ifndef CIFS_MAGIC_NUMBER
|
||||||
@@ -71,7 +71,7 @@ void FileSystemWatcher::addPath(const QString &path)
|
|||||||
// Check if the path points to a network file system or not
|
// Check if the path points to a network file system or not
|
||||||
if (isNetworkFileSystem(path)) {
|
if (isNetworkFileSystem(path)) {
|
||||||
// Network mode
|
// Network mode
|
||||||
qDebug("Network folder detected: %s", qPrintable(path));
|
qDebug("Network folder detected: %s", qUtf8Printable(path));
|
||||||
qDebug("Using file polling mode instead of inotify...");
|
qDebug("Using file polling mode instead of inotify...");
|
||||||
m_watchedFolders << dir;
|
m_watchedFolders << dir;
|
||||||
// Set up the watch timer
|
// Set up the watch timer
|
||||||
@@ -84,7 +84,7 @@ void FileSystemWatcher::addPath(const QString &path)
|
|||||||
else {
|
else {
|
||||||
#endif
|
#endif
|
||||||
// Normal mode
|
// Normal mode
|
||||||
qDebug("FS Watching is watching %s in normal mode", qPrintable(path));
|
qDebug("FS Watching is watching %s in normal mode", qUtf8Printable(path));
|
||||||
QFileSystemWatcher::addPath(path);
|
QFileSystemWatcher::addPath(path);
|
||||||
scanLocalFolder(path);
|
scanLocalFolder(path);
|
||||||
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
@@ -111,13 +111,13 @@ void FileSystemWatcher::removePath(const QString &path)
|
|||||||
|
|
||||||
void FileSystemWatcher::scanLocalFolder(QString path)
|
void FileSystemWatcher::scanLocalFolder(QString path)
|
||||||
{
|
{
|
||||||
qDebug("scanLocalFolder(%s) called", qPrintable(path));
|
qDebug("scanLocalFolder(%s) called", qUtf8Printable(path));
|
||||||
QStringList torrents;
|
QStringList torrents;
|
||||||
// Local folders scan
|
// Local folders scan
|
||||||
addTorrentsFromDir(QDir(path), torrents);
|
addTorrentsFromDir(QDir(path), torrents);
|
||||||
// Report detected torrent files
|
// Report detected torrent files
|
||||||
if (!torrents.empty()) {
|
if (!torrents.empty()) {
|
||||||
qDebug("The following files are being reported: %s", qPrintable(torrents.join("\n")));
|
qDebug("The following files are being reported: %s", qUtf8Printable(torrents.join("\n")));
|
||||||
emit torrentsAdded(torrents);
|
emit torrentsAdded(torrents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -129,12 +129,12 @@ void FileSystemWatcher::scanNetworkFolders()
|
|||||||
QStringList torrents;
|
QStringList torrents;
|
||||||
// Network folders scan
|
// Network folders scan
|
||||||
foreach (const QDir &dir, m_watchedFolders) {
|
foreach (const QDir &dir, m_watchedFolders) {
|
||||||
//qDebug("FSWatcher: Polling manually folder %s", qPrintable(dir.path()));
|
//qDebug("FSWatcher: Polling manually folder %s", qUtf8Printable(dir.path()));
|
||||||
addTorrentsFromDir(dir, torrents);
|
addTorrentsFromDir(dir, torrents);
|
||||||
}
|
}
|
||||||
// Report detected torrent files
|
// Report detected torrent files
|
||||||
if (!torrents.empty()) {
|
if (!torrents.empty()) {
|
||||||
qDebug("The following files are being reported: %s", qPrintable(torrents.join("\n")));
|
qDebug("The following files are being reported: %s", qUtf8Printable(torrents.join("\n")));
|
||||||
emit torrentsAdded(torrents);
|
emit torrentsAdded(torrents);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -201,7 +201,7 @@ void FileSystemWatcher::addTorrentsFromDir(const QDir &dir, QStringList &torrent
|
|||||||
torrents << fileAbsPath;
|
torrents << fileAbsPath;
|
||||||
}
|
}
|
||||||
else if (!m_partialTorrents.contains(fileAbsPath)) {
|
else if (!m_partialTorrents.contains(fileAbsPath)) {
|
||||||
qDebug("Partial torrent detected at: %s", qPrintable(fileAbsPath));
|
qDebug("Partial torrent detected at: %s", qUtf8Printable(fileAbsPath));
|
||||||
qDebug("Delay the file's processing...");
|
qDebug("Delay the file's processing...");
|
||||||
m_partialTorrents.insert(fileAbsPath, 0);
|
m_partialTorrents.insert(fileAbsPath, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
#ifndef FILESYSTEMWATCHER_H
|
#ifndef FILESYSTEMWATCHER_H
|
||||||
#define FILESYSTEMWATCHER_H
|
#define FILESYSTEMWATCHER_H
|
||||||
|
|
||||||
#include <QFileSystemWatcher>
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QTimer>
|
#include <QFileSystemWatcher>
|
||||||
|
#include <QHash>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QHash>
|
#include <QTimer>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Subclassing QFileSystemWatcher in order to support Network File
|
* Subclassing QFileSystemWatcher in order to support Network File
|
||||||
@@ -17,7 +17,7 @@ class FileSystemWatcher : public QFileSystemWatcher
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit FileSystemWatcher(QObject *parent = 0);
|
explicit FileSystemWatcher(QObject *parent = nullptr);
|
||||||
~FileSystemWatcher();
|
~FileSystemWatcher();
|
||||||
|
|
||||||
QStringList directories() const;
|
QStringList directories() const;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006 Ishan Arora and Christophe Dumez
|
* Copyright (C) 2006 Ishan Arora and 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
|
||||||
@@ -25,21 +25,20 @@
|
|||||||
* 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 "requestparser.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QUrlQuery>
|
#include <QUrlQuery>
|
||||||
#include <QDir>
|
|
||||||
#include <QDebug>
|
|
||||||
#include "requestparser.h"
|
|
||||||
|
|
||||||
const QByteArray EOL("\r\n");
|
const QByteArray EOL("\r\n");
|
||||||
const QByteArray EOH("\r\n\r\n");
|
const QByteArray EOH("\r\n\r\n");
|
||||||
|
|
||||||
inline QString unquoted(const QString& str)
|
inline QString unquoted(const QString &str)
|
||||||
{
|
{
|
||||||
if ((str[0] == '\"') && (str[str.length() - 1] == '\"'))
|
if ((str[0] == '\"') && (str[str.length() - 1] == '\"'))
|
||||||
return str.mid(1, str.length() - 2);
|
return str.mid(1, str.length() - 2);
|
||||||
@@ -49,7 +48,7 @@ inline QString unquoted(const QString& str)
|
|||||||
|
|
||||||
using namespace Http;
|
using namespace Http;
|
||||||
|
|
||||||
RequestParser::ErrorCode RequestParser::parse(const QByteArray& data, Request& request, uint maxContentLength)
|
RequestParser::ErrorCode RequestParser::parse(const QByteArray &data, Request &request, uint maxContentLength)
|
||||||
{
|
{
|
||||||
return RequestParser(maxContentLength).parseHttpRequest(data, request);
|
return RequestParser(maxContentLength).parseHttpRequest(data, request);
|
||||||
}
|
}
|
||||||
@@ -59,42 +58,42 @@ RequestParser::RequestParser(uint maxContentLength)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
RequestParser::ErrorCode RequestParser::parseHttpRequest(const QByteArray& data, Request& request)
|
RequestParser::ErrorCode RequestParser::parseHttpRequest(const QByteArray &data, Request &request)
|
||||||
{
|
{
|
||||||
m_request = Request();
|
m_request = Request();
|
||||||
|
|
||||||
// Parse HTTP request header
|
// Parse HTTP request header
|
||||||
const int header_end = data.indexOf(EOH);
|
const int headerEnd = data.indexOf(EOH);
|
||||||
if (header_end < 0) {
|
if (headerEnd < 0) {
|
||||||
qDebug() << Q_FUNC_INFO << "incomplete request";
|
qDebug() << Q_FUNC_INFO << "incomplete request";
|
||||||
return IncompleteRequest;
|
return IncompleteRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!parseHttpHeader(data.left(header_end))) {
|
if (!parseHttpHeader(data.left(headerEnd))) {
|
||||||
qWarning() << Q_FUNC_INFO << "header parsing error";
|
qWarning() << Q_FUNC_INFO << "header parsing error";
|
||||||
return BadRequest;
|
return BadRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse HTTP request message
|
// Parse HTTP request message
|
||||||
if (m_request.headers.contains("content-length")) {
|
if (m_request.headers.contains("content-length")) {
|
||||||
int content_length = m_request.headers["content-length"].toInt();
|
int contentLength = m_request.headers["content-length"].toInt();
|
||||||
if (content_length < 0) {
|
if (contentLength < 0) {
|
||||||
qWarning() << Q_FUNC_INFO << "bad request: content-length negative";
|
qWarning() << Q_FUNC_INFO << "bad request: content-length is negative";
|
||||||
return BadRequest;
|
return BadRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content_length > static_cast<int>(m_maxContentLength)) {
|
if (contentLength > static_cast<int>(m_maxContentLength)) {
|
||||||
qWarning() << Q_FUNC_INFO << "bad request: message too long";
|
qWarning() << Q_FUNC_INFO << "bad request: message too long";
|
||||||
return BadRequest;
|
return BadRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray content = data.mid(header_end + EOH.length(), content_length);
|
QByteArray content = data.mid(headerEnd + EOH.length(), contentLength);
|
||||||
if (content.length() < content_length) {
|
if (content.length() < contentLength) {
|
||||||
qDebug() << Q_FUNC_INFO << "incomplete request";
|
qDebug() << Q_FUNC_INFO << "incomplete request";
|
||||||
return IncompleteRequest;
|
return IncompleteRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((content_length > 0) && !parseContent(content)) {
|
if ((contentLength > 0) && !parseContent(content)) {
|
||||||
qWarning() << Q_FUNC_INFO << "message parsing error";
|
qWarning() << Q_FUNC_INFO << "message parsing error";
|
||||||
return BadRequest;
|
return BadRequest;
|
||||||
}
|
}
|
||||||
@@ -102,7 +101,7 @@ RequestParser::ErrorCode RequestParser::parseHttpRequest(const QByteArray& data,
|
|||||||
|
|
||||||
// qDebug() << Q_FUNC_INFO;
|
// qDebug() << Q_FUNC_INFO;
|
||||||
// qDebug() << "HTTP Request header:";
|
// qDebug() << "HTTP Request header:";
|
||||||
// qDebug() << data.left(header_end) << "\n";
|
// qDebug() << data.left(headerEnd) << "\n";
|
||||||
|
|
||||||
request = m_request;
|
request = m_request;
|
||||||
return NoError;
|
return NoError;
|
||||||
@@ -132,7 +131,7 @@ bool RequestParser::parseStartingLine(const QString &line)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RequestParser::parseHeaderLine(const QString &line, QPair<QString, QString>& out)
|
bool RequestParser::parseHeaderLine(const QString &line, QPair<QString, QString> &out)
|
||||||
{
|
{
|
||||||
int i = line.indexOf(QLatin1Char(':'));
|
int i = line.indexOf(QLatin1Char(':'));
|
||||||
if (i == -1) {
|
if (i == -1) {
|
||||||
@@ -150,7 +149,7 @@ bool RequestParser::parseHttpHeader(const QByteArray &data)
|
|||||||
QStringList lines = str.trimmed().split(EOL);
|
QStringList lines = str.trimmed().split(EOL);
|
||||||
|
|
||||||
QStringList headerLines;
|
QStringList headerLines;
|
||||||
foreach (const QString& line, lines) {
|
foreach (const QString &line, lines) {
|
||||||
if (line[0].isSpace()) { // header line continuation
|
if (line[0].isSpace()) { // header line continuation
|
||||||
if (!headerLines.isEmpty()) { // really continuation
|
if (!headerLines.isEmpty()) { // really continuation
|
||||||
headerLines.last() += QLatin1Char(' ');
|
headerLines.last() += QLatin1Char(' ');
|
||||||
@@ -181,7 +180,7 @@ bool RequestParser::parseHttpHeader(const QByteArray &data)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QByteArray> RequestParser::splitMultipartData(const QByteArray& data, const QByteArray& boundary)
|
QList<QByteArray> RequestParser::splitMultipartData(const QByteArray &data, const QByteArray &boundary)
|
||||||
{
|
{
|
||||||
QList<QByteArray> ret;
|
QList<QByteArray> ret;
|
||||||
QByteArray sep = boundary + EOL;
|
QByteArray sep = boundary + EOL;
|
||||||
@@ -205,7 +204,7 @@ QList<QByteArray> RequestParser::splitMultipartData(const QByteArray& data, cons
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RequestParser::parseContent(const QByteArray& data)
|
bool RequestParser::parseContent(const QByteArray &data)
|
||||||
{
|
{
|
||||||
// Parse message content
|
// Parse message content
|
||||||
qDebug() << Q_FUNC_INFO << "Content-Length: " << m_request.headers["content-length"];
|
qDebug() << Q_FUNC_INFO << "Content-Length: " << m_request.headers["content-length"];
|
||||||
@@ -243,14 +242,14 @@ Content-Disposition: form-data; name=\"Upload\"
|
|||||||
Submit Query
|
Submit Query
|
||||||
--cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5--
|
--cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5--
|
||||||
**/
|
**/
|
||||||
QString content_type = m_request.headers["content-type"];
|
QString contentType = m_request.headers["content-type"];
|
||||||
if (content_type.startsWith("multipart/form-data")) {
|
if (contentType.startsWith("multipart/form-data")) {
|
||||||
const QRegExp boundaryRegexQuoted("boundary=\"([ \\w'()+,-\\./:=\\?]+)\"");
|
const QRegExp boundaryRegexQuoted("boundary=\"([ \\w'()+,-\\./:=\\?]+)\"");
|
||||||
const QRegExp boundaryRegexNotQuoted("boundary=([\\w'()+,-\\./:=\\?]+)");
|
const QRegExp boundaryRegexNotQuoted("boundary=([\\w'()+,-\\./:=\\?]+)");
|
||||||
|
|
||||||
QByteArray boundary;
|
QByteArray boundary;
|
||||||
if (boundaryRegexQuoted.indexIn(content_type) < 0) {
|
if (boundaryRegexQuoted.indexIn(contentType) < 0) {
|
||||||
if (boundaryRegexNotQuoted.indexIn(content_type) < 0) {
|
if (boundaryRegexNotQuoted.indexIn(contentType) < 0) {
|
||||||
qWarning() << "Could not find boundary in multipart/form-data header!";
|
qWarning() << "Could not find boundary in multipart/form-data header!";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -274,21 +273,21 @@ Submit Query
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qWarning() << Q_FUNC_INFO << "unknown content type:" << qPrintable(content_type);
|
qWarning() << Q_FUNC_INFO << "unknown content type:" << qPrintable(contentType);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RequestParser::parseFormData(const QByteArray& data)
|
bool RequestParser::parseFormData(const QByteArray &data)
|
||||||
{
|
{
|
||||||
// Parse form data header
|
// Parse form data header
|
||||||
const int header_end = data.indexOf(EOH);
|
const int headerEnd = data.indexOf(EOH);
|
||||||
if (header_end < 0) {
|
if (headerEnd < 0) {
|
||||||
qDebug() << "Invalid form data: \n" << data;
|
qDebug() << "Invalid form data: \n" << data;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString header_str = QString::fromUtf8(data.left(header_end));
|
QString headerStr = QString::fromUtf8(data.left(headerEnd));
|
||||||
QStringList lines = header_str.trimmed().split(EOL);
|
QStringList lines = headerStr.trimmed().split(EOL);
|
||||||
QStringMap headers;
|
QStringMap headers;
|
||||||
foreach (const QString& line, lines) {
|
foreach (const QString& line, lines) {
|
||||||
QPair<QString, QString> header;
|
QPair<QString, QString> header;
|
||||||
@@ -302,7 +301,7 @@ bool RequestParser::parseFormData(const QByteArray& data)
|
|||||||
if (!headers.contains("content-disposition")
|
if (!headers.contains("content-disposition")
|
||||||
|| !parseHeaderValue(headers["content-disposition"], disposition)
|
|| !parseHeaderValue(headers["content-disposition"], disposition)
|
||||||
|| !disposition.contains("name")) {
|
|| !disposition.contains("name")) {
|
||||||
qDebug() << "Invalid form data header: \n" << header_str;
|
qDebug() << "Invalid form data header: \n" << headerStr;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,18 +309,18 @@ bool RequestParser::parseFormData(const QByteArray& data)
|
|||||||
UploadedFile ufile;
|
UploadedFile ufile;
|
||||||
ufile.filename = disposition["filename"];
|
ufile.filename = disposition["filename"];
|
||||||
ufile.type = disposition["content-type"];
|
ufile.type = disposition["content-type"];
|
||||||
ufile.data = data.mid(header_end + EOH.length());
|
ufile.data = data.mid(headerEnd + EOH.length());
|
||||||
|
|
||||||
m_request.files.append(ufile);
|
m_request.files.append(ufile);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_request.posts[disposition["name"]] = QString::fromUtf8(data.mid(header_end + EOH.length()));
|
m_request.posts[disposition["name"]] = QString::fromUtf8(data.mid(headerEnd + EOH.length()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RequestParser::parseHeaderValue(const QString& value, QStringMap& out)
|
bool RequestParser::parseHeaderValue(const QString &value, QStringMap &out)
|
||||||
{
|
{
|
||||||
int pos = value.indexOf(QLatin1Char(';'));
|
int pos = value.indexOf(QLatin1Char(';'));
|
||||||
if (pos == -1) {
|
if (pos == -1) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006 Ishan Arora and Christophe Dumez
|
* Copyright (C) 2006 Ishan Arora and 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
|
||||||
@@ -25,8 +25,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 HTTP_REQUESTPARSER_H
|
#ifndef HTTP_REQUESTPARSER_H
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace Http
|
|||||||
class ResponseBuilder : public QObject
|
class ResponseBuilder : public QObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit ResponseBuilder(QObject *parent = 0);
|
explicit ResponseBuilder(QObject *parent = nullptr);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void status(uint code = 200, const QString &text = QLatin1String("OK"));
|
void status(uint code = 200, const QString &text = QLatin1String("OK"));
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006 Ishan Arora and Christophe Dumez
|
* Copyright (C) 2006 Ishan Arora and 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
|
||||||
@@ -25,8 +25,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
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "responsegenerator.h"
|
#include "responsegenerator.h"
|
||||||
@@ -69,7 +67,7 @@ QByteArray Http::toByteArray(Response response)
|
|||||||
QString Http::httpDate()
|
QString Http::httpDate()
|
||||||
{
|
{
|
||||||
// [RFC 7231] 7.1.1.1. Date/Time Formats
|
// [RFC 7231] 7.1.1.1. Date/Time Formats
|
||||||
// example: "Sun, 06 Nov 1994 08:49:37 GMT"
|
// example: "Sun, 06 Nov 1994 08:49:37 GMT"
|
||||||
|
|
||||||
return QLocale::c().toString(QDateTime::currentDateTimeUtc(), QLatin1String("ddd, dd MMM yyyy HH:mm:ss"))
|
return QLocale::c().toString(QDateTime::currentDateTimeUtc(), QLatin1String("ddd, dd MMM yyyy HH:mm:ss"))
|
||||||
.append(QLatin1String(" GMT"));
|
.append(QLatin1String(" GMT"));
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006 Ishan Arora and Christophe Dumez
|
* Copyright (C) 2006 Ishan Arora and 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
|
||||||
@@ -25,8 +25,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
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
#include <QNetworkProxy>
|
#include <QNetworkProxy>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
#ifndef QT_NO_OPENSSL
|
#ifndef QT_NO_OPENSSL
|
||||||
#include <QSslSocket>
|
#include <QSslSocket>
|
||||||
#else
|
#else
|
||||||
@@ -123,15 +122,13 @@ bool Server::setupHttps(const QByteArray &certificates, const QByteArray &key)
|
|||||||
const QList<QSslCertificate> certs = QSslCertificate::fromData(certificates);
|
const QList<QSslCertificate> certs = QSslCertificate::fromData(certificates);
|
||||||
const bool areCertsValid = !certs.empty() && std::all_of(certs.begin(), certs.end(), [](const QSslCertificate &c) { return !c.isNull(); });
|
const bool areCertsValid = !certs.empty() && std::all_of(certs.begin(), certs.end(), [](const QSslCertificate &c) { return !c.isNull(); });
|
||||||
|
|
||||||
if (!sslKey.isNull() && areCertsValid)
|
if (!sslKey.isNull() && areCertsValid) {
|
||||||
{
|
|
||||||
m_key = sslKey;
|
m_key = sslKey;
|
||||||
m_certificates = certs;
|
m_certificates = certs;
|
||||||
m_https = true;
|
m_https = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
disableHttps();
|
disableHttps();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -164,4 +161,4 @@ QList<QSslCipher> Server::safeCipherList() const
|
|||||||
|
|
||||||
return safeCiphers;
|
return safeCiphers;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // QT_NO_OPENSSL
|
||||||
|
|||||||
@@ -25,8 +25,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
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -46,13 +44,13 @@ namespace Http
|
|||||||
class IRequestHandler;
|
class IRequestHandler;
|
||||||
class Connection;
|
class Connection;
|
||||||
|
|
||||||
class Server: public QTcpServer
|
class Server : public QTcpServer
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DISABLE_COPY(Server)
|
Q_DISABLE_COPY(Server)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Server(IRequestHandler *requestHandler, QObject *parent = 0);
|
Server(IRequestHandler *requestHandler, QObject *parent = nullptr);
|
||||||
~Server();
|
~Server();
|
||||||
|
|
||||||
#ifndef QT_NO_OPENSSL
|
#ifndef QT_NO_OPENSSL
|
||||||
@@ -67,7 +65,7 @@ namespace Http
|
|||||||
void incomingConnection(qintptr socketDescriptor);
|
void incomingConnection(qintptr socketDescriptor);
|
||||||
|
|
||||||
IRequestHandler *m_requestHandler;
|
IRequestHandler *m_requestHandler;
|
||||||
QList<Connection *> m_connections; // for tracking persistence connections
|
QList<Connection *> m_connections; // for tracking persistent connections
|
||||||
|
|
||||||
#ifndef QT_NO_OPENSSL
|
#ifndef QT_NO_OPENSSL
|
||||||
QList<QSslCipher> safeCipherList() const;
|
QList<QSslCipher> safeCipherList() const;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt4 and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2011 Christophe Dumez
|
* Copyright (C) 2011 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
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
@@ -34,8 +32,8 @@
|
|||||||
#include <QUrlQuery>
|
#include <QUrlQuery>
|
||||||
|
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
#include "base/net/downloadmanager.h"
|
|
||||||
#include "base/net/downloadhandler.h"
|
#include "base/net/downloadhandler.h"
|
||||||
|
#include "base/net/downloadmanager.h"
|
||||||
#include "dnsupdater.h"
|
#include "dnsupdater.h"
|
||||||
|
|
||||||
using namespace Net;
|
using namespace Net;
|
||||||
@@ -143,7 +141,7 @@ QString DNSUpdater::getUpdateUrl() const
|
|||||||
|
|
||||||
Q_ASSERT(!m_lastIP.isNull());
|
Q_ASSERT(!m_lastIP.isNull());
|
||||||
// Service specific
|
// Service specific
|
||||||
switch(m_service) {
|
switch (m_service) {
|
||||||
case DNS::DYNDNS:
|
case DNS::DYNDNS:
|
||||||
url.setHost("members.dyndns.org");
|
url.setHost("members.dyndns.org");
|
||||||
break;
|
break;
|
||||||
@@ -230,7 +228,6 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
|
|||||||
if (code == "abuse") {
|
if (code == "abuse") {
|
||||||
logger->addMessage(tr("Dynamic DNS error: Your username was blocked due to abuse."), Log::CRITICAL);
|
logger->addMessage(tr("Dynamic DNS error: Your username was blocked due to abuse."), Log::CRITICAL);
|
||||||
m_state = FATAL;
|
m_state = FATAL;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +286,7 @@ void DNSUpdater::updateCredentials()
|
|||||||
|
|
||||||
QUrl DNSUpdater::getRegistrationUrl(int service)
|
QUrl DNSUpdater::getRegistrationUrl(int service)
|
||||||
{
|
{
|
||||||
switch(service) {
|
switch (service) {
|
||||||
case DNS::DYNDNS:
|
case DNS::DYNDNS:
|
||||||
return QUrl("https://www.dyndns.com/account/services/hosts/add.html");
|
return QUrl("https://www.dyndns.com/account/services/hosts/add.html");
|
||||||
case DNS::NOIP:
|
case DNS::NOIP:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt4 and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2011 Christophe Dumez
|
* Copyright (C) 2011 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,16 +24,14 @@
|
|||||||
* 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 DNSUPDATER_H
|
#ifndef DNSUPDATER_H
|
||||||
#define DNSUPDATER_H
|
#define DNSUPDATER_H
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QHostAddress>
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QHostAddress>
|
||||||
|
#include <QObject>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
#include "base/preferences.h"
|
#include "base/preferences.h"
|
||||||
@@ -41,12 +39,12 @@
|
|||||||
namespace Net
|
namespace Net
|
||||||
{
|
{
|
||||||
// Based on http://www.dyndns.com/developers/specs/
|
// Based on http://www.dyndns.com/developers/specs/
|
||||||
class DNSUpdater: public QObject
|
class DNSUpdater : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DNSUpdater(QObject *parent = 0);
|
explicit DNSUpdater(QObject *parent = nullptr);
|
||||||
~DNSUpdater();
|
~DNSUpdater();
|
||||||
|
|
||||||
static QUrl getRegistrationUrl(int service);
|
static QUrl getRegistrationUrl(int service);
|
||||||
|
|||||||
@@ -27,20 +27,21 @@
|
|||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QTemporaryFile>
|
#include "downloadhandler.h"
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QNetworkProxy>
|
|
||||||
#include <QNetworkCookie>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkCookie>
|
||||||
|
#include <QNetworkProxy>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QTemporaryFile>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/gzip.h"
|
#include "base/utils/gzip.h"
|
||||||
#include "base/utils/misc.h"
|
#include "base/utils/misc.h"
|
||||||
#include "downloadmanager.h"
|
#include "downloadmanager.h"
|
||||||
#include "downloadhandler.h"
|
|
||||||
|
|
||||||
static QString errorCodeToString(QNetworkReply::NetworkError status);
|
static QString errorCodeToString(QNetworkReply::NetworkError status);
|
||||||
|
|
||||||
@@ -73,11 +74,11 @@ QString DownloadHandler::url() const
|
|||||||
void DownloadHandler::processFinishedDownload()
|
void DownloadHandler::processFinishedDownload()
|
||||||
{
|
{
|
||||||
QString url = m_reply->url().toString();
|
QString url = m_reply->url().toString();
|
||||||
qDebug("Download finished: %s", qPrintable(url));
|
qDebug("Download finished: %s", qUtf8Printable(url));
|
||||||
// Check if the request was successful
|
// Check if the request was successful
|
||||||
if (m_reply->error() != QNetworkReply::NoError) {
|
if (m_reply->error() != QNetworkReply::NoError) {
|
||||||
// Failure
|
// Failure
|
||||||
qDebug("Download failure (%s), reason: %s", qPrintable(url), qPrintable(errorCodeToString(m_reply->error())));
|
qDebug("Download failure (%s), reason: %s", qUtf8Printable(url), qUtf8Printable(errorCodeToString(m_reply->error())));
|
||||||
emit downloadFailed(m_url, errorCodeToString(m_reply->error()));
|
emit downloadFailed(m_url, errorCodeToString(m_reply->error()));
|
||||||
this->deleteLater();
|
this->deleteLater();
|
||||||
}
|
}
|
||||||
@@ -150,7 +151,7 @@ bool DownloadHandler::saveToFile(const QByteArray &replyData, QString &filePath)
|
|||||||
|
|
||||||
tmpfile->setAutoRemove(false);
|
tmpfile->setAutoRemove(false);
|
||||||
filePath = tmpfile->fileName();
|
filePath = tmpfile->fileName();
|
||||||
qDebug("Temporary filename is: %s", qPrintable(filePath));
|
qDebug("Temporary filename is: %s", qUtf8Printable(filePath));
|
||||||
if (m_reply->isOpen() || m_reply->open(QIODevice::ReadOnly)) {
|
if (m_reply->isOpen() || m_reply->open(QIODevice::ReadOnly)) {
|
||||||
tmpfile->write(replyData);
|
tmpfile->write(replyData);
|
||||||
tmpfile->close();
|
tmpfile->close();
|
||||||
@@ -174,7 +175,7 @@ void DownloadHandler::handleRedirection(QUrl newUrl)
|
|||||||
newUrl = m_reply->url().resolved(newUrl);
|
newUrl = m_reply->url().resolved(newUrl);
|
||||||
|
|
||||||
const QString newUrlString = newUrl.toString();
|
const QString newUrlString = newUrl.toString();
|
||||||
qDebug("Redirecting from %s to %s", qPrintable(m_reply->url().toString()), qPrintable(newUrlString));
|
qDebug("Redirecting from %s to %s", qUtf8Printable(m_reply->url().toString()), qUtf8Printable(newUrlString));
|
||||||
|
|
||||||
// Redirect to magnet workaround
|
// Redirect to magnet workaround
|
||||||
if (newUrlString.startsWith("magnet:", Qt::CaseInsensitive)) {
|
if (newUrlString.startsWith("magnet:", Qt::CaseInsensitive)) {
|
||||||
@@ -192,14 +193,14 @@ void DownloadHandler::handleRedirection(QUrl newUrl)
|
|||||||
m_reply->deleteLater();
|
m_reply->deleteLater();
|
||||||
m_reply = tmp->m_reply;
|
m_reply = tmp->m_reply;
|
||||||
init();
|
init();
|
||||||
tmp->m_reply = 0;
|
tmp->m_reply = nullptr;
|
||||||
delete tmp;
|
delete tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString errorCodeToString(QNetworkReply::NetworkError status)
|
QString errorCodeToString(QNetworkReply::NetworkError status)
|
||||||
{
|
{
|
||||||
switch(status) {
|
switch (status) {
|
||||||
case QNetworkReply::HostNotFoundError:
|
case QNetworkReply::HostNotFoundError:
|
||||||
return QObject::tr("The remote host name was not found (invalid hostname)");
|
return QObject::tr("The remote host name was not found (invalid hostname)");
|
||||||
case QNetworkReply::OperationCanceledError:
|
case QNetworkReply::OperationCanceledError:
|
||||||
|
|||||||
@@ -32,11 +32,9 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
class QUrl;
|
class QUrl;
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
namespace Net
|
namespace Net
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ DownloadHandler *DownloadManager::downloadUrl(const QString &url, bool saveToFil
|
|||||||
applyProxySettings();
|
applyProxySettings();
|
||||||
|
|
||||||
// Process download request
|
// Process download request
|
||||||
qDebug("url is %s", qPrintable(url));
|
qDebug("url is %s", qUtf8Printable(url));
|
||||||
const QUrl qurl = QUrl(url);
|
const QUrl qurl = QUrl(url);
|
||||||
QNetworkRequest request(qurl);
|
QNetworkRequest request(qurl);
|
||||||
|
|
||||||
|
|||||||
@@ -27,21 +27,22 @@
|
|||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QDebug>
|
#include "geoipmanager.h"
|
||||||
#include <QFile>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QHostAddress>
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QHostAddress>
|
||||||
|
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
#include "base/preferences.h"
|
#include "base/preferences.h"
|
||||||
#include "base/profile.h"
|
#include "base/profile.h"
|
||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/gzip.h"
|
#include "base/utils/gzip.h"
|
||||||
#include "downloadmanager.h"
|
|
||||||
#include "downloadhandler.h"
|
#include "downloadhandler.h"
|
||||||
|
#include "downloadmanager.h"
|
||||||
#include "private/geoipdatabase.h"
|
#include "private/geoipdatabase.h"
|
||||||
#include "geoipmanager.h"
|
|
||||||
|
|
||||||
static const char DATABASE_URL[] = "https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz";
|
static const char DATABASE_URL[] = "https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz";
|
||||||
static const char GEOIP_FOLDER[] = "GeoIP";
|
static const char GEOIP_FOLDER[] = "GeoIP";
|
||||||
@@ -52,11 +53,11 @@ using namespace Net;
|
|||||||
|
|
||||||
// GeoIPManager
|
// GeoIPManager
|
||||||
|
|
||||||
GeoIPManager *GeoIPManager::m_instance = 0;
|
GeoIPManager *GeoIPManager::m_instance = nullptr;
|
||||||
|
|
||||||
GeoIPManager::GeoIPManager()
|
GeoIPManager::GeoIPManager()
|
||||||
: m_enabled(false)
|
: m_enabled(false)
|
||||||
, m_geoIPDatabase(0)
|
, m_geoIPDatabase(nullptr)
|
||||||
{
|
{
|
||||||
configure();
|
configure();
|
||||||
connect(Preferences::instance(), SIGNAL(changed()), SLOT(configure()));
|
connect(Preferences::instance(), SIGNAL(changed()), SLOT(configure()));
|
||||||
@@ -78,7 +79,7 @@ void GeoIPManager::freeInstance()
|
|||||||
{
|
{
|
||||||
if (m_instance) {
|
if (m_instance) {
|
||||||
delete m_instance;
|
delete m_instance;
|
||||||
m_instance = 0;
|
m_instance = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +92,7 @@ void GeoIPManager::loadDatabase()
|
|||||||
{
|
{
|
||||||
if (m_geoIPDatabase) {
|
if (m_geoIPDatabase) {
|
||||||
delete m_geoIPDatabase;
|
delete m_geoIPDatabase;
|
||||||
m_geoIPDatabase = 0;
|
m_geoIPDatabase = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString filepath = Utils::Fs::expandPathAbs(
|
QString filepath = Utils::Fs::expandPathAbs(
|
||||||
@@ -407,7 +408,7 @@ void GeoIPManager::configure()
|
|||||||
}
|
}
|
||||||
else if (!m_enabled && m_geoIPDatabase) {
|
else if (!m_enabled && m_geoIPDatabase) {
|
||||||
delete m_geoIPDatabase;
|
delete m_geoIPDatabase;
|
||||||
m_geoIPDatabase = 0;
|
m_geoIPDatabase = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,8 +30,8 @@
|
|||||||
#ifndef NET_GEOIPMANAGER_H
|
#ifndef NET_GEOIPMANAGER_H
|
||||||
#define NET_GEOIPMANAGER_H
|
#define NET_GEOIPMANAGER_H
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QCache>
|
#include <QCache>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
class QHostAddress;
|
class QHostAddress;
|
||||||
class QString;
|
class QString;
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ void PortForwarder::freeInstance()
|
|||||||
{
|
{
|
||||||
if (m_instance) {
|
if (m_instance) {
|
||||||
delete m_instance;
|
delete m_instance;
|
||||||
m_instance = 0;
|
m_instance = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,4 +143,4 @@ void PortForwarder::stop()
|
|||||||
Logger::instance()->addMessage(tr("UPnP / NAT-PMP support [OFF]"), Log::INFO);
|
Logger::instance()->addMessage(tr("UPnP / NAT-PMP support [OFF]"), Log::INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
PortForwarder *PortForwarder::m_instance = 0;
|
PortForwarder *PortForwarder::m_instance = nullptr;
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
#ifndef NET_PORTFORWARDER_H
|
#ifndef NET_PORTFORWARDER_H
|
||||||
#define NET_PORTFORWARDER_H
|
#define NET_PORTFORWARDER_H
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
@@ -56,7 +56,7 @@ namespace Net
|
|||||||
void deletePort(quint16 port);
|
void deletePort(quint16 port);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit PortForwarder(libtorrent::session *const provider, QObject *parent = 0);
|
explicit PortForwarder(libtorrent::session *const provider, QObject *parent = nullptr);
|
||||||
~PortForwarder();
|
~PortForwarder();
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ void ProxyConfigurationManager::configureProxy()
|
|||||||
}
|
}
|
||||||
|
|
||||||
qDebug("HTTP communications proxy string: %s"
|
qDebug("HTTP communications proxy string: %s"
|
||||||
, qPrintable((m_config.type == ProxyType::SOCKS5) || (m_config.type == ProxyType::SOCKS5_PW)
|
, qUtf8Printable((m_config.type == ProxyType::SOCKS5) || (m_config.type == ProxyType::SOCKS5_PW)
|
||||||
? proxyStrSOCK : proxyStrHTTP));
|
? proxyStrSOCK : proxyStrHTTP));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2011 Christophe Dumez
|
* Copyright (C) 2011 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
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -33,22 +31,23 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "smtp.h"
|
#include "smtp.h"
|
||||||
#include "base/preferences.h"
|
|
||||||
#include "base/logger.h"
|
|
||||||
|
|
||||||
|
#include <QCryptographicHash>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QHostAddress>
|
||||||
|
#include <QHostInfo>
|
||||||
|
#include <QNetworkInterface>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QTextCodec>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#ifndef QT_NO_OPENSSL
|
#ifndef QT_NO_OPENSSL
|
||||||
#include <QSslSocket>
|
#include <QSslSocket>
|
||||||
#else
|
#else
|
||||||
#include <QTcpSocket>
|
#include <QTcpSocket>
|
||||||
#endif
|
#endif
|
||||||
#include <QTextCodec>
|
|
||||||
#include <QDebug>
|
#include "base/logger.h"
|
||||||
#include <QHostAddress>
|
#include "base/preferences.h"
|
||||||
#include <QHostInfo>
|
|
||||||
#include <QNetworkInterface>
|
|
||||||
#include <QCryptographicHash>
|
|
||||||
#include <QStringList>
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@@ -194,7 +193,7 @@ void Smtp::readyRead()
|
|||||||
ehlo();
|
ehlo();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
logError("Connection failed, unrecognized reply: " + line);
|
logError(QLatin1String("Connection failed, unrecognized reply: ") + line);
|
||||||
m_state = Close;
|
m_state = Close;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -231,7 +230,7 @@ void Smtp::readyRead()
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Authentication failed!
|
// Authentication failed!
|
||||||
logError("Authentication failed, msg: " + line);
|
logError(QLatin1String("Authentication failed, msg: ") + line);
|
||||||
m_state = Close;
|
m_state = Close;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -242,7 +241,7 @@ void Smtp::readyRead()
|
|||||||
m_state = Data;
|
m_state = Data;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
logError("<mail from> was rejected by server, msg: " + line);
|
logError(QLatin1String("<mail from> was rejected by server, msg: ") + line);
|
||||||
m_state = Close;
|
m_state = Close;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -253,7 +252,7 @@ void Smtp::readyRead()
|
|||||||
m_state = Body;
|
m_state = Body;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
logError("<Rcpt to> was rejected by server, msg: " + line);
|
logError(QLatin1String("<Rcpt to> was rejected by server, msg: ") + line);
|
||||||
m_state = Close;
|
m_state = Close;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -264,7 +263,7 @@ void Smtp::readyRead()
|
|||||||
m_state = Quit;
|
m_state = Quit;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
logError("<data> was rejected by server, msg: " + line);
|
logError(QLatin1String("<data> was rejected by server, msg: ") + line);
|
||||||
m_state = Close;
|
m_state = Close;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -276,7 +275,7 @@ void Smtp::readyRead()
|
|||||||
m_state = Close;
|
m_state = Close;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
logError("Message was rejected by the server, error: " + line);
|
logError(QLatin1String("Message was rejected by the server, error: ") + line);
|
||||||
m_state = Close;
|
m_state = Close;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||