You've already forked qBittorrent
mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-10-14 11:52:15 +02:00
Compare commits
175 Commits
release-3.
...
release-3.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c6fe1d3620 | ||
![]() |
73f08dd6e1 | ||
![]() |
22dc71f365 | ||
![]() |
455cc29dad | ||
![]() |
9d39a2cddc | ||
![]() |
efeb46571b | ||
![]() |
a7b564bb2e | ||
![]() |
10df509bce | ||
![]() |
7b394d6e99 | ||
![]() |
f1968de2c9 | ||
![]() |
b5db0eeec1 | ||
![]() |
3ed803f59b | ||
![]() |
ff10702bfd | ||
![]() |
73d3664f92 | ||
![]() |
aa6025aa87 | ||
![]() |
a344886ef6 | ||
![]() |
c181019f40 | ||
![]() |
5962efde23 | ||
![]() |
d43466d466 | ||
![]() |
29fb8e8085 | ||
![]() |
b076ff68ac | ||
![]() |
5f2da3a529 | ||
![]() |
576fbe5dc1 | ||
![]() |
8fc7f3fdc0 | ||
![]() |
becd67ac84 | ||
![]() |
7761a2604a | ||
![]() |
c6546db138 | ||
![]() |
f0dd4d5673 | ||
![]() |
7f245b63d7 | ||
![]() |
af17f4df9e | ||
![]() |
3ec2f94b27 | ||
![]() |
d7f1beb7f1 | ||
![]() |
8c7a4ab86c | ||
![]() |
ce2d42a264 | ||
![]() |
dc011a5599 | ||
![]() |
3c6b79805c | ||
![]() |
7e7055f2ff | ||
![]() |
18c9a65340 | ||
![]() |
f5ce39a36a | ||
![]() |
58e4f9d38e | ||
![]() |
5bd7dce396 | ||
![]() |
d9d49b6d0b | ||
![]() |
cc48ca1fdc | ||
![]() |
2dc6002064 | ||
![]() |
1478b21e8d | ||
![]() |
726c2fd56d | ||
![]() |
df86d66702 | ||
![]() |
223415fb69 | ||
![]() |
a4c9b667a7 | ||
![]() |
5f8e05ba50 | ||
![]() |
ed2689de15 | ||
![]() |
9e124527e1 | ||
![]() |
59971aa577 | ||
![]() |
164ca0289a | ||
![]() |
c0aa50d74b | ||
![]() |
66d7dc751c | ||
![]() |
c1738f97f1 | ||
![]() |
105874613a | ||
![]() |
d6829b253b | ||
![]() |
c1291539bf | ||
![]() |
3060c979f4 | ||
![]() |
d71a18b945 | ||
![]() |
4078fc5e2d | ||
![]() |
b7cb53a251 | ||
![]() |
275a775769 | ||
![]() |
1c49ff1df6 | ||
![]() |
fc77fdbcb5 | ||
![]() |
e0e757b610 | ||
![]() |
33fe9b6d87 | ||
![]() |
fca78d1a3f | ||
![]() |
92794a786f | ||
![]() |
08d9ad7f80 | ||
![]() |
6023093329 | ||
![]() |
c070193c30 | ||
![]() |
633fb7a7de | ||
![]() |
14a37e8d45 | ||
![]() |
d03a71899e | ||
![]() |
283338f5f3 | ||
![]() |
b600253313 | ||
![]() |
c97b5ab617 | ||
![]() |
9016b698c9 | ||
![]() |
eb7a7b9c04 | ||
![]() |
9e0a3ee692 | ||
![]() |
c899ed5b50 | ||
![]() |
a6c50aff95 | ||
![]() |
ab4a608342 | ||
![]() |
e7cfd7a31d | ||
![]() |
c4ea13b284 | ||
![]() |
5d09639109 | ||
![]() |
885f5b4bee | ||
![]() |
3cd06c457a | ||
![]() |
373e22660d | ||
![]() |
92f58a40e7 | ||
![]() |
dbf5a264bd | ||
![]() |
145dcf9efe | ||
![]() |
f05e25c750 | ||
![]() |
fc02377171 | ||
![]() |
3816052b0a | ||
![]() |
fae583e0da | ||
![]() |
1114c198ca | ||
![]() |
c5f9567c0b | ||
![]() |
e9a5768e4f | ||
![]() |
858e5f8db8 | ||
![]() |
0afa83dbfa | ||
![]() |
fc95ce310e | ||
![]() |
e2c9e7b877 | ||
![]() |
b1e62ca006 | ||
![]() |
a063ebd396 | ||
![]() |
728dd744bb | ||
![]() |
a0c1ee76a2 | ||
![]() |
c7b15b9cc5 | ||
![]() |
0770fe8b09 | ||
![]() |
cf98220c40 | ||
![]() |
2eb393ae9a | ||
![]() |
d65d11d64c | ||
![]() |
f4fdb80cc9 | ||
![]() |
50a0ce1da2 | ||
![]() |
2e9370481d | ||
![]() |
c60c58b092 | ||
![]() |
ba5dded076 | ||
![]() |
eb36949e87 | ||
![]() |
b7358a3039 | ||
![]() |
d0f082e238 | ||
![]() |
b301444f5e | ||
![]() |
900a80adc1 | ||
![]() |
d4887ee736 | ||
![]() |
e23566cde1 | ||
![]() |
b5f30a6efb | ||
![]() |
deb1d54999 | ||
![]() |
7779efbc30 | ||
![]() |
acd65e3185 | ||
![]() |
f2dd050ade | ||
![]() |
9c28a48f2e | ||
![]() |
3e8af95d30 | ||
![]() |
cba9d222de | ||
![]() |
b137eb01ed | ||
![]() |
fd156580a0 | ||
![]() |
21c17f2a81 | ||
![]() |
5f19cd2c0e | ||
![]() |
9279fedd49 | ||
![]() |
2361d6f12d | ||
![]() |
78bfbc5669 | ||
![]() |
6101f11673 | ||
![]() |
15361a6c16 | ||
![]() |
835a999464 | ||
![]() |
b9b0739efd | ||
![]() |
a34c072b7a | ||
![]() |
72e88ba7ec | ||
![]() |
afb143cad1 | ||
![]() |
1ca5d10abb | ||
![]() |
67675b6cdc | ||
![]() |
ef47983d8d | ||
![]() |
cf47517ee3 | ||
![]() |
33199bbd74 | ||
![]() |
4fb735c6d1 | ||
![]() |
99ca42bf48 | ||
![]() |
f6b4b5f6f0 | ||
![]() |
6f73c32fcc | ||
![]() |
c1611988b4 | ||
![]() |
fbe1d2d78a | ||
![]() |
34fec15ceb | ||
![]() |
1977e4f24d | ||
![]() |
5774d27c7b | ||
![]() |
3a6a857371 | ||
![]() |
e2f88feaf9 | ||
![]() |
16fec04b6a | ||
![]() |
fbac4afa2d | ||
![]() |
d6e9736af1 | ||
![]() |
76b3c72c86 | ||
![]() |
ef954fea55 | ||
![]() |
11d085712e | ||
![]() |
e4bc7852e5 | ||
![]() |
3d107e0588 | ||
![]() |
8e5c31ae82 | ||
![]() |
3c03ccc14a |
38
.travis.yml
38
.travis.yml
@@ -30,10 +30,7 @@ notifications:
|
||||
|
||||
# container-based builds
|
||||
#sudo: false
|
||||
# TODO: osx builder does not enable cache yet, see: https://github.com/travis-ci/travis-ci/issues/4011
|
||||
#cache:
|
||||
#directories:
|
||||
#- $HOME/.ccache
|
||||
cache: ccache
|
||||
|
||||
# opt-in Ubuntu Trusty
|
||||
sudo: required
|
||||
@@ -80,12 +77,6 @@ before_install:
|
||||
- if [ "$gui" = false ]; then qbtconf="$qbtconf --disable-gui" ; fi
|
||||
- |
|
||||
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
||||
# ccache
|
||||
#if [ "$TRAVIS_BRANCH" != "$coverity_branch" ]; then
|
||||
#dpkg-query -L ccache && export PATH="/usr/lib/ccache/:$PATH" && export use_ccache=true ;
|
||||
#ccache -V && ccache --show-stats && ccache --zero-stats ;
|
||||
#fi ;
|
||||
|
||||
# setup virtual display for after_success target
|
||||
if [ "$gui" = true ]; then export "DISPLAY=:99.0" && /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16 ; fi ;
|
||||
fi
|
||||
@@ -117,27 +108,44 @@ install:
|
||||
# Qt
|
||||
if [ "$qt" = 4 ]; then sudo apt-get -qq install qt4-default libqt4-dev ; fi ;
|
||||
if [ "$qt" = 5 ]; then sudo apt-get -qq install qt5-default qtbase5-dev qttools5-dev-tools ; fi ;
|
||||
|
||||
# ccache
|
||||
if [ "$TRAVIS_BRANCH" != "$coverity_branch" ]; then
|
||||
dpkg-query -L ccache && export use_ccache=true ;
|
||||
ccache -V && ccache --show-stats && ccache --zero-stats ;
|
||||
fi ;
|
||||
fi
|
||||
- |
|
||||
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||
# dependencies
|
||||
brew update > /dev/null && brew install colormake libtorrent-rasterbar ;
|
||||
brew update > /dev/null && brew install colormake ccache libtorrent-rasterbar ;
|
||||
|
||||
# Qt
|
||||
if [ "$qt" = 4 ]; then brew install qt ; fi ;
|
||||
if [ "$qt" = 5 ]; then brew install qt5 && brew link --force qt5 ; fi ;
|
||||
if [ "$qt" = 4 ]; then brew install qt && ln -s /usr/local/Cellar/qt/4.8.7_2/plugins /usr/local ; fi ;
|
||||
if [ "$qt" = 5 ]; then brew install qt5 && brew link --force qt5 && ln -s /usr/local/Cellar/qt5/5.6.0/plugins /usr/local ; fi ;
|
||||
|
||||
# ccache
|
||||
if [ "$TRAVIS_BRANCH" != "$coverity_branch" ]; then
|
||||
export PATH="/usr/local/opt/ccache/libexec:$PATH" && export use_ccache=true ;
|
||||
ccache -V && ccache --show-stats && ccache --zero-stats ;
|
||||
fi ;
|
||||
fi
|
||||
|
||||
script:
|
||||
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ]; then exit ; fi # skip usual build when running coverity scan
|
||||
- cd "$TRAVIS_BUILD_DIR" && ./bootstrap.sh && ./configure $qbtconf
|
||||
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then sed -i "" -e 's/^\(CXXFLAGS.*\)$/\1 -Wno-unused-local-typedefs/' src/Makefile ; fi
|
||||
- |
|
||||
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||
sed -i "" -e "s/^\(CC.*&&\).*$/\1 $CC/" src/Makefile ; # workaround for Qt & ccache: https://bugreports.qt.io/browse/QTBUG-31034
|
||||
sed -i "" -e "s/^\(CXX.*&&\).*$/\1 $CXX/" src/Makefile ;
|
||||
sed -i "" -e 's/^\(CXXFLAGS.*\)$/\1 -Wno-unused-local-typedefs -Wno-inconsistent-missing-override/' src/Makefile ;
|
||||
fi
|
||||
- make && make install
|
||||
|
||||
after_success:
|
||||
- if [ "$gui" = true ]; then qbt_exe="qbittorrent" ; else qbt_exe="qbittorrent-nox" ; fi
|
||||
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then cd "$qbt_path/bin" ; fi
|
||||
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then cd "$TRAVIS_BUILD_DIR/src/$qbt_exe.app/Contents/MacOS" ; fi
|
||||
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then cd "$TRAVIS_BUILD_DIR/src/" && macdeployqt "$qbt_exe.app" && cd "$qbt_exe.app/Contents/MacOS" ; fi
|
||||
- ./$qbt_exe --version
|
||||
|
||||
after_script:
|
||||
|
53
520EC6F6.asc
53
520EC6F6.asc
@@ -1,53 +0,0 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v2
|
||||
|
||||
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
|
||||
x8m1+aYiYlKfcKWm1nKQG0hF04Axq5AYezjKvA==
|
||||
=Zdwm
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
53
5B7CC9A2.asc
Normal file
53
5B7CC9A2.asc
Normal file
@@ -0,0 +1,53 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v2
|
||||
|
||||
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
|
||||
=tDGM
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
@@ -1,5 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.2)
|
||||
cmake_policy(VERSION 3.2)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
cmake_policy(VERSION 3.5)
|
||||
|
||||
project(qBittorrent VERSION 3.4.0.0)
|
||||
|
||||
|
@@ -29,8 +29,10 @@ class MyOtherClass
|
||||
{
|
||||
public:
|
||||
//code
|
||||
|
||||
protected:
|
||||
//code
|
||||
|
||||
private:
|
||||
//code
|
||||
};
|
||||
@@ -87,10 +89,14 @@ default:
|
||||
}
|
||||
```
|
||||
|
||||
#### d. single-line blocks (lambdas, initializer lists etc.) ####
|
||||
#### d. Brace enclosed initializers ####
|
||||
Unlike single-line functions, you must not insert spaces between the brackets and concluded expressions.<br/>
|
||||
But you must insert a space between the variable name and initializer.
|
||||
```c++
|
||||
{} // empty - space before {
|
||||
{ body } // spaces around { and before }
|
||||
Class obj {}; // empty
|
||||
Class obj {expr};
|
||||
Class obj {expr1, /*...,*/ exprN};
|
||||
QVariantMap map {{"key1", 5}, {"key2", 10}};
|
||||
```
|
||||
|
||||
### 2. If blocks ###
|
||||
@@ -173,11 +179,11 @@ All names should be camelCased.
|
||||
#### a. Type names and namespaces ####
|
||||
Type names and namespaces start with Upper case letter (except POD types).
|
||||
```c++
|
||||
class ClassName {}
|
||||
class ClassName {};
|
||||
|
||||
struct StructName {}
|
||||
struct StructName {};
|
||||
|
||||
enum EnumName {}
|
||||
enum EnumName {};
|
||||
|
||||
typedef QList<ClassName> SomeList;
|
||||
|
||||
@@ -201,7 +207,40 @@ class MyClass
|
||||
}
|
||||
```
|
||||
|
||||
### 8. Misc.###
|
||||
### 8. Header inclusion order.###
|
||||
The headers should be placed in the following order:
|
||||
1. Module header (in .cpp)
|
||||
2. System/Qt/Boost etc. headers (splitted in subcategories if you have many).
|
||||
3. Application headers, starting from *Base* headers.
|
||||
|
||||
The headers should be ordered alphabetically within each group (subgroup).<br/>
|
||||
<br/>
|
||||
Example:
|
||||
```c++
|
||||
// examplewidget.cpp
|
||||
|
||||
#include "examplewidget.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QList>
|
||||
#include <QString>
|
||||
#include <QUrl>
|
||||
|
||||
#include <libtorrent/version.hpp>
|
||||
|
||||
#include "base/bittorrent/session.h"
|
||||
#include "base/bittorrent/infohash.h"
|
||||
#include "base/utils/fs.h"
|
||||
#include "base/utils/misc.h"
|
||||
#include "base/utils/string.h"
|
||||
#include "ui_examplewidget.h"
|
||||
|
||||
```
|
||||
|
||||
### 9. Misc.###
|
||||
|
||||
* Line breaks for long lines with operation:
|
||||
|
||||
@@ -211,47 +250,18 @@ a += "b"
|
||||
+ "d";
|
||||
```
|
||||
|
||||
* Initializers
|
||||
|
||||
We allow brace enclosed initializers only for aggregates and arrays/containers.<br />
|
||||
Brace enclosed initializer MUST be used with equality sign if it follows the variable declaration.<br />
|
||||
Brace enclosed initializer MUST be additionally enclosed in parentheses if it is used in constructor initialization list.<br />
|
||||
Some valid use cases:
|
||||
```c++
|
||||
// aggregate
|
||||
Person john = { "John", "Smith", 21 };
|
||||
Person *john = new Person { "John", "Smith", 21 };
|
||||
|
||||
// array
|
||||
int array[] = { 1, 2, 3, 4 };
|
||||
|
||||
// container
|
||||
QHash<QString, QString> map = {
|
||||
{ "key1", "value1" },
|
||||
{ "key2", "value2" }
|
||||
);
|
||||
|
||||
// member array
|
||||
SomeClass::SomeClass(BaseClass *parent)
|
||||
: BaseClass(parent)
|
||||
, m_someArrayMember({ 1, 2, 3, 4 })
|
||||
{
|
||||
}
|
||||
|
||||
// return from function
|
||||
Person getPersonByName(const QString &name)
|
||||
{
|
||||
// do something
|
||||
return { name, surname, age };
|
||||
}
|
||||
|
||||
// function argument
|
||||
doSomething({ name, surname, age }, someOtherArg);
|
||||
```
|
||||
|
||||
* **auto** keyword
|
||||
|
||||
We allow the use of the **auto** keyword only where it doesn't break the readability of the code (i.e. either we can gather enough information about the type from the right part of the expression, or we do not need to know the exact type), or where it is strictly necessary (for example, to compute the type of a lambda, etc.).<br />
|
||||
We allow the use of the **auto** keyword only where it is strictly necessary
|
||||
(for example, to declare a lambda object, etc.), or where it **enhances** the readability of the code.
|
||||
Declarations for which one can gather enough information about the object interface (type) from its name
|
||||
or the usage pattern (an iterator or a loop variable are good examples of clear patterns)
|
||||
or the right part of the expression nicely fit here.<br/>
|
||||
<br/>
|
||||
When weighing whether to use an auto-typed variable please think about potential reviewers of your code,
|
||||
who will read it as a plain diff (on github.com, for instance). Please make sure that such reviewers can
|
||||
understand the code completely and without excessive effort.<br/>
|
||||
<br/>
|
||||
Some valid use cases:
|
||||
```c++
|
||||
template <typename List>
|
||||
@@ -274,9 +284,17 @@ auto spinBox = static_cast<QSpinBox*>(sender());
|
||||
|
||||
* Space around operations eg `a = b + c` or `a=b+c`:
|
||||
|
||||
Before and after the assignment there should be a space. One exception could be: for loops.
|
||||
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++
|
||||
for (int a=0; a<b; ++b) {
|
||||
a += 20;
|
||||
a = (b <= MAX_B ? b : MAX_B);
|
||||
++a;
|
||||
b--;
|
||||
|
||||
for (int a = 0; a < b; ++b) {
|
||||
// code
|
||||
}
|
||||
```
|
||||
|
||||
@@ -286,5 +304,5 @@ for (int a=0; a<b; ++b) {
|
||||
|
||||
* Method definitions aren't allowed in header files
|
||||
|
||||
### 9. Not covered above###
|
||||
###10. Not covered above###
|
||||
If something isn't covered above, just follow the same style the file you are editing has. If that particular detail isn't present in the file you are editing, then use whatever the rest of the project uses.
|
72
COPYING
72
COPYING
@@ -12,15 +12,15 @@ exception statement from your version.
|
||||
|
||||
----------
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
@@ -70,7 +70,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
@@ -269,7 +269,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
@@ -291,64 +291,4 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
71
Changelog
71
Changelog
@@ -1,3 +1,74 @@
|
||||
* Mon Jun 20 2016 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.5
|
||||
- FEATURE: Implement Torrent Management Mode(TMM) (glassez)
|
||||
- FEATURE: New cookies management dialog and various related fixes (glassez)
|
||||
- FEATURE: Use unique temp directories (temp_path/<truncated_torrent_hash>). Closes #5154. (glassez)
|
||||
- FEATURE: Display notifications when a torrent is added. Closes #334 and #915. (sledgehammer999)
|
||||
- FEATURE: Sort labels with natural sort algorithm in the right-click menu. Closes #3919. (Chocobo1)
|
||||
- FEATURE: Add option to automatically remove .torrent files upon adding (Eugene Shalygin)
|
||||
- FEATURE: Add option to bind directly to an IP instead of using a network Interface (Sjoerd van der Berg, sledgehammer999)
|
||||
- FEATURE: Detailed tooltips on the progress and availability bars in the General button of each torrent. (Eugene Shalygin)
|
||||
- FEATURE: Let user able to specifiy a filter when choosing an IP filter file (Chocobo1)
|
||||
- FEATURE: Improve usability of "Run External Program". Users can write (platform dependent) shell scripts now. (Chocobo1)
|
||||
- PERFORMANCE: Optimize drawing in speed graph (Anton Lashkov, Chocobo1)
|
||||
- BUGFIX: Fix memory leak. (sledgehammer999)
|
||||
- BUGFIX: Fix resizing bug in "add torrent dialog". Closes #5036. (Chocobo1)
|
||||
- BUGFIX: Fix qBittorrent doesn't exit immediately when "all donwloads are done -> exit" option enabled. (glassez, Chocobo1)
|
||||
- BUGFIX: Display the filepath when a torrent fails to load. Closes #100 and #805. (sledgehammer999)
|
||||
- BUGFIX: Fix Add tracker dialog empty trackers (ngosang)
|
||||
- BUGFIX: Fix Add tracker dialog URL download (ngosang)
|
||||
- BUGFIX: Fix torrent adding with existing data (glassez)
|
||||
- BUGFIX: Try to find incomplete files for new torrent (glassez)
|
||||
- BUGFIX: Fix rechecking after torrent is finished (glassez)
|
||||
- BUGFIX: Fix duplicate network interfaces. Closes #5131 (ngosang)
|
||||
- BUGFIX: Fix .!qB extension is added when disabled (glassez)
|
||||
- BUGFIX: Fix "IP Filtering - Apply to trackers" wasn't being applied. Closes #5217. (Chocobo1)
|
||||
- BUGFIX: Don't resize the Country column needlessly (thalieht)
|
||||
- BUGFIX: Fix crashing when exiting the program while the Options window was showing. Closes #4871, #5049. (Chocobo1)
|
||||
- BUGFIX: Fix parsing of eMule .DAT filters. Closes #5281. (thalieht, sledgehammer999)
|
||||
- WEBUI: Implement in setting/removing/showing categories. (buinsky)
|
||||
- WEBUI: Add 'Added on' column in Webui. Closes #5145,#1092,#738 (Ibrahim Tachijian)
|
||||
- WEBUI: Add command to get the logs (pmzqla)
|
||||
- WEBUI: Expose Add trackers feature (pmzqla)
|
||||
- WEBUI: Bump API_VERSION and API_VERSION_MIN to 10. (sledgehammer999)
|
||||
- SEARCH: Implement search filters in the proxy model. (Eugene Shalygin)
|
||||
- SEARCH: Optimize widgets inside of the search tab (Eugene Shalygin)
|
||||
- SEARCH: Remove duplicated code from search tab and widget (Eugene Shalygin)
|
||||
- SEARCH: Use nova2dl.py script instead of DownloadManager. Closes #5026. (glassez)
|
||||
- SEARCH: Various UI cleanups and optimizations. (Chocobo1, ngosang)
|
||||
- SEARCH: Fix Torrentz, Mininova, LegitTorrents, PirateBay plugins (ngosang)
|
||||
- SEARCH: Fix toolbar resizing when m_searchFilter appears/disappears. Closes #5120. (Chocobo1)
|
||||
- SEARCH: Use QPalette::LinkVisited color for downloaded items in search results (Eugene Shalygin)
|
||||
- SEARCH: Update Python version requirements (min 2.7.9 / 3.3.0) (ngosang)
|
||||
- SEARCH: Remove filters from Torrentreactor, BTDigg and Demonoid. It is done in the GUI now. (ngosang)
|
||||
- RSS: default refresh interval to 30 mins (botmtl)
|
||||
- COSMETIC: Improve TransferListDelegate::sizeHint (Chocobo1)
|
||||
- COSMETIC: Fix long text clipping. Closes #5091. (Chocobo1)
|
||||
- COSMETIC: Minor change in Stats dialog (ngosang)
|
||||
- COSMETIC: Fix Update all button height in RSS tab (ngosang)
|
||||
- COSMETIC: Disable `comboHideZero` when `checkHideZero` is unchecked. (Chocobo1)
|
||||
- COSMETIC: Disable `checkLimituTPConnections` when `checkuTP` is unchecked. (Chocobo1)
|
||||
- COSMETIC: Enable word wrap for "Run external program" help text (Chocobo1)
|
||||
- COSMETIC: Fix mutually exclusive radio buttons can be unselected. (Chocobo1)
|
||||
- COSMETIC: Set About tab font-size to default (zywo)
|
||||
- COSMETIC: Improve wordings in "Auto download torrent" section (Chocobo1)
|
||||
- COSMETIC: Change "Auto download torrent" default save path to "default location". (Chocobo1)
|
||||
- COSMETIC: Change ambiguous text "Copy selected" to "Copy IP:port" (Chocobo1)
|
||||
- COSMETIC: Improve error messages for "Auto download torrents" (Chocobo1)
|
||||
- COSMETIC: Slim down 'Downloads' page of options window. (sledgehammer999)
|
||||
- COSMETIC: Cleanup Connection page in Option dialog. Closes #845. (Chocobo1)
|
||||
- COSMETIC: Fix reload button size is not the same size as "..." button in options dialog. (Chocobo1)
|
||||
- WINDOWS: Let Windows handle all widgets scaling. (Chocobo1)
|
||||
- WINDOWS: Improve stack trace for windows by including source filenames and line numbers (SeigneurSerpent)
|
||||
- OSX: Fix qt5 bundle on OSX. Closes #4014. (sledgehammer999)
|
||||
- OTHER: Make AddNewTorrentDialog behavior uniform (glassez)
|
||||
- OTHER: Optimize the shutdown dialog (Chocobo1)
|
||||
- OTHER: Enable access to shutdown functions when configured with `--disable-gui` option (Chocobo1)
|
||||
- OTHER: Delete Import Torrent Dialog. Just use the "add new torrent" dialog. (glassez)
|
||||
- OTHER: Optimize code for natural sorting (Chocobo1)
|
||||
- OTHER: Use new alert dispathing API for libtorrent 1.1.x (glassez)
|
||||
- OTHER: Fix gcc 6 compilation with qmake. See #5237. (sledgehammer999)
|
||||
|
||||
|
||||
* Tue Mar 29 2016 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.4
|
||||
- FEATURE: Download more pieces in "Download first and last pieces first" feature (ngosang)
|
||||
- FEATURE: Unlock first column in peerlist too (thalieht)
|
||||
|
@@ -29,8 +29,9 @@ will install and execute qBittorrent hopefully without any problem.
|
||||
|
||||
### Public key:
|
||||
Starting from v3.3.4 all source tarballs and binaries are signed.<br />
|
||||
The key currently used is 4096R/[520EC6F6](https://pgp.mit.edu/pks/lookup?op=get&search=0xA1ACCAE4520EC6F6) with fingerprint `F4A5FD201B117B1C2AB590E2A1ACCAE4520EC6F6`.<br />
|
||||
You can also download it from [here](https://github.com/qbittorrent/qBittorrent/raw/master/520EC6F6.asc).<br />
|
||||
The key currently used is 4096R/[5B7CC9A2](https://pgp.mit.edu/pks/lookup?op=get&search=0x6E4A2D025B7CC9A2) with fingerprint `D8F3DA77AAC6741053599C136E4A2D025B7CC9A2`.<br />
|
||||
You can also download it from [here](https://github.com/qbittorrent/qBittorrent/raw/master/5B7CC9A2.asc).<br />
|
||||
**PREVIOUSLY** the following key was used to sign the v3.3.4 source tarballs and v3.3.4 Windows installer **only**: 4096R/[520EC6F6](https://pgp.mit.edu/pks/lookup?op=get&search=0xA1ACCAE4520EC6F6) with fingerprint `F4A5FD201B117B1C2AB590E2A1ACCAE4520EC6F6`.<br />
|
||||
|
||||
### Misc:
|
||||
For more information please visit:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/bin/sh
|
||||
|
||||
aclocal -I m4
|
||||
autoconf
|
||||
|
@@ -91,3 +91,16 @@ find_package_handle_standard_args(LibtorrentRasterbar DEFAULT_MSG
|
||||
mark_as_advanced(LibtorrentRasterbar_INCLUDE_DIR LibtorrentRasterbar_LIBRARY
|
||||
LibtorrentRasterbar_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES
|
||||
LibtorrentRasterbar_ENCRYPTION_INDEX)
|
||||
|
||||
if (LibtorrentRasterbar_FOUND AND NOT TARGET LibtorrentRasterbar::LibTorrent)
|
||||
add_library(LibtorrentRasterbar::LibTorrent UNKNOWN IMPORTED)
|
||||
|
||||
set_target_properties(LibtorrentRasterbar::LibTorrent PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
|
||||
IMPORTED_LOCATION "${LibtorrentRasterbar_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LibtorrentRasterbar_INCLUDE_DIRS}"
|
||||
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LibtorrentRasterbar_INCLUDE_DIRS}"
|
||||
INTERFACE_LINK_LIBRARIES "${LibtorrentRasterbar_LIBRARIES}"
|
||||
INTERFACE_COMPILE_OPTIONS "${LibtorrentRasterbar_DEFINITIONS}"
|
||||
)
|
||||
endif()
|
||||
|
@@ -79,3 +79,16 @@ ELSE (QTSINGLEAPPLICATION_FOUND)
|
||||
ENDIF (QTSINGLEAPPLICATION_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(QTSINGLEAPPLICATION_INCLUDE_DIR QTSINGLEAPPLICATION_LIBRARY)
|
||||
|
||||
if(NOT TARGET QtSingleApplication::QtSingleApplication)
|
||||
add_library(QtSingleApplication::QtSingleApplication UNKNOWN IMPORTED)
|
||||
set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${QTSINGLEAPPLICATION_INCLUDE_DIR}"
|
||||
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${QTSINGLEAPPLICATION_INCLUDE_DIR}"
|
||||
)
|
||||
if(EXISTS "${QTSINGLEAPPLICATION_LIBRARY}")
|
||||
set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
|
||||
IMPORTED_LOCATION "${QTSINGLEAPPLICATION_LIBRARY}")
|
||||
endif()
|
||||
endif(NOT TARGET QtSingleApplication::QtSingleApplication)
|
||||
|
17
cmake/Modules/QbtTargetSources.cmake
Normal file
17
cmake/Modules/QbtTargetSources.cmake
Normal file
@@ -0,0 +1,17 @@
|
||||
# a helper function which appends source to the main qBt target
|
||||
# the target name is read from QBT_TARGET_NAME variable
|
||||
# sources file names are relative to the the ${qbt_executable_SOURCE_DIR}
|
||||
|
||||
function (qbt_target_sources)
|
||||
set (_sources_rel "")
|
||||
foreach (_source IN ITEMS ${ARGN})
|
||||
if (IS_ABSOLUTE "${_source}")
|
||||
set(source_abs "${_source}")
|
||||
else()
|
||||
get_filename_component(_source_abs "${_source}" ABSOLUTE)
|
||||
endif()
|
||||
file (RELATIVE_PATH _source_rel "${qbt_executable_SOURCE_DIR}" "${_source_abs}")
|
||||
list (APPEND _sources_rel "${_source_rel}")
|
||||
endforeach()
|
||||
target_sources (${QBT_TARGET_NAME} PRIVATE "${_sources_rel}")
|
||||
endfunction (qbt_target_sources)
|
10
conf.pri.in
10
conf.pri.in
@@ -6,8 +6,14 @@ DATADIR = @EXPAND_DATADIR@
|
||||
MANPREFIX = @EXPAND_MANDIR@
|
||||
|
||||
QMAKE_CXXFLAGS += @QBT_CONF_EXTRA_CFLAGS@
|
||||
INCLUDEPATH += @QBT_CONF_INCLUDES@
|
||||
LIBS += @LDFLAGS@ @LIBS@
|
||||
|
||||
EXTERNAL_INCLUDES = @QBT_CONF_INCLUDES@
|
||||
EXTERNAL_INCLUDES -= $$QMAKE_DEFAULT_INCDIRS
|
||||
INCLUDEPATH += $$EXTERNAL_INCLUDES
|
||||
|
||||
EXTERNAL_LIBS = @LDFLAGS@ @LIBS@
|
||||
EXTERNAL_LIBS -= $$QMAKE_DEFAULT_LIBDIRS
|
||||
LIBS += $$EXTERNAL_LIBS
|
||||
|
||||
CONFIG += @QBT_ADD_CONFIG@
|
||||
CONFIG -= @QBT_REMOVE_CONFIG@
|
||||
|
2
dist/mac/Info.plist
vendored
2
dist/mac/Info.plist
vendored
@@ -45,7 +45,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.3.4</string>
|
||||
<string>3.3.5</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>qBit</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
|
2
dist/windows/options.nsi
vendored
2
dist/windows/options.nsi
vendored
@@ -19,7 +19,7 @@ XPStyle on
|
||||
!define CSIDL_APPDATA '0x1A' ;Application Data path
|
||||
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
|
||||
|
||||
!define PROG_VERSION "3.3.4"
|
||||
!define PROG_VERSION "3.3.5"
|
||||
!define MUI_FINISHPAGE_RUN
|
||||
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
||||
!define MUI_FINISHPAGE_RUN_TEXT $(launch_qbt)
|
||||
|
2
dist/windows/qt.conf
vendored
2
dist/windows/qt.conf
vendored
@@ -2,4 +2,4 @@
|
||||
Translations = translations
|
||||
|
||||
[Platforms]
|
||||
WindowsArguments = dpiawareness=1
|
||||
WindowsArguments = dpiawareness=0
|
||||
|
@@ -3,15 +3,9 @@ set(CMAKE_CXX_STANDARD "11")
|
||||
add_definitions(-DBOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
|
||||
include(MacroLinkQtComponents)
|
||||
include(QbtTargetSources)
|
||||
|
||||
find_package(LibtorrentRasterbar REQUIRED)
|
||||
include_directories(SYSTEM ${LibtorrentRasterbar_INCLUDE_DIRS})
|
||||
add_compile_options(${LibtorrentRasterbar_DEFINITIONS})
|
||||
|
||||
# Boost
|
||||
set(Boost_USE_MULTITHREADED ON)
|
||||
find_package(Boost 1.35 REQUIRED COMPONENTS system)
|
||||
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
|
||||
|
||||
# Qt
|
||||
if (QT5)
|
||||
@@ -88,16 +82,22 @@ set(QBT_USES_QT5 ${QT5})
|
||||
|
||||
configure_file(config.h.cmakein ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
||||
|
||||
if (GUI)
|
||||
set(QBT_TARGET_NAME qbittorrent)
|
||||
else (GUI)
|
||||
set(QBT_TARGET_NAME qbittorrent-nox)
|
||||
endif (GUI)
|
||||
|
||||
add_subdirectory(base)
|
||||
|
||||
if (SYSTEM_QTSINGLEAPPLICATION)
|
||||
find_package(QtSingleApplication REQUIRED)
|
||||
include_directories(${QTSINGLEAPPLICATION_INCLUDE_DIR})
|
||||
else (SYSTEM_QTSINGLEAPPLICATION)
|
||||
include_directories(app/qtsingleapplication)
|
||||
add_subdirectory(app/qtsingleapplication)
|
||||
endif (SYSTEM_QTSINGLEAPPLICATION)
|
||||
|
||||
add_subdirectory(app)
|
||||
add_subdirectory(base)
|
||||
|
||||
if (GUI)
|
||||
add_subdirectory(gui)
|
||||
endif (GUI)
|
||||
@@ -106,4 +106,3 @@ if (WEBUI)
|
||||
add_subdirectory(webui)
|
||||
endif (WEBUI)
|
||||
|
||||
add_subdirectory(app)
|
||||
|
@@ -1,3 +1,4 @@
|
||||
project(qbt_executable)
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
set(QBT_APP_HEADERS
|
||||
@@ -86,13 +87,10 @@ list(APPEND QBT_APP_HEADERS upgrade.h)
|
||||
list(APPEND QBT_TARGET_LIBRARIES qbt_base)
|
||||
|
||||
if (GUI)
|
||||
set(QBT_TARGET_NAME qbittorrent)
|
||||
list(APPEND QBT_TARGET_LIBRARIES qbt_searchengine qbt_gui)
|
||||
include_directories(../gui
|
||||
${CMAKE_CURRENT_BINARY_DIR}/../gui
|
||||
)
|
||||
else (GUI)
|
||||
set(QBT_TARGET_NAME qbittorrent-nox)
|
||||
endif (GUI)
|
||||
|
||||
if (WEBUI)
|
||||
@@ -152,6 +150,7 @@ add_executable(${QBT_TARGET_NAME} ${QBT_APP_HEADERS} ${QBT_APP_SOURCES} ${QBT_QM
|
||||
set_target_properties(${QBT_TARGET_NAME}
|
||||
PROPERTIES
|
||||
AUTOUIC True
|
||||
AUTORCC True
|
||||
MACOSX_BUNDLE True
|
||||
)
|
||||
|
||||
@@ -159,14 +158,7 @@ if (GUI AND WIN32)
|
||||
set_target_properties(${QBT_TARGET_NAME} PROPERTIES WIN32_EXECUTABLE True)
|
||||
endif (GUI AND WIN32)
|
||||
|
||||
target_link_libraries(${QBT_TARGET_NAME} ${QBT_TARGET_LIBRARIES})
|
||||
|
||||
if (SYSTEM_QTSINGLEAPPLICATION)
|
||||
target_link_libraries(${QBT_TARGET_NAME} ${QTSINGLEAPPLICATION_LIBRARIES})
|
||||
else (SYSTEM_QTSINGLEAPPLICATION)
|
||||
add_subdirectory(qtsingleapplication)
|
||||
target_link_libraries(${QBT_TARGET_NAME} qtsingleapplication)
|
||||
endif (SYSTEM_QTSINGLEAPPLICATION)
|
||||
target_link_libraries(${QBT_TARGET_NAME} ${QBT_TARGET_LIBRARIES} QtSingleApplication::QtSingleApplication)
|
||||
|
||||
if (APPLE)
|
||||
set(qbt_BUNDLE_NAME "${CMAKE_PROJECT_NAME}")
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -76,6 +76,26 @@ public:
|
||||
int exec(const QStringList ¶ms);
|
||||
bool sendParams(const QStringList ¶ms);
|
||||
|
||||
#ifndef DISABLE_GUI
|
||||
QPointer<MainWindow> mainWindow();
|
||||
#endif
|
||||
|
||||
// FileLogger properties
|
||||
bool isFileLoggerEnabled() const;
|
||||
void setFileLoggerEnabled(bool value);
|
||||
QString fileLoggerPath() const;
|
||||
void setFileLoggerPath(const QString &path);
|
||||
bool isFileLoggerBackup() const;
|
||||
void setFileLoggerBackup(bool value);
|
||||
bool isFileLoggerDeleteOld() const;
|
||||
void setFileLoggerDeleteOld(bool value);
|
||||
int fileLoggerMaxSize() const;
|
||||
void setFileLoggerMaxSize(const int value);
|
||||
int fileLoggerAge() const;
|
||||
void setFileLoggerAge(const int value);
|
||||
int fileLoggerAgeType() const;
|
||||
void setFileLoggerAgeType(const int value);
|
||||
|
||||
protected:
|
||||
#ifndef DISABLE_GUI
|
||||
#ifdef Q_OS_MAC
|
||||
@@ -85,7 +105,6 @@ protected:
|
||||
#endif
|
||||
|
||||
private slots:
|
||||
void configure();
|
||||
void processMessage(const QString &message);
|
||||
void torrentFinished(BitTorrent::TorrentHandle *const torrent);
|
||||
void allTorrentsFinished();
|
||||
@@ -96,10 +115,10 @@ private slots:
|
||||
|
||||
private:
|
||||
bool m_running;
|
||||
ShutdownDialogAction m_shutdownAct;
|
||||
|
||||
#ifndef DISABLE_GUI
|
||||
QPointer<MainWindow> m_window;
|
||||
ShutdownAction m_shutdownAct;
|
||||
#endif
|
||||
|
||||
#ifndef DISABLE_WEBUI
|
||||
@@ -115,6 +134,7 @@ private:
|
||||
|
||||
void initializeTranslation();
|
||||
void processParams(const QStringList ¶ms);
|
||||
void runExternalProgram(BitTorrent::TorrentHandle *const torrent) const;
|
||||
void sendNotificationEmail(BitTorrent::TorrentHandle *const torrent);
|
||||
};
|
||||
|
||||
|
@@ -26,37 +26,31 @@
|
||||
* exception statement from your version.
|
||||
*/
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include "filelogger.h"
|
||||
#include "base/preferences.h"
|
||||
#include "base/logger.h"
|
||||
#include "base/utils/fs.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
enum FileLogAgeType
|
||||
{
|
||||
DAYS,
|
||||
MONTHS,
|
||||
YEARS
|
||||
};
|
||||
}
|
||||
|
||||
FileLogger::FileLogger()
|
||||
: m_logFile(nullptr)
|
||||
FileLogger::FileLogger(const QString &path, const bool backup, const int maxSize, const bool deleteOld, const int age, const FileLogAgeType ageType)
|
||||
: m_backup(backup)
|
||||
, m_maxSize(maxSize)
|
||||
, m_logFile(nullptr)
|
||||
{
|
||||
m_flusher.setInterval(0);
|
||||
m_flusher.setSingleShot(true);
|
||||
connect(&m_flusher, SIGNAL(timeout()), SLOT(flushLog()));
|
||||
|
||||
configure();
|
||||
changePath(path);
|
||||
if (deleteOld)
|
||||
this->deleteOld(age, ageType);
|
||||
|
||||
const Logger* const logger = Logger::instance();
|
||||
foreach (const Log::Msg& msg, logger->getMessages())
|
||||
addLogMessage(msg);
|
||||
|
||||
connect(Preferences::instance(), SIGNAL(changed()), SLOT(configure()));
|
||||
connect(logger, SIGNAL(newLogMessage(const Log::Msg &)), SLOT(addLogMessage(const Log::Msg &)));
|
||||
}
|
||||
|
||||
@@ -67,10 +61,9 @@ FileLogger::~FileLogger()
|
||||
delete m_logFile;
|
||||
}
|
||||
|
||||
void FileLogger::configure()
|
||||
void FileLogger::changePath(const QString& newPath)
|
||||
{
|
||||
const Preferences* const pref = Preferences::instance();
|
||||
QString tmpPath = Utils::Fs::fromNativePath(pref->fileLogPath());
|
||||
QString tmpPath = Utils::Fs::fromNativePath(newPath);
|
||||
QDir dir(tmpPath);
|
||||
dir.mkpath(tmpPath);
|
||||
tmpPath = dir.absoluteFilePath("qbittorrent.log");
|
||||
@@ -85,30 +78,39 @@ void FileLogger::configure()
|
||||
m_logFile = new QFile(m_path);
|
||||
openLogFile();
|
||||
}
|
||||
}
|
||||
|
||||
m_backup = pref->fileLogBackup();
|
||||
m_size = pref->fileLogMaxSize();
|
||||
void FileLogger::deleteOld(const int age, const FileLogAgeType ageType)
|
||||
{
|
||||
QDateTime date = QDateTime::currentDateTime();
|
||||
QDir dir(m_path);
|
||||
|
||||
if (pref->fileLogDeleteOld()) {
|
||||
QDateTime date = QDateTime::currentDateTime();
|
||||
|
||||
switch (static_cast<FileLogAgeType>(pref->fileLogAgeType())) {
|
||||
case DAYS:
|
||||
date = date.addDays(pref->fileLogAge());
|
||||
break;
|
||||
case MONTHS:
|
||||
date = date.addMonths(pref->fileLogAge());
|
||||
break;
|
||||
default:
|
||||
date = date.addYears(pref->fileLogAge());
|
||||
}
|
||||
|
||||
foreach (const QFileInfo file, dir.entryInfoList(QStringList("qbittorrent.log.bak*"), QDir::Files | QDir::Writable, QDir::Time | QDir::Reversed)) {
|
||||
if (file.lastModified() < date)
|
||||
break;
|
||||
Utils::Fs::forceRemove(file.absoluteFilePath());
|
||||
}
|
||||
switch (ageType) {
|
||||
case DAYS:
|
||||
date = date.addDays(age);
|
||||
break;
|
||||
case MONTHS:
|
||||
date = date.addMonths(age);
|
||||
break;
|
||||
default:
|
||||
date = date.addYears(age);
|
||||
}
|
||||
|
||||
foreach (const QFileInfo file, dir.entryInfoList(QStringList("qbittorrent.log.bak*"), QDir::Files | QDir::Writable, QDir::Time | QDir::Reversed)) {
|
||||
if (file.lastModified() < date)
|
||||
break;
|
||||
Utils::Fs::forceRemove(file.absoluteFilePath());
|
||||
}
|
||||
}
|
||||
|
||||
void FileLogger::setBackup(bool value)
|
||||
{
|
||||
m_backup = value;
|
||||
}
|
||||
|
||||
void FileLogger::setMaxSize(int value)
|
||||
{
|
||||
m_maxSize = value;
|
||||
}
|
||||
|
||||
void FileLogger::addLogMessage(const Log::Msg &msg)
|
||||
@@ -133,7 +135,7 @@ void FileLogger::addLogMessage(const Log::Msg &msg)
|
||||
|
||||
str << QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString(Qt::ISODate) << " - " << msg.message << endl;
|
||||
|
||||
if (m_backup && (m_logFile->size() >= (m_size * 1024 * 1024))) {
|
||||
if (m_backup && (m_logFile->size() >= (m_maxSize * 1024 * 1024))) {
|
||||
closeLogFile();
|
||||
int counter = 0;
|
||||
QString backupLogFilename = m_path + ".bak";
|
||||
|
@@ -45,11 +45,22 @@ class FileLogger : public QObject
|
||||
Q_DISABLE_COPY(FileLogger)
|
||||
|
||||
public:
|
||||
FileLogger();
|
||||
enum FileLogAgeType
|
||||
{
|
||||
DAYS,
|
||||
MONTHS,
|
||||
YEARS
|
||||
};
|
||||
|
||||
FileLogger(const QString &path, const bool backup, const int maxSize, const bool deleteOld, const int age, const FileLogAgeType ageType);
|
||||
~FileLogger();
|
||||
|
||||
void changePath(const QString &newPath);
|
||||
void deleteOld(const int age, const FileLogAgeType ageType);
|
||||
void setBackup(bool value);
|
||||
void setMaxSize(int value);
|
||||
|
||||
private slots:
|
||||
void configure();
|
||||
void addLogMessage(const Log::Msg &msg);
|
||||
void flushLog();
|
||||
|
||||
@@ -57,9 +68,9 @@ private:
|
||||
void openLogFile();
|
||||
void closeLogFile();
|
||||
|
||||
bool m_backup;
|
||||
int m_size;
|
||||
QString m_path;
|
||||
bool m_backup;
|
||||
int m_maxSize;
|
||||
QFile *m_logFile;
|
||||
QTimer m_flusher;
|
||||
};
|
||||
|
@@ -1,3 +1,5 @@
|
||||
project(qtsingleapplication)
|
||||
|
||||
set(QBT_QTSINGLEAPPLICATION_HEADERS
|
||||
qtlocalpeer.h
|
||||
)
|
||||
@@ -15,6 +17,7 @@ else (GUI)
|
||||
endif (GUI)
|
||||
|
||||
add_library(qtsingleapplication ${QBT_QTSINGLEAPPLICATION_HEADERS} ${QBT_QTSINGLEAPPLICATION_SOURCES})
|
||||
target_include_directories(qtsingleapplication INTERFACE "${qtsingleapplication_SOURCE_DIR}")
|
||||
|
||||
if (QT4_FOUND)
|
||||
target_link_libraries(qtsingleapplication Qt4::QtNetwork)
|
||||
@@ -30,3 +33,4 @@ if (GUI)
|
||||
endif(QT4_FOUND)
|
||||
endif (GUI)
|
||||
|
||||
add_library(QtSingleApplication::QtSingleApplication ALIAS qtsingleapplication)
|
||||
|
@@ -25,6 +25,7 @@
|
||||
#include <dbghelp.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <QDir>
|
||||
#include <QTextStream>
|
||||
#ifdef __MINGW32__
|
||||
#include <cxxabi.h>
|
||||
@@ -41,6 +42,9 @@ namespace straceWin
|
||||
#ifdef __MINGW32__
|
||||
void demangle(QString& str);
|
||||
#endif
|
||||
|
||||
QString getSourcePathAndLineNumber(HANDLE hProcess, DWORD64 addr);
|
||||
bool makeRelativePath(const QString& dir, QString& file);
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
@@ -108,6 +112,65 @@ BOOL CALLBACK straceWin::EnumModulesCB(LPCSTR ModuleName, DWORD64 BaseOfDll, PVO
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Cuts off leading 'dir' path from 'file' path, otherwise leaves it unchanged
|
||||
* returns true if 'dir' is an ancestor of 'file', otherwise - false
|
||||
*/
|
||||
bool straceWin::makeRelativePath(const QString& dir, QString& file)
|
||||
{
|
||||
QString d = QDir::toNativeSeparators(QDir(dir).absolutePath());
|
||||
QString f = QDir::toNativeSeparators(QFileInfo(file).absoluteFilePath());
|
||||
|
||||
// append separator at the end of dir
|
||||
QChar separator = QDir::separator();
|
||||
if (!d.isEmpty() && (d[d.length() - 1] != separator))
|
||||
d += separator;
|
||||
|
||||
if (f.startsWith(d, Qt::CaseInsensitive)) {
|
||||
f.remove(0, d.length());
|
||||
file.swap(f);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
QString straceWin::getSourcePathAndLineNumber(HANDLE hProcess, DWORD64 addr)
|
||||
{
|
||||
IMAGEHLP_LINE64 line = {0};
|
||||
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
|
||||
DWORD dwDisplacement = 0;
|
||||
|
||||
if (SymGetLineFromAddr64(hProcess, addr, &dwDisplacement, &line)) {
|
||||
QString path(line.FileName);
|
||||
|
||||
#if defined STACKTRACE_WIN_PROJECT_PATH || defined STACKTRACE_WIN_MAKEFILE_PATH
|
||||
|
||||
#define STACKTRACE_WIN_QUOTE(x) #x
|
||||
#define STACKTRACE_WIN_STRING(x) STACKTRACE_WIN_QUOTE(x)
|
||||
|
||||
//prune leading project directory path or build target directory path
|
||||
|
||||
bool success = false;
|
||||
#ifdef STACKTRACE_WIN_PROJECT_PATH
|
||||
QString projectPath(STACKTRACE_WIN_STRING(STACKTRACE_WIN_PROJECT_PATH));
|
||||
success = makeRelativePath(projectPath, path);
|
||||
#endif
|
||||
|
||||
#ifdef STACKTRACE_WIN_MAKEFILE_PATH
|
||||
if (!success) {
|
||||
QString targetPath(STACKTRACE_WIN_STRING(STACKTRACE_WIN_MAKEFILE_PATH));
|
||||
makeRelativePath(targetPath, path);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return QString("%1 : %2").arg(path).arg(line.LineNumber);
|
||||
}
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
|
||||
#if defined( _M_IX86 ) && defined(Q_CC_MSVC)
|
||||
// Disable global optimization and ignore /GS waning caused by
|
||||
@@ -221,11 +284,16 @@ const QString straceWin::getBacktrace()
|
||||
fileName = fileName.mid(slashPos + 1);
|
||||
}
|
||||
QString funcName;
|
||||
QString sourceFile;
|
||||
if(SymFromAddr(hProcess, ihsf.InstructionOffset, &dwDisplacement, pSymbol)) {
|
||||
funcName = QString(pSymbol->Name);
|
||||
#ifdef __MINGW32__
|
||||
demangle(funcName);
|
||||
#endif
|
||||
|
||||
// now ihsf.InstructionOffset points to the instruction that follows CALL instuction
|
||||
// decrease the query address by one byte to point somewhere in the CALL instruction byte sequence
|
||||
sourceFile = getSourcePathAndLineNumber(hProcess, ihsf.InstructionOffset - 1);
|
||||
}
|
||||
else {
|
||||
funcName = QString("0x%1").arg(ihsf.InstructionOffset, 8, 16, QLatin1Char('0'));
|
||||
@@ -248,6 +316,9 @@ const QString straceWin::getBacktrace()
|
||||
.arg(funcName)
|
||||
#ifndef __MINGW32__
|
||||
.arg(params.join(", "));
|
||||
|
||||
if (!sourceFile.isEmpty())
|
||||
debugLine += QString("[ %1 ]").arg(sourceFile);
|
||||
#else
|
||||
;
|
||||
#endif
|
||||
@@ -262,6 +333,8 @@ const QString straceWin::getBacktrace()
|
||||
//logStream << "\n\nList of linked Modules:\n";
|
||||
//EnumModulesContext modulesContext(hProcess, logStream);
|
||||
//SymEnumerateModules64(hProcess, EnumModulesCB, (PVOID)&modulesContext);
|
||||
SymCleanup(hProcess);
|
||||
|
||||
logStream << "```";
|
||||
return log;
|
||||
}
|
||||
|
@@ -129,8 +129,8 @@ bool upgradeResumeFile(const QString &filepath, const QVariantHash &oldTorrent =
|
||||
|
||||
bool upgrade(bool ask = true)
|
||||
{
|
||||
// Move RSS cookies to common storage
|
||||
Preferences::instance()->moveRSSCookies();
|
||||
// Upgrade preferences
|
||||
Preferences::instance()->upgrade();
|
||||
|
||||
QString backupFolderPath = Utils::Fs::expandPathAbs(Utils::Fs::QDesktopServicesDataLocation() + "BT_backup");
|
||||
QDir backupFolderDir(backupFolderPath);
|
||||
|
@@ -1,5 +1,4 @@
|
||||
find_package(ZLIB REQUIRED)
|
||||
include_directories(SYSTEM ${ZLIB_INCLUDE_DIRS})
|
||||
|
||||
set(QBT_BASE_HEADERS
|
||||
bittorrent/cachestatus.h
|
||||
@@ -47,12 +46,14 @@ utils/misc.h
|
||||
utils/string.h
|
||||
filesystemwatcher.h
|
||||
iconprovider.h
|
||||
indexrange.h
|
||||
logger.h
|
||||
preferences.h
|
||||
qinisettings.h
|
||||
scanfoldersmodel.h
|
||||
searchengine.h
|
||||
settingsstorage.h
|
||||
torrentfileguard.h
|
||||
torrentfilter.h
|
||||
tristatebool.h
|
||||
types.h
|
||||
@@ -108,12 +109,13 @@ preferences.cpp
|
||||
scanfoldersmodel.cpp
|
||||
searchengine.cpp
|
||||
settingsstorage.cpp
|
||||
torrentfileguard.cpp
|
||||
torrentfilter.cpp
|
||||
tristatebool.cpp
|
||||
)
|
||||
|
||||
add_library(qbt_base STATIC ${QBT_BASE_HEADERS} ${QBT_BASE_SOURCES})
|
||||
target_link_libraries(qbt_base ${ZLIB_LIBRARIES} ${LibtorrentRasterbar_LIBRARIES})
|
||||
target_link_libraries(qbt_base ZLIB::ZLIB LibtorrentRasterbar::LibTorrent)
|
||||
target_link_qt_components(qbt_base Core Network Xml)
|
||||
if (QT4_FOUND)
|
||||
if (GUI)
|
||||
@@ -124,6 +126,11 @@ else (QT4_FOUND)
|
||||
target_link_libraries(qbt_base Qt5::Gui Qt5::Widgets)
|
||||
endif (GUI)
|
||||
endif (QT4_FOUND)
|
||||
|
||||
if (DBUS)
|
||||
target_link_qt_components(qbt_base DBus)
|
||||
endif ()
|
||||
|
||||
if (APPLE)
|
||||
find_library(IOKit_LIBRARY IOKit)
|
||||
find_library(Carbon_LIBRARY Carbon)
|
||||
|
@@ -4,7 +4,9 @@ HEADERS += \
|
||||
$$PWD/filesystemwatcher.h \
|
||||
$$PWD/qinisettings.h \
|
||||
$$PWD/logger.h \
|
||||
$$PWD/settingsstorage.h \
|
||||
$$PWD/preferences.h \
|
||||
$$PWD/indexrange.h \
|
||||
$$PWD/iconprovider.h \
|
||||
$$PWD/http/irequesthandler.h \
|
||||
$$PWD/http/connection.h \
|
||||
@@ -50,6 +52,7 @@ HEADERS += \
|
||||
$$PWD/utils/misc.h \
|
||||
$$PWD/utils/string.h \
|
||||
$$PWD/unicodestrings.h \
|
||||
$$PWD/torrentfileguard.h \
|
||||
$$PWD/torrentfilter.h \
|
||||
$$PWD/scanfoldersmodel.h \
|
||||
$$PWD/searchengine.h
|
||||
@@ -58,6 +61,7 @@ SOURCES += \
|
||||
$$PWD/tristatebool.cpp \
|
||||
$$PWD/filesystemwatcher.cpp \
|
||||
$$PWD/logger.cpp \
|
||||
$$PWD/settingsstorage.cpp \
|
||||
$$PWD/preferences.cpp \
|
||||
$$PWD/iconprovider.cpp \
|
||||
$$PWD/http/connection.cpp \
|
||||
@@ -101,6 +105,7 @@ SOURCES += \
|
||||
$$PWD/utils/gzip.cpp \
|
||||
$$PWD/utils/misc.cpp \
|
||||
$$PWD/utils/string.cpp \
|
||||
$$PWD/torrentfileguard.cpp \
|
||||
$$PWD/torrentfilter.cpp \
|
||||
$$PWD/scanfoldersmodel.cpp \
|
||||
$$PWD/searchengine.cpp
|
||||
|
@@ -68,7 +68,6 @@ bool InfoHash::isValid() const
|
||||
return m_valid;
|
||||
}
|
||||
|
||||
|
||||
InfoHash::operator libtorrent::sha1_hash() const
|
||||
{
|
||||
return m_nativeHash;
|
||||
|
@@ -401,7 +401,30 @@ void FilterParserThread::processFilterList(libt::session *s, const QStringList &
|
||||
|
||||
QString FilterParserThread::cleanupIPAddress(QString _ip)
|
||||
{
|
||||
QHostAddress ip(_ip.trimmed());
|
||||
_ip = _ip.trimmed();
|
||||
|
||||
// Emule .DAT files contain leading zeroes in IPv4 addresses
|
||||
// eg 001.009.106.186
|
||||
// We need to remove them because both QHostAddress and Boost.Asio fail to parse them.
|
||||
QStringList octets = _ip.split('.', QString::SkipEmptyParts);
|
||||
if (octets.size() == 4) {
|
||||
QString octet; // it is faster to not recreate this object in the loop
|
||||
for (int i = 0; i < 4; i++) {
|
||||
octet = octets[i];
|
||||
if ((octet[0] == QChar('0')) && (octet.count() > 1)) {
|
||||
if ((octet[1] == QChar('0')) && (octet.count() > 2))
|
||||
octet.remove(0, 2);
|
||||
else
|
||||
octet.remove(0, 1);
|
||||
|
||||
octets[i] = octet;
|
||||
}
|
||||
}
|
||||
|
||||
_ip = octets.join(".");
|
||||
}
|
||||
|
||||
QHostAddress ip(_ip);
|
||||
if (ip.isNull()) return QString();
|
||||
|
||||
return ip.toString();
|
||||
|
@@ -27,17 +27,21 @@
|
||||
* exception statement from your version.
|
||||
*/
|
||||
|
||||
#include <QList>
|
||||
#include "speedmonitor.h"
|
||||
|
||||
SpeedMonitor::SpeedMonitor()
|
||||
: m_speedSamples(MAX_SAMPLES)
|
||||
{
|
||||
}
|
||||
|
||||
void SpeedMonitor::addSample(const SpeedSample &sample)
|
||||
{
|
||||
if (m_speedSamples.size() >= MAX_SAMPLES) {
|
||||
m_sum -= m_speedSamples.front();
|
||||
}
|
||||
|
||||
m_speedSamples.push_back(sample);
|
||||
m_sum += sample;
|
||||
if (m_speedSamples.size() > MAX_SAMPLES) {
|
||||
m_sum -= m_speedSamples.front();
|
||||
m_speedSamples.pop_front();
|
||||
}
|
||||
}
|
||||
|
||||
SpeedSampleAvg SpeedMonitor::average() const
|
||||
|
@@ -30,7 +30,11 @@
|
||||
#ifndef SPEEDMONITOR_H
|
||||
#define SPEEDMONITOR_H
|
||||
|
||||
template<typename T> class QList;
|
||||
#ifndef Q_MOC_RUN
|
||||
#include <boost/circular_buffer.hpp>
|
||||
#endif
|
||||
|
||||
#include <QtGlobal>
|
||||
|
||||
template<typename T>
|
||||
struct Sample
|
||||
@@ -71,13 +75,15 @@ typedef Sample<qreal> SpeedSampleAvg;
|
||||
class SpeedMonitor
|
||||
{
|
||||
public:
|
||||
SpeedMonitor();
|
||||
|
||||
void addSample(const SpeedSample &sample);
|
||||
SpeedSampleAvg average() const;
|
||||
void reset();
|
||||
|
||||
private:
|
||||
static const int MAX_SAMPLES = 30;
|
||||
QList<SpeedSample> m_speedSamples;
|
||||
boost::circular_buffer<SpeedSample> m_speedSamples;
|
||||
SpeedSample m_sum;
|
||||
};
|
||||
|
||||
|
@@ -3,7 +3,6 @@
|
||||
#include <libtorrent/session.hpp>
|
||||
|
||||
#include "base/qinisettings.h"
|
||||
#include "base/preferences.h"
|
||||
#include "base/bittorrent/sessionstatus.h"
|
||||
#include "base/bittorrent/session.h"
|
||||
#include "statistics.h"
|
||||
@@ -76,40 +75,9 @@ void Statistics::save() const
|
||||
|
||||
void Statistics::load()
|
||||
{
|
||||
// Temp code. Versions v3.1.4 and v3.1.5 saved the data in the qbittorrent.ini file.
|
||||
// This code reads the data from there, writes it to the new file, and removes the keys
|
||||
// from the old file. This code should be removed after some time has passed.
|
||||
// e.g. When we reach v3.3.0
|
||||
// Don't forget to remove:
|
||||
// 1. Preferences::getStats()
|
||||
// 2. Preferences::removeStats()
|
||||
// 3. #include "base/preferences.h"
|
||||
Preferences* const pref = Preferences::instance();
|
||||
QIniSettings s("qBittorrent", "qBittorrent-data");
|
||||
QVariantHash v = pref->getStats();
|
||||
|
||||
// Let's test if the qbittorrent.ini holds the key
|
||||
if (!v.isEmpty()) {
|
||||
m_dirty = true;
|
||||
|
||||
// If the user has used qbt > 3.1.5 and then reinstalled/used
|
||||
// qbt < 3.1.6, there will be stats in qbittorrent-data.ini too
|
||||
// so we need to merge those 2.
|
||||
if (s.contains("Stats/AllStats")) {
|
||||
QVariantHash tmp = s.value("Stats/AllStats").toHash();
|
||||
v["AlltimeDL"] = v["AlltimeDL"].toULongLong() + tmp["AlltimeDL"].toULongLong();
|
||||
v["AlltimeUL"] = v["AlltimeUL"].toULongLong() + tmp["AlltimeUL"].toULongLong();
|
||||
}
|
||||
}
|
||||
else {
|
||||
v = s.value("Stats/AllStats").toHash();
|
||||
}
|
||||
QVariantHash v = s.value("Stats/AllStats").toHash();
|
||||
|
||||
m_alltimeDL = v["AlltimeDL"].toULongLong();
|
||||
m_alltimeUL = v["AlltimeUL"].toULongLong();
|
||||
|
||||
if (m_dirty) {
|
||||
save();
|
||||
pref->removeStats();
|
||||
}
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user