You've already forked qBittorrent
mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-10-19 05:12:18 +02:00
Compare commits
96 Commits
release-1.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c7cfc28aa9 | ||
![]() |
d11e132f56 | ||
![]() |
5e2af99c73 | ||
![]() |
23e03a5700 | ||
![]() |
949e1d75cd | ||
![]() |
c944d88c3e | ||
![]() |
2d24b468b6 | ||
![]() |
2dc75cb98d | ||
![]() |
5e3be25916 | ||
![]() |
49e8bad7cc | ||
![]() |
796aea19e6 | ||
![]() |
dd35f1723b | ||
![]() |
0177e1fee4 | ||
![]() |
949eb2b5f5 | ||
![]() |
2d59fe37bf | ||
![]() |
b6f81c199e | ||
![]() |
c2964dc340 | ||
![]() |
8aebb93424 | ||
![]() |
96c38f7be4 | ||
![]() |
cf2abe45de | ||
![]() |
88ac8adb30 | ||
![]() |
b331478179 | ||
![]() |
bfaa82ccba | ||
![]() |
77f407724d | ||
![]() |
2f5c2e6404 | ||
![]() |
fbb2cdd1a9 | ||
![]() |
63a4e06556 | ||
![]() |
3d934b4a9c | ||
![]() |
697c275d83 | ||
![]() |
25b9601613 | ||
![]() |
276dfd9df6 | ||
![]() |
19f05f0a97 | ||
![]() |
293aaefefe | ||
![]() |
57cdf4ebd1 | ||
![]() |
c4a0c8f100 | ||
![]() |
306991e776 | ||
![]() |
de2384e4a7 | ||
![]() |
236dbcfb4a | ||
![]() |
a1b133d883 | ||
![]() |
4f8825e371 | ||
![]() |
1aa0936c91 | ||
![]() |
d5e22c523e | ||
![]() |
6618e61a42 | ||
![]() |
26283ec228 | ||
![]() |
ed12f5c77e | ||
![]() |
8e074a571a | ||
![]() |
e2c7c973fd | ||
![]() |
eec04761ef | ||
![]() |
f73256e0ea | ||
![]() |
fec1de6383 | ||
![]() |
db35a7efb8 | ||
![]() |
36eae88a5a | ||
![]() |
c01fd75c92 | ||
![]() |
103f2d0720 | ||
![]() |
037c46b587 | ||
![]() |
0879f2c0ca | ||
![]() |
a65cd5c39c | ||
![]() |
d219e7afeb | ||
![]() |
892bb4c432 | ||
![]() |
45b9c6335c | ||
![]() |
78e643039c | ||
![]() |
04e993c674 | ||
![]() |
c3132fc1b0 | ||
![]() |
b1c73cb401 | ||
![]() |
ac6eb8c6bc | ||
![]() |
8a64412cb5 | ||
![]() |
56885cc914 | ||
![]() |
cdd1f9b86c | ||
![]() |
139360cf76 | ||
![]() |
2931d51add | ||
![]() |
aa0bec41b4 | ||
![]() |
b32b42b53e | ||
![]() |
06c4c717bd | ||
![]() |
a3ed44baec | ||
![]() |
0cbb4a7074 | ||
![]() |
af2e487ef5 | ||
![]() |
28fdfdfef1 | ||
![]() |
c95cca6436 | ||
![]() |
86024c6c74 | ||
![]() |
75290cf715 | ||
![]() |
321b76a72a | ||
![]() |
95ecaec11e | ||
![]() |
0e7c16901c | ||
![]() |
43dcbf776b | ||
![]() |
e21c28e9d2 | ||
![]() |
918c1507d3 | ||
![]() |
a189e4403d | ||
![]() |
563291a2e8 | ||
![]() |
9156c9ac8f | ||
![]() |
f0049f1dae | ||
![]() |
a622152747 | ||
![]() |
8440e9982f | ||
![]() |
602d73fa82 | ||
![]() |
c32ebb8d9f | ||
![]() |
deeead4008 | ||
![]() |
937a491409 |
13
AUTHORS
13
AUTHORS
@@ -17,13 +17,14 @@ Images Authors:
|
|||||||
license: Creative Commons Public Domain Dedication
|
license: Creative Commons Public Domain Dedication
|
||||||
url: http://www.openclipart.org
|
url: http://www.openclipart.org
|
||||||
|
|
||||||
* files: src/Icons/skins/*.png
|
* files: src/Icons/skin/*.png
|
||||||
|
files: src/menuicons/YYxYY/*.png
|
||||||
copyright: Mateusz Tobola <tobejodok@qbittorrent.org>
|
copyright: Mateusz Tobola <tobejodok@qbittorrent.org>
|
||||||
license: GPLv2
|
license: GPLv2
|
||||||
|
|
||||||
* files: src/menuicons/YYxYY/*.png
|
* file: src/Icons/skin/tabs.gif
|
||||||
copyright: Mateusz Tobola <tobejodok@qbittorrent.org>
|
copyright: Greg Houston <gregory.houston@gmail.com>
|
||||||
license: GPLv2
|
license: MIT
|
||||||
|
|
||||||
* file: src/search_engine/engines/btjunkie.png
|
* file: src/search_engine/engines/btjunkie.png
|
||||||
copyright: Downloaded from btjunkie.org
|
copyright: Downloaded from btjunkie.org
|
||||||
@@ -46,7 +47,9 @@ Translations authors:
|
|||||||
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
||||||
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
|
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
|
||||||
- Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
|
- Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
|
||||||
- Chinese (Simplified): Guo Yue (guoyue0418@hotmail.com)
|
- Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com)
|
||||||
|
- Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
|
||||||
|
- Czech: Jirka Vilim (web@tets.cz)
|
||||||
- Danish: Mathias Nielsen (comoneo@gmail.com)
|
- Danish: Mathias Nielsen (comoneo@gmail.com)
|
||||||
- Dutch: Joost Schipper (heavyjoost@users.sourceforge.net)
|
- Dutch: Joost Schipper (heavyjoost@users.sourceforge.net)
|
||||||
- English: Christophe Dumez (chris@qbittorrent.org)
|
- English: Christophe Dumez (chris@qbittorrent.org)
|
||||||
|
29
Changelog
29
Changelog
@@ -1,14 +1,37 @@
|
|||||||
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.2.0
|
* Sun Nov 9 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.2.1
|
||||||
|
- BUGFIX: Fixed possible crash when deleting a torrent permanently
|
||||||
|
- BUGFIX: Queued_for_checking torrents were not displayed as checking in seeding list
|
||||||
|
- BUGFIX: Speed up startup time when having a lot of torrents
|
||||||
|
|
||||||
|
* Wed Oct 29 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.2.0
|
||||||
- FEATURE: Torrent queueing system (with priorities)
|
- FEATURE: Torrent queueing system (with priorities)
|
||||||
- FEATURE: DHT is always ON (no longer used as fallback)
|
|
||||||
- FEATURE: The number of DHT nodes is displayed
|
- FEATURE: The number of DHT nodes is displayed
|
||||||
- FEATURE: RSS can now be disabled from program preferences
|
- FEATURE: RSS can now be disabled from program preferences
|
||||||
|
- FEATURE: Added collapse/expand all buttons in addition and properties dialogs
|
||||||
|
- FEATURE: Can have different proxies for Bittorrent and search engine
|
||||||
|
- FEATURE: Allow multiple item selection in Web UI transfer list
|
||||||
|
- FEATURE: Moved uploads to a separate list in Web UI
|
||||||
|
- BUGFIX: Totally rewritten Web UI list refresh system (fixed memory leak)
|
||||||
- BUGFIX: Disable ETA calculation when ETA column is hidden
|
- BUGFIX: Disable ETA calculation when ETA column is hidden
|
||||||
- BUGFIX: Removed "disconnected" connection state, detection was far from perfect
|
- BUGFIX: Removed "disconnected" connection state, detection was far from perfect
|
||||||
|
- BUGFIX: Torrents are no longer starting from scratch when changing default save path (when torrent addition dialog is disabled)
|
||||||
|
- BUGFIX: Single instance code is now more reliable on Qt >= 4.4
|
||||||
- COSMETIC: Transfer speed, ratio, connection status and DHT nodes are displayed in status bar
|
- COSMETIC: Transfer speed, ratio, connection status and DHT nodes are displayed in status bar
|
||||||
- COSMETIC: RSS Tab is now hidden as a default
|
- COSMETIC: RSS Tab is now hidden as a default
|
||||||
- COSMETIC: Allow to hide or display top toolbar
|
- COSMETIC: Allow to hide or display top toolbar
|
||||||
- COSMETIC: Top toolbar is now hidden as a default
|
- COSMETIC: Log is now in a separate dialog
|
||||||
|
|
||||||
|
* Sun Sept 14 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.4
|
||||||
|
- FEATURE: DHT is no longer used as fallback only
|
||||||
|
- FEATURE: Ported WebUI to Mootools v1.2
|
||||||
|
- BUGFIX: Fixed 'start seeding after torrent creation' feature
|
||||||
|
- BUGFIX: Fixed compilation with boost v1.36
|
||||||
|
- BUGFIX: Some code optimization
|
||||||
|
- BUGFIX: Fixed memory leak in Web UI
|
||||||
|
- BUGFIX: Fixed problems with column sorting
|
||||||
|
- BUGFIX: Improved code for pausing torrents on startup
|
||||||
|
- BUGFIX: Torrent addition dialog is now disabled for downloads from WebUI
|
||||||
|
- BUGFIX: Give focus to input field in WebUI download dialog
|
||||||
|
|
||||||
* Tue Aug 26 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.3
|
* Tue Aug 26 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.3
|
||||||
- BUGFIX: Fixed ratio saving for seeding torrents
|
- BUGFIX: Fixed ratio saving for seeding torrents
|
||||||
|
18
TODO
18
TODO
@@ -1,4 +1,18 @@
|
|||||||
See https://blueprints.launchpad.net/qbittorrent/
|
See https://blueprints.launchpad.net/qbittorrent/
|
||||||
|
|
||||||
// in v1.2.0
|
// translations done
|
||||||
- Split download and uploads in Web UI (Ishan Ahora)
|
- french
|
||||||
|
- chinese traditional
|
||||||
|
- chinese simplified
|
||||||
|
- finish
|
||||||
|
- swedish
|
||||||
|
- slovak
|
||||||
|
- German
|
||||||
|
- Hungarian
|
||||||
|
- Italian
|
||||||
|
- Dutch
|
||||||
|
- Romanian
|
||||||
|
- Korean
|
||||||
|
- Russian
|
||||||
|
- Bulgarian
|
||||||
|
- Greek
|
||||||
|
@@ -37,7 +37,7 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
setupUi(this);
|
setupUi(this);
|
||||||
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
||||||
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
||||||
connect(BTSession, SIGNAL(addedTorrent(QString, QTorrentHandle&, bool)), this, SLOT(torrentAdded(QString, QTorrentHandle&, bool)));
|
connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), this, SLOT(torrentAdded(QTorrentHandle&)));
|
||||||
finishedListModel = new QStandardItemModel(0,7);
|
finishedListModel = new QStandardItemModel(0,7);
|
||||||
finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
||||||
finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
||||||
@@ -58,7 +58,7 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
// Make download list header clickable for sorting
|
// Make download list header clickable for sorting
|
||||||
finishedList->header()->setClickable(true);
|
finishedList->header()->setClickable(true);
|
||||||
finishedList->header()->setSortIndicatorShown(true);
|
finishedList->header()->setSortIndicatorShown(true);
|
||||||
connect(finishedList->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortFinishedList(int)));
|
connect(finishedList->header(), SIGNAL(sectionPressed(int)), this, SLOT(toggleFinishedListSortOrder(int)));
|
||||||
finishedListDelegate = new FinishedListDelegate(finishedList);
|
finishedListDelegate = new FinishedListDelegate(finishedList);
|
||||||
finishedList->setItemDelegate(finishedListDelegate);
|
finishedList->setItemDelegate(finishedListDelegate);
|
||||||
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
|
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
|
||||||
@@ -141,7 +141,7 @@ void FinishedTorrents::addTorrent(QString hash){
|
|||||||
emit finishedTorrentsNumberChanged(nbFinished);
|
emit finishedTorrentsNumberChanged(nbFinished);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::torrentAdded(QString, QTorrentHandle& h, bool) {
|
void FinishedTorrents::torrentAdded(QTorrentHandle& h) {
|
||||||
QString hash = h.hash();
|
QString hash = h.hash();
|
||||||
if(BTSession->isFinished(hash)) {
|
if(BTSession->isFinished(hash)) {
|
||||||
addTorrent(hash);
|
addTorrent(hash);
|
||||||
@@ -190,10 +190,27 @@ bool FinishedTorrents::loadColWidthFinishedList(){
|
|||||||
for(unsigned int i=0; i<listSize; ++i){
|
for(unsigned int i=0; i<listSize; ++i){
|
||||||
finishedList->header()->resizeSection(i, width_list.at(i).toInt());
|
finishedList->header()->resizeSection(i, width_list.at(i).toInt());
|
||||||
}
|
}
|
||||||
|
loadLastSortedColumn();
|
||||||
qDebug("Finished list columns width loaded");
|
qDebug("Finished list columns width loaded");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::loadLastSortedColumn() {
|
||||||
|
// Loading last sorted column
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
QString sortedCol = settings.value(QString::fromUtf8("FinishedListSortedCol"), QString()).toString();
|
||||||
|
if(!sortedCol.isEmpty()) {
|
||||||
|
Qt::SortOrder sortOrder;
|
||||||
|
if(sortedCol.endsWith(QString::fromUtf8("d")))
|
||||||
|
sortOrder = Qt::DescendingOrder;
|
||||||
|
else
|
||||||
|
sortOrder = Qt::AscendingOrder;
|
||||||
|
sortedCol = sortedCol.left(sortedCol.size()-1);
|
||||||
|
int index = sortedCol.toInt();
|
||||||
|
sortFinishedList(index, sortOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Save columns width in a file to remember them
|
// Save columns width in a file to remember them
|
||||||
// (finished list)
|
// (finished list)
|
||||||
void FinishedTorrents::saveColWidthFinishedList() const{
|
void FinishedTorrents::saveColWidthFinishedList() const{
|
||||||
@@ -262,9 +279,6 @@ void FinishedTorrents::updateFinishedList(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(h.is_paused()) continue;
|
if(h.is_paused()) continue;
|
||||||
if(BTSession->getTorrentsToPauseAfterChecking().indexOf(hash) != -1) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(h.state() == torrent_status::downloading || (h.state() != torrent_status::checking_files && h.state() != torrent_status::queued_for_checking && h.progress() < 1.)) {
|
if(h.state() == torrent_status::downloading || (h.state() != torrent_status::checking_files && h.state() != torrent_status::queued_for_checking && h.progress() < 1.)) {
|
||||||
// What are you doing here? go back to download tab!
|
// What are you doing here? go back to download tab!
|
||||||
int reponse = QMessageBox::question(this, tr("Incomplete torrent in seeding list"), tr("It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted)").arg(h.name()), QMessageBox::Yes | QMessageBox::No);
|
int reponse = QMessageBox::question(this, tr("Incomplete torrent in seeding list"), tr("It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted)").arg(h.name()), QMessageBox::Yes | QMessageBox::No);
|
||||||
@@ -276,11 +290,11 @@ void FinishedTorrents::updateFinishedList(){
|
|||||||
}
|
}
|
||||||
else if (reponse == QMessageBox::No) {
|
else if (reponse == QMessageBox::No) {
|
||||||
qDebug("Deleted from the finished");
|
qDebug("Deleted from the finished");
|
||||||
BTSession->deleteTorrent(hash, true);
|
BTSession->deleteTorrent(hash, false);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(h.state() == torrent_status::checking_files){
|
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
|
||||||
setRowColor(row, QString::fromUtf8("grey"));
|
setRowColor(row, QString::fromUtf8("grey"));
|
||||||
continue;
|
continue;
|
||||||
@@ -577,17 +591,37 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
|
|||||||
* Sorting functions
|
* Sorting functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void FinishedTorrents::sortFinishedList(int index){
|
void FinishedTorrents::toggleFinishedListSortOrder(int index) {
|
||||||
static Qt::SortOrder sortOrder = Qt::AscendingOrder;
|
Qt::SortOrder sortOrder = Qt::AscendingOrder;
|
||||||
if(finishedList->header()->sortIndicatorSection() == index){
|
if(finishedList->header()->sortIndicatorSection() == index){
|
||||||
if(sortOrder == Qt::AscendingOrder){
|
sortOrder = (Qt::SortOrder)!(bool)finishedList->header()->sortIndicatorOrder();
|
||||||
sortOrder = Qt::DescendingOrder;
|
|
||||||
}else{
|
|
||||||
sortOrder = Qt::AscendingOrder;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
finishedList->header()->setSortIndicator(index, sortOrder);
|
switch(index) {
|
||||||
switch(index){
|
case F_SIZE:
|
||||||
|
case F_UPSPEED:
|
||||||
|
case F_PRIORITY:
|
||||||
|
sortFinishedListFloat(index, sortOrder);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sortFinishedListString(index, sortOrder);
|
||||||
|
}
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
QString sortOrderLetter;
|
||||||
|
if(sortOrder == Qt::AscendingOrder)
|
||||||
|
sortOrderLetter = QString::fromUtf8("a");
|
||||||
|
else
|
||||||
|
sortOrderLetter = QString::fromUtf8("d");
|
||||||
|
settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::sortFinishedList(int index, Qt::SortOrder sortOrder){
|
||||||
|
if(index == -1) {
|
||||||
|
index = finishedList->header()->sortIndicatorSection();
|
||||||
|
sortOrder = finishedList->header()->sortIndicatorOrder();
|
||||||
|
} else {
|
||||||
|
finishedList->header()->setSortIndicator(index, sortOrder);
|
||||||
|
}
|
||||||
|
switch(index) {
|
||||||
case F_SIZE:
|
case F_SIZE:
|
||||||
case F_UPSPEED:
|
case F_UPSPEED:
|
||||||
case F_PRIORITY:
|
case F_PRIORITY:
|
||||||
|
@@ -60,11 +60,12 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
|||||||
void displayFinishedHoSMenu(const QPoint&);
|
void displayFinishedHoSMenu(const QPoint&);
|
||||||
void setRowColor(int row, QString color);
|
void setRowColor(int row, QString color);
|
||||||
void saveColWidthFinishedList() const;
|
void saveColWidthFinishedList() const;
|
||||||
void sortFinishedList(int index);
|
void toggleFinishedListSortOrder(int index);
|
||||||
|
void sortFinishedList(int index=-1, Qt::SortOrder sortOrder=Qt::AscendingOrder);
|
||||||
void sortFinishedListFloat(int index, Qt::SortOrder sortOrder);
|
void sortFinishedListFloat(int index, Qt::SortOrder sortOrder);
|
||||||
void sortFinishedListString(int index, Qt::SortOrder sortOrder);
|
void sortFinishedListString(int index, Qt::SortOrder sortOrder);
|
||||||
void updateFileSize(QString hash);
|
void updateFileSize(QString hash);
|
||||||
void torrentAdded(QString path, QTorrentHandle& h, bool fastResume);
|
void torrentAdded(QTorrentHandle& h);
|
||||||
void on_actionSet_upload_limit_triggered();
|
void on_actionSet_upload_limit_triggered();
|
||||||
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
||||||
void hideOrShowColumnName();
|
void hideOrShowColumnName();
|
||||||
@@ -83,6 +84,7 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
|||||||
void deleteTorrent(QString hash);
|
void deleteTorrent(QString hash);
|
||||||
void showPropertiesFromHash(QString hash);
|
void showPropertiesFromHash(QString hash);
|
||||||
void hidePriorityColumn(bool hide);
|
void hidePriorityColumn(bool hide);
|
||||||
|
void loadLastSortedColumn();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void torrentMovedFromFinishedList(QString);
|
void torrentMovedFromFinishedList(QString);
|
||||||
|
146
src/GUI.cpp
146
src/GUI.cpp
File diff suppressed because it is too large
Load Diff
11
src/GUI.h
11
src/GUI.h
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
|
#include <QPointer>
|
||||||
#include "ui_MainWindow.h"
|
#include "ui_MainWindow.h"
|
||||||
#include "qtorrenthandle.h"
|
#include "qtorrenthandle.h"
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
QTabWidget *tabs;
|
QTabWidget *tabs;
|
||||||
options_imp *options;
|
options_imp *options;
|
||||||
QSystemTrayIcon *myTrayIcon;
|
QSystemTrayIcon *myTrayIcon;
|
||||||
QTimer *systrayCreator;
|
QPointer<QTimer> systrayCreator;
|
||||||
QMenu *myTrayIconMenu;
|
QMenu *myTrayIconMenu;
|
||||||
DownloadingTorrents *downloadingTorrentTab;
|
DownloadingTorrents *downloadingTorrentTab;
|
||||||
FinishedTorrents *finishedTorrentTab;
|
FinishedTorrents *finishedTorrentTab;
|
||||||
@@ -97,7 +97,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
// RSS
|
// RSS
|
||||||
RSSImp *rssWidget;
|
RSSImp *rssWidget;
|
||||||
// Web UI
|
// Web UI
|
||||||
HttpServer *httpServer;
|
QPointer<HttpServer> httpServer;
|
||||||
// Misc
|
// Misc
|
||||||
#ifdef QT_4_4
|
#ifdef QT_4_4
|
||||||
QLocalServer *localServer;
|
QLocalServer *localServer;
|
||||||
@@ -116,6 +116,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void on_actionCreate_torrent_triggered();
|
void on_actionCreate_torrent_triggered();
|
||||||
void on_actionWebsite_triggered() const;
|
void on_actionWebsite_triggered() const;
|
||||||
void on_actionBugReport_triggered() const;
|
void on_actionBugReport_triggered() const;
|
||||||
|
void on_actionShow_console_triggered();
|
||||||
void readParamsOnSocket();
|
void readParamsOnSocket();
|
||||||
void acceptConnection();
|
void acceptConnection();
|
||||||
void togglePausedState(QString hash);
|
void togglePausedState(QString hash);
|
||||||
@@ -161,9 +162,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void processDownloadedFiles(QString path, QString url);
|
void processDownloadedFiles(QString path, QString url);
|
||||||
void downloadFromURLList(const QStringList& urls);
|
void downloadFromURLList(const QStringList& urls);
|
||||||
void deleteTorrent(QString hash);
|
void deleteTorrent(QString hash);
|
||||||
void deleteRatioTorrent(QString fileName);
|
|
||||||
void finishedTorrent(QTorrentHandle& h) const;
|
void finishedTorrent(QTorrentHandle& h) const;
|
||||||
void torrentChecked(QString hash) const;
|
|
||||||
void updateLists();
|
void updateLists();
|
||||||
bool initWebUi(QString username, QString password, int port);
|
bool initWebUi(QString username, QString password, int port);
|
||||||
void pauseTorrent(QString hash);
|
void pauseTorrent(QString hash);
|
||||||
@@ -171,7 +170,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void on_actionDecreasePriority_triggered();
|
void on_actionDecreasePriority_triggered();
|
||||||
// Options slots
|
// Options slots
|
||||||
void on_actionOptions_triggered();
|
void on_actionOptions_triggered();
|
||||||
void OptionsSaved(QString info, bool deleteOptions);
|
void OptionsSaved(bool deleteOptions);
|
||||||
// HTTP slots
|
// HTTP slots
|
||||||
void on_actionDownload_from_URL_triggered();
|
void on_actionDownload_from_URL_triggered();
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Categories=Qt;Network;P2P
|
Categories=Qt;Network;P2P
|
||||||
Comment=V1.2.0
|
Comment=V1.2.1
|
||||||
Exec=qbittorrent %f
|
Exec=qbittorrent %f
|
||||||
GenericName=Bittorrent client
|
GenericName=Bittorrent client
|
||||||
GenericName[bg]=Торент клиент
|
GenericName[bg]=Торент клиент
|
||||||
|
BIN
src/Icons/skin/tabs.gif
Normal file
BIN
src/Icons/skin/tabs.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 75 KiB |
@@ -58,6 +58,7 @@
|
|||||||
<string>Options</string>
|
<string>Options</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionOptions" />
|
<addaction name="actionOptions" />
|
||||||
|
<addaction name="actionShow_console" />
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_File" >
|
<widget class="QMenu" name="menu_File" >
|
||||||
<property name="title" >
|
<property name="title" >
|
||||||
@@ -255,6 +256,14 @@
|
|||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionShow_console" >
|
||||||
|
<property name="icon" >
|
||||||
|
<iconset resource="icons.qrc" >:/Icons/log.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>Console</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="icons.qrc" />
|
<include location="icons.qrc" />
|
||||||
|
@@ -13,21 +13,6 @@
|
|||||||
<string>Torrent addition dialog</string>
|
<string>Torrent addition dialog</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing" >
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="fileNameLbl" >
|
<widget class="QLabel" name="fileNameLbl" >
|
||||||
<property name="text" >
|
<property name="text" >
|
||||||
@@ -110,6 +95,50 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="collapseAllButton" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Collapse all</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="expandAllButton" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Expand all</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="checkIncrementalDL" >
|
<widget class="QCheckBox" name="checkIncrementalDL" >
|
||||||
<property name="text" >
|
<property name="text" >
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -26,6 +26,9 @@
|
|||||||
#include <QPair>
|
#include <QPair>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QPalette>
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
#include <libtorrent/session.hpp>
|
#include <libtorrent/session.hpp>
|
||||||
#include <libtorrent/ip_filter.hpp>
|
#include <libtorrent/ip_filter.hpp>
|
||||||
@@ -38,24 +41,25 @@ class deleteThread;
|
|||||||
class QTimer;
|
class QTimer;
|
||||||
class FilterParserThread;
|
class FilterParserThread;
|
||||||
|
|
||||||
class bittorrent : public QObject{
|
class bittorrent : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
session *s;
|
session *s;
|
||||||
QString scan_dir;
|
QString scan_dir;
|
||||||
QTimer *timerScan;
|
QPointer<QTimer> timerScan;
|
||||||
QTimer *timerAlerts;
|
QTimer *timerAlerts;
|
||||||
QTimer *fastResumeSaver;
|
QTimer *fastResumeSaver;
|
||||||
QTimer *BigRatioTimer;
|
QPointer<QTimer> BigRatioTimer;
|
||||||
bool DHTEnabled;
|
bool DHTEnabled;
|
||||||
downloadThread *downloader;
|
downloadThread *downloader;
|
||||||
QString defaultSavePath;
|
QString defaultSavePath;
|
||||||
QStringList torrentsToPauseAfterChecking;
|
|
||||||
QHash<QString, QDateTime> TorrentsStartTime;
|
QHash<QString, QDateTime> TorrentsStartTime;
|
||||||
QHash<QString, size_type> TorrentsStartData;
|
QHash<QString, size_type> TorrentsStartData;
|
||||||
QHash<QString, QPair<size_type,size_type> > ratioData;
|
QHash<QString, QPair<size_type,size_type> > ratioData;
|
||||||
QHash<QString, QHash<QString, QString> > trackersErrors;
|
QHash<QString, QHash<QString, QString> > trackersErrors;
|
||||||
|
QStringList consoleMessages;
|
||||||
|
QStringList peerBanMessages;
|
||||||
deleteThread *deleter;
|
deleteThread *deleter;
|
||||||
QStringList finishedTorrents;
|
QStringList finishedTorrents;
|
||||||
QStringList unfinishedTorrents;
|
QStringList unfinishedTorrents;
|
||||||
@@ -67,7 +71,7 @@ class bittorrent : public QObject{
|
|||||||
bool UPnPEnabled;
|
bool UPnPEnabled;
|
||||||
bool NATPMPEnabled;
|
bool NATPMPEnabled;
|
||||||
bool LSDEnabled;
|
bool LSDEnabled;
|
||||||
FilterParserThread *filterParser;
|
QPointer<FilterParserThread> filterParser;
|
||||||
QString filterPath;
|
QString filterPath;
|
||||||
int folderScanInterval; // in seconds
|
int folderScanInterval; // in seconds
|
||||||
bool queueingEnabled;
|
bool queueingEnabled;
|
||||||
@@ -79,6 +83,7 @@ class bittorrent : public QObject{
|
|||||||
QStringList *uploadQueue;
|
QStringList *uploadQueue;
|
||||||
QStringList *queuedUploads;
|
QStringList *queuedUploads;
|
||||||
bool calculateETA;
|
bool calculateETA;
|
||||||
|
QStringList url_skippingDlg;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString getSavePath(QString hash);
|
QString getSavePath(QString hash);
|
||||||
@@ -95,7 +100,6 @@ class bittorrent : public QObject{
|
|||||||
float getPayloadUploadRate() const;
|
float getPayloadUploadRate() const;
|
||||||
session_status getSessionStatus() const;
|
session_status getSessionStatus() const;
|
||||||
int getListenPort() const;
|
int getListenPort() const;
|
||||||
QStringList getTorrentsToPauseAfterChecking() const;
|
|
||||||
qlonglong getETA(QString hash) const;
|
qlonglong getETA(QString hash) const;
|
||||||
float getRealRatio(QString hash) const;
|
float getRealRatio(QString hash) const;
|
||||||
session* getSession() const;
|
session* getSession() const;
|
||||||
@@ -114,6 +118,9 @@ class bittorrent : public QObject{
|
|||||||
bool isDownloadQueued(QString hash) const;
|
bool isDownloadQueued(QString hash) const;
|
||||||
bool isUploadQueued(QString hash) const;
|
bool isUploadQueued(QString hash) const;
|
||||||
int loadTorrentPriority(QString hash);
|
int loadTorrentPriority(QString hash);
|
||||||
|
QStringList getConsoleMessages() const;
|
||||||
|
QStringList getPeerBanMessages() const;
|
||||||
|
float getUncheckedTorrentProgress(QString hash) const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
|
void addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
|
||||||
@@ -148,6 +155,7 @@ class bittorrent : public QObject{
|
|||||||
void increaseUpTorrentPriority(QString hash);
|
void increaseUpTorrentPriority(QString hash);
|
||||||
void decreaseUpTorrentPriority(QString hash);
|
void decreaseUpTorrentPriority(QString hash);
|
||||||
void saveTorrentPriority(QString hash, int prio);
|
void saveTorrentPriority(QString hash, int prio);
|
||||||
|
void downloadUrlAndSkipDialog(QString);
|
||||||
// Session configuration - Setters
|
// Session configuration - Setters
|
||||||
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
|
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
|
||||||
void setMaxConnections(int maxConnec);
|
void setMaxConnections(int maxConnec);
|
||||||
@@ -177,6 +185,9 @@ class bittorrent : public QObject{
|
|||||||
void setMaxActiveDownloads(int val);
|
void setMaxActiveDownloads(int val);
|
||||||
void setMaxActiveTorrents(int val);
|
void setMaxActiveTorrents(int val);
|
||||||
void setETACalculation(bool enable);
|
void setETACalculation(bool enable);
|
||||||
|
void addConsoleMessage(QString msg, QColor color=QApplication::palette().color(QPalette::WindowText));
|
||||||
|
void addPeerBanMessage(QString msg, bool from_ipfilter);
|
||||||
|
void fixTorrentPriorities();
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void scanDirectory();
|
void scanDirectory();
|
||||||
@@ -187,33 +198,35 @@ class bittorrent : public QObject{
|
|||||||
void deleteBigRatios();
|
void deleteBigRatios();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void invalidTorrent(QString path);
|
//void invalidTorrent(QString path);
|
||||||
void duplicateTorrent(QString path);
|
//void duplicateTorrent(QString path);
|
||||||
void addedTorrent(QString path, QTorrentHandle& h, bool fastResume);
|
void addedTorrent(QTorrentHandle& h);
|
||||||
void deletedTorrent(QString hash);
|
void deletedTorrent(QString hash);
|
||||||
void pausedTorrent(QString hash);
|
void pausedTorrent(QString hash);
|
||||||
void resumedTorrent(QString hash);
|
void resumedTorrent(QString hash);
|
||||||
void finishedTorrent(QTorrentHandle& h);
|
void finishedTorrent(QTorrentHandle& h);
|
||||||
void fullDiskError(QTorrentHandle& h);
|
void fullDiskError(QTorrentHandle& h);
|
||||||
void trackerError(QString hash, QString time, QString msg);
|
void trackerError(QString hash, QString time, QString msg);
|
||||||
void portListeningFailure();
|
//void portListeningFailure();
|
||||||
void trackerAuthenticationRequired(QTorrentHandle& h);
|
void trackerAuthenticationRequired(QTorrentHandle& h);
|
||||||
void scanDirFoundTorrents(const QStringList& pathList);
|
void scanDirFoundTorrents(const QStringList& pathList);
|
||||||
void newDownloadedTorrent(QString path, QString url);
|
void newDownloadedTorrent(QString path, QString url);
|
||||||
void aboutToDownloadFromUrl(QString url);
|
//void aboutToDownloadFromUrl(QString url);
|
||||||
void updateFileSize(QString hash);
|
void updateFileSize(QString hash);
|
||||||
void peerBlocked(QString);
|
//void peerBlocked(QString);
|
||||||
void downloadFromUrlFailure(QString url, QString reason);
|
void downloadFromUrlFailure(QString url, QString reason);
|
||||||
void fastResumeDataRejected(QString name);
|
//void fastResumeDataRejected(QString name);
|
||||||
void urlSeedProblem(QString url, QString msg);
|
//void urlSeedProblem(QString url, QString msg);
|
||||||
void torrentFinishedChecking(QString hash);
|
void torrentFinishedChecking(QString hash);
|
||||||
void torrent_ratio_deleted(QString fileName);
|
//void torrent_ratio_deleted(QString fileName);
|
||||||
void UPnPError(QString msg);
|
//void UPnPError(QString msg);
|
||||||
void UPnPSuccess(QString msg);
|
//void UPnPSuccess(QString msg);
|
||||||
void updateFinishedTorrentNumber();
|
void updateFinishedTorrentNumber();
|
||||||
void updateUnfinishedTorrentNumber();
|
void updateUnfinishedTorrentNumber();
|
||||||
void forceUnfinishedListUpdate();
|
void forceUnfinishedListUpdate();
|
||||||
void forceFinishedListUpdate();
|
void forceFinishedListUpdate();
|
||||||
|
/*void torrentSwitchedtoFinished(QString hash);
|
||||||
|
void torrentSwitchedtoUnfinished(QString hash);*/
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
58
src/console.ui
Normal file
58
src/console.ui
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<ui version="4.0" >
|
||||||
|
<class>ConsoleDlg</class>
|
||||||
|
<widget class="QDialog" name="ConsoleDlg" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>512</width>
|
||||||
|
<height>497</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>qBittorrent console</string>
|
||||||
|
</property>
|
||||||
|
<property name="windowIcon" >
|
||||||
|
<iconset resource="icons.qrc" >:/Icons/log.png</iconset>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QTabWidget" name="tabConsole" >
|
||||||
|
<property name="currentIndex" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="tab" >
|
||||||
|
<attribute name="title" >
|
||||||
|
<string>General</string>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="icon" >
|
||||||
|
<iconset resource="icons.qrc" >:/Icons/log.png</iconset>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QTextBrowser" name="textConsole" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tab_2" >
|
||||||
|
<attribute name="title" >
|
||||||
|
<string>Blocked IPs</string>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="icon" >
|
||||||
|
<iconset resource="icons.qrc" >:/Icons/filter.png</iconset>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QTextBrowser" name="textBannedPeers" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="icons.qrc" />
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
50
src/console_imp.h
Normal file
50
src/console_imp.h
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* Copyright (C) 2006 Christophe Dumez
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONSOLE_H
|
||||||
|
#define CONSOLE_H
|
||||||
|
|
||||||
|
#include "bittorrent.h"
|
||||||
|
#include "ui_console.h"
|
||||||
|
|
||||||
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
class consoleDlg : public QDialog, private Ui_ConsoleDlg{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
bittorrent *BTSession;
|
||||||
|
|
||||||
|
public:
|
||||||
|
consoleDlg(QWidget *parent, bittorrent* _BTSession) : QDialog(parent) {
|
||||||
|
setupUi(this);
|
||||||
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
BTSession = _BTSession;
|
||||||
|
textConsole->setHtml(BTSession->getConsoleMessages().join("<br>"));
|
||||||
|
textBannedPeers->setHtml(BTSession->getPeerBanMessages().join("<br>"));
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
|
||||||
|
~consoleDlg() {}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@@ -45,7 +45,7 @@ createtorrent::createtorrent(QWidget *parent): QDialog(parent){
|
|||||||
setupUi(this);
|
setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
creatorThread = new torrentCreatorThread();
|
creatorThread = new torrentCreatorThread();
|
||||||
connect(creatorThread, SIGNAL(creationSuccess(QString)), this, SLOT(handleCreationSucess(QString)));
|
connect(creatorThread, SIGNAL(creationSuccess(QString, const char*, QString)), this, SLOT(handleCreationSuccess(QString, const char*, QString)));
|
||||||
connect(creatorThread, SIGNAL(creationFailure(QString)), this, SLOT(handleCreationFailure(QString)));
|
connect(creatorThread, SIGNAL(creationFailure(QString)), this, SLOT(handleCreationFailure(QString)));
|
||||||
connect(creatorThread, SIGNAL(updateProgress(int)), this, SLOT(updateProgressBar(int)));
|
connect(creatorThread, SIGNAL(updateProgress(int)), this, SLOT(updateProgressBar(int)));
|
||||||
show();
|
show();
|
||||||
@@ -129,12 +129,23 @@ void createtorrent::on_addURLSeed_button_clicked(){
|
|||||||
// Subfunction to add files to a torrent_info structure
|
// Subfunction to add files to a torrent_info structure
|
||||||
// Written by Arvid Norberg (libtorrent Author)
|
// Written by Arvid Norberg (libtorrent Author)
|
||||||
void add_files(torrent_info& t, path const& p, path const& l){
|
void add_files(torrent_info& t, path const& p, path const& l){
|
||||||
qDebug("p: %s, l: %s, l.leaf(): %s", p.string().c_str(), l.string().c_str(), l.leaf().c_str());
|
using boost::filesystem::path;
|
||||||
|
using boost::filesystem::directory_iterator;
|
||||||
|
#if BOOST_VERSION < 103600
|
||||||
|
std::string const& leaf = l.leaf();
|
||||||
|
#else
|
||||||
|
std::string const& leaf = l.filename();
|
||||||
|
#endif
|
||||||
|
if (leaf == ".." || leaf == ".") return;
|
||||||
path f(p / l);
|
path f(p / l);
|
||||||
if (is_directory(f)){
|
if (is_directory(f)) {
|
||||||
for (directory_iterator i(f), end; i != end; ++i)
|
for (directory_iterator i(f), end; i != end; ++i)
|
||||||
|
#if BOOST_VERSION < 103600
|
||||||
add_files(t, p, l / i->leaf());
|
add_files(t, p, l / i->leaf());
|
||||||
}else{
|
#else
|
||||||
|
add_files(t, p, l / i->filename());
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
qDebug("Adding %s", l.string().c_str());
|
qDebug("Adding %s", l.string().c_str());
|
||||||
t.add_file(l, file_size(f));
|
t.add_file(l, file_size(f));
|
||||||
}
|
}
|
||||||
@@ -221,7 +232,11 @@ void torrentCreatorThread::run() {
|
|||||||
ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary);
|
ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary);
|
||||||
// Adding files to the torrent
|
// Adding files to the torrent
|
||||||
path full_path = complete(path(input_path.toUtf8().data()));
|
path full_path = complete(path(input_path.toUtf8().data()));
|
||||||
|
#if BOOST_VERSION < 103600
|
||||||
add_files(*t, full_path.branch_path(), full_path.leaf());
|
add_files(*t, full_path.branch_path(), full_path.leaf());
|
||||||
|
#else
|
||||||
|
add_files(*t, full_path.branch_path(), full_path.filename());
|
||||||
|
#endif
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
// Set piece size
|
// Set piece size
|
||||||
t->set_piece_size(piece_size);
|
t->set_piece_size(piece_size);
|
||||||
|
@@ -35,28 +35,31 @@ class subDeleteThread : public QThread {
|
|||||||
private:
|
private:
|
||||||
QString save_path;
|
QString save_path;
|
||||||
arborescence *arb;
|
arborescence *arb;
|
||||||
bool abort;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
subDeleteThread(QObject *parent, QString saveDir, arborescence *arb) : QThread(parent), save_path(saveDir), arb(arb), abort(false){}
|
subDeleteThread(QObject *parent, QString saveDir, arborescence *_arb) : QThread(parent), save_path(saveDir) {
|
||||||
|
arb = _arb;
|
||||||
|
}
|
||||||
|
|
||||||
~subDeleteThread(){
|
~subDeleteThread(){
|
||||||
abort = true;
|
|
||||||
wait();
|
wait();
|
||||||
|
qDebug("subDeleteThread successfuly deleted");
|
||||||
}
|
}
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
// For subthreads
|
// For subthreads
|
||||||
void deletionSuccessST(subDeleteThread* st);
|
void deletionSuccessST(subDeleteThread* st);
|
||||||
void deletionFailureST(subDeleteThread* st);
|
//void deletionFailureST(subDeleteThread* st);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void run(){
|
void run(){
|
||||||
if(arb->removeFromFS(save_path))
|
/*if(arb->removeFromFS(save_path))
|
||||||
emit deletionSuccessST(this);
|
emit deletionSuccessST(this);
|
||||||
else
|
else
|
||||||
emit deletionFailureST(this);
|
emit deletionFailureST(this);*/
|
||||||
|
arb->removeFromFS(save_path);
|
||||||
delete arb;
|
delete arb;
|
||||||
|
emit deletionSuccessST(this);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -99,13 +102,13 @@ class deleteThread : public QThread {
|
|||||||
if(abort)
|
if(abort)
|
||||||
return;
|
return;
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
if(torrents_list.size() != 0){
|
if(!torrents_list.empty()){
|
||||||
QPair<QString, arborescence *> torrent = torrents_list.takeFirst();
|
QPair<QString, arborescence *> torrent = torrents_list.takeFirst();
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
subDeleteThread *st = new subDeleteThread(0, torrent.first, torrent.second);
|
subDeleteThread *st = new subDeleteThread(0, torrent.first, torrent.second);
|
||||||
subThreads << st;
|
subThreads << st;
|
||||||
connect(st, SIGNAL(deletionSuccessST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*)));
|
connect(st, SIGNAL(deletionSuccessST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*)));
|
||||||
connect(st, SIGNAL(deletionFailureST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*)));
|
//connect(st, SIGNAL(deletionFailureST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*)));
|
||||||
st->start();
|
st->start();
|
||||||
}else{
|
}else{
|
||||||
condition.wait(&mutex);
|
condition.wait(&mutex);
|
||||||
|
@@ -57,95 +57,6 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="QTabWidget" name="tabBottom" >
|
|
||||||
<property name="maximumSize" >
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>142</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="tabPosition" >
|
|
||||||
<enum>QTabWidget::West</enum>
|
|
||||||
</property>
|
|
||||||
<property name="currentIndex" >
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="log_tab" >
|
|
||||||
<attribute name="title" >
|
|
||||||
<string>Log</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" >
|
|
||||||
<property name="spacing" >
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QTextBrowser" name="infoBar" >
|
|
||||||
<property name="sizePolicy" >
|
|
||||||
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize" >
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>120</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="contextMenuPolicy" >
|
|
||||||
<enum>Qt::CustomContextMenu</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="filter_tab" >
|
|
||||||
<attribute name="title" >
|
|
||||||
<string>IP filter</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" >
|
|
||||||
<property name="spacing" >
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QTextBrowser" name="textBlockedUsers" >
|
|
||||||
<property name="maximumSize" >
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>123</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
<action name="actionStart" >
|
<action name="actionStart" >
|
||||||
<property name="text" >
|
<property name="text" >
|
||||||
@@ -162,11 +73,6 @@
|
|||||||
<string>Delete</string>
|
<string>Delete</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionClearLog" >
|
|
||||||
<property name="text" >
|
|
||||||
<string>Clear</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionPreview_file" >
|
<action name="actionPreview_file" >
|
||||||
<property name="text" >
|
<property name="text" >
|
||||||
<string>Preview file</string>
|
<string>Preview file</string>
|
||||||
|
@@ -91,11 +91,11 @@ void subDownloadThread::run(){
|
|||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
|
||||||
// PROXY SUPPORT
|
// PROXY SUPPORT
|
||||||
QSettings settings("qBittorrent", "qBittorrent");
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
int intValue = settings.value(QString::fromUtf8("Preferences/Connection/ProxyType"), 0).toInt();
|
int intValue = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxyType"), 0).toInt();
|
||||||
if(intValue > 0) {
|
if(intValue > 0) {
|
||||||
// Proxy enabled
|
// Proxy enabled
|
||||||
QString IP = settings.value(QString::fromUtf8("Preferences/Connection/Proxy/IP"), "0.0.0.0").toString();
|
QString IP = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/IP"), "0.0.0.0").toString();
|
||||||
QString port = settings.value(QString::fromUtf8("Preferences/Connection/Proxy/Port"), 8080).toString();
|
QString port = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Port"), 8080).toString();
|
||||||
qDebug("Using proxy: %s", (IP+QString(":")+port).toUtf8().data());
|
qDebug("Using proxy: %s", (IP+QString(":")+port).toUtf8().data());
|
||||||
curl_easy_setopt(curl, CURLOPT_PROXYPORT, (IP+QString(":")+port).toUtf8().data());
|
curl_easy_setopt(curl, CURLOPT_PROXYPORT, (IP+QString(":")+port).toUtf8().data());
|
||||||
// Default proxy type is HTTP, we must change if it is SOCKS5
|
// Default proxy type is HTTP, we must change if it is SOCKS5
|
||||||
@@ -106,8 +106,8 @@ void subDownloadThread::run(){
|
|||||||
// Authentication?
|
// Authentication?
|
||||||
if(intValue > 2) {
|
if(intValue > 2) {
|
||||||
qDebug("Proxy requires authentication, authenticating");
|
qDebug("Proxy requires authentication, authenticating");
|
||||||
QString username = settings.value(QString::fromUtf8("Preferences/Connection/Proxy/Username"), QString()).toString();
|
QString username = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Username"), QString()).toString();
|
||||||
QString password = settings.value(QString::fromUtf8("Preferences/Connection/Proxy/Password"), QString()).toString();
|
QString password = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Password"), QString()).toString();
|
||||||
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, (username+QString(":")+password).toUtf8().data());
|
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, (username+QString(":")+password).toUtf8().data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -38,9 +38,7 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
|
|||||||
bittorrent *BTSession;
|
bittorrent *BTSession;
|
||||||
DLListDelegate *DLDelegate;
|
DLListDelegate *DLDelegate;
|
||||||
QStandardItemModel *DLListModel;
|
QStandardItemModel *DLListModel;
|
||||||
bool delayedSorting;
|
|
||||||
unsigned int nbTorrents;
|
unsigned int nbTorrents;
|
||||||
Qt::SortOrder delayedSortingOrder;
|
|
||||||
void hideOrShowColumn(int index);
|
void hideOrShowColumn(int index);
|
||||||
bool loadHiddenColumns();
|
bool loadHiddenColumns();
|
||||||
void saveHiddenColumns();
|
void saveHiddenColumns();
|
||||||
@@ -63,27 +61,19 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
|
|||||||
void torrentFinished(QString hash);
|
void torrentFinished(QString hash);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void addLogPeerBlocked(QString);
|
|
||||||
void addFastResumeRejectedAlert(QString);
|
|
||||||
void addUrlSeedError(QString url, QString msg);
|
|
||||||
void on_actionSet_download_limit_triggered();
|
void on_actionSet_download_limit_triggered();
|
||||||
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
||||||
void on_actionSet_upload_limit_triggered();
|
void on_actionSet_upload_limit_triggered();
|
||||||
void displayDLListMenu(const QPoint& pos);
|
void displayDLListMenu(const QPoint& pos);
|
||||||
void displayDLHoSMenu(const QPoint&);
|
void displayDLHoSMenu(const QPoint&);
|
||||||
void on_actionClearLog_triggered();
|
|
||||||
void displayInfoBarMenu(const QPoint& pos);
|
|
||||||
void addTorrent(QString hash);
|
void addTorrent(QString hash);
|
||||||
void sortDownloadList(int index, Qt::SortOrder startSortOrder=Qt::AscendingOrder, bool fromLoadColWidth=false);
|
void sortDownloadList(int index=-1, Qt::SortOrder startSortOrder=Qt::AscendingOrder);
|
||||||
|
void toggleDownloadListSortOrder(int index);
|
||||||
void sortDownloadListFloat(int index, Qt::SortOrder sortOrder);
|
void sortDownloadListFloat(int index, Qt::SortOrder sortOrder);
|
||||||
void sortDownloadListString(int index, Qt::SortOrder sortOrder);
|
void sortDownloadListString(int index, Qt::SortOrder sortOrder);
|
||||||
void saveColWidthDLList() const;
|
void saveColWidthDLList() const;
|
||||||
void torrentAdded(QString path, QTorrentHandle& h, bool fastResume);
|
void torrentAdded(QTorrentHandle& h);
|
||||||
void torrentDuplicate(QString path);
|
|
||||||
void torrentCorrupted(QString path);
|
|
||||||
void portListeningFailure();
|
|
||||||
void setRowColor(int row, QColor color);
|
void setRowColor(int row, QColor color);
|
||||||
void displayDownloadingUrlInfos(QString url);
|
|
||||||
void showProperties(const QModelIndex &index);
|
void showProperties(const QModelIndex &index);
|
||||||
void hideOrShowColumnName();
|
void hideOrShowColumnName();
|
||||||
void hideOrShowColumnSize();
|
void hideOrShowColumnSize();
|
||||||
@@ -94,21 +84,18 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
|
|||||||
void hideOrShowColumnRatio();
|
void hideOrShowColumnRatio();
|
||||||
void hideOrShowColumnEta();
|
void hideOrShowColumnEta();
|
||||||
void hideOrShowColumnPriority();
|
void hideOrShowColumnPriority();
|
||||||
void displayUPnPError(QString msg);
|
|
||||||
void displayUPnPSuccess(QString msg);
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void updateDlList();
|
void updateDlList();
|
||||||
void setInfoBar(QString info, QColor color=QApplication::palette().color(QPalette::WindowText));
|
|
||||||
void pauseTorrent(QString hash);
|
void pauseTorrent(QString hash);
|
||||||
void resumeTorrent(QString hash);
|
void resumeTorrent(QString hash);
|
||||||
void deleteTorrent(QString hash);
|
void deleteTorrent(QString hash);
|
||||||
void setBottomTabEnabled(unsigned int index, bool b);
|
|
||||||
void propertiesSelection();
|
void propertiesSelection();
|
||||||
void sortProgressColumnDelayed();
|
|
||||||
void updateFileSizeAndProgress(QString hash);
|
void updateFileSizeAndProgress(QString hash);
|
||||||
void showPropertiesFromHash(QString hash);
|
void showPropertiesFromHash(QString hash);
|
||||||
void hidePriorityColumn(bool hide);
|
void hidePriorityColumn(bool hide);
|
||||||
|
void sortProgressColumn(QString hash);
|
||||||
|
void loadLastSortedColumn();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2007 by Ishan Arora
|
* Copyright (C) 2007 by Ishan Arora & Christophe Dumez
|
||||||
* ishanarora@gmail.com
|
* <ishan@qbittorrent.org>, <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,163 +27,118 @@
|
|||||||
EventManager::EventManager(QObject *parent, bittorrent *BTSession)
|
EventManager::EventManager(QObject *parent, bittorrent *BTSession)
|
||||||
: QObject(parent), BTSession(BTSession)
|
: QObject(parent), BTSession(BTSession)
|
||||||
{
|
{
|
||||||
revision = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventManager::update(QVariantMap event)
|
QVariant EventManager::getEventList() const {
|
||||||
{
|
|
||||||
revision++;
|
|
||||||
events << QPair<ulong, QVariantMap>(revision, event);
|
|
||||||
emit updated();
|
|
||||||
qDebug("Added the following event");
|
|
||||||
qDebug() << event;
|
|
||||||
/* QLinkedList<QPair<ulong, QVariantMap> >::iterator i;
|
|
||||||
for (i = events.begin(); i != events.end(); i++)
|
|
||||||
qDebug() << *i;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant EventManager::querySince(ulong r) const
|
|
||||||
{
|
|
||||||
QVariantList list;
|
QVariantList list;
|
||||||
QLinkedListIterator<QPair<ulong, QVariantMap> > i(events);
|
foreach(QVariantMap event, event_list.values()) {
|
||||||
i.toBack();
|
list << QVariant(event);
|
||||||
while (i.hasPrevious())
|
|
||||||
{
|
|
||||||
QPair<ulong, QVariantMap> pair = i.previous();
|
|
||||||
if (pair.first <= r)
|
|
||||||
break;
|
|
||||||
list.prepend(QVariant(pair.second));
|
|
||||||
}
|
}
|
||||||
QVariantMap map;
|
return QVariant(list);
|
||||||
map["events"] = QVariant(list);
|
|
||||||
map["revision"] = QVariant((qulonglong) revision);
|
|
||||||
return QVariant(map);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EventManager::isUpdated(ulong r) const
|
void EventManager::addedTorrent(QTorrentHandle& h)
|
||||||
{
|
|
||||||
return (r < revision);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EventManager::addedTorrent(QString, QTorrentHandle& h)
|
|
||||||
{
|
{
|
||||||
QVariantMap event;
|
QVariantMap event;
|
||||||
event["type"] = QVariant("add");
|
QString hash = h.hash();
|
||||||
event["hash"] = QVariant(h.hash());
|
event["hash"] = QVariant(hash);
|
||||||
event["name"] = QVariant(h.name());
|
event["name"] = QVariant(h.name());
|
||||||
update(event);
|
event["seed"] = QVariant(h.is_seed());
|
||||||
|
event["size"] = QVariant((qlonglong)h.actual_size());
|
||||||
|
if(!h.is_seed()) {
|
||||||
|
event["progress"] = QVariant(h.progress());
|
||||||
|
event["dlspeed"] = QVariant(h.download_payload_rate());
|
||||||
|
}
|
||||||
|
event["upspeed"] = QVariant(h.upload_payload_rate());
|
||||||
|
if(h.is_paused()) {
|
||||||
|
if(BTSession->isQueueingEnabled() && (BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash)))
|
||||||
|
event["state"] = QVariant("queued");
|
||||||
|
else
|
||||||
|
event["state"] = QVariant("paused");
|
||||||
|
} else {
|
||||||
|
switch(h.state())
|
||||||
|
{
|
||||||
|
case torrent_status::finished:
|
||||||
|
case torrent_status::seeding:
|
||||||
|
event["state"] = QVariant("seeding");
|
||||||
|
break;
|
||||||
|
case torrent_status::checking_files:
|
||||||
|
case torrent_status::queued_for_checking:
|
||||||
|
event["state"] = QVariant("checking");
|
||||||
|
break;
|
||||||
|
case torrent_status::connecting_to_tracker:
|
||||||
|
if(h.download_payload_rate() > 0)
|
||||||
|
event["state"] = QVariant("downloading");
|
||||||
|
else
|
||||||
|
event["state"] = QVariant("connecting");
|
||||||
|
break;
|
||||||
|
case torrent_status::downloading:
|
||||||
|
case torrent_status::downloading_metadata:
|
||||||
|
if(h.download_payload_rate() > 0)
|
||||||
|
event["state"] = QVariant("downloading");
|
||||||
|
else
|
||||||
|
event["state"] = QVariant("stalled");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qDebug("No status, should not happen!!! status is %d", h.state());
|
||||||
|
event["state"] = QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event_list[hash] = event;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventManager::deletedTorrent(QString hash)
|
void EventManager::deletedTorrent(QString hash)
|
||||||
{
|
{
|
||||||
QVariantMap event;
|
event_list.remove(hash);
|
||||||
event["type"] = QVariant("delete");
|
|
||||||
event["hash"] = QVariant(hash);
|
|
||||||
QLinkedList<QPair<ulong, QVariantMap> >::iterator i = events.end();
|
|
||||||
bool loop = true;
|
|
||||||
while (loop && i != events.begin()) {
|
|
||||||
--i;
|
|
||||||
QVariantMap oldevent = i->second;
|
|
||||||
if(oldevent["hash"] == QVariant(hash))
|
|
||||||
{
|
|
||||||
if(oldevent["type"] == QVariant("add"))
|
|
||||||
loop = false;
|
|
||||||
i = events.erase(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
update(event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventManager::modifiedTorrent(QTorrentHandle h)
|
void EventManager::modifiedTorrent(QTorrentHandle h)
|
||||||
{
|
{
|
||||||
QString hash = h.hash();
|
QString hash = h.hash();
|
||||||
QVariantMap event;
|
QVariantMap event;
|
||||||
QVariant v;
|
|
||||||
|
|
||||||
if(h.is_paused()) {
|
if(h.is_paused()) {
|
||||||
if(BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash))
|
if(BTSession->isQueueingEnabled() && (BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash)))
|
||||||
v = QVariant("queued");
|
event["state"] = QVariant("queued");
|
||||||
else
|
else
|
||||||
v = QVariant("paused");
|
event["state"] = QVariant("paused");
|
||||||
} else {
|
} else {
|
||||||
switch(h.state())
|
switch(h.state())
|
||||||
{
|
{
|
||||||
case torrent_status::finished:
|
case torrent_status::finished:
|
||||||
case torrent_status::seeding:
|
case torrent_status::seeding:
|
||||||
v = QVariant("seeding");
|
event["state"] = QVariant("seeding");
|
||||||
break;
|
break;
|
||||||
case torrent_status::checking_files:
|
case torrent_status::checking_files:
|
||||||
case torrent_status::queued_for_checking:
|
case torrent_status::queued_for_checking:
|
||||||
v = QVariant("checking");
|
event["state"] = QVariant("checking");
|
||||||
break;
|
break;
|
||||||
case torrent_status::connecting_to_tracker:
|
case torrent_status::connecting_to_tracker:
|
||||||
if(h.download_payload_rate() > 0)
|
if(h.download_payload_rate() > 0)
|
||||||
v = QVariant("downloading");
|
event["state"] = QVariant("downloading");
|
||||||
else
|
else
|
||||||
v = QVariant("connecting");
|
event["state"] = QVariant("connecting");
|
||||||
break;
|
break;
|
||||||
case torrent_status::downloading:
|
case torrent_status::downloading:
|
||||||
case torrent_status::downloading_metadata:
|
case torrent_status::downloading_metadata:
|
||||||
if(h.download_payload_rate() > 0)
|
if(h.download_payload_rate() > 0)
|
||||||
v = QVariant("downloading");
|
event["state"] = QVariant("downloading");
|
||||||
else
|
else
|
||||||
v = QVariant("stalled");
|
event["state"] = QVariant("stalled");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
v = QVariant();
|
qDebug("No status, should not happen!!! status is %d", h.state());
|
||||||
|
event["state"] = QVariant();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(modify(hash, "state", v))
|
event["name"] = QVariant(h.name());
|
||||||
event["state"] = v;
|
event["size"] = QVariant((qlonglong)h.actual_size());
|
||||||
|
if(!h.is_seed()) {
|
||||||
v = QVariant((qlonglong)h.actual_size());
|
event["progress"] = QVariant(h.progress());
|
||||||
if(modify(hash, "size", v))
|
event["dlspeed"] = QVariant(h.download_payload_rate());
|
||||||
event["size"] = v;
|
|
||||||
|
|
||||||
v = QVariant(h.progress());
|
|
||||||
if(modify(hash, "progress", v))
|
|
||||||
event["progress"] = v;
|
|
||||||
|
|
||||||
v = QVariant(h.download_payload_rate());
|
|
||||||
if(modify(hash, "dlspeed", v))
|
|
||||||
event["dlspeed"] = v;
|
|
||||||
|
|
||||||
v = QVariant(h.upload_payload_rate());
|
|
||||||
if(modify(hash, "upspeed", v))
|
|
||||||
event["upspeed"] = v;
|
|
||||||
|
|
||||||
if(event.size() > 0)
|
|
||||||
{
|
|
||||||
event["type"] = QVariant("modify");
|
|
||||||
event["hash"] = QVariant(hash);
|
|
||||||
update(event);
|
|
||||||
}
|
}
|
||||||
}
|
event["upspeed"] = QVariant(h.upload_payload_rate());
|
||||||
|
event["seed"] = QVariant(h.is_seed());
|
||||||
bool EventManager::modify(QString hash, QString key, QVariant value)
|
event["hash"] = QVariant(hash);
|
||||||
{
|
event_list[hash] = event;
|
||||||
QLinkedList<QPair<ulong, QVariantMap> >::iterator i = events.end();
|
|
||||||
while (i != events.begin()) {
|
|
||||||
--i;
|
|
||||||
QVariantMap event = i->second;
|
|
||||||
if(event["hash"] == QVariant(hash))
|
|
||||||
{
|
|
||||||
if(event["type"] == QVariant("add"))
|
|
||||||
return true;
|
|
||||||
if(event.contains(key))
|
|
||||||
{
|
|
||||||
if(event[key] == value)
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(event.size() <= 3)
|
|
||||||
i = events.erase(i);
|
|
||||||
else
|
|
||||||
i->second.remove(key);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2007 by Ishan Arora
|
* Copyright (C) 2007 by Ishan Arora & Christophe Dumez
|
||||||
* ishanarora@gmail.com
|
* <ishan@qbittorrent.org>, <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -23,8 +23,7 @@
|
|||||||
#define EVENTMANAGER_H
|
#define EVENTMANAGER_H
|
||||||
|
|
||||||
#include "qtorrenthandle.h"
|
#include "qtorrenthandle.h"
|
||||||
#include <QLinkedList>
|
#include <QHash>
|
||||||
#include <QPair>
|
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
|
||||||
struct bittorrent;
|
struct bittorrent;
|
||||||
@@ -33,9 +32,7 @@ class EventManager : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
ulong revision;
|
QHash<QString, QVariantMap> event_list;
|
||||||
QLinkedList<QPair <ulong, QVariantMap> > events;
|
|
||||||
bool modify(QString hash, QString key, QVariant value);
|
|
||||||
bittorrent* BTSession;
|
bittorrent* BTSession;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -43,14 +40,10 @@ class EventManager : public QObject
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
EventManager(QObject *parent, bittorrent* BTSession);
|
EventManager(QObject *parent, bittorrent* BTSession);
|
||||||
QVariant querySince(ulong r) const;
|
QVariant getEventList() const;
|
||||||
bool isUpdated(ulong r) const;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void updated();
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void addedTorrent(QString path, QTorrentHandle& h);
|
void addedTorrent(QTorrentHandle& h);
|
||||||
void deletedTorrent(QString hash);
|
void deletedTorrent(QString hash);
|
||||||
void modifiedTorrent(QTorrentHandle h);
|
void modifiedTorrent(QTorrentHandle h);
|
||||||
};
|
};
|
||||||
|
@@ -42,14 +42,24 @@ HttpConnection::HttpConnection(QTcpSocket *socket, HttpServer *parent)
|
|||||||
|
|
||||||
HttpConnection::~HttpConnection()
|
HttpConnection::~HttpConnection()
|
||||||
{
|
{
|
||||||
|
delete socket;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpConnection::processDownloadedFile(QString url, QString file_path) {
|
||||||
|
qDebug("URL %s successfully downloaded !", (const char*)url.toUtf8());
|
||||||
|
emit torrentReadyToBeDownloaded(file_path, false, url, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpConnection::handleDownloadFailure(QString url, QString reason) {
|
||||||
|
std::cerr << "Could not download " << (const char*)url.toUtf8() << ", reason: " << (const char*)reason.toUtf8() << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpConnection::read()
|
void HttpConnection::read()
|
||||||
{
|
{
|
||||||
QByteArray input = socket->readAll();
|
QByteArray input = socket->readAll();
|
||||||
qDebug(" -------");
|
/*qDebug(" -------");
|
||||||
qDebug("|REQUEST|");
|
qDebug("|REQUEST|");
|
||||||
qDebug(" -------");
|
qDebug(" -------"); */
|
||||||
//qDebug("%s", input.toAscii().constData());
|
//qDebug("%s", input.toAscii().constData());
|
||||||
if(input.size() > 100000) {
|
if(input.size() > 100000) {
|
||||||
qDebug("Request too big");
|
qDebug("Request too big");
|
||||||
@@ -81,7 +91,7 @@ void HttpConnection::write()
|
|||||||
|
|
||||||
void HttpConnection::respond()
|
void HttpConnection::respond()
|
||||||
{
|
{
|
||||||
qDebug("Respond called");
|
//qDebug("Respond called");
|
||||||
QStringList auth = parser.value("Authorization").split(" ", QString::SkipEmptyParts);
|
QStringList auth = parser.value("Authorization").split(" ", QString::SkipEmptyParts);
|
||||||
if (auth.size() != 2 || QString::compare(auth[0], "Basic", Qt::CaseInsensitive) != 0 || !parent->isAuthorized(auth[1].toUtf8()))
|
if (auth.size() != 2 || QString::compare(auth[0], "Basic", Qt::CaseInsensitive) != 0 || !parent->isAuthorized(auth[1].toUtf8()))
|
||||||
{
|
{
|
||||||
@@ -105,12 +115,7 @@ void HttpConnection::respond()
|
|||||||
{
|
{
|
||||||
if (list[1] == "events")
|
if (list[1] == "events")
|
||||||
{
|
{
|
||||||
EventManager* manager = parent->eventManager();
|
respondJson();
|
||||||
uint r = parser.get("r").toUInt();
|
|
||||||
if(manager->isUpdated(r))
|
|
||||||
respondJson();
|
|
||||||
else
|
|
||||||
connect(manager, SIGNAL(updated()), this, SLOT(respondJson()));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -156,9 +161,7 @@ void HttpConnection::respondNotFound()
|
|||||||
void HttpConnection::respondJson()
|
void HttpConnection::respondJson()
|
||||||
{
|
{
|
||||||
EventManager* manager = parent->eventManager();
|
EventManager* manager = parent->eventManager();
|
||||||
QString temp = parser.get("r");
|
QVariant data = manager->getEventList();
|
||||||
uint r = parser.get("r").toUInt();
|
|
||||||
QVariant data = manager->querySince(r);
|
|
||||||
QString string = toJson(data);
|
QString string = toJson(data);
|
||||||
generator.setStatusLine(200, "OK");
|
generator.setStatusLine(200, "OK");
|
||||||
generator.setContentTypeByExt("js");
|
generator.setContentTypeByExt("js");
|
||||||
@@ -172,16 +175,13 @@ void HttpConnection::respondCommand(QString command)
|
|||||||
{
|
{
|
||||||
QString urls = parser.post("urls");
|
QString urls = parser.post("urls");
|
||||||
QStringList list = urls.split('\n');
|
QStringList list = urls.split('\n');
|
||||||
QStringList url_list_cleaned;
|
|
||||||
foreach(QString url, list){
|
foreach(QString url, list){
|
||||||
url = url.trimmed();
|
url = url.trimmed();
|
||||||
if(!url.isEmpty()){
|
if(!url.isEmpty()){
|
||||||
if(url_list_cleaned.indexOf(QRegExp(url, Qt::CaseInsensitive, QRegExp::FixedString)) < 0){
|
qDebug("Downloading url: %s", (const char*)url.toUtf8());
|
||||||
url_list_cleaned << url;
|
emit UrlReadyToBeDownloaded(url);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
emit urlsReadyToBeDownloaded(url_list_cleaned);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(command == "upload")
|
if(command == "upload")
|
||||||
|
@@ -27,7 +27,6 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
class QTcpSocket;
|
class QTcpSocket;
|
||||||
|
|
||||||
class HttpServer;
|
class HttpServer;
|
||||||
|
|
||||||
class HttpConnection : public QObject
|
class HttpConnection : public QObject
|
||||||
@@ -47,6 +46,8 @@ class HttpConnection : public QObject
|
|||||||
void respondJson();
|
void respondJson();
|
||||||
void respondCommand(QString command);
|
void respondCommand(QString command);
|
||||||
void respondNotFound();
|
void respondNotFound();
|
||||||
|
void processDownloadedFile(QString, QString);
|
||||||
|
void handleDownloadFailure(QString, QString);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HttpConnection(QTcpSocket *socket, HttpServer *parent);
|
HttpConnection(QTcpSocket *socket, HttpServer *parent);
|
||||||
@@ -56,7 +57,7 @@ class HttpConnection : public QObject
|
|||||||
void read();
|
void read();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void urlsReadyToBeDownloaded(const QStringList&);
|
void UrlReadyToBeDownloaded(QString url);
|
||||||
void torrentReadyToBeDownloaded(QString, bool, QString, bool);
|
void torrentReadyToBeDownloaded(QString, bool, QString, bool);
|
||||||
void deleteTorrent(QString hash);
|
void deleteTorrent(QString hash);
|
||||||
void resumeTorrent(QString hash);
|
void resumeTorrent(QString hash);
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "httpresponsegenerator.h"
|
#include "httpresponsegenerator.h"
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
void HttpResponseGenerator::setMessage(const QByteArray message)
|
void HttpResponseGenerator::setMessage(const QByteArray message)
|
||||||
{
|
{
|
||||||
|
@@ -32,25 +32,28 @@ HttpServer::HttpServer(bittorrent *BTSession, int msec, QObject* parent) : QTcpS
|
|||||||
HttpServer::BTSession = BTSession;
|
HttpServer::BTSession = BTSession;
|
||||||
manager = new EventManager(this, BTSession);
|
manager = new EventManager(this, BTSession);
|
||||||
//add torrents
|
//add torrents
|
||||||
QStringList list = BTSession->getUnfinishedTorrents() + BTSession->getFinishedTorrents();
|
QStringList list = BTSession->getUnfinishedTorrents();
|
||||||
QString hash;
|
foreach(QString hash, list) {
|
||||||
foreach(hash, list)
|
|
||||||
{
|
|
||||||
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
if(h.is_valid())
|
if(h.is_valid()) manager->addedTorrent(h);
|
||||||
manager->addedTorrent(QString(), h);
|
|
||||||
}
|
}
|
||||||
|
list = BTSession->getFinishedTorrents();
|
||||||
|
foreach(QString hash, list) {
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
|
if(h.is_valid()) manager->addedTorrent(h);
|
||||||
|
}
|
||||||
//connect BTSession to manager
|
//connect BTSession to manager
|
||||||
connect(BTSession, SIGNAL(addedTorrent(QString, QTorrentHandle&, bool)), manager, SLOT(addedTorrent(QString, QTorrentHandle&)));
|
connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), manager, SLOT(addedTorrent(QTorrentHandle&)));
|
||||||
connect(BTSession, SIGNAL(deletedTorrent(QString)), manager, SLOT(deletedTorrent(QString)));
|
connect(BTSession, SIGNAL(deletedTorrent(QString)), manager, SLOT(deletedTorrent(QString)));
|
||||||
//set timer
|
//set timer
|
||||||
QTimer *timer = new QTimer(this);
|
timer = new QTimer(this);
|
||||||
connect(timer, SIGNAL(timeout()), this, SLOT(onTimer()));
|
connect(timer, SIGNAL(timeout()), this, SLOT(onTimer()));
|
||||||
timer->start(msec);
|
timer->start(msec);
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpServer::~HttpServer()
|
HttpServer::~HttpServer()
|
||||||
{
|
{
|
||||||
|
delete timer;
|
||||||
delete manager;
|
delete manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +64,7 @@ void HttpServer::newHttpConnection()
|
|||||||
{
|
{
|
||||||
HttpConnection *connection = new HttpConnection(socket, this);
|
HttpConnection *connection = new HttpConnection(socket, this);
|
||||||
//connect connection to BTSession
|
//connect connection to BTSession
|
||||||
connect(connection, SIGNAL(urlsReadyToBeDownloaded(const QStringList&)), BTSession, SLOT(downloadFromURLList(const QStringList&)));
|
connect(connection, SIGNAL(UrlReadyToBeDownloaded(QString)), BTSession, SLOT(downloadUrlAndSkipDialog(QString)));
|
||||||
connect(connection, SIGNAL(torrentReadyToBeDownloaded(QString, bool, QString, bool)), BTSession, SLOT(addTorrent(QString, bool, QString, bool)));
|
connect(connection, SIGNAL(torrentReadyToBeDownloaded(QString, bool, QString, bool)), BTSession, SLOT(addTorrent(QString, bool, QString, bool)));
|
||||||
connect(connection, SIGNAL(deleteTorrent(QString)), BTSession, SLOT(deleteTorrent(QString)));
|
connect(connection, SIGNAL(deleteTorrent(QString)), BTSession, SLOT(deleteTorrent(QString)));
|
||||||
connect(connection, SIGNAL(pauseTorrent(QString)), BTSession, SLOT(pauseTorrent(QString)));
|
connect(connection, SIGNAL(pauseTorrent(QString)), BTSession, SLOT(pauseTorrent(QString)));
|
||||||
@@ -73,13 +76,18 @@ void HttpServer::newHttpConnection()
|
|||||||
|
|
||||||
void HttpServer::onTimer()
|
void HttpServer::onTimer()
|
||||||
{
|
{
|
||||||
QStringList list = BTSession->getUnfinishedTorrents() + BTSession->getFinishedTorrents();
|
qDebug("EventManager Timer Start");
|
||||||
foreach(QString hash, list)
|
QStringList list = BTSession->getUnfinishedTorrents();
|
||||||
{
|
foreach(QString hash, list) {
|
||||||
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
if(h.is_valid())
|
if(h.is_valid()) manager->modifiedTorrent(h);
|
||||||
manager->modifiedTorrent(h);
|
|
||||||
}
|
}
|
||||||
|
list = BTSession->getFinishedTorrents();
|
||||||
|
foreach(QString hash, list) {
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
|
if(h.is_valid()) manager->modifiedTorrent(h);
|
||||||
|
}
|
||||||
|
qDebug("EventManager Timer Stop");
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpServer::setAuthorization(QString username, QString password)
|
void HttpServer::setAuthorization(QString username, QString password)
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
|
||||||
class bittorrent;
|
class bittorrent;
|
||||||
|
class QTimer;
|
||||||
class EventManager;
|
class EventManager;
|
||||||
|
|
||||||
class HttpServer : public QTcpServer
|
class HttpServer : public QTcpServer
|
||||||
@@ -37,6 +37,7 @@ class HttpServer : public QTcpServer
|
|||||||
QByteArray base64;
|
QByteArray base64;
|
||||||
bittorrent *BTSession;
|
bittorrent *BTSession;
|
||||||
EventManager *manager;
|
EventManager *manager;
|
||||||
|
QTimer *timer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HttpServer(bittorrent *BTSession, int msec, QObject* parent = 0);
|
HttpServer(bittorrent *BTSession, int msec, QObject* parent = 0);
|
||||||
|
@@ -102,6 +102,7 @@
|
|||||||
<file>Icons/skin/seeding.png</file>
|
<file>Icons/skin/seeding.png</file>
|
||||||
<file>Icons/skin/settings.png</file>
|
<file>Icons/skin/settings.png</file>
|
||||||
<file>Icons/skin/stalled.png</file>
|
<file>Icons/skin/stalled.png</file>
|
||||||
|
<file>Icons/skin/tabs.gif</file>
|
||||||
<file>Icons/skin/url.png</file>
|
<file>Icons/skin/url.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user