Browse Source

- Branched trunk in order to work on a major GUI remodeling. I will attempt to:

* Merge download and upload lists
  * Display torrent properties in the same tab (horizontal split)
adaptive-webui-19844
Christophe Dumez 15 years ago
parent
commit
7792b4f849
  1. 4
      AUTHORS
  2. 3
      Changelog
  3. 14
      INSTALL
  4. 90
      configure
  5. 2
      doc/qbittorrent.1
  6. 3
      qbittorrent.qc
  7. 61
      qcm/libcurl.qcm
  8. 9
      qcm/qt4.qcm
  9. 398
      src/GUI.cpp
  10. 14
      src/GUI.h
  11. 8
      src/about_imp.h
  12. 7
      src/addTorrentDialog.ui
  13. 41
      src/bittorrent.cpp
  14. 271
      src/downloadThread.cpp
  15. 60
      src/downloadThread.h
  16. 1
      src/engineSelectDlg.cpp
  17. BIN
      src/lang/qbittorrent_bg.qm
  18. 530
      src/lang/qbittorrent_bg.ts
  19. BIN
      src/lang/qbittorrent_ca.qm
  20. 548
      src/lang/qbittorrent_ca.ts
  21. BIN
      src/lang/qbittorrent_cs.qm
  22. 530
      src/lang/qbittorrent_cs.ts
  23. BIN
      src/lang/qbittorrent_da.qm
  24. 548
      src/lang/qbittorrent_da.ts
  25. BIN
      src/lang/qbittorrent_de.qm
  26. 532
      src/lang/qbittorrent_de.ts
  27. BIN
      src/lang/qbittorrent_el.qm
  28. 530
      src/lang/qbittorrent_el.ts
  29. 551
      src/lang/qbittorrent_en.ts
  30. BIN
      src/lang/qbittorrent_es.qm
  31. 532
      src/lang/qbittorrent_es.ts
  32. BIN
      src/lang/qbittorrent_fi.qm
  33. 530
      src/lang/qbittorrent_fi.ts
  34. BIN
      src/lang/qbittorrent_fr.qm
  35. 534
      src/lang/qbittorrent_fr.ts
  36. BIN
      src/lang/qbittorrent_hu.qm
  37. 530
      src/lang/qbittorrent_hu.ts
  38. BIN
      src/lang/qbittorrent_it.qm
  39. 530
      src/lang/qbittorrent_it.ts
  40. BIN
      src/lang/qbittorrent_ja.qm
  41. 530
      src/lang/qbittorrent_ja.ts
  42. BIN
      src/lang/qbittorrent_ko.qm
  43. 530
      src/lang/qbittorrent_ko.ts
  44. BIN
      src/lang/qbittorrent_nb.qm
  45. 548
      src/lang/qbittorrent_nb.ts
  46. BIN
      src/lang/qbittorrent_nl.qm
  47. 119
      src/lang/qbittorrent_nl.ts
  48. BIN
      src/lang/qbittorrent_pl.qm
  49. 119
      src/lang/qbittorrent_pl.ts
  50. BIN
      src/lang/qbittorrent_pt.qm
  51. 119
      src/lang/qbittorrent_pt.ts
  52. BIN
      src/lang/qbittorrent_pt_BR.qm
  53. 119
      src/lang/qbittorrent_pt_BR.ts
  54. BIN
      src/lang/qbittorrent_ro.qm
  55. 119
      src/lang/qbittorrent_ro.ts
  56. BIN
      src/lang/qbittorrent_ru.qm
  57. 119
      src/lang/qbittorrent_ru.ts
  58. BIN
      src/lang/qbittorrent_sk.qm
  59. 119
      src/lang/qbittorrent_sk.ts
  60. BIN
      src/lang/qbittorrent_sv.qm
  61. 119
      src/lang/qbittorrent_sv.ts
  62. BIN
      src/lang/qbittorrent_tr.qm
  63. 119
      src/lang/qbittorrent_tr.ts
  64. BIN
      src/lang/qbittorrent_uk.qm
  65. 123
      src/lang/qbittorrent_uk.ts
  66. BIN
      src/lang/qbittorrent_zh.qm
  67. 119
      src/lang/qbittorrent_zh.ts
  68. BIN
      src/lang/qbittorrent_zh_TW.qm
  69. 119
      src/lang/qbittorrent_zh_TW.ts
  70. 22
      src/main.cpp
  71. 9
      src/qtorrenthandle.cpp
  72. 3
      src/qtorrenthandle.h
  73. 12
      src/rss.cpp
  74. 16
      src/rss.h
  75. 4
      src/rss_imp.cpp
  76. 7
      src/src.pro
  77. 2
      src/torrentAddition.h
  78. 19
      src/torrentPersistentData.h

4
AUTHORS

@ -2,10 +2,10 @@ Author: @@ -2,10 +2,10 @@ Author:
* Christophe Dumez <chris@qbittorrent.org>
Contributors:
* Arnaud Demaizière <arnaud@qbittorrent.org>
* Stefanos Antaris <santaris@csd.auth.gr>
* Ishan Arora <ishan@qbittorrent.org>
* Arnaud Demaizière <arnaud@qbittorrent.org>
* Grigis Gaëtan <cipher16@gmail.com>
* Stefanos Antaris <santaris@csd.auth.gr>
Code from other projects:
* files src/ico.cpp src/ico.h

3
Changelog

@ -11,6 +11,9 @@ @@ -11,6 +11,9 @@
- FEATURE: Tracker connections are now also subject to IP filtering
- FEATURE: Include DHT traffic in the rate limiter
- FEATURE: Support for bitcomet padding files
- FEATURE: Option to skip file checking and start seeding immediately in torrent addition dialog (Stephanos Antaris)
- FEATURE: Dropped dependency on libcurl
- FEATURE: Dropped Qt 4.3 support (Qt >= 4.4 is required)
* Thu Sep 3 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.0
- FEATURE: Added Magnet URI support

14
INSTALL

@ -1,12 +1,6 @@ @@ -1,12 +1,6 @@
qBittorrent - A BitTorrent client in C++ / Qt4
------------------------------------------
*** Necessary if qt3 is default on your system ***
export QTDIR=/usr/include/qt4
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib
*** End ***
./configure
make && make install
qbittorrent
@ -14,8 +8,7 @@ qbittorrent @@ -14,8 +8,7 @@ qbittorrent
will install and execute qBittorrent hopefully without any problems.
Dependencies:
- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
Qt >= 4.4.0 is advised
- Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
- libtorrent-rasterbar by Arvid Norberg (>= v0.15.0 REQUIRED)
-> http://www.qbittorrent.org/download.php (advised)
@ -24,13 +17,8 @@ Dependencies: @@ -24,13 +17,8 @@ Dependencies:
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
- libcurl
- python >= 2.3 (needed by search engine)
- libmagick++ (advised, not required)
* Needed for favicons support (RSS / Search plugins)
- libzzip (advised, not required)
* Needed for zip support (Search plugins)

90
configure vendored

@ -19,8 +19,6 @@ Main options: @@ -19,8 +19,6 @@ Main options:
Dependency options:
--with-libboost-inc=[path] Path to libboost include files
--with-libcurl-inc=[path] Path to libcurl include files
--with-libcurl-lib=[path] Path to libcurl library files
--disable-libzzip Disable use of libzzip
--with-libzzip-inc=[path] Path to libzzip++ include files
--with-libzzip-lib=[path] Path to libzzip++ library files
@ -145,16 +143,6 @@ while [ $# -gt 0 ]; do @@ -145,16 +143,6 @@ while [ $# -gt 0 ]; do
shift
;;
--with-libcurl-inc=*)
QC_WITH_LIBCURL_INC=$optarg
shift
;;
--with-libcurl-lib=*)
QC_WITH_LIBCURL_LIB=$optarg
shift
;;
--disable-libzzip)
QC_DISABLE_libzzip="Y"
shift
@ -192,8 +180,6 @@ echo BINDIR=$BINDIR @@ -192,8 +180,6 @@ echo BINDIR=$BINDIR
echo DATADIR=$DATADIR
echo EX_QTDIR=$EX_QTDIR
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC
echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB
echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip
echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC
echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB
@ -308,14 +294,11 @@ class qc_qt4 : public ConfObj @@ -308,14 +294,11 @@ class qc_qt4 : public ConfObj
{
public:
qc_qt4(Conf *c) : ConfObj(c) {}
QString name() const { return "Qt >= 4.3"; }
QString shortname() const { return "Qt 4.3"; }
QString name() const { return "Qt >= 4.4"; }
QString shortname() const { return "Qt 4.4"; }
bool exec()
{
if(QT_VERSION >= 0x040400) {
conf->addDefine("QT_4_4");
}
return(QT_VERSION >= 0x040300);
return(QT_VERSION >= 0x040400);
}
};
@ -403,68 +386,6 @@ public: @@ -403,68 +386,6 @@ public:
return true;
}
};
#line 1 "libcurl.qcm"
/*
-----BEGIN QCMOD-----
name: libcommoncpp2
arg: with-libcurl-inc=[path], Path to libcurl include files
arg: with-libcurl-lib=[path], Path to libcurl library files
-----END QCMOD-----
*/
class qc_libcurl : public ConfObj
{
public:
qc_libcurl(Conf *c) : ConfObj(c) {}
QString name() const { return "libcurl"; }
QString shortname() const { return "libcurl"; }
bool exec(){
QString s;
s = conf->getenv("QC_WITH_LIBCURL_INC");
if(!s.isEmpty()) {
if(!conf->checkHeader(s, "curl/curl.h")) {
return false;
}
}else{
QStringList sl;
sl << "/usr/include";
sl << "/usr/local/include";
bool found = false;
foreach(s, sl){
if(conf->checkHeader(s, "curl/curl.h")){
found = true;
break;
}
}
if(!found) {
return false;
}
}
conf->addIncludePath(s);
s = conf->getenv("QC_WITH_LIBCURL_LIB");
if(!s.isEmpty()) {
if(!QFile::exists(s+QString("/libcurl.so")))
return false;
conf->addLib(QString("-L") + s);
}else{
QStringList sl;
sl << "/usr/lib/";
sl << "/usr/lib64/";
sl << "/usr/local/lib/";
sl << "/usr/local/lib64/";
bool found = false;
foreach(s, sl){
if(QFile::exists(s+QString("libcurl.so"))){
found = true;
break;
}
}
if(!found) return false;
conf->addLib(QString("-L") + s);
}
return true;
}
};
#line 1 "libzzip.qcm"
/*
-----BEGIN QCMOD-----
@ -549,9 +470,6 @@ cat >$1/modules_new.cpp <<EOT @@ -549,9 +470,6 @@ cat >$1/modules_new.cpp <<EOT
o = new qc_libboost(conf);
o->required = true;
o->disabled = false;
o = new qc_libcurl(conf);
o->required = true;
o->disabled = false;
o = new qc_libzzip(conf);
o->required = false;
o->disabled = false;
@ -1501,8 +1419,6 @@ export BINDIR @@ -1501,8 +1419,6 @@ export BINDIR
export DATADIR
export EX_QTDIR
export QC_WITH_LIBBOOST_INC
export QC_WITH_LIBCURL_INC
export QC_WITH_LIBCURL_LIB
export QC_DISABLE_libzzip
export QC_WITH_LIBZZIP_INC
export QC_WITH_LIBZZIP_LIB

2
doc/qbittorrent.1

@ -8,7 +8,7 @@ qBittorrent \- a Bittorrent client written in C++ / Qt4 @@ -8,7 +8,7 @@ qBittorrent \- a Bittorrent client written in C++ / Qt4
.SH "SYNOPSIS"
\fBqbittorrent\fR [--no-splash] [TORRENT_FILE | URL]...
\fBqbittorrent\fR [\-\-no-splash] [TORRENT_FILE | URL]...
\fBqbittorrent\fR \-\-help

3
qbittorrent.qc

@ -12,8 +12,5 @@ @@ -12,8 +12,5 @@
<dep type='libboost'>
<required/>
</dep>
<dep type='libcurl'>
<required/>
</dep>
<dep type='libzzip'/>
</qconf>

61
qcm/libcurl.qcm

@ -1,61 +0,0 @@ @@ -1,61 +0,0 @@
/*
-----BEGIN QCMOD-----
name: libcommoncpp2
arg: with-libcurl-inc=[path], Path to libcurl include files
arg: with-libcurl-lib=[path], Path to libcurl library files
-----END QCMOD-----
*/
class qc_libcurl : public ConfObj
{
public:
qc_libcurl(Conf *c) : ConfObj(c) {}
QString name() const { return "libcurl"; }
QString shortname() const { return "libcurl"; }
bool exec(){
QString s;
s = conf->getenv("QC_WITH_LIBCURL_INC");
if(!s.isEmpty()) {
if(!conf->checkHeader(s, "curl/curl.h")) {
return false;
}
}else{
QStringList sl;
sl << "/usr/include";
sl << "/usr/local/include";
bool found = false;
foreach(s, sl){
if(conf->checkHeader(s, "curl/curl.h")){
found = true;
break;
}
}
if(!found) {
return false;
}
}
conf->addIncludePath(s);
s = conf->getenv("QC_WITH_LIBCURL_LIB");
if(!s.isEmpty()) {
if(!QFile::exists(s+QString("/libcurl.so")))
return false;
conf->addLib(QString("-L") + s);
}else{
QStringList sl;
sl << "/usr/lib/";
sl << "/usr/lib64/";
sl << "/usr/local/lib/";
sl << "/usr/local/lib64/";
bool found = false;
foreach(s, sl){
if(QFile::exists(s+QString("libcurl.so"))){
found = true;
break;
}
}
if(!found) return false;
conf->addLib(QString("-L") + s);
}
return true;
}
};

