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

Compare commits

..

81 Commits

Author SHA1 Message Date
Christophe Dumez
3deee6d595 Bump version to v2.9.8 2012-05-05 10:12:36 +03:00
Christophe Dumez
86f2447f8a Fix possible compilation error on Windows 2012-05-02 17:34:44 +03:00
Christophe Dumez
a69c3098e1 Update italian translation 2012-04-23 20:07:40 +03:00
Christophe Dumez
88627df7fe Update Changelog 2012-04-15 22:01:17 +03:00
Christophe Dumez
8e3ba25c8d Various style fixes
(cherry picked from commit bc6fd3aa72)
2012-04-15 21:59:57 +03:00
Fisiu
1ecffb777a Fix build with gcc 4.7.(cherry picked from commit 41c503eb54) 2012-03-26 18:06:40 +03:00
Christophe Dumez
1c4ae8ffbf OS/2 fixes from Silvan Scherrer
(cherry picked from commit 8cc538085f)
2012-03-19 18:34:40 +02:00
Christophe Dumez
0fad329b7e Bump version to v2.9.7 2012-03-18 17:18:28 +02:00
Christophe Dumez
bdaf16123f Fix important Web UI bug (HTTP request parsing bug) 2012-03-18 17:16:14 +02:00
Christophe Dumez
6b56a1f10f make dist now generates .tar.xz as well
(cherry picked from commit 30a3110ca7)
2012-03-17 22:13:45 +02:00
Christophe Dumez
204b02a480 Bump version to v2.9.6 2012-03-17 17:25:05 +02:00
Christophe Dumez
eb7a844099 Code clean up 2012-03-17 17:23:45 +02:00
Christophe Dumez
84dbb76331 Make sure .unwanted parent is removed if empty (Closes #946826)
(cherry picked from commit bcb29fb5fa)
2012-03-17 16:37:54 +02:00
Christophe Dumez
fb21944aae Update Changelog 2012-03-17 16:28:02 +02:00
Christophe Dumez
14625a565d Make sure OS-created files do not prevent "empty" folder removal
Mac OS X creates .DS_Store files and Windows creates .Thumbs.db
files which can prevent otherwise empty folders removal.
(cherry picked from commit 41b57a0878)
2012-03-17 16:27:20 +02:00
Christophe Dumez
3f875324d8 Update Changelog 2012-03-12 22:02:12 +02:00
Christophe Dumez
03f2293b2a Fix possible Web UI authentication problem when using SSL (closes #941343)
(cherry picked from commit 0b13fa6914)
2012-03-12 22:01:39 +02:00
Christophe Dumez
47482586a1 Update Changelog 2012-03-12 20:56:21 +02:00
Christophe Dumez
96fd1624ce Fix DHT port setting in Web UI (Closes #952182)
(cherry picked from commit c32e651c39)
2012-03-12 20:55:47 +02:00
Christophe Dumez
8ea2312b4f Update Changelog 2012-03-08 20:20:25 -08:00
Christophe Dumez
9382de64d6 RSS downloader should not ignore "Do not start automatically" rule
Closes #946910.
2012-03-08 20:19:48 -08:00
Christophe Dumez
b0e3549780 Update Changelog 2012-03-07 08:15:05 -08:00
Christophe Dumez
d2abe18497 Update language files 2012-03-07 08:14:27 -08:00
Christophe Dumez
ede004148f Integrate Basque translation 2012-03-07 08:13:48 -08:00
Christophe Dumez
91bfe3585c Link against boost thread 2012-02-26 21:26:58 +02:00
Christophe Dumez
f99adf8e9a Update language files 2012-02-25 15:30:35 +02:00
UnSleep
ebab7c5760 Fix small issue in Spanish translation 2012-02-25 15:29:36 +02:00
Christophe Dumez
baf5fe45b4 Update Changelog 2012-02-22 20:09:21 +02:00
Christophe Dumez
54793e4195 Disable system tray icon on Mac OS X 2012-02-22 20:08:30 +02:00
Christophe Dumez
e8da08906c Update Changelog 2012-02-21 20:31:00 +02:00
Christophe Dumez
ae7e9cd1df BUGFIX: Fix name of progress column in torrent content panel 2012-02-21 20:30:30 +02:00
Christophe Dumez
7679b852b8 BUGFIX: Fix download first/last pieces state reporting 2012-02-21 19:53:13 +02:00
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
279 changed files with 31085 additions and 43634 deletions

View File

@@ -92,7 +92,6 @@ Translations authors:
- Georgian: Beqa Arabuli (arabulibeqa@yahoo.com)
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
- 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)
- Italian: Matteo Sechi (bu17714@gmail.com)
- Japanese: Masato Hashimoto (cabezon.hashimoto@gmail.com)
@@ -108,5 +107,5 @@ Translations authors:
- Spanish: Francisco Luque Contreras (frannoe@ya.com)
- Swedish: Daniel Nylander (po@danielnylander.se)
- 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

View File

@@ -1,41 +1,59 @@
* Tue Sep 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.4
- BUGFIX: Fix issue with downloads starting from scratch on startup if temporary
directory setting is enabled.
* Sat May 5 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.8
- BUGFIX: Various UI style fixes
- BUGFIX: Fix compilation with gcc 4.7
- BUGFIX: Fix possible compilation error with msvc (Windows)
- BUGFIX: Fix compilation on OS/2
- I18N: Update Italian translation
* Sun Sep 16 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.3
- BUGFIX: Fix issue with temporary directory not being taken into consideration (closes #94)
- BUGFIX: Address encoding issues when using search engine on Windows (closes #29)
- BUGFIX: Bypass cache when uploading a torrent file in Web UI (closes #68)
- BUGFIX: "Completed On" column is not updated until restart (closes #84)
- BUGFIX: Fix possible build error on some systems
- I18N: Add hebrew translation
* Sun Mar 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.7
- BUGFIX: Fix important HTTP request parsing bug (Web UI)
* Sat Sep 1 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.2
- FEATURE: Add "clear" functionality to search field (closes #59)
- BUGFIX: Attempt to use qBittorrent icon from theme if available (closes #49)
- BUGFIX: Fix crash when a fastresume file is empty (closes #52)
- BUGFIX: Fix encoding problem for detected XDG Download folder (closes #53)
- BUGFIX: Improve performance when showing torrent content panel (Improves #24)
- BUGFIX: Fix label-based filtering of torrents whose label contains special characters
- BUGFIX: Fix possible crash due to labels (closes #64)
* Sat Mar 17 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.6
- BUGFIX: Fix download first/last pieces state reporting
- BUGFIX: Fix name of progress column in torrent content panel
- BUGFIX: Disable system tray icon on Mac OS X
- BUGFIX: RSS downloader should not ignore "Do not start automatically" rule (closes #946910)
- BUGFIX: Fix DHT port setting in Web UI (Closes #952182)
- BUGFIX: Fix possible Web UI authentication problem when using SSL (closes #941343)
- BUGFIX: Fix possible issues with folder removal when removing a torrent
- I18N: Add Basque translation
* Tue Aug 21 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.1
- BUGFIX: Fix possible crash when adding a tracker to a magnet torrent without metadata (Closes #1034254)
- BUGFIX: Remember queue position for torrents without metadata (closes #17)
- BUGFIX: Fix crash when using unauthorized characters in label names (closes #19)
- BUGFIX: Fix search plugins updating (closes #25)
- BUGFIX: Make uTP connections rate limited by default
* Sat Feb 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.5
- BUGFIX: Fix crash when disabling then reenabling RSS
- BUGFIX: Fix duplicate torrent detection when adding a magnet link
- BUGFIX: Fix import of new trackers when adding a torrent with same hash (Closes #747000)
- BUGFIX: Fix possible redownload of torrents marked as read (Closes #927495)
- BUGFIX: Properly remove RSS feed settings/history upon feed removal
* 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 Feb 18 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.4
- BUGFIX: qBittorrent does not handle redirection to relative URLs correctly (Closes #919905)
- BUGFIX: Cmd+M minimizes main window on Mac OS X (Closes #928216)
- BUGFIX: Cmd+Del removes torrents on Mac OS X (Closes #928852)
- BUGFIX: Fix potential bug when moving single file torrents to tmp folder (closes #932861)
- BUGFIX: Fix torrent import dialog layout (Closes #930932)
- BUGFIX: Prevent log window buffer from filling up (Closes #929673)
- I18N: Add Belarusian translation
* Thu Dec 29 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.3
- BUGFIX: Fix btdigg plugin (Python3 support + torrent name in magnet links)
- BUGFIX: Fix banning of IPv6 peers (Closes #885021)
- BUGFIX: Fix torrent addition dialog layout problem (Closes #84650522)
- BUGFIX: Do not report any progress for disabled files (Closes #56731485)
- BUGFIX: Make torrent sorting case insensitive (Closes #857154)
- BUGFIX: Improve Web UI usability of small devices
- BUGFIX: Program updater: More reliable version detection / comparison
- I18N: Add Georgian translation
* Sat Oct 29 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.2
- BUGFIX: Fix mimimum dimensions for torrent addition dialog
- BUGFIX: Remove dependency on boost-datetime
- BUGFIX: Remove dependency on boost-filesystem (libtorrent v0.16.x)
* Sun Oct 23 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.1
- BUGFIX: Add support for speed limits scheduling (Web UI)
- BUGFIX: Fix ratio calculation for purely seeded torrents
- I18N: Update Russian translation
- COSMETIC: Torrent addition dialog layout fixes
* Sat Oct 08 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.0
- 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.
Dependencies:
- Qt >= 4.6.0 (libqtgui, libqtcore, libqtnetwork, libqtxml, libqtdbus/optional)
- Qt >= 4.5.0 (libqtgui, libqtcore, libqtnetwork, libqtxml, libqtdbus/optional)
- 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
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
- 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
Be careful: another library (the one used by rTorrent) uses a similar name.

View File

@@ -42,10 +42,7 @@ LIBS += -Lx:/trees/libtorrent/trunk/src/.libs \
Of course all the above path references have to be adjusted to your build env.
Now you can either do a normal build or a shadow build. A shadow build has the
advantage that no created files are in the same dir as the sources are.
For a normal build do the following:
It should now be easy to build qBittorrent:
Simply type:
$ qmake
@@ -53,16 +50,6 @@ $ qmake
Followed by:
$ make
For a shadow build do the following:
given your sources are in x:\trees\qbittorrent\trunk create a
x:\trees\qbittorrent\build directory
Now switch to the created directory and type:
$ qmake ..\trunk
Followed by:
$ make
If all works fine you should get a working qbittorrent executable.
If you have any question regarding the eCS (OS/2) port of qBittorrent you can meet me (_diver) on IRC:

12
configure vendored
View File

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

View File

@@ -67,7 +67,7 @@ ZIP Installation:
klibc
-----
1. Download klibc 0.6.5 or better (see http://svn.netlabs.org/libc for more information)
1. Download klibc 0.6.4 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
@@ -146,14 +146,6 @@ development, you can do so in one of the following ways:
7. HISTORY
==========
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

View File

@@ -5,7 +5,6 @@ DATADIR = /usr/local/share
# Use pkg-config to get all necessary libtorrent DEFINES
CONFIG += link_pkgconfig
PKGCONFIG += libtorrent-rasterbar
DEFINES += BOOST_ASIO_DYN_LINK
# Special include/libs paths (macports)
INCLUDEPATH += /usr/include/openssl /usr/include /opt/local/include/boost /opt/local/include
@@ -16,50 +15,16 @@ LIBS += -lssl -lcrypto
# Boost system lib
LIBS += -lboost_system-mt
# Boost filesystem lib (Not needed for libtorrent >= 0.16.0)
#LIBS += -lboost_filesystem-mt
LIBS += -lboost_filesystem-mt
# Carbon
LIBS += -framework Carbon -framework IOKit
document_icon.path = Contents/Resources
document_icon.files = mac/qBitTorrentDocument.icns
document_icon.files = Icons/qBitTorrentDocument.icns
QMAKE_BUNDLE_DATA += document_icon
qt_conf.path = Contents/Resources
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
ICON = Icons/qbittorrent_mac.icns
QMAKE_INFO_PLIST = Info.plist
DEFINES += WITH_GEOIP_EMBEDDED
message("On Mac OS X, GeoIP database must be embedded.")

View File

@@ -8,11 +8,11 @@ class qc_libtorrent_rasterbar : public ConfObj
{
public:
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"; }
bool exec(){
QStringList incs;
QString req_ver = "0.15.0";
QString req_ver = "0.14.4";
QString version, libs, other;
VersionMode mode = VersionMin;
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))

View File

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

View File

@@ -13,6 +13,10 @@
<string>qBitTorrentDocument</string>
<key>CFBundleTypeName</key>
<string>BitTorrent Document</string>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/x-bittorrent</string>
</array>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
@@ -36,55 +40,21 @@
<string>BitTorrent Magnet URL</string>
</dict>
</array>
<key>CFBundleName</key>
<string>qBittorrent</string>
<key>CFBundleIconFile</key>
<string>qbittorrent_mac.icns</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>3.0.4</string>
<key>CFBundleGetInfoString</key>
<string>2.9.8</string>
<key>CFBundleSignature</key>
<string>qBit</string>
<string>????</string>
<key>CFBundleExecutable</key>
<string>qbittorrent</string>
<key>CFBundleIdentifier</key>
<string>org.qbittorrent</string>
<key>NSAppleScriptEnabled</key>
<string>YES</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>
<key>NOTE</key>
<string>This file was generated by Qt/QMake.</string>
</dict>
</plist>

View File

@@ -45,7 +45,7 @@ class about : public QDialog, private Ui::AboutDlg{
qDebug("Deleting about dlg");
}
about(QWidget *parent): QDialog(parent) {
about(QWidget *parent): QDialog(parent){
setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
// Set icons
@@ -80,9 +80,8 @@ class about : public QDialog, private Ui::AboutDlg{
<li><u>Georgian:</u> Beqa Arabuli (arabulibeqa@yahoo.com)</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>Hebrew:</u> David Deutsch (d.deffo@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>Korean:</u> Jin Woo Sin (jin828sin@users.sourceforge.net)</li>\
<li><u>Lithuanian:</u> Naglis Jonaitis (njonaitis@gmail.com)</li>\
@@ -96,13 +95,13 @@ class about : public QDialog, private Ui::AboutDlg{
<li><u>Spanish:</u> Francisco Luque Contreras (frannoe@ya.com)</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>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>";
te_translation->setHtml(trans_txt);
// License
te_license->append(QString::fromUtf8("<a name='top'></a>"));
QFile licensefile(":/gpl.html");
if (licensefile.open(QIODevice::ReadOnly|QIODevice::Text)) {
if(licensefile.open(QIODevice::ReadOnly|QIODevice::Text)) {
te_license->setHtml(licensefile.readAll());
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) {
DeletionConfirmationDlg dlg;
if (dlg.exec() == QDialog::Accepted) {
if(dlg.exec() == QDialog::Accepted) {
*delete_local_files = dlg.shouldDeleteLocalFiles();
return true;
}

View File

@@ -50,7 +50,7 @@ DNSUpdater::DNSUpdater(QObject *parent) :
m_ipCheckTimer.start();
// Check lastUpdate to avoid flooding
if (!m_lastIPCheckTime.isValid() ||
if(!m_lastIPCheckTime.isValid() ||
m_lastIPCheckTime.secsTo(QDateTime::currentDateTime())*1000 > IP_CHECK_INTERVAL_MS) {
checkPublicIP();
}
@@ -79,19 +79,19 @@ void DNSUpdater::checkPublicIP()
void DNSUpdater::ipRequestFinished(QNetworkReply *reply)
{
qDebug() << Q_FUNC_INFO;
if (reply->error()) {
if(reply->error()) {
// Error
qWarning() << Q_FUNC_INFO << "Error:" << reply->errorString();
} else {
// Parse response
QRegExp ipregex("Current IP Address:\\s+([^<]+)</body>");
QString ret = reply->readAll();
if (ipregex.indexIn(ret) >= 0) {
if(ipregex.indexIn(ret) >= 0) {
QString ip_str = ipregex.cap(1);
qDebug() << Q_FUNC_INFO << "Regular expression captured the following IP:" << ip_str;
QHostAddress new_ip(ip_str);
if (!new_ip.isNull()) {
if (m_lastIP != new_ip) {
if(!new_ip.isNull()) {
if(m_lastIP != new_ip) {
qDebug() << Q_FUNC_INFO << "The IP address changed, report the change to DynDNS...";
qDebug() << m_lastIP.toString() << "->" << new_ip.toString();
m_lastIP = new_ip;
@@ -157,7 +157,7 @@ QUrl DNSUpdater::getUpdateUrl() const
void DNSUpdater::ipUpdateFinished(QNetworkReply *reply)
{
if (reply->error()) {
if(reply->error()) {
// Error
qWarning() << Q_FUNC_INFO << "Error:" << reply->errorString();
} else {
@@ -174,11 +174,11 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
qDebug() << Q_FUNC_INFO << reply;
QString code = reply.split(" ").first();
qDebug() << Q_FUNC_INFO << "Code:" << code;
if (code == "good" || code == "nochg") {
QBtSession::instance()->addConsoleMessage(tr("Your dynamic DNS was successfully updated."), "green");
if(code == "good" || code == "nochg") {
QBtSession::instance()->addConsoleMessage(tr("Your dynamic DNS was successfuly updated."), "green");
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."),
"red");
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
m_ipCheckTimer.stop();
m_lastIP.clear();
if (code == "nohost") {
if(code == "nohost") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: hostname supplied does not exist under specified account."),
"red");
m_state = INVALID_CREDS;
return;
}
if (code == "badauth") {
if(code == "badauth") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: Invalid username/password."), "red");
m_state = INVALID_CREDS;
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."),
"red");
m_state = FATAL;
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"),
"red");
m_state = FATAL;
return;
}
if (code == "abuse") {
if(code == "abuse") {
QBtSession::instance()->addConsoleMessage(tr("Dynamic DNS error: Your username was blocked due to abuse."),
"red");
m_state = FATAL;
@@ -221,18 +221,18 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
void DNSUpdater::updateCredentials()
{
if (m_state == FATAL) return;
if(m_state == FATAL) return;
Preferences pref;
bool change = false;
// Get DNS service information
if (m_service != pref.getDynDNSService()) {
if(m_service != pref.getDynDNSService()) {
m_service = pref.getDynDNSService();
change = true;
}
if (m_domain != pref.getDynDomainName()) {
if(m_domain != pref.getDynDomainName()) {
m_domain = pref.getDynDomainName();
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."),
"red");
m_lastIP.clear();
@@ -242,9 +242,9 @@ void DNSUpdater::updateCredentials()
}
change = true;
}
if (m_username != pref.getDynDNSUsername()) {
if(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."),
"red");
m_lastIP.clear();
@@ -254,9 +254,9 @@ void DNSUpdater::updateCredentials()
}
change = true;
}
if (m_password != pref.getDynDNSPassword()) {
if(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."),
"red");
m_lastIP.clear();
@@ -267,7 +267,7 @@ void DNSUpdater::updateCredentials()
change = true;
}
if (m_state == INVALID_CREDS && change) {
if(m_state == INVALID_CREDS && change) {
m_state = OK; // Try again
m_ipCheckTimer.start();
checkPublicIP();

View File

@@ -43,38 +43,38 @@ class downloadFromURL : public QDialog, private Ui::downloadFromURL{
Q_OBJECT
public:
downloadFromURL(QWidget *parent): QDialog(parent) {
downloadFromURL(QWidget *parent): QDialog(parent){
setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
setModal(true);
show();
// Paste clipboard if there is an URL in it
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);
}
}
~downloadFromURL() {}
~downloadFromURL(){}
signals:
void urlsReadyToBeDownloaded(const QStringList& torrent_urls);
public slots:
void on_downloadButton_clicked() {
void on_downloadButton_clicked(){
QString urls = textUrls->toPlainText();
QStringList url_list = urls.split(QString::fromUtf8("\n"));
QString url;
QStringList url_list_cleaned;
foreach (url, url_list) {
foreach(url, url_list){
url = url.trimmed();
if (!url.isEmpty()) {
if (url_list_cleaned.indexOf(QRegExp(url, Qt::CaseInsensitive, QRegExp::FixedString)) < 0) {
if(!url.isEmpty()){
if(url_list_cleaned.indexOf(QRegExp(url, Qt::CaseInsensitive, QRegExp::FixedString)) < 0){
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."));
return;
}
@@ -83,7 +83,7 @@ class downloadFromURL : public QDialog, private Ui::downloadFromURL{
close();
}
void on_cancelButton_clicked() {
void on_cancelButton_clicked(){
close();
}
};

View File

@@ -32,6 +32,7 @@
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkProxy>
#include <QNetworkCookie>
#include <QNetworkCookieJar>
#include "downloadthread.h"
@@ -54,7 +55,7 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
QString url = reply->url().toString();
qDebug("Download finished: %s", qPrintable(url));
// Check if the request was successful
if (reply->error() != QNetworkReply::NoError) {
if(reply->error() != QNetworkReply::NoError) {
// Failure
qDebug("Download failure (%s), reason: %s", qPrintable(url), qPrintable(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
const QVariant redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (redirection.isValid()) {
if(redirection.isValid()) {
// We should redirect
QUrl newUrl = redirection.toUrl();
// Resolve relative urls
@@ -77,7 +78,7 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
return;
}
// Checking if it was redirected, restoring initial URL
if (m_redirectMapping.contains(url)) {
if(m_redirectMapping.contains(url)) {
url = m_redirectMapping.take(url);
}
// Success
@@ -86,7 +87,7 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
if (tmpfile->open()) {
QString filePath = tmpfile->fileName();
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
tmpfile->write(reply->readAll());
tmpfile->close();
@@ -108,21 +109,39 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
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
QNetworkReply *reply = downloadUrl(url, cookies);
QNetworkReply *reply = downloadUrl(url);
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
applyProxySettings();
// Set cookies
if (!cookies.empty()) {
qDebug("Setting %d cookies for url: %s", cookies.size(), qPrintable(url));
m_networkManager.cookieJar()->setCookiesFromUrl(cookies, url);
}
#ifndef DISABLE_GUI
// Load cookies
QString host_name = QUrl::fromEncoded(url.toUtf8()).host();
if(!host_name.isEmpty())
loadCookies(host_name, url);
#endif
// Process download request
qDebug("url is %s", qPrintable(url));
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");
qDebug("Downloading %s...", request.url().toEncoded().data());
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("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) {
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
if (!reply) return;
if (bytesTotal > 0) {
if(!reply) return;
if(bytesTotal > 0) {
// Total number of bytes is available
if (bytesTotal > 1048576) {
if(bytesTotal > 1048576) {
// More than 1MB, this is probably not a torrent file, aborting...
reply->abort();
reply->deleteLater();
@@ -152,7 +171,7 @@ void DownloadThread::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal)
disconnect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
}
} else {
if (bytesReceived > 1048576) {
if(bytesReceived > 1048576) {
// More than 1MB, this is probably not a torrent file, aborting...
reply->abort();
reply->deleteLater();
@@ -163,13 +182,13 @@ void DownloadThread::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal)
void DownloadThread::applyProxySettings() {
QNetworkProxy proxy;
const Preferences pref;
if (pref.isProxyEnabled()) {
if(pref.isProxyEnabled()) {
// Proxy enabled
proxy.setHostName(pref.getProxyIp());
proxy.setPort(pref.getProxyPort());
// Default proxy type is HTTP, we must change if it is SOCKS5
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";
proxy.setType(QNetworkProxy::Socks5Proxy);
} else {
@@ -177,7 +196,7 @@ void DownloadThread::applyProxySettings() {
proxy.setType(QNetworkProxy::HttpProxy);
}
// Authentication?
if (pref.isProxyAuthEnabled()) {
if(pref.isProxyAuthEnabled()) {
qDebug("Proxy requires authentication, authenticating");
proxy.setUser(pref.getProxyUsername());
proxy.setPassword(pref.getProxyPassword());
@@ -189,7 +208,7 @@ void DownloadThread::applyProxySettings() {
}
QString DownloadThread::errorCodeToString(QNetworkReply::NetworkError status) {
switch(status) {
switch(status){
case QNetworkReply::HostNotFoundError:
return tr("The remote host name was not found (invalid hostname)");
case QNetworkReply::OperationCanceledError:

View File

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

View File

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

View File

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

View File

@@ -21,7 +21,6 @@
#endif
#endif
#include "fs_utils.h"
#include "misc.h"
#ifndef CIFS_MAGIC_NUMBER
@@ -60,11 +59,11 @@ private:
private:
static bool isNetworkFileSystem(QString path) {
QString file = path;
if (!file.endsWith(QDir::separator()))
if(!file.endsWith(QDir::separator()))
file += QDir::separator();
file += ".";
struct statfs buf;
if (!statfs(file.toLocal8Bit().constData(), &buf)) {
if(!statfs(file.toLocal8Bit().constData(), &buf)) {
#ifdef Q_WS_MAC
// 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);
@@ -119,23 +118,23 @@ private:
public:
FileSystemWatcher(QObject *parent): QFileSystemWatcher(parent) {
m_filters << "*.torrent" << "*.magnet";
m_filters << "*.torrent";
connect(this, SIGNAL(directoryChanged(QString)), this, SLOT(scanLocalFolder(QString)));
}
~FileSystemWatcher() {
#ifndef Q_WS_WIN
if (watch_timer)
if(watch_timer)
delete watch_timer;
#endif
if (m_partialTorrentTimer)
if(m_partialTorrentTimer)
delete m_partialTorrentTimer;
}
QStringList directories() const {
QStringList dirs;
#ifndef Q_WS_WIN
if (watch_timer) {
if(watch_timer) {
foreach (const QDir &dir, watched_folders)
dirs << dir.canonicalPath();
}
@@ -150,7 +149,7 @@ public:
if (!dir.exists())
return;
// Check if the path points to a network file system or not
if (isNetworkFileSystem(path)) {
if(isNetworkFileSystem(path)) {
// Network mode
qDebug("Network folder detected: %s", qPrintable(path));
qDebug("Using file polling mode instead of inotify...");
@@ -195,7 +194,7 @@ protected slots:
// Local folders scan
addTorrentsFromDir(QDir(path), torrents);
// Report detected torrent files
if (!torrents.empty()) {
if(!torrents.empty()) {
qDebug("The following files are being reported: %s", qPrintable(torrents.join("\n")));
emit torrentsAdded(torrents);
}
@@ -211,7 +210,7 @@ protected slots:
addTorrentsFromDir(dir, torrents);
}
// Report detected torrent files
if (!torrents.empty()) {
if(!torrents.empty()) {
qDebug("The following files are being reported: %s", qPrintable(torrents.join("\n")));
emit torrentsAdded(torrents);
}
@@ -222,16 +221,16 @@ protected slots:
QStringList no_longer_partial;
// Check which torrents are still partial
foreach (const QString& torrent_path, m_partialTorrents.keys()) {
if (!QFile::exists(torrent_path)) {
foreach(const QString& torrent_path, m_partialTorrents.keys()) {
if(!QFile::exists(torrent_path)) {
m_partialTorrents.remove(torrent_path);
continue;
}
if (fsutils::isValidTorrentFile(torrent_path)) {
if(misc::isValidTorrentFile(torrent_path)) {
no_longer_partial << torrent_path;
m_partialTorrents.remove(torrent_path);
} else {
if (m_partialTorrents[torrent_path] >= MAX_PARTIAL_RETRIES) {
if(m_partialTorrents[torrent_path] >= MAX_PARTIAL_RETRIES) {
m_partialTorrents.remove(torrent_path);
QFile::rename(torrent_path, torrent_path+".invalid");
} else {
@@ -241,7 +240,7 @@ protected slots:
}
// Stop the partial timer if necessary
if (m_partialTorrents.empty()) {
if(m_partialTorrents.empty()) {
m_partialTorrentTimer->stop();
m_partialTorrentTimer->deleteLater();
qDebug("No longer any partial torrent.");
@@ -250,7 +249,7 @@ protected slots:
m_partialTorrentTimer->start(WATCH_INTERVAL);
}
// Notify of new torrents
if (!no_longer_partial.isEmpty())
if(!no_longer_partial.isEmpty())
emit torrentsAdded(no_longer_partial);
}
@@ -260,7 +259,7 @@ signals:
private:
void startPartialTorrentTimer() {
Q_ASSERT(!m_partialTorrents.isEmpty());
if (!m_partialTorrentTimer) {
if(!m_partialTorrentTimer) {
m_partialTorrentTimer = new QTimer();
connect(m_partialTorrentTimer, SIGNAL(timeout()), SLOT(processPartialTorrents()));
m_partialTorrentTimer->setSingleShot(true);
@@ -270,25 +269,19 @@ private:
void addTorrentsFromDir(const QDir &dir, QStringList &torrents) {
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);
if (file_abspath.endsWith(".magnet")) {
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)) {
if(misc::isValidTorrentFile(file_abspath)) {
torrents << file_abspath;
} else {
if (!m_partialTorrents.contains(file_abspath)) {
if(!m_partialTorrents.contains(file_abspath)) {
qDebug("Partial torrent detected at: %s", qPrintable(file_abspath));
qDebug("Delay the file's processing...");
m_partialTorrents.insert(file_abspath, 0);
}
}
}
if (!m_partialTorrents.empty())
if(!m_partialTorrents.empty())
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 <QChar>
#include "fs_utils.h"
#include "misc.h"
using namespace libtorrent;
QString GeoIPManager::geoipFolder(bool embedded) {
#ifdef WITH_GEOIP_EMBEDDED
if (embedded)
if(embedded)
return ":/geoip/";
return fsutils::QDesktopServicesDataLocation()+"geoip"+QDir::separator();
return misc::QDesktopServicesDataLocation()+"geoip"+QDir::separator();
#else
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/";
if (QFile::exists("/var/lib/GeoIP/GeoIP.dat"))
if(QFile::exists("/var/lib/GeoIP/GeoIP.dat"))
return "/var/lib/GeoIP/";
return "/usr/share/GeoIP/";
#endif
@@ -89,22 +89,22 @@ QString GeoIPManager::geoipDBpath(bool embedded) {
#ifdef WITH_GEOIP_EMBEDDED
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...");
// Create geoip folder is necessary
QDir gfolder(geoipFolder(false));
if (!gfolder.exists()) {
if (!gfolder.mkpath(geoipFolder(false))) {
if(!gfolder.exists()) {
if(!gfolder.mkpath(geoipFolder(false))) {
std::cerr << "Failed to create geoip folder at " << qPrintable(geoipFolder(false)) << std::endl;
return;
}
}
// Remove destination files
if (QFile::exists(geoipDBpath(false)))
fsutils::forceRemove(geoipDBpath(false));
if(QFile::exists(geoipDBpath(false)))
misc::safeRemove(geoipDBpath(false));
// Copy from executable to hard disk
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;
}
qDebug("Local Geoip database was updated");
@@ -116,7 +116,7 @@ void GeoIPManager::loadDatabase(session *s) {
#ifdef WITH_GEOIP_EMBEDDED
exportEmbeddedDb();
#endif
if (QFile::exists(geoipDBpath(false))) {
if(QFile::exists(geoipDBpath(false))) {
qDebug("Loading GeoIP database from %s...", qPrintable(geoipDBpath(false)));
s->load_country_db(geoipDBpath(false).toLocal8Bit().constData());
} else {
@@ -183,9 +183,9 @@ const char * country_name[253] =
"Saint Barthelemy","Saint Martin"};
QString GeoIPManager::CountryISOCodeToName(const char* iso) {
if (iso[0] == 0) return "N/A";
for (uint i = 0; i < num_countries; ++i) {
if (iso[0] == country_code[i][0] && iso[1] == country_code[i][1]) {
if(iso[0] == 0) return "N/A";
for(uint i = 0; i < num_countries; ++i) {
if(iso[0] == country_code[i][0] && iso[1] == country_code[i][1]) {
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
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();
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("The Web UI administrator user name is: %1").arg(pref.getWebUiUsername())) << std::endl;
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("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 parameter type.
void processParams(const QStringList& params) {
foreach (QString param, params) {
foreach(QString param, params) {
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);
}else{
if (param.startsWith("bc://bt/", Qt::CaseInsensitive)) {
if(param.startsWith("bc://bt/", Qt::CaseInsensitive)) {
qDebug("Converting bc link to magnet link");
param = misc::bcLinkToMagnet(param);
}
if (param.startsWith("magnet:", Qt::CaseInsensitive)) {
if(param.startsWith("magnet:", Qt::CaseInsensitive)) {
QBtSession::instance()->addMagnetUri(param);
} else {
QBtSession::instance()->addTorrent(param);

View File

@@ -44,7 +44,7 @@ public:
protected:
void tabInserted(int index) {
QTabWidget::tabInserted(index);
if (count() == 1) {
if(count() == 1) {
showTabBar(false);
} else {
showTabBar(true);
@@ -53,7 +53,7 @@ protected:
void tabRemoved(int index) {
QTabWidget::tabInserted(index);
if (count() == 1) {
if(count() == 1) {
showTabBar(false);
} else {
showTabBar(true);

View File

@@ -35,21 +35,21 @@ IconProvider* IconProvider::m_instance = 0;
IconProvider::IconProvider()
{
#if defined(Q_WS_X11)
#if defined(Q_WS_X11) && (QT_VERSION >= QT_VERSION_CHECK(4,6,0))
m_useSystemTheme = Preferences().useSystemIconTheme();
#endif
}
IconProvider * IconProvider::instance()
{
if (!m_instance)
if(!m_instance)
m_instance = new IconProvider;
return m_instance;
}
void IconProvider::drop()
{
if (m_instance) {
if(m_instance) {
delete m_instance;
m_instance = 0;
}
@@ -57,8 +57,8 @@ void IconProvider::drop()
QIcon IconProvider::getIcon(const QString &iconId)
{
#if defined(Q_WS_X11)
if (m_useSystemTheme) {
#if defined(Q_WS_X11) && (QT_VERSION >= QT_VERSION_CHECK(4,6,0))
if(m_useSystemTheme) {
QIcon icon = QIcon::fromTheme(iconId, QIcon(":/Icons/oxygen/"+iconId+".png"));
icon = generateDifferentSizes(icon);
return icon;
@@ -67,7 +67,7 @@ QIcon IconProvider::getIcon(const QString &iconId)
return QIcon(":/Icons/oxygen/"+iconId+".png");
}
#if defined(Q_WS_X11)
#if defined(Q_WS_X11) && (QT_VERSION >= QT_VERSION_CHECK(4,6,0))
void IconProvider::useSystemIconTheme(bool enable)
{
m_useSystemTheme = enable;
@@ -77,21 +77,21 @@ void IconProvider::useSystemIconTheme(bool enable)
// It scales the icon from the theme if necessary
// Otherwise, the UI looks broken if the icon is not available
// in the correct size.
QIcon IconProvider::generateDifferentSizes(const QIcon& icon)
QIcon IconProvider::generateDifferentSizes(const QIcon &icon)
{
QIcon new_icon;
QList<QSize> required_sizes;
required_sizes << QSize(16, 16) << QSize(24, 24);
QList<QIcon::Mode> modes;
modes << QIcon::Normal << QIcon::Active << QIcon::Selected << QIcon::Disabled;
foreach (const QSize& size, required_sizes) {
foreach (QIcon::Mode mode, modes) {
foreach(const QSize& size, required_sizes) {
foreach(QIcon::Mode mode, modes) {
QPixmap pixoff = icon.pixmap(size, mode, QIcon::Off);
if (pixoff.height() > size.height())
if(pixoff.height() > size.height())
pixoff = pixoff.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
new_icon.addPixmap(pixoff, mode, QIcon::Off);
QPixmap pixon = icon.pixmap(size, mode, QIcon::On);
if (pixon.height() > size.height())
if(pixon.height() > size.height())
pixon = pixoff.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
new_icon.addPixmap(pixon, mode, QIcon::On);
}
@@ -100,14 +100,14 @@ QIcon IconProvider::generateDifferentSizes(const QIcon& icon)
}
#endif
QString IconProvider::getIconPath(const QString& iconId)
QString IconProvider::getIconPath(const QString &iconId)
{
#if defined(Q_WS_X11)
if (m_useSystemTheme) {
#if defined(Q_WS_X11) && (QT_VERSION >= QT_VERSION_CHECK(4,6,0))
if(m_useSystemTheme) {
QString path = QDir::temp().absoluteFilePath(iconId+".png");
if (!QFile::exists(path)) {
if(!QFile::exists(path)) {
const QIcon icon = QIcon::fromTheme(iconId);
if (icon.isNull()) return ":/Icons/oxygen/"+iconId+".png";
if(icon.isNull()) return ":/Icons/oxygen/"+iconId+".png";
QPixmap px = icon.pixmap(32);
px.save(path);
}

View File

@@ -46,9 +46,9 @@ public:
static IconProvider* instance();
static void drop();
QIcon getIcon(const QString& iconId);
QString getIconPath(const QString& iconId);
QString getIconPath(const QString &iconId);
#if defined(Q_WS_X11)
#if defined(Q_WS_X11) && (QT_VERSION >= QT_VERSION_CHECK(4,6,0))
public:
void useSystemIconTheme(bool enable);

File diff suppressed because it is too large Load Diff

View File

@@ -1,41 +1,40 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>lang/qbittorrent_ar.qm</file>
<file>lang/qbittorrent_be.qm</file>
<file>lang/qbittorrent_bg.qm</file>
<file>lang/qbittorrent_ca.qm</file>
<file>lang/qbittorrent_cs.qm</file>
<file>lang/qbittorrent_da.qm</file>
<file>lang/qbittorrent_de.qm</file>
<file>lang/qbittorrent_el.qm</file>
<file>lang/qbittorrent_en.qm</file>
<file>lang/qbittorrent_es.qm</file>
<file>lang/qbittorrent_eu.qm</file>
<file>lang/qbittorrent_fi.qm</file>
<file>lang/qbittorrent_fr.qm</file>
<file>lang/qbittorrent_gl.qm</file>
<file>lang/qbittorrent_he.qm</file>
<file>lang/qbittorrent_hr.qm</file>
<file>lang/qbittorrent_hu.qm</file>
<file>lang/qbittorrent_hy.qm</file>
<file>lang/qbittorrent_it.qm</file>
<file>lang/qbittorrent_ja.qm</file>
<file>lang/qbittorrent_ka.qm</file>
<file>lang/qbittorrent_ko.qm</file>
<file>lang/qbittorrent_lt.qm</file>
<file>lang/qbittorrent_nb.qm</file>
<file>lang/qbittorrent_nl.qm</file>
<file>lang/qbittorrent_pl.qm</file>
<file>lang/qbittorrent_pt.qm</file>
<file>lang/qbittorrent_pt_BR.qm</file>
<file>lang/qbittorrent_ro.qm</file>
<file>lang/qbittorrent_hu.qm</file>
<file>lang/qbittorrent_ru.qm</file>
<file>lang/qbittorrent_sk.qm</file>
<file>lang/qbittorrent_sr.qm</file>
<file>lang/qbittorrent_sv.qm</file>
<file>lang/qbittorrent_zh_TW.qm</file>
<file>lang/qbittorrent_tr.qm</file>
<file>lang/qbittorrent_fi.qm</file>
<file>lang/qbittorrent_sk.qm</file>
<file>lang/qbittorrent_ja.qm</file>
<file>lang/qbittorrent_el.qm</file>
<file>lang/qbittorrent_ca.qm</file>
<file>lang/qbittorrent_pt.qm</file>
<file>lang/qbittorrent_it.qm</file>
<file>lang/qbittorrent_fr.qm</file>
<file>lang/qbittorrent_uk.qm</file>
<file>lang/qbittorrent_zh.qm</file>
<file>lang/qbittorrent_zh_TW.qm</file>
<file>lang/qbittorrent_lt.qm</file>
<file>lang/qbittorrent_ko.qm</file>
<file>lang/qbittorrent_nb.qm</file>
<file>lang/qbittorrent_sv.qm</file>
<file>lang/qbittorrent_de.qm</file>
<file>lang/qbittorrent_gl.qm</file>
<file>lang/qbittorrent_sr.qm</file>
<file>lang/qbittorrent_pt_BR.qm</file>
<file>lang/qbittorrent_da.qm</file>
<file>lang/qbittorrent_cs.qm</file>
<file>lang/qbittorrent_hy.qm</file>
<file>lang/qbittorrent_pl.qm</file>
<file>lang/qbittorrent_bg.qm</file>
<file>lang/qbittorrent_ar.qm</file>
<file>lang/qbittorrent_es.qm</file>
<file>lang/qbittorrent_en.qm</file>
<file>lang/qbittorrent_hr.qm</file>
<file>lang/qbittorrent_ro.qm</file>
<file>lang/qbittorrent_ka.qm</file>
<file>lang/qbittorrent_be.qm</file>
<file>lang/qbittorrent_eu.qm</file>
</qresource>
</RCC>
</RCC>

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