1
mirror of https://github.com/qbittorrent/qBittorrent synced 2025-10-23 22:32:16 +02:00

Compare commits

..

36 Commits

Author SHA1 Message Date
Christophe Dumez
a175812555 - Tagged v1.1.4 and v1.2.0beta6 releases 2008-09-14 10:30:27 +00:00
Christophe Dumez
a189e4403d - Fixed a string 2008-09-07 12:18:52 +00:00
Christophe Dumez
563291a2e8 - Updated language files 2008-09-07 12:12:16 +00:00
Christophe Dumez
9156c9ac8f - Logs are now in a separate dialog 2008-09-07 12:09:41 +00:00
Christophe Dumez
f0049f1dae - Removed logging panel for now. It will be replaced by a seperate dialog in order to simplify the default UI. 2008-09-07 11:31:29 +00:00
Christophe Dumez
a622152747 - Make use of h.is_seed() instead of h.progress() == 1. 2008-09-03 18:19:17 +00:00
Christophe Dumez
8440e9982f - Display top toolBar as a default 2008-09-03 17:52:40 +00:00
Christophe Dumez
602d73fa82 fix typo in german translation 2008-09-02 19:03:31 +00:00
Christophe Dumez
c32ebb8d9f - Another fix for boost v1.36 2008-08-31 12:35:25 +00:00
Christophe Dumez
deeead4008 - Compilation fix for boost v1.36
- Fixed 'start seeding after torrent creation' feature
2008-08-31 12:21:41 +00:00
Christophe Dumez
937a491409 Updated copyright info 2008-08-27 00:59:58 +00:00
Christophe Dumez
79d5ae18a6 - beta5 release 2008-08-26 07:22:03 +00:00
Christophe Dumez
5cce0c53bf - Fixed a comment
- Added chinese traditional translation to stable branch
- bump to v1.1.3 in stable branch (updated splash screen)
- Updated changelogs
2008-08-26 07:14:38 +00:00
Christophe Dumez
681b8c14ad - Fixed ratio saving for seeding torrents 2008-08-26 06:39:57 +00:00
Christophe Dumez
443567486e - Updated traditional chinese translator's mail 2008-08-25 11:24:02 +00:00
Christophe Dumez
c10ebc3086 - Added traditional Chinese locale 2008-08-25 10:54:14 +00:00
Christophe Dumez
42a2acefd3 - Fixed possible multiple rss tabs bug 2008-08-20 12:15:50 +00:00
Christophe Dumez
c781545609 - max compilation fix 2008-08-19 13:46:13 +00:00
Christophe Dumez
ba06affec7 - Fixed priority column sorting 2008-08-19 12:17:05 +00:00
Christophe Dumez
6140d69fcb - bump to beta4 2008-08-19 00:29:30 +00:00
Christophe Dumez
71a81fd1b7 - Queueing system fixes 2008-08-19 00:28:44 +00:00
Christophe Dumez
4e05b62bbe - Priority column fixes 2008-08-19 00:10:56 +00:00
Christophe Dumez
9d366c8c7d - Updated czech translation 2008-08-18 23:46:50 +00:00
Christophe Dumez
940744b0bf - Added czech flag 2008-08-18 10:52:51 +00:00
Christophe Dumez
6c2518a704 - forgot to commit those files 2008-08-18 10:47:43 +00:00
Christophe Dumez
ef51fabf63 - Added czech translation 2008-08-18 10:38:40 +00:00
Christophe Dumez
1aedd97d4d - Progress calculation patch 2008-08-17 03:47:52 +00:00
Christophe Dumez
ff26ea94f5 - Queued torrents are now identified in Web UI
- Improved transfer list update for queued torrents
- Allow to show/hide top toolbar
- top toolbar is now hidden as a default
- Connection status is now displayed in status bar (bottom)
- Removed "Disconnected" connection status (bad detection)
- Added increase/decrease priority actions to Edit menu
- Added keyboard shortcuts for increase/decrease priority actions
2008-08-08 13:17:26 +00:00
Christophe Dumez
c7a289d183 - Updated french translation 2008-08-02 19:58:19 +00:00
Christophe Dumez
2a70c8f4d8 - Bump to beta2 2008-08-02 19:51:24 +00:00
Christophe Dumez
e27b08d970 - Update queue when pausing a torrent 2008-08-02 19:49:37 +00:00
Christophe Dumez
48ec57604f - A queueing system ASSERT hit fix 2008-08-02 19:46:02 +00:00
Christophe Dumez
db1bbea26a - Updated Russian translation 2008-08-02 18:20:14 +00:00
Christophe Dumez
7bbb2f542b - Slightly improved minimize to systray code (but still experiencing the virtual desktop switching bug) 2008-08-01 20:03:16 +00:00
Christophe Dumez
5563e24781 - Updated resource files 2008-08-01 17:15:03 +00:00
Christophe Dumez
f131f6210f - Updated Changelog 2008-08-01 15:17:22 +00:00
107 changed files with 19087 additions and 9474 deletions

View File

@@ -47,6 +47,8 @@ Translations authors:
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
- Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
- Chinese (Simplified): Guo Yue (guoyue0418@hotmail.com)
- Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
- Czech: Jirka Vilim (web@tets.cz)
- Danish: Mathias Nielsen (comoneo@gmail.com)
- Dutch: Joost Schipper (heavyjoost@users.sourceforge.net)
- English: Christophe Dumez (chris@qbittorrent.org)

View File

