You've already forked qBittorrent
mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-10-16 20:32:23 +02:00
Compare commits
103 Commits
release-2.
...
release-2.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
89906d16d5 | ||
![]() |
a83fbf5a98 | ||
![]() |
328e4fd860 | ||
![]() |
b98d0282ce | ||
![]() |
166dad51d5 | ||
![]() |
e3ccea3b17 | ||
![]() |
8a64a6441e | ||
![]() |
c34000ab17 | ||
![]() |
90dd337069 | ||
![]() |
31e4b8dc31 | ||
![]() |
5145abe5c8 | ||
![]() |
7ec842929a | ||
![]() |
39778baaf5 | ||
![]() |
0a510db95e | ||
![]() |
c73243b0d2 | ||
![]() |
46b75b760f | ||
![]() |
fc3ae51122 | ||
![]() |
05d9f28f8b | ||
![]() |
b1b2a2c775 | ||
![]() |
105de3161a | ||
![]() |
354d968a94 | ||
![]() |
f617b74bac | ||
![]() |
3664134e02 | ||
![]() |
1875846326 | ||
![]() |
64f0adc813 | ||
![]() |
a9d4b38bd3 | ||
![]() |
44fa7388d5 | ||
![]() |
24df142b02 | ||
![]() |
958b73f2cb | ||
![]() |
1962898e24 | ||
![]() |
56b88661bc | ||
![]() |
5b47a762ac | ||
![]() |
a5c6bcceea | ||
![]() |
290932e128 | ||
![]() |
f53fe96191 | ||
![]() |
fc8a822dac | ||
![]() |
b7a3ae2b4c | ||
![]() |
26d19b33e6 | ||
![]() |
4ba9dc1fed | ||
![]() |
2c3f99692d | ||
![]() |
a27d2dcac2 | ||
![]() |
f7cb6a7da5 | ||
![]() |
6855edf649 | ||
![]() |
aff27558dd | ||
![]() |
f6172f8c77 | ||
![]() |
1562088bc8 | ||
![]() |
67973515d5 | ||
![]() |
7867cf68f9 | ||
![]() |
1eb26bd78b | ||
![]() |
a8d635f7ac | ||
![]() |
289ad37f06 | ||
![]() |
94de42bf2e | ||
![]() |
ca9f40eb7f | ||
![]() |
4013f9fefd | ||
![]() |
ccf0002c0f | ||
![]() |
86fb4a323a | ||
![]() |
38c56a2b5f | ||
![]() |
2d1286158a | ||
![]() |
6e7309316c | ||
![]() |
593fdad426 | ||
![]() |
933a831eb1 | ||
![]() |
7c55082464 | ||
![]() |
fa3e70316e | ||
![]() |
c9c2ab320d | ||
![]() |
53d9817d8a | ||
![]() |
828ecb6b3c | ||
![]() |
af61ed7c72 | ||
![]() |
1e86ea8c0a | ||
![]() |
129bfac549 | ||
![]() |
4815bb9f11 | ||
![]() |
81eb8b1341 | ||
![]() |
1596dc5206 | ||
![]() |
76a22fabcd | ||
![]() |
3d7bf26f85 | ||
![]() |
69661406a0 | ||
![]() |
74fba0fb7e | ||
![]() |
d56fc9fcd4 | ||
![]() |
124dcee7b8 | ||
![]() |
b5b06ce36d | ||
![]() |
ef01088411 | ||
![]() |
bc87c1c409 | ||
![]() |
bbe4328c06 | ||
![]() |
d557410156 | ||
![]() |
a150e24ce4 | ||
![]() |
261d02863c | ||
![]() |
c64f02c9bf | ||
![]() |
790db14b51 | ||
![]() |
2500ac2cb7 | ||
![]() |
cd8a7cf0e0 | ||
![]() |
b3be32126d | ||
![]() |
643bc5516c | ||
![]() |
eb94c59892 | ||
![]() |
72f4c81f4c | ||
![]() |
9543bd63f9 | ||
![]() |
7ae7a71782 | ||
![]() |
8994ca6dd5 | ||
![]() |
354dceeaf0 | ||
![]() |
50c7225c1e | ||
![]() |
44d945b5c0 | ||
![]() |
4ff6104601 | ||
![]() |
80760dd7af | ||
![]() |
7835a13573 | ||
![]() |
9b26fd50b2 |
10
Changelog
10
Changelog
@@ -1,4 +1,12 @@
|
|||||||
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.4.0
|
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.5.0
|
||||||
|
- FEATURE: qBittorrent can now act as a tracker
|
||||||
|
- FEATURE: Added feature to shutdown qbittorrent on torrents completion
|
||||||
|
- FEATURE: Added a torrent import assistant to seed or keep downloading outside torrents
|
||||||
|
- FEATURE: qBittorrent can update itself from Sourceforge (Windows/Mac OS X only)
|
||||||
|
- FEATURE: Added a transfer list column to display the current tracker
|
||||||
|
- COSMETIC: Replaced message box by on-screen notification for download errors
|
||||||
|
|
||||||
|
* Tue Aug 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.0
|
||||||
- FEATURE: Added actions to "Move to top/bottom" of priority queue
|
- FEATURE: Added actions to "Move to top/bottom" of priority queue
|
||||||
- FEATURE: Auto-Shutdown on downloads completion
|
- FEATURE: Auto-Shutdown on downloads completion
|
||||||
- FEATURE: Email notification on download completion
|
- FEATURE: Email notification on download completion
|
||||||
|
2
INSTALL
2
INSTALL
@@ -10,7 +10,7 @@ qBittorrent - A BitTorrent client in C++ / Qt4
|
|||||||
will install and execute qBittorrent hopefully without any problems.
|
will install and execute qBittorrent hopefully without any problems.
|
||||||
|
|
||||||
Dependencies:
|
Dependencies:
|
||||||
- Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
- Qt >= 4.5.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||||
|
|
||||||
- pkg-config executable
|
- pkg-config executable
|
||||||
|
|
||||||
|
26
configure
vendored
26
configure
vendored
@@ -325,7 +325,7 @@ cat >$1/modules.cpp <<EOT
|
|||||||
#line 1 "qt4.qcm"
|
#line 1 "qt4.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.4
|
name: Qt >= 4.5
|
||||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
@@ -333,14 +333,14 @@ class qc_qt4 : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qt4(Conf *c) : ConfObj(c) {}
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "Qt >= 4.4"; }
|
QString name() const { return "Qt >= 4.5"; }
|
||||||
QString shortname() const { return "Qt 4.4"; }
|
QString shortname() const { return "Qt 4.5"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
conf->addDefine("DISABLE_GUI");
|
conf->addDefine("DISABLE_GUI");
|
||||||
}
|
}
|
||||||
return(QT_VERSION >= 0x040400);
|
return(QT_VERSION >= 0x040500);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "pkg-config.qcm"
|
#line 1 "pkg-config.qcm"
|
||||||
@@ -616,22 +616,22 @@ arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplicat
|
|||||||
class qc_qtsingleapplication : public ConfObj
|
class qc_qtsingleapplication : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "qtsingleapplication library"; }
|
QString name() const { return "qtsingleapplication library"; }
|
||||||
QString shortname() const { return "qtsingleapplication"; }
|
QString shortname() const { return "qtsingleapplication"; }
|
||||||
|
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QString s;
|
QString s;
|
||||||
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
||||||
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
||||||
// System
|
// System
|
||||||
conf->addDefine("USE_SYSTEM_QTSINGLEAPPLICATION");
|
conf->addDefine("USE_SYSTEM_QTSINGLEAPPLICATION");
|
||||||
printf(" [system] ");
|
printf(" [system] ");
|
||||||
} else {
|
} else {
|
||||||
printf(" [shipped] ");
|
printf(" [shipped] ");
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.4
|
name: Qt >= 4.5
|
||||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
@@ -8,13 +8,13 @@ class qc_qt4 : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qt4(Conf *c) : ConfObj(c) {}
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "Qt >= 4.4"; }
|
QString name() const { return "Qt >= 4.5"; }
|
||||||
QString shortname() const { return "Qt 4.4"; }
|
QString shortname() const { return "Qt 4.5"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
conf->addDefine("DISABLE_GUI");
|
conf->addDefine("DISABLE_GUI");
|
||||||
}
|
}
|
||||||
return(QT_VERSION >= 0x040400);
|
return(QT_VERSION >= 0x040500);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
26
qcm/qtsingleapplication.qcm
Normal file
26
qcm/qtsingleapplication.qcm
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: libboost
|
||||||
|
arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplication library or the system one
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
class qc_qtsingleapplication : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "qtsingleapplication library"; }
|
||||||
|
QString shortname() const { return "qtsingleapplication"; }
|
||||||
|
|
||||||
|
bool exec(){
|
||||||
|
QString s;
|
||||||
|
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
||||||
|
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
||||||
|
// System
|
||||||
|
conf->addDefine("USE_SYSTEM_QTSINGLEAPPLICATION");
|
||||||
|
printf(" [system] ");
|
||||||
|
} else {
|
||||||
|
printf(" [shipped] ");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
182
src/GUI.cpp
182
src/GUI.cpp
File diff suppressed because it is too large
Load Diff
16
src/GUI.h
16
src/GUI.h
@@ -37,7 +37,7 @@
|
|||||||
#include "ui_mainwindow.h"
|
#include "ui_mainwindow.h"
|
||||||
#include "qtorrenthandle.h"
|
#include "qtorrenthandle.h"
|
||||||
|
|
||||||
class Bittorrent;
|
class QBtSession;
|
||||||
class QTimer;
|
class QTimer;
|
||||||
class downloadFromURL;
|
class downloadFromURL;
|
||||||
class SearchEngine;
|
class SearchEngine;
|
||||||
@@ -54,7 +54,7 @@ class PropertiesWidget;
|
|||||||
class StatusBar;
|
class StatusBar;
|
||||||
class consoleDlg;
|
class consoleDlg;
|
||||||
class about;
|
class about;
|
||||||
class createtorrent;
|
class TorrentCreatorDlg;
|
||||||
class downloadFromURL;
|
class downloadFromURL;
|
||||||
class HidableTabWidget;
|
class HidableTabWidget;
|
||||||
class LineEdit;
|
class LineEdit;
|
||||||
@@ -80,6 +80,7 @@ public slots:
|
|||||||
void downloadFromURLList(const QStringList& urls);
|
void downloadFromURLList(const QStringList& urls);
|
||||||
void updateAltSpeedsBtn(bool alternative);
|
void updateAltSpeedsBtn(bool alternative);
|
||||||
void updateNbTorrents(unsigned int nb_downloading, unsigned int nb_seeding, unsigned int nb_active, unsigned int nb_inactive, unsigned int nb_paused);
|
void updateNbTorrents(unsigned int nb_downloading, unsigned int nb_seeding, unsigned int nb_active, unsigned int nb_inactive, unsigned int nb_paused);
|
||||||
|
void deleteBTSession();
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
// GUI related slots
|
// GUI related slots
|
||||||
@@ -128,6 +129,10 @@ protected slots:
|
|||||||
void optionsSaved();
|
void optionsSaved();
|
||||||
// HTTP slots
|
// HTTP slots
|
||||||
void on_actionDownload_from_URL_triggered();
|
void on_actionDownload_from_URL_triggered();
|
||||||
|
#if defined(Q_WS_WIN) || defined(Q_WS_MAC)
|
||||||
|
void handleUpdateCheckFinished(bool update_available, QString new_version);
|
||||||
|
void handleUpdateInstalled(QString error_msg);
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void closeEvent(QCloseEvent *);
|
void closeEvent(QCloseEvent *);
|
||||||
@@ -139,7 +144,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
QFileSystemWatcher *executable_watcher;
|
QFileSystemWatcher *executable_watcher;
|
||||||
// Bittorrent
|
// Bittorrent
|
||||||
Bittorrent *BTSession;
|
QBtSession *BTSession;
|
||||||
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
||||||
// GUI related
|
// GUI related
|
||||||
QTimer *guiUpdater;
|
QTimer *guiUpdater;
|
||||||
@@ -148,7 +153,7 @@ private:
|
|||||||
QPointer<options_imp> options;
|
QPointer<options_imp> options;
|
||||||
QPointer<consoleDlg> console;
|
QPointer<consoleDlg> console;
|
||||||
QPointer<about> aboutDlg;
|
QPointer<about> aboutDlg;
|
||||||
QPointer<createtorrent> createTorrentDlg;
|
QPointer<TorrentCreatorDlg> createTorrentDlg;
|
||||||
QPointer<downloadFromURL> downloadFromURLDialog;
|
QPointer<downloadFromURL> downloadFromURLDialog;
|
||||||
QPointer<QSystemTrayIcon> systrayIcon;
|
QPointer<QSystemTrayIcon> systrayIcon;
|
||||||
QPointer<QTimer> systrayCreator;
|
QPointer<QTimer> systrayCreator;
|
||||||
@@ -170,6 +175,7 @@ private:
|
|||||||
QAction *prioSeparator2;
|
QAction *prioSeparator2;
|
||||||
QSplitter *hSplitter;
|
QSplitter *hSplitter;
|
||||||
QSplitter *vSplitter;
|
QSplitter *vSplitter;
|
||||||
|
QMenu *lockMenu;
|
||||||
// Search
|
// Search
|
||||||
QPointer<SearchEngine> searchEngine;
|
QPointer<SearchEngine> searchEngine;
|
||||||
// RSS
|
// RSS
|
||||||
@@ -181,6 +187,8 @@ private slots:
|
|||||||
void on_actionSpeed_in_title_bar_triggered();
|
void on_actionSpeed_in_title_bar_triggered();
|
||||||
void on_actionTop_tool_bar_triggered();
|
void on_actionTop_tool_bar_triggered();
|
||||||
void on_actionShutdown_when_downloads_complete_triggered();
|
void on_actionShutdown_when_downloads_complete_triggered();
|
||||||
|
void on_actionShutdown_qBittorrent_when_downloads_complete_triggered();
|
||||||
|
void on_action_Import_Torrent_triggered();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Categories=Qt;Network;P2P;
|
Categories=Qt;Network;P2P;
|
||||||
Comment=V2.4.0
|
Comment=V2.5.0
|
||||||
Exec=qbittorrent %f
|
Exec=qbittorrent %f
|
||||||
GenericName=Bittorrent client
|
GenericName=Bittorrent client
|
||||||
GenericName[ar]=العميل Bittorrent
|
GenericName[ar]=العميل Bittorrent
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
@@ -47,7 +47,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleGetInfoString</key>
|
<key>CFBundleGetInfoString</key>
|
||||||
<string>2.4.0</string>
|
<string>2.5.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
|
6
src/about.qrc
Normal file
6
src/about.qrc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<!DOCTYPE RCC><RCC version="1.0">
|
||||||
|
<qresource>
|
||||||
|
<file>gpl.html</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
|
|
438
src/about_imp.h
438
src/about_imp.h
File diff suppressed because it is too large
Load Diff
@@ -11,15 +11,15 @@
|
|||||||
#include "preferences.h"
|
#include "preferences.h"
|
||||||
|
|
||||||
enum AdvSettingsCols {PROPERTY, VALUE};
|
enum AdvSettingsCols {PROPERTY, VALUE};
|
||||||
enum AdvSettingsRows {DISK_CACHE, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, IGNORE_LIMIT_LAN, COUNT_OVERHEAD, RECHECK_COMPLETED, LIST_REFRESH, RESOLVE_COUNTRIES, RESOLVE_HOSTS, MAX_HALF_OPEN, SUPER_SEEDING, NETWORK_IFACE, PROGRAM_NOTIFICATIONS };
|
enum AdvSettingsRows {DISK_CACHE, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, IGNORE_LIMIT_LAN, COUNT_OVERHEAD, RECHECK_COMPLETED, LIST_REFRESH, RESOLVE_COUNTRIES, RESOLVE_HOSTS, MAX_HALF_OPEN, SUPER_SEEDING, NETWORK_IFACE, PROGRAM_NOTIFICATIONS, TRACKER_STATUS, TRACKER_PORT };
|
||||||
#define ROW_COUNT 13
|
#define ROW_COUNT 15
|
||||||
|
|
||||||
class AdvancedSettings: public QTableWidget {
|
class AdvancedSettings: public QTableWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSpinBox *spin_cache, *outgoing_ports_min, *outgoing_ports_max, *spin_list_refresh, *spin_maxhalfopen;
|
QSpinBox *spin_cache, *outgoing_ports_min, *outgoing_ports_max, *spin_list_refresh, *spin_maxhalfopen, *spin_tracker_port;
|
||||||
QCheckBox *cb_ignore_limits_lan, *cb_count_overhead, *cb_recheck_completed, *cb_resolve_countries, *cb_resolve_hosts, *cb_super_seeding, *cb_program_notifications;
|
QCheckBox *cb_ignore_limits_lan, *cb_count_overhead, *cb_recheck_completed, *cb_resolve_countries, *cb_resolve_hosts, *cb_super_seeding, *cb_program_notifications, *cb_tracker_status;
|
||||||
QComboBox *combo_iface;
|
QComboBox *combo_iface;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -53,6 +53,8 @@ public:
|
|||||||
delete cb_super_seeding;
|
delete cb_super_seeding;
|
||||||
delete combo_iface;
|
delete combo_iface;
|
||||||
delete cb_program_notifications;
|
delete cb_program_notifications;
|
||||||
|
delete spin_tracker_port;
|
||||||
|
delete cb_tracker_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
@@ -88,6 +90,9 @@ public slots:
|
|||||||
}
|
}
|
||||||
// Program notification
|
// Program notification
|
||||||
Preferences::useProgramNotification(cb_program_notifications->isChecked());
|
Preferences::useProgramNotification(cb_program_notifications->isChecked());
|
||||||
|
// Tracker
|
||||||
|
Preferences::setTrackerEnabled(cb_tracker_status->isChecked());
|
||||||
|
Preferences::setTrackerPort(spin_tracker_port->value());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
@@ -190,11 +195,25 @@ protected slots:
|
|||||||
connect(combo_iface, SIGNAL(currentIndexChanged(int)), this, SLOT(emitSettingsChanged()));
|
connect(combo_iface, SIGNAL(currentIndexChanged(int)), this, SLOT(emitSettingsChanged()));
|
||||||
setCellWidget(NETWORK_IFACE, VALUE, combo_iface);
|
setCellWidget(NETWORK_IFACE, VALUE, combo_iface);
|
||||||
// Program notifications
|
// Program notifications
|
||||||
setItem(PROGRAM_NOTIFICATIONS, PROPERTY, new QTableWidgetItem(tr("Display program notification baloons")));
|
setItem(PROGRAM_NOTIFICATIONS, PROPERTY, new QTableWidgetItem(tr("Display program notification balloons")));
|
||||||
cb_program_notifications = new QCheckBox();
|
cb_program_notifications = new QCheckBox();
|
||||||
connect(cb_program_notifications, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged()));
|
connect(cb_program_notifications, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged()));
|
||||||
cb_program_notifications->setChecked(Preferences::useProgramNotification());
|
cb_program_notifications->setChecked(Preferences::useProgramNotification());
|
||||||
setCellWidget(PROGRAM_NOTIFICATIONS, VALUE, cb_program_notifications);
|
setCellWidget(PROGRAM_NOTIFICATIONS, VALUE, cb_program_notifications);
|
||||||
|
// Tracker State
|
||||||
|
setItem(TRACKER_STATUS, PROPERTY, new QTableWidgetItem(tr("Enable embedded tracker")));
|
||||||
|
cb_tracker_status = new QCheckBox();
|
||||||
|
connect(cb_tracker_status, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged()));
|
||||||
|
cb_tracker_status->setChecked(Preferences::isTrackerEnabled());
|
||||||
|
setCellWidget(TRACKER_STATUS, VALUE, cb_tracker_status);
|
||||||
|
// Tracker port
|
||||||
|
setItem(TRACKER_PORT, PROPERTY, new QTableWidgetItem(tr("Embedded tracker port")));
|
||||||
|
spin_tracker_port = new QSpinBox();
|
||||||
|
connect(spin_tracker_port, SIGNAL(valueChanged(int)), this, SLOT(emitSettingsChanged()));
|
||||||
|
spin_tracker_port->setMinimum(1);
|
||||||
|
spin_tracker_port->setMaximum(65535);
|
||||||
|
spin_tracker_port->setValue(Preferences::getTrackerPort());
|
||||||
|
setCellWidget(TRACKER_PORT, VALUE, spin_tracker_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
void emitSettingsChanged() {
|
void emitSettingsChanged() {
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
#ifndef CONSOLE_H
|
#ifndef CONSOLE_H
|
||||||
#define CONSOLE_H
|
#define CONSOLE_H
|
||||||
|
|
||||||
#include "bittorrent.h"
|
#include "qbtsession.h"
|
||||||
#include "ui_console.h"
|
#include "ui_console.h"
|
||||||
|
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
@@ -40,10 +40,10 @@ class consoleDlg : public QDialog, private Ui_ConsoleDlg{
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Bittorrent *BTSession;
|
QBtSession *BTSession;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
consoleDlg(QWidget *parent, Bittorrent* _BTSession) : QDialog(parent) {
|
consoleDlg(QWidget *parent, QBtSession* _BTSession) : QDialog(parent) {
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
setModal(true);
|
setModal(true);
|
||||||
|
@@ -39,8 +39,6 @@
|
|||||||
#include "preferences.h"
|
#include "preferences.h"
|
||||||
#include "qinisettings.h"
|
#include "qinisettings.h"
|
||||||
|
|
||||||
enum ProxyType {HTTP=1, SOCKS5=2, HTTP_PW=3, SOCKS5_PW=4, SOCKS4=5};
|
|
||||||
|
|
||||||
/** Download Thread **/
|
/** Download Thread **/
|
||||||
|
|
||||||
downloadThread::downloadThread(QObject* parent) : QObject(parent) {
|
downloadThread::downloadThread(QObject* parent) : QObject(parent) {
|
||||||
@@ -180,7 +178,7 @@ void downloadThread::applyProxySettings() {
|
|||||||
qDebug("Using proxy: %s", qPrintable(IP));
|
qDebug("Using proxy: %s", qPrintable(IP));
|
||||||
proxy.setPort(port.toUShort());
|
proxy.setPort(port.toUShort());
|
||||||
// Default proxy type is HTTP, we must change if it is SOCKS5
|
// Default proxy type is HTTP, we must change if it is SOCKS5
|
||||||
if(intValue == SOCKS5 || intValue == SOCKS5_PW) {
|
if(intValue == Proxy::SOCKS5 || intValue == Proxy::SOCKS5_PW) {
|
||||||
qDebug("Proxy is SOCKS5, not HTTP");
|
qDebug("Proxy is SOCKS5, not HTTP");
|
||||||
proxy.setType(QNetworkProxy::Socks5Proxy);
|
proxy.setType(QNetworkProxy::Socks5Proxy);
|
||||||
} else {
|
} else {
|
||||||
|
221
src/feedList.h
221
src/feedList.h
@@ -1,221 +0,0 @@
|
|||||||
#ifndef FEEDLIST_H
|
|
||||||
#define FEEDLIST_H
|
|
||||||
|
|
||||||
#include <QTreeWidget>
|
|
||||||
#include <QTreeWidgetItem>
|
|
||||||
#include <QDropEvent>
|
|
||||||
#include <QDragMoveEvent>
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QHash>
|
|
||||||
#include <QUrl>
|
|
||||||
#include "rss.h"
|
|
||||||
|
|
||||||
class FeedList: public QTreeWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
private:
|
|
||||||
RssManager *rssmanager;
|
|
||||||
QHash<QTreeWidgetItem*, RssFile*> mapping;
|
|
||||||
QHash<QString, QTreeWidgetItem*> feeds_items;
|
|
||||||
QTreeWidgetItem* current_feed;
|
|
||||||
QTreeWidgetItem *unread_item;
|
|
||||||
|
|
||||||
public:
|
|
||||||
FeedList(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), rssmanager(rssmanager) {
|
|
||||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
|
||||||
setDragDropMode(QAbstractItemView::InternalMove);
|
|
||||||
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
|
||||||
setColumnCount(1);
|
|
||||||
QTreeWidgetItem *___qtreewidgetitem = headerItem();
|
|
||||||
___qtreewidgetitem->setText(0, QApplication::translate("RSS", "RSS feeds", 0, QApplication::UnicodeUTF8));
|
|
||||||
unread_item = new QTreeWidgetItem(this);
|
|
||||||
unread_item->setText(0, tr("Unread") + QString::fromUtf8(" (") + QString::number(rssmanager->getNbUnRead(), 10)+ QString(")"));
|
|
||||||
unread_item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/oxygen/mail-folder-inbox.png")));
|
|
||||||
itemAdded(unread_item, rssmanager);
|
|
||||||
connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*)));
|
|
||||||
setCurrentItem(unread_item);
|
|
||||||
}
|
|
||||||
|
|
||||||
~FeedList() {
|
|
||||||
disconnect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*)));
|
|
||||||
delete unread_item;
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemAdded(QTreeWidgetItem *item, RssFile* file) {
|
|
||||||
mapping[item] = file;
|
|
||||||
if(file->getType() == RssFile::STREAM) {
|
|
||||||
feeds_items[file->getID()] = item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemAboutToBeRemoved(QTreeWidgetItem *item) {
|
|
||||||
RssFile* file = mapping.take(item);
|
|
||||||
if(file->getType() == RssFile::STREAM) {
|
|
||||||
feeds_items.remove(file->getID());
|
|
||||||
} else {
|
|
||||||
QList<RssStream*> feeds = ((RssFolder*)file)->getAllFeeds();
|
|
||||||
foreach(RssStream* feed, feeds) {
|
|
||||||
feeds_items.remove(feed->getID());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasFeed(QString url) const {
|
|
||||||
return feeds_items.contains(QUrl(url).toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> getAllFeedItems() const {
|
|
||||||
return feeds_items.values();
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem* getUnreadItem() const {
|
|
||||||
return unread_item;
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList getItemPath(QTreeWidgetItem* item) const {
|
|
||||||
QStringList path;
|
|
||||||
if(item) {
|
|
||||||
if(item->parent())
|
|
||||||
path << getItemPath(item->parent());
|
|
||||||
path.append(getRSSItem(item)->getID());
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) const {
|
|
||||||
QList<QTreeWidgetItem*> open_folders;
|
|
||||||
int nbChildren;
|
|
||||||
if(parent)
|
|
||||||
nbChildren = parent->childCount();
|
|
||||||
else
|
|
||||||
nbChildren = topLevelItemCount();
|
|
||||||
for(int i=0; i<nbChildren; ++i) {
|
|
||||||
QTreeWidgetItem *item;
|
|
||||||
if(parent)
|
|
||||||
item = parent->child(i);
|
|
||||||
else
|
|
||||||
item = topLevelItem(i);
|
|
||||||
if(getItemType(item) == RssFile::FOLDER && item->isExpanded()) {
|
|
||||||
QList<QTreeWidgetItem*> open_subfolders = getAllOpenFolders(item);
|
|
||||||
if(!open_subfolders.empty()) {
|
|
||||||
open_folders << open_subfolders;
|
|
||||||
} else {
|
|
||||||
open_folders << item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return open_folders;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> getAllFeedItems(QTreeWidgetItem* folder) {
|
|
||||||
QList<QTreeWidgetItem*> feeds;
|
|
||||||
int nbChildren = folder->childCount();
|
|
||||||
for(int i=0; i<nbChildren; ++i) {
|
|
||||||
QTreeWidgetItem *item = folder->child(i);
|
|
||||||
if(getItemType(item) == RssFile::STREAM) {
|
|
||||||
feeds << item;
|
|
||||||
} else {
|
|
||||||
feeds << getAllFeedItems(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return feeds;
|
|
||||||
}
|
|
||||||
|
|
||||||
RssFile* getRSSItem(QTreeWidgetItem *item) const {
|
|
||||||
return mapping.value(item, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
RssFile::FileType getItemType(QTreeWidgetItem *item) const {
|
|
||||||
return mapping.value(item)->getType();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString getItemID(QTreeWidgetItem *item) const {
|
|
||||||
return mapping.value(item)->getID();
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem* getTreeItemFromUrl(QString url) const{
|
|
||||||
return feeds_items.value(url, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
RssStream* getRSSItemFromUrl(QString url) const {
|
|
||||||
return (RssStream*)getRSSItem(getTreeItemFromUrl(url));
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem* currentItem() const {
|
|
||||||
return current_feed;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem* currentFeed() const {
|
|
||||||
return current_feed;
|
|
||||||
}
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void foldersAltered(QList<QTreeWidgetItem*> folders);
|
|
||||||
void overwriteAttempt(QString filename);
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void updateCurrentFeed(QTreeWidgetItem* new_item) {
|
|
||||||
if(!new_item) return;
|
|
||||||
if(!mapping.contains(new_item)) return;
|
|
||||||
if((getItemType(new_item) == RssFile::STREAM) || new_item == unread_item)
|
|
||||||
current_feed = new_item;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void dragMoveEvent(QDragMoveEvent * event) {
|
|
||||||
QTreeWidgetItem *item = itemAt(event->pos());
|
|
||||||
if(item == unread_item) {
|
|
||||||
event->ignore();
|
|
||||||
} else {
|
|
||||||
if(item && getItemType(item) != RssFile::FOLDER)
|
|
||||||
event->ignore();
|
|
||||||
else {
|
|
||||||
if(selectedItems().contains(unread_item)) {
|
|
||||||
event->ignore();
|
|
||||||
} else {
|
|
||||||
QTreeWidget::dragMoveEvent(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dropEvent(QDropEvent *event) {
|
|
||||||
qDebug("dropEvent");
|
|
||||||
QList<QTreeWidgetItem*> folders_altered;
|
|
||||||
QTreeWidgetItem *dest_folder_item = itemAt(event->pos());
|
|
||||||
RssFolder *dest_folder;
|
|
||||||
if(dest_folder_item) {
|
|
||||||
dest_folder = (RssFolder*)getRSSItem(dest_folder_item);
|
|
||||||
folders_altered << dest_folder_item;
|
|
||||||
} else {
|
|
||||||
dest_folder = rssmanager;
|
|
||||||
}
|
|
||||||
QList<QTreeWidgetItem *> src_items = selectedItems();
|
|
||||||
// Check if there is not going to overwrite another file
|
|
||||||
foreach(QTreeWidgetItem *src_item, src_items) {
|
|
||||||
RssFile *file = getRSSItem(src_item);
|
|
||||||
if(dest_folder->hasChild(file->getID())) {
|
|
||||||
emit overwriteAttempt(file->getID());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Proceed with the move
|
|
||||||
foreach(QTreeWidgetItem *src_item, src_items) {
|
|
||||||
QTreeWidgetItem *parent_folder = src_item->parent();
|
|
||||||
if(parent_folder && !folders_altered.contains(parent_folder))
|
|
||||||
folders_altered << parent_folder;
|
|
||||||
// Actually move the file
|
|
||||||
RssFile *file = getRSSItem(src_item);
|
|
||||||
rssmanager->moveFile(file, dest_folder);
|
|
||||||
}
|
|
||||||
QTreeWidget::dropEvent(event);
|
|
||||||
if(dest_folder_item)
|
|
||||||
dest_folder_item->setExpanded(true);
|
|
||||||
// Emit signal for update
|
|
||||||
if(!folders_altered.empty())
|
|
||||||
emit foldersAltered(folders_altered);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // FEEDLIST_H
|
|
File diff suppressed because it is too large
Load Diff
@@ -407,9 +407,12 @@ class FilterParserThread : public QThread {
|
|||||||
// First, import current filter
|
// First, import current filter
|
||||||
ip_filter filter = s->get_ip_filter();
|
ip_filter filter = s->get_ip_filter();
|
||||||
foreach(const QString &ip, IPs) {
|
foreach(const QString &ip, IPs) {
|
||||||
qDebug("Manual ban of peer %s", ip.toLocal8Bit().data());
|
qDebug("Manual ban of peer %s", ip.toLocal8Bit().constData());
|
||||||
address_v4 addr = address_v4::from_string(ip.toLocal8Bit().data());
|
boost::system::error_code ec;
|
||||||
filter.add_rule(addr, addr, ip_filter::blocked);
|
address_v4 addr = address_v4::from_string(ip.toLocal8Bit().constData(), ec);
|
||||||
|
Q_ASSERT(!ec);
|
||||||
|
if(!ec)
|
||||||
|
filter.add_rule(addr, addr, ip_filter::blocked);
|
||||||
}
|
}
|
||||||
s->set_ip_filter(filter);
|
s->set_ip_filter(filter);
|
||||||
}
|
}
|
||||||
|
508
src/gpl.html
Normal file
508
src/gpl.html
Normal file
File diff suppressed because it is too large
Load Diff
@@ -34,7 +34,7 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include "preferences.h"
|
#include "preferences.h"
|
||||||
#include "bittorrent.h"
|
#include "qbtsession.h"
|
||||||
|
|
||||||
class HeadlessLoader: public QObject {
|
class HeadlessLoader: public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
// Enable Web UI
|
// Enable Web UI
|
||||||
Preferences::setWebUiEnabled(true);
|
Preferences::setWebUiEnabled(true);
|
||||||
// Instanciate Bittorrent Object
|
// Instanciate Bittorrent Object
|
||||||
BTSession = new Bittorrent();
|
BTSession = new QBtSession();
|
||||||
connect(BTSession, SIGNAL(newConsoleMessage(QString)), this, SLOT(displayConsoleMessage(QString)));
|
connect(BTSession, SIGNAL(newConsoleMessage(QString)), this, SLOT(displayConsoleMessage(QString)));
|
||||||
// Resume unfinished torrents
|
// Resume unfinished torrents
|
||||||
BTSession->startUpTorrents();
|
BTSession->startUpTorrents();
|
||||||
@@ -103,7 +103,7 @@ public slots:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Bittorrent *BTSession;
|
QBtSession *BTSession;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user