1
mirror of https://github.com/qbittorrent/qBittorrent synced 2025-10-09 18:32:15 +02:00

Compare commits

..

49 Commits

Author SHA1 Message Date
Christophe Dumez
eda04b3ef3 Bump version to v2.9.5 2012-02-19 20:55:58 +02:00
Christophe Dumez
3ef6e7bf65 Update Changelog 2012-02-19 20:39:58 +02:00
Christophe Dumez
146cf9a435 Several RSS fixes:
- Fix possible redownload of torrents marked as read (Closes #927495)
- Properly remove RSS feed settings/history upon feed removal
- Fix possible crash in RSS Downloader dialog in debug mode
2012-02-19 20:36:01 +02:00
Christophe Dumez
dff6b057b9 Update Changelog 2012-02-19 20:00:42 +02:00
Christophe Dumez
3b7448dfc7 Fix import of new trackers when adding a torrent with same hash (Closes #747000) 2012-02-19 19:59:23 +02:00
Christophe Dumez
4e4ac771a9 Fix duplicate torrent detection when adding a magnet link 2012-02-19 19:49:57 +02:00
Christophe Dumez
06a376d014 BUGFIX: Fix crash when disabling then reenabling RSS 2012-02-19 18:55:34 +02:00
Christophe Dumez
b3d2f9b701 Update Github for search plugin updates 2012-02-18 21:17:10 +02:00
Christophe Dumez
055a99239b Bump version to v2.9.4 2012-02-18 20:45:27 +02:00
Christophe Dumez
e779c9a7db Update Changelog 2012-02-18 20:42:17 +02:00
Christophe Dumez
b0f7f5ae58 Prevent log window buffer from filling up (Closes #929673) 2012-02-18 20:41:00 +02:00
Christophe Dumez
512ab58832 Update Changelog 2012-02-18 20:24:37 +02:00
Christophe Dumez
9ad088682c Fix torrent import dialog layout (Closes #930932) 2012-02-18 20:22:39 +02:00
Christophe Dumez
d2fad8249c Updated Changelog 2012-02-18 20:09:23 +02:00
Christophe Dumez
20fb7c3adf Add Cmd+Delete shortcut to delete a torrent (Mac OS X) 2012-02-18 20:07:10 +02:00
Christophe Dumez
c4fdfec420 Update Changelog 2012-02-15 21:15:42 +02:00
Christophe Dumez
a3e03e739c Fix potential bug when moving single file torrents to tmp folder (closes #932861) 2012-02-15 21:15:18 +02:00
Christophe Dumez
9846dc0fff Update Changelog 2012-02-07 19:51:04 +02:00
Christophe Dumez
1b29b148d8 Cmd+M minimizes main window on Mac OS X (Closes #928216)
(cherry picked from commit dd7e515f9c)
2012-02-07 19:50:25 +02:00
Christophe Dumez
6dab35cb8e Fixes to Belarusian translation 2012-02-02 20:45:51 +02:00
Christophe Dumez
6b2d922005 Update Changelog 2012-01-31 19:29:57 +02:00
Christophe Dumez
1d92ae6382 Add Belarusian translation by Mihas Varantsou 2012-01-31 19:28:40 +02:00
Christophe Dumez
62f4d6386a Update Changelog 2012-01-30 19:44:34 +02:00
Christophe Dumez
e74ef4c6fd Bug #919905: qBittorrent does not handle redirection to relative URLs correctly
Thanks to luran for providing a first version of this patch.
2012-01-30 19:43:16 +02:00
Christophe Dumez
282ee0e879 Fix tarball generated by make dist 2011-12-29 23:42:05 +02:00
Christophe Dumez
697d2ccb71 Update changelog 2011-12-29 14:56:36 +02:00
Christophe Dumez
71d163d743 Program updater: More reliable version detection / comparison
(cherry picked from commit c0eb048fe2)
2011-12-29 01:27:36 +02:00
Christophe Dumez
83685942de Web UI: Improve usability of small devices
(cherry picked from commit 78bb4104b0)
2011-12-29 00:26:04 +02:00
Christophe Dumez
6f34c81014 Make torrent sorting case insensitive (Closes #857154)
(cherry picked from commit 6c10936f6d)
2011-12-28 23:33:39 +02:00
Christophe Dumez
5e826dffc8 Bump version to v2.9.3 2011-12-28 14:41:02 +02:00
Christophe Dumez
b4dc66020c Do not report any progress for disabled files (Closes #56731485)
(cherry picked from commit 4ca665eb0c)
2011-12-28 14:40:24 +02:00
Christophe Dumez
cb4741ed89 Mac OS X: Tweak project file to fix compilation errors
(cherry picked from commit 39e1ebaa9b)
2011-12-28 14:39:28 +02:00
Christophe Dumez
4c3976e5df Fix torrent addition dialog layout problem (Closes #84650522)
(cherry picked from commit 0a0033b242)
2011-12-28 11:53:16 +02:00
Christophe Dumez
fd7fb115ff Fix banning of IPv6 peers
(cherry picked from commit 9eea35f530)
2011-12-28 11:34:07 +02:00
Christophe Dumez
197d5b3a05 I18N: Add Georgian translation
(cherry picked from commit 26b8decb24)
2011-12-27 13:32:46 +02:00
Christophe Dumez
624d6aa6a1 Update Changelog 2011-12-13 18:53:13 +02:00
btdigg research
28d7dc137b btdigg: Python3 support and add torrent in magnet link
(cherry picked from commit a275e26ba7)
2011-12-13 18:48:41 +02:00
Christophe Dumez
351d84e2f7 misc.cpp: Fix compilation on Mac OS X
(cherry picked from commit 96c918ff8d)
2011-11-16 21:57:06 +02:00
Christophe Dumez
774b8f4fd6 Bump to v2.9.2 2011-10-29 10:38:03 +03:00
Christophe Dumez
2fc6470696 Torrent addition dialog: Fix minimum dialog size
(cherry picked from commit 2283bd2358)
2011-10-29 10:36:03 +03:00
Christophe Dumez
1038b00553 Get rid of libboost-filesystem dependency if libtorrent >= v0.16.x is used
(cherry picked from commit f6b7b8bd6e)
2011-10-25 20:57:39 +03:00
Christophe Dumez
c3b37b4f1f Bump to v2.9.1 2011-10-23 10:38:37 +03:00
Christophe Dumez
41faf341cc Web UI: Add support for speed limits scheduling
(cherry picked from commit 1b8a2bf7c1)
2011-10-19 19:56:39 +03:00
Christophe Dumez
44e92a7f3d Update DHT bootstrap nodes
(cherry picked from commit 33325cdfee)
2011-10-16 11:31:12 +03:00
Christophe Dumez
599f956269 Torrent addition dialog: Layout fixes
(cherry picked from commit d81f633d6b)
2011-10-16 10:08:09 +03:00
Christophe Dumez
79a9606e86 Fix ratio calculation for purely seeded torrents
(cherry picked from commit 422b483d78)
2011-10-16 09:43:07 +03:00
Christophe Dumez
5b576baf67 Update Russian translation 2011-10-10 20:23:42 +03:00
Christophe Dumez
aa3ce90478 Completly disable Windows cache
(cherry picked from commit 74081bc6f8)
2011-10-08 13:37:04 +03:00
Christophe Dumez
2c433e35b0 Revert "Use %USERPROFILE%\Downloads as download folder on Windows"
This reverts commit 357e309dad.
2011-10-08 13:35:25 +03:00
290 changed files with 31998 additions and 50566 deletions

View File

@@ -74,7 +74,6 @@ Translations authors:
copyright: copyright:
- Arabic: SDERAWI (abz8868@msn.com) and sn51234 (nesseyan@gmail.com) - Arabic: SDERAWI (abz8868@msn.com) and sn51234 (nesseyan@gmail.com)
- Armenian: Hrant Ohanyan (hrantohanyan@mail.am) - Armenian: Hrant Ohanyan (hrantohanyan@mail.am)
- Basque: Xabier Aramendi (azpidatziak@gmail.com)
- Belarusian: Mihas Varantsou (meequz@gmail.com) - Belarusian: Mihas Varantsou (meequz@gmail.com)
- Brazilian: Nick Marinho (nickmarinho@gmail.com) - Brazilian: Nick Marinho (nickmarinho@gmail.com)
- Bulgarian: Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net) - Bulgarian: Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)
@@ -92,9 +91,8 @@ Translations authors:
- Georgian: Beqa Arabuli (arabulibeqa@yahoo.com) - Georgian: Beqa Arabuli (arabulibeqa@yahoo.com)
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net) - German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
- Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) and Stephanos Antaris (santaris@csd.auth.gr) - Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) and Stephanos Antaris (santaris@csd.auth.gr)
- Hebrew: David Deutsch (d.deffo@gmail.com)
- Hungarian: Majoros Péter (majoros.j.p@t-online.hu) - Hungarian: Majoros Péter (majoros.j.p@t-online.hu)
- Italian: bovirus (bovirus@live.it) and Matteo Sechi (bu17714@gmail.com) - Italian: Matteo Sechi (bu17714@gmail.com)
- Japanese: Masato Hashimoto (cabezon.hashimoto@gmail.com) - Japanese: Masato Hashimoto (cabezon.hashimoto@gmail.com)
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net) - Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
- Lithuanian: Naglis Jonaitis (njonaitis@gmail.com) - Lithuanian: Naglis Jonaitis (njonaitis@gmail.com)
@@ -108,5 +106,5 @@ Translations authors:
- Spanish: Francisco Luque Contreras (frannoe@ya.com) - Spanish: Francisco Luque Contreras (frannoe@ya.com)
- Swedish: Daniel Nylander (po@danielnylander.se) - Swedish: Daniel Nylander (po@danielnylander.se)
- Turkish: Hasan Yilmaz (iletisim@hedefturkce.com) - Turkish: Hasan Yilmaz (iletisim@hedefturkce.com)
- Ukrainian: Oleh Prypin (blaxpirit@gmail.com) - Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net) and Oleh Prypin (blaxpirit@gmail.com)
license: GPLv2 license: GPLv2

View File

@@ -1,48 +1,39 @@
* Sun Sep 30 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.5 * Sat Feb 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.5
- BUGFIX: Disabling systray icon no longer disables file association settings (closes #114) - BUGFIX: Fix crash when disabling then reenabling RSS
- BUGFIX: Import new trackers from magnet link in case of duplicate torrent (closes #111) - BUGFIX: Fix duplicate torrent detection when adding a magnet link
- BUGFIX: Fix "Skip hash check" feature in torrent import dialog (closes #128) - BUGFIX: Fix import of new trackers when adding a torrent with same hash (Closes #747000)
- BUGFIX: Several Web UI connection fixes - BUGFIX: Fix possible redownload of torrents marked as read (Closes #927495)
- BUGFIX: Add Basque locale to Web UI - BUGFIX: Properly remove RSS feed settings/history upon feed removal
* Tue Sep 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.4 * Sat Feb 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.4
- BUGFIX: Fix issue with downloads starting from scratch on startup if temporary - BUGFIX: qBittorrent does not handle redirection to relative URLs correctly (Closes #919905)
directory setting is enabled. - BUGFIX: Cmd+M minimizes main window on Mac OS X (Closes #928216)
- BUGFIX: Cmd+Del removes torrents on Mac OS X (Closes #928852)
- BUGFIX: Fix potential bug when moving single file torrents to tmp folder (closes #932861)
- BUGFIX: Fix torrent import dialog layout (Closes #930932)
- BUGFIX: Prevent log window buffer from filling up (Closes #929673)
- I18N: Add Belarusian translation
* Sun Sep 16 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.3 * Thu Dec 29 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.3
- BUGFIX: Fix issue with temporary directory not being taken into consideration (closes #94) - BUGFIX: Fix btdigg plugin (Python3 support + torrent name in magnet links)
- BUGFIX: Address encoding issues when using search engine on Windows (closes #29) - BUGFIX: Fix banning of IPv6 peers (Closes #885021)
- BUGFIX: Bypass cache when uploading a torrent file in Web UI (closes #68) - BUGFIX: Fix torrent addition dialog layout problem (Closes #84650522)
- BUGFIX: "Completed On" column is not updated until restart (closes #84) - BUGFIX: Do not report any progress for disabled files (Closes #56731485)
- BUGFIX: Fix possible build error on some systems - BUGFIX: Make torrent sorting case insensitive (Closes #857154)
- I18N: Add hebrew translation - BUGFIX: Improve Web UI usability of small devices
- BUGFIX: Program updater: More reliable version detection / comparison
- I18N: Add Georgian translation
* Sat Sep 1 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.2 * Sat Oct 29 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.2
- FEATURE: Add "clear" functionality to search field (closes #59) - BUGFIX: Fix mimimum dimensions for torrent addition dialog
- BUGFIX: Attempt to use qBittorrent icon from theme if available (closes #49) - BUGFIX: Remove dependency on boost-datetime
- BUGFIX: Fix crash when a fastresume file is empty (closes #52) - BUGFIX: Remove dependency on boost-filesystem (libtorrent v0.16.x)
- BUGFIX: Fix encoding problem for detected XDG Download folder (closes #53)
- BUGFIX: Improve performance when showing torrent content panel (Improves #24)
- BUGFIX: Fix label-based filtering of torrents whose label contains special characters
- BUGFIX: Fix possible crash due to labels (closes #64)
* Tue Aug 21 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.1 * Sun Oct 23 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.1
- BUGFIX: Fix possible crash when adding a tracker to a magnet torrent without metadata (Closes #1034254) - BUGFIX: Add support for speed limits scheduling (Web UI)
- BUGFIX: Remember queue position for torrents without metadata (closes #17) - BUGFIX: Fix ratio calculation for purely seeded torrents
- BUGFIX: Fix crash when using unauthorized characters in label names (closes #19) - I18N: Update Russian translation
- BUGFIX: Fix search plugins updating (closes #25) - COSMETIC: Torrent addition dialog layout fixes
- BUGFIX: Make uTP connections rate limited by default
* Thu Aug 09 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.0
- FEATURE: Brand new torrent addition dialog
- FEATURE: Add the ability to choose the save path when using magnet links (mutoso)
- FEATURE: Add support for adding multiple local torrents at once (Web UI)
- COSMETIC: Improve style of left panel
- BUGFIX: Lower panels no longer gets disabled
- BUGFIX: Major code refactoring and various optimizations.
- BUGFIX: No longer strip root folder from torrent files
- OTHER: Drop support for libtorrent v0.14.x
- OTHER: Drop support for Qt 4.5
* Sat Oct 08 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.0 * Sat Oct 08 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.0
- FEATURE: Add file association settings to program preferences (Windows) - FEATURE: Add file association settings to program preferences (Windows)

View File

@@ -10,11 +10,11 @@ qBittorrent - A BitTorrent client in C++ / Qt4
will install and execute qBittorrent hopefully without any problems. will install and execute qBittorrent hopefully without any problems.
Dependencies: Dependencies:
- Qt >= 4.6.0 (libqtgui, libqtcore, libqtnetwork, libqtxml, libqtdbus/optional) - Qt >= 4.5.0 (libqtgui, libqtcore, libqtnetwork, libqtxml, libqtdbus/optional)
- pkg-config executable - pkg-config executable
- libtorrent-rasterbar by Arvid Norberg (>= 0.15.0) - libtorrent-rasterbar by Arvid Norberg (>= 0.14.4 REQUIRED, compatible with v0.15.x/v0.16.x)
-> http://www.libtorrent.net -> http://www.libtorrent.net
Be careful: another library (the one used by rTorrent) uses a similar name. Be careful: another library (the one used by rTorrent) uses a similar name.
@@ -44,7 +44,7 @@ qBittorrent - A BitTorrent client in C++ / Qt4
- pkg-config executable - pkg-config executable
- libtorrent-rasterbar by Arvid Norberg (>= v0.15.0) - libtorrent-rasterbar by Arvid Norberg (>= 0.14.4 REQUIRED, >= v0.15.0 ADVISED)
-> http://www.libtorrent.net -> http://www.libtorrent.net
Be careful: another library (the one used by rTorrent) uses a similar name. Be careful: another library (the one used by rTorrent) uses a similar name.

View File

@@ -27,6 +27,7 @@ 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: the conf.pri file has the following content:
##### conf.pri content beginn ##### ##### conf.pri content beginn #####
PREFIX = .
BINDIR = ./bin BINDIR = ./bin
INCDIR = ./include INCDIR = ./include
LIBDIR = ./lib LIBDIR = ./lib
@@ -42,10 +43,7 @@ LIBS += -Lx:/trees/libtorrent/trunk/src/.libs \
Of course all the above path references have to be adjusted to your build env. 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 It should now be easy to build qBittorrent:
advantage that no created files are in the same dir as the sources are.
For a normal build do the following:
Simply type: Simply type:
$ qmake $ qmake
@@ -53,16 +51,6 @@ $ qmake
Followed by: Followed by:
$ make $ 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 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: If you have any question regarding the eCS (OS/2) port of qBittorrent you can meet me (_diver) on IRC:

13
configure vendored
View File

@@ -325,7 +325,7 @@ cat >$1/modules.cpp <<EOT
#line 1 "qt4.qcm" #line 1 "qt4.qcm"
/* /*
-----BEGIN QCMOD----- -----BEGIN QCMOD-----
name: Qt >= 4.6 name: Qt >= 4.5
arg: enable-debug, Enable debug mode arg: enable-debug, Enable debug mode
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
-----END QCMOD----- -----END QCMOD-----
@@ -334,8 +334,8 @@ class qc_qt4 : public ConfObj
{ {
public: public:
qc_qt4(Conf *c) : ConfObj(c) {} qc_qt4(Conf *c) : ConfObj(c) {}
QString name() const { return "Qt >= 4.6"; } QString name() const { return "Qt >= 4.5"; }
QString shortname() const { return "Qt 4.6"; } QString shortname() const { return "Qt 4.5"; }
bool exec() bool exec()
{ {
// NOX mode // NOX mode
@@ -356,7 +356,7 @@ public:
#else #else
conf->addExtra("MANPREFIX = \$\$PREFIX/share"); conf->addExtra("MANPREFIX = \$\$PREFIX/share");
#endif #endif
return(QT_VERSION >= 0x040600); return(QT_VERSION >= 0x040500);
} }
}; };
#line 1 "qt-dbus.qcm" #line 1 "qt-dbus.qcm"
@@ -419,11 +419,11 @@ class qc_libtorrent_rasterbar : public ConfObj
{ {
public: public:
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {} qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
QString name() const { return "libtorrent-rasterbar >= 0.15.0"; } QString name() const { return "libtorrent-rasterbar >= 0.14.4"; }
QString shortname() const { return "libtorrent-rasterbar"; } QString shortname() const { return "libtorrent-rasterbar"; }
bool exec(){ bool exec(){
QStringList incs; QStringList incs;
QString req_ver = "0.15.0"; QString req_ver = "0.14.4";
QString version, libs, other; QString version, libs, other;
VersionMode mode = VersionMin; VersionMode mode = VersionMin;
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other)) if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
@@ -507,7 +507,6 @@ public:
#if LIBTORRENT_VERSION_MAJOR == 0 && LIBTORRENT_VERSION_MINOR < 16 #if LIBTORRENT_VERSION_MAJOR == 0 && LIBTORRENT_VERSION_MINOR < 16
required_libs << "filesystem" ; required_libs << "filesystem" ;
#endif #endif
required_libs << "thread";
QStringList libDirs; QStringList libDirs;
if (!s.isEmpty()) if (!s.isEmpty())
libDirs << s; libDirs << s;

View File

@@ -11,7 +11,7 @@ QBittorrent installation
3. INSTALLATION 3. INSTALLATION
4. BUGREPORTS 4. CONTACT
5. CREDITS 5. CREDITS
@@ -29,70 +29,17 @@ Welcome to QBittorrent port for OS/2 and eComStation.
2. REQUIREMENTS 2. REQUIREMENTS
=============== ===============
The following requirements can be installed either by rpm or by zip files. * klibc 0.6.3 or later
RPM Installation: ftp://ftp.netlabs.org/pub/gcc/libc-0_6_3-csd3.wpi
klibc * openssl 1.0
-----
ftp://ftp.netlabs.org/pub/unixos2/ssl10.zip
1. yum install libc * Qt4 dll
openssl 1.0 see http://svn.netlabs.org/qt4 for more information whats needed and where to get the latest
-----------
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 3. INSTALLATION
@@ -100,6 +47,30 @@ Qt4 dll
To install QBittorrent, do the following: To install QBittorrent, do the following:
klibc
-----
1. Download klibc 0.6.3 csd3 or later.
2. Install the package by double-clicking on the WPI file.
openssl 1.0
-----------
1. Download the zip file
2. Install the files to your libpath eg. x:\ecs\dll
Qt4 dll
-------
1. Download the package
2. Install the package by double-clicking on the wpi file.
QBittorrent
-----------
1. Create a directory for QBittorrent. 1. Create a directory for QBittorrent.
2. Extract the QBittorrent package to the new directory. 2. Extract the QBittorrent package to the new directory.
3. Create a WPS object for QBittorrent.exe. 3. Create a WPS object for QBittorrent.exe.
@@ -107,13 +78,18 @@ To install QBittorrent, do the following:
5. Happy torrenting 5. Happy torrenting
4. BUGREPORTS
=============
Please create bugreports at http://svn.netlabs.org/qtapps 4. CONTACT
==========
Please send bugreports to:
ecs@aroa.ch
Only bug reports with a reproducable bug are accepted. :-) Only bug reports with a reproducable bug are accepted. :-)
5. CREDITS 5. CREDITS
========== ==========
@@ -146,33 +122,6 @@ development, you can do so in one of the following ways:
7. HISTORY 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 2010-12-23
* updated to 2.5.2 code level of QBittorrent * updated to 2.5.2 code level of QBittorrent

View File

@@ -5,7 +5,6 @@ DATADIR = /usr/local/share
# Use pkg-config to get all necessary libtorrent DEFINES # Use pkg-config to get all necessary libtorrent DEFINES
CONFIG += link_pkgconfig CONFIG += link_pkgconfig
PKGCONFIG += libtorrent-rasterbar PKGCONFIG += libtorrent-rasterbar
DEFINES += BOOST_ASIO_DYN_LINK
# Special include/libs paths (macports) # Special include/libs paths (macports)
INCLUDEPATH += /usr/include/openssl /usr/include /opt/local/include/boost /opt/local/include INCLUDEPATH += /usr/include/openssl /usr/include /opt/local/include/boost /opt/local/include
@@ -16,50 +15,16 @@ LIBS += -lssl -lcrypto
# Boost system lib # Boost system lib
LIBS += -lboost_system-mt LIBS += -lboost_system-mt
# Boost filesystem lib (Not needed for libtorrent >= 0.16.0) # Boost filesystem lib (Not needed for libtorrent >= 0.16.0)
#LIBS += -lboost_filesystem-mt LIBS += -lboost_filesystem-mt
# Carbon # Carbon
LIBS += -framework Carbon -framework IOKit LIBS += -framework Carbon -framework IOKit
document_icon.path = Contents/Resources document_icon.path = Contents/Resources
document_icon.files = mac/qBitTorrentDocument.icns document_icon.files = Icons/qBitTorrentDocument.icns
QMAKE_BUNDLE_DATA += document_icon QMAKE_BUNDLE_DATA += document_icon
ICON = Icons/qbittorrent_mac.icns
qt_conf.path = Contents/Resources QMAKE_INFO_PLIST = Info.plist
qt_conf.files = mac/qt.conf
QMAKE_BUNDLE_DATA += qt_conf
qt_translations.path = Contents/MacOS/translations
qt_translations.files = qt-translations/qt_ar.qm \
qt-translations/qt_bg.qm \
qt-translations/qt_ca.qm \
qt-translations/qt_cs.qm \
qt-translations/qt_da.qm \
qt-translations/qt_de.qm \
qt-translations/qt_es.qm \
qt-translations/qt_fi.qm \
qt-translations/qt_fr.qm \
qt-translations/qt_gl.qm \
qt-translations/qt_he.qm \
qt-translations/qt_hu.qm \
qt-translations/qt_it.qm \
qt-translations/qt_ja.qm \
qt-translations/qt_ko.qm \
qt-translations/qt_lt.qm \
qt-translations/qt_nl.qm \
qt-translations/qt_pl.qm \
qt-translations/qt_pt.qm \
qt-translations/qt_pt_BR.qm \
qt-translations/qt_ru.qm \
qt-translations/qt_sk.qm \
qt-translations/qt_sv.qm \
qt-translations/qt_tr.qm \
qt-translations/qt_uk.qm \
qt-translations/qt_zh_CN.qm \
qt-translations/qt_zh_TW.qm
QMAKE_BUNDLE_DATA += qt_translations
ICON = mac/qbittorrent_mac.icns
QMAKE_INFO_PLIST = mac/Info.plist
DEFINES += WITH_GEOIP_EMBEDDED DEFINES += WITH_GEOIP_EMBEDDED
message("On Mac OS X, GeoIP database must be embedded.") message("On Mac OS X, GeoIP database must be embedded.")

View File

@@ -13,7 +13,6 @@ RC_FILE = qbittorrent_os2.rc
# LIBTORRENT DEFINES # LIBTORRENT DEFINES
DEFINES += WITH_SHIPPED_GEOIP_H DEFINES += WITH_SHIPPED_GEOIP_H
DEFINES += BOOST_ASIO_DYN_LINK
DEFINES += WITH_GEOIP_EMBEDDED DEFINES += WITH_GEOIP_EMBEDDED
message("On eCS(OS/2), GeoIP database must be embedded.") message("On eCS(OS/2), GeoIP database must be embedded.")

View File

@@ -11,8 +11,6 @@ dist.commands += rm -fR ../$${PROJECT_NAME}-$${PROJECT_VERSION}/.git &&
dist.commands += rm -f ../$${PROJECT_NAME}-$${PROJECT_VERSION}/.gitignore && dist.commands += rm -f ../$${PROJECT_NAME}-$${PROJECT_VERSION}/.gitignore &&
dist.commands += cd .. && dist.commands += cd .. &&
dist.commands += tar czf $${PROJECT_NAME}-$${PROJECT_VERSION}.tar.gz $${PROJECT_NAME}-$${PROJECT_VERSION} && dist.commands += tar czf $${PROJECT_NAME}-$${PROJECT_VERSION}.tar.gz $${PROJECT_NAME}-$${PROJECT_VERSION} &&
dist.commands += tar cf $${PROJECT_NAME}-$${PROJECT_VERSION}.tar $${PROJECT_NAME}-$${PROJECT_VERSION} &&
dist.commands += xz -f $${PROJECT_NAME}-$${PROJECT_VERSION}.tar &&
dist.commands += rm -fR $${PROJECT_NAME}-$${PROJECT_VERSION} dist.commands += rm -fR $${PROJECT_NAME}-$${PROJECT_VERSION}
QMAKE_EXTRA_TARGETS += dist QMAKE_EXTRA_TARGETS += dist

View File

@@ -71,7 +71,6 @@ public:
#if LIBTORRENT_VERSION_MAJOR == 0 && LIBTORRENT_VERSION_MINOR < 16 #if LIBTORRENT_VERSION_MAJOR == 0 && LIBTORRENT_VERSION_MINOR < 16
required_libs << "filesystem" ; required_libs << "filesystem" ;
#endif #endif
required_libs << "thread";
QStringList libDirs; QStringList libDirs;
if (!s.isEmpty()) if (!s.isEmpty())
libDirs << s; libDirs << s;

View File

@@ -8,11 +8,11 @@ class qc_libtorrent_rasterbar : public ConfObj
{ {
public: public:
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {} qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
QString name() const { return "libtorrent-rasterbar >= 0.15.0"; } QString name() const { return "libtorrent-rasterbar >= 0.14.4"; }
QString shortname() const { return "libtorrent-rasterbar"; } QString shortname() const { return "libtorrent-rasterbar"; }
bool exec(){ bool exec(){
QStringList incs; QStringList incs;
QString req_ver = "0.15.0"; QString req_ver = "0.14.4";
QString version, libs, other; QString version, libs, other;
VersionMode mode = VersionMin; VersionMode mode = VersionMin;
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other)) if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))

View File

@@ -1,6 +1,6 @@
/* /*
-----BEGIN QCMOD----- -----BEGIN QCMOD-----
name: Qt >= 4.6 name: Qt >= 4.5
arg: enable-debug, Enable debug mode arg: enable-debug, Enable debug mode
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
-----END QCMOD----- -----END QCMOD-----
@@ -9,8 +9,8 @@ class qc_qt4 : public ConfObj
{ {
public: public:
qc_qt4(Conf *c) : ConfObj(c) {} qc_qt4(Conf *c) : ConfObj(c) {}
QString name() const { return "Qt >= 4.6"; } QString name() const { return "Qt >= 4.5"; }
QString shortname() const { return "Qt 4.6"; } QString shortname() const { return "Qt 4.5"; }
bool exec() bool exec()
{ {
// NOX mode // NOX mode
@@ -31,6 +31,6 @@ public:
#else #else
conf->addExtra("MANPREFIX = $$PREFIX/share"); conf->addExtra("MANPREFIX = $$PREFIX/share");
#endif #endif
return(QT_VERSION >= 0x040600); return(QT_VERSION >= 0x040500);
} }
}; };

View File

@@ -13,6 +13,10 @@
<string>qBitTorrentDocument</string> <string>qBitTorrentDocument</string>
<key>CFBundleTypeName</key> <key>CFBundleTypeName</key>
<string>BitTorrent Document</string> <string>BitTorrent Document</string>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/x-bittorrent</string>
</array>
<key>CFBundleTypeRole</key> <key>CFBundleTypeRole</key>
<string>Viewer</string> <string>Viewer</string>
<key>LSHandlerRank</key> <key>LSHandlerRank</key>
@@ -36,55 +40,21 @@
<string>BitTorrent Magnet URL</string> <string>BitTorrent Magnet URL</string>
</dict> </dict>
</array> </array>
<key>CFBundleName</key>
<string>qBittorrent</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>qbittorrent_mac.icns</string> <string>qbittorrent_mac.icns</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleGetInfoString</key>
<string>3.0.5</string> <string>2.9.5</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>qBit</string> <string>????</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>qbittorrent</string> <string>qbittorrent</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>org.qbittorrent</string> <string>org.qbittorrent</string>
<key>NSAppleScriptEnabled</key> <key>NOTE</key>
<string>YES</string> <string>This file was generated by Qt/QMake.</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2006-2012 Christophe Dumez</string>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
<string>public.item</string>
<string>com.bittorrent.torrent</string>
</array>
<key>UTTypeDescription</key>
<string>BitTorrent Document</string>
<key>UTTypeIconFile</key>
<string>qBitTorrentDocument</string>
<key>UTTypeIdentifier</key>
<string>org.bittorrent.torrent</string>
<key>UTTypeReferenceURL</key>
<string>http://www.bittorrent.org/beps/bep_0000.html</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>com.apple.ostype</key>
<string>TORR</string>
<key>public.filename-extension</key>
<array>
<string>torrent</string>
</array>
<key>public.mime-type</key>
<string>application/x-bittorrent</string>
</dict>
</dict>
</array>
</dict> </dict>
</plist> </plist>

File diff suppressed because one or more lines are too long

View File

@@ -45,7 +45,7 @@ class about : public QDialog, private Ui::AboutDlg{
qDebug("Deleting about dlg"); qDebug("Deleting about dlg");
} }
about(QWidget *parent): QDialog(parent) { about(QWidget *parent): QDialog(parent){
setupUi(this); setupUi(this);
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
// Set icons // Set icons
@@ -64,7 +64,6 @@ class about : public QDialog, private Ui::AboutDlg{
QString trans_txt = "<p>"+tr("I would like to thank the following people who volunteered to translate qBittorrent:")+"</p>"; QString trans_txt = "<p>"+tr("I would like to thank the following people who volunteered to translate qBittorrent:")+"</p>";
trans_txt += QString::fromUtf8("<ul><li><u>Arabic:</u> SDERAWI (abz8868@msn.com) and sn51234 (nesseyan@gmail.com)</li>\ trans_txt += QString::fromUtf8("<ul><li><u>Arabic:</u> SDERAWI (abz8868@msn.com) and sn51234 (nesseyan@gmail.com)</li>\
<li><u>Armenian:</u> Hrant Ohanyan (hrantohanyan@mail.am)</li>\ <li><u>Armenian:</u> Hrant Ohanyan (hrantohanyan@mail.am)</li>\
<li><u>Basque:</u> Xabier Aramendi (azpidatziak@gmail.com)</li>\
<li><u>Belarusian:</u> Mihas Varantsou (meequz@gmail.com)</li>\ <li><u>Belarusian:</u> Mihas Varantsou (meequz@gmail.com)</li>\
<li><u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)</li>\ <li><u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)</li>\
<li><u>Bulgarian:</u> Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)</li>\ <li><u>Bulgarian:</u> Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)</li>\
@@ -80,9 +79,8 @@ class about : public QDialog, private Ui::AboutDlg{
<li><u>Georgian:</u> Beqa Arabuli (arabulibeqa@yahoo.com)</li>\ <li><u>Georgian:</u> Beqa Arabuli (arabulibeqa@yahoo.com)</li>\
<li><u>German:</u> Niels Hoffmann (zentralmaschine@users.sourceforge.net)</li>\ <li><u>German:</u> Niels Hoffmann (zentralmaschine@users.sourceforge.net)</li>\
<li><u>Greek:</u> Tsvetan Bankov (emerge_life@users.sourceforge.net)</li>\ <li><u>Greek:</u> Tsvetan Bankov (emerge_life@users.sourceforge.net)</li>\
<li><u>Hebrew:</u> David Deutsch (d.deffo@gmail.com)</li>\
<li><u>Hungarian:</u> Majoros Péter (majoros.peterj@gmail.com)</li>\ <li><u>Hungarian:</u> Majoros Péter (majoros.peterj@gmail.com)</li>\
<li><u>Italian:</u> bovirus (bovirus@live.it) and Matteo Sechi (bu17714@gmail.com)</li>\ <li><u>Italian:</u> Matteo Sechi (bu17714@gmail.com)</li>\
<li><u>Japanese:</u> Masato Hashimoto (cabezon.hashimoto@gmail.com)</li>\ <li><u>Japanese:</u> Masato Hashimoto (cabezon.hashimoto@gmail.com)</li>\
<li><u>Korean:</u> Jin Woo Sin (jin828sin@users.sourceforge.net)</li>\ <li><u>Korean:</u> Jin Woo Sin (jin828sin@users.sourceforge.net)</li>\
<li><u>Lithuanian:</u> Naglis Jonaitis (njonaitis@gmail.com)</li>\ <li><u>Lithuanian:</u> Naglis Jonaitis (njonaitis@gmail.com)</li>\
@@ -96,13 +94,13 @@ class about : public QDialog, private Ui::AboutDlg{
<li><u>Spanish:</u> Francisco Luque Contreras (frannoe@ya.com)</li>\ <li><u>Spanish:</u> Francisco Luque Contreras (frannoe@ya.com)</li>\
<li><u>Swedish:</u> Daniel Nylander (po@danielnylander.se)</li>\ <li><u>Swedish:</u> Daniel Nylander (po@danielnylander.se)</li>\
<li><u>Turkish:</u> Hasan YILMAZ (iletisim@hedefturkce.com) and Erdem Bingöl (erdem84@gmail.com)</li>\ <li><u>Turkish:</u> Hasan YILMAZ (iletisim@hedefturkce.com) and Erdem Bingöl (erdem84@gmail.com)</li>\
<li><u>Ukrainian:</u> Oleh Prypin (blaxpirit@gmail.com)</li></ul>"); <li><u>Ukrainian:</u> Andrey Shpachenko (masterfix@users.sourceforge.net) and Oleh Prypin (blaxpirit@gmail.com)</li></ul>");
trans_txt += "<p>"+tr("Please contact me if you would like to translate qBittorrent into your own language.")+"</p>"; trans_txt += "<p>"+tr("Please contact me if you would like to translate qBittorrent into your own language.")+"</p>";
te_translation->setHtml(trans_txt); te_translation->setHtml(trans_txt);
// License // License
te_license->append(QString::fromUtf8("<a name='top'></a>")); te_license->append(QString::fromUtf8("<a name='top'></a>"));
QFile licensefile(":/gpl.html"); QFile licensefile(":/gpl.html");
if (licensefile.open(QIODevice::ReadOnly|QIODevice::Text)) { if(licensefile.open(QIODevice::ReadOnly|QIODevice::Text)) {
te_license->setHtml(licensefile.readAll()); te_license->setHtml(licensefile.readAll());
licensefile.close(); licensefile.close();
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -59,7 +59,7 @@ class DeletionConfirmationDlg : public QDialog, private Ui::confirmDeletionDlg {
static bool askForDeletionConfirmation(bool *delete_local_files) { static bool askForDeletionConfirmation(bool *delete_local_files) {
DeletionConfirmationDlg dlg; DeletionConfirmationDlg dlg;
if (dlg.exec() == QDialog::Accepted) { if(dlg.exec() == QDialog::Accepted) {
*delete_local_files = dlg.shouldDeleteLocalFiles(); *delete_local_files = dlg.shouldDeleteLocalFiles();
return true; return true;
} }

View File

@@ -50,7 +50,7 @@ DNSUpdater::DNSUpdater(QObject *parent) :
m_ipCheckTimer.start(); m_ipCheckTimer.start();
// Check lastUpdate to avoid flooding // Check lastUpdate to avoid flooding
if (!m_lastIPCheckTime.isValid() || if(!m_lastIPCheckTime.isValid() ||
m_lastIPCheckTime.secsTo(QDateTime::currentDateTime())*1000 > IP_CHECK_INTERVAL_MS) { m_lastIPCheckTime.secsTo(QDateTime::currentDateTime())*1000 > IP_CHECK_INTERVAL_MS) {
checkPublicIP(); checkPublicIP();
} }
@@ -79,19 +79,19 @@ void DNSUpdater::checkPublicIP()
void DNSUpdater::ipRequestFinished(QNetworkReply *reply) void DNSUpdater::ipRequestFinished(QNetworkReply *reply)
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
if (reply->error()) { if(reply->error()) {
// Error // Error
qWarning() << Q_FUNC_INFO << "Error:" << reply->errorString(); qWarning() << Q_FUNC_INFO << "Error:" << reply->errorString();
} else { } else {
// Parse response // Parse response
QRegExp ipregex("Current IP Address:\\s+([^<]+)</body>"); QRegExp ipregex("Current IP Address:\\s+([^<]+)</body>");
QString ret = reply->readAll(); QString ret = reply->readAll();
if (ipregex.indexIn(ret) >= 0) { if(ipregex.indexIn(ret) >= 0) {
QString ip_str = ipregex.cap(1); QString ip_str = ipregex.cap(1);
qDebug() << Q_FUNC_INFO << "Regular expression captured the following IP:" << ip_str; qDebug() << Q_FUNC_INFO << "Regular expression captured the following IP:" << ip_str;
QHostAddress new_ip(ip_str); QHostAddress new_ip(ip_str);
if (!new_ip.isNull()) { if(!new_ip.isNull()) {
if (m_lastIP != new_ip) { if(m_lastIP != new_ip) {
qDebug() << Q_FUNC_INFO << "The IP address changed, report the change to DynDNS..."; qDebug() << Q_FUNC_INFO << "The IP address changed, report the change to DynDNS...";
qDebug() << m_lastIP.toString() << "->" << new_ip.toString(); qDebug() << m_lastIP.toString() << "->" << new_ip.toString();
m_lastIP = new_ip; m_lastIP = new_ip;
@@ -157,7 +157,7 @@ QUrl DNSUpdater::getUpdateUrl() const
void DNSUpdater::ipUpdateFinished(QNetworkReply *reply) void DNSUpdater::ipUpdateFinished(QNetworkReply *reply)
{ {
if (reply->error()) { if(reply->error()) {
// Error // Error
qWarning() << Q_FUNC_INFO << "Error:" << reply->errorString(); qWarning() << Q_FUNC_INFO << "Error:" << reply->errorString();
} else { } else {
@@ -174,11 +174,11 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
qDebug() << Q_FUNC_INFO << reply; qDebug() << Q_FUNC_INFO << reply;
QString code = reply.split(" ").first(); QString code = reply.split(" ").first();
qDebug() << Q_FUNC_INFO << "Code:" << code; qDebug() << Q_FUNC_INFO << "Code:" << code;
if (code == "good" || code == "nochg") { if(code == "good" || code == "nochg") {
QBtSession::instance()->addConsoleMessage(tr("Your dynamic DNS was successfully updated."), "green"); QBtSession::instance()->addConsoleMessage(tr("Your dynamic DNS was successfuly updated."), "green");
return; return;
} }
if (code == "911" || code == "dnserr") { if(code == "911" || code == "dnserr") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes."), QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes."),
"red"); "red");
m_lastIP.clear(); m_lastIP.clear();
@@ -188,30 +188,30 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
// Everything bellow is an error, stop updating until the user updates something // Everything bellow is an error, stop updating until the user updates something
m_ipCheckTimer.stop(); m_ipCheckTimer.stop();
m_lastIP.clear(); m_lastIP.clear();
if (code == "nohost") { if(code == "nohost") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: hostname supplied does not exist under specified account."), QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: hostname supplied does not exist under specified account."),
"red"); "red");
m_state = INVALID_CREDS; m_state = INVALID_CREDS;
return; return;
} }
if (code == "badauth") { if(code == "badauth") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: Invalid username/password."), "red"); QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: Invalid username/password."), "red");
m_state = INVALID_CREDS; m_state = INVALID_CREDS;
return; return;
} }
if (code == "badagent") { if(code == "badagent") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org."), QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org."),
"red"); "red");
m_state = FATAL; m_state = FATAL;
return; return;
} }
if (code == "!donator") { if(code == "!donator") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org.").arg("!donator"), QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org.").arg("!donator"),
"red"); "red");
m_state = FATAL; m_state = FATAL;
return; return;
} }
if (code == "abuse") { if(code == "abuse") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: Your username was blocked due to abuse."), QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: Your username was blocked due to abuse."),
"red"); "red");
m_state = FATAL; m_state = FATAL;
@@ -221,18 +221,18 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
void DNSUpdater::updateCredentials() void DNSUpdater::updateCredentials()
{ {
if (m_state == FATAL) return; if(m_state == FATAL) return;
Preferences pref; Preferences pref;
bool change = false; bool change = false;
// Get DNS service information // Get DNS service information
if (m_service != pref.getDynDNSService()) { if(m_service != pref.getDynDNSService()) {
m_service = pref.getDynDNSService(); m_service = pref.getDynDNSService();
change = true; change = true;
} }
if (m_domain != pref.getDynDomainName()) { if(m_domain != pref.getDynDomainName()) {
m_domain = pref.getDynDomainName(); m_domain = pref.getDynDomainName();
QRegExp domain_regex("^(?:(?!\\d|-)[a-zA-Z0-9\\-]{1,63}\\.)+[a-zA-Z]{2,}$"); QRegExp domain_regex("^(?:(?!\\d|-)[a-zA-Z0-9\\-]{1,63}\\.)+[a-zA-Z]{2,}$");
if (domain_regex.indexIn(m_domain) < 0) { if(domain_regex.indexIn(m_domain) < 0) {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: supplied domain name is invalid."), QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: supplied domain name is invalid."),
"red"); "red");
m_lastIP.clear(); m_lastIP.clear();
@@ -242,9 +242,9 @@ void DNSUpdater::updateCredentials()
} }
change = true; change = true;
} }
if (m_username != pref.getDynDNSUsername()) { if(m_username != pref.getDynDNSUsername()) {
m_username = pref.getDynDNSUsername(); m_username = pref.getDynDNSUsername();
if (m_username.length() < 4) { if(m_username.length() < 4) {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: supplied username is too short."), QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: supplied username is too short."),
"red"); "red");
m_lastIP.clear(); m_lastIP.clear();
@@ -254,9 +254,9 @@ void DNSUpdater::updateCredentials()
} }
change = true; change = true;
} }
if (m_password != pref.getDynDNSPassword()) { if(m_password != pref.getDynDNSPassword()) {
m_password = pref.getDynDNSPassword(); m_password = pref.getDynDNSPassword();
if (m_password.length() < 4) { if(m_password.length() < 4) {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: supplied password is too short."), QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: supplied password is too short."),
"red"); "red");
m_lastIP.clear(); m_lastIP.clear();
@@ -267,7 +267,7 @@ void DNSUpdater::updateCredentials()
change = true; change = true;
} }
if (m_state == INVALID_CREDS && change) { if(m_state == INVALID_CREDS && change) {
m_state = OK; // Try again m_state = OK; // Try again
m_ipCheckTimer.start(); m_ipCheckTimer.start();
checkPublicIP(); checkPublicIP();

View File

@@ -43,38 +43,38 @@ class downloadFromURL : public QDialog, private Ui::downloadFromURL{
Q_OBJECT Q_OBJECT
public: public:
downloadFromURL(QWidget *parent): QDialog(parent) { downloadFromURL(QWidget *parent): QDialog(parent){
setupUi(this); setupUi(this);
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
setModal(true); setModal(true);
show(); show();
// Paste clipboard if there is an URL in it // Paste clipboard if there is an URL in it
QString clip_txt = qApp->clipboard()->text(); QString clip_txt = qApp->clipboard()->text();
if (clip_txt.startsWith("http://", Qt::CaseInsensitive) || clip_txt.startsWith("https://", Qt::CaseInsensitive) || clip_txt.startsWith("ftp://", Qt::CaseInsensitive) || clip_txt.startsWith("magnet:", Qt::CaseInsensitive) || clip_txt.startsWith("bc://bt/", Qt::CaseInsensitive)) { if(clip_txt.startsWith("http://", Qt::CaseInsensitive) || clip_txt.startsWith("https://", Qt::CaseInsensitive) || clip_txt.startsWith("ftp://", Qt::CaseInsensitive) || clip_txt.startsWith("magnet:", Qt::CaseInsensitive) || clip_txt.startsWith("bc://bt/", Qt::CaseInsensitive)) {
textUrls->setText(clip_txt); textUrls->setText(clip_txt);
} }
} }
~downloadFromURL() {} ~downloadFromURL(){}
signals: signals:
void urlsReadyToBeDownloaded(const QStringList& torrent_urls); void urlsReadyToBeDownloaded(const QStringList& torrent_urls);
public slots: public slots:
void on_downloadButton_clicked() { void on_downloadButton_clicked(){
QString urls = textUrls->toPlainText(); QString urls = textUrls->toPlainText();
QStringList url_list = urls.split(QString::fromUtf8("\n")); QStringList url_list = urls.split(QString::fromUtf8("\n"));
QString url; QString url;
QStringList url_list_cleaned; QStringList url_list_cleaned;
foreach (url, url_list) { foreach(url, url_list){
url = url.trimmed(); url = url.trimmed();
if (!url.isEmpty()) { if(!url.isEmpty()){
if (url_list_cleaned.indexOf(QRegExp(url, Qt::CaseInsensitive, QRegExp::FixedString)) < 0) { if(url_list_cleaned.indexOf(QRegExp(url, Qt::CaseInsensitive, QRegExp::FixedString)) < 0){
url_list_cleaned << url; url_list_cleaned << url;
} }
} }
} }
if (!url_list_cleaned.size()) { if(!url_list_cleaned.size()){
QMessageBox::critical(0, tr("No URL entered"), tr("Please type at least one URL.")); QMessageBox::critical(0, tr("No URL entered"), tr("Please type at least one URL."));
return; return;
} }
@@ -83,7 +83,7 @@ class downloadFromURL : public QDialog, private Ui::downloadFromURL{
close(); close();
} }
void on_cancelButton_clicked() { void on_cancelButton_clicked(){
close(); close();
} }
}; };

View File

@@ -14,14 +14,31 @@
<string>Download from urls</string> <string>Download from urls</string>
</property> </property>
<layout class="QVBoxLayout"> <layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>9</number>
</property>
<item> <item>
<layout class="QHBoxLayout"> <layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item> <item>
<widget class="QLabel" name="downloadURL_lbl"> <widget class="QLabel" name="downloadURL_lbl">
<property name="font"> <property name="font">
<font> <font>
<family>Sans Serif</family>
<pointsize>12</pointsize>
<weight>75</weight> <weight>75</weight>
<italic>false</italic>
<bold>true</bold> <bold>true</bold>
<underline>false</underline>
<strikeout>false</strikeout>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@@ -48,7 +65,13 @@
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Sans Serif</family>
<pointsize>9</pointsize>
<weight>50</weight>
<italic>true</italic> <italic>true</italic>
<bold>false</bold>
<underline>false</underline>
<strikeout>false</strikeout>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@@ -58,6 +81,12 @@
</item> </item>
<item> <item>
<layout class="QHBoxLayout"> <layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item> <item>
<spacer> <spacer>
<property name="orientation"> <property name="orientation">

View File

@@ -32,6 +32,7 @@
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QNetworkRequest> #include <QNetworkRequest>
#include <QNetworkProxy> #include <QNetworkProxy>
#include <QNetworkCookie>
#include <QNetworkCookieJar> #include <QNetworkCookieJar>
#include "downloadthread.h" #include "downloadthread.h"
@@ -54,7 +55,7 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
QString url = reply->url().toString(); QString url = reply->url().toString();
qDebug("Download finished: %s", qPrintable(url)); qDebug("Download finished: %s", qPrintable(url));
// Check if the request was successful // Check if the request was successful
if (reply->error() != QNetworkReply::NoError) { if(reply->error() != QNetworkReply::NoError) {
// Failure // Failure
qDebug("Download failure (%s), reason: %s", qPrintable(url), qPrintable(errorCodeToString(reply->error()))); qDebug("Download failure (%s), reason: %s", qPrintable(url), qPrintable(errorCodeToString(reply->error())));
emit downloadFailure(url, errorCodeToString(reply->error())); emit downloadFailure(url, errorCodeToString(reply->error()));
@@ -63,7 +64,7 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
} }
// Check if the server ask us to redirect somewhere lese // Check if the server ask us to redirect somewhere lese
const QVariant redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); const QVariant redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (redirection.isValid()) { if(redirection.isValid()) {
// We should redirect // We should redirect
QUrl newUrl = redirection.toUrl(); QUrl newUrl = redirection.toUrl();
// Resolve relative urls // Resolve relative urls
@@ -77,7 +78,7 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
return; return;
} }
// Checking if it was redirected, restoring initial URL // Checking if it was redirected, restoring initial URL
if (m_redirectMapping.contains(url)) { if(m_redirectMapping.contains(url)) {
url = m_redirectMapping.take(url); url = m_redirectMapping.take(url);
} }
// Success // Success
@@ -86,7 +87,7 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
if (tmpfile->open()) { if (tmpfile->open()) {
QString filePath = tmpfile->fileName(); QString filePath = tmpfile->fileName();
qDebug("Temporary filename is: %s", qPrintable(filePath)); qDebug("Temporary filename is: %s", qPrintable(filePath));
if (reply->isOpen() || reply->open(QIODevice::ReadOnly)) { if(reply->isOpen() || reply->open(QIODevice::ReadOnly)) {
// TODO: Support GZIP compression // TODO: Support GZIP compression
tmpfile->write(reply->readAll()); tmpfile->write(reply->readAll());
tmpfile->close(); tmpfile->close();
@@ -108,21 +109,39 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
reply->deleteLater(); reply->deleteLater();
} }
void DownloadThread::downloadTorrentUrl(const QString &url, const QList<QNetworkCookie>& cookies) #ifndef DISABLE_GUI
{ void DownloadThread::loadCookies(const QString &host_name, QString url) {
const QList<QByteArray> raw_cookies = RssSettings().getHostNameCookies(host_name);
QNetworkCookieJar *cookie_jar = m_networkManager.cookieJar();
QList<QNetworkCookie> cookies;
qDebug("Loading cookies for host name: %s", qPrintable(host_name));
foreach(const QByteArray& raw_cookie, raw_cookies) {
QList<QByteArray> cookie_parts = raw_cookie.split('=');
if(cookie_parts.size() == 2) {
qDebug("Loading cookie: %s", raw_cookie.constData());
cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last());
}
}
cookie_jar->setCookiesFromUrl(cookies, url);
m_networkManager.setCookieJar(cookie_jar);
}
#endif
void DownloadThread::downloadTorrentUrl(const QString &url) {
// Process request // Process request
QNetworkReply *reply = downloadUrl(url, cookies); QNetworkReply *reply = downloadUrl(url);
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64))); connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
} }
QNetworkReply* DownloadThread::downloadUrl(const QString &url, const QList<QNetworkCookie>& cookies) { QNetworkReply* DownloadThread::downloadUrl(const QString &url){
// Update proxy settings // Update proxy settings
applyProxySettings(); applyProxySettings();
// Set cookies #ifndef DISABLE_GUI
if (!cookies.empty()) { // Load cookies
qDebug("Setting %d cookies for url: %s", cookies.size(), qPrintable(url)); QString host_name = QUrl::fromEncoded(url.toUtf8()).host();
m_networkManager.cookieJar()->setCookiesFromUrl(cookies, url); if(!host_name.isEmpty())
} loadCookies(host_name, url);
#endif
// Process download request // Process download request
qDebug("url is %s", qPrintable(url)); qDebug("url is %s", qPrintable(url));
const QUrl qurl = QUrl::fromEncoded(url.toUtf8()); const QUrl qurl = QUrl::fromEncoded(url.toUtf8());
@@ -132,7 +151,7 @@ QNetworkReply* DownloadThread::downloadUrl(const QString &url, const QList<QNetw
request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5"); request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5");
qDebug("Downloading %s...", request.url().toEncoded().data()); qDebug("Downloading %s...", request.url().toEncoded().data());
qDebug("%d cookies for this URL", m_networkManager.cookieJar()->cookiesForUrl(url).size()); qDebug("%d cookies for this URL", m_networkManager.cookieJar()->cookiesForUrl(url).size());
for (int i=0; i<m_networkManager.cookieJar()->cookiesForUrl(url).size(); ++i) { for(int i=0; i<m_networkManager.cookieJar()->cookiesForUrl(url).size(); ++i) {
qDebug("%s=%s", m_networkManager.cookieJar()->cookiesForUrl(url).at(i).name().data(), m_networkManager.cookieJar()->cookiesForUrl(url).at(i).value().data()); qDebug("%s=%s", m_networkManager.cookieJar()->cookiesForUrl(url).at(i).name().data(), m_networkManager.cookieJar()->cookiesForUrl(url).at(i).value().data());
qDebug("Domain: %s, Path: %s", qPrintable(m_networkManager.cookieJar()->cookiesForUrl(url).at(i).domain()), qPrintable(m_networkManager.cookieJar()->cookiesForUrl(url).at(i).path())); qDebug("Domain: %s, Path: %s", qPrintable(m_networkManager.cookieJar()->cookiesForUrl(url).at(i).domain()), qPrintable(m_networkManager.cookieJar()->cookiesForUrl(url).at(i).path()));
} }
@@ -141,10 +160,10 @@ QNetworkReply* DownloadThread::downloadUrl(const QString &url, const QList<QNetw
void DownloadThread::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal) { void DownloadThread::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal) {
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
if (!reply) return; if(!reply) return;
if (bytesTotal > 0) { if(bytesTotal > 0) {
// Total number of bytes is available // Total number of bytes is available
if (bytesTotal > 1048576) { if(bytesTotal > 1048576) {
// More than 1MB, this is probably not a torrent file, aborting... // More than 1MB, this is probably not a torrent file, aborting...
reply->abort(); reply->abort();
reply->deleteLater(); reply->deleteLater();
@@ -152,7 +171,7 @@ void DownloadThread::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal)
disconnect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64))); disconnect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
} }
} else { } else {
if (bytesReceived > 1048576) { if(bytesReceived > 1048576) {
// More than 1MB, this is probably not a torrent file, aborting... // More than 1MB, this is probably not a torrent file, aborting...
reply->abort(); reply->abort();
reply->deleteLater(); reply->deleteLater();
@@ -163,13 +182,13 @@ void DownloadThread::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal)
void DownloadThread::applyProxySettings() { void DownloadThread::applyProxySettings() {
QNetworkProxy proxy; QNetworkProxy proxy;
const Preferences pref; const Preferences pref;
if (pref.isProxyEnabled()) { if(pref.isProxyEnabled()) {
// Proxy enabled // Proxy enabled
proxy.setHostName(pref.getProxyIp()); proxy.setHostName(pref.getProxyIp());
proxy.setPort(pref.getProxyPort()); proxy.setPort(pref.getProxyPort());
// Default proxy type is HTTP, we must change if it is SOCKS5 // Default proxy type is HTTP, we must change if it is SOCKS5
const int proxy_type = pref.getProxyType(); const int proxy_type = pref.getProxyType();
if (proxy_type == Proxy::SOCKS5 || proxy_type == Proxy::SOCKS5_PW) { if(proxy_type == Proxy::SOCKS5 || proxy_type == Proxy::SOCKS5_PW) {
qDebug() << Q_FUNC_INFO << "using SOCKS proxy"; qDebug() << Q_FUNC_INFO << "using SOCKS proxy";
proxy.setType(QNetworkProxy::Socks5Proxy); proxy.setType(QNetworkProxy::Socks5Proxy);
} else { } else {
@@ -177,7 +196,7 @@ void DownloadThread::applyProxySettings() {
proxy.setType(QNetworkProxy::HttpProxy); proxy.setType(QNetworkProxy::HttpProxy);
} }
// Authentication? // Authentication?
if (pref.isProxyAuthEnabled()) { if(pref.isProxyAuthEnabled()) {
qDebug("Proxy requires authentication, authenticating"); qDebug("Proxy requires authentication, authenticating");
proxy.setUser(pref.getProxyUsername()); proxy.setUser(pref.getProxyUsername());
proxy.setPassword(pref.getProxyPassword()); proxy.setPassword(pref.getProxyPassword());
@@ -189,7 +208,7 @@ void DownloadThread::applyProxySettings() {
} }
QString DownloadThread::errorCodeToString(QNetworkReply::NetworkError status) { QString DownloadThread::errorCodeToString(QNetworkReply::NetworkError status) {
switch(status) { switch(status){
case QNetworkReply::HostNotFoundError: case QNetworkReply::HostNotFoundError:
return tr("The remote host name was not found (invalid hostname)"); return tr("The remote host name was not found (invalid hostname)");
case QNetworkReply::OperationCanceledError: case QNetworkReply::OperationCanceledError:

View File

@@ -32,7 +32,6 @@
#define DOWNLOADTHREAD_H #define DOWNLOADTHREAD_H
#include <QNetworkReply> #include <QNetworkReply>
#include <QNetworkCookie>
#include <QObject> #include <QObject>
#include <QHash> #include <QHash>
#include <QSslError> #include <QSslError>
@@ -46,8 +45,8 @@ class DownloadThread : public QObject {
public: public:
DownloadThread(QObject* parent = 0); DownloadThread(QObject* parent = 0);
QNetworkReply* downloadUrl(const QString &url, const QList<QNetworkCookie>& raw_cookies = QList<QNetworkCookie>()); QNetworkReply* downloadUrl(const QString &url);
void downloadTorrentUrl(const QString &url, const QList<QNetworkCookie>& raw_cookies = QList<QNetworkCookie>()); void downloadTorrentUrl(const QString &url);
//void setProxy(QString IP, int port, QString username, QString password); //void setProxy(QString IP, int port, QString username, QString password);
signals: signals:
@@ -64,6 +63,9 @@ private slots:
private: private:
QString errorCodeToString(QNetworkReply::NetworkError status); QString errorCodeToString(QNetworkReply::NetworkError status);
void applyProxySettings(); void applyProxySettings();
#ifndef DISABLE_GUI
void loadCookies(const QString &host_name, QString url);
#endif
private: private:
QNetworkAccessManager m_networkManager; QNetworkAccessManager m_networkManager;

View File

@@ -50,10 +50,10 @@ ExecutionLog::ExecutionLog(QWidget *parent) :
ui->tabBan->layout()->addWidget(m_banList); ui->tabBan->layout()->addWidget(m_banList);
const QStringList log_msgs = QBtSession::instance()->getConsoleMessages(); const QStringList log_msgs = QBtSession::instance()->getConsoleMessages();
foreach (const QString& msg, log_msgs) foreach(const QString& msg, log_msgs)
addLogMessage(msg); addLogMessage(msg);
const QStringList ban_msgs = QBtSession::instance()->getPeerBanMessages(); const QStringList ban_msgs = QBtSession::instance()->getPeerBanMessages();
foreach (const QString& msg, ban_msgs) foreach(const QString& msg, ban_msgs)
addBanMessage(msg); addBanMessage(msg);
connect(QBtSession::instance(), SIGNAL(newConsoleMessage(QString)), SLOT(addLogMessage(QString))); connect(QBtSession::instance(), SIGNAL(newConsoleMessage(QString)), SLOT(addLogMessage(QString)));
connect(QBtSession::instance(), SIGNAL(newBanMessage(QString)), SLOT(addBanMessage(QString))); connect(QBtSession::instance(), SIGNAL(newBanMessage(QString)), SLOT(addBanMessage(QString)));

View File

@@ -37,8 +37,8 @@ QT_BEGIN_NAMESPACE
namespace Ui { namespace Ui {
class ExecutionLog; class ExecutionLog;
} }
QT_END_NAMESPACE
class LogListWidget; class LogListWidget;
QT_END_NAMESPACE
class ExecutionLog : public QWidget class ExecutionLog : public QWidget
{ {

View File

@@ -21,7 +21,6 @@
#endif #endif
#endif #endif
#include "fs_utils.h"
#include "misc.h" #include "misc.h"
#ifndef CIFS_MAGIC_NUMBER #ifndef CIFS_MAGIC_NUMBER
@@ -60,11 +59,11 @@ private:
private: private:
static bool isNetworkFileSystem(QString path) { static bool isNetworkFileSystem(QString path) {
QString file = path; QString file = path;
if (!file.endsWith(QDir::separator())) if(!file.endsWith(QDir::separator()))
file += QDir::separator(); file += QDir::separator();
file += "."; file += ".";
struct statfs buf; struct statfs buf;
if (!statfs(file.toLocal8Bit().constData(), &buf)) { if(!statfs(file.toLocal8Bit().constData(), &buf)) {
#ifdef Q_WS_MAC #ifdef Q_WS_MAC
// XXX: should we make sure HAVE_STRUCT_FSSTAT_F_FSTYPENAME is defined? // XXX: should we make sure HAVE_STRUCT_FSSTAT_F_FSTYPENAME is defined?
return (strcmp(buf.f_fstypename, "nfs") == 0 || strcmp(buf.f_fstypename, "cifs") == 0 || strcmp(buf.f_fstypename, "smbfs") == 0); return (strcmp(buf.f_fstypename, "nfs") == 0 || strcmp(buf.f_fstypename, "cifs") == 0 || strcmp(buf.f_fstypename, "smbfs") == 0);
@@ -119,23 +118,23 @@ private:
public: public:
FileSystemWatcher(QObject *parent): QFileSystemWatcher(parent) { FileSystemWatcher(QObject *parent): QFileSystemWatcher(parent) {
m_filters << "*.torrent" << "*.magnet"; m_filters << "*.torrent";
connect(this, SIGNAL(directoryChanged(QString)), this, SLOT(scanLocalFolder(QString))); connect(this, SIGNAL(directoryChanged(QString)), this, SLOT(scanLocalFolder(QString)));
} }
~FileSystemWatcher() { ~FileSystemWatcher() {
#ifndef Q_WS_WIN #ifndef Q_WS_WIN
if (watch_timer) if(watch_timer)
delete watch_timer; delete watch_timer;
#endif #endif
if (m_partialTorrentTimer) if(m_partialTorrentTimer)
delete m_partialTorrentTimer; delete m_partialTorrentTimer;
} }
QStringList directories() const { QStringList directories() const {
QStringList dirs; QStringList dirs;
#ifndef Q_WS_WIN #ifndef Q_WS_WIN
if (watch_timer) { if(watch_timer) {
foreach (const QDir &dir, watched_folders) foreach (const QDir &dir, watched_folders)
dirs << dir.canonicalPath(); dirs << dir.canonicalPath();
} }
@@ -150,7 +149,7 @@ public:
if (!dir.exists()) if (!dir.exists())
return; return;
// 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", qPrintable(path));
qDebug("Using file polling mode instead of inotify..."); qDebug("Using file polling mode instead of inotify...");
@@ -195,7 +194,7 @@ protected slots:
// 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", qPrintable(torrents.join("\n")));
emit torrentsAdded(torrents); emit torrentsAdded(torrents);
} }
@@ -211,7 +210,7 @@ protected slots:
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", qPrintable(torrents.join("\n")));
emit torrentsAdded(torrents); emit torrentsAdded(torrents);
} }
@@ -222,16 +221,16 @@ protected slots:
QStringList no_longer_partial; QStringList no_longer_partial;
// Check which torrents are still partial // Check which torrents are still partial
foreach (const QString& torrent_path, m_partialTorrents.keys()) { foreach(const QString& torrent_path, m_partialTorrents.keys()) {
if (!QFile::exists(torrent_path)) { if(!QFile::exists(torrent_path)) {
m_partialTorrents.remove(torrent_path); m_partialTorrents.remove(torrent_path);
continue; continue;
} }
if (fsutils::isValidTorrentFile(torrent_path)) { if(misc::isValidTorrentFile(torrent_path)) {
no_longer_partial << torrent_path; no_longer_partial << torrent_path;
m_partialTorrents.remove(torrent_path); m_partialTorrents.remove(torrent_path);
} else { } else {
if (m_partialTorrents[torrent_path] >= MAX_PARTIAL_RETRIES) { if(m_partialTorrents[torrent_path] >= MAX_PARTIAL_RETRIES) {
m_partialTorrents.remove(torrent_path); m_partialTorrents.remove(torrent_path);
QFile::rename(torrent_path, torrent_path+".invalid"); QFile::rename(torrent_path, torrent_path+".invalid");
} else { } else {
@@ -241,7 +240,7 @@ protected slots:
} }
// Stop the partial timer if necessary // Stop the partial timer if necessary
if (m_partialTorrents.empty()) { if(m_partialTorrents.empty()) {
m_partialTorrentTimer->stop(); m_partialTorrentTimer->stop();
m_partialTorrentTimer->deleteLater(); m_partialTorrentTimer->deleteLater();
qDebug("No longer any partial torrent."); qDebug("No longer any partial torrent.");
@@ -250,7 +249,7 @@ protected slots:
m_partialTorrentTimer->start(WATCH_INTERVAL); m_partialTorrentTimer->start(WATCH_INTERVAL);
} }
// Notify of new torrents // Notify of new torrents
if (!no_longer_partial.isEmpty()) if(!no_longer_partial.isEmpty())
emit torrentsAdded(no_longer_partial); emit torrentsAdded(no_longer_partial);
} }
@@ -260,7 +259,7 @@ signals:
private: private:
void startPartialTorrentTimer() { void startPartialTorrentTimer() {
Q_ASSERT(!m_partialTorrents.isEmpty()); Q_ASSERT(!m_partialTorrents.isEmpty());
if (!m_partialTorrentTimer) { if(!m_partialTorrentTimer) {
m_partialTorrentTimer = new QTimer(); m_partialTorrentTimer = new QTimer();
connect(m_partialTorrentTimer, SIGNAL(timeout()), SLOT(processPartialTorrents())); connect(m_partialTorrentTimer, SIGNAL(timeout()), SLOT(processPartialTorrents()));
m_partialTorrentTimer->setSingleShot(true); m_partialTorrentTimer->setSingleShot(true);
@@ -270,25 +269,19 @@ private:
void addTorrentsFromDir(const QDir &dir, QStringList &torrents) { void addTorrentsFromDir(const QDir &dir, QStringList &torrents) {
const QStringList files = dir.entryList(m_filters, QDir::Files, QDir::Unsorted); const QStringList files = dir.entryList(m_filters, QDir::Files, QDir::Unsorted);
foreach (const QString &file, files) { foreach(const QString &file, files) {
const QString file_abspath = dir.absoluteFilePath(file); const QString file_abspath = dir.absoluteFilePath(file);
if (file_abspath.endsWith(".magnet")) { if(misc::isValidTorrentFile(file_abspath)) {
QFile f(file_abspath);
if (f.open(QIODevice::ReadOnly)
&& !misc::magnetUriToHash(QString::fromLocal8Bit(f.readAll())).isEmpty()) {
torrents << file_abspath;
}
} else if (fsutils::isValidTorrentFile(file_abspath)) {
torrents << file_abspath; torrents << file_abspath;
} else { } else {
if (!m_partialTorrents.contains(file_abspath)) { if(!m_partialTorrents.contains(file_abspath)) {
qDebug("Partial torrent detected at: %s", qPrintable(file_abspath)); qDebug("Partial torrent detected at: %s", qPrintable(file_abspath));
qDebug("Delay the file's processing..."); qDebug("Delay the file's processing...");
m_partialTorrents.insert(file_abspath, 0); m_partialTorrents.insert(file_abspath, 0);
} }
} }
} }
if (!m_partialTorrents.empty()) if(!m_partialTorrents.empty())
startPartialTorrentTimer(); startPartialTorrentTimer();
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,73 +0,0 @@
/*
* Bittorrent Client using Qt4 and libtorrent.
* Copyright (C) 2012 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* In addition, as a special exception, the copyright holders give permission to
* link this program with the OpenSSL project's "OpenSSL" library (or with
* modified versions of it that use the same license as the "OpenSSL" library),
* and distribute the linked executables. You must obey the GNU General Public
* License in all respects for all of the code used other than "OpenSSL". If you
* modify file(s), you may extend this exception to your version of the file(s),
* but you are not obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*
* Contact : chris@qbittorrent.org
*/
#ifndef FS_UTILS_H
#define FS_UTILS_H
#include <QString>
#include <QCoreApplication>
/**
* Utility functions related to file system.
*/
class fsutils
{
Q_DECLARE_TR_FUNCTIONS(fsutils)
public:
static QString toDisplayPath(const QString& path);
static QString fileExtension(const QString& filename);
static QString fileName(const QString& file_path);
static qint64 computePathSize(const QString& path);
static bool sameFiles(const QString& path1, const QString& path2);
static QString updateLabelInSavePath(QString defaultSavePath, QString save_path, const QString& old_label, const QString& new_label);
static QString toValidFileSystemName(QString filename);
static bool isValidFileSystemName(const QString& filename);
static long long freeDiskSpaceOnPath(QString path);
static QString branchPath(const QString& file_path, QString* removed = 0);
static bool sameFileNames(const QString& first, const QString& second);
static QString expandPath(const QString& path);
static bool isValidTorrentFile(const QString& path);
static bool smartRemoveEmptyFolderTree(const QString& dir_path);
static bool forceRemove(const QString& file_path);
/* Ported from Qt4 to drop dependency on QtGui */
static QString QDesktopServicesDataLocation();
static QString QDesktopServicesCacheLocation();
static QString QDesktopServicesDownloadLocation();
/* End of Qt4 code */
static QString searchEngineLocation();
static QString BTBackupLocation();
static QString cacheLocation();
};
#endif // FS_UTILS_H

View File

@@ -64,20 +64,20 @@
#include <QFile> #include <QFile>
#include <QChar> #include <QChar>
#include "fs_utils.h" #include "misc.h"
using namespace libtorrent; using namespace libtorrent;
QString GeoIPManager::geoipFolder(bool embedded) { QString GeoIPManager::geoipFolder(bool embedded) {
#ifdef WITH_GEOIP_EMBEDDED #ifdef WITH_GEOIP_EMBEDDED
if (embedded) if(embedded)
return ":/geoip/"; return ":/geoip/";
return fsutils::QDesktopServicesDataLocation()+"geoip"+QDir::separator(); return misc::QDesktopServicesDataLocation()+"geoip"+QDir::separator();
#else #else
Q_UNUSED(embedded); Q_UNUSED(embedded);
if (QFile::exists("/usr/local/share/GeoIP/GeoIP.dat")) if(QFile::exists("/usr/local/share/GeoIP/GeoIP.dat"))
return "/usr/local/share/GeoIP/"; return "/usr/local/share/GeoIP/";
if (QFile::exists("/var/lib/GeoIP/GeoIP.dat")) if(QFile::exists("/var/lib/GeoIP/GeoIP.dat"))
return "/var/lib/GeoIP/"; return "/var/lib/GeoIP/";
return "/usr/share/GeoIP/"; return "/usr/share/GeoIP/";
#endif #endif
@@ -89,22 +89,22 @@ QString GeoIPManager::geoipDBpath(bool embedded) {
#ifdef WITH_GEOIP_EMBEDDED #ifdef WITH_GEOIP_EMBEDDED
void GeoIPManager::exportEmbeddedDb() { void GeoIPManager::exportEmbeddedDb() {
if (!QFile::exists(geoipDBpath(false)) || QFile(geoipDBpath(false)).size() != QFile(geoipDBpath(true)).size()) { // Export is required if(!QFile::exists(geoipDBpath(false)) || QFile(geoipDBpath(false)).size() != QFile(geoipDBpath(true)).size()) { // Export is required
qDebug("A local Geoip database update is required, proceeding..."); qDebug("A local Geoip database update is required, proceeding...");
// Create geoip folder is necessary // Create geoip folder is necessary
QDir gfolder(geoipFolder(false)); QDir gfolder(geoipFolder(false));
if (!gfolder.exists()) { if(!gfolder.exists()) {
if (!gfolder.mkpath(geoipFolder(false))) { if(!gfolder.mkpath(geoipFolder(false))) {
std::cerr << "Failed to create geoip folder at " << qPrintable(geoipFolder(false)) << std::endl; std::cerr << "Failed to create geoip folder at " << qPrintable(geoipFolder(false)) << std::endl;
return; return;
} }
} }
// Remove destination files // Remove destination files
if (QFile::exists(geoipDBpath(false))) if(QFile::exists(geoipDBpath(false)))
fsutils::forceRemove(geoipDBpath(false)); misc::safeRemove(geoipDBpath(false));
// Copy from executable to hard disk // Copy from executable to hard disk
qDebug("%s -> %s", qPrintable(geoipDBpath(true)), qPrintable(geoipDBpath(false))); qDebug("%s -> %s", qPrintable(geoipDBpath(true)), qPrintable(geoipDBpath(false)));
if (!QFile::copy(geoipDBpath(true), geoipDBpath(false))) { if(!QFile::copy(geoipDBpath(true), geoipDBpath(false))) {
std::cerr << "ERROR: Failed to copy geoip.dat from executable to hard disk" << std::endl; std::cerr << "ERROR: Failed to copy geoip.dat from executable to hard disk" << std::endl;
} }
qDebug("Local Geoip database was updated"); qDebug("Local Geoip database was updated");
@@ -116,7 +116,7 @@ void GeoIPManager::loadDatabase(session *s) {
#ifdef WITH_GEOIP_EMBEDDED #ifdef WITH_GEOIP_EMBEDDED
exportEmbeddedDb(); exportEmbeddedDb();
#endif #endif
if (QFile::exists(geoipDBpath(false))) { if(QFile::exists(geoipDBpath(false))) {
qDebug("Loading GeoIP database from %s...", qPrintable(geoipDBpath(false))); qDebug("Loading GeoIP database from %s...", qPrintable(geoipDBpath(false)));
s->load_country_db(geoipDBpath(false).toLocal8Bit().constData()); s->load_country_db(geoipDBpath(false).toLocal8Bit().constData());
} else { } else {
@@ -183,9 +183,9 @@ const char * country_name[253] =
"Saint Barthelemy","Saint Martin"}; "Saint Barthelemy","Saint Martin"};
QString GeoIPManager::CountryISOCodeToName(const char* iso) { QString GeoIPManager::CountryISOCodeToName(const char* iso) {
if (iso[0] == 0) return "N/A"; if(iso[0] == 0) return "N/A";
for (uint i = 0; i < num_countries; ++i) { for(uint i = 0; i < num_countries; ++i) {
if (iso[0] == country_code[i][0] && iso[1] == country_code[i][1]) { if(iso[0] == country_code[i][0] && iso[1] == country_code[i][1]) {
return QLatin1String(country_name[i]); return QLatin1String(country_name[i]);
} }
} }
@@ -195,7 +195,7 @@ QString GeoIPManager::CountryISOCodeToName(const char* iso) {
// http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm // http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm
QIcon GeoIPManager::CountryISOCodeToIcon(const char* iso) { QIcon GeoIPManager::CountryISOCodeToIcon(const char* iso) {
if (iso[0] == 0 || iso[0] == '!') return QIcon(); if(iso[0] == 0 || iso[0] == '!') return QIcon();
const QString isoStr = QString(QByteArray(iso, 2)).toLower(); const QString isoStr = QString(QByteArray(iso, 2)).toLower();
return QIcon(":/Icons/flags/"+isoStr+".png"); return QIcon(":/Icons/flags/"+isoStr+".png");
} }

View File

@@ -55,7 +55,7 @@ public:
std::cout << qPrintable(tr("To control qBittorrent, access the Web UI at http://localhost:%1").arg(QString::number(pref.getWebUiPort()))) << std::endl; std::cout << qPrintable(tr("To control qBittorrent, access the Web UI at http://localhost:%1").arg(QString::number(pref.getWebUiPort()))) << std::endl;
std::cout << qPrintable(tr("The Web UI administrator user name is: %1").arg(pref.getWebUiUsername())) << std::endl; std::cout << qPrintable(tr("The Web UI administrator user name is: %1").arg(pref.getWebUiUsername())) << std::endl;
qDebug() << "Password:" << pref.getWebUiPassword(); qDebug() << "Password:" << pref.getWebUiPassword();
if (pref.getWebUiPassword() == "32fe0bd2bb001911bb8bcfe23fc92b63") { if(pref.getWebUiPassword() == "32fe0bd2bb001911bb8bcfe23fc92b63") {
std::cout << qPrintable(tr("The Web UI administrator password is still the default one: %1").arg("adminadmin")) << std::endl; std::cout << qPrintable(tr("The Web UI administrator password is still the default one: %1").arg("adminadmin")) << std::endl;
std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl; std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl;
} }
@@ -85,16 +85,16 @@ public slots:
// the right addTorrent function, considering // the right addTorrent function, considering
// the parameter type. // the parameter type.
void processParams(const QStringList& params) { void processParams(const QStringList& params) {
foreach (QString param, params) { foreach(QString param, params) {
param = param.trimmed(); param = param.trimmed();
if (param.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) { if(param.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) {
QBtSession::instance()->downloadFromUrl(param); QBtSession::instance()->downloadFromUrl(param);
}else{ }else{
if (param.startsWith("bc://bt/", Qt::CaseInsensitive)) { if(param.startsWith("bc://bt/", Qt::CaseInsensitive)) {
qDebug("Converting bc link to magnet link"); qDebug("Converting bc link to magnet link");
param = misc::bcLinkToMagnet(param); param = misc::bcLinkToMagnet(param);
} }
if (param.startsWith("magnet:", Qt::CaseInsensitive)) { if(param.startsWith("magnet:", Qt::CaseInsensitive)) {
QBtSession::instance()->addMagnetUri(param); QBtSession::instance()->addMagnetUri(param);
} else { } else {
QBtSession::instance()->addTorrent(param); QBtSession::instance()->addTorrent(param);

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