9
qcm/qt4.qcm

@ -7,14 +7,11 @@ class qc_qt4 : public ConfObj @@ -7,14 +7,11 @@ class qc_qt4 : public ConfObj
{
public:
qc_qt4(Conf *c) : ConfObj(c) {}
QString name() const { return "Qt >= 4.3"; }
QString shortname() const { return "Qt 4.3"; }
QString name() const { return "Qt >= 4.4"; }
QString shortname() const { return "Qt 4.4"; }
bool exec()
{
if(QT_VERSION >= 0x040400) {
conf->addDefine("QT_4_4");
}
return(QT_VERSION >= 0x040300);
return(QT_VERSION >= 0x040400);
}
};

398
src/GUI.cpp

@ -35,15 +35,10 @@ @@ -35,15 +35,10 @@
#include <QStatusBar>
#include <QFrame>
#include <QClipboard>
#ifdef QT_4_4
#include <QLocalServer>
#include <QLocalSocket>
#include <unistd.h>
#include <sys/types.h>
#else
#include <QTcpServer>
#include <QTcpSocket>
#endif
#include <stdlib.h>
#include <QCloseEvent>
#include <QShortcut>
@ -189,7 +184,6 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -189,7 +184,6 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
initWebUi(username, password, port);
}
// Use a tcp server to allow only one instance of qBittorrent
#ifdef QT_4_4
localServer = new QLocalServer();
QString uid = QString::number(getuid());
#ifdef Q_WS_X11
@ -200,18 +194,8 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -200,18 +194,8 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
#endif
if (!localServer->listen("qBittorrent-"+uid)) {
#else
localServer = new QTcpServer();
if (!localServer->listen(QHostAddress::LocalHost)) {
#endif
std::cerr << "Couldn't create socket, single instance mode won't work...\n";
}
#ifndef QT_4_4
else {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
settings.setValue(QString::fromUtf8("uniqueInstancePort"), localServer->serverPort());
}
#endif
connect(localServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
// Start connection checking timer
checkConnect = new QTimer(this);
@ -257,10 +241,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -257,10 +241,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
connect(scrapeTimer, SIGNAL(timeout()), this, SLOT(scrapeTrackers()));
scrapeTimer->start(20000);
qDebug("GUI Built");
}
}
// Destructor
GUI::~GUI() {
// Destructor
GUI::~GUI() {
qDebug("GUI destruction");
hide();
// Do this as soon as possible
@ -310,9 +294,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -310,9 +294,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
qDebug("4");
delete BTSession;
qDebug("5");
}
}
void GUI::displayRSSTab(bool enable) {
void GUI::displayRSSTab(bool enable) {
if(enable) {
// RSS tab
if(rssWidget == 0) {
@ -326,9 +310,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -326,9 +310,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
rssWidget = 0;
}
}
}
}
void GUI::scrapeTrackers() {
void GUI::scrapeTrackers() {
std::vector<torrent_handle> torrents = BTSession->getTorrents();
std::vector<torrent_handle>::iterator torrentIT;
for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) {
@ -336,9 +320,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -336,9 +320,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
if(!h.is_valid()) continue;
h.scrape_tracker();
}
}
}
void GUI::updateRatio() {
void GUI::updateRatio() {
// Update ratio info
float ratio = 1.;
session_status sessionStatus = BTSession->getSessionStatus();
@ -355,30 +339,30 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -355,30 +339,30 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
ratioLbl->setText(tr("Ratio: %1").arg(QString(QByteArray::number(ratio, 'f', 1))));
// Update DHT nodes
DHTLbl->setText(tr("DHT: %1 nodes").arg(QString::number(sessionStatus.dht_nodes)));
}
}
void GUI::on_actionWebsite_triggered() const {
void GUI::on_actionWebsite_triggered() const {
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://www.qbittorrent.org")));
}
}
void GUI::on_actionDocumentation_triggered() const {
void GUI::on_actionDocumentation_triggered() const {
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://wiki.qbittorrent.org")));
}
}
void GUI::on_actionBugReport_triggered() const {
void GUI::on_actionBugReport_triggered() const {
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://bugs.qbittorrent.org")));
}
}
void GUI::writeSettings() {
void GUI::writeSettings() {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
settings.beginGroup(QString::fromUtf8("MainWindow"));
settings.setValue(QString::fromUtf8("size"), size());
settings.setValue(QString::fromUtf8("pos"), pos());
settings.endGroup();
}
}
// called when a torrent has finished
void GUI::finishedTorrent(QTorrentHandle& h) const {
// called when a torrent has finished
void GUI::finishedTorrent(QTorrentHandle& h) const {
qDebug("In GUI, a torrent has finished");
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
bool show_msg = true;
@ -395,33 +379,33 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -395,33 +379,33 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
if(show_msg && systrayIntegration && useNotificationBalloons) {
myTrayIcon->showMessage(tr("Download finished"), tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName), QSystemTrayIcon::Information, TIME_TRAY_BALLOON);
}
}
}
void GUI::addedTorrent(QTorrentHandle& h) const {
void GUI::addedTorrent(QTorrentHandle& h) const {
if(h.is_seed()) {
finishedTorrentTab->addTorrent(h.hash());
} else {
downloadingTorrentTab->addTorrent(h.hash());
}
}
}
void GUI::pausedTorrent(QTorrentHandle& h) const {
void GUI::pausedTorrent(QTorrentHandle& h) const {
if(h.is_seed()) {
finishedTorrentTab->pauseTorrent(h.hash());
} else {
downloadingTorrentTab->pauseTorrent(h.hash());
}
}
}
void GUI::resumedTorrent(QTorrentHandle& h) const {
void GUI::resumedTorrent(QTorrentHandle& h) const {
if(h.is_seed()) {
finishedTorrentTab->updateTorrent(h);
} else {
downloadingTorrentTab->updateTorrent(h);
}
}
}
void GUI::checkedTorrent(QTorrentHandle& h) const {
void GUI::checkedTorrent(QTorrentHandle& h) const {
if(h.is_seed()) {
// Move torrent to finished tab
downloadingTorrentTab->deleteTorrent(h.hash());
@ -434,10 +418,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -434,10 +418,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
downloadingTorrentTab->addTorrent(h.hash());
}
}
}
}
// Notification when disk is full
void GUI::fullDiskError(QTorrentHandle& h, QString msg) const {
// Notification when disk is full
void GUI::fullDiskError(QTorrentHandle& h, QString msg) const {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool();
if(systrayIntegration && useNotificationBalloons) {
@ -448,9 +432,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -448,9 +432,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
qDebug("Full disk error, pausing torrent %s", hash.toLocal8Bit().data());
setPaused(h);
BTSession->addConsoleMessage(tr("An error occured (full disk?), '%1' paused.", "e.g: An error occured (full disk?), 'xxx.avi' paused.").arg(h.name()));
}
}
void GUI::setPaused(QTorrentHandle &h) const {
void GUI::setPaused(QTorrentHandle &h) const {
if(!h.is_paused()) {
// FIXME in v1.6.0: Add Error state and stop using pause for this
h.pause();
@ -463,9 +447,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -463,9 +447,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}else{
downloadingTorrentTab->pauseTorrent(h.hash());
}
}
}
void GUI::createKeyboardShortcuts() {
void GUI::createKeyboardShortcuts() {
actionCreate_torrent->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+N")));
actionOpen->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+O")));
actionExit->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Q")));
@ -489,36 +473,36 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -489,36 +473,36 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
actionPause_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+P")));
actionDecreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+-")));
actionIncreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl++")));
}
}
// Keyboard shortcuts slots
void GUI::displayDownTab() const {
// Keyboard shortcuts slots
void GUI::displayDownTab() const {
tabs->setCurrentIndex(0);
}
}
void GUI::displayUpTab() const {
void GUI::displayUpTab() const {
tabs->setCurrentIndex(1);
}
}
void GUI::displaySearchTab() const {
void GUI::displaySearchTab() const {
tabs->setCurrentIndex(2);
}
}
void GUI::displayRSSTab() const {
void GUI::displayRSSTab() const {
tabs->setCurrentIndex(3);
}
}
// End of keyboard shortcuts slots
// End of keyboard shortcuts slots
void GUI::readSettings() {
void GUI::readSettings() {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
settings.beginGroup(QString::fromUtf8("MainWindow"));
resize(settings.value(QString::fromUtf8("size"), size()).toSize());
move(settings.value(QString::fromUtf8("pos"), screenCenter()).toPoint());
settings.endGroup();
}
}
void GUI::balloonClicked() {
void GUI::balloonClicked() {
if(isHidden()) {
show();
if(isMinimized()) {
@ -527,15 +511,15 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -527,15 +511,15 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
raise();
activateWindow();
}
}
}
void GUI::acceptConnection() {
void GUI::acceptConnection() {
clientConnection = localServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()), this, SLOT(readParamsOnSocket()));
qDebug("accepted connection from another instance");
}
}
void GUI::readParamsOnSocket() {
void GUI::readParamsOnSocket() {
if(clientConnection) {
QByteArray params = clientConnection->readAll();
if(!params.isEmpty()) {
@ -543,28 +527,28 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -543,28 +527,28 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
qDebug("Received parameters from another instance");
}
}
}
}
void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{
void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{
// Display a message box
QMessageBox::critical(0, tr("Url download error"), tr("Couldn't download file at url: %1, reason: %2.").arg(url).arg(reason));
}
}
void GUI::on_actionSet_global_upload_limit_triggered() {
void GUI::on_actionSet_global_upload_limit_triggered() {
qDebug("actionSet_global_upload_limit_triggered");
new BandwidthAllocationDialog(this, true, BTSession, QStringList());
}
}
void GUI::on_actionShow_console_triggered() {
void GUI::on_actionShow_console_triggered() {
new consoleDlg(this, BTSession);
}
}
void GUI::on_actionSet_global_download_limit_triggered() {
void GUI::on_actionSet_global_download_limit_triggered() {
qDebug("actionSet_global_download_limit_triggered");
new BandwidthAllocationDialog(this, false, BTSession, QStringList());
}
}
void GUI::on_actionPreview_file_triggered() {
void GUI::on_actionPreview_file_triggered() {
QString hash;
switch(tabs->currentIndex()){
case 0:
@ -578,9 +562,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -578,9 +562,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
QTorrentHandle h = BTSession->getTorrentHandle(hash);
new previewSelect(this, h);
}
}
void GUI::openDestinationFolder() const {
void GUI::openDestinationFolder() const {
QStringList hashes;
switch(tabs->currentIndex()){
case 0:
@ -601,9 +585,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -601,9 +585,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
QDesktopServices::openUrl(QString("file://")+savePath);
}
}
}
}
void GUI::copyMagnetURI() const {
void GUI::copyMagnetURI() const {
QStringList hashes;
switch(tabs->currentIndex()){
case 0:
@ -623,9 +607,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -623,9 +607,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
}
qApp->clipboard()->setText(magnet_uris.join("\n"));
}
}
void GUI::goBuyPage() const {
void GUI::goBuyPage() const {
QStringList hashes;
switch(tabs->currentIndex()){
case 0:
@ -642,31 +626,31 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -642,31 +626,31 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
QTorrentHandle h = BTSession->getTorrentHandle(hash);
QDesktopServices::openUrl("http://match.sharemonkey.com/?info_hash="+hash+"&n="+h.name()+"&cid=33");
}
}
}
// Necessary if we want to close the window
// in one time if "close to systray" is enabled
void GUI::on_actionExit_triggered() {
// Necessary if we want to close the window
// in one time if "close to systray" is enabled
void GUI::on_actionExit_triggered() {
force_exit = true;
close();
}
}
void GUI::previewFile(QString filePath) {
void GUI::previewFile(QString filePath) {
QDesktopServices::openUrl(QString("file://")+filePath);
}
}
int GUI::getCurrentTabIndex() const{
int GUI::getCurrentTabIndex() const{
if(isMinimized() || isHidden())
return -1;
return tabs->currentIndex();
}
}
void GUI::setTabText(int index, QString text) const {
void GUI::setTabText(int index, QString text) const {
tabs->setTabText(index, text);
}
}
// Toggle Main window visibility
void GUI::toggleVisibility(QSystemTrayIcon::ActivationReason e) {
// Toggle Main window visibility
void GUI::toggleVisibility(QSystemTrayIcon::ActivationReason e) {
if(e == QSystemTrayIcon::Trigger || e == QSystemTrayIcon::DoubleClick) {
if(isHidden()) {
show();
@ -683,10 +667,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -683,10 +667,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
hide();
}
}
}
}
// Center window
QPoint GUI::screenCenter() const{
// Center window
QPoint GUI::screenCenter() const{
int scrn = 0;
QWidget *w = this->topLevelWidget();
@ -699,22 +683,22 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -699,22 +683,22 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
QRect desk(QApplication::desktop()->availableGeometry(scrn));
return QPoint((desk.width() - this->frameGeometry().width()) / 2, (desk.height() - this->frameGeometry().height()) / 2);
}
}
// Display About Dialog
void GUI::on_actionAbout_triggered() {
// Display About Dialog
void GUI::on_actionAbout_triggered() {
//About dialog
new about(this);
}
}
void GUI::showEvent(QShowEvent *e) {
void GUI::showEvent(QShowEvent *e) {
qDebug("** Show Event **");
updateLists(true);
e->accept();
}
}
// Called when we close the program
void GUI::closeEvent(QCloseEvent *e) {
// Called when we close the program
void GUI::closeEvent(QCloseEvent *e) {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
bool goToSystrayOnExit = settings.value(QString::fromUtf8("Preferences/General/CloseToTray"), false).toBool();
@ -750,16 +734,16 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -750,16 +734,16 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
// Accept exit
e->accept();
qApp->exit();
}
}
// Display window to create a torrent
void GUI::on_actionCreate_torrent_triggered() {
// Display window to create a torrent
void GUI::on_actionCreate_torrent_triggered() {
createtorrent *ct = new createtorrent(this);
connect(ct, SIGNAL(torrent_to_seed(QString)), this, SLOT(addTorrent(QString)));
}
}
bool GUI::event(QEvent * e) {
bool GUI::event(QEvent * e) {
if(e->type() == QEvent::WindowStateChange) {
//Now check to see if the window is minimised
if(isMinimized()) {
@ -771,10 +755,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -771,10 +755,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
}
return QMainWindow::event(e);
}
}
// Action executed when a file is dropped
void GUI::dropEvent(QDropEvent *event) {
// Action executed when a file is dropped
void GUI::dropEvent(QDropEvent *event) {
event->acceptProposedAction();
QStringList files;
if(event->mimeData()->hasUrls()) {
@ -809,27 +793,27 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -809,27 +793,27 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
BTSession->addTorrent(file);
}
}
}
}
// Decode if we accept drag 'n drop or not
void GUI::dragEnterEvent(QDragEnterEvent *event) {
// Decode if we accept drag 'n drop or not
void GUI::dragEnterEvent(QDragEnterEvent *event) {
foreach(const QString &mime, event->mimeData()->formats()){
qDebug("mimeData: %s", mime.toLocal8Bit().data());
}
if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) {
event->acceptProposedAction();
}
}
}
/*****************************************************
/*****************************************************
* *
* Torrent *
* *
*****************************************************/
// Display a dialog to allow user to add
// torrents to download list
void GUI::on_actionOpen_triggered() {
// Display a dialog to allow user to add
// torrents to download list
void GUI::on_actionOpen_triggered() {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
// Open File Open Dialog
// Note: it is possible to select more than one file
@ -852,10 +836,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -852,10 +836,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
top_dir.removeLast();
settings.setValue(QString::fromUtf8("MainWindowLastDir"), top_dir.join(QDir::separator()));
}
}
}
// delete from download list AND from hard drive
void GUI::on_actionDelete_Permanently_triggered() {
// delete from download list AND from hard drive
void GUI::on_actionDelete_Permanently_triggered() {
QStringList hashes;
bool inDownloadList = true;
switch(tabs->currentIndex()){
@ -895,16 +879,16 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -895,16 +879,16 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
// Remove the torrent
BTSession->deleteTorrent(hash, true);
}
}
}
void GUI::deleteTorrent(QString hash) {
void GUI::deleteTorrent(QString hash) {
// Delete item from list
downloadingTorrentTab->deleteTorrent(hash);
finishedTorrentTab->deleteTorrent(hash);
}
}
// delete selected items in the list
void GUI::on_actionDelete_triggered() {
// delete selected items in the list
void GUI::on_actionDelete_triggered() {
QStringList hashes;
bool inDownloadList = true;
switch(tabs->currentIndex()){
@ -947,13 +931,13 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -947,13 +931,13 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
// Remove the torrent
BTSession->deleteTorrent(hash, false);
}
}
}
// As program parameters, we can get paths or urls.
// This function parse the parameters and call
// the right addTorrent function, considering
// the parameter type.
void GUI::processParams(const QStringList& params) {
// As program parameters, we can get paths or urls.
// This function parse the parameters and call
// the right addTorrent function, considering
// the parameter type.
void GUI::processParams(const QStringList& params) {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
foreach(QString param, params) {
@ -975,13 +959,13 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -975,13 +959,13 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
}
}
}
}
void GUI::addTorrent(QString path) {
void GUI::addTorrent(QString path) {
BTSession->addTorrent(path);
}
}
void GUI::processDownloadedFiles(QString path, QString url) {
void GUI::processDownloadedFiles(QString path, QString url) {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
if(useTorrentAdditionDialog) {
@ -990,10 +974,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -990,10 +974,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}else{
BTSession->addTorrent(path, false, url);
}
}
}
// Set BT session configuration
void GUI::configureSession(bool deleteOptions) {
// Set BT session configuration
void GUI::configureSession(bool deleteOptions) {
qDebug("Configuring session");
// General
bool new_displaySpeedInTitle = options->speedInTitleBar();
@ -1261,20 +1245,20 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1261,20 +1245,20 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
options->deleteLater();
}
qDebug("Session configured");
}
}
void GUI::updateUnfinishedTorrentNumber(unsigned int nb) {
void GUI::updateUnfinishedTorrentNumber(unsigned int nb) {
unsigned int paused = BTSession->getUnfinishedPausedTorrentsNb();
tabs->setTabText(0, tr("Downloads") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")"));
}
}
void GUI::updateFinishedTorrentNumber(unsigned int nb) {
void GUI::updateFinishedTorrentNumber(unsigned int nb) {
unsigned int paused = BTSession->getFinishedPausedTorrentsNb();
tabs->setTabText(1, tr("Finished") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")"));
}
}
// Allow to change action on double-click
void GUI::torrentDoubleClicked(QString hash, bool finished) {
// Allow to change action on double-click
void GUI::torrentDoubleClicked(QString hash, bool finished) {
int action;
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
QTorrentHandle h = BTSession->getTorrentHandle(hash);
@ -1303,10 +1287,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1303,10 +1287,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
break;
}
}
}
// Toggle paused state of selected torrent
void GUI::togglePausedState(QString hash) {
// Toggle paused state of selected torrent
void GUI::togglePausedState(QString hash) {
if(tabs->currentIndex() > 1) return;
bool inDownloadList = true;
if(tabs->currentIndex() == 1)
@ -1329,10 +1313,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1329,10 +1313,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList());
}
}
}
}
// Pause All Downloads in DL list
void GUI::on_actionPause_All_triggered() {
// Pause All Downloads in DL list
void GUI::on_actionPause_All_triggered() {
bool change = false;
std::vector<torrent_handle> torrents = BTSession->getTorrents();
std::vector<torrent_handle>::iterator torrentIT;
@ -1347,9 +1331,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1347,9 +1331,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList());
updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList());
}
}
}
void GUI::on_actionIncreasePriority_triggered() {
void GUI::on_actionIncreasePriority_triggered() {
if(tabs->currentIndex() != 0)
return;
QStringList hashes = downloadingTorrentTab->getSelectedTorrents();
@ -1357,19 +1341,19 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1357,19 +1341,19 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
BTSession->increaseDlTorrentPriority(hash);
}
updateLists();
}
}
void GUI::on_actionDecreasePriority_triggered() {
void GUI::on_actionDecreasePriority_triggered() {
Q_ASSERT(tabs->currentIndex() == 0);
QStringList hashes = downloadingTorrentTab->getSelectedTorrents();
foreach(const QString &hash, hashes) {
BTSession->decreaseDlTorrentPriority(hash);
}
updateLists();
}
}
// pause selected items in the list
void GUI::on_actionPause_triggered() {
// pause selected items in the list
void GUI::on_actionPause_triggered() {
bool inDownloadList = true;
if(tabs->currentIndex() > 1) return;
if(tabs->currentIndex() == 1)
@ -1393,10 +1377,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1393,10 +1377,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
}
}
}
}
// Resume All Downloads in DL list
void GUI::on_actionStart_All_triggered() {
// Resume All Downloads in DL list
void GUI::on_actionStart_All_triggered() {
bool change = false;
std::vector<torrent_handle> torrents = BTSession->getTorrents();
std::vector<torrent_handle>::iterator torrentIT;
@ -1411,10 +1395,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1411,10 +1395,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList());
updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList());
}
}
}
// start selected items in the list
void GUI::on_actionStart_triggered() {
// start selected items in the list
void GUI::on_actionStart_triggered() {
bool inDownloadList = true;
if(tabs->currentIndex() > 1) return;
if(tabs->currentIndex() == 1)
@ -1437,17 +1421,17 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1437,17 +1421,17 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
}
}
}
}
void GUI::addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker) {
void GUI::addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker) {
// Trackers whose authentication was cancelled
if(unauthenticated_trackers.indexOf(tracker) < 0) {
unauthenticated_trackers << tracker;
}
}
}
// display properties of selected items
void GUI::on_actionTorrent_Properties_triggered() {
// display properties of selected items
void GUI::on_actionTorrent_Properties_triggered() {
if(tabs->currentIndex() > 1) return;
switch(tabs->currentIndex()){
case 1: // DL List
@ -1456,9 +1440,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1456,9 +1440,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
default:
downloadingTorrentTab->propertiesSelection();
}
}
}
void GUI::updateLists(bool force) {
void GUI::updateLists(bool force) {
if(isVisible() || force) {
// update global informations
dlSpeedLbl->setText(tr("DL: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))));
@ -1490,18 +1474,18 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1490,18 +1474,18 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
QString up_rate = QByteArray::number(BTSession->getSessionStatus().payload_upload_rate/1024, 'f', 1);
setWindowTitle(tr("qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(dl_rate).arg(up_rate));
}
}
}
// Called when a tracker requires authentication
void GUI::trackerAuthenticationRequired(QTorrentHandle& h) {
// Called when a tracker requires authentication
void GUI::trackerAuthenticationRequired(QTorrentHandle& h) {
if(unauthenticated_trackers.indexOf(QPair<QTorrentHandle,QString>(h, h.current_tracker())) < 0) {
// Tracker login
new trackerLogin(this, h);
}
}
}
// Check connection status and display right icon
void GUI::checkConnectionStatus() {
// Check connection status and display right icon
void GUI::checkConnectionStatus() {
// qDebug("Checking connection status");
// Update Ratio
updateRatio();
@ -1534,15 +1518,15 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1534,15 +1518,15 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png")));
connecStatusLblIcon->setToolTip(QString::fromUtf8("<b>")+tr("Connection status:")+QString::fromUtf8("</b><br>")+QString::fromUtf8("<i>")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("</i>"));
}
}
}
/*****************************************************
/*****************************************************
* *
* Utils *
* *
*****************************************************/
void GUI::downloadFromURLList(const QStringList& url_list) {
void GUI::downloadFromURLList(const QStringList& url_list) {
foreach(const QString url, url_list) {
if(url.startsWith("magnet:", Qt::CaseInsensitive)) {
BTSession->addMagnetUri(url);
@ -1550,15 +1534,15 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1550,15 +1534,15 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
BTSession->downloadFromUrl(url);
}
}
}
}
/*****************************************************
/*****************************************************
* *
* Options *
* *
*****************************************************/
void GUI::createSystrayDelayed() {
void GUI::createSystrayDelayed() {
static int timeout = 10;
if(QSystemTrayIcon::isSystemTrayAvailable()) {
// Ok, systray integration is now supported
@ -1577,9 +1561,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1577,9 +1561,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
delete systrayCreator;
}
}
}
}
void GUI::createTrayIcon() {
void GUI::createTrayIcon() {
// Tray icon
#ifdef Q_WS_WIN
myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent16.png")), this);
@ -1604,17 +1588,17 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1604,17 +1588,17 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
// End of Icon Menu
connect(myTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason)));
myTrayIcon->show();
}
}
// Display Program Options
void GUI::on_actionOptions_triggered() {
// Display Program Options
void GUI::on_actionOptions_triggered() {
options = new options_imp(this);
connect(options, SIGNAL(status_changed(bool)), this, SLOT(OptionsSaved(bool)));
options->show();
}
}
// Is executed each time options are saved
void GUI::OptionsSaved(bool deleteOptions) {
// Is executed each time options are saved
void GUI::OptionsSaved(bool deleteOptions) {
BTSession->addConsoleMessage(tr("Options were saved successfully."));
bool newSystrayIntegration = options->systrayIntegration();
if(newSystrayIntegration != systrayIntegration) {
@ -1639,9 +1623,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1639,9 +1623,9 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
}
// Update session
configureSession(deleteOptions);
}
}
bool GUI::initWebUi(QString username, QString password, int port) {
bool GUI::initWebUi(QString username, QString password, int port) {
if(httpServer)
httpServer->close();
else
@ -1653,18 +1637,18 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis @@ -1653,18 +1637,18 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
else
QMessageBox::critical(this, "Web User Interface Error", "Unable to initialize HTTP Server on port " + misc::toQString(port));
return success;
}
}
/*****************************************************
/*****************************************************
* *
* HTTP Downloader *
* *
*****************************************************/
// Display an input dialog to prompt user for
// an url
void GUI::on_actionDownload_from_URL_triggered() {
// Display an input dialog to prompt user for
// an url
void GUI::on_actionDownload_from_URL_triggered() {
downloadFromURL *downloadFromURLDialog = new downloadFromURL(this);
connect(downloadFromURLDialog, SIGNAL(urlsReadyToBeDownloaded(const QStringList&)), BTSession, SLOT(downloadFromURLList(const QStringList&)));
}
}