@@ -1,11 +1,36 @@
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.2.0
- 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: RSS can now be disabled from program preferences
- BUGFIX: Disable ETA calculation when ETA column is hidden
- COSMETIC: Transfer speed, ratio and DHT nodes are displayed in status bar
- BUGFIX: Removed "disconnected" connection state, detection was far from perfect
- COSMETIC: Transfer speed, ratio, connection status and DHT nodes are displayed in status bar
- COSMETIC: RSS Tab is now hidden as a default
- COSMETIC: Allow to hide or display top toolbar
- 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
- BUGFIX: Fixed ratio saving for seeding torrents
- I18N: Added czech and traditional chinese translations
* Sun Aug 17 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.2
- BUGFIX: Fixed progress calculation
- BUGFIX: Fixed finished torrent detection
* Fri Aug 01 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.1
- BUGFIX: Fixed bad resource file for icons
* Fri Aug 01 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.0
- FEATURE: Web interface to control qbittorrent (Ishan Arora)

46
TODO
View File

@@ -1,46 +1,4 @@
// Easy
- Translations into as many languages as possible
- Use Launchpad/Rosetta for translations once it supports TS files
// Intermediate
- Port on MacOS, Windows (and create an installer for Windows) - Slow progress
- Add some transparency (menus,...), improve look / usabilty
- Skins support? (contact Mateusz)
// Harder
- Torrent scheduler ala µtorrent/Bitcomet
// Waiting for libtorrent
- Allow to prioritize torrents (may code this in qBittorrent?)
// Unsure
- Display the peers we are connected to for each torrent with infos (like flag, dl/up speeds, ...)
- Azureus spoofing to prevent ban from trackers?
- Option to shutdown computer when downloads are finished
- NAT checker/Tester
- Display hard drive space left?
- Make use of dbus on Linux for the single instance instead of socket communication?
(http://techbase.kde.org/Development/Tutorials/D-Bus/Accessing_Interfaces)
- When favicon can't be downloaded, try to parse the webpage for:
<link rel="icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon">
* Be careful, the link can be relative
- Improve search plugin install (choose in a list taken from plugins.qbittorrent.org)
- support zipped torrents? (useful?)
- Allow to limit the number of downloading torrents simultaneously (other are paused until a download finishes)
See https://blueprints.launchpad.net/qbittorrent/
// in v1.2.0
- Allow user to organize the downloads into categories/folders?
// in v1.1.0
- Stop calculating ETAs when ETA column is hidden
-> See https://blueprints.launchpad.net/qbittorrent
Translations updated:
- French
- Chinese
- Polish
- Portuguese
- Brazilian
- Slovak
- Swedish
- Romanian
- Split download and uploads in Web UI (Ishan Ahora)

View File

@@ -37,7 +37,7 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
setupUi(this);
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.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->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
@@ -58,14 +58,14 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
// Make download list header clickable for sorting
finishedList->header()->setClickable(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);
finishedList->setItemDelegate(finishedListDelegate);
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu);
connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&)));
connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&)));
connect(BTSession, SIGNAL(forceFinishedListUpdate()), this, SLOT(updateFinishedList()));
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")));
actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png")));
@@ -74,6 +74,8 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered()));
connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered()));
connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered()));
connect(actionIncreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionIncreasePriority_triggered()));
connect(actionDecreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDecreasePriority_triggered()));
connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered()));
connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered()));
connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder()));
@@ -103,6 +105,10 @@ void FinishedTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) {
void FinishedTorrents::hidePriorityColumn(bool hide) {
finishedList->setColumnHidden(F_PRIORITY, hide);
if(hide)
getActionHoSCol(F_PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png")));
else
getActionHoSCol(F_PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png")));
}
void FinishedTorrents::addTorrent(QString hash){
@@ -133,9 +139,10 @@ void FinishedTorrents::addTorrent(QString hash){
// Update the number of finished torrents
++nbFinished;
emit finishedTorrentsNumberChanged(nbFinished);
sortFinishedList();
}
void FinishedTorrents::torrentAdded(QString, QTorrentHandle& h, bool) {
void FinishedTorrents::torrentAdded(QTorrentHandle& h) {
QString hash = h.hash();
if(BTSession->isFinished(hash)) {
addTorrent(hash);
@@ -184,10 +191,27 @@ bool FinishedTorrents::loadColWidthFinishedList(){
for(unsigned int i=0; i<listSize; ++i){
finishedList->header()->resizeSection(i, width_list.at(i).toInt());
}
loadLastSortedColumn();
qDebug("Finished list columns width loaded");
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
// (finished list)
void FinishedTorrents::saveColWidthFinishedList() const{
@@ -256,16 +280,13 @@ void FinishedTorrents::updateFinishedList(){
}
}
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.is_seed())) {
// 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);
if (reponse == QMessageBox::Yes) {
qDebug("Info: a torrent was moved from finished to download tab");
deleteTorrent(hash);
BTSession->setFinishedTorrent(hash);
BTSession->setUnfinishedTorrent(hash);
emit torrentMovedFromFinishedList(hash);
}
else if (reponse == QMessageBox::No) {
@@ -407,6 +428,11 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionOpen_destination_folder);
myFinishedListMenu.addAction(actionTorrent_Properties);
if(BTSession->isQueueingEnabled()) {
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionIncreasePriority);
myFinishedListMenu.addAction(actionDecreasePriority);
}
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionBuy_it);
@@ -430,7 +456,7 @@ void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){
} else {
lastCol = F_RATIO;
}
for(int i=0; i<=F_RATIO; i++) {
for(int i=0; i<=lastCol; i++) {
hideshowColumn.addAction(getActionHoSCol(i));
}
// Call menu
@@ -566,17 +592,37 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
* Sorting functions
*/
void FinishedTorrents::sortFinishedList(int index){
static Qt::SortOrder sortOrder = Qt::AscendingOrder;
void FinishedTorrents::toggleFinishedListSortOrder(int index) {
Qt::SortOrder sortOrder = Qt::AscendingOrder;
if(finishedList->header()->sortIndicatorSection() == index){
if(sortOrder == Qt::AscendingOrder){
sortOrder = Qt::DescendingOrder;
}else{
sortOrder = Qt::AscendingOrder;
}
sortOrder = (Qt::SortOrder)!(bool)finishedList->header()->sortIndicatorOrder();
}
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_UPSPEED:
sortFinishedListFloat(index, sortOrder);

View File

@@ -60,11 +60,13 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
void displayFinishedHoSMenu(const QPoint&);
void setRowColor(int row, QString color);
void saveColWidthFinishedList() const;
void sortFinishedList(int index);
void loadLastSortedColumn();
void toggleFinishedListSortOrder(int index);
void sortFinishedList(int index=-1, Qt::SortOrder sortOrder=Qt::AscendingOrder);
void sortFinishedListFloat(int index, Qt::SortOrder sortOrder);
void sortFinishedListString(int index, Qt::SortOrder sortOrder);
void updateFileSize(QString hash);
void torrentAdded(QString path, QTorrentHandle& h, bool fastResume);
void torrentAdded(QTorrentHandle& h);
void on_actionSet_upload_limit_triggered();
void notifyTorrentDoubleClicked(const QModelIndex& index);
void hideOrShowColumnName();

File diff suppressed because it is too large Load Diff

View File

@@ -24,7 +24,7 @@
#include <QProcess>
#include <QSystemTrayIcon>
#include <QPointer>
#include "ui_MainWindow.h"
#include "qtorrenthandle.h"
@@ -66,7 +66,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
QTabWidget *tabs;
options_imp *options;
QSystemTrayIcon *myTrayIcon;
QTimer *systrayCreator;
QPointer<QTimer> systrayCreator;
QMenu *myTrayIconMenu;
DownloadingTorrents *downloadingTorrentTab;
FinishedTorrents *finishedTorrentTab;
@@ -83,6 +83,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
QFrame *statusSep1;
QFrame *statusSep2;
QFrame *statusSep3;
QFrame *statusSep4;
// Keyboard shortcuts
QShortcut *switchSearchShortcut;
QShortcut *switchSearchShortcut2;
@@ -90,12 +91,13 @@ class GUI : public QMainWindow, private Ui::MainWindow{
QShortcut *switchUpShortcut;
QShortcut *switchRSSShortcut;
QAction *prioSeparator;
QAction *prioSeparator2;
// Search
SearchEngine *searchEngine;
// RSS
RSSImp *rssWidget;
// Web UI
HttpServer *httpServer;
QPointer<HttpServer> httpServer;
// Misc
#ifdef QT_4_4
QLocalServer *localServer;
@@ -114,6 +116,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
void on_actionCreate_torrent_triggered();
void on_actionWebsite_triggered() const;
void on_actionBugReport_triggered() const;
void on_actionShow_console_triggered();
void readParamsOnSocket();
void acceptConnection();
void togglePausedState(QString hash);
@@ -159,9 +162,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
void processDownloadedFiles(QString path, QString url);
void downloadFromURLList(const QStringList& urls);
void deleteTorrent(QString hash);
void deleteRatioTorrent(QString fileName);
void finishedTorrent(QTorrentHandle& h) const;
void torrentChecked(QString hash) const;
void updateLists();
bool initWebUi(QString username, QString password, int port);
void pauseTorrent(QString hash);
@@ -169,7 +170,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
void on_actionDecreasePriority_triggered();
// Options slots
void on_actionOptions_triggered();
void OptionsSaved(QString info, bool deleteOptions);
void OptionsSaved(bool deleteOptions);
// HTTP slots
void on_actionDownload_from_URL_triggered();
@@ -183,7 +184,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
protected:
void closeEvent(QCloseEvent *);
void hideEvent(QHideEvent *);
bool event(QEvent * event);
void displayRSSTab(bool enable);
public:

BIN
src/Icons/flags/czech.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

BIN
src/Icons/flags/taiwan.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -41,6 +41,8 @@
<addaction name="separator" />
<addaction name="actionDelete" />
<addaction name="actionDelete_Permanently" />
<addaction name="actionDecreasePriority" />
<addaction name="actionIncreasePriority" />
</widget>
<widget class="QMenu" name="menu_Help" >
<property name="title" >
@@ -56,6 +58,7 @@
<string>Options</string>
</property>
<addaction name="actionOptions" />
<addaction name="actionShow_console" />
</widget>
<widget class="QMenu" name="menu_File" >
<property name="title" >
@@ -253,6 +256,14 @@
<bool>false</bool>
</property>
</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>
<resources>
<include location="icons.qrc" />

View File

@@ -57,6 +57,8 @@ class about : public QDialog, private Ui::AboutDlg{
- <u>Bulgarian:</u> Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)<br>\
- <u>Catalan:</u> Gekko Dam Beer (gekko04@users.sourceforge.net)<br>\
- <u>Chinese (Simplified):</u> Guo Yue (yue.guo0418@gmail.com)<br>\
- <u>Chinese (Traditional):</u> Yi-Shun Wang (dnextstep@gmail.com)<br>\
- <u>Czech:</u> Jirka Vilim (web@tets.cz)<br>\
- <u>Danish:</u> Mathias Nielsen (comoneo@gmail.com)<br>\
- <u>Dutch:</u> Joost Schipper (heavyjoost@users.sourceforge.net) and Peter Koeleman (peter@peerweb.nl)<br>\
- <u>Finnish:</u> Niklas Laxström (nikerabbit@users.sourceforge.net)<br>\

File diff suppressed because it is too large Load Diff

View File

@@ -26,6 +26,9 @@
#include <QPair>
#include <QStringList>
#include <QDateTime>
#include <QApplication>
#include <QPalette>
#include <QPointer>
#include <libtorrent/session.hpp>
#include <libtorrent/ip_filter.hpp>
@@ -38,24 +41,25 @@ class deleteThread;
class QTimer;
class FilterParserThread;
class bittorrent : public QObject{
class bittorrent : public QObject {
Q_OBJECT
private:
session *s;
QString scan_dir;
QTimer *timerScan;
QPointer<QTimer> timerScan;
QTimer *timerAlerts;
QTimer *fastResumeSaver;
QTimer *BigRatioTimer;
QPointer<QTimer> BigRatioTimer;
bool DHTEnabled;
downloadThread *downloader;
QString defaultSavePath;
QStringList torrentsToPauseAfterChecking;
QHash<QString, QDateTime> TorrentsStartTime;
QHash<QString, size_type> TorrentsStartData;
QHash<QString, QPair<size_type,size_type> > ratioData;
QHash<QString, QHash<QString, QString> > trackersErrors;
QStringList consoleMessages;
QStringList peerBanMessages;
deleteThread *deleter;
QStringList finishedTorrents;
QStringList unfinishedTorrents;
@@ -67,7 +71,7 @@ class bittorrent : public QObject{
bool UPnPEnabled;
bool NATPMPEnabled;
bool LSDEnabled;
FilterParserThread *filterParser;
QPointer<FilterParserThread> filterParser;
QString filterPath;
int folderScanInterval; // in seconds
bool queueingEnabled;
@@ -79,6 +83,7 @@ class bittorrent : public QObject{
QStringList *uploadQueue;
QStringList *queuedUploads;
bool calculateETA;
QStringList url_skippingDlg;
protected:
QString getSavePath(QString hash);
@@ -95,7 +100,6 @@ class bittorrent : public QObject{
float getPayloadUploadRate() const;
session_status getSessionStatus() const;
int getListenPort() const;
QStringList getTorrentsToPauseAfterChecking() const;
qlonglong getETA(QString hash) const;
float getRealRatio(QString hash) const;
session* getSession() const;
@@ -114,6 +118,9 @@ class bittorrent : public QObject{
bool isDownloadQueued(QString hash) const;
bool isUploadQueued(QString hash) const;
int loadTorrentPriority(QString hash);
QStringList getConsoleMessages() const;
QStringList getPeerBanMessages() const;
float getUncheckedTorrentProgress(QString hash) const;
public slots:
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 decreaseUpTorrentPriority(QString hash);
void saveTorrentPriority(QString hash, int prio);
void downloadUrlAndSkipDialog(QString);
// Session configuration - Setters
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
void setMaxConnections(int maxConnec);
@@ -177,6 +185,8 @@ class bittorrent : public QObject{
void setMaxActiveDownloads(int val);
void setMaxActiveTorrents(int val);
void setETACalculation(bool enable);
void addConsoleMessage(QString msg, QColor color=QApplication::palette().color(QPalette::WindowText));
void addPeerBanMessage(QString msg, bool from_ipfilter);
protected slots:
void scanDirectory();
@@ -187,31 +197,33 @@ class bittorrent : public QObject{
void deleteBigRatios();
signals:
void invalidTorrent(QString path);
void duplicateTorrent(QString path);
void addedTorrent(QString path, QTorrentHandle& h, bool fastResume);
//void invalidTorrent(QString path);
//void duplicateTorrent(QString path);
void addedTorrent(QTorrentHandle& h);
void deletedTorrent(QString hash);
void pausedTorrent(QString hash);
void resumedTorrent(QString hash);
void finishedTorrent(QTorrentHandle& h);
void fullDiskError(QTorrentHandle& h);
void trackerError(QString hash, QString time, QString msg);
void portListeningFailure();
//void portListeningFailure();
void trackerAuthenticationRequired(QTorrentHandle& h);
void scanDirFoundTorrents(const QStringList& pathList);
void newDownloadedTorrent(QString path, QString url);
void aboutToDownloadFromUrl(QString url);
//void aboutToDownloadFromUrl(QString url);
void updateFileSize(QString hash);
void peerBlocked(QString);
//void peerBlocked(QString);
void downloadFromUrlFailure(QString url, QString reason);
void fastResumeDataRejected(QString name);
void urlSeedProblem(QString url, QString msg);
void torrentFinishedChecking(QString hash);
void torrent_ratio_deleted(QString fileName);
void UPnPError(QString msg);
void UPnPSuccess(QString msg);
//void fastResumeDataRejected(QString name);
//void urlSeedProblem(QString url, QString msg);
//void torrentFinishedChecking(QString hash);
//void torrent_ratio_deleted(QString fileName);
//void UPnPError(QString msg);
//void UPnPSuccess(QString msg);
void updateFinishedTorrentNumber();
void updateUnfinishedTorrentNumber();
void forceUnfinishedListUpdate();
void forceFinishedListUpdate();
};
#endif

58
src/console.ui Normal file
View 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
View 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

View File

@@ -45,7 +45,7 @@ createtorrent::createtorrent(QWidget *parent): QDialog(parent){
setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
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(updateProgress(int)), this, SLOT(updateProgressBar(int)));
show();
@@ -129,12 +129,23 @@ void createtorrent::on_addURLSeed_button_clicked(){
// Subfunction to add files to a torrent_info structure
// Written by Arvid Norberg (libtorrent Author)
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);
if (is_directory(f)){
if (is_directory(f)) {
for (directory_iterator i(f), end; i != end; ++i)
#if BOOST_VERSION < 103600
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());
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);
// Adding files to the torrent
path full_path = complete(path(input_path.toUtf8().data()));
#if BOOST_VERSION < 103600
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;
// Set piece size
t->set_piece_size(piece_size);

View File

@@ -35,27 +35,30 @@ class subDeleteThread : public QThread {
private:
QString save_path;
arborescence *arb;
bool abort;
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(){
abort = true;
wait();
qDebug("subDeleteThread successfuly deleted");
//wait();
}
signals:
// For subthreads
void deletionSuccessST(subDeleteThread* st);
void deletionFailureST(subDeleteThread* st);
//void deletionFailureST(subDeleteThread* st);
protected:
void run(){
if(arb->removeFromFS(save_path))
/*if(arb->removeFromFS(save_path))
emit deletionSuccessST(this);
else
emit deletionFailureST(this);
emit deletionFailureST(this);*/
arb->removeFromFS(save_path);
emit deletionSuccessST(this);
delete arb;
}
};
@@ -99,13 +102,13 @@ class deleteThread : public QThread {
if(abort)
return;
mutex.lock();
if(torrents_list.size() != 0){
if(!torrents_list.empty()){
QPair<QString, arborescence *> torrent = torrents_list.takeFirst();
mutex.unlock();
subDeleteThread *st = new subDeleteThread(0, torrent.first, torrent.second);
subThreads << st;
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();
}else{
condition.wait(&mutex);

View File

@@ -18,7 +18,16 @@
<property name="spacing" >
<number>6</number>
</property>
<property name="margin" >
<property name="leftMargin" >
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number>
</property>
<item>
@@ -48,93 +57,6 @@
</item>
</layout>
</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" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>765</width>
<height>138</height>
</rect>
</property>
<attribute name="title" >
<string>Log</string>
</attribute>
<layout class="QVBoxLayout" >
<property name="spacing" >
<number>6</number>
</property>
<property name="margin" >
<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" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>765</width>
<height>138</height>
</rect>
</property>
<attribute name="title" >
<string>IP filter</string>
</attribute>
<layout class="QVBoxLayout" >
<property name="spacing" >
<number>6</number>
</property>
<property name="margin" >
<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>
<action name="actionStart" >
<property name="text" >
@@ -151,11 +73,6 @@
<string>Delete</string>
</property>
</action>
<action name="actionClearLog" >
<property name="text" >
<string>Clear</string>
</property>
</action>
<action name="actionPreview_file" >
<property name="text" >
<string>Preview file</string>
@@ -183,8 +100,7 @@
</action>
<action name="actionOpen_destination_folder" >
<property name="icon" >
<iconset resource="icons.qrc" >
<normaloff>:/Icons/folder.png</normaloff>:/Icons/folder.png</iconset>
<iconset resource="icons.qrc" >:/Icons/folder.png</iconset>
</property>
<property name="text" >
<string>Open destination folder</string>
@@ -232,8 +148,7 @@
</action>
<action name="actionBuy_it" >
<property name="icon" >
<iconset resource="icons.qrc" >
<normaloff>:/Icons/money.png</normaloff>:/Icons/money.png</iconset>
<iconset resource="icons.qrc" >:/Icons/money.png</iconset>
</property>
<property name="text" >
<string>Buy it</string>
@@ -244,8 +159,22 @@
<string>Priority</string>
</property>
</action>
<zorder>tabBottom</zorder>
<zorder></zorder>
<action name="actionIncreasePriority" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/skin/increase.png</iconset>
</property>
<property name="text" >
<string>Increase priority</string>
</property>
</action>
<action name="actionDecreasePriority" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/skin/decrease.png</iconset>
</property>
<property name="text" >
<string>Decrease priority</string>
</property>
</action>
</widget>
<resources>
<include location="icons.qrc" />

File diff suppressed because it is too large Load Diff

View File

@@ -38,9 +38,7 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
bittorrent *BTSession;
DLListDelegate *DLDelegate;
QStandardItemModel *DLListModel;
bool delayedSorting;
unsigned int nbTorrents;
Qt::SortOrder delayedSortingOrder;
void hideOrShowColumn(int index);
bool loadHiddenColumns();
void saveHiddenColumns();
@@ -63,27 +61,19 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
void torrentFinished(QString hash);
protected slots:
void addLogPeerBlocked(QString);
void addFastResumeRejectedAlert(QString);
void addUrlSeedError(QString url, QString msg);
void on_actionSet_download_limit_triggered();
void notifyTorrentDoubleClicked(const QModelIndex& index);
void on_actionSet_upload_limit_triggered();
void displayDLListMenu(const QPoint& pos);
void displayDLHoSMenu(const QPoint&);
void on_actionClearLog_triggered();
void displayInfoBarMenu(const QPoint& pos);
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 sortDownloadListString(int index, Qt::SortOrder sortOrder);
void saveColWidthDLList() const;
void torrentAdded(QString path, QTorrentHandle& h, bool fastResume);
void torrentDuplicate(QString path);
void torrentCorrupted(QString path);
void portListeningFailure();
void torrentAdded(QTorrentHandle& h);
void setRowColor(int row, QColor color);
void displayDownloadingUrlInfos(QString url);
void showProperties(const QModelIndex &index);
void hideOrShowColumnName();
void hideOrShowColumnSize();
@@ -94,18 +84,14 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
void hideOrShowColumnRatio();
void hideOrShowColumnEta();
void hideOrShowColumnPriority();
void displayUPnPError(QString msg);
void displayUPnPSuccess(QString msg);
void loadLastSortedColumn();
public slots:
void updateDlList();
void setInfoBar(QString info, QColor color=QApplication::palette().color(QPalette::WindowText));
void pauseTorrent(QString hash);
void resumeTorrent(QString hash);
void deleteTorrent(QString hash);
void setBottomTabEnabled(unsigned int index, bool b);
void propertiesSelection();
void sortProgressColumnDelayed();
void updateFileSizeAndProgress(QString hash);
void showPropertiesFromHash(QString hash);
void hidePriorityColumn(bool hide);

View File

@@ -20,22 +20,23 @@
#include "eventmanager.h"
#include "bittorrent.h"
#include "json.h"
#include <QDebug>
EventManager::EventManager(QObject *parent)
: QObject(parent)
EventManager::EventManager(QObject *parent, bittorrent *BTSession)
: QObject(parent), BTSession(BTSession)
{
revision = 0;
}
void EventManager::update(QVariantMap event)
{
revision++;
++revision;
events << QPair<ulong, QVariantMap>(revision, event);
emit updated();
qDebug("Added the following event");
qDebug() << event;
//qDebug("Added the following event");
//qDebug() << event;
/* QLinkedList<QPair<ulong, QVariantMap> >::iterator i;
for (i = events.begin(); i != events.end(); i++)
qDebug() << *i;*/
@@ -64,7 +65,7 @@ bool EventManager::isUpdated(ulong r) const
return (r < revision);
}
void EventManager::addedTorrent(QString, QTorrentHandle& h)
void EventManager::addedTorrent(QTorrentHandle& h)
{
QVariantMap event;
event["type"] = QVariant("add");
@@ -99,10 +100,12 @@ void EventManager::modifiedTorrent(QTorrentHandle h)
QVariantMap event;
QVariant v;
if(h.is_paused())
v = QVariant("paused");
else
{
if(h.is_paused()) {
if(BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash))
v = QVariant("queued");
else
v = QVariant("paused");
} else {
switch(h.state())
{
case torrent_status::finished:

View File

@@ -27,6 +27,8 @@
#include <QPair>
#include <QVariant>
struct bittorrent;
class EventManager : public QObject
{
Q_OBJECT
@@ -34,12 +36,13 @@ class EventManager : public QObject
ulong revision;
QLinkedList<QPair <ulong, QVariantMap> > events;
bool modify(QString hash, QString key, QVariant value);
bittorrent* BTSession;
protected:
void update(QVariantMap event);
public:
EventManager(QObject *parent = 0);
EventManager(QObject *parent, bittorrent* BTSession);
QVariant querySince(ulong r) const;
bool isUpdated(ulong r) const;
@@ -47,7 +50,7 @@ class EventManager : public QObject
void updated();
public slots:
void addedTorrent(QString path, QTorrentHandle& h);
void addedTorrent(QTorrentHandle& h);
void deletedTorrent(QString hash);
void modifiedTorrent(QTorrentHandle h);
};

View File

@@ -42,14 +42,24 @@ HttpConnection::HttpConnection(QTcpSocket *socket, HttpServer *parent)
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()
{
QByteArray input = socket->readAll();
qDebug(" -------");
/*qDebug(" -------");
qDebug("|REQUEST|");
qDebug(" -------");
qDebug(" -------"); */
//qDebug("%s", input.toAscii().constData());
if(input.size() > 100000) {
qDebug("Request too big");
@@ -81,7 +91,7 @@ void HttpConnection::write()
void HttpConnection::respond()
{
qDebug("Respond called");
//qDebug("Respond called");
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()))
{
@@ -172,16 +182,13 @@ void HttpConnection::respondCommand(QString command)
{
QString urls = parser.post("urls");
QStringList list = urls.split('\n');
QStringList url_list_cleaned;
foreach(QString url, list){
url = url.trimmed();
if(!url.isEmpty()){
if(url_list_cleaned.indexOf(QRegExp(url, Qt::CaseInsensitive, QRegExp::FixedString)) < 0){
url_list_cleaned << url;
}
qDebug("Downloading url: %s", (const char*)url.toUtf8());
emit UrlReadyToBeDownloaded(url);
}
}
emit urlsReadyToBeDownloaded(url_list_cleaned);
return;
}
if(command == "upload")

View File

@@ -27,7 +27,6 @@
#include <QObject>
class QTcpSocket;
class HttpServer;
class HttpConnection : public QObject
@@ -47,6 +46,8 @@ class HttpConnection : public QObject
void respondJson();
void respondCommand(QString command);
void respondNotFound();
void processDownloadedFile(QString, QString);
void handleDownloadFailure(QString, QString);
public:
HttpConnection(QTcpSocket *socket, HttpServer *parent);
@@ -56,7 +57,7 @@ class HttpConnection : public QObject
void read();
signals:
void urlsReadyToBeDownloaded(const QStringList&);
void UrlReadyToBeDownloaded(QString url);
void torrentReadyToBeDownloaded(QString, bool, QString, bool);
void deleteTorrent(QString hash);
void resumeTorrent(QString hash);

View File

@@ -20,7 +20,6 @@
#include "httpresponsegenerator.h"
#include <QDebug>
void HttpResponseGenerator::setMessage(const QByteArray message)
{

View File

@@ -30,27 +30,30 @@ HttpServer::HttpServer(bittorrent *BTSession, int msec, QObject* parent) : QTcpS
base64 = QByteArray(":").toBase64();
connect(this, SIGNAL(newConnection()), this, SLOT(newHttpConnection()));
HttpServer::BTSession = BTSession;
manager = new EventManager(this);
manager = new EventManager(this, BTSession);
//add torrents
QStringList list = BTSession->getUnfinishedTorrents() + BTSession->getFinishedTorrents();
QString hash;
foreach(hash, list)
{
QStringList list = BTSession->getUnfinishedTorrents();
foreach(QString hash, list) {
QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid())
manager->addedTorrent(QString(), h);
if(h.is_valid()) manager->addedTorrent(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, 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)));
//set timer
QTimer *timer = new QTimer(this);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimer()));
timer->start(msec);
}
HttpServer::~HttpServer()
{
delete timer;
delete manager;
}
@@ -61,7 +64,7 @@ void HttpServer::newHttpConnection()
{
HttpConnection *connection = new HttpConnection(socket, this);
//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(deleteTorrent(QString)), BTSession, SLOT(deleteTorrent(QString)));
connect(connection, SIGNAL(pauseTorrent(QString)), BTSession, SLOT(pauseTorrent(QString)));
@@ -73,13 +76,16 @@ void HttpServer::newHttpConnection()
void HttpServer::onTimer()
{
QStringList list = BTSession->getUnfinishedTorrents() + BTSession->getFinishedTorrents();
foreach(QString hash, list)
{
QStringList list = BTSession->getUnfinishedTorrents();
foreach(QString hash, list) {
QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid())
manager->modifiedTorrent(h);
if(h.is_valid()) manager->modifiedTorrent(h);
}
list = BTSession->getFinishedTorrents();
foreach(QString hash, list) {
QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid()) manager->modifiedTorrent(h);
}
}
void HttpServer::setAuthorization(QString username, QString password)

View File

@@ -26,7 +26,7 @@
#include <QByteArray>
class bittorrent;
class QTimer;
class EventManager;
class HttpServer : public QTcpServer
@@ -37,6 +37,7 @@ class HttpServer : public QTcpServer
QByteArray base64;
bittorrent *BTSession;
EventManager *manager;
QTimer *timer;
public:
HttpServer(bittorrent *BTSession, int msec, QObject* parent = 0);

View File

@@ -1,106 +1,107 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>Icons/folder.png</file>
<file>Icons/qbittorrent32.png</file>
<file>Icons/file.png</file>
<file>Icons/qbittorrent22.png</file>
<file>Icons/mascot.png</file>
<file>Icons/downarrow.png</file>
<file>Icons/unavailable.png</file>
<file>Icons/proxy.png</file>
<file>Icons/description.png</file>
<file>Icons/log.png</file>
<file>Icons/uparrow.png</file>
<file>Icons/home.png</file>
<file>Icons/unsubscribe.png</file>
<file>Icons/url.png</file>
<file>Icons/unsubscribe16.png</file>
<file>Icons/qbittorrent16.png</file>
<file>Icons/locale.png</file>
<file>Icons/splash.png</file>
<file>Icons/subscribe16.png</file>
<file>Icons/loading.png</file>
<file>Icons/star.png</file>
<file>Icons/gnome-shutdown.png</file>
<file>Icons/style.png</file>
<file>Icons/rss16.png</file>
<file>Icons/add_file.png</file>
<file>Icons/add_folder.png</file>
<file>Icons/bt_settings.png</file>
<file>Icons/button_cancel.png</file>
<file>Icons/button_ok.png</file>
<file>Icons/configure.png</file>
<file>Icons/connection.png</file>
<file>Icons/systemtray.png</file>
<file>Icons/sphere.png</file>
<file>Icons/add_folder.png</file>
<file>Icons/button_cancel.png</file>
<file>Icons/encrypted.png</file>
<file>Icons/wizard.png</file>
<file>Icons/edit_clear.png</file>
<file>Icons/rss32.png</file>
<file>Icons/subscribe.png</file>
<file>Icons/bt_settings.png</file>
<file>Icons/password.png</file>
<file>Icons/newmsg.png</file>
<file>Icons/sphere2.png</file>
<file>Icons/button_ok.png</file>
<file>Icons/add_file.png</file>
<file>Icons/filter.png</file>
<file>Icons/money.png</file>
<file>Icons/description.png</file>
<file>Icons/downarrow.png</file>
<file>Icons/download.png</file>
<file>Icons/time.png</file>
<file>Icons/refresh.png</file>
<file>Icons/edit_clear.png</file>
<file>Icons/encrypted.png</file>
<file>Icons/file.png</file>
<file>Icons/filter.png</file>
<file>Icons/folder.png</file>
<file>Icons/gear.png</file>
<file>Icons/skin/new.png</file>
<file>Icons/skin/qb_question.png</file>
<file>Icons/skin/play.png</file>
<file>Icons/skin/connecting.png</file>
<file>Icons/skin/settings.png</file>
<file>Icons/skin/add.png</file>
<file>Icons/skin/open.png</file>
<file>Icons/skin/play_all.png</file>
<file>Icons/skin/info.png</file>
<file>Icons/skin/connected.png</file>
<file>Icons/skin/search.png</file>
<file>Icons/skin/url.png</file>
<file>Icons/skin/firewalled.png</file>
<file>Icons/skin/properties.png</file>
<file>Icons/skin/preview.png</file>
<file>Icons/skin/remove.png</file>
<file>Icons/skin/queued.png</file>
<file>Icons/skin/decrease.png</file>
<file>Icons/skin/delete_perm.png</file>
<file>Icons/skin/pause_all.png</file>
<file>Icons/skin/delete_all.png</file>
<file>Icons/skin/stalled.png</file>
<file>Icons/skin/downloading.png</file>
<file>Icons/skin/delete.png</file>
<file>Icons/skin/exit.png</file>
<file>Icons/skin/seeding.png</file>
<file>Icons/skin/paused.png</file>
<file>Icons/skin/increase.png</file>
<file>Icons/skin/disconnected.png</file>
<file>Icons/skin/pause.png</file>
<file>Icons/flags/turkey.png</file>
<file>Icons/flags/portugal.png</file>
<file>Icons/flags/finland.png</file>
<file>Icons/flags/ukraine.png</file>
<file>Icons/flags/bulgaria.png</file>
<file>Icons/flags/spain_catalunya.png</file>
<file>Icons/gnome-shutdown.png</file>
<file>Icons/home.png</file>
<file>Icons/loading.png</file>
<file>Icons/locale.png</file>
<file>Icons/log.png</file>
<file>Icons/mascot.png</file>
<file>Icons/money.png</file>
<file>Icons/newmsg.png</file>
<file>Icons/password.png</file>
<file>Icons/proxy.png</file>
<file>Icons/qbittorrent16.png</file>
<file>Icons/qbittorrent22.png</file>
<file>Icons/qbittorrent32.png</file>
<file>Icons/refresh.png</file>
<file>Icons/rss16.png</file>
<file>Icons/rss32.png</file>
<file>Icons/sphere.png</file>
<file>Icons/sphere2.png</file>
<file>Icons/splash.png</file>
<file>Icons/star.png</file>
<file>Icons/style.png</file>
<file>Icons/subscribe.png</file>
<file>Icons/subscribe16.png</file>
<file>Icons/systemtray.png</file>
<file>Icons/time.png</file>
<file>Icons/unavailable.png</file>
<file>Icons/unsubscribe.png</file>
<file>Icons/unsubscribe16.png</file>
<file>Icons/uparrow.png</file>
<file>Icons/url.png</file>
<file>Icons/wizard.png</file>
<file>Icons/flags/brazil.png</file>
<file>Icons/flags/norway.png</file>
<file>Icons/flags/slovakia.png</file>
<file>Icons/flags/romania.png</file>
<file>Icons/flags/united_kingdom.png</file>
<file>Icons/flags/netherlands.png</file>
<file>Icons/flags/bulgaria.png</file>
<file>Icons/flags/china.png</file>
<file>Icons/flags/czech.png</file>
<file>Icons/flags/denmark.png</file>
<file>Icons/flags/hungary.png</file>
<file>Icons/flags/greece.png</file>
<file>Icons/flags/spain.png</file>
<file>Icons/flags/italy.png</file>
<file>Icons/flags/germany.png</file>
<file>Icons/flags/russia.png</file>
<file>Icons/flags/japan.png</file>
<file>Icons/flags/south_korea.png</file>
<file>Icons/flags/finland.png</file>
<file>Icons/flags/france.png</file>
<file>Icons/flags/sweden.png</file>
<file>Icons/flags/germany.png</file>
<file>Icons/flags/greece.png</file>
<file>Icons/flags/hungary.png</file>
<file>Icons/flags/italy.png</file>
<file>Icons/flags/japan.png</file>
<file>Icons/flags/netherlands.png</file>
<file>Icons/flags/norway.png</file>
<file>Icons/flags/poland.png</file>
<file>Icons/flags/portugal.png</file>
<file>Icons/flags/romania.png</file>
<file>Icons/flags/russia.png</file>
<file>Icons/flags/slovakia.png</file>
<file>Icons/flags/south_korea.png</file>
<file>Icons/flags/spain.png</file>
<file>Icons/flags/spain_catalunya.png</file>
<file>Icons/flags/sweden.png</file>
<file>Icons/flags/taiwan.png</file>
<file>Icons/flags/turkey.png</file>
<file>Icons/flags/ukraine.png</file>
<file>Icons/flags/united_kingdom.png</file>
<file>Icons/skin/add.png</file>
<file>Icons/skin/connected.png</file>
<file>Icons/skin/connecting.png</file>
<file>Icons/skin/decrease.png</file>
<file>Icons/skin/delete.png</file>
<file>Icons/skin/delete_all.png</file>
<file>Icons/skin/delete_perm.png</file>
<file>Icons/skin/downloading.png</file>
<file>Icons/skin/exit.png</file>
<file>Icons/skin/firewalled.png</file>
<file>Icons/skin/increase.png</file>
<file>Icons/skin/info.png</file>
<file>Icons/skin/new.png</file>
<file>Icons/skin/open.png</file>
<file>Icons/skin/pause.png</file>
<file>Icons/skin/pause_all.png</file>
<file>Icons/skin/paused.png</file>
<file>Icons/skin/play.png</file>
<file>Icons/skin/play_all.png</file>
<file>Icons/skin/preview.png</file>
<file>Icons/skin/properties.png</file>
<file>Icons/skin/qb_question.png</file>
<file>Icons/skin/queued.png</file>
<file>Icons/skin/remove.png</file>
<file>Icons/skin/search.png</file>
<file>Icons/skin/seeding.png</file>
<file>Icons/skin/settings.png</file>
<file>Icons/skin/stalled.png</file>
<file>Icons/skin/url.png</file>
</qresource>
</RCC>

View File

@@ -1,29 +1,31 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>lang/qbittorrent_uk.qm</file>
<file>lang/qbittorrent_tr.qm</file>
<file>lang/qbittorrent_nl.qm</file>
<file>lang/qbittorrent_de.qm</file>
<file>lang/qbittorrent_ru.qm</file>
<file>lang/qbittorrent_fr.qm</file>
<file>lang/qbittorrent_bg.qm</file>
<file>lang/qbittorrent_ca.qm</file>
<file>lang/qbittorrent_cs.qm</file>
<file>lang/qbittorrent_da.qm</file>
<file>lang/qbittorrent_de.qm</file>
<file>lang/qbittorrent_el.qm</file>
<file>lang/qbittorrent_en.qm</file>
<file>lang/qbittorrent_es.qm</file>
<file>lang/qbittorrent_fi.qm</file>
<file>lang/qbittorrent_pl.qm</file>
<file>lang/qbittorrent_fr.qm</file>
<file>lang/qbittorrent_hu.qm</file>
<file>lang/qbittorrent_it.qm</file>
<file>lang/qbittorrent_ja.qm</file>
<file>lang/qbittorrent_ko.qm</file>
<file>lang/qbittorrent_nb.qm</file>
<file>lang/qbittorrent_sv.qm</file>
<file>lang/qbittorrent_zh.qm</file>
<file>lang/qbittorrent_el.qm</file>
<file>lang/qbittorrent_sk.qm</file>
<file>lang/qbittorrent_ca.qm</file>
<file>lang/qbittorrent_hu.qm</file>
<file>lang/qbittorrent_bg.qm</file>
<file>lang/qbittorrent_it.qm</file>
<file>lang/qbittorrent_nl.qm</file>
<file>lang/qbittorrent_pl.qm</file>
<file>lang/qbittorrent_pt.qm</file>
<file>lang/qbittorrent_en.qm</file>
<file>lang/qbittorrent_pt_BR.qm</file>
<file>lang/qbittorrent_ja.qm</file>
<file>lang/qbittorrent_ro.qm</file>
<file>lang/qbittorrent_es.qm</file>
<file>lang/qbittorrent_ru.qm</file>
<file>lang/qbittorrent_sk.qm</file>
<file>lang/qbittorrent_sv.qm</file>
<file>lang/qbittorrent_tr.qm</file>
<file>lang/qbittorrent_uk.qm</file>
<file>lang/qbittorrent_zh.qm</file>
<file>lang/qbittorrent_zh_TW.qm</file>
</qresource>
</RCC>

Some files were not shown because too many files have changed in this diff Show More