mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2026-01-01 05:08:05 -06:00
Compare commits
58 Commits
release-2.
...
v2_9_x
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b53028828 | ||
|
|
17b7ff3fd2 | ||
|
|
9ca171c96f | ||
|
|
cfd2576002 | ||
|
|
ca0af8c858 | ||
|
|
70320ed4b3 | ||
|
|
869af25826 | ||
|
|
b3ac151302 | ||
|
|
d02ff9cd66 | ||
|
|
32c0b7801c | ||
|
|
6049b2ce03 | ||
|
|
b3aec8e6f9 | ||
|
|
e1933e9382 | ||
|
|
5cc4f31b4b | ||
|
|
ad918651a5 | ||
|
|
2fa3e9ae8e | ||
|
|
5fd7bad57c | ||
|
|
d7eb29ab71 | ||
|
|
33147d842c | ||
|
|
11e0b7c9b5 | ||
|
|
e8cd92e245 | ||
|
|
a757953b76 | ||
|
|
a26da65419 | ||
|
|
1d9ef166bd | ||
|
|
81a5201e41 | ||
|
|
9f9354af12 | ||
|
|
ac1ebf4e13 | ||
|
|
b9ccd3e74f | ||
|
|
4177a37d63 | ||
|
|
24a73c05b9 | ||
|
|
960d8d1bc9 | ||
|
|
da69983e64 | ||
|
|
6db7d36e4d | ||
|
|
571963b1bd | ||
|
|
9e50e1ba7e | ||
|
|
82af132d8a | ||
|
|
80dd666107 | ||
|
|
ac50f0cdc2 | ||
|
|
bf685773e6 | ||
|
|
a0ada5c3ba | ||
|
|
220fd4a7b8 | ||
|
|
d5622da576 | ||
|
|
55be2aa9a0 | ||
|
|
96f619b486 | ||
|
|
89a1eb1bca | ||
|
|
de228fe074 | ||
|
|
8846f52ce1 | ||
|
|
545ce42d4e | ||
|
|
faf8b0e3f5 | ||
|
|
70a0b3cff3 | ||
|
|
24ab195d2f | ||
|
|
4bd2641d70 | ||
|
|
7c5779eee0 | ||
|
|
0bbe4426c2 | ||
|
|
595a190508 | ||
|
|
ec30fe2498 | ||
|
|
4d80d6ef5c | ||
|
|
3d53e641c1 |
29
Changelog
29
Changelog
@@ -1,3 +1,32 @@
|
|||||||
|
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.9.12
|
||||||
|
- BUGFIX: Fix issue when "Minimize to tray" and "Start minimized" are both enabled
|
||||||
|
|
||||||
|
* Sun Jul 1 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.11
|
||||||
|
- BUGFIX: Fix unreversible "Minimize to tray" on some window managers
|
||||||
|
- BUGFIX: Fix torrent availability computation (closes #988869)
|
||||||
|
- BUGFIX: Bring window to front after restoring from systray
|
||||||
|
- BUGFIX: Fix keyboard focus problems on main window (closes #1019563)
|
||||||
|
- BUGFIX: Fix ThePirateBay search plugin
|
||||||
|
|
||||||
|
* Sun Jun 24 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.10
|
||||||
|
- BUGFIX: Fix possible crash when showing torrent content (closes #1002586)
|
||||||
|
- BUGFIX: Add support for RSS feeds using magnet links (closes #1016379)
|
||||||
|
- BUGFIX: Remove 100kb limit for torrent file size in Web UI
|
||||||
|
- BUGFIX: Fix ratio limiting bug (closes #835217)
|
||||||
|
- BUGFIX: Do not display .!qB file extensions in Web UI
|
||||||
|
- BUGFIX: Stop using absolute URLs in Web UI ajax requests (closes #1011226)
|
||||||
|
- BUGFIX: Fix torrent association and loading on Mac OS X (closes #1011229)
|
||||||
|
- BUGFIX: Fix unreversible "Minimize to tray" on some window managers (closes #917825)
|
||||||
|
|
||||||
|
* Sun May 20 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.9
|
||||||
|
- BUGFIX: More reliable RSS feed parsing (closes #1001777)
|
||||||
|
- BUGFIX: Better support for cookies in RSS
|
||||||
|
- BUGFIX: Make sure show/hide text in tray icon menu is correct
|
||||||
|
- COSMETIC: Improve style of left panel
|
||||||
|
- COSMETIC: Never disable properties panel
|
||||||
|
- COSMETIC: Make sure first tab is initially selected in options dialog
|
||||||
|
- COSMETIC: Fix a few focus issues on Mac OS X
|
||||||
|
|
||||||
* Sat May 5 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.8
|
* Sat May 5 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.8
|
||||||
- BUGFIX: Various UI style fixes
|
- BUGFIX: Various UI style fixes
|
||||||
- BUGFIX: Fix compilation with gcc 4.7
|
- BUGFIX: Fix compilation with gcc 4.7
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ DATADIR = /usr/local/share
|
|||||||
# Use pkg-config to get all necessary libtorrent DEFINES
|
# Use pkg-config to get all necessary libtorrent DEFINES
|
||||||
CONFIG += link_pkgconfig
|
CONFIG += link_pkgconfig
|
||||||
PKGCONFIG += libtorrent-rasterbar
|
PKGCONFIG += libtorrent-rasterbar
|
||||||
|
DEFINES += BOOST_ASIO_DYN_LINK
|
||||||
|
|
||||||
# Special include/libs paths (macports)
|
# Special include/libs paths (macports)
|
||||||
INCLUDEPATH += /usr/include/openssl /usr/include /opt/local/include/boost /opt/local/include
|
INCLUDEPATH += /usr/include/openssl /usr/include /opt/local/include/boost /opt/local/include
|
||||||
|
|||||||
@@ -13,10 +13,6 @@
|
|||||||
<string>qBitTorrentDocument</string>
|
<string>qBitTorrentDocument</string>
|
||||||
<key>CFBundleTypeName</key>
|
<key>CFBundleTypeName</key>
|
||||||
<string>BitTorrent Document</string>
|
<string>BitTorrent Document</string>
|
||||||
<key>CFBundleTypeMIMETypes</key>
|
|
||||||
<array>
|
|
||||||
<string>application/x-bittorrent</string>
|
|
||||||
</array>
|
|
||||||
<key>CFBundleTypeRole</key>
|
<key>CFBundleTypeRole</key>
|
||||||
<string>Viewer</string>
|
<string>Viewer</string>
|
||||||
<key>LSHandlerRank</key>
|
<key>LSHandlerRank</key>
|
||||||
@@ -40,21 +36,55 @@
|
|||||||
<string>BitTorrent Magnet URL</string>
|
<string>BitTorrent Magnet URL</string>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>qBittorrent</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>qbittorrent_mac.icns</string>
|
<string>qbittorrent_mac.icns</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleGetInfoString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2.9.8</string>
|
<string>2.9.11</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>qBit</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>qbittorrent</string>
|
<string>qbittorrent</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>org.qbittorrent</string>
|
<string>org.qbittorrent</string>
|
||||||
<key>NOTE</key>
|
<key>NSAppleScriptEnabled</key>
|
||||||
<string>This file was generated by Qt/QMake.</string>
|
<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>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
#include <QNetworkProxy>
|
#include <QNetworkProxy>
|
||||||
#include <QNetworkCookie>
|
|
||||||
#include <QNetworkCookieJar>
|
#include <QNetworkCookieJar>
|
||||||
|
|
||||||
#include "downloadthread.h"
|
#include "downloadthread.h"
|
||||||
@@ -109,39 +108,21 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) {
|
|||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
void DownloadThread::downloadTorrentUrl(const QString &url, const QList<QNetworkCookie>& cookies)
|
||||||
void DownloadThread::loadCookies(const QString &host_name, QString url) {
|
{
|
||||||
const QList<QByteArray> raw_cookies = RssSettings().getHostNameCookies(host_name);
|
|
||||||
QNetworkCookieJar *cookie_jar = m_networkManager.cookieJar();
|
|
||||||
QList<QNetworkCookie> cookies;
|
|
||||||
qDebug("Loading cookies for host name: %s", qPrintable(host_name));
|
|
||||||
foreach(const QByteArray& raw_cookie, raw_cookies) {
|
|
||||||
QList<QByteArray> cookie_parts = raw_cookie.split('=');
|
|
||||||
if(cookie_parts.size() == 2) {
|
|
||||||
qDebug("Loading cookie: %s", raw_cookie.constData());
|
|
||||||
cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cookie_jar->setCookiesFromUrl(cookies, url);
|
|
||||||
m_networkManager.setCookieJar(cookie_jar);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void DownloadThread::downloadTorrentUrl(const QString &url) {
|
|
||||||
// Process request
|
// Process request
|
||||||
QNetworkReply *reply = downloadUrl(url);
|
QNetworkReply *reply = downloadUrl(url, cookies);
|
||||||
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
|
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
|
||||||
}
|
}
|
||||||
|
|
||||||
QNetworkReply* DownloadThread::downloadUrl(const QString &url){
|
QNetworkReply* DownloadThread::downloadUrl(const QString &url, const QList<QNetworkCookie>& cookies) {
|
||||||
// Update proxy settings
|
// Update proxy settings
|
||||||
applyProxySettings();
|
applyProxySettings();
|
||||||
#ifndef DISABLE_GUI
|
// Set cookies
|
||||||
// Load cookies
|
if (!cookies.empty()) {
|
||||||
QString host_name = QUrl::fromEncoded(url.toUtf8()).host();
|
qDebug("Setting %d cookies for url: %s", cookies.size(), qPrintable(url));
|
||||||
if(!host_name.isEmpty())
|
m_networkManager.cookieJar()->setCookiesFromUrl(cookies, url);
|
||||||
loadCookies(host_name, url);
|
}
|
||||||
#endif
|
|
||||||
// Process download request
|
// Process download request
|
||||||
qDebug("url is %s", qPrintable(url));
|
qDebug("url is %s", qPrintable(url));
|
||||||
const QUrl qurl = QUrl::fromEncoded(url.toUtf8());
|
const QUrl qurl = QUrl::fromEncoded(url.toUtf8());
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
#define DOWNLOADTHREAD_H
|
#define DOWNLOADTHREAD_H
|
||||||
|
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
|
#include <QNetworkCookie>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QSslError>
|
#include <QSslError>
|
||||||
@@ -45,8 +46,8 @@ class DownloadThread : public QObject {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
DownloadThread(QObject* parent = 0);
|
DownloadThread(QObject* parent = 0);
|
||||||
QNetworkReply* downloadUrl(const QString &url);
|
QNetworkReply* downloadUrl(const QString &url, const QList<QNetworkCookie>& raw_cookies = QList<QNetworkCookie>());
|
||||||
void downloadTorrentUrl(const QString &url);
|
void downloadTorrentUrl(const QString &url, const QList<QNetworkCookie>& raw_cookies = QList<QNetworkCookie>());
|
||||||
//void setProxy(QString IP, int port, QString username, QString password);
|
//void setProxy(QString IP, int port, QString username, QString password);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@@ -63,9 +64,6 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
QString errorCodeToString(QNetworkReply::NetworkError status);
|
QString errorCodeToString(QNetworkReply::NetworkError status);
|
||||||
void applyProxySettings();
|
void applyProxySettings();
|
||||||
#ifndef DISABLE_GUI
|
|
||||||
void loadCookies(const QString &host_name, QString url);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QNetworkAccessManager m_networkManager;
|
QNetworkAccessManager m_networkManager;
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ QT_BEGIN_NAMESPACE
|
|||||||
namespace Ui {
|
namespace Ui {
|
||||||
class ExecutionLog;
|
class ExecutionLog;
|
||||||
}
|
}
|
||||||
class LogListWidget;
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
class LogListWidget;
|
||||||
|
|
||||||
class ExecutionLog : public QWidget
|
class ExecutionLog : public QWidget
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -307,6 +307,9 @@ int main(int argc, char *argv[]){
|
|||||||
QObject::connect(&app, SIGNAL(messageReceived(const QString&)),
|
QObject::connect(&app, SIGNAL(messageReceived(const QString&)),
|
||||||
&window, SLOT(processParams(const QString&)));
|
&window, SLOT(processParams(const QString&)));
|
||||||
app.setActivationWindow(&window);
|
app.setActivationWindow(&window);
|
||||||
|
#ifdef Q_WS_MAC
|
||||||
|
static_cast<QMacApplication*>(&app)->setReadyToProcessEvents();
|
||||||
|
#endif // Q_WS_MAC
|
||||||
#else
|
#else
|
||||||
// Load Headless class
|
// Load Headless class
|
||||||
HeadlessLoader loader(torrentCmdLine);
|
HeadlessLoader loader(torrentCmdLine);
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
|
|||||||
connect(QBtSession::instance(), SIGNAL(finishedTorrent(QTorrentHandle)), this, SLOT(finishedTorrent(QTorrentHandle)));
|
connect(QBtSession::instance(), SIGNAL(finishedTorrent(QTorrentHandle)), this, SLOT(finishedTorrent(QTorrentHandle)));
|
||||||
connect(QBtSession::instance(), SIGNAL(trackerAuthenticationRequired(QTorrentHandle)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle)));
|
connect(QBtSession::instance(), SIGNAL(trackerAuthenticationRequired(QTorrentHandle)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle)));
|
||||||
connect(QBtSession::instance(), SIGNAL(newDownloadedTorrent(QString, QString)), this, SLOT(processDownloadedFiles(QString, QString)));
|
connect(QBtSession::instance(), SIGNAL(newDownloadedTorrent(QString, QString)), this, SLOT(processDownloadedFiles(QString, QString)));
|
||||||
|
connect(QBtSession::instance(), SIGNAL(newMagnetLink(QString)), this, SLOT(processNewMagnetLink(QString)));
|
||||||
connect(QBtSession::instance(), SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString)));
|
connect(QBtSession::instance(), SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString)));
|
||||||
connect(QBtSession::instance(), SIGNAL(alternativeSpeedsModeChanged(bool)), this, SLOT(updateAltSpeedsBtn(bool)));
|
connect(QBtSession::instance(), SIGNAL(alternativeSpeedsModeChanged(bool)), this, SLOT(updateAltSpeedsBtn(bool)));
|
||||||
connect(QBtSession::instance(), SIGNAL(recursiveTorrentDownloadPossible(QTorrentHandle)), this, SLOT(askRecursiveTorrentDownloadConfirmation(QTorrentHandle)));
|
connect(QBtSession::instance(), SIGNAL(recursiveTorrentDownloadPossible(QTorrentHandle)), this, SLOT(askRecursiveTorrentDownloadConfirmation(QTorrentHandle)));
|
||||||
@@ -254,9 +255,13 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
|
|||||||
readSettings();
|
readSettings();
|
||||||
|
|
||||||
if(!ui_locked) {
|
if(!ui_locked) {
|
||||||
if(pref.startMinimized() && systrayIcon)
|
if(pref.startMinimized() && systrayIcon) {
|
||||||
showMinimized();
|
show();
|
||||||
else {
|
minimizeWindow();
|
||||||
|
// XXX: Using showMinimized() makes it impossible to restore
|
||||||
|
// the window if "Minimize to systray" is enabled.
|
||||||
|
//showMinimized();
|
||||||
|
} else {
|
||||||
show();
|
show();
|
||||||
activateWindow();
|
activateWindow();
|
||||||
raise();
|
raise();
|
||||||
@@ -700,21 +705,16 @@ void MainWindow::toggleVisibility(QSystemTrayIcon::ActivationReason e) {
|
|||||||
if(!unlockUI())
|
if(!unlockUI())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// Make sure the window is not minimized
|
||||||
|
setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
|
||||||
|
// Then show it
|
||||||
show();
|
show();
|
||||||
if(isMinimized()) {
|
|
||||||
if(isMaximized()) {
|
|
||||||
showMaximized();
|
|
||||||
}else{
|
|
||||||
showNormal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
raise();
|
raise();
|
||||||
activateWindow();
|
activateWindow();
|
||||||
}else{
|
}else{
|
||||||
hide();
|
hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
actionToggleVisibility->setText(isVisible() ? tr("Hide") : tr("Show"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display About Dialog
|
// Display About Dialog
|
||||||
@@ -818,7 +818,7 @@ bool MainWindow::event(QEvent * e) {
|
|||||||
// Iconify if there is no modal window
|
// Iconify if there is no modal window
|
||||||
if(!has_modal_window) {
|
if(!has_modal_window) {
|
||||||
qDebug("Minimize to Tray enabled, hiding!");
|
qDebug("Minimize to Tray enabled, hiding!");
|
||||||
e->accept();
|
e->ignore();
|
||||||
QTimer::singleShot(0, this, SLOT(hide()));
|
QTimer::singleShot(0, this, SLOT(hide()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -993,6 +993,17 @@ void MainWindow::processDownloadedFiles(QString path, QString url) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::processNewMagnetLink(const QString& link)
|
||||||
|
{
|
||||||
|
QIniSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
const bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||||
|
if (useTorrentAdditionDialog) {
|
||||||
|
torrentAdditionDialog *dialog = new torrentAdditionDialog(this);
|
||||||
|
dialog->showLoadMagnetURI(link);
|
||||||
|
} else
|
||||||
|
QBtSession::instance()->addMagnetUri(link);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::optionsSaved() {
|
void MainWindow::optionsSaved() {
|
||||||
loadPreferences();
|
loadPreferences();
|
||||||
}
|
}
|
||||||
@@ -1209,12 +1220,17 @@ void MainWindow::updateAltSpeedsBtn(bool alternative) {
|
|||||||
actionUse_alternative_speed_limits->setChecked(alternative);
|
actionUse_alternative_speed_limits->setChecked(alternative);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::updateTrayIconMenu()
|
||||||
|
{
|
||||||
|
actionToggleVisibility->setText(isVisible() ? tr("Hide") : tr("Show"));
|
||||||
|
}
|
||||||
|
|
||||||
QMenu* MainWindow::getTrayIconMenu() {
|
QMenu* MainWindow::getTrayIconMenu() {
|
||||||
if(myTrayIconMenu)
|
if(myTrayIconMenu)
|
||||||
return myTrayIconMenu;
|
return myTrayIconMenu;
|
||||||
// Tray icon Menu
|
// Tray icon Menu
|
||||||
myTrayIconMenu = new QMenu(this);
|
myTrayIconMenu = new QMenu(this);
|
||||||
actionToggleVisibility->setText(isVisible() ? tr("Hide") : tr("Show"));
|
connect(myTrayIconMenu, SIGNAL(aboutToShow()), SLOT(updateTrayIconMenu()));
|
||||||
myTrayIconMenu->addAction(actionToggleVisibility);
|
myTrayIconMenu->addAction(actionToggleVisibility);
|
||||||
myTrayIconMenu->addSeparator();
|
myTrayIconMenu->addSeparator();
|
||||||
myTrayIconMenu->addAction(actionOpen);
|
myTrayIconMenu->addAction(actionOpen);
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ protected slots:
|
|||||||
void notifyOfUpdate(QString);
|
void notifyOfUpdate(QString);
|
||||||
void showConnectionSettings();
|
void showConnectionSettings();
|
||||||
void minimizeWindow();
|
void minimizeWindow();
|
||||||
|
void updateTrayIconMenu();
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
void createKeyboardShortcuts();
|
void createKeyboardShortcuts();
|
||||||
void displayTransferTab() const;
|
void displayTransferTab() const;
|
||||||
@@ -128,6 +129,7 @@ protected slots:
|
|||||||
void addTorrent(QString path);
|
void addTorrent(QString path);
|
||||||
void addUnauthenticatedTracker(const QPair<QTorrentHandle,QString> &tracker);
|
void addUnauthenticatedTracker(const QPair<QTorrentHandle,QString> &tracker);
|
||||||
void processDownloadedFiles(QString path, QString url);
|
void processDownloadedFiles(QString path, QString url);
|
||||||
|
void processNewMagnetLink(const QString& link);
|
||||||
void finishedTorrent(const QTorrentHandle& h) const;
|
void finishedTorrent(const QTorrentHandle& h) const;
|
||||||
void askRecursiveTorrentDownloadConfirmation(const QTorrentHandle &h);
|
void askRecursiveTorrentDownloadConfirmation(const QTorrentHandle &h);
|
||||||
// Options slots
|
// Options slots
|
||||||
|
|||||||
@@ -72,7 +72,7 @@
|
|||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentRow">
|
<property name="currentRow">
|
||||||
<number>-1</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -1419,7 +1419,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>395</width>
|
<width>363</width>
|
||||||
<height>480</height>
|
<height>480</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, MainWindow* main_window, Tra
|
|||||||
trackerDownButton->setIcon(IconProvider::instance()->getIcon("go-down"));
|
trackerDownButton->setIcon(IconProvider::instance()->getIcon("go-down"));
|
||||||
|
|
||||||
state = VISIBLE;
|
state = VISIBLE;
|
||||||
setEnabled(false);
|
|
||||||
|
|
||||||
// Set Properties list model
|
// Set Properties list model
|
||||||
PropListModel = new TorrentFilesFilterModel();
|
PropListModel = new TorrentFilesFilterModel();
|
||||||
@@ -204,7 +203,6 @@ void PropertiesWidget::clear() {
|
|||||||
PropListModel->model()->clear();
|
PropListModel->model()->clear();
|
||||||
showPiecesAvailability(false);
|
showPiecesAvailability(false);
|
||||||
showPiecesDownloaded(false);
|
showPiecesDownloaded(false);
|
||||||
setEnabled(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QTorrentHandle PropertiesWidget::getCurrentTorrent() const {
|
QTorrentHandle PropertiesWidget::getCurrentTorrent() const {
|
||||||
@@ -241,7 +239,6 @@ void PropertiesWidget::loadTorrentInfos(const QTorrentHandle &_h) {
|
|||||||
clear();
|
clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setEnabled(true);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Save path
|
// Save path
|
||||||
@@ -655,7 +652,7 @@ void PropertiesWidget::deleteSelectedUrlSeeds(){
|
|||||||
|
|
||||||
bool PropertiesWidget::applyPriorities() {
|
bool PropertiesWidget::applyPriorities() {
|
||||||
qDebug("Saving files priorities");
|
qDebug("Saving files priorities");
|
||||||
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(h.get_torrent_info().num_files());
|
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
|
||||||
// Save first/last piece first option state
|
// Save first/last piece first option state
|
||||||
bool first_last_piece_first = h.first_last_piece_first();
|
bool first_last_piece_first = h.first_last_piece_first();
|
||||||
// Prioritize the files
|
// Prioritize the files
|
||||||
|
|||||||
@@ -39,6 +39,7 @@
|
|||||||
PropTabBar::PropTabBar(QWidget *parent) :
|
PropTabBar::PropTabBar(QWidget *parent) :
|
||||||
QHBoxLayout(parent), m_currentIndex(-1)
|
QHBoxLayout(parent), m_currentIndex(-1)
|
||||||
{
|
{
|
||||||
|
setSpacing(2);
|
||||||
m_btnGroup = new QButtonGroup(this);
|
m_btnGroup = new QButtonGroup(this);
|
||||||
// General tab
|
// General tab
|
||||||
QPushButton *main_infos_button = new QPushButton(IconProvider::instance()->getIcon("document-properties"), tr("General"), parent);
|
QPushButton *main_infos_button = new QPushButton(IconProvider::instance()->getIcon("document-properties"), tr("General"), parent);
|
||||||
|
|||||||
@@ -81,9 +81,9 @@ TrackerList::~TrackerList() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> TrackerList::getSelectedTrackerItems() const {
|
QList<QTreeWidgetItem*> TrackerList::getSelectedTrackerItems() const {
|
||||||
QList<QTreeWidgetItem*> selected_items = selectedItems();
|
const QList<QTreeWidgetItem*> selected_items = selectedItems();
|
||||||
QList<QTreeWidgetItem*> selected_trackers;
|
QList<QTreeWidgetItem*> selected_trackers;
|
||||||
foreach(QTreeWidgetItem *item, selectedItems()) {
|
foreach(QTreeWidgetItem *item, selected_items) {
|
||||||
if(indexOfTopLevelItem(item) >= NB_STICKY_ITEM) { // Ignore STICKY ITEMS
|
if(indexOfTopLevelItem(item) >= NB_STICKY_ITEM) { // Ignore STICKY ITEMS
|
||||||
selected_trackers << item;
|
selected_trackers << item;
|
||||||
}
|
}
|
||||||
@@ -188,11 +188,12 @@ void TrackerList::clear() {
|
|||||||
void TrackerList::loadStickyItems(const QTorrentHandle &h) {
|
void TrackerList::loadStickyItems(const QTorrentHandle &h) {
|
||||||
// XXX: libtorrent should provide this info...
|
// XXX: libtorrent should provide this info...
|
||||||
// Count peers from DHT, LSD, PeX
|
// Count peers from DHT, LSD, PeX
|
||||||
uint nb_dht=0, nb_lsd=0, nb_pex=0;
|
uint nb_dht = 0, nb_lsd = 0, nb_pex = 0;
|
||||||
std::vector<peer_info> peers;
|
std::vector<peer_info> peers;
|
||||||
h.get_peer_info(peers);
|
h.get_peer_info(peers);
|
||||||
std::vector<peer_info>::iterator it;
|
std::vector<peer_info>::iterator it = peers.begin();
|
||||||
for(it=peers.begin(); it!=peers.end(); it++) {
|
std::vector<peer_info>::iterator end = peers.end();
|
||||||
|
for ( ; it != end; ++it) {
|
||||||
if(it->source & peer_info::dht)
|
if(it->source & peer_info::dht)
|
||||||
++nb_dht;
|
++nb_dht;
|
||||||
if(it->source & peer_info::lsd)
|
if(it->source & peer_info::lsd)
|
||||||
@@ -201,7 +202,7 @@ void TrackerList::loadStickyItems(const QTorrentHandle &h) {
|
|||||||
++nb_pex;
|
++nb_pex;
|
||||||
}
|
}
|
||||||
// load DHT information
|
// load DHT information
|
||||||
if(QBtSession::instance()->isDHTEnabled() && h.has_metadata() && !h.priv()) {
|
if (QBtSession::instance()->isDHTEnabled() && !h.priv()) {
|
||||||
dht_item->setText(COL_STATUS, tr("Working"));
|
dht_item->setText(COL_STATUS, tr("Working"));
|
||||||
} else {
|
} else {
|
||||||
dht_item->setText(COL_STATUS, tr("Disabled"));
|
dht_item->setText(COL_STATUS, tr("Disabled"));
|
||||||
@@ -233,7 +234,9 @@ void TrackerList::loadTrackers() {
|
|||||||
QHash<QString, TrackerInfos> trackers_data = QBtSession::instance()->getTrackersInfo(h.hash());
|
QHash<QString, TrackerInfos> trackers_data = QBtSession::instance()->getTrackersInfo(h.hash());
|
||||||
QStringList old_trackers_urls = tracker_items.keys();
|
QStringList old_trackers_urls = tracker_items.keys();
|
||||||
const std::vector<announce_entry> trackers = h.trackers();
|
const std::vector<announce_entry> trackers = h.trackers();
|
||||||
for(std::vector<announce_entry>::const_iterator it = trackers.begin(); it != trackers.end(); it++) {
|
std::vector<announce_entry>::const_iterator it = trackers.begin();
|
||||||
|
std::vector<announce_entry>::const_iterator end = trackers.end();
|
||||||
|
for( ; it != end; ++it) {
|
||||||
QString tracker_url = misc::toQString(it->url);
|
QString tracker_url = misc::toQString(it->url);
|
||||||
QTreeWidgetItem *item = tracker_items.value(tracker_url, 0);
|
QTreeWidgetItem *item = tracker_items.value(tracker_url, 0);
|
||||||
if(!item) {
|
if(!item) {
|
||||||
|
|||||||
@@ -34,11 +34,21 @@
|
|||||||
#include "qmacapplication.h"
|
#include "qmacapplication.h"
|
||||||
|
|
||||||
QMacApplication::QMacApplication(QString appid, int &argc, char** argv) :
|
QMacApplication::QMacApplication(QString appid, int &argc, char** argv) :
|
||||||
QtSingleApplication(appid, argc, argv)
|
QtSingleApplication(appid, argc, argv),
|
||||||
|
m_readyToProcessEvents(false)
|
||||||
{
|
{
|
||||||
qDebug("Constructing a QMacApplication to receive file open events");
|
qDebug("Constructing a QMacApplication to receive file open events");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QMacApplication::setReadyToProcessEvents()
|
||||||
|
{
|
||||||
|
m_readyToProcessEvents = true;
|
||||||
|
if (!m_torrentsQueue.isEmpty()) {
|
||||||
|
emit newFileOpenMacEvent(m_torrentsQueue.join("|"));
|
||||||
|
m_torrentsQueue.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool QMacApplication::event(QEvent * ev) {
|
bool QMacApplication::event(QEvent * ev) {
|
||||||
switch (ev->type()) {
|
switch (ev->type()) {
|
||||||
case QEvent::FileOpen:
|
case QEvent::FileOpen:
|
||||||
@@ -49,7 +59,10 @@ bool QMacApplication::event(QEvent * ev) {
|
|||||||
path = static_cast<QFileOpenEvent *>(ev)->url().toString();
|
path = static_cast<QFileOpenEvent *>(ev)->url().toString();
|
||||||
}
|
}
|
||||||
qDebug("Received a mac file open event: %s", qPrintable(path));
|
qDebug("Received a mac file open event: %s", qPrintable(path));
|
||||||
emit newFileOpenMacEvent(path);
|
if (m_readyToProcessEvents)
|
||||||
|
emit newFileOpenMacEvent(path);
|
||||||
|
else
|
||||||
|
m_torrentsQueue.append(path);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -31,12 +31,14 @@
|
|||||||
#define QMACAPPLICATION_H
|
#define QMACAPPLICATION_H
|
||||||
|
|
||||||
#include "qtsingleapplication.h"
|
#include "qtsingleapplication.h"
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
class QMacApplication : public QtSingleApplication
|
class QMacApplication : public QtSingleApplication
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit QMacApplication(QString appid, int &argc, char** argv);
|
explicit QMacApplication(QString appid, int &argc, char** argv);
|
||||||
|
void setReadyToProcessEvents();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void newFileOpenMacEvent(const QString &path);
|
void newFileOpenMacEvent(const QString &path);
|
||||||
@@ -44,6 +46,9 @@ signals:
|
|||||||
protected:
|
protected:
|
||||||
bool event(QEvent *);
|
bool event(QEvent *);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_readyToProcessEvents;
|
||||||
|
QStringList m_torrentsQueue;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QMACAPPLICATION_H
|
#endif // QMACAPPLICATION_H
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ QBtSession::QBtSession()
|
|||||||
const QString peer_id = "qB";
|
const QString peer_id = "qB";
|
||||||
// Construct session
|
// Construct session
|
||||||
s = new session(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)), 0);
|
s = new session(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)), 0);
|
||||||
std::cout << "Peer ID: " << fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string() << std::endl;
|
//std::cout << "Peer ID: " << fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string() << std::endl;
|
||||||
addConsoleMessage("Peer ID: "+misc::toQString(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string()));
|
addConsoleMessage("Peer ID: "+misc::toQString(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string()));
|
||||||
|
|
||||||
// Set severity level of libtorrent session
|
// Set severity level of libtorrent session
|
||||||
@@ -280,10 +280,10 @@ void QBtSession::processBigRatios() {
|
|||||||
const QString hash = h.hash();
|
const QString hash = h.hash();
|
||||||
const qreal ratio = getRealRatio(hash);
|
const qreal ratio = getRealRatio(hash);
|
||||||
qreal ratio_limit = TorrentPersistentData::getRatioLimit(hash);
|
qreal ratio_limit = TorrentPersistentData::getRatioLimit(hash);
|
||||||
if(ratio_limit == TorrentPersistentData::NO_RATIO_LIMIT)
|
|
||||||
continue;
|
|
||||||
if(ratio_limit == TorrentPersistentData::USE_GLOBAL_RATIO)
|
if(ratio_limit == TorrentPersistentData::USE_GLOBAL_RATIO)
|
||||||
ratio_limit = global_ratio_limit;
|
ratio_limit = global_ratio_limit;
|
||||||
|
if(ratio_limit == TorrentPersistentData::NO_RATIO_LIMIT)
|
||||||
|
continue;
|
||||||
qDebug("Ratio: %f (limit: %f)", ratio, ratio_limit);
|
qDebug("Ratio: %f (limit: %f)", ratio, ratio_limit);
|
||||||
Q_ASSERT(ratio_limit >= 0.f);
|
Q_ASSERT(ratio_limit >= 0.f);
|
||||||
if(ratio <= MAX_RATIO && ratio >= ratio_limit) {
|
if(ratio <= MAX_RATIO && ratio >= ratio_limit) {
|
||||||
@@ -445,7 +445,7 @@ void QBtSession::configureSession() {
|
|||||||
// * Session settings
|
// * Session settings
|
||||||
session_settings sessionSettings = s->settings();
|
session_settings sessionSettings = s->settings();
|
||||||
sessionSettings.user_agent = "qBittorrent "VERSION;
|
sessionSettings.user_agent = "qBittorrent "VERSION;
|
||||||
std::cout << "HTTP user agent is " << sessionSettings.user_agent << std::endl;
|
//std::cout << "HTTP user agent is " << sessionSettings.user_agent << std::endl;
|
||||||
addConsoleMessage(tr("HTTP user agent is %1").arg(misc::toQString(sessionSettings.user_agent)));
|
addConsoleMessage(tr("HTTP user agent is %1").arg(misc::toQString(sessionSettings.user_agent)));
|
||||||
|
|
||||||
sessionSettings.upnp_ignore_nonrouters = true;
|
sessionSettings.upnp_ignore_nonrouters = true;
|
||||||
@@ -972,7 +972,17 @@ QTorrentHandle QBtSession::addMagnetUri(QString magnet_uri, bool resumed) {
|
|||||||
add_torrent_params p = initializeAddTorrentParams(hash);
|
add_torrent_params p = initializeAddTorrentParams(hash);
|
||||||
|
|
||||||
// Get save path
|
// Get save path
|
||||||
const QString savePath(getSavePath(hash, false));
|
QString savePath;
|
||||||
|
if (!resumed && savepathLabel_fromurl.contains(magnet_uri)) {
|
||||||
|
QPair<QString, QString> savePath_label = savepathLabel_fromurl.take(magnet_uri);
|
||||||
|
if(!savePath_label.first.isEmpty())
|
||||||
|
savePath = savePath_label.first;
|
||||||
|
// Remember label
|
||||||
|
if(!savePath_label.second.isEmpty())
|
||||||
|
TorrentTempData::setLabel(hash, savePath_label.second);
|
||||||
|
}
|
||||||
|
if (savePath.isEmpty())
|
||||||
|
savePath = getSavePath(hash, false);
|
||||||
if(!defaultTempPath.isEmpty() && !TorrentPersistentData::isSeed(hash) && resumed) {
|
if(!defaultTempPath.isEmpty() && !TorrentPersistentData::isSeed(hash) && resumed) {
|
||||||
qDebug("addMagnetURI: Temp folder is enabled.");
|
qDebug("addMagnetURI: Temp folder is enabled.");
|
||||||
QString torrent_tmp_path = defaultTempPath.replace("\\", "/");
|
QString torrent_tmp_path = defaultTempPath.replace("\\", "/");
|
||||||
@@ -2757,7 +2767,8 @@ QString QBtSession::getSavePath(const QString &hash, bool fromScanDir, QString f
|
|||||||
// Take an url string to a torrent file,
|
// Take an url string to a torrent file,
|
||||||
// download the torrent file to a tmp location, then
|
// download the torrent file to a tmp location, then
|
||||||
// add it to download list
|
// add it to download list
|
||||||
void QBtSession::downloadFromUrl(const QString &url) {
|
void QBtSession::downloadFromUrl(const QString &url, const QList<QNetworkCookie>& cookies)
|
||||||
|
{
|
||||||
addConsoleMessage(tr("Downloading '%1', please wait...", "e.g: Downloading 'xxx.torrent', please wait...").arg(url)
|
addConsoleMessage(tr("Downloading '%1', please wait...", "e.g: Downloading 'xxx.torrent', please wait...").arg(url)
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
, QPalette::WindowText
|
, QPalette::WindowText
|
||||||
@@ -2765,7 +2776,7 @@ void QBtSession::downloadFromUrl(const QString &url) {
|
|||||||
);
|
);
|
||||||
//emit aboutToDownloadFromUrl(url);
|
//emit aboutToDownloadFromUrl(url);
|
||||||
// Launch downloader thread
|
// Launch downloader thread
|
||||||
downloader->downloadTorrentUrl(url);
|
downloader->downloadTorrentUrl(url, cookies);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QBtSession::downloadFromURLList(const QStringList& urls) {
|
void QBtSession::downloadFromURLList(const QStringList& urls) {
|
||||||
@@ -2774,14 +2785,22 @@ void QBtSession::downloadFromURLList(const QStringList& urls) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QBtSession::addMagnetSkipAddDlg(QString uri) {
|
void QBtSession::addMagnetInteractive(const QString& uri)
|
||||||
|
{
|
||||||
|
emit newMagnetLink(uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QBtSession::addMagnetSkipAddDlg(const QString& uri, const QString& save_path, const QString& label) {
|
||||||
|
if (!save_path.isEmpty() || !label.isEmpty())
|
||||||
|
savepathLabel_fromurl[uri] = qMakePair(save_path, label);
|
||||||
addMagnetUri(uri, false);
|
addMagnetUri(uri, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QBtSession::downloadUrlAndSkipDialog(QString url, QString save_path, QString label) {
|
void QBtSession::downloadUrlAndSkipDialog(QString url, QString save_path, QString label) {
|
||||||
//emit aboutToDownloadFromUrl(url);
|
//emit aboutToDownloadFromUrl(url);
|
||||||
const QUrl qurl = QUrl::fromEncoded(url.toUtf8());
|
const QUrl qurl = QUrl::fromEncoded(url.toUtf8());
|
||||||
savepathLabel_fromurl[qurl] = qMakePair(save_path, label);
|
if (!save_path.isEmpty() || !label.isEmpty())
|
||||||
|
savepathLabel_fromurl[qurl] = qMakePair(save_path, label);
|
||||||
url_skippingDlg << qurl;
|
url_skippingDlg << qurl;
|
||||||
// Launch downloader thread
|
// Launch downloader thread
|
||||||
downloader->downloadTorrentUrl(url);
|
downloader->downloadTorrentUrl(url);
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <QNetworkCookie>
|
||||||
|
|
||||||
#include <libtorrent/version.hpp>
|
#include <libtorrent/version.hpp>
|
||||||
#include <libtorrent/session.hpp>
|
#include <libtorrent/session.hpp>
|
||||||
@@ -107,7 +108,7 @@ public slots:
|
|||||||
QTorrentHandle addMagnetUri(QString magnet_uri, bool resumed=false);
|
QTorrentHandle addMagnetUri(QString magnet_uri, bool resumed=false);
|
||||||
void loadSessionState();
|
void loadSessionState();
|
||||||
void saveSessionState();
|
void saveSessionState();
|
||||||
void downloadFromUrl(const QString &url);
|
void downloadFromUrl(const QString &url, const QList<QNetworkCookie>& cookies = QList<QNetworkCookie>());
|
||||||
void deleteTorrent(const QString &hash, bool delete_local_files = false);
|
void deleteTorrent(const QString &hash, bool delete_local_files = false);
|
||||||
void startUpTorrents();
|
void startUpTorrents();
|
||||||
void recheckTorrent(const QString &hash);
|
void recheckTorrent(const QString &hash);
|
||||||
@@ -163,7 +164,8 @@ public slots:
|
|||||||
#endif
|
#endif
|
||||||
void addPeerBanMessage(QString msg, bool from_ipfilter);
|
void addPeerBanMessage(QString msg, bool from_ipfilter);
|
||||||
void processDownloadedFile(QString, QString);
|
void processDownloadedFile(QString, QString);
|
||||||
void addMagnetSkipAddDlg(QString uri);
|
void addMagnetSkipAddDlg(const QString& uri, const QString& save_path = QString(), const QString& label = QString());
|
||||||
|
void addMagnetInteractive(const QString& uri);
|
||||||
void downloadFromURLList(const QStringList& urls);
|
void downloadFromURLList(const QStringList& urls);
|
||||||
void configureSession();
|
void configureSession();
|
||||||
void banIP(QString ip);
|
void banIP(QString ip);
|
||||||
@@ -204,6 +206,7 @@ signals:
|
|||||||
void trackerError(const QString &hash, QString time, QString msg);
|
void trackerError(const QString &hash, QString time, QString msg);
|
||||||
void trackerAuthenticationRequired(const QTorrentHandle& h);
|
void trackerAuthenticationRequired(const QTorrentHandle& h);
|
||||||
void newDownloadedTorrent(QString path, QString url);
|
void newDownloadedTorrent(QString path, QString url);
|
||||||
|
void newMagnetLink(const QString& link);
|
||||||
void updateFileSize(const QString &hash);
|
void updateFileSize(const QString &hash);
|
||||||
void downloadFromUrlFailure(QString url, QString reason);
|
void downloadFromUrlFailure(QString url, QString reason);
|
||||||
void torrentFinishedChecking(const QTorrentHandle& h);
|
void torrentFinishedChecking(const QTorrentHandle& h);
|
||||||
|
|||||||
@@ -556,7 +556,7 @@ void QTorrentHandle::downloading_pieces(bitfield &bf) const {
|
|||||||
|
|
||||||
bool QTorrentHandle::has_metadata() const {
|
bool QTorrentHandle::has_metadata() const {
|
||||||
#if LIBTORRENT_VERSION_MINOR > 15
|
#if LIBTORRENT_VERSION_MINOR > 15
|
||||||
return torrent_handle::status(query_distributed_copies).has_metadata;
|
return torrent_handle::status(0x0).has_metadata;
|
||||||
#else
|
#else
|
||||||
return torrent_handle::has_metadata();
|
return torrent_handle::has_metadata();
|
||||||
#endif
|
#endif
|
||||||
@@ -564,7 +564,7 @@ bool QTorrentHandle::has_metadata() const {
|
|||||||
|
|
||||||
float QTorrentHandle::distributed_copies() const {
|
float QTorrentHandle::distributed_copies() const {
|
||||||
#if LIBTORRENT_VERSION_MINOR > 15
|
#if LIBTORRENT_VERSION_MINOR > 15
|
||||||
return torrent_handle::status(0x0).distributed_copies;
|
return torrent_handle::status(query_distributed_copies).distributed_copies;
|
||||||
#else
|
#else
|
||||||
return torrent_handle::status().distributed_copies;
|
return torrent_handle::status().distributed_copies;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -124,13 +124,14 @@ void RSSImp::on_actionManage_cookies_triggered() {
|
|||||||
Q_ASSERT(!m_feedList->selectedItems().empty());
|
Q_ASSERT(!m_feedList->selectedItems().empty());
|
||||||
// Get feed hostname
|
// Get feed hostname
|
||||||
QString feed_url = m_feedList->getItemID(m_feedList->selectedItems().first());
|
QString feed_url = m_feedList->getItemID(m_feedList->selectedItems().first());
|
||||||
QString feed_hostname = QUrl::fromEncoded(feed_url.toLocal8Bit()).host();
|
QString feed_hostname = QUrl::fromEncoded(feed_url.toUtf8()).host();
|
||||||
qDebug("RSS Feed hostname is: %s", qPrintable(feed_hostname));
|
qDebug("RSS Feed hostname is: %s", qPrintable(feed_hostname));
|
||||||
Q_ASSERT(!feed_hostname.isEmpty());
|
Q_ASSERT(!feed_hostname.isEmpty());
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
RssSettings settings;
|
RssSettings settings;
|
||||||
QList<QByteArray> raw_cookies = CookiesDlg::askForCookies(this, settings.getHostNameCookies(feed_hostname), &ok);
|
QList<QByteArray> raw_cookies = CookiesDlg::askForCookies(this, settings.getHostNameCookies(feed_hostname), &ok);
|
||||||
if(ok) {
|
if (ok) {
|
||||||
|
qDebug() << "Settings cookies for host name: " << feed_hostname;
|
||||||
settings.setHostNameCookies(feed_hostname, raw_cookies);
|
settings.setHostNameCookies(feed_hostname, raw_cookies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -325,10 +326,28 @@ void RSSImp::downloadTorrent() {
|
|||||||
foreach(const QListWidgetItem* item, selected_items) {
|
foreach(const QListWidgetItem* item, selected_items) {
|
||||||
const RssArticle article = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString())
|
const RssArticle article = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString())
|
||||||
->getItem(item->data(Article::IdRole).toString());
|
->getItem(item->data(Article::IdRole).toString());
|
||||||
if(article.hasAttachment()) {
|
|
||||||
QBtSession::instance()->downloadFromUrl(article.torrentUrl());
|
QString torrentLink = article.hasAttachment() ? article.torrentUrl() : article.link();
|
||||||
} else {
|
|
||||||
QBtSession::instance()->downloadFromUrl(article.link());
|
// Check if it is a magnet link
|
||||||
|
if (torrentLink.startsWith("magnet:", Qt::CaseInsensitive))
|
||||||
|
QBtSession::instance()->addMagnetInteractive(torrentLink);
|
||||||
|
else {
|
||||||
|
// Load possible cookies
|
||||||
|
QList<QNetworkCookie> cookies;
|
||||||
|
QString feed_url = m_feedList->getItemID(m_feedList->selectedItems().first());
|
||||||
|
QString feed_hostname = QUrl::fromEncoded(feed_url.toUtf8()).host();
|
||||||
|
const QList<QByteArray> raw_cookies = RssSettings().getHostNameCookies(feed_hostname);
|
||||||
|
foreach (const QByteArray& raw_cookie, raw_cookies) {
|
||||||
|
QList<QByteArray> cookie_parts = raw_cookie.split('=');
|
||||||
|
if (cookie_parts.size() == 2) {
|
||||||
|
qDebug("Loading cookie: %s = %s", cookie_parts.first().constData(), cookie_parts.last().constData());
|
||||||
|
cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qDebug("Loaded %d cookies for RSS item\n", cookies.size());
|
||||||
|
|
||||||
|
QBtSession::instance()->downloadFromUrl(torrentLink, cookies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -229,6 +229,13 @@ RssArticle::RssArticle(RssFeed* parent, QXmlStreamReader& xml)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// If guid is empty, fall back to some other identifier
|
||||||
|
if (d->guid.isEmpty()) {
|
||||||
|
if (!d->link.isEmpty())
|
||||||
|
d->guid = d->link;
|
||||||
|
else if (!d->title.isEmpty())
|
||||||
|
d->guid = d->title;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RssArticle::RssArticle(RssFeed* parent, const QString &guid) {
|
RssArticle::RssArticle(RssFeed* parent, const QString &guid) {
|
||||||
|
|||||||
@@ -314,7 +314,10 @@ void RssFeed::downloadMatchingArticleTorrents() {
|
|||||||
item.markAsRead();
|
item.markAsRead();
|
||||||
// Download the torrent
|
// Download the torrent
|
||||||
QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item.title()).arg(displayName()));
|
QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item.title()).arg(displayName()));
|
||||||
QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule.savePath(), matching_rule.label());
|
if (torrent_url.startsWith("magnet:", Qt::CaseInsensitive))
|
||||||
|
QBtSession::instance()->addMagnetSkipAddDlg(torrent_url, matching_rule.savePath(), matching_rule.label());
|
||||||
|
else
|
||||||
|
QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule.savePath(), matching_rule.label());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#VERSION: 1.21
|
#VERSION: 1.22
|
||||||
#AUTHORS: Christophe Dumez (chris@qbittorrent.org)
|
#AUTHORS: Christophe Dumez (chris@qbittorrent.org)
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@@ -39,7 +39,7 @@ class kickasstorrents(object):
|
|||||||
self.results = []
|
self.results = []
|
||||||
|
|
||||||
def download_torrent(self, info):
|
def download_torrent(self, info):
|
||||||
print download_file(info)
|
print download_file(info, info)
|
||||||
|
|
||||||
def search(self, what, cat='all'):
|
def search(self, what, cat='all'):
|
||||||
ret = []
|
ret = []
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#VERSION: 1.41
|
#VERSION: 1.50
|
||||||
#AUTHORS: Fabien Devaux (fab@gnux.info)
|
#AUTHORS: Fabien Devaux (fab@gnux.info)
|
||||||
#CONTRIBUTORS: Christophe Dumez (chris@qbittorrent.org)
|
#CONTRIBUTORS: Christophe Dumez (chris@qbittorrent.org)
|
||||||
|
|
||||||
@@ -31,14 +31,14 @@ import sgmllib
|
|||||||
from helpers import retrieve_url, download_file
|
from helpers import retrieve_url, download_file
|
||||||
|
|
||||||
class piratebay(object):
|
class piratebay(object):
|
||||||
url = 'http://thepiratebay.org'
|
url = 'http://thepiratebay.se'
|
||||||
name = 'The Pirate Bay'
|
name = 'The Pirate Bay'
|
||||||
supported_categories = {'all': '0', 'movies': '200', 'music': '100', 'games': '400', 'software': '300'}
|
supported_categories = {'all': '0', 'movies': '200', 'music': '100', 'games': '400', 'software': '300'}
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.results = []
|
self.results = []
|
||||||
self.parser = self.SimpleSGMLParser(self.results, self.url)
|
self.parser = self.SimpleSGMLParser(self.results, self.url)
|
||||||
|
|
||||||
def download_torrent(self, info):
|
def download_torrent(self, info):
|
||||||
print download_file(info)
|
print download_file(info)
|
||||||
|
|
||||||
@@ -57,10 +57,9 @@ class piratebay(object):
|
|||||||
if params['href'].startswith('/torrent/'):
|
if params['href'].startswith('/torrent/'):
|
||||||
self.current_item = {}
|
self.current_item = {}
|
||||||
self.td_counter = 0
|
self.td_counter = 0
|
||||||
self.code = params['href'].split('/')[2]
|
self.current_item['desc_link'] = 'http://thepiratebay.se'+params['href'].strip()
|
||||||
self.current_item['desc_link'] = 'http://thepiratebay.org'+params['href'].strip()
|
|
||||||
self.in_name = True
|
self.in_name = True
|
||||||
elif params['href'].startswith('http://torrents.thepiratebay.org/%s'%self.code):
|
elif params['href'].startswith('magnet:'):
|
||||||
self.current_item['link']=params['href'].strip()
|
self.current_item['link']=params['href'].strip()
|
||||||
self.in_name = False
|
self.in_name = False
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#VERSION: 1.21
|
#VERSION: 1.22
|
||||||
#AUTHORS: Christophe Dumez (chris@qbittorrent.org)
|
#AUTHORS: Christophe Dumez (chris@qbittorrent.org)
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@@ -39,7 +39,7 @@ class kickasstorrents(object):
|
|||||||
self.results = []
|
self.results = []
|
||||||
|
|
||||||
def download_torrent(self, info):
|
def download_torrent(self, info):
|
||||||
print(download_file(info))
|
print(download_file(info, info))
|
||||||
|
|
||||||
def search(self, what, cat='all'):
|
def search(self, what, cat='all'):
|
||||||
ret = []
|
ret = []
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#VERSION: 1.40
|
#VERSION: 1.50
|
||||||
#AUTHORS: Fabien Devaux (fab@gnux.info)
|
#AUTHORS: Fabien Devaux (fab@gnux.info)
|
||||||
#CONTRIBUTORS: Christophe Dumez (chris@qbittorrent.org)
|
#CONTRIBUTORS: Christophe Dumez (chris@qbittorrent.org)
|
||||||
|
|
||||||
@@ -31,14 +31,14 @@ import sgmllib3
|
|||||||
from helpers import retrieve_url, download_file
|
from helpers import retrieve_url, download_file
|
||||||
|
|
||||||
class piratebay(object):
|
class piratebay(object):
|
||||||
url = 'http://thepiratebay.org'
|
url = 'http://thepiratebay.se'
|
||||||
name = 'The Pirate Bay'
|
name = 'The Pirate Bay'
|
||||||
supported_categories = {'all': '0', 'movies': '200', 'music': '100', 'games': '400', 'software': '300'}
|
supported_categories = {'all': '0', 'movies': '200', 'music': '100', 'games': '400', 'software': '300'}
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.results = []
|
self.results = []
|
||||||
self.parser = self.SimpleSGMLParser(self.results, self.url)
|
self.parser = self.SimpleSGMLParser(self.results, self.url)
|
||||||
|
|
||||||
def download_torrent(self, info):
|
def download_torrent(self, info):
|
||||||
print(download_file(info))
|
print(download_file(info))
|
||||||
|
|
||||||
@@ -57,10 +57,9 @@ class piratebay(object):
|
|||||||
if params['href'].startswith('/torrent/'):
|
if params['href'].startswith('/torrent/'):
|
||||||
self.current_item = {}
|
self.current_item = {}
|
||||||
self.td_counter = 0
|
self.td_counter = 0
|
||||||
self.code = params['href'].split('/')[2]
|
self.current_item['desc_link'] = 'http://thepiratebay.se'+params['href'].strip()
|
||||||
self.current_item['desc_link'] = 'http://thepiratebay.org'+params['href'].strip()
|
|
||||||
self.in_name = True
|
self.in_name = True
|
||||||
elif params['href'].startswith('http://torrents.thepiratebay.org/%s'%self.code):
|
elif params['href'].startswith('magnet:'):
|
||||||
self.current_item['link']=params['href'].strip()
|
self.current_item['link']=params['href'].strip()
|
||||||
self.in_name = False
|
self.in_name = False
|
||||||
|
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ void SearchEngine::installPython() {
|
|||||||
DownloadThread *pydownloader = new DownloadThread(this);
|
DownloadThread *pydownloader = new DownloadThread(this);
|
||||||
connect(pydownloader, SIGNAL(downloadFinished(QString,QString)), this, SLOT(pythonDownloadSuccess(QString,QString)));
|
connect(pydownloader, SIGNAL(downloadFinished(QString,QString)), this, SLOT(pythonDownloadSuccess(QString,QString)));
|
||||||
connect(pydownloader, SIGNAL(downloadFailure(QString,QString)), this, SLOT(pythonDownloadFailure(QString,QString)));
|
connect(pydownloader, SIGNAL(downloadFailure(QString,QString)), this, SLOT(pythonDownloadFailure(QString,QString)));
|
||||||
pydownloader->downloadUrl("http://python.org/ftp/python/2.7.2/python-2.7.2.msi");
|
pydownloader->downloadUrl("http://python.org/ftp/python/2.7.3/python-2.7.3.msi");
|
||||||
}
|
}
|
||||||
|
|
||||||
void SearchEngine::pythonDownloadSuccess(QString url, QString file_path) {
|
void SearchEngine::pythonDownloadSuccess(QString url, QString file_path) {
|
||||||
@@ -421,7 +421,8 @@ void SearchEngine::downloadTorrent(QString engine_url, QString torrent_url) {
|
|||||||
qDebug("Converting bc link to magnet link");
|
qDebug("Converting bc link to magnet link");
|
||||||
torrent_url = misc::bcLinkToMagnet(torrent_url);
|
torrent_url = misc::bcLinkToMagnet(torrent_url);
|
||||||
}
|
}
|
||||||
if(torrent_url.startsWith("magnet:")) {
|
qDebug() << Q_FUNC_INFO << torrent_url;
|
||||||
|
if (torrent_url.startsWith("magnet:")) {
|
||||||
QStringList urls;
|
QStringList urls;
|
||||||
urls << torrent_url;
|
urls << torrent_url;
|
||||||
mp_mainWindow->downloadFromURLList(urls);
|
mp_mainWindow->downloadFromURLList(urls);
|
||||||
|
|||||||
@@ -501,10 +501,8 @@ void torrentAdditionDialog::updateDiskSpaceLabels() {
|
|||||||
// Determine torrent size
|
// Determine torrent size
|
||||||
qulonglong torrent_size = 0;
|
qulonglong torrent_size = 0;
|
||||||
if(t->num_files() > 1) {
|
if(t->num_files() > 1) {
|
||||||
const unsigned int nbFiles = t->num_files();
|
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
|
||||||
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(nbFiles);
|
for(unsigned int i=0; i<priorities.size(); ++i) {
|
||||||
|
|
||||||
for(unsigned int i=0; i<nbFiles; ++i) {
|
|
||||||
if(priorities[i] > 0)
|
if(priorities[i] > 0)
|
||||||
torrent_size += t->file_at(i).size;
|
torrent_size += t->file_at(i).size;
|
||||||
}
|
}
|
||||||
@@ -598,7 +596,7 @@ bool torrentAdditionDialog::allFiltered() const {
|
|||||||
void torrentAdditionDialog::savePiecesPriorities(){
|
void torrentAdditionDialog::savePiecesPriorities(){
|
||||||
qDebug("Saving pieces priorities");
|
qDebug("Saving pieces priorities");
|
||||||
Q_ASSERT(!is_magnet);
|
Q_ASSERT(!is_magnet);
|
||||||
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(t->num_files());
|
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
|
||||||
TorrentTempData::setFilesPriority(hash, priorities);
|
TorrentTempData::setFilesPriority(hash, priorities);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -338,11 +338,10 @@ class TorrentFilesModel: public QAbstractItemModel {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
TorrentFileItem *rootItem;
|
TorrentFileItem *rootItem;
|
||||||
TorrentFileItem **files_index;
|
std::vector<TorrentFileItem *> files_index;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TorrentFilesModel(QObject *parent=0): QAbstractItemModel(parent) {
|
TorrentFilesModel(QObject *parent=0): QAbstractItemModel(parent) {
|
||||||
files_index = 0;
|
|
||||||
QList<QVariant> rootData;
|
QList<QVariant> rootData;
|
||||||
rootData << tr("Name") << tr("Size") << tr("Progress") << tr("Priority");
|
rootData << tr("Name") << tr("Size") << tr("Progress") << tr("Priority");
|
||||||
rootItem = new TorrentFileItem(rootData);
|
rootItem = new TorrentFileItem(rootData);
|
||||||
@@ -350,13 +349,16 @@ public:
|
|||||||
|
|
||||||
~TorrentFilesModel() {
|
~TorrentFilesModel() {
|
||||||
qDebug() << Q_FUNC_INFO << "ENTER";
|
qDebug() << Q_FUNC_INFO << "ENTER";
|
||||||
delete [] files_index;
|
|
||||||
delete rootItem;
|
delete rootItem;
|
||||||
qDebug() << Q_FUNC_INFO << "EXIT";
|
qDebug() << Q_FUNC_INFO << "EXIT";
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateFilesProgress(std::vector<libtorrent::size_type> fp) {
|
void updateFilesProgress(const std::vector<libtorrent::size_type>& fp) {
|
||||||
emit layoutAboutToBeChanged();
|
emit layoutAboutToBeChanged();
|
||||||
|
|
||||||
|
if (fp.size() != files_index.size())
|
||||||
|
return;
|
||||||
|
|
||||||
for(unsigned int i=0; i<fp.size(); ++i) {
|
for(unsigned int i=0; i<fp.size(); ++i) {
|
||||||
Q_ASSERT(fp[i] >= 0);
|
Q_ASSERT(fp[i] >= 0);
|
||||||
files_index[i]->setProgress(fp[i]);
|
files_index[i]->setProgress(fp[i]);
|
||||||
@@ -366,6 +368,10 @@ public:
|
|||||||
|
|
||||||
void updateFilesPriorities(const std::vector<int> &fprio) {
|
void updateFilesPriorities(const std::vector<int> &fprio) {
|
||||||
emit layoutAboutToBeChanged();
|
emit layoutAboutToBeChanged();
|
||||||
|
|
||||||
|
if (fprio.size() != files_index.size())
|
||||||
|
return;
|
||||||
|
|
||||||
for(unsigned int i=0; i<fprio.size(); ++i) {
|
for(unsigned int i=0; i<fprio.size(); ++i) {
|
||||||
//qDebug("Called updateFilesPriorities with %d", fprio[i]);
|
//qDebug("Called updateFilesPriorities with %d", fprio[i]);
|
||||||
files_index[i]->setPriority(fprio[i]);
|
files_index[i]->setPriority(fprio[i]);
|
||||||
@@ -373,9 +379,9 @@ public:
|
|||||||
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
|
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> getFilesPriorities(unsigned int nbFiles) const {
|
std::vector<int> getFilesPriorities() const {
|
||||||
std::vector<int> prio;
|
std::vector<int> prio;
|
||||||
for(unsigned int i=0; i<nbFiles; ++i) {
|
for(unsigned int i=0; i<files_index.size(); ++i) {
|
||||||
//qDebug("Called getFilesPriorities: %d", files_index[i]->getPriority());
|
//qDebug("Called getFilesPriorities: %d", files_index[i]->getPriority());
|
||||||
prio.push_back(files_index[i]->getPriority());
|
prio.push_back(files_index[i]->getPriority());
|
||||||
}
|
}
|
||||||
@@ -409,7 +415,7 @@ public:
|
|||||||
item->setPriority(prio::IGNORED);
|
item->setPriority(prio::IGNORED);
|
||||||
else
|
else
|
||||||
item->setPriority(prio::NORMAL);
|
item->setPriority(prio::NORMAL);
|
||||||
emit dataChanged(this->index(0,0), this->index(rowCount(), columnCount()));
|
emit dataChanged(this->index(0,0), this->index(rowCount()-1, columnCount()-1));
|
||||||
emit filteredFilesChanged();
|
emit filteredFilesChanged();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -541,10 +547,7 @@ public:
|
|||||||
void clear() {
|
void clear() {
|
||||||
qDebug("clear called");
|
qDebug("clear called");
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
if(files_index) {
|
files_index.clear();
|
||||||
delete [] files_index;
|
|
||||||
files_index = 0;
|
|
||||||
}
|
|
||||||
rootItem->deleteAllChildren();
|
rootItem->deleteAllChildren();
|
||||||
endResetModel();
|
endResetModel();
|
||||||
}
|
}
|
||||||
@@ -555,7 +558,7 @@ public:
|
|||||||
emit layoutAboutToBeChanged();
|
emit layoutAboutToBeChanged();
|
||||||
// Initialize files_index array
|
// Initialize files_index array
|
||||||
qDebug("Torrent contains %d files", t.num_files());
|
qDebug("Torrent contains %d files", t.num_files());
|
||||||
files_index = new TorrentFileItem*[t.num_files()];
|
files_index.reserve(t.num_files());
|
||||||
|
|
||||||
TorrentFileItem *parent = this->rootItem;
|
TorrentFileItem *parent = this->rootItem;
|
||||||
TorrentFileItem *root_folder = parent;
|
TorrentFileItem *root_folder = parent;
|
||||||
@@ -582,8 +585,7 @@ public:
|
|||||||
current_parent = new_parent;
|
current_parent = new_parent;
|
||||||
}
|
}
|
||||||
// Actually create the file
|
// Actually create the file
|
||||||
TorrentFileItem *f = new TorrentFileItem(t, fentry, current_parent, i);
|
files_index.push_back(new TorrentFileItem(t, fentry, current_parent, i));
|
||||||
files_index[i] = f;
|
|
||||||
}
|
}
|
||||||
emit layoutChanged();
|
emit layoutChanged();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
#include "transferlistdelegate.h"
|
#include "transferlistdelegate.h"
|
||||||
#include "transferlistwidget.h"
|
#include "transferlistwidget.h"
|
||||||
@@ -62,6 +63,10 @@ public:
|
|||||||
// Accept drop
|
// Accept drop
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
|
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
|
||||||
|
setStyleSheet("QListWidget { background: transparent; border: 0 }");
|
||||||
|
#if defined(Q_WS_MAC)
|
||||||
|
setAttribute(Qt::WA_MacShowFocusRect, false);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Redefine addItem() to make sure the list stays sorted
|
// Redefine addItem() to make sure the list stays sorted
|
||||||
@@ -158,13 +163,17 @@ public:
|
|||||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
// Height is fixed (sizeHint().height() is used)
|
// Height is fixed (sizeHint().height() is used)
|
||||||
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
||||||
|
setStyleSheet("QListWidget { background: transparent; border: 0 }");
|
||||||
|
#if defined(Q_WS_MAC)
|
||||||
|
setAttribute(Qt::WA_MacShowFocusRect, false);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QSize sizeHint() const {
|
QSize sizeHint() const {
|
||||||
QSize size = QListWidget::sizeHint();
|
QSize size = QListWidget::sizeHint();
|
||||||
// Height should be exactly the height of the content
|
// Height should be exactly the height of the content
|
||||||
size.setHeight(contentsSize().height() + 2 * frameWidth());
|
size.setHeight(contentsSize().height() + 2 * frameWidth() + 6);
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,8 +199,19 @@ public:
|
|||||||
// Construct lists
|
// Construct lists
|
||||||
vLayout = new QVBoxLayout();
|
vLayout = new QVBoxLayout();
|
||||||
vLayout->setContentsMargins(0, 4, 0, 4);
|
vLayout->setContentsMargins(0, 4, 0, 4);
|
||||||
|
QFont font;
|
||||||
|
font.setBold(true);
|
||||||
|
font.setCapitalization(QFont::SmallCaps);
|
||||||
|
QLabel *torrentsLabel = new QLabel(tr("Torrents"));
|
||||||
|
torrentsLabel->setIndent(2);
|
||||||
|
torrentsLabel->setFont(font);
|
||||||
|
vLayout->addWidget(torrentsLabel);
|
||||||
statusFilters = new StatusFiltersWidget(this);
|
statusFilters = new StatusFiltersWidget(this);
|
||||||
vLayout->addWidget(statusFilters);
|
vLayout->addWidget(statusFilters);
|
||||||
|
QLabel *labelsLabel = new QLabel(tr("Labels"));
|
||||||
|
labelsLabel->setIndent(2);
|
||||||
|
labelsLabel->setFont(font);
|
||||||
|
vLayout->addWidget(labelsLabel);
|
||||||
labelFilters = new LabelFiltersList(this);
|
labelFilters = new LabelFiltersList(this);
|
||||||
vLayout->addWidget(labelFilters);
|
vLayout->addWidget(labelFilters);
|
||||||
setLayout(vLayout);
|
setLayout(vLayout);
|
||||||
|
|||||||
@@ -106,6 +106,9 @@ TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *main_window,
|
|||||||
setItemsExpandable(false);
|
setItemsExpandable(false);
|
||||||
setAutoScroll(true);
|
setAutoScroll(true);
|
||||||
setDragDropMode(QAbstractItemView::DragOnly);
|
setDragDropMode(QAbstractItemView::DragOnly);
|
||||||
|
#if defined(Q_WS_MAC)
|
||||||
|
setAttribute(Qt::WA_MacShowFocusRect, false);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Default hidden columns
|
// Default hidden columns
|
||||||
if(!column_loaded) {
|
if(!column_loaded) {
|
||||||
|
|||||||
@@ -109,7 +109,10 @@ QList<QVariantMap> EventManager::getPropFilesInfo(QString hash) const {
|
|||||||
h.file_progress(fp);
|
h.file_progress(fp);
|
||||||
for(int i=0; i<h.num_files(); ++i) {
|
for(int i=0; i<h.num_files(); ++i) {
|
||||||
QVariantMap file;
|
QVariantMap file;
|
||||||
file["name"] = h.filename_at(i);
|
QString fileName = h.filename_at(i);
|
||||||
|
if (fileName.endsWith(".!qB"))
|
||||||
|
fileName.chop(4);
|
||||||
|
file["name"] = fileName;
|
||||||
libtorrent::size_type size = h.filesize_at(i);
|
libtorrent::size_type size = h.filesize_at(i);
|
||||||
file["size"] = misc::friendlyUnit((double)size);
|
file["size"] = misc::friendlyUnit((double)size);
|
||||||
if(size > 0)
|
if(size > 0)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<img src="../images/skin/mascot.png" align="right"></img>
|
<img src="images/skin/mascot.png" align="right"></img>
|
||||||
<p>qBittorrent ${VERSION} (Web UI)</p>
|
<p>qBittorrent ${VERSION} (Web UI)</p>
|
||||||
<p>Copyright (c) 2011 <a href="mailto:chris@qbittorrent.org">Christophe Dumez</a></p>
|
<p>Copyright (c) 2011 <a href="mailto:chris@qbittorrent.org">Christophe Dumez</a></p>
|
||||||
<p>Homepage: <a href="http://www.qbittorrent.com">http://www.qbittorrent.com</a></p>
|
<p>Homepage: <a href="http://www.qbittorrent.com">http://www.qbittorrent.com</a></p>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
$('addTrackersButton').addEvent('click', function(e){
|
$('addTrackersButton').addEvent('click', function(e){
|
||||||
new Event(e).stop();
|
new Event(e).stop();
|
||||||
var hash = new URI().getData('hash');
|
var hash = new URI().getData('hash');
|
||||||
new Request({url: '/command/addTrackers', method: 'post', data: {hash: hash, urls: $('trackersUrls').value},
|
new Request({url: 'command/addTrackers', method: 'post', data: {hash: hash, urls: $('trackersUrls').value},
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
window.parent.document.getElementById('trackersPage').parentNode.removeChild(window.parent.document.getElementById('trackersPage'));
|
window.parent.document.getElementById('trackersPage').parentNode.removeChild(window.parent.document.getElementById('trackersPage'));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ window.addEvent('domready', function(){
|
|||||||
});
|
});
|
||||||
$('confirmBtn').addEvent('click', function(e){
|
$('confirmBtn').addEvent('click', function(e){
|
||||||
new Event(e).stop();
|
new Event(e).stop();
|
||||||
var cmd = '/command/delete';
|
var cmd = 'command/delete';
|
||||||
if($('deleteFromDiskCB').get('checked'))
|
if($('deleteFromDiskCB').get('checked'))
|
||||||
cmd = '/command/deletePerm';
|
cmd = 'command/deletePerm';
|
||||||
new Request({url: cmd,
|
new Request({url: cmd,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {hashes: hashes.join('|')},
|
data: {hashes: hashes.join('|')},
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
setDlLimit = function() {
|
setDlLimit = function() {
|
||||||
var limit = $("dllimitUpdatevalue").get('html').toInt() * 1024;
|
var limit = $("dllimitUpdatevalue").get('html').toInt() * 1024;
|
||||||
if(hash == "global") {
|
if(hash == "global") {
|
||||||
new Request({url: '/command/setGlobalDlLimit',
|
new Request({url: 'command/setGlobalDlLimit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {'limit': limit},
|
data: {'limit': limit},
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
}
|
}
|
||||||
}).send();
|
}).send();
|
||||||
} else {
|
} else {
|
||||||
new Request({url: '/command/setTorrentDlLimit',
|
new Request({url: 'command/setTorrentDlLimit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {'hash': hash, 'limit': limit},
|
data: {'hash': hash, 'limit': limit},
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
@@ -51,4 +51,4 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -196,7 +196,7 @@
|
|||||||
|
|
||||||
<fieldset class="settings">
|
<fieldset class="settings">
|
||||||
<legend>_(Torrent Queueing)</legend>
|
<legend>_(Torrent Queueing)</legend>
|
||||||
<input type="checkbox" id="queueing_checkbox" onclick="updateQueuingSystem();"/>
|
<input type="checkbox" id="queueing_checkbox" onclick="updateQueueingSystem();"/>
|
||||||
<label for="queueing_checkbox">_(Torrent Queueing)</label><br/>
|
<label for="queueing_checkbox">_(Torrent Queueing)</label><br/>
|
||||||
<div class="formRow">
|
<div class="formRow">
|
||||||
<label for="max_active_dl_value" style="margin-left: 20px;" class="leftLabelLarge">_(Maximum active downloads:)</label>
|
<label for="max_active_dl_value" style="margin-left: 20px;" class="leftLabelLarge">_(Maximum active downloads:)</label>
|
||||||
@@ -1043,7 +1043,7 @@ applyPreferences = function() {
|
|||||||
// Send it to qBT
|
// Send it to qBT
|
||||||
var json_str = JSON.encode(settings);
|
var json_str = JSON.encode(settings);
|
||||||
|
|
||||||
new Request({url: '/command/setPreferences',
|
new Request({url: 'command/setPreferences',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {'json': json_str,
|
data: {'json': json_str,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ var allCBUnchecked = function() {
|
|||||||
|
|
||||||
var setFilePriority = function(id, priority) {
|
var setFilePriority = function(id, priority) {
|
||||||
if(current_hash == "") return;
|
if(current_hash == "") return;
|
||||||
new Request({url: '/command/setFilePrio', method: 'post', data: {'hash': current_hash, 'id': id, 'priority': priority}}).send();
|
new Request({url: 'command/setFilePrio', method: 'post', data: {'hash': current_hash, 'id': id, 'priority': priority}}).send();
|
||||||
// Display or add combobox
|
// Display or add combobox
|
||||||
if(priority > 0) {
|
if(priority > 0) {
|
||||||
$('comboPrio'+id).set("value", 1);
|
$('comboPrio'+id).set("value", 1);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ function hideAll() {
|
|||||||
<iframe id="upload_frame" name="upload_frame" style="width:1px;height:1px;border:0px;" src="javascript:false;"></iframe>
|
<iframe id="upload_frame" name="upload_frame" style="width:1px;height:1px;border:0px;" src="javascript:false;"></iframe>
|
||||||
<center>
|
<center>
|
||||||
<h1 class="vcenter"><img class="vcenter" title="Download local torrent" src="theme/list-add"/>_(Download local torrent)</h1>
|
<h1 class="vcenter"><img class="vcenter" title="Download local torrent" src="theme/list-add"/>_(Download local torrent)</h1>
|
||||||
<form action="/command/upload" enctype="multipart/form-data" method="post" id="uploadForm" target="upload_frame">
|
<form action="command/upload" enctype="multipart/form-data" method="post" id="uploadForm" target="upload_frame">
|
||||||
<input type="file" name="torrentfile" id="torrentfile" size="40"/><br/><br/>
|
<input type="file" name="torrentfile" id="torrentfile" size="40"/><br/><br/>
|
||||||
<input type="submit" value="_(Download)" id="upButton"/>
|
<input type="submit" value="_(Download)" id="upButton"/>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
setUpLimit = function() {
|
setUpLimit = function() {
|
||||||
var limit = $("uplimitUpdatevalue").get('html').toInt() * 1024;
|
var limit = $("uplimitUpdatevalue").get('html').toInt() * 1024;
|
||||||
if(hash == "global") {
|
if(hash == "global") {
|
||||||
new Request({url: '/command/setGlobalUpLimit',
|
new Request({url: 'command/setGlobalUpLimit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {'limit': limit},
|
data: {'limit': limit},
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
}
|
}
|
||||||
}).send();
|
}).send();
|
||||||
}else {
|
}else {
|
||||||
new Request({url: '/command/setTorrentUpLimit',
|
new Request({url: 'command/setTorrentUpLimit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {'hash': hash, 'limit': limit},
|
data: {'hash': hash, 'limit': limit},
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
@@ -51,4 +51,4 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ void HttpConnection::read() {
|
|||||||
const int expected_length = m_parser.header().contentLength();
|
const int expected_length = m_parser.header().contentLength();
|
||||||
QByteArray message = input.mid(header_end + 4, expected_length);
|
QByteArray message = input.mid(header_end + 4, expected_length);
|
||||||
|
|
||||||
if (expected_length > 100000) {
|
if (expected_length > 10000000) {
|
||||||
qWarning() << "Bad request: message too long";
|
qWarning() << "Bad request: message too long";
|
||||||
m_generator.setStatusLine(400, "Bad Request");
|
m_generator.setStatusLine(400, "Bad Request");
|
||||||
input.clear();
|
input.clear();
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ void HttpResponseGenerator::setContentTypeByExt(const QString& ext) {
|
|||||||
setContentType("text/javascript");
|
setContentType("text/javascript");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(ext == "png") {
|
if (ext == "png") {
|
||||||
setContentType("image/x-png");
|
setContentType("image/png");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ window.addEvent('domready', function(){
|
|||||||
$('urls').focus();
|
$('urls').focus();
|
||||||
$('downButton').addEvent('click', function(e){
|
$('downButton').addEvent('click', function(e){
|
||||||
new Event(e).stop();
|
new Event(e).stop();
|
||||||
new Request({url: '/command/download', method: 'post', data: {urls: $('urls').value},
|
new Request({url: 'command/download', method: 'post', data: {urls: $('urls').value},
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
window.parent.document.getElementById('downloadPage').parentNode.removeChild(window.parent.document.getElementById('downloadPage'));
|
window.parent.document.getElementById('downloadPage').parentNode.removeChild(window.parent.document.getElementById('downloadPage'));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ initializeWindows = function(){
|
|||||||
var h = myTable.selectedIds();
|
var h = myTable.selectedIds();
|
||||||
/*if(h.length && confirm('_(Are you sure you want to delete the selected torrents from the transfer list?)')) {
|
/*if(h.length && confirm('_(Are you sure you want to delete the selected torrents from the transfer list?)')) {
|
||||||
h.each(function(item, index){
|
h.each(function(item, index){
|
||||||
new Request({url: '/command/delete', method: 'post', data: {hash: item}}).send();
|
new Request({url: 'command/delete', method: 'post', data: {hash: item}}).send();
|
||||||
});
|
});
|
||||||
}*/
|
}*/
|
||||||
if(h.length) {
|
if(h.length) {
|
||||||
@@ -180,7 +180,7 @@ initializeWindows = function(){
|
|||||||
var h = myTable.selectedIds();
|
var h = myTable.selectedIds();
|
||||||
if(h.length){
|
if(h.length){
|
||||||
h.each(function(hash, index){
|
h.each(function(hash, index){
|
||||||
new Request({url: '/command/pause', method: 'post', data: {hash: hash}}).send();
|
new Request({url: 'command/pause', method: 'post', data: {hash: hash}}).send();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -189,7 +189,7 @@ initializeWindows = function(){
|
|||||||
var h = myTable.selectedIds();
|
var h = myTable.selectedIds();
|
||||||
if(h.length){
|
if(h.length){
|
||||||
h.each(function(hash, index){
|
h.each(function(hash, index){
|
||||||
new Request({url: '/command/resume', method: 'post', data: {hash: hash}}).send();
|
new Request({url: 'command/resume', method: 'post', data: {hash: hash}}).send();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -198,7 +198,7 @@ initializeWindows = function(){
|
|||||||
var h = myTable.selectedIds();
|
var h = myTable.selectedIds();
|
||||||
if(h.length){
|
if(h.length){
|
||||||
h.each(function(hash, index){
|
h.each(function(hash, index){
|
||||||
new Request({url: '/command/recheck', method: 'post', data: {hash: hash}}).send();
|
new Request({url: 'command/recheck', method: 'post', data: {hash: hash}}).send();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -209,14 +209,14 @@ initializeWindows = function(){
|
|||||||
var h = myTable.selectedIds();
|
var h = myTable.selectedIds();
|
||||||
if(h.length){
|
if(h.length){
|
||||||
h.each(function(hash, index){
|
h.each(function(hash, index){
|
||||||
new Request({url: '/command/'+item, method: 'post', data: {hash: hash}}).send();
|
new Request({url: 'command/'+item, method: 'post', data: {hash: hash}}).send();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
addClickEvent(item+'All', function(e){
|
addClickEvent(item+'All', function(e){
|
||||||
new Event(e).stop();
|
new Event(e).stop();
|
||||||
new Request({url: '/command/'+item+'all'}).send();
|
new Request({url: 'command/'+item+'all'}).send();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -230,7 +230,7 @@ initializeWindows = function(){
|
|||||||
setPriorityFN = function(cmd) {
|
setPriorityFN = function(cmd) {
|
||||||
var h = myTable.selectedIds();
|
var h = myTable.selectedIds();
|
||||||
if(h.length) {
|
if(h.length) {
|
||||||
new Request({url: '/command/'+cmd, method: 'post', data: {hashes: h.join("|")}}).send();
|
new Request({url: 'command/'+cmd, method: 'post', data: {hashes: h.join("|")}}).send();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ MochaUI.extend({
|
|||||||
// Get global upload limit
|
// Get global upload limit
|
||||||
var maximum = 500;
|
var maximum = 500;
|
||||||
var req = new Request({
|
var req = new Request({
|
||||||
url: '/command/getGlobalUpLimit',
|
url: 'command/getGlobalUpLimit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {},
|
data: {},
|
||||||
onSuccess: function(data) {
|
onSuccess: function(data) {
|
||||||
@@ -64,7 +64,7 @@ MochaUI.extend({
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var req = new Request({
|
var req = new Request({
|
||||||
url: '/command/getTorrentUpLimit',
|
url: 'command/getTorrentUpLimit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {hash: hash},
|
data: {hash: hash},
|
||||||
onSuccess: function(data) {
|
onSuccess: function(data) {
|
||||||
@@ -109,7 +109,7 @@ MochaUI.extend({
|
|||||||
// Get global upload limit
|
// Get global upload limit
|
||||||
var maximum = 500;
|
var maximum = 500;
|
||||||
var req = new Request({
|
var req = new Request({
|
||||||
url: '/command/getGlobalDlLimit',
|
url: 'command/getGlobalDlLimit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {},
|
data: {},
|
||||||
onSuccess: function(data) {
|
onSuccess: function(data) {
|
||||||
@@ -151,7 +151,7 @@ MochaUI.extend({
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var req = new Request({
|
var req = new Request({
|
||||||
url: '/command/getTorrentDlLimit',
|
url: 'command/getTorrentDlLimit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {hash: hash},
|
data: {hash: hash},
|
||||||
onSuccess: function(data) {
|
onSuccess: function(data) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Generated by the configure file
|
# Generated by the configure file
|
||||||
include(conf.pri)
|
include($$OUT_PWD/../conf.pri)
|
||||||
|
|
||||||
# COMPILATION SPECIFIC
|
# COMPILATION SPECIFIC
|
||||||
!nox:dbus {
|
!nox:dbus {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
PROJECT_NAME = qbittorrent
|
PROJECT_NAME = qbittorrent
|
||||||
PROJECT_VERSION = 2.9.8
|
PROJECT_VERSION = 2.9.11
|
||||||
|
|
||||||
os2 {
|
os2 {
|
||||||
DEFINES += VERSION=\'\"v$${PROJECT_VERSION}\"\'
|
DEFINES += VERSION=\'\"v$${PROJECT_VERSION}\"\'
|
||||||
@@ -9,4 +9,4 @@ os2 {
|
|||||||
|
|
||||||
DEFINES += VERSION_MAJOR=2
|
DEFINES += VERSION_MAJOR=2
|
||||||
DEFINES += VERSION_MINOR=9
|
DEFINES += VERSION_MINOR=9
|
||||||
DEFINES += VERSION_BUGFIX=8
|
DEFINES += VERSION_BUGFIX=11
|
||||||
|
|||||||
Reference in New Issue
Block a user