14
src/GUI.h

@ -44,13 +44,8 @@ class DownloadingTorrents; @@ -44,13 +44,8 @@ class DownloadingTorrents;
class FinishedTorrents;
class downloadFromURL;
class SearchEngine;
#ifdef QT_4_4
class QLocalServer;
class QLocalSocket;
#else
class QTcpServer;
class QTcpSocket;
#endif
class QLocalServer;
class QLocalSocket;
class QCloseEvent;
class RSSImp;
class QShortcut;
@ -109,13 +104,8 @@ class GUI : public QMainWindow, private Ui::MainWindow{ @@ -109,13 +104,8 @@ class GUI : public QMainWindow, private Ui::MainWindow{
// Web UI
QPointer<HttpServer> httpServer;
// Misc
#ifdef QT_4_4
QLocalServer *localServer;
QLocalSocket *clientConnection;
#else
QTcpServer *localServer;
QTcpSocket *clientConnection;
#endif
protected slots:
// GUI related slots

8
src/about_imp.h

@ -52,10 +52,10 @@ class about : public QDialog, private Ui::AboutDlg{ @@ -52,10 +52,10 @@ class about : public QDialog, private Ui::AboutDlg{
lb_name->setText(QString::fromUtf8("<b><h1>")+tr("qBittorrent")+QString::fromUtf8(" "VERSION"</h1></b>"));
// Thanks
te_thanks->append(QString::fromUtf8("<a name='top'></a>"));
te_thanks->append(QString::fromUtf8("<ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li>"));
te_thanks->append(QString::fromUtf8("<li>I am happy that Ishan Arora and Arnaud Demaizière are contributing to the project as developers. Their help is greatly appreciated</li>"));
te_thanks->append(QString::fromUtf8("<li>I also want to thank Jeffery Fernandez (jeffery@qbittorrent.org), project consultant, RPM packager, for his help and support.</li>"));
te_thanks->append(QString::fromUtf8("<li>I am grateful to Peter Koeleman (peter@qbittorrent.org) who is helping port qBittorrent to Windows.</li>"));
te_thanks->append(QString::fromUtf8("<ul><li>I would first like to thank sourceforge.net for hosting qBittorrent project and for their support.</li>"));
te_thanks->append(QString::fromUtf8("<li>I am pleased that people from all over the world are contributing to qBittorrent: Ishan Arora (India), Arnaud Demaizière (France) and Stephanos Antaris (Greece). Their help is greatly appreciated</li>"));
te_thanks->append(QString::fromUtf8("<li>I also want to thank Jeffery Fernandez (jeffery@qbittorrent.org), project consultant, for his help and support since the beginning of this project.</li>"));
te_thanks->append(QString::fromUtf8("<li>I am grateful to Peter Koeleman (peter@qbittorrent.org) for working on qBittorrent port to Windows.</li>"));
te_thanks->append(QString::fromUtf8("<li>Thanks a lot to our graphist Mateusz Toboła (tobejodok@qbittorrent.org) for his great work.</li></ul><br><br>"));
te_thanks->scrollToAnchor(QString::fromUtf8("top"));
// Translation

7
src/addTorrentDialog.ui

@ -207,6 +207,13 @@ @@ -207,6 +207,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="addInSeed">
<property name="text">
<string>Skip file checking and start seeding immediately</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="addInPause">
<property name="text">

41
src/bittorrent.cpp

@ -64,8 +64,8 @@ bittorrent::bittorrent() : DHTEnabled(false), preAllocateAll(false), addInPause( @@ -64,8 +64,8 @@ bittorrent::bittorrent() : DHTEnabled(false), preAllocateAll(false), addInPause(
// Check if we should spoof utorrent
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
if(settings.value(QString::fromUtf8("Preferences/Bittorrent/AzureusSpoof"), false).toBool()) {
s = new session(fingerprint("UT", 1, 8, 4, 0), 0);
qDebug("Peer ID: %s", fingerprint("UT", 1, 8, 4, 0).to_string().c_str());
s = new session(fingerprint("UT", 1, 8, 5, 0), 0);
qDebug("Peer ID: %s", fingerprint("UT", 1, 8, 5, 0).to_string().c_str());
} else {
s = new session(fingerprint("qB", VERSION_MAJOR, VERSION_MINOR, VERSION_BUGFIX, 0), 0);
qDebug("Peer ID: %s", fingerprint("qB", VERSION_MAJOR, VERSION_MINOR, VERSION_BUGFIX, 0).to_string().c_str());
@ -581,6 +581,14 @@ QTorrentHandle bittorrent::addTorrent(QString path, bool fromScanDir, QString fr @@ -581,6 +581,14 @@ QTorrentHandle bittorrent::addTorrent(QString path, bool fromScanDir, QString fr
} else {
p.save_path = defaultTempPath.toLocal8Bit().data();
}
// Skip checking and directly start seeding (new in libtorrent v0.15)
if(TorrentTempData::isSeedingMode(hash)){
p.seed_mode=true;
} else {
p.seed_mode=false;
}
// TODO: Remove in v1.6.0: For backward compatibility only
if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+hash+".finished")) {
p.save_path = savePath.toLocal8Bit().data();
@ -858,6 +866,7 @@ void bittorrent::loadFilesPriorities(QTorrentHandle &h) { @@ -858,6 +866,7 @@ void bittorrent::loadFilesPriorities(QTorrentHandle &h) {
qDebug("Setting file piority to %d", priority);
v.push_back(priority);
}
if(v.size() == (unsigned int)h.num_files())
h.prioritize_files(v);
}
@ -983,6 +992,12 @@ void bittorrent::scanDirectory(QString scan_dir) { @@ -983,6 +992,12 @@ void bittorrent::scanDirectory(QString scan_dir) {
FSMutex->lock();
qDebug("Scanning directory: %s", scan_dir.toLocal8Bit().data());
QDir dir(scan_dir);
QDir torrentBackup(misc::qBittorrentPath() + "BT_backup");
// Check that scan dir is not BT_backup (silly but who knows...)
if(dir == torrentBackup) {
std::cerr << "Scan directory cannot be qBittorrent backup folder!" << std::endl;
return;
}
QStringList filters;
filters << "*.torrent";
QStringList files = dir.entryList(filters, QDir::Files, QDir::Unsorted);
@ -1522,14 +1537,31 @@ void bittorrent::applyEncryptionSettings(pe_settings se) { @@ -1522,14 +1537,31 @@ void bittorrent::applyEncryptionSettings(pe_settings se) {
// backup directory
void bittorrent::startUpTorrents() {
qDebug("Resuming unfinished torrents");
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
QDir torrentBackup(misc::qBittorrentPath() + "BT_backup");
QStringList fileNames;
QStringList known_torrents = TorrentPersistentData::knownTorrents();
if(known_torrents.empty()) {
if(known_torrents.empty() && !settings.value("v1_4_x_torrent_imported", false).toBool()) {
qDebug("No known torrent, importing old torrents");
importOldTorrents();
return;
}
// Safety measure because some people reported torrent loss since
// we switch the v1.5 way of resuming torrents on startup
QStringList filters;
filters << "*.torrent";
QStringList torrents_on_hd = torrentBackup.entryList(filters, QDir::Files, QDir::Unsorted);
foreach(QString hash, torrents_on_hd) {
hash.chop(8); // remove trailing .torrent
if(!known_torrents.contains(hash)) {
std::cerr << "ERROR Detected!!! Adding back torrent " << hash.toLocal8Bit().data() << " which got lost for some reason." << std::endl;
addTorrent(torrentBackup.path()+QDir::separator()+hash+".torrent", false, QString(), true);
}
}
// End of safety measure
qDebug("Starting up torrents");
if(isQueueingEnabled()) {
QList<QPair<int, QString> > hashes;
@ -1690,7 +1722,7 @@ void bittorrent::applyFormerAttributeFiles(QTorrentHandle h) { @@ -1690,7 +1722,7 @@ void bittorrent::applyFormerAttributeFiles(QTorrentHandle h) {
// TODO: Remove in qBittorrent v1.6.0
void bittorrent::importOldTorrents() {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
if(!settings.value("v1_4_x_torrent_imported", false).toBool()) {
Q_ASSERT(!settings.value("v1_4_x_torrent_imported", false).toBool());
// Import old torrent
QDir torrentBackup(misc::qBittorrentPath() + "BT_backup");
QStringList fileNames;
@ -1764,5 +1796,4 @@ void bittorrent::importOldTorrents() { @@ -1764,5 +1796,4 @@ void bittorrent::importOldTorrents() {
}
settings.setValue("v1_4_x_torrent_imported", true);
std::cout << "Successfully imported torrents from v1.4.x (or previous) instance" << std::endl;
}
}

271
src/downloadThread.cpp

@ -29,215 +29,140 @@ @@ -29,215 +29,140 @@
*/
#include "downloadThread.h"
#include <iostream>
#include <QTemporaryFile>
#include <QSettings>
#include <stdio.h>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkProxy>
#define MAX_THREADS 3
/** Download Thread **/
// http://curl.rtin.bz/libcurl/c/libcurl-errors.html
QString subDownloadThread::errorCodeToString(CURLcode status) {
switch(status){
case CURLE_FTP_CANT_GET_HOST:
case CURLE_COULDNT_RESOLVE_HOST:
return tr("Host is unreachable");
case CURLE_READ_ERROR:
case CURLE_FILE_COULDNT_READ_FILE:
return tr("File was not found (404)");
case CURLE_FTP_ACCESS_DENIED:
case CURLE_LOGIN_DENIED:
case CURLE_FTP_USER_PASSWORD_INCORRECT:
return tr("Connection was denied");
case CURLE_URL_MALFORMAT:
return tr("Url is invalid");
case CURLE_COULDNT_RESOLVE_PROXY:
return tr("Could not resolve proxy");
//case 5:
// return tr("Connection forbidden (403)");
//case 6:
// return tr("Connection was not authorized (401)");
//case 7:
// return tr("Content has moved (301)");
case CURLE_COULDNT_CONNECT:
return tr("Connection failure");
case CURLE_OPERATION_TIMEOUTED:
return tr("Connection was timed out");
case CURLE_INTERFACE_FAILED:
return tr("Incorrect network interface");
default:
return tr("Unknown error");
}
downloadThread::downloadThread(QObject* parent) : QObject(parent) {
networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished (QNetworkReply*)), this, SLOT(processDlFinished(QNetworkReply*)));
}
subDownloadThread::subDownloadThread(QObject *parent, QString url) : QThread(parent), url(url), abort(false){}
subDownloadThread::~subDownloadThread(){
abort = true;
wait();
downloadThread::~downloadThread(){
delete networkManager;
}
void subDownloadThread::run(){
// Get a unique filename
void downloadThread::processDlFinished(QNetworkReply* reply) {
QString url = reply->url().toString();
if(reply->error() != QNetworkReply::NoError) {
// Failure
emit downloadFailure(url, errorCodeToString(reply->error()));
} else {
// Success
QString filePath;
QTemporaryFile tmpfile;
tmpfile.setAutoRemove(false);
if (tmpfile.open()) {
filePath = tmpfile.fileName();
qDebug("Temporary filename is: %s", filePath.toLocal8Bit().data());
if(reply->open(QIODevice::ReadOnly)) {
tmpfile.write(reply->readAll());
reply->close();
tmpfile.close();
// Send finished signal
emit downloadFinished(url, filePath);
} else {
emit downloadFailureST(this, url, tr("I/O Error"));
return;
}
// Error when reading the request
tmpfile.close();
// Now temporary file is created but closed so that
// curl can use it
FILE *f = fopen(filePath.toLocal8Bit().data(), "wb");
if(!f) {
std::cerr << "couldn't open destination file" << "\n";
return;
emit downloadFailure(url, tr("I/O Error"));
}
} else {
emit downloadFailure(url, tr("I/O Error"));
}
}
CURL *curl;
CURLcode res = (CURLcode)-1;
curl = curl_easy_init();
if(curl) {
std::string c_url = url.toLocal8Bit().data();
curl_easy_setopt(curl, CURLOPT_URL, c_url.c_str());
// SSL support
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
// PROXY SUPPORT
// Clean up
reply->deleteLater();
}
void downloadThread::downloadUrl(QString url){
// Update proxy settings
applyProxySettings();
// Process download request
networkManager->get(QNetworkRequest(QUrl(url)));
}
void downloadThread::applyProxySettings() {
QNetworkProxy proxy;
QSettings settings("qBittorrent", "qBittorrent");
int intValue = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxyType"), 0).toInt();
if(intValue > 0) {
// Proxy enabled
QString IP = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/IP"), "0.0.0.0").toString();
proxy.setHostName(IP);
QString port = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Port"), 8080).toString();
qDebug("Using proxy: %s", (IP+QString(":")+port).toLocal8Bit().data());
curl_easy_setopt(curl, CURLOPT_PROXYPORT, (IP+QString(":")+port).toLocal8Bit().data());
proxy.setPort(port.toUShort());
// Default proxy type is HTTP, we must change if it is SOCKS5
if(intValue%2==0) {
qDebug("Proxy is SOCKS5, not HTTP");
curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
proxy.setType(QNetworkProxy::Socks5Proxy);
} else {
proxy.setType(QNetworkProxy::HttpProxy);
}
// Authentication?
if(intValue > 2) {
qDebug("Proxy requires authentication, authenticating");
QString username = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Username"), QString()).toString();
proxy.setUser(username);
QString password = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Password"), QString()).toString();
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, (username+QString(":")+password).toLocal8Bit().data());
}
}
// We have to define CURLOPT_WRITEFUNCTION or it will crash on windows
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, f);
// Verbose
//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
// No progress info (we don't use it)
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
// Redirections
curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, -1);
qDebug("Downloading %s", url.toLocal8Bit().data());
if(!abort)
res = curl_easy_perform(curl);
qDebug("done downloading %s", url.toLocal8Bit().data());
/* always cleanup */
curl_easy_cleanup(curl);
fclose(f);
if(abort)
return;
if(res) {
emit downloadFailureST(this, url, errorCodeToString(res));
} else {
emit downloadFinishedST(this, url, filePath);
proxy.setPassword(password);
}
qDebug("%s Raised the signal", url.toLocal8Bit().data());
} else {
std::cerr << "Could not initialize CURL" << "\n";
}
}
/** Download Thread **/
downloadThread::downloadThread(QObject* parent) : QThread(parent), abort(false){}
downloadThread::~downloadThread(){
mutex.lock();
abort = true;
condition.wakeOne();
mutex.unlock();
//qDebug("downloadThread deleting subthreads...");
qDeleteAll(subThreads);
//qDebug("downloadThread deleted subthreads");
wait();
}
void downloadThread::downloadUrl(QString url){
QMutexLocker locker(&mutex);
urls_queue.enqueue(url);
if(!isRunning()){
start();
}else{
condition.wakeOne();
}
}
void downloadThread::run(){
forever{
if(abort) {
qDebug("DownloadThread aborting...");
return;
}
mutex.lock();
if(!urls_queue.empty() && subThreads.size() < MAX_THREADS){
QString url = urls_queue.dequeue();
mutex.unlock();
//qDebug("DownloadThread downloading %s...", url.toLocal8Bit().data());
subDownloadThread *st = new subDownloadThread(0, url);
subThreads << st;
connect(st, SIGNAL(downloadFinishedST(subDownloadThread*, QString, QString)), this, SLOT(propagateDownloadedFile(subDownloadThread*, QString, QString)));
connect(st, SIGNAL(downloadFailureST(subDownloadThread*, QString, QString)), this, SLOT(propagateDownloadFailure(subDownloadThread*, QString, QString)));
st->start();
}else{
//qDebug("DownloadThread sleeping...");
condition.wait(&mutex);
//qDebug("DownloadThread woke up");
mutex.unlock();
}
}
}
void downloadThread::propagateDownloadedFile(subDownloadThread* st, QString url, QString path){
qDebug("Downloading %s was successful", url.toLocal8Bit().data());
mutex.lock();
int index = subThreads.indexOf(st);
Q_ASSERT(index != -1);
subThreads.removeAt(index);
mutex.unlock();
qDebug("Deleting subthread");
delete st;
emit downloadFinished(url, path);
mutex.lock();
if(!urls_queue.empty()) {
condition.wakeOne();
} else {
proxy.setType(QNetworkProxy::NoProxy);
}
mutex.unlock();
qDebug("Out of propagateDownloadedFile");
networkManager->setProxy(proxy);
}
void downloadThread::propagateDownloadFailure(subDownloadThread* st, QString url, QString reason){
qDebug("Downloading %s failed", url.toLocal8Bit().data());
mutex.lock();
int index = subThreads.indexOf(st);
Q_ASSERT(index != -1);
subThreads.removeAt(index);
mutex.unlock();
delete st;
emit downloadFailure(url, reason);
mutex.lock();
if(!urls_queue.empty()) {
condition.wakeOne();
QString downloadThread::errorCodeToString(QNetworkReply::NetworkError status) {
switch(status){
case QNetworkReply::HostNotFoundError:
return tr("The remote host name was not found (invalid hostname)");
case QNetworkReply::OperationCanceledError:
return tr("The operation was canceled");
case QNetworkReply::RemoteHostClosedError:
return tr("The remote server closed the connection prematurely, before the entire reply was received and processed");
case QNetworkReply::TimeoutError:
return tr("The connection to the remote server timed out");
case QNetworkReply::SslHandshakeFailedError:
return tr("SSL/TLS handshake failed");
case QNetworkReply::ConnectionRefusedError:
return tr("The remote server refused the connection");
case QNetworkReply::ProxyConnectionRefusedError:
return tr("The connection to the proxy server was refused");
case QNetworkReply::ProxyConnectionClosedError:
return tr("The proxy server closed the connection prematurely");
case QNetworkReply::ProxyNotFoundError:
return tr("The proxy host name was not found");
case QNetworkReply::ProxyTimeoutError:
return tr("The connection to the proxy timed out or the proxy did not reply in time to the request sent");
case QNetworkReply::ProxyAuthenticationRequiredError:
return tr("The proxy requires authentication in order to honour the request but did not accept any credentials offered");
case QNetworkReply::ContentAccessDenied:
return tr("The access to the remote content was denied (401)");
case QNetworkReply::ContentOperationNotPermittedError:
return tr("The operation requested on the remote content is not permitted");
case QNetworkReply::ContentNotFoundError:
return tr("The remote content was not found at the server (404)");
case QNetworkReply::AuthenticationRequiredError:
return tr("The remote server requires authentication to serve the content but the credentials provided were not accepted");
case QNetworkReply::ProtocolUnknownError:
return tr("The Network Access API cannot honor the request because the protocol is not known");
case QNetworkReply::ProtocolInvalidOperationError:
return tr("The requested operation is invalid for this protocol");
case QNetworkReply::UnknownNetworkError:
return tr("An unknown network-related error was detected");
case QNetworkReply::UnknownProxyError:
return tr("An unknown proxy-related error was detected");
case QNetworkReply::UnknownContentError:
return tr("An unknown error related to the remote content was detected");
case QNetworkReply::ProtocolFailure:
return tr("A breakdown in protocol was detected");
default:
return tr("Unknown error");
}
mutex.unlock();
}

60
src/downloadThread.h

@ -31,64 +31,34 @@ @@ -31,64 +31,34 @@
#ifndef DOWNLOADTHREAD_H
#define DOWNLOADTHREAD_H
#include <QThread>
#include <QFile>
#include <QTemporaryFile>
#include <QMutex>
#include <QMutexLocker>
#include <QWaitCondition>
#include <QStringList>
#include <curl/curl.h>
#include <QQueue>
#include <QNetworkReply>
#include <QObject>
class subDownloadThread : public QThread {
Q_OBJECT
private:
QString url;
bool abort;
public:
subDownloadThread(QObject *parent, QString url);
~subDownloadThread();
QString errorCodeToString(CURLcode status);
signals:
// For subthreads
void downloadFinishedST(subDownloadThread* st, QString url, QString file_path);
void downloadFailureST(subDownloadThread* st, QString url, QString reason);
protected:
void run();
};
class QNetworkAccessManager;
class downloadThread : public QThread {
class downloadThread : public QObject {
Q_OBJECT
private:
QQueue<QString> urls_queue;
QMutex mutex;
QWaitCondition condition;
bool abort;
QList<subDownloadThread*> subThreads;
private:
QNetworkAccessManager *networkManager;
signals:
signals:
void downloadFinished(QString url, QString file_path);
void downloadFailure(QString url, QString reason);
public:
public:
downloadThread(QObject* parent);
~downloadThread();
void downloadUrl(QString url);
void setProxy(QString IP, int port, QString username, QString password);
//void setProxy(QString IP, int port, QString username, QString password);
protected:
QString errorCodeToString(QNetworkReply::NetworkError status);
void applyProxySettings();
protected:
void run();
protected slots:
void processDlFinished(QNetworkReply* reply);
protected slots:
void propagateDownloadedFile(subDownloadThread* st, QString url, QString path);
void propagateDownloadFailure(subDownloadThread* st, QString url, QString reason);
};
#endif

1
src/engineSelectDlg.cpp

@ -41,6 +41,7 @@ @@ -41,6 +41,7 @@
#include <QFileDialog>
#include <QDropEvent>
#include <QInputDialog>
#include <QTemporaryFile>
#ifdef HAVE_ZZIP
#include <zzip/zzip.h>

BIN
src/lang/qbittorrent_bg.qm

Binary file not shown.

530
src/lang/qbittorrent_bg.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_ca.qm

Binary file not shown.

548
src/lang/qbittorrent_ca.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_cs.qm

Binary file not shown.

530
src/lang/qbittorrent_cs.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_da.qm

Binary file not shown.

548
src/lang/qbittorrent_da.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_de.qm

Binary file not shown.

532
src/lang/qbittorrent_de.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_el.qm

Binary file not shown.

530
src/lang/qbittorrent_el.ts

File diff suppressed because it is too large Load Diff

551
src/lang/qbittorrent_en.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_es.qm

Binary file not shown.

532
src/lang/qbittorrent_es.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_fi.qm

Binary file not shown.

530
src/lang/qbittorrent_fi.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_fr.qm

Binary file not shown.

534
src/lang/qbittorrent_fr.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_hu.qm

Binary file not shown.

530
src/lang/qbittorrent_hu.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_it.qm

Binary file not shown.

530
src/lang/qbittorrent_it.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_ja.qm

Binary file not shown.

530
src/lang/qbittorrent_ja.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_ko.qm

Binary file not shown.

530
src/lang/qbittorrent_ko.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_nb.qm

Binary file not shown.

548
src/lang/qbittorrent_nb.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_nl.qm

Binary file not shown.

119
src/lang/qbittorrent_nl.ts

@ -3191,6 +3191,10 @@ Changelog: @@ -3191,6 +3191,10 @@ Changelog:
<source>Expand all</source>
<translation>Alles uitklappen</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3603,6 +3607,101 @@ Changelog: @@ -3603,6 +3607,101 @@ Changelog:
<translation>Typ op zijn minst één URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished">I/O Fout</translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Onbekende fout</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4703,23 +4802,23 @@ selecteer alstublieft een er van:</translation> @@ -4703,23 +4802,23 @@ selecteer alstublieft een er van:</translation>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>Host is onbereikbaar</translation>
<translation type="obsolete">Host is onbereikbaar</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Bestand niet gevonden (404)</translation>
<translation type="obsolete">Bestand niet gevonden (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Verbinding niet toegestaan</translation>
<translation type="obsolete">Verbinding niet toegestaan</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>Url is ongeldig</translation>
<translation type="obsolete">Url is ongeldig</translation>
</message>
<message>
<source>I/O Error</source>
<translation>I/O Fout</translation>
<translation type="obsolete">I/O Fout</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4735,23 +4834,23 @@ selecteer alstublieft een er van:</translation> @@ -4735,23 +4834,23 @@ selecteer alstublieft een er van:</translation>
</message>
<message>
<source>Connection failure</source>
<translation>Verbindingsfout</translation>
<translation type="obsolete">Verbindingsfout</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Verbinding verlopen</translation>
<translation type="obsolete">Verbinding verlopen</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Verkeerde netwerkinterface</translation>
<translation type="obsolete">Verkeerde netwerkinterface</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Onbekende fout</translation>
<translation type="obsolete">Onbekende fout</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Kon proxy niet herleiden</translation>
<translation type="obsolete">Kon proxy niet herleiden</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_pl.qm

Binary file not shown.

119
src/lang/qbittorrent_pl.ts

@ -3286,6 +3286,10 @@ Zmiany: @@ -3286,6 +3286,10 @@ Zmiany:
<source>Expand all</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3710,6 +3714,101 @@ Zmiany: @@ -3710,6 +3714,101 @@ Zmiany:
<translation>Proszę podać przynajmniej jeden adres URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished">Błąd We/Wy</translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Nieznany błąd</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4816,23 +4915,23 @@ Jednak tamte wtyczki były wyłączone.</translation> @@ -4816,23 +4915,23 @@ Jednak tamte wtyczki były wyłączone.</translation>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>Host jest niedostępny</translation>
<translation type="obsolete">Host jest niedostępny</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Nie znaleziono pliku (404)</translation>
<translation type="obsolete">Nie znaleziono pliku (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Połączenie odrzucone</translation>
<translation type="obsolete">Połączenie odrzucone</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>Błędny URL</translation>
<translation type="obsolete">Błędny URL</translation>
</message>
<message>
<source>I/O Error</source>
<translation type="unfinished">Błąd We/Wy</translation>
<translation type="obsolete">Błąd We/Wy</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4848,23 +4947,23 @@ Jednak tamte wtyczki były wyłączone.</translation> @@ -4848,23 +4947,23 @@ Jednak tamte wtyczki były wyłączone.</translation>
</message>
<message>
<source>Connection failure</source>
<translation>Brak połączenia</translation>
<translation type="obsolete">Brak połączenia</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Upłynął czas połączenia</translation>
<translation type="obsolete">Upłynął czas połączenia</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Niepoprawny interfejs sieci</translation>
<translation type="obsolete">Niepoprawny interfejs sieci</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Nieznany błąd</translation>
<translation type="obsolete">Nieznany błąd</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Nie można określić proxy</translation>
<translation type="obsolete">Nie można określić proxy</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_pt.qm

Binary file not shown.

119
src/lang/qbittorrent_pt.ts

@ -3198,6 +3198,10 @@ Log de mudanças:</translation> @@ -3198,6 +3198,10 @@ Log de mudanças:</translation>
<source>Download in sequential order (slower but good for previewing)</source>
<translation>Baixar em ordem de sequência (mais lento porém melhor para visualizar)</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3622,6 +3626,101 @@ Log de mudanças:</translation> @@ -3622,6 +3626,101 @@ Log de mudanças:</translation>
<translation>Por favor digite uma URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Erro desconhecido</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4683,19 +4782,19 @@ Portanto os plugins foram desabilitados.</translation> @@ -4683,19 +4782,19 @@ Portanto os plugins foram desabilitados.</translation>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>O host é inalcançável</translation>
<translation type="obsolete">O host é inalcançável</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Arquivo não encontrado (404)</translation>
<translation type="obsolete">Arquivo não encontrado (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Conexão foi negada</translation>
<translation type="obsolete">Conexão foi negada</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>Url é inválida</translation>
<translation type="obsolete">Url é inválida</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4711,27 +4810,27 @@ Portanto os plugins foram desabilitados.</translation> @@ -4711,27 +4810,27 @@ Portanto os plugins foram desabilitados.</translation>
</message>
<message>
<source>Connection failure</source>
<translation>Conexão falhou</translation>
<translation type="obsolete">Conexão falhou</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Conexão esgotou o tempo</translation>
<translation type="obsolete">Conexão esgotou o tempo</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Relação da rede incorreta</translation>
<translation type="obsolete">Relação da rede incorreta</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Erro desconhecido</translation>
<translation type="obsolete">Erro desconhecido</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Não pude resolver proxy</translation>
<translation type="obsolete">Não pude resolver proxy</translation>
</message>
<message>
<source>I/O Error</source>
<translation>Erro de entrada e saída</translation>
<translation type="obsolete">Erro de entrada e saída</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_pt_BR.qm

Binary file not shown.

119
src/lang/qbittorrent_pt_BR.ts

@ -3198,6 +3198,10 @@ Log de mudanças:</translation> @@ -3198,6 +3198,10 @@ Log de mudanças:</translation>
<source>Download in sequential order (slower but good for previewing)</source>
<translation>Baixar em ordem de sequência (mais lento porém melhor para visualizar)</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3622,6 +3626,101 @@ Log de mudanças:</translation> @@ -3622,6 +3626,101 @@ Log de mudanças:</translation>
<translation>Por favor digite uma URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Erro desconhecido</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4683,19 +4782,19 @@ Portanto os plugins foram desabilitados.</translation> @@ -4683,19 +4782,19 @@ Portanto os plugins foram desabilitados.</translation>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>O host é inalcançável</translation>
<translation type="obsolete">O host é inalcançável</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Arquivo não encontrado (404)</translation>
<translation type="obsolete">Arquivo não encontrado (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Conexão foi negada</translation>
<translation type="obsolete">Conexão foi negada</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>Url é inválida</translation>
<translation type="obsolete">Url é inválida</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4711,27 +4810,27 @@ Portanto os plugins foram desabilitados.</translation> @@ -4711,27 +4810,27 @@ Portanto os plugins foram desabilitados.</translation>
</message>
<message>
<source>Connection failure</source>
<translation>Conexão falhou</translation>
<translation type="obsolete">Conexão falhou</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Conexão esgotou o tempo</translation>
<translation type="obsolete">Conexão esgotou o tempo</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Relação da rede incorreta</translation>
<translation type="obsolete">Relação da rede incorreta</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Erro desconhecido</translation>
<translation type="obsolete">Erro desconhecido</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Não pude resolver proxy</translation>
<translation type="obsolete">Não pude resolver proxy</translation>
</message>
<message>
<source>I/O Error</source>
<translation>Erro de entrada e saída</translation>
<translation type="obsolete">Erro de entrada e saída</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_ro.qm

Binary file not shown.

119
src/lang/qbittorrent_ro.ts

@ -3027,6 +3027,10 @@ Changelog: @@ -3027,6 +3027,10 @@ Changelog:
<source>Download in sequential order (slower but good for previewing)</source>
<translation>Descarcă în ordine secvențială (încet dar bine pentru preview)</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3451,6 +3455,101 @@ Changelog: @@ -3451,6 +3455,101 @@ Changelog:
<translation> rugăm introduceţi cel puţin un URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished">Eroare de intrare/eşire</translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Eroare necunoscută</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4520,19 +4619,19 @@ Numai acele adăugate de dvs. pot fi dezinstalate. @@ -4520,19 +4619,19 @@ Numai acele adăugate de dvs. pot fi dezinstalate.
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>Calculatorul nu poate fi accesat</translation>
<translation type="obsolete">Calculatorul nu poate fi accesat</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Fişierul nu a fost găsit(404)</translation>
<translation type="obsolete">Fişierul nu a fost găsit(404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Conectarea a fost interzisă</translation>
<translation type="obsolete">Conectarea a fost interzisă</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>Adresa URL nu este validă</translation>
<translation type="obsolete">Adresa URL nu este validă</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4548,27 +4647,27 @@ Numai acele adăugate de dvs. pot fi dezinstalate. @@ -4548,27 +4647,27 @@ Numai acele adăugate de dvs. pot fi dezinstalate.
</message>
<message>
<source>Connection failure</source>
<translation>Conectarea eşuată</translation>
<translation type="obsolete">Conectarea eşuată</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Timpul de conectare expirat</translation>
<translation type="obsolete">Timpul de conectare expirat</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Interfaţa de reţea incorectă</translation>
<translation type="obsolete">Interfaţa de reţea incorectă</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Eroare necunoscută</translation>
<translation type="obsolete">Eroare necunoscută</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Proxy nu a putut fi rezolvata</translation>
<translation type="obsolete">Proxy nu a putut fi rezolvata</translation>
</message>
<message>
<source>I/O Error</source>
<translation>Eroare de intrare/eşire</translation>
<translation type="obsolete">Eroare de intrare/eşire</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_ru.qm

Binary file not shown.

119
src/lang/qbittorrent_ru.ts

@ -3216,6 +3216,10 @@ Changelog: @@ -3216,6 +3216,10 @@ Changelog:
<source>Download in sequential order (slower but good for previewing)</source>
<translation>Загружать последовательно (медленнее но удобнее для предпросмотра)</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3632,6 +3636,101 @@ Changelog: @@ -3632,6 +3636,101 @@ Changelog:
<translation>Пожалуста введите минимум один URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished">Ошибка ввода/вывода</translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Неизвестная ошибка</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4730,19 +4829,19 @@ However, those plugins were disabled.</source> @@ -4730,19 +4829,19 @@ However, those plugins were disabled.</source>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>Хост недоступен</translation>
<translation type="obsolete">Хост недоступен</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Файл не был найден (404)</translation>
<translation type="obsolete">Файл не был найден (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Подключение было отклонено</translation>
<translation type="obsolete">Подключение было отклонено</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>URL некорректен</translation>
<translation type="obsolete">URL некорректен</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4758,27 +4857,27 @@ However, those plugins were disabled.</source> @@ -4758,27 +4857,27 @@ However, those plugins were disabled.</source>
</message>
<message>
<source>Connection failure</source>
<translation>Соединение не установлено</translation>
<translation type="obsolete">Соединение не установлено</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Тайм-аут соединения</translation>
<translation type="obsolete">Тайм-аут соединения</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Неправильный интерфейс сети</translation>
<translation type="obsolete">Неправильный интерфейс сети</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Неизвестная ошибка</translation>
<translation type="obsolete">Неизвестная ошибка</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Не удалось соединиться с Прокси</translation>
<translation type="obsolete">Не удалось соединиться с Прокси</translation>
</message>
<message>
<source>I/O Error</source>
<translation>Ошибка ввода/вывода</translation>
<translation type="obsolete">Ошибка ввода/вывода</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_sk.qm

Binary file not shown.

119
src/lang/qbittorrent_sk.ts

@ -3134,6 +3134,10 @@ Záznam zmien:</translation> @@ -3134,6 +3134,10 @@ Záznam zmien:</translation>
<source>Download in sequential order (slower but good for previewing)</source>
<translation>Sťahovať v postupnom poradí (pomalšie, ale lepšie pre náhľady)</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3562,6 +3566,101 @@ Záznam zmien:</translation> @@ -3562,6 +3566,101 @@ Záznam zmien:</translation>
<translation>Prosím, napíšte aspoň jedno URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished">V/V Chyba</translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Neznáma chyba</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4699,19 +4798,19 @@ Tieto moduly však boli vypnuté.</translation> @@ -4699,19 +4798,19 @@ Tieto moduly však boli vypnuté.</translation>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>Hostiteľ je nedostupný</translation>
<translation type="obsolete">Hostiteľ je nedostupný</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Súbor nebol nájdený (404)</translation>
<translation type="obsolete">Súbor nebol nájdený (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Spojenie bolo odmietnuté</translation>
<translation type="obsolete">Spojenie bolo odmietnuté</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>URL je neplatné</translation>
<translation type="obsolete">URL je neplatné</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4727,27 +4826,27 @@ Tieto moduly však boli vypnuté.</translation> @@ -4727,27 +4826,27 @@ Tieto moduly však boli vypnuté.</translation>
</message>
<message>
<source>Connection failure</source>
<translation>Chyba spojenia</translation>
<translation type="obsolete">Chyba spojenia</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Časový limit spojenia vypršal</translation>
<translation type="obsolete">Časový limit spojenia vypršal</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Nesprávne sieťové rozhranie</translation>
<translation type="obsolete">Nesprávne sieťové rozhranie</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Neznáma chyba</translation>
<translation type="obsolete">Neznáma chyba</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Nebolo možné preložiť adresu proxy</translation>
<translation type="obsolete">Nebolo možné preložiť adresu proxy</translation>
</message>
<message>
<source>I/O Error</source>
<translation>V/V Chyba</translation>
<translation type="obsolete">V/V Chyba</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_sv.qm

Binary file not shown.

119
src/lang/qbittorrent_sv.ts

@ -1870,6 +1870,10 @@ p, li { white-space: pre-wrap; } @@ -1870,6 +1870,10 @@ p, li { white-space: pre-wrap; }
<source>Download in sequential order (slower but good for previewing)</source>
<translation>Hämta i sekventiell ordning (långsammare men bra för förhandsvisning)</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -2210,6 +2214,101 @@ p, li { white-space: pre-wrap; } @@ -2210,6 +2214,101 @@ p, li { white-space: pre-wrap; }
<translation>Ange åtminstone en url.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished">In/Ut-fel</translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Okänt fel</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -2952,43 +3051,43 @@ Dock har dessa insticksmoduler blivit inaktiverade.</translation> @@ -2952,43 +3051,43 @@ Dock har dessa insticksmoduler blivit inaktiverade.</translation>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>Värden är inte nåbar</translation>
<translation type="obsolete">Värden är inte nåbar</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Filen kunde inte hittas (404)</translation>
<translation type="obsolete">Filen kunde inte hittas (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Anslutningen nekades</translation>
<translation type="obsolete">Anslutningen nekades</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>Url:en är ogiltig</translation>
<translation type="obsolete">Url:en är ogiltig</translation>
</message>
<message>
<source>Connection failure</source>
<translation>Anslutningsfel</translation>
<translation type="obsolete">Anslutningsfel</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Tidsgränsen för anslutningen överstegs</translation>
<translation type="obsolete">Tidsgränsen för anslutningen överstegs</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Felaktigt nätverksgränssnitt</translation>
<translation type="obsolete">Felaktigt nätverksgränssnitt</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Okänt fel</translation>
<translation type="obsolete">Okänt fel</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Kunde inte slå upp proxy</translation>
<translation type="obsolete">Kunde inte slå upp proxy</translation>
</message>
<message>
<source>I/O Error</source>
<translation>In/Ut-fel</translation>
<translation type="obsolete">In/Ut-fel</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_tr.qm

Binary file not shown.

119
src/lang/qbittorrent_tr.ts

@ -3197,6 +3197,10 @@ Changelog: @@ -3197,6 +3197,10 @@ Changelog:
<source>Download in sequential order (slower but good for previewing)</source>
<translation>Doğru düzende indir (yavaş ama önizleme için iyi)</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3609,6 +3613,101 @@ Changelog: @@ -3609,6 +3613,101 @@ Changelog:
<translation>Lütfen en az bir adres girin.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Bilinmeyen hata</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4683,19 +4782,19 @@ Bununla birlikte, o eklentiler devre dışı.</translation> @@ -4683,19 +4782,19 @@ Bununla birlikte, o eklentiler devre dışı.</translation>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>Sunucuya erişilemiyor</translation>
<translation type="obsolete">Sunucuya erişilemiyor</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Dosya bulunamadı (404)</translation>
<translation type="obsolete">Dosya bulunamadı (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Bağlantı reddedildi</translation>
<translation type="obsolete">Bağlantı reddedildi</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>Adres geçersiz</translation>
<translation type="obsolete">Adres geçersiz</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4711,27 +4810,27 @@ Bununla birlikte, o eklentiler devre dışı.</translation> @@ -4711,27 +4810,27 @@ Bununla birlikte, o eklentiler devre dışı.</translation>
</message>
<message>
<source>Connection failure</source>
<translation>Bağlantı hatası</translation>
<translation type="obsolete">Bağlantı hatası</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Bağlantı zaman aşımına uğradı</translation>
<translation type="obsolete">Bağlantı zaman aşımına uğradı</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Geçersiz arayüzü</translation>
<translation type="obsolete">Geçersiz arayüzü</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Bilinmeyen hata</translation>
<translation type="obsolete">Bilinmeyen hata</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation>Vekil çözümlenemedi</translation>
<translation type="obsolete">Vekil çözümlenemedi</translation>
</message>
<message>
<source>I/O Error</source>
<translation>Girdi/Çıktı Hatası</translation>
<translation type="obsolete">Girdi/Çıktı Hatası</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_uk.qm

Binary file not shown.

123
src/lang/qbittorrent_uk.ts

@ -3147,6 +3147,10 @@ Changelog: @@ -3147,6 +3147,10 @@ Changelog:
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3571,6 +3575,101 @@ Changelog: @@ -3571,6 +3575,101 @@ Changelog:
<translation>Буд-ласка, введіть хоча б один URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished">Невідома помилка</translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4647,19 +4746,19 @@ However, those plugins were disabled.</source> @@ -4647,19 +4746,19 @@ However, those plugins were disabled.</source>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation>Хост недоступний</translation>
<translation type="obsolete">Хост недоступний</translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>Файл не знайдено (404)</translation>
<translation type="obsolete">Файл не знайдено (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation>Відмовлено у з&apos;єднанні</translation>
<translation type="obsolete">Відмовлено у з&apos;єднанні</translation>
</message>
<message>
<source>Url is invalid</source>
<translation>Неправильний URL</translation>
<translation type="obsolete">Неправильний URL</translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -4675,27 +4774,19 @@ However, those plugins were disabled.</source> @@ -4675,27 +4774,19 @@ However, those plugins were disabled.</source>
</message>
<message>
<source>Connection failure</source>
<translation>Відмовлено у з&apos;єднанні</translation>
<translation type="obsolete">Відмовлено у з&apos;єднанні</translation>
</message>
<message>
<source>Connection was timed out</source>
<translation>Вичерпано час на з&apos;єднання</translation>
<translation type="obsolete">Вичерпано час на з&apos;єднання</translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation>Неправильний мережевий інтерфейс</translation>
<translation type="obsolete">Неправильний мережевий інтерфейс</translation>
</message>
<message>
<source>Unknown error</source>
<translation>Невідома помилка</translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>I/O Error</source>
<translation type="unfinished"></translation>
<translation type="obsolete">Невідома помилка</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_zh.qm

Binary file not shown.

119
src/lang/qbittorrent_zh.ts

@ -3379,6 +3379,10 @@ previewing)</source> @@ -3379,6 +3379,10 @@ previewing)</source>
<source>Download in sequential order (slower but good for previewing)</source>
<translation>()</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -3804,6 +3808,101 @@ enabled)</source> @@ -3804,6 +3808,101 @@ enabled)</source>
<translation>URL.</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished">/</translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -4973,19 +5072,19 @@ network.</source> @@ -4973,19 +5072,19 @@ network.</source>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>File was not found (404)</source>
<translation>404</translation>
<translation type="obsolete">404</translation>
</message>
<message>
<source>Connection was denied</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Url is invalid</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Connection forbidden (403)</source>
@ -5001,27 +5100,27 @@ network.</source> @@ -5001,27 +5100,27 @@ network.</source>
</message>
<message>
<source>Connection failure</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Connection was timed out</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Unknown error</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>I/O Error</source>
<translation>/</translation>
<translation type="obsolete">/</translation>
</message>
</context>
<context>

BIN
src/lang/qbittorrent_zh_TW.qm

Binary file not shown.

119
src/lang/qbittorrent_zh_TW.ts

@ -1965,6 +1965,10 @@ p, li { white-space: pre-wrap; } @@ -1965,6 +1965,10 @@ p, li { white-space: pre-wrap; }
<source>Download in sequential order (slower but good for previewing)</source>
<translation> ()</translation>
</message>
<message>
<source>Skip file checking and start seeding immediately</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>authentication</name>
@ -2305,6 +2309,101 @@ p, li { white-space: pre-wrap; } @@ -2305,6 +2309,101 @@ p, li { white-space: pre-wrap; }
<translation> URL</translation>
</message>
</context>
<context>
<name>downloadThread</name>
<message>
<source>I/O Error</source>
<translation type="unfinished">I/O </translation>
</message>
<message>
<source>The remote host name was not found (invalid hostname)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation was canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server closed the connection prematurely, before the entire reply was received and processed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the remote server timed out</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SSL/TLS handshake failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server refused the connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy server was refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy server closed the connection prematurely</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy host name was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection to the proxy timed out or the proxy did not reply in time to the request sent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The proxy requires authentication in order to honour the request but did not accept any credentials offered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The access to the remote content was denied (401)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The operation requested on the remote content is not permitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote content was not found at the server (404)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote server requires authentication to serve the content but the credentials provided were not accepted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Network Access API cannot honor the request because the protocol is not known</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The requested operation is invalid for this protocol</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown network-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown proxy-related error was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>An unknown error related to the remote content was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A breakdown in protocol was detected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>downloading</name>
<message>
@ -3067,43 +3166,43 @@ However, those plugins were disabled.</source> @@ -3067,43 +3166,43 @@ However, those plugins were disabled.</source>
<name>subDownloadThread</name>
<message>
<source>Host is unreachable</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>File was not found (404)</source>
<translation> (404)</translation>
<translation type="obsolete"> (404)</translation>
</message>
<message>
<source>Connection was denied</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Url is invalid</source>
<translation>URL </translation>
<translation type="obsolete">URL </translation>
</message>
<message>
<source>Connection failure</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Connection was timed out</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Incorrect network interface</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Unknown error</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>Could not resolve proxy</source>
<translation></translation>
<translation type="obsolete"></translation>
</message>
<message>
<source>I/O Error</source>
<translation>I/O </translation>
<translation type="obsolete">I/O </translation>
</message>
</context>
<context>

22
src/main.cpp

@ -34,14 +34,9 @@ @@ -34,14 +34,9 @@
#include <QFile>
#include <QSplashScreen>
#include <QSettings>
#ifdef QT_4_4
#include <QLocalSocket>
#include <unistd.h>
#include <sys/types.h>
#else
#include <QTcpSocket>
#include <QHostAddress>
#endif
#include <QPlastiqueStyle>
#include "qgnomelook.h"
#include <QMotifStyle>
@ -143,19 +138,9 @@ int main(int argc, char *argv[]){ @@ -143,19 +138,9 @@ int main(int argc, char *argv[]){
std::cerr << "Couldn't set environment variable...\n";
}
//Check if there is another instance running
#ifdef QT_4_4
QLocalSocket localSocket;
QString uid = QString::number(getuid());
#else
QTcpSocket localSocket;
#endif
#ifdef QT_4_4
localSocket.connectToServer("qBittorrent-"+uid, QIODevice::WriteOnly);
#else
int serverPort = settings.value(QString::fromUtf8("uniqueInstancePort"), -1).toInt();
if(serverPort != -1) {
localSocket.connectToHost(QHostAddress::LocalHost, serverPort, QIODevice::WriteOnly);
#endif
if (localSocket.waitForConnected(1000)){
std::cout << "Another qBittorrent instance is already running...\n";
// Send parameters
@ -174,19 +159,12 @@ int main(int argc, char *argv[]){ @@ -174,19 +159,12 @@ int main(int argc, char *argv[]){
}else{
std::cerr << "Writing to the socket timed out\n";
}
#ifdef QT_4_4
localSocket.disconnectFromServer();
#else
localSocket.disconnectFromHost();
#endif
std::cout << "disconnected\n";
}
localSocket.close();
return 0;
}
#ifndef QT_4_4
}
#endif
app = new QApplication(argc, argv);
useStyle(app, settings.value("Preferences/General/Style", 0).toInt());
app->setStyleSheet("QStatusBar::item { border-width: 0; }");

9
src/qtorrenthandle.cpp

@ -163,11 +163,6 @@ QString QTorrentHandle::save_path() const { @@ -163,11 +163,6 @@ QString QTorrentHandle::save_path() const {
return misc::toQString(h.save_path().string());
}
fs::path QTorrentHandle::save_path_boost() const {
Q_ASSERT(h.is_valid());
return h.save_path();
}
bool QTorrentHandle::super_seeding() const {
Q_ASSERT(h.is_valid());
return h.super_seeding();
@ -239,9 +234,9 @@ size_type QTorrentHandle::filesize_at(unsigned int index) const { @@ -239,9 +234,9 @@ size_type QTorrentHandle::filesize_at(unsigned int index) const {
return h.get_torrent_info().file_at(index).size;
}
std::vector<announce_entry> const& QTorrentHandle::trackers() const {
std::vector<announce_entry> QTorrentHandle::trackers() const {
Q_ASSERT(h.is_valid());
return h.get_torrent_info().trackers();
return h.trackers();
}
torrent_status::state_t QTorrentHandle::state() const {

3
src/qtorrenthandle.h

@ -81,7 +81,6 @@ class QTorrentHandle { @@ -81,7 +81,6 @@ class QTorrentHandle {
int num_incomplete() const;
void scrape_tracker() const;
QString save_path() const;
fs::path save_path_boost() const;
QStringList url_seeds() const;
size_type actual_size() const;
int download_limit() const;
@ -93,7 +92,7 @@ class QTorrentHandle { @@ -93,7 +92,7 @@ class QTorrentHandle {
bool is_queued() const;
QString file_at(unsigned int index) const;
size_type filesize_at(unsigned int index) const;
std::vector<announce_entry> const& trackers() const;
std::vector<announce_entry> trackers() const;
torrent_status::state_t state() const;
QString creator() const;
QString comment() const;

12
src/rss.cpp

@ -561,11 +561,15 @@ short RssStream::readDoc(const QDomDocument& doc) { @@ -561,11 +561,15 @@ short RssStream::readDoc(const QDomDocument& doc) {
image = property.text();
else if(property.tagName() == "item") {
RssItem * item = new RssItem(this, property);
if(item->isValid() && !itemAlreadyExists(item->getTitle())) {
if(item->isValid()) {
bool already_exists = itemAlreadyExists(item->getTitle());
if(!already_exists) {
(*this)[item->getTitle()] = item;
}
if(item->has_attachment()) {
has_attachments = true;
// Check if the item should be automatically downloaded
if(!already_exists || !(*this)[item->getTitle()]->isRead()) {
FeedFilter * matching_filter = FeedFilters::getFeedFilters(url).matches(item->getTitle());
if(matching_filter != 0) {
// Download the torrent
@ -581,11 +585,13 @@ short RssStream::readDoc(const QDomDocument& doc) { @@ -581,11 +585,13 @@ short RssStream::readDoc(const QDomDocument& doc) {
BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl());
}
// Item was downloaded, consider it as Read
item->setRead();
(*this)[item->getTitle()]->setRead();
// Clean up
delete matching_filter;
}
}
}
} else {
delete item;
}
@ -604,7 +610,7 @@ void RssStream::resizeList() { @@ -604,7 +610,7 @@ void RssStream::resizeList() {
unsigned int max_articles = settings.value(QString::fromUtf8("Preferences/RSS/RSSMaxArticlesPerFeed"), 100).toInt();
unsigned int nb_articles = this->size();
if(nb_articles > max_articles) {
QList<RssItem*> listItem = sortNewsList(this->values());
QList<RssItem*> listItem = RssManager::sortNewsList(this->values());
int excess = nb_articles - max_articles;
for(int i=0; i<excess; ++i){
RssItem *lastItem = listItem.takeLast();

16
src/rss.h

@ -492,23 +492,25 @@ public slots: @@ -492,23 +492,25 @@ public slots:
public:
RssManager(bittorrent *BTSession);
~RssManager();
};
static void insertSortElem(QList<RssItem*> &list, RssItem *item) {
static void insertSortElem(QList<RssItem*> &list, RssItem *item) {
int i = 0;
while(i < list.size() && item->getDate() < list.at(i)->getDate()) {
++i;
}
list.insert(i, item);
}
}
static QList<RssItem*> sortNewsList(QList<RssItem*> news_list) {
static QList<RssItem*> sortNewsList(QList<RssItem*> news_list) {
QList<RssItem*> new_list;
foreach(RssItem *item, news_list) {
insertSortElem(new_list, item);
}
return new_list;
}
}
};
#endif

4
src/rss_imp.cpp

@ -431,9 +431,9 @@ void RSSImp::refreshNewsList(QTreeWidgetItem* item) { @@ -431,9 +431,9 @@ void RSSImp::refreshNewsList(QTreeWidgetItem* item) {
qDebug("Getting the list of news");
QList<RssItem*> news;
if(rss_item == rssmanager)
news = sortNewsList(rss_item->getUnreadNewsList());
news = RssManager::sortNewsList(rss_item->getUnreadNewsList());
else
news = sortNewsList(rss_item->getNewsList());
news = RssManager::sortNewsList(rss_item->getNewsList());
// Clear the list first
textBrowser->clear();
previous_news = 0;

7
src/src.pro

@ -14,7 +14,7 @@ CONFIG += qt \ @@ -14,7 +14,7 @@ CONFIG += qt \
network
# Update this VERSION for each release
DEFINES += VERSION=\\\"v1.6.0alpha2\\\"
DEFINES += VERSION=\\\"v1.6.0beta1\\\"
DEFINES += VERSION_MAJOR=1
DEFINES += VERSION_MINOR=6
DEFINES += VERSION_BUGFIX=0
@ -90,15 +90,14 @@ contains(DEBUG_MODE, 0) { @@ -90,15 +90,14 @@ contains(DEBUG_MODE, 0) {
# QMAKE_CXXFLAGS_DEBUG += -fwrapv
unix:QMAKE_LFLAGS_SHAPP += -rdynamic
CONFIG += link_pkgconfig
PKGCONFIG += "libtorrent-rasterbar libcurl"
PKGCONFIG += "libtorrent-rasterbar"
QT += network \
xml
DEFINES += QT_NO_CAST_TO_ASCII
# QT_NO_CAST_FROM_ASCII
# Windows
# usually built as static
# win32:LIBS += -ltorrent -lcurl -lboost_system
# win32:LIBS += -ltorrent -lboost_system
# win32:LIBS += -lz ?
win32:LIBS += -lssl32 \
-lws2_32 \

2
src/torrentAddition.h

@ -444,6 +444,8 @@ public slots: @@ -444,6 +444,8 @@ public slots:
settings.setValue(QString::fromUtf8("LastDirTorrentAdd"), savePathTxt->text());
// Create .incremental file if necessary
TorrentTempData::setSequential(hash, checkIncrementalDL->isChecked());
// Skip file checking and directly start seeding
TorrentTempData::setSeedingMode(hash, addInSeed->isChecked());
// Check if there is at least one selected file
if(allFiltered()){
QMessageBox::warning(0, tr("Invalid file selection"), tr("You must select at least one file in the torrent"));

19
src/torrentPersistentData.h

@ -99,6 +99,25 @@ public: @@ -99,6 +99,25 @@ public:
}
static void setSeedingMode(QString hash,bool seed){
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume"));
QHash<QString, QVariant> all_data = settings.value("torrents-tmp", QHash<QString, QVariant>()).toHash();
QHash<QString, QVariant> data = all_data[hash].toHash();
data["seeding"] = seed;
all_data[hash] = data;
settings.setValue("torrents-tmp", all_data);
}
static bool isSeedingMode(QString hash){
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume"));
QHash<QString, QVariant> all_data = settings.value("torrents-tmp", QHash<QString, QVariant>()).toHash();
QHash<QString, QVariant> data = all_data[hash].toHash();
if(data.contains("seeding"))
return data["seeding"].toBool();
return false;
}
static QString getSavePath(QString hash) {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume"));
QHash<QString, QVariant> all_data = settings.value("torrents-tmp", QHash<QString, QVariant>()).toHash();

Loading…
Cancel
Save