Compare commits
20 Commits
release-4.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
22f0f20a45 | ||
![]() |
b1d8fb0f11 | ||
![]() |
78fc5d4865 | ||
![]() |
19996736d6 | ||
![]() |
6f9d22af03 | ||
![]() |
6b6d05a380 | ||
![]() |
df92e3e5e9 | ||
![]() |
26b6c26ea8 | ||
![]() |
1b6183bfa3 | ||
![]() |
7edbaa3847 | ||
![]() |
2ee152a374 | ||
![]() |
bc8ac43a54 | ||
![]() |
5f48a51070 | ||
![]() |
c3a6b24ed1 | ||
![]() |
c3b22c9a01 | ||
![]() |
5d09ace7eb | ||
![]() |
fe37724338 | ||
![]() |
8aaacbe38d | ||
![]() |
edc625c9c9 | ||
![]() |
6ae21c2919 |
2
AUTHORS
@@ -1,5 +1,5 @@
|
|||||||
Author:
|
Author:
|
||||||
* Christophe Dumez <chris@qbittorrent.org>
|
* Christophe Dumez <chris@qbittorrent.org>
|
||||||
|
|
||||||
Other developers:
|
Contributors:
|
||||||
* Arnaud Demaizière <arnaud@qbittorrent.org>
|
* Arnaud Demaizière <arnaud@qbittorrent.org>
|
||||||
|
22
Changelog
@@ -5,6 +5,8 @@
|
|||||||
- FEATURE: Bittorrent FAST extension support
|
- FEATURE: Bittorrent FAST extension support
|
||||||
- FEATURE: Added RSS support
|
- FEATURE: Added RSS support
|
||||||
- FEATURE: Support files prioritizing in a torrent
|
- FEATURE: Support files prioritizing in a torrent
|
||||||
|
- FEATURE: Brand new search engine plugins system
|
||||||
|
- FEATURE: Filtered files don't appear on hard disk anymore
|
||||||
- FEATURE: Finished torrents are now moved to another tab for seeding
|
- FEATURE: Finished torrents are now moved to another tab for seeding
|
||||||
- FEATURE: Display more infos about the torrent in its properties
|
- FEATURE: Display more infos about the torrent in its properties
|
||||||
- FEATURE: Allow the user to edit torrents' trackers
|
- FEATURE: Allow the user to edit torrents' trackers
|
||||||
@@ -30,9 +32,20 @@
|
|||||||
- FEATURE: User is now warned when fast resume data was rejected
|
- FEATURE: User is now warned when fast resume data was rejected
|
||||||
- FEATURE: Url seeds are now displayed in torrent properties and are editable
|
- FEATURE: Url seeds are now displayed in torrent properties and are editable
|
||||||
- FEATURE: Allow to drag 'n drop urls on the main window
|
- FEATURE: Allow to drag 'n drop urls on the main window
|
||||||
|
- FEATURE: Improved search engine (multipage support in all plugins)
|
||||||
|
- FEATURE: Added BTJunkie search engine plugin
|
||||||
|
- FEATURE: Added an option to force full disk allocation for all torrents
|
||||||
|
- FEATURE: Added an option to add torrents in paused state
|
||||||
|
- FEATURE: Added an option to set the max number of connections per torrent
|
||||||
|
- FEATURE: Added an option to set the max number of uploads per torrent
|
||||||
|
- FEATURE: Added an option to automatically delete torrents when they reach a given ratio (>= 1.0)
|
||||||
|
- FEATURE: Added an option to display current transfer speeds in title bar
|
||||||
|
- FEATURE: Torrent content is now displayed as a tree
|
||||||
|
- FEATURE: Better media file preview (player detected automatically)
|
||||||
- I18N: Added Hungarian translation
|
- I18N: Added Hungarian translation
|
||||||
- I18N: Added Brazilian translation
|
- I18N: Added Brazilian translation
|
||||||
- BUGFIX: Progress of paused torrents is now correct on restart
|
- BUGFIX: Progress of paused torrents is now correct on restart
|
||||||
|
- BUGFIX: clear the results of a search stops searching
|
||||||
- BUGFIX: Progress column gets sorted on restart it is was during last execution
|
- BUGFIX: Progress column gets sorted on restart it is was during last execution
|
||||||
- BUGFIX: Made ETA more reliable using stats instead of instant values
|
- BUGFIX: Made ETA more reliable using stats instead of instant values
|
||||||
- BUGFIX: Remove torrent from hard drive used to delete parent folder if empty
|
- BUGFIX: Remove torrent from hard drive used to delete parent folder if empty
|
||||||
@@ -52,11 +65,18 @@
|
|||||||
- BUGFIX: Made torrent deletion from hard-drive safer
|
- BUGFIX: Made torrent deletion from hard-drive safer
|
||||||
- BUGFIX: Prevent downloadFromUrl flooding
|
- BUGFIX: Prevent downloadFromUrl flooding
|
||||||
- BUGFIX: ETA was wrong for torrents with filtered files
|
- BUGFIX: ETA was wrong for torrents with filtered files
|
||||||
|
- BUGFIX: Fixed drag'n drop on non-KDE systems
|
||||||
|
- BUGFIX: Removed build dependency on Python
|
||||||
|
- BUGFIX: Catching DHT exception in case there is a problem
|
||||||
|
- BUGFIX: Remember properties window size and position
|
||||||
|
- BUGFIX: Improved proxy support in search engine (HTTP only)
|
||||||
- COSMETIC: Redesigned torrent properties a little
|
- COSMETIC: Redesigned torrent properties a little
|
||||||
- COSMETIC: Redesigned options a little
|
- COSMETIC: Totally redesigned program preferences
|
||||||
- COSMETIC: Display more logs messages concerning features
|
- COSMETIC: Display more logs messages concerning features
|
||||||
- COSMETIC: Improved lists renderers
|
- COSMETIC: Improved lists renderers
|
||||||
- COSMETIC: Use a different icon for torrents being checked and for connecting ones
|
- COSMETIC: Use a different icon for torrents being checked and for connecting ones
|
||||||
|
- COSMETIC: Improved some icons
|
||||||
|
- COSMETIC: Improved systray tooltip style
|
||||||
|
|
||||||
* Mon May 07 2007 - Christophe Dumez <chris@qbittorrent.org> - v0.9.3
|
* Mon May 07 2007 - Christophe Dumez <chris@qbittorrent.org> - v0.9.3
|
||||||
- BUGFIX: Fixed pause toggle on double-click in download list
|
- BUGFIX: Fixed pause toggle on double-click in download list
|
||||||
|
23
INSTALL
@@ -1,4 +1,4 @@
|
|||||||
qBittorrent - A BitTorrent client in C++ / Qt4.2
|
qBittorrent - A BitTorrent client in C++ / Qt4
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|
||||||
*** Necessary if qt3 is default on your system ***
|
*** Necessary if qt3 is default on your system ***
|
||||||
@@ -14,25 +14,30 @@ qbittorrent
|
|||||||
will install and execute qBittorrent hopefully without any problems.
|
will install and execute qBittorrent hopefully without any problems.
|
||||||
|
|
||||||
Dependencies:
|
Dependencies:
|
||||||
- Qt >= 4.2 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||||
|
|
||||||
- libtorrent by Arvid Norberg (>= v0.13 REQUIRED)
|
- rblibtorrent by Arvid Norberg (>= v0.13 REQUIRED)
|
||||||
|
-> http://www.qbittorrent.org/download.php (advised)
|
||||||
-> http://www.libtorrent.net
|
-> http://www.libtorrent.net
|
||||||
Be carefull: another library (the one used by rtorrent) use the same name.
|
Be careful: another library (the one used by rTorrent) use the same name.
|
||||||
These are TWO different libraries and qBittorrent will only work with the one provided
|
These are TWO different libraries and qBittorrent will only work with the one provided
|
||||||
on sourceforge (created by Arvid Norberg). The two libraries conflicts with each other.
|
on sourceforge (created by Arvid Norberg). The two libraries conflicts with each other.
|
||||||
|
|
||||||
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
|
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
|
||||||
|
|
||||||
- libcommoncpp2
|
- libcurl
|
||||||
|
|
||||||
- python >= 2.3 (previous might work - not tested): needed by search engine.
|
- python >= 2.3 (needed by search engine)
|
||||||
|
|
||||||
- libmagick++ (advised, not required)
|
- libmagick++ (advised, not required)
|
||||||
|
* Needed for favicons support (RSS / Search plugins)
|
||||||
|
|
||||||
NOTE FOR GNOME USERS:
|
- libzzip (advised, not required)
|
||||||
- qt4-qtconfig package is advised when using Plastique style (default)
|
* Needed for zip support (Search plugins)
|
||||||
or just change qBittorrent style to Cleanlooks (GNOME like)
|
|
||||||
|
NOTE FOR NON-KDE USERS:
|
||||||
|
- qt4-qtconfig package is advised when using other systems than KDE.
|
||||||
|
You can also change qBittorrent style to Cleanlooks (GNOME like)
|
||||||
|
|
||||||
DOCUMENTATION:
|
DOCUMENTATION:
|
||||||
Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
|
Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
|
||||||
|
14
README
@@ -3,30 +3,30 @@ qBittorrent - A BitTorrent client in Qt4
|
|||||||
|
|
||||||
Description:
|
Description:
|
||||||
********************************
|
********************************
|
||||||
qBittorrent is a bittorrent client programmed in C++ / Qt4 that use
|
qBittorrent is a bittorrent client programmed in C++ / Qt4 that uses
|
||||||
libtorrent (sometimes called rb_libtorrent) by Arvid Norberg.
|
libtorrent (sometimes called rblibtorrent) by Arvid Norberg.
|
||||||
|
|
||||||
It aims to be a good alternative to all other bittorrent clients
|
It aims to be a good alternative to all other bittorrent clients
|
||||||
out there. qBittorrent is fast, stable and provides unicode
|
out there. qBittorrent is fast, stable and provides unicode
|
||||||
support.
|
support as well as many features.
|
||||||
|
|
||||||
Installation:
|
Installation:
|
||||||
********************************
|
********************************
|
||||||
For installation follow the instructions from INSTALL file, but simple
|
For installation, follow the instructions from INSTALL file, but simple:
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
make && make install
|
make && make install
|
||||||
qbittorrent
|
qbittorrent
|
||||||
|
|
||||||
will install and execute qBittorrent hopefully without any problems.
|
will install and execute qBittorrent hopefully without any problem.
|
||||||
|
|
||||||
For more information please visit:
|
For more information please visit:
|
||||||
http://www.qbittorrent.org
|
http://www.qbittorrent.org
|
||||||
|
|
||||||
Please report any bug (or feature requests) to:
|
Please report any bug (or feature request) to:
|
||||||
http://bugs.qbittorrent.org
|
http://bugs.qbittorrent.org
|
||||||
|
|
||||||
You can also meet me on IRC:
|
You can also meet me (chris-qBT) on IRC:
|
||||||
#qbittorrent on irc.freenode.net
|
#qbittorrent on irc.freenode.net
|
||||||
|
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
114
TODO
@@ -1,98 +1,68 @@
|
|||||||
// Easy
|
// Easy
|
||||||
- Translations into as many languages as possible
|
- Translations into as many languages as possible
|
||||||
- Improve man page
|
|
||||||
- Use Launchpad/Rosetta for translations once it supports TS files
|
- Use Launchpad/Rosetta for translations once it supports TS files
|
||||||
|
|
||||||
// Intermediate
|
// Intermediate
|
||||||
- Port on MacOS, Windows (and create an installer for Windows) - Progressing slowly
|
- Port on MacOS, Windows (and create an installer for Windows) - Slow progress
|
||||||
- Add some transparency (menus,...), improve look
|
- Add some transparency (menus,...), improve look / usabilty
|
||||||
|
- Skins support? (contact Mateusz)
|
||||||
|
|
||||||
// Harder
|
// Harder
|
||||||
- Display a progress bar that really displays the pieces we have (like in eMule)
|
- Torrent scheduler ala µtorrent/Bitcomet
|
||||||
|
|
||||||
// Waiting for libtorrent
|
// Waiting for libtorrent
|
||||||
- File selection in a torrent in compact mode
|
- Allow to prioritize torrents (may code this in qBittorrent?)
|
||||||
- Allow to prioritize torrents
|
|
||||||
|
|
||||||
// Unsure
|
// Unsure
|
||||||
|
- Display the peers we are connected to for each torrent with infos (like flag, dl/up speeds, ...)
|
||||||
- Azureus spoofing to prevent ban from trackers?
|
- Azureus spoofing to prevent ban from trackers?
|
||||||
- Option to shutdown computer when downloads are finished
|
- Option to shutdown computer when downloads are finished
|
||||||
- Add a torrent scheduler
|
- NAT checker/Tester
|
||||||
|
- Display hard drive space left?
|
||||||
- Make use of dbus on Linux for the single instance instead of socket communication?
|
- Make use of dbus on Linux for the single instance instead of socket communication?
|
||||||
(http://techbase.kde.org/Development/Tutorials/D-Bus/Accessing_Interfaces)
|
(http://techbase.kde.org/Development/Tutorials/D-Bus/Accessing_Interfaces)
|
||||||
- search engines customizing
|
- When favicon can't be downloaded, try to parse the webpage for:
|
||||||
|
<link rel="icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon">
|
||||||
|
* Be carefull, the link can be relative
|
||||||
|
|
||||||
// in v1.2.0
|
// in v1.2.0
|
||||||
- Allow user to organize the downloads into categories/folders
|
- Allow user to organize the downloads into categories/folders?
|
||||||
|
|
||||||
// in v1.1.0
|
// in v1.1.0
|
||||||
- Tabs support in search
|
- Tabs support in search
|
||||||
- Allow to hide columns?
|
- Allow to hide columns?
|
||||||
- Allow to scan multiple directories? (useful?)
|
- Allow to scan multiple directories? (useful?)
|
||||||
- Web interface (turbogears? php?)
|
- Web interface (turbogears? php? python?)
|
||||||
|
* Webserver? Try to write a webserver as a plugin for qBittorrent in Python
|
||||||
|
* http://fragments.turtlemeat.com/pythonwebserver.php
|
||||||
- improve and test tracker authentication code (remember login/pass) (need a tracker to test this)
|
- improve and test tracker authentication code (remember login/pass) (need a tracker to test this)
|
||||||
- support zipped torrents? (useful?)
|
- support zipped torrents? (useful?)
|
||||||
- Add option for RSS customization (refresh interval, max news per RSS...)
|
|
||||||
- Allow to disable UPnP/NAT-PMP/LSD in options?
|
|
||||||
- Allow to automatically delete torrents when they reach a given ratio (in options) : easy
|
|
||||||
- Allow to limit the number of downloading torrents simultaneously (other are paused until a download finishes)
|
- Allow to limit the number of downloading torrents simultaneously (other are paused until a download finishes)
|
||||||
- Add "Mark all as read" feature for RSS
|
- Improve search plugin install (choose in a list taken from plugins.qbittorrent.org)
|
||||||
- Allow to customize lists refreshing interval (in options)
|
- Display the number of DHT node if possible
|
||||||
- Use search engines as plugins (split them, load them dynamically) to allow the user to add some
|
- When adding a duplicate torrent, check if the trackers are different from the existing one and ask the user if he wants to add them
|
||||||
|
- Display in torrent addition dialog:
|
||||||
|
* free disk space on selected drive
|
||||||
|
* free disk space after torrent download (and/or torrent size)
|
||||||
|
- Start minimized option in program preferences
|
||||||
|
- In finished list, replace "Seeds/Leechs" column by "Leechers" because Seeds are always 0.
|
||||||
|
- Allow to change action on double-click
|
||||||
|
-> in download list
|
||||||
|
-> in seeding list
|
||||||
|
|
||||||
// in v1.0.0 (partial) - WIP
|
rc8->rc9 changelog:
|
||||||
- Check storage st creation + hasher in torrent creation
|
- FEATURE: Better media file preview (player detected automatically)
|
||||||
- Fix all (or almost all) opened bugs in bug tracker
|
- BUGFIX: Remember properties window size and position
|
||||||
- update sorting when a new torrent is added?
|
- BUGFIX: Added HTTP and SOCKS5 proxy support in downloads from urls, RSS
|
||||||
- Keep documention up to date
|
- BUGFIX: Added HTTP proxy support in search engine (no SOCKS yet)
|
||||||
- Windows port (Chris - Peerkoel)
|
- BUGFIX: Do no pause torrents before saving fastresume data anymore (no longer needed)
|
||||||
- write patches libtorrent for file_priority(int index), actual_size() ?
|
- BUGFIX: Save fast resume data regularly (every 60 seconds) to avoid downloading from scratch if qBittorrent crashes
|
||||||
- valgrind --tool=memcheck --leak-check=full src/qbittorrent (Looks ok)
|
- BUGFIX: Do not save fastresume data for checking torrents anymore
|
||||||
- 128m 29m 16m S 4.8 2.9 0:02.28 qbittorrent
|
- BUGFIX: Saving trackers file only when necessary
|
||||||
* beta 6
|
- BUGFIX: Fixed possible segfault when unfiltering files in torrent addition dialog
|
||||||
- Translations update (IN PROGRESS)
|
- BUGFIX: Fixed possible overflow in ETA calculation
|
||||||
- Wait for some bug fixes in libtorrent :
|
- BUGFIX: title bar is now reset when "Display speed in title" is disabled
|
||||||
- Number of seeds non null for finished torrent (Ticket #122)
|
- BUGFIX: Fixed HTTP_PW and SOCKS5_PW in proxy combobox
|
||||||
|
- BUGFIX: Fixed proxy auth disable problem when disabling proxy
|
||||||
LANGUAGES UPDATED:
|
- BUGFIX: Fixed proxy layout in program preferences
|
||||||
- French *BETA3*
|
- BUGFIX: Fixed everlasting libtorrent session destruction on exit
|
||||||
- English *BETA3*
|
|
||||||
- Japanese *BETA3*
|
|
||||||
- Swedish *BETA3*
|
|
||||||
- Slovak *BETA3*
|
|
||||||
- Ukrainian *BETA3*
|
|
||||||
- Chinese (simplified) *BETA4*
|
|
||||||
- Hungarian *BETA4*
|
|
||||||
- Italian *BETA5*
|
|
||||||
- Polish *BETA5*
|
|
||||||
- Portuguese *BETA5*
|
|
||||||
- Brazilian *BETA5*
|
|
||||||
- Spanish *BETA5*
|
|
||||||
- German *BETA5*
|
|
||||||
- Russian *BETA5*
|
|
||||||
- Korean *BETA5*
|
|
||||||
- Greek *BETA6*
|
|
||||||
- Dutch *BETA6*
|
|
||||||
- Romanian *BETA6*
|
|
||||||
|
|
||||||
beta5->beta6 changelog:
|
|
||||||
- FEATURE: Split download tab from GUI class and cleaned up code
|
|
||||||
- FEATURE: A lot of code optimization (CPU & memory usage)
|
|
||||||
- FEATURE: Added support for .ico format (useful for RSS favicons)
|
|
||||||
- FEATURE: Replaced Meganova search engine by TorrentReactor
|
|
||||||
- I18N: Updated Greek, Dutch and Romanian translation
|
|
||||||
- I18N: Removed no longer maintained Traditional chinese translation
|
|
||||||
- BUGFIX: Made torrent deletion from hard-drive safer
|
|
||||||
- BUGFIX: Fixed a bug when switching from finished to downloading list
|
|
||||||
- BUGFIX: Showing checking progress for paused torrents too
|
|
||||||
- BUGFIX: Fixed progress column sorting on startup
|
|
||||||
- BUGFIX: Prevent downloadFromUrl flooding
|
|
||||||
- BUGFIX: Fixed pause state toggle for paused and checking torrents
|
|
||||||
- BUGFIX: Made finished list context menu more similar to the download list one
|
|
||||||
- BUGFIX: Fixed Pause/Start action in lists context menus
|
|
||||||
- BUGFIX: Improved ETA calculation
|
|
||||||
- BUGFIX: ETA was wrong for torrents with filtered files
|
|
||||||
- BUGFIX: Display the torrent that are being checked as 'checking' in seeding list
|
|
||||||
- BUGFIX: Fixed file preview and improved previewable files detection
|
|
||||||
- BUGFIX: Do not store and calculate ETA values for finished/paused torrents
|
|
||||||
- BUGFIX: Fixed memory leak in GUI
|
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<profile>qbittorrent.pro</profile>
|
<profile>qbittorrent.pro</profile>
|
||||||
<moddir>qcm</moddir>
|
<moddir>qcm</moddir>
|
||||||
<datadir/>
|
<datadir/>
|
||||||
<dep type='qt42'>
|
<dep type='qt4'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='libtorrent'>
|
<dep type='libtorrent'>
|
||||||
@@ -12,11 +12,9 @@
|
|||||||
<dep type='libboost'>
|
<dep type='libboost'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='libcommoncpp2'>
|
<dep type='libcurl'>
|
||||||
<required/>
|
|
||||||
</dep>
|
|
||||||
<dep type='libmagick'/>
|
|
||||||
<dep type='python'>
|
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
|
<dep type='libmagick'/>
|
||||||
|
<dep type='libzzip'/>
|
||||||
</qconf>
|
</qconf>
|
||||||
|
@@ -37,15 +37,17 @@ public:
|
|||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBCOMMONCPP2_LIB");
|
s = conf->getenv("QC_WITH_LIBCOMMONCPP2_LIB");
|
||||||
if(!s.isEmpty()) {
|
if(!s.isEmpty()) {
|
||||||
if(!QFile::exists(s+QString("libccext2.so")))
|
if(!QFile::exists(s+QString("/libccext2.so")))
|
||||||
return false;
|
return false;
|
||||||
if(!QFile::exists(s+QString("libccgnu2.so")))
|
if(!QFile::exists(s+QString("/libccgnu2.so")))
|
||||||
return false;
|
return false;
|
||||||
conf->addLib(QString("-L") + s);
|
conf->addLib(QString("-L") + s);
|
||||||
}else{
|
}else{
|
||||||
QStringList sl;
|
QStringList sl;
|
||||||
sl << "/usr/lib/";
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
sl << "/usr/local/lib/";
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
bool found = false;
|
bool found = false;
|
||||||
foreach(s, sl){
|
foreach(s, sl){
|
||||||
if(QFile::exists(s+QString("libccext2.so"))){
|
if(QFile::exists(s+QString("libccext2.so"))){
|
||||||
@@ -58,16 +60,6 @@ public:
|
|||||||
if(!found) return false;
|
if(!found) return false;
|
||||||
conf->addLib(QString("-L") + s);
|
conf->addLib(QString("-L") + s);
|
||||||
}
|
}
|
||||||
// BUGFIX for Fedora (doesn't support pkg-config?)
|
|
||||||
QFile issue_file("/etc/issue");
|
|
||||||
if(issue_file.open(QIODevice::ReadOnly | QIODevice::Text)){
|
|
||||||
QString content = issue_file.readAll();
|
|
||||||
issue_file.close();
|
|
||||||
if(content.indexOf("Fedora") != -1){
|
|
||||||
qWarning("Fedora detected. WORKAROUND for Fedora pkg-config problem enabled");
|
|
||||||
conf->addLib("-pthread -lccext2 -lz -lccgnu2 -ldl -lrt");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
61
qcm/libcurl.qcm
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: libcommoncpp2
|
||||||
|
arg: with-libcurl-inc=[path], Path to libcurl include files
|
||||||
|
arg: with-libcurl-lib=[path], Path to libcurl library files
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
class qc_libcurl : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_libcurl(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "libcurl"; }
|
||||||
|
QString shortname() const { return "libcurl"; }
|
||||||
|
bool exec(){
|
||||||
|
QString s;
|
||||||
|
s = conf->getenv("QC_WITH_LIBCURL_INC");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!conf->checkHeader(s, "curl/curl.h")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/include";
|
||||||
|
sl << "/usr/local/include";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(conf->checkHeader(s, "curl/curl.h")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBCURL_LIB");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!QFile::exists(s+QString("/libcurl.so")))
|
||||||
|
return false;
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(QFile::exists(s+QString("libcurl.so"))){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found) return false;
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
@@ -44,13 +44,15 @@ public:
|
|||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBMAGICK_LIB");
|
s = conf->getenv("QC_WITH_LIBMAGICK_LIB");
|
||||||
if(!s.isEmpty()) {
|
if(!s.isEmpty()) {
|
||||||
if(!QFile::exists(s+QString("libMagick++.so"))){
|
if(!QFile::exists(s+QString("/libMagick++.so"))){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
QStringList sl;
|
QStringList sl;
|
||||||
sl << "/usr/lib/";
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
sl << "/usr/local/lib/";
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
bool found = false;
|
bool found = false;
|
||||||
foreach(s, sl){
|
foreach(s, sl){
|
||||||
if(QFile::exists(s+QString("libMagick++.so"))){
|
if(QFile::exists(s+QString("libMagick++.so"))){
|
||||||
@@ -69,6 +71,7 @@ public:
|
|||||||
magickConfig.waitForStarted();
|
magickConfig.waitForStarted();
|
||||||
magickConfig.waitForFinished();
|
magickConfig.waitForFinished();
|
||||||
QByteArray result = magickConfig.readAll();
|
QByteArray result = magickConfig.readAll();
|
||||||
|
result = result.replace("\n", "");
|
||||||
conf->addLib(result.data());
|
conf->addLib(result.data());
|
||||||
conf->addDefine("HAVE_MAGICK");
|
conf->addDefine("HAVE_MAGICK");
|
||||||
return true;
|
return true;
|
||||||
|
@@ -52,7 +52,9 @@ public:
|
|||||||
}else{
|
}else{
|
||||||
QStringList sl;
|
QStringList sl;
|
||||||
sl << "/usr/lib/";
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
sl << "/usr/local/lib/";
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
bool found = false;
|
bool found = false;
|
||||||
foreach(s, sl){
|
foreach(s, sl){
|
||||||
if(conf->checkLibrary(s, "torrent")){
|
if(conf->checkLibrary(s, "torrent")){
|
||||||
@@ -63,16 +65,6 @@ public:
|
|||||||
if(!found) return false;
|
if(!found) return false;
|
||||||
conf->addLib(QString("-L") + s);
|
conf->addLib(QString("-L") + s);
|
||||||
}
|
}
|
||||||
// BUGFIX for Fedora (doesn't support pkg-config?)
|
|
||||||
QFile issue_file("/etc/issue");
|
|
||||||
if(issue_file.open(QIODevice::ReadOnly | QIODevice::Text)){
|
|
||||||
QString content = issue_file.readAll();
|
|
||||||
issue_file.close();
|
|
||||||
if(content.indexOf("Fedora") != -1){
|
|
||||||
qWarning("Fedora detected. WORKAROUND for Fedora pkg-config problem enabled");
|
|
||||||
conf->addLib("-lssl -lcrypto -lboost_date_time -lboost_filesystem -lboost_thread -lz -ltorrent");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
71
qcm/libzzip.qcm
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: libzzip
|
||||||
|
arg: with-libzzip-inc=[path], Path to libzzip++ include files
|
||||||
|
arg: with-libzzip-lib=[path], Path to libzzip++ library files
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
#include <QProcess>
|
||||||
|
class qc_libzzip : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_libzzip(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "Zzip library (libzzip)"; }
|
||||||
|
QString shortname() const { return "libzzip"; }
|
||||||
|
QString checkString() const {
|
||||||
|
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
|
||||||
|
return "";
|
||||||
|
return ConfObj::checkString();
|
||||||
|
}
|
||||||
|
bool exec(){
|
||||||
|
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
|
||||||
|
return false;
|
||||||
|
QString s;
|
||||||
|
s = conf->getenv("QC_WITH_LIBZZIP_INC");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!conf->checkHeader(s, "zzip/zzip.h")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/include";
|
||||||
|
sl << "/usr/local/include";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(conf->checkHeader(s, "zzip/zzip.h")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBZZIP_LIB");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!QFile::exists(s+QString("/libzzip.so"))){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(QFile::exists(s+QString("libzzip.so"))){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
conf->addLib("-lzzip");
|
||||||
|
conf->addDefine("HAVE_ZZIP");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
@@ -1,19 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: python
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
class qc_python : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_python(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "python >= 2.3"; }
|
|
||||||
QString shortname() const { return "python"; }
|
|
||||||
bool exec(){
|
|
||||||
int r = conf->doCommand("python testpython.py");
|
|
||||||
if(r == 0)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
16
qcm/qt4.qcm
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: Qt >= 4.3
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
class qc_qt4 : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "Qt >= 4.3"; }
|
||||||
|
QString shortname() const { return "Qt 4.3"; }
|
||||||
|
bool exec()
|
||||||
|
{
|
||||||
|
return(QT_VERSION >= 0x040300);
|
||||||
|
}
|
||||||
|
};
|
16
qcm/qt42.qcm
@@ -1,16 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: Qt >= 4.2
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
class qc_qt42 : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_qt42(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "Qt >= 4.2"; }
|
|
||||||
QString shortname() const { return "qt42"; }
|
|
||||||
bool exec()
|
|
||||||
{
|
|
||||||
return(QT_VERSION >= 0x040200);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -83,11 +83,9 @@ class DLListDelegate: public QItemDelegate {
|
|||||||
newopt.maximum = 100;
|
newopt.maximum = 100;
|
||||||
newopt.minimum = 0;
|
newopt.minimum = 0;
|
||||||
newopt.state |= QStyle::State_Enabled;
|
newopt.state |= QStyle::State_Enabled;
|
||||||
newopt.textVisible = false;
|
newopt.textVisible = true;
|
||||||
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt,
|
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt,
|
||||||
painter);
|
painter);
|
||||||
painter->setPen(QColor("Black"));
|
|
||||||
painter->drawText(opt.rect, Qt::AlignCenter, newopt.text);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@@ -76,11 +76,9 @@ class FinishedListDelegate: public QItemDelegate {
|
|||||||
newopt.maximum = 100;
|
newopt.maximum = 100;
|
||||||
newopt.minimum = 0;
|
newopt.minimum = 0;
|
||||||
newopt.state |= QStyle::State_Enabled;
|
newopt.state |= QStyle::State_Enabled;
|
||||||
newopt.textVisible = false;
|
newopt.textVisible = true;
|
||||||
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt,
|
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt,
|
||||||
painter);
|
painter);
|
||||||
painter->setPen(QColor("Black"));
|
|
||||||
painter->drawText(opt.rect, Qt::AlignCenter, newopt.text);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@@ -122,7 +122,8 @@ void FinishedTorrents::torrentAdded(QString, QTorrentHandle& h, bool) {
|
|||||||
|
|
||||||
// Set the color of a row in data model
|
// Set the color of a row in data model
|
||||||
void FinishedTorrents::setRowColor(int row, QString color){
|
void FinishedTorrents::setRowColor(int row, QString color){
|
||||||
for(int i=0; i<finishedListModel->columnCount(); ++i){
|
unsigned int nbColumns = finishedListModel->columnCount()-1;
|
||||||
|
for(unsigned int i=0; i<nbColumns; ++i){
|
||||||
finishedListModel->setData(finishedListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole);
|
finishedListModel->setData(finishedListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -209,6 +210,10 @@ void FinishedTorrents::updateFinishedList(){
|
|||||||
}
|
}
|
||||||
Q_ASSERT(row != -1);
|
Q_ASSERT(row != -1);
|
||||||
if(h.is_paused()) continue;
|
if(h.is_paused()) continue;
|
||||||
|
if(BTSession->getTorrentsToPauseAfterChecking().indexOf(hash) != -1) {
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_PROGRESS), QVariant((double)h.progress()));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if(h.state() == torrent_status::downloading || (h.state() != torrent_status::checking_files && h.state() != torrent_status::queued_for_checking && h.progress() < 1.)) {
|
if(h.state() == torrent_status::downloading || (h.state() != torrent_status::checking_files && h.state() != torrent_status::queued_for_checking && h.progress() < 1.)) {
|
||||||
// What are you doing here? go back to download tab!
|
// What are you doing here? go back to download tab!
|
||||||
qDebug("Info: a torrent was moved from finished to download tab");
|
qDebug("Info: a torrent was moved from finished to download tab");
|
||||||
@@ -218,10 +223,8 @@ void FinishedTorrents::updateFinishedList(){
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(h.state() == torrent_status::checking_files){
|
if(h.state() == torrent_status::checking_files){
|
||||||
if(BTSession->getTorrentsToPauseAfterChecking().indexOf(hash) == -1) {
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
|
setRowColor(row, QString::fromUtf8("grey"));
|
||||||
setRowColor(row, QString::fromUtf8("grey"));
|
|
||||||
}
|
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_PROGRESS), QVariant((double)h.progress()));
|
finishedListModel->setData(finishedListModel->index(row, F_PROGRESS), QVariant((double)h.progress()));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -310,8 +313,6 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
|
|||||||
QModelIndex index;
|
QModelIndex index;
|
||||||
// Enable/disable pause/start action given the DL state
|
// Enable/disable pause/start action given the DL state
|
||||||
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
QSettings settings("qBittorrent", "qBittorrent");
|
|
||||||
QString previewProgram = settings.value("Options/Misc/PreviewProgram", QString()).toString();
|
|
||||||
bool has_pause = false, has_start = false, has_preview = false;
|
bool has_pause = false, has_start = false, has_preview = false;
|
||||||
foreach(index, selectedIndexes) {
|
foreach(index, selectedIndexes) {
|
||||||
if(index.column() == F_NAME) {
|
if(index.column() == F_NAME) {
|
||||||
@@ -331,7 +332,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
|
|||||||
has_pause = true;
|
has_pause = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!previewProgram.isEmpty() && BTSession->isFilePreviewPossible(hash) && !has_preview) {
|
if(BTSession->isFilePreviewPossible(hash) && !has_preview) {
|
||||||
myFinishedListMenu.addAction(actionPreview_file);
|
myFinishedListMenu.addAction(actionPreview_file);
|
||||||
has_preview = true;
|
has_preview = true;
|
||||||
}
|
}
|
||||||
|
402
src/GUI.cpp
@@ -64,7 +64,9 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
FinishedTorrents *finishedTorrentTab;
|
FinishedTorrents *finishedTorrentTab;
|
||||||
QLabel *connecStatusLblIcon;
|
QLabel *connecStatusLblIcon;
|
||||||
bool systrayIntegration;
|
bool systrayIntegration;
|
||||||
|
bool displaySpeedInTitle;
|
||||||
bool force_exit;
|
bool force_exit;
|
||||||
|
unsigned int refreshInterval;
|
||||||
QTimer *refresher;
|
QTimer *refresher;
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
QShortcut *switchSearchShortcut;
|
QShortcut *switchSearchShortcut;
|
||||||
@@ -72,8 +74,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
QShortcut *switchDownShortcut;
|
QShortcut *switchDownShortcut;
|
||||||
QShortcut *switchUpShortcut;
|
QShortcut *switchUpShortcut;
|
||||||
QShortcut *switchRSSShortcut;
|
QShortcut *switchRSSShortcut;
|
||||||
// Preview
|
|
||||||
QProcess *previewProcess;
|
|
||||||
// Search
|
// Search
|
||||||
SearchEngine *searchEngine;
|
SearchEngine *searchEngine;
|
||||||
// RSS
|
// RSS
|
||||||
@@ -96,7 +96,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void togglePausedState(QString hash);
|
void togglePausedState(QString hash);
|
||||||
void on_actionPreview_file_triggered();
|
void on_actionPreview_file_triggered();
|
||||||
void previewFile(QString filePath);
|
void previewFile(QString filePath);
|
||||||
void cleanTempPreviewFile(int, QProcess::ExitStatus) const;
|
|
||||||
void balloonClicked();
|
void balloonClicked();
|
||||||
void writeSettings();
|
void writeSettings();
|
||||||
void readSettings();
|
void readSettings();
|
||||||
@@ -127,10 +126,12 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void checkConnectionStatus();
|
void checkConnectionStatus();
|
||||||
void configureSession(bool deleteOptions);
|
void configureSession(bool deleteOptions);
|
||||||
void processParams(const QStringList& params);
|
void processParams(const QStringList& params);
|
||||||
|
void addTorrent(QString path);
|
||||||
void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker);
|
void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker);
|
||||||
void processScannedFiles(const QStringList& params);
|
void processScannedFiles(const QStringList& params);
|
||||||
void processDownloadedFiles(QString path, QString url);
|
void processDownloadedFiles(QString path, QString url);
|
||||||
void downloadFromURLList(const QStringList& urls);
|
void downloadFromURLList(const QStringList& urls);
|
||||||
|
void deleteTorrent(QString hash, QString fileName, bool finished);
|
||||||
void finishedTorrent(QTorrentHandle& h) const;
|
void finishedTorrent(QTorrentHandle& h) const;
|
||||||
void torrentChecked(QString hash) const;
|
void torrentChecked(QString hash) const;
|
||||||
void updateLists();
|
void updateLists();
|
||||||
|
BIN
src/Icons/bt_settings.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
src/Icons/configure.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 820 B |
BIN
src/Icons/download.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/Icons/edit_clear.png
Normal file
After Width: | Height: | Size: 575 B |
Before Width: | Height: | Size: 1.4 KiB |
BIN
src/Icons/file.png
Normal file
After Width: | Height: | Size: 704 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 998 B |
Before Width: | Height: | Size: 558 B |
BIN
src/Icons/folder.png
Normal file
After Width: | Height: | Size: 449 B |
BIN
src/Icons/gear.png
Normal file
After Width: | Height: | Size: 1.3 KiB |