Compare commits
121 Commits
release-2.
...
release-2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6b124c7b6 | ||
|
|
df42c4d59f | ||
|
|
8047495b2e | ||
|
|
de04b47c29 | ||
|
|
b709bec24d | ||
|
|
35f93e8e16 | ||
|
|
554a84f8b0 | ||
|
|
f26fcabde1 | ||
|
|
75b91c204d | ||
|
|
0837c25602 | ||
|
|
34f8937b8d | ||
|
|
4a7f3ee415 | ||
|
|
b218531ff7 | ||
|
|
e96dee2038 | ||
|
|
080105c088 | ||
|
|
5d2535c1c1 | ||
|
|
49b21059fa | ||
|
|
c1af948649 | ||
|
|
36ad3df9e7 | ||
|
|
e607d721a2 | ||
|
|
5bfbfeb665 | ||
|
|
1f1eabb1e9 | ||
|
|
762050f8fc | ||
|
|
e3c1270205 | ||
|
|
414685910b | ||
|
|
d61b9c5d4d | ||
|
|
cf86a1cecd | ||
|
|
a3f3287e24 | ||
|
|
6e18d780ba | ||
|
|
7dde763fc6 | ||
|
|
8c85ffca5f | ||
|
|
321e568d86 | ||
|
|
e0649a7e78 | ||
|
|
4cd3233cd0 | ||
|
|
c554528afe | ||
|
|
7ab7f4b0fc | ||
|
|
58c0ac7638 | ||
|
|
2514224a3a | ||
|
|
247f6b4a8e | ||
|
|
3d89864b75 | ||
|
|
7ac75ad772 | ||
|
|
caa628371f | ||
|
|
fd31f632d9 | ||
|
|
a25b6e087b | ||
|
|
1626d938d1 | ||
|
|
a4c7640499 | ||
|
|
2c1b93a12b | ||
|
|
8f19025c2a | ||
|
|
20d41bcff2 | ||
|
|
1ad77e00ff | ||
|
|
0b65c02666 | ||
|
|
294095367a | ||
|
|
05a6ffd554 | ||
|
|
e0a30dc40c | ||
|
|
1940bc4e73 | ||
|
|
a7e4e0273a | ||
|
|
29a9d57cdc | ||
|
|
9c7a4e4983 | ||
|
|
35ead5bcf2 | ||
|
|
645bd58d79 | ||
|
|
6c47a552ab | ||
|
|
f54bc8bea4 | ||
|
|
eb54d81c5e | ||
|
|
431d2f082c | ||
|
|
a0ff0cdc7e | ||
|
|
fb91558261 | ||
|
|
fc2a47ca31 | ||
|
|
dcccbaad59 | ||
|
|
99d040de3f | ||
|
|
ee30a75b57 | ||
|
|
8c001aa478 | ||
|
|
849bc11a01 | ||
|
|
5024e0b092 | ||
|
|
d93447489b | ||
|
|
33988e70ab | ||
|
|
d2b41d70c8 | ||
|
|
8e1e51d268 | ||
|
|
53500ea005 | ||
|
|
e048389dea | ||
|
|
fa7b1a205d | ||
|
|
7dd6b7e9bb | ||
|
|
78b96accda | ||
|
|
73d0e2568a | ||
|
|
92fc212a0e | ||
|
|
6f4d7b7c1b | ||
|
|
63ee1c36e8 | ||
|
|
7d07debcb5 | ||
|
|
dd67e1ee9d | ||
|
|
493efdbf10 | ||
|
|
e323175275 | ||
|
|
c1fa7f8645 | ||
|
|
275b962363 | ||
|
|
3847c33017 | ||
|
|
9e21f52213 | ||
|
|
25cf9b33ec | ||
|
|
c7a2d3589f | ||
|
|
d8dd3834c3 | ||
|
|
ee01c2c745 | ||
|
|
e7e5a2b4e9 | ||
|
|
ff16f59be1 | ||
|
|
2cd4937ddc | ||
|
|
0e9abc1762 | ||
|
|
e24ce87946 | ||
|
|
308e358d3f | ||
|
|
d15e6a4847 | ||
|
|
e311239a28 | ||
|
|
df677789d2 | ||
|
|
0af44eadb6 | ||
|
|
85cafe530e | ||
|
|
7609db28f1 | ||
|
|
fefda39284 | ||
|
|
b2f98bd059 | ||
|
|
26c69fe6d4 | ||
|
|
bf4f1a7c37 | ||
|
|
9b0dd39d9d | ||
|
|
66d4cc2ab8 | ||
|
|
0bcbaf6521 | ||
|
|
e074872b24 | ||
|
|
63ec1e618e | ||
|
|
331c15b76c | ||
|
|
d2089c9aad |
2
AUTHORS
@@ -12,7 +12,7 @@ Contributors:
|
|||||||
* Silvan Scherrer <silvan.scherrer@aroa.ch>
|
* Silvan Scherrer <silvan.scherrer@aroa.ch>
|
||||||
|
|
||||||
Code from other projects:
|
Code from other projects:
|
||||||
* files src/qtsingleapp/*
|
* files src/qtsingleapp/* src/lineedit/*
|
||||||
copyright: Nokia Corporation
|
copyright: Nokia Corporation
|
||||||
license: LGPL
|
license: LGPL
|
||||||
|
|
||||||
|
|||||||
56
Changelog
@@ -1,4 +1,58 @@
|
|||||||
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.3.0
|
* Sun Oct 17 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.6
|
||||||
|
- BUGFIX: Fix "torrent seeding after creation" feature
|
||||||
|
- BUGFIX: The properties panel data would sometimes not match the selected torrent
|
||||||
|
- BUGFIX: Fix detection of files at final destination when temp dir is used
|
||||||
|
- BUGFIX: Fix moving of a torrent to an unexisting directory
|
||||||
|
|
||||||
|
* Tue Oct 12 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.5
|
||||||
|
- BUGFIX: Remember torrent completion date correctly
|
||||||
|
- BUGFIX: Fix feature to keep incomplete torrents in a separate folder
|
||||||
|
- BUGFIX: Fix display of URL seeds in the UI
|
||||||
|
- BUGFIX: Improved peer hostname resolution with caching
|
||||||
|
- BUGFIX: Piece availability/downloaded widgets performance improvement
|
||||||
|
|
||||||
|
* Fri Oct 1 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.4
|
||||||
|
- BUGFIX: Clean program exit on system shutdown/logout
|
||||||
|
- BUGFIX: Fix possible search engine plugin update
|
||||||
|
|
||||||
|
* Tue Sep 28 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.3
|
||||||
|
- BUGFIX: Fix encoding issue in command line parameters processing
|
||||||
|
- BUGFIX: Fix possible crash when changing the save path in addition dialog
|
||||||
|
- BUGFIX: Fix wrong mapping to source model
|
||||||
|
|
||||||
|
* Sun Sep 26 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.2
|
||||||
|
- BUGFIX: Fix display of torrent content in addition dialog
|
||||||
|
- BUGFIX: Really fix manual editing of save path in torrent addition dialog
|
||||||
|
|
||||||
|
* Sun Sep 26 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.1
|
||||||
|
- I18N: Updated Arabic translation
|
||||||
|
- I18N: Fixes to German translation
|
||||||
|
- BUGFIX: Save path can now be edited in torrent addition dialog
|
||||||
|
- BUGFIX: Fix save path encoding on non-utf8 systems
|
||||||
|
- BUGFIX: Fix saving to drive root on Windows
|
||||||
|
- BUGFIX: OGV can now be previewed
|
||||||
|
- BUGFIX: Maximum download limit is now 10MB/s
|
||||||
|
- BUGFIX: Fix 'download in scan dir' persistence
|
||||||
|
- BUGFIX: Add .torrent extension only when missing (torrent creator)
|
||||||
|
- BUGFIX: Fix possible issue with temporary download path persistence
|
||||||
|
- BUGFIX: Added support for | (OR) operator in RSS feed downloader
|
||||||
|
- BUGFIX: Fix Web UI for spanish users
|
||||||
|
- BUGFIX: Fix locale switching from Web UI
|
||||||
|
- BUGFIX: Use AND operator for torrentdownloads.net searches
|
||||||
|
- BUGFIX: Limit torrent addition dialog width to fit the screen
|
||||||
|
- COSMETIC: Fix progress bars style on Windows
|
||||||
|
|
||||||
|
* Tue Aug 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.0
|
||||||
|
- FEATURE: Added actions to "Move to top/bottom" of priority queue
|
||||||
|
- FEATURE: Auto-Shutdown on downloads completion
|
||||||
|
- FEATURE: Email notification on download completion
|
||||||
|
- FEATURE: Added button to password-lock the UI
|
||||||
|
- FEATURE: Added label-level Pause/Resume/Delete actions
|
||||||
|
- FEATURE: Torrents can now be filtered by name
|
||||||
|
- FEATURE: Run external program on torrent completion
|
||||||
|
- FEATURE: Detect executable updates in order to advise the user to restart
|
||||||
|
|
||||||
|
* Tue Jul 27 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.3.0
|
||||||
- FEATURE: Simplified torrent root folder renaming/truncating (< v2.3.0 is no longer forward compatible)
|
- FEATURE: Simplified torrent root folder renaming/truncating (< v2.3.0 is no longer forward compatible)
|
||||||
- FEATURE: Remember previous save paths in torrent addition dialog
|
- FEATURE: Remember previous save paths in torrent addition dialog
|
||||||
- FEATURE: Max number of half-open connections can now be edited
|
- FEATURE: Max number of half-open connections can now be edited
|
||||||
|
|||||||
26
qcm/qtsingleapplication.qcm
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: libboost
|
||||||
|
arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplication library or the system one
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
class qc_qtsingleapplication : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "qtsingleapplication library"; }
|
||||||
|
QString shortname() const { return "qtsingleapplication"; }
|
||||||
|
|
||||||
|
bool exec(){
|
||||||
|
QString s;
|
||||||
|
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
||||||
|
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
||||||
|
// System
|
||||||
|
conf->addDefine("USE_SYSTEM_QTSINGLEAPPLICATION");
|
||||||
|
printf(" [system] ");
|
||||||
|
} else {
|
||||||
|
printf(" [shipped] ");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
140
src/GUI.cpp
13
src/GUI.h
@@ -57,6 +57,8 @@ class about;
|
|||||||
class createtorrent;
|
class createtorrent;
|
||||||
class downloadFromURL;
|
class downloadFromURL;
|
||||||
class HidableTabWidget;
|
class HidableTabWidget;
|
||||||
|
class LineEdit;
|
||||||
|
class QFileSystemWatcher;
|
||||||
|
|
||||||
class GUI : public QMainWindow, private Ui::MainWindow{
|
class GUI : public QMainWindow, private Ui::MainWindow{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -69,6 +71,7 @@ public:
|
|||||||
QWidget* getCurrentTabWidget() const;
|
QWidget* getCurrentTabWidget() const;
|
||||||
TransferListWidget* getTransferList() const { return transferList; }
|
TransferListWidget* getTransferList() const { return transferList; }
|
||||||
QMenu* getTrayIconMenu();
|
QMenu* getTrayIconMenu();
|
||||||
|
PropertiesWidget *getProperties() const { return properties; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void trackerAuthenticationRequired(QTorrentHandle& h);
|
void trackerAuthenticationRequired(QTorrentHandle& h);
|
||||||
@@ -77,6 +80,7 @@ public slots:
|
|||||||
void downloadFromURLList(const QStringList& urls);
|
void downloadFromURLList(const QStringList& urls);
|
||||||
void updateAltSpeedsBtn(bool alternative);
|
void updateAltSpeedsBtn(bool alternative);
|
||||||
void updateNbTorrents(unsigned int nb_downloading, unsigned int nb_seeding, unsigned int nb_active, unsigned int nb_inactive, unsigned int nb_paused);
|
void updateNbTorrents(unsigned int nb_downloading, unsigned int nb_seeding, unsigned int nb_active, unsigned int nb_inactive, unsigned int nb_paused);
|
||||||
|
void deleteBTSession();
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
// GUI related slots
|
// GUI related slots
|
||||||
@@ -97,6 +101,10 @@ protected slots:
|
|||||||
void handleDownloadFromUrlFailure(QString, QString) const;
|
void handleDownloadFromUrlFailure(QString, QString) const;
|
||||||
void createSystrayDelayed();
|
void createSystrayDelayed();
|
||||||
void tab_changed(int);
|
void tab_changed(int);
|
||||||
|
void on_actionLock_qBittorrent_triggered();
|
||||||
|
void defineUILockPassword();
|
||||||
|
bool unlockUI();
|
||||||
|
void notifyOfUpdate(QString);
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
void createKeyboardShortcuts();
|
void createKeyboardShortcuts();
|
||||||
void displayTransferTab() const;
|
void displayTransferTab() const;
|
||||||
@@ -130,6 +138,7 @@ protected:
|
|||||||
void displaySearchTab(bool enable);
|
void displaySearchTab(bool enable);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QFileSystemWatcher *executable_watcher;
|
||||||
// Bittorrent
|
// Bittorrent
|
||||||
Bittorrent *BTSession;
|
Bittorrent *BTSession;
|
||||||
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
||||||
@@ -150,6 +159,8 @@ private:
|
|||||||
PropertiesWidget *properties;
|
PropertiesWidget *properties;
|
||||||
bool displaySpeedInTitle;
|
bool displaySpeedInTitle;
|
||||||
bool force_exit;
|
bool force_exit;
|
||||||
|
bool ui_locked;
|
||||||
|
LineEdit *search_filter;
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
QShortcut *switchSearchShortcut;
|
QShortcut *switchSearchShortcut;
|
||||||
QShortcut *switchSearchShortcut2;
|
QShortcut *switchSearchShortcut2;
|
||||||
@@ -160,6 +171,7 @@ private:
|
|||||||
QAction *prioSeparator2;
|
QAction *prioSeparator2;
|
||||||
QSplitter *hSplitter;
|
QSplitter *hSplitter;
|
||||||
QSplitter *vSplitter;
|
QSplitter *vSplitter;
|
||||||
|
QMenu *lockMenu;
|
||||||
// Search
|
// Search
|
||||||
QPointer<SearchEngine> searchEngine;
|
QPointer<SearchEngine> searchEngine;
|
||||||
// RSS
|
// RSS
|
||||||
@@ -170,6 +182,7 @@ private slots:
|
|||||||
void on_actionRSS_Reader_triggered();
|
void on_actionRSS_Reader_triggered();
|
||||||
void on_actionSpeed_in_title_bar_triggered();
|
void on_actionSpeed_in_title_bar_triggered();
|
||||||
void on_actionTop_tool_bar_triggered();
|
void on_actionTop_tool_bar_triggered();
|
||||||
|
void on_actionShutdown_when_downloads_complete_triggered();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
BIN
src/Icons/oxygen/encrypted32.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/Icons/oxygen/go-bottom.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/Icons/oxygen/go-down.png
Normal file
|
After Width: | Height: | Size: 892 B |
BIN
src/Icons/oxygen/go-top.png
Normal file
|
After Width: | Height: | Size: 996 B |
BIN
src/Icons/oxygen/go-up.png
Normal file
|
After Width: | Height: | Size: 929 B |
@@ -1,6 +1,6 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Categories=Qt;Network;P2P;
|
Categories=Qt;Network;P2P;
|
||||||
Comment=V2.3.0
|
Comment=V2.4.6
|
||||||
Exec=qbittorrent %f
|
Exec=qbittorrent %f
|
||||||
GenericName=Bittorrent client
|
GenericName=Bittorrent client
|
||||||
GenericName[ar]=العميل Bittorrent
|
GenericName[ar]=العميل Bittorrent
|
||||||
|
|||||||
BIN
src/Icons/skin/arrow-right.gif
Normal file
|
After Width: | Height: | Size: 54 B |
BIN
src/Icons/skin/delete_perm22.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
@@ -47,7 +47,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleGetInfoString</key>
|
<key>CFBundleGetInfoString</key>
|
||||||
<string>2.3.0</string>
|
<string>2.4.6</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
|
|||||||
6
src/about.qrc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<!DOCTYPE RCC><RCC version="1.0">
|
||||||
|
<qresource>
|
||||||
|
<file>gpl.html</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
|
|
||||||
439
src/about_imp.h
@@ -108,6 +108,7 @@ public:
|
|||||||
session* getSession() const;
|
session* getSession() const;
|
||||||
QHash<QString, TrackerInfos> getTrackersInfo(QString hash) const;
|
QHash<QString, TrackerInfos> getTrackersInfo(QString hash) const;
|
||||||
bool hasActiveTorrents() const;
|
bool hasActiveTorrents() const;
|
||||||
|
bool hasDownloadingTorrents() const;
|
||||||
bool isQueueingEnabled() const;
|
bool isQueueingEnabled() const;
|
||||||
int getMaximumActiveDownloads() const;
|
int getMaximumActiveDownloads() const;
|
||||||
int getMaximumActiveTorrents() const;
|
int getMaximumActiveTorrents() const;
|
||||||
@@ -199,6 +200,9 @@ protected slots:
|
|||||||
void takeETASamples();
|
void takeETASamples();
|
||||||
void exportTorrentFiles(QString path);
|
void exportTorrentFiles(QString path);
|
||||||
void saveTempFastResumeData();
|
void saveTempFastResumeData();
|
||||||
|
void sendNotificationEmail(QTorrentHandle h);
|
||||||
|
void autoRunExternalProgram(QTorrentHandle h, bool async=true);
|
||||||
|
void cleanUpAutoRunProcess(int);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void addedTorrent(QTorrentHandle& h);
|
void addedTorrent(QTorrentHandle& h);
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
#include "torrentpersistentdata.h"
|
#include "torrentpersistentdata.h"
|
||||||
#include "createtorrent_imp.h"
|
#include "createtorrent_imp.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
#include "qinisettings.h"
|
||||||
|
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
using namespace boost::filesystem;
|
using namespace boost::filesystem;
|
||||||
@@ -80,8 +81,11 @@ createtorrent::~createtorrent() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void createtorrent::on_addFolder_button_clicked(){
|
void createtorrent::on_addFolder_button_clicked(){
|
||||||
QString dir = QFileDialog::getExistingDirectory(this, tr("Select a folder to add to the torrent"), QDir::homePath(), QFileDialog::ShowDirsOnly);
|
QIniSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QString last_path = settings.value("CreateTorrent/last_add_path", QDir::homePath()).toString();
|
||||||
|
QString dir = QFileDialog::getExistingDirectory(this, tr("Select a folder to add to the torrent"), last_path, QFileDialog::ShowDirsOnly);
|
||||||
if(!dir.isEmpty()) {
|
if(!dir.isEmpty()) {
|
||||||
|
settings.setValue("CreateTorrent/last_add_path", dir);
|
||||||
#if defined(Q_WS_WIN) || defined(Q_OS_OS2)
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2)
|
||||||
dir = dir.replace("/", "\\");
|
dir = dir.replace("/", "\\");
|
||||||
#endif
|
#endif
|
||||||
@@ -90,8 +94,11 @@ void createtorrent::on_addFolder_button_clicked(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void createtorrent::on_addFile_button_clicked(){
|
void createtorrent::on_addFile_button_clicked(){
|
||||||
QString file = QFileDialog::getOpenFileName(this, tr("Select a file to add to the torrent"), QDir::homePath());
|
QIniSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QString last_path = settings.value("CreateTorrent/last_add_path", QDir::homePath()).toString();
|
||||||
|
QString file = QFileDialog::getOpenFileName(this, tr("Select a file to add to the torrent"), last_path);
|
||||||
if(!file.isEmpty()) {
|
if(!file.isEmpty()) {
|
||||||
|
settings.setValue("CreateTorrent/last_add_path", misc::removeLastPathPart(file));
|
||||||
#if defined(Q_WS_WIN) || defined(Q_OS_OS2)
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2)
|
||||||
file = file.replace("/", "\\");
|
file = file.replace("/", "\\");
|
||||||
#endif
|
#endif
|
||||||
@@ -177,13 +184,14 @@ void createtorrent::on_createButton_clicked(){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QStringList trackers = allItems(trackers_list);
|
QStringList trackers = allItems(trackers_list);
|
||||||
/*if(!trackers.size()){
|
|
||||||
QMessageBox::critical(0, tr("No tracker path set"), tr("Please set at least one tracker"));
|
QIniSettings settings("qBittorrent", "qBittorrent");
|
||||||
return;
|
QString last_path = settings.value("CreateTorrent/last_save_path", QDir::homePath()).toString();
|
||||||
}*/
|
|
||||||
QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), QDir::homePath(), tr("Torrent Files")+QString::fromUtf8(" (*.torrent)"));
|
QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), last_path, tr("Torrent Files")+QString::fromUtf8(" (*.torrent)"));
|
||||||
if(!destination.isEmpty()) {
|
if(!destination.isEmpty()) {
|
||||||
if(!destination.endsWith(QString::fromUtf8(".torrent")))
|
settings.setValue("CreateTorrent/last_save_path", misc::removeLastPathPart(destination));
|
||||||
|
if(!destination.toUpper().endsWith(".TORRENT"))
|
||||||
destination += QString::fromUtf8(".torrent");
|
destination += QString::fromUtf8(".torrent");
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
@@ -212,16 +220,22 @@ void createtorrent::handleCreationSuccess(QString path, QString branch_path) {
|
|||||||
// Remove busy cursor
|
// Remove busy cursor
|
||||||
setCursor(QCursor(Qt::ArrowCursor));
|
setCursor(QCursor(Qt::ArrowCursor));
|
||||||
if(checkStartSeeding->isChecked()) {
|
if(checkStartSeeding->isChecked()) {
|
||||||
|
QString root_folder;
|
||||||
// Create save path temp data
|
// Create save path temp data
|
||||||
boost::intrusive_ptr<torrent_info> t;
|
boost::intrusive_ptr<torrent_info> t;
|
||||||
try {
|
try {
|
||||||
t = new torrent_info(path.toUtf8().data());
|
t = new torrent_info(path.toUtf8().data());
|
||||||
|
root_folder = misc::truncateRootFolder(t);
|
||||||
} catch(std::exception&) {
|
} catch(std::exception&) {
|
||||||
QMessageBox::critical(0, tr("Torrent creation"), tr("Created torrent file is invalid. It won't be added to download list."));
|
QMessageBox::critical(0, tr("Torrent creation"), tr("Created torrent file is invalid. It won't be added to download list."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QString hash = misc::toQString(t->info_hash());
|
QString hash = misc::toQString(t->info_hash());
|
||||||
TorrentTempData::setSavePath(hash, branch_path);
|
QString save_path = branch_path;
|
||||||
|
if(!root_folder.isEmpty()) {
|
||||||
|
save_path = QDir(save_path).absoluteFilePath(root_folder);
|
||||||
|
}
|
||||||
|
TorrentTempData::setSavePath(hash, save_path);
|
||||||
#if LIBTORRENT_VERSION_MINOR > 14
|
#if LIBTORRENT_VERSION_MINOR > 14
|
||||||
// Enable seeding mode (do not recheck the files)
|
// Enable seeding mode (do not recheck the files)
|
||||||
TorrentTempData::setSeedingMode(hash, true);
|
TorrentTempData::setSeedingMode(hash, true);
|
||||||
@@ -277,8 +291,7 @@ void torrentCreatorThread::run() {
|
|||||||
char const* creator_str = "qBittorrent "VERSION;
|
char const* creator_str = "qBittorrent "VERSION;
|
||||||
try {
|
try {
|
||||||
file_storage fs;
|
file_storage fs;
|
||||||
file_pool fp;
|
path full_path = complete(path(input_path.toUtf8().constData()));
|
||||||
path full_path = complete(path(input_path.toLocal8Bit().data()));
|
|
||||||
// Adding files to the torrent
|
// Adding files to the torrent
|
||||||
add_files(fs, full_path, file_filter);
|
add_files(fs, full_path, file_filter);
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
@@ -303,7 +316,7 @@ void torrentCreatorThread::run() {
|
|||||||
t.set_priv(is_private);
|
t.set_priv(is_private);
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
// create the torrent and print it to out
|
// create the torrent and print it to out
|
||||||
ofstream out(complete(path((const char*)save_path.toLocal8Bit())), std::ios_base::binary);
|
ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary);
|
||||||
bencode(std::ostream_iterator<char>(out), t.generate());
|
bencode(std::ostream_iterator<char>(out), t.generate());
|
||||||
emit updateProgress(100);
|
emit updateProgress(100);
|
||||||
emit creationSuccess(save_path, QString::fromUtf8(full_path.branch_path().string().c_str()));
|
emit creationSuccess(save_path, QString::fromUtf8(full_path.branch_path().string().c_str()));
|
||||||
|
|||||||
@@ -60,31 +60,34 @@ public:
|
|||||||
pix.fill();
|
pix.fill();
|
||||||
pixmap = pix;
|
pixmap = pix;
|
||||||
} else {
|
} else {
|
||||||
const int nb_pieces = pieces.size();
|
const qulonglong nb_pieces = pieces.size();
|
||||||
// Reduce the number of pieces before creating the pixmap
|
// Reduce the number of pieces before creating the pixmap
|
||||||
// otherwise it can crash when there are too many pieces
|
// otherwise it can crash when there are too many pieces
|
||||||
if(nb_pieces > width()) {
|
const uint w = width();
|
||||||
const int ratio = floor(nb_pieces/(double)width());
|
if(nb_pieces > w) {
|
||||||
std::vector<bool> scaled_pieces;
|
const uint ratio = floor(nb_pieces/(double)w);
|
||||||
std::vector<bool> scaled_downloading;
|
bitfield scaled_pieces(ceil(nb_pieces/(double)ratio), false);
|
||||||
for(int i=0; i<nb_pieces; i+= ratio) {
|
bitfield scaled_downloading(ceil(nb_pieces/(double)ratio), false);
|
||||||
|
uint scaled_index = 0;
|
||||||
|
for(qulonglong i=0; i<nb_pieces; i+= ratio) {
|
||||||
bool have = true;
|
bool have = true;
|
||||||
for(int j=i; j<qMin(i+ratio, nb_pieces); ++j) {
|
for(qulonglong j=i; j<qMin(i+ratio, nb_pieces); ++j) {
|
||||||
if(!pieces[i]) { have = false; break; }
|
if(!pieces[i]) { have = false; break; }
|
||||||
}
|
}
|
||||||
scaled_pieces.push_back(have);
|
|
||||||
if(have) {
|
if(have) {
|
||||||
scaled_downloading.push_back(false);
|
scaled_pieces.set_bit(scaled_index);
|
||||||
} else {
|
} else {
|
||||||
bool downloading = false;
|
bool downloading = false;
|
||||||
for(int j=i; j<qMin(i+ratio, nb_pieces); ++j) {
|
for(qulonglong j=i; j<qMin(i+ratio, nb_pieces); ++j) {
|
||||||
if(downloading_pieces[i]) { downloading = true; break; }
|
if(downloading_pieces[i]) { downloading = true; break; }
|
||||||
}
|
}
|
||||||
scaled_downloading.push_back(downloading);
|
if(downloading)
|
||||||
|
scaled_downloading.set_bit(scaled_index);
|
||||||
}
|
}
|
||||||
|
++scaled_index;
|
||||||
}
|
}
|
||||||
QPixmap pix = QPixmap(scaled_pieces.size(), 1);
|
QPixmap pix = QPixmap(scaled_pieces.size(), 1);
|
||||||
pix.fill();
|
//pix.fill();
|
||||||
QPainter painter(&pix);
|
QPainter painter(&pix);
|
||||||
for(uint i=0; i<scaled_pieces.size(); ++i) {
|
for(uint i=0; i<scaled_pieces.size(); ++i) {
|
||||||
if(scaled_pieces[i]) {
|
if(scaled_pieces[i]) {
|
||||||
@@ -101,7 +104,7 @@ public:
|
|||||||
pixmap = pix;
|
pixmap = pix;
|
||||||
} else {
|
} else {
|
||||||
QPixmap pix = QPixmap(pieces.size(), 1);
|
QPixmap pix = QPixmap(pieces.size(), 1);
|
||||||
pix.fill();
|
//pix.fill();
|
||||||
QPainter painter(&pix);
|
QPainter painter(&pix);
|
||||||
for(uint i=0; i<pieces.size(); ++i) {
|
for(uint i=0; i<pieces.size(); ++i) {
|
||||||
if(pieces[i]) {
|
if(pieces[i]) {
|
||||||
|
|||||||
@@ -270,6 +270,7 @@ void engineSelectDlg::installPlugin(QString path, QString plugin_name) {
|
|||||||
// Backup in case install fails
|
// Backup in case install fails
|
||||||
QFile::copy(dest_path, dest_path+".bak");
|
QFile::copy(dest_path, dest_path+".bak");
|
||||||
misc::safeRemove(dest_path);
|
misc::safeRemove(dest_path);
|
||||||
|
misc::safeRemove(dest_path+"c");
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
// Copy the plugin
|
// Copy the plugin
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
//#include "proplistdelegate.h"
|
//#include "proplistdelegate.h"
|
||||||
#include "torrentpersistentdata.h"
|
#include "torrentpersistentdata.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QTranslator>
|
||||||
|
|
||||||
EventManager::EventManager(QObject *parent, Bittorrent *BTSession)
|
EventManager::EventManager(QObject *parent, Bittorrent *BTSession)
|
||||||
: QObject(parent), BTSession(BTSession)
|
: QObject(parent), BTSession(BTSession)
|
||||||
@@ -124,8 +125,20 @@ QList<QVariantMap> EventManager::getPropFilesInfo(QString hash) const {
|
|||||||
|
|
||||||
void EventManager::setGlobalPreferences(QVariantMap m) const {
|
void EventManager::setGlobalPreferences(QVariantMap m) const {
|
||||||
// UI
|
// UI
|
||||||
if(m.contains("locale"))
|
if(m.contains("locale")) {
|
||||||
Preferences::setLocale(m["locale"].toString());
|
QString locale = m["locale"].toString();
|
||||||
|
if(Preferences::getLocale() != locale) {
|
||||||
|
QTranslator *translator = new QTranslator;
|
||||||
|
if(translator->load(QString::fromUtf8(":/lang/qbittorrent_") + locale)){
|
||||||
|
qDebug("%s locale recognized, using translation.", qPrintable(locale));
|
||||||
|
}else{
|
||||||
|
qDebug("%s locale unrecognized, using default (en_GB).", qPrintable(locale));
|
||||||
|
}
|
||||||
|
qApp->installTranslator(translator);
|
||||||
|
}
|
||||||
|
|
||||||
|
Preferences::setLocale(locale);
|
||||||
|
}
|
||||||
// Downloads
|
// Downloads
|
||||||
if(m.contains("save_path"))
|
if(m.contains("save_path"))
|
||||||
Preferences::setSavePath(m["save_path"].toString());
|
Preferences::setSavePath(m["save_path"].toString());
|
||||||
@@ -163,6 +176,16 @@ void EventManager::setGlobalPreferences(QVariantMap m) const {
|
|||||||
}
|
}
|
||||||
if(m.contains("export_dir"))
|
if(m.contains("export_dir"))
|
||||||
Preferences::setExportDir(m["export_dir"].toString());
|
Preferences::setExportDir(m["export_dir"].toString());
|
||||||
|
if(m.contains("mail_notification_enabled"))
|
||||||
|
Preferences::setMailNotificationEnabled(m["mail_notification_enabled"].toBool());
|
||||||
|
if(m.contains("mail_notification_email"))
|
||||||
|
Preferences::setMailNotificationEmail(m["mail_notification_email"].toString());
|
||||||
|
if(m.contains("mail_notification_smtp"))
|
||||||
|
Preferences::setMailNotificationSMTP(m["mail_notification_smtp"].toString());
|
||||||
|
if(m.contains("autorun_enabled"))
|
||||||
|
Preferences::setAutoRunEnabled(m["autorun_enabled"].toBool());
|
||||||
|
if(m.contains("autorun_program"))
|
||||||
|
Preferences::setAutoRunProgram(m["autorun_program"].toString());
|
||||||
if(m.contains("preallocate_all"))
|
if(m.contains("preallocate_all"))
|
||||||
Preferences::preAllocateAllFiles(m["preallocate_all"].toBool());
|
Preferences::preAllocateAllFiles(m["preallocate_all"].toBool());
|
||||||
if(m.contains("queueing_enabled"))
|
if(m.contains("queueing_enabled"))
|
||||||
@@ -265,6 +288,11 @@ QVariantMap EventManager::getGlobalPreferences() const {
|
|||||||
data["download_in_scan_dirs"] = var_list;
|
data["download_in_scan_dirs"] = var_list;
|
||||||
data["export_dir_enabled"] = Preferences::isTorrentExportEnabled();
|
data["export_dir_enabled"] = Preferences::isTorrentExportEnabled();
|
||||||
data["export_dir"] = Preferences::getExportDir();
|
data["export_dir"] = Preferences::getExportDir();
|
||||||
|
data["mail_notification_enabled"] = Preferences::isMailNotificationEnabled();
|
||||||
|
data["mail_notification_email"] = Preferences::getMailNotificationEmail();
|
||||||
|
data["mail_notification_smtp"] = Preferences::getMailNotificationSMTP();
|
||||||
|
data["autorun_enabled"] = Preferences::isAutoRunEnabled();
|
||||||
|
data["autorun_program"] = Preferences::getAutoRunProgram();
|
||||||
data["preallocate_all"] = Preferences::preAllocateAllFiles();
|
data["preallocate_all"] = Preferences::preAllocateAllFiles();
|
||||||
data["queueing_enabled"] = Preferences::isQueueingSystemEnabled();
|
data["queueing_enabled"] = Preferences::isQueueingSystemEnabled();
|
||||||
data["max_active_downloads"] = Preferences::getMaxActiveDownloads();
|
data["max_active_downloads"] = Preferences::getMaxActiveDownloads();
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ public:
|
|||||||
|
|
||||||
QStringList getNotMatchingTokens() const {
|
QStringList getNotMatchingTokens() const {
|
||||||
QString notmatching = this->value("not", "").toString();
|
QString notmatching = this->value("not", "").toString();
|
||||||
return notmatching.split(" ");
|
return notmatching.split(QRegExp("[\\s|]"));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString getNotMatchingTokens_str() const {
|
QString getNotMatchingTokens_str() const {
|
||||||
|
|||||||
@@ -202,8 +202,13 @@ signals:
|
|||||||
private:
|
private:
|
||||||
void addTorrentsFromDir(const QDir &dir, QStringList &torrents) {
|
void addTorrentsFromDir(const QDir &dir, QStringList &torrents) {
|
||||||
const QStringList files = dir.entryList(filters, QDir::Files, QDir::Unsorted);
|
const QStringList files = dir.entryList(filters, QDir::Files, QDir::Unsorted);
|
||||||
foreach(const QString &file, files)
|
foreach(const QString &file, files) {
|
||||||
torrents << dir.canonicalPath() + '/' + file;
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2)
|
||||||
|
torrents << dir.absoluteFilePath(file).replace("/", "\\");
|
||||||
|
#else
|
||||||
|
torrents << dir.absoluteFilePath(file);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
508
src/gpl.html
Normal file
@@ -109,7 +109,7 @@ QString HttpConnection::translateDocument(QString data) {
|
|||||||
bool found = false;
|
bool found = false;
|
||||||
do {
|
do {
|
||||||
found = false;
|
found = false;
|
||||||
QRegExp regex(QString::fromUtf8("_\\(([\\w\\s?!:\\/\\(\\),µ&\\-\\.]+)\\)"));
|
QRegExp regex(QString::fromUtf8("_\\(([\\w\\s?!:\\/\\(\\),%µ&\\-\\.]+)\\)"));
|
||||||
i = regex.indexIn(data, i);
|
i = regex.indexIn(data, i);
|
||||||
if(i >= 0) {
|
if(i >= 0) {
|
||||||
//qDebug("Found translatable string: %s", regex.cap(1).toUtf8().data());
|
//qDebug("Found translatable string: %s", regex.cap(1).toUtf8().data());
|
||||||
@@ -161,7 +161,7 @@ void HttpConnection::respond() {
|
|||||||
write();
|
write();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Client sucessfuly authenticated, reset number of failed attempts
|
// Client successfully authenticated, reset number of failed attempts
|
||||||
parent->resetNbFailedAttemptsForIp(peer_ip);
|
parent->resetNbFailedAttemptsForIp(peer_ip);
|
||||||
QString url = parser.url();
|
QString url = parser.url();
|
||||||
// Favicon
|
// Favicon
|
||||||
@@ -500,6 +500,16 @@ void HttpConnection::respondCommand(QString command)
|
|||||||
if(h.is_valid()) h.queue_position_down();
|
if(h.is_valid()) h.queue_position_down();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(command == "topPrio") {
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(parser.post("hash"));
|
||||||
|
if(h.is_valid()) h.queue_position_top();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(command == "bottomPrio") {
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(parser.post("hash"));
|
||||||
|
if(h.is_valid()) h.queue_position_bottom();
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(command == "recheck"){
|
if(command == "recheck"){
|
||||||
recheckTorrent(parser.post("hash"));
|
recheckTorrent(parser.post("hash"));
|
||||||
return;
|
return;
|
||||||
|
|||||||
301
src/icons.qrc
@@ -132,6 +132,7 @@ namespace json {
|
|||||||
tmp += c;
|
tmp += c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(!tmp.isEmpty()) couples << tmp;
|
||||||
foreach(QString couple, couples) {
|
foreach(QString couple, couples) {
|
||||||
QStringList parts = couple.split(":");
|
QStringList parts = couple.split(":");
|
||||||
if(parts.size() != 2) continue;
|
if(parts.size() != 2) continue;
|
||||||
|
|||||||
50
src/lang.qrc
@@ -1,34 +1,34 @@
|
|||||||
<!DOCTYPE RCC><RCC version="1.0">
|
<!DOCTYPE RCC><RCC version="1.0">
|
||||||
<qresource>
|
<qresource>
|
||||||
<file>lang/qbittorrent_es.qm</file>
|
|
||||||
<file>lang/qbittorrent_sk.qm</file>
|
|
||||||
<file>lang/qbittorrent_zh_TW.qm</file>
|
|
||||||
<file>lang/qbittorrent_pt.qm</file>
|
|
||||||
<file>lang/qbittorrent_sv.qm</file>
|
|
||||||
<file>lang/qbittorrent_pl.qm</file>
|
|
||||||
<file>lang/qbittorrent_it.qm</file>
|
|
||||||
<file>lang/qbittorrent_ar.qm</file>
|
|
||||||
<file>lang/qbittorrent_ko.qm</file>
|
|
||||||
<file>lang/qbittorrent_en.qm</file>
|
|
||||||
<file>lang/qbittorrent_ro.qm</file>
|
|
||||||
<file>lang/qbittorrent_bg.qm</file>
|
|
||||||
<file>lang/qbittorrent_ru.qm</file>
|
|
||||||
<file>lang/qbittorrent_nl.qm</file>
|
<file>lang/qbittorrent_nl.qm</file>
|
||||||
<file>lang/qbittorrent_nb.qm</file>
|
<file>lang/qbittorrent_hu.qm</file>
|
||||||
|
<file>lang/qbittorrent_ru.qm</file>
|
||||||
|
<file>lang/qbittorrent_zh_TW.qm</file>
|
||||||
|
<file>lang/qbittorrent_tr.qm</file>
|
||||||
<file>lang/qbittorrent_fi.qm</file>
|
<file>lang/qbittorrent_fi.qm</file>
|
||||||
<file>lang/qbittorrent_uk.qm</file>
|
<file>lang/qbittorrent_sk.qm</file>
|
||||||
<file>lang/qbittorrent_cs.qm</file>
|
<file>lang/qbittorrent_ja.qm</file>
|
||||||
<file>lang/qbittorrent_pt_BR.qm</file>
|
|
||||||
<file>lang/qbittorrent_el.qm</file>
|
<file>lang/qbittorrent_el.qm</file>
|
||||||
<file>lang/qbittorrent_ca.qm</file>
|
<file>lang/qbittorrent_ca.qm</file>
|
||||||
<file>lang/qbittorrent_hr.qm</file>
|
<file>lang/qbittorrent_pt.qm</file>
|
||||||
<file>lang/qbittorrent_sr.qm</file>
|
<file>lang/qbittorrent_it.qm</file>
|
||||||
<file>lang/qbittorrent_hu.qm</file>
|
|
||||||
<file>lang/qbittorrent_da.qm</file>
|
|
||||||
<file>lang/qbittorrent_de.qm</file>
|
|
||||||
<file>lang/qbittorrent_zh.qm</file>
|
|
||||||
<file>lang/qbittorrent_ja.qm</file>
|
|
||||||
<file>lang/qbittorrent_tr.qm</file>
|
|
||||||
<file>lang/qbittorrent_fr.qm</file>
|
<file>lang/qbittorrent_fr.qm</file>
|
||||||
|
<file>lang/qbittorrent_uk.qm</file>
|
||||||
|
<file>lang/qbittorrent_zh.qm</file>
|
||||||
|
<file>lang/qbittorrent_ko.qm</file>
|
||||||
|
<file>lang/qbittorrent_nb.qm</file>
|
||||||
|
<file>lang/qbittorrent_sv.qm</file>
|
||||||
|
<file>lang/qbittorrent_de.qm</file>
|
||||||
|
<file>lang/qbittorrent_sr.qm</file>
|
||||||
|
<file>lang/qbittorrent_pt_BR.qm</file>
|
||||||
|
<file>lang/qbittorrent_da.qm</file>
|
||||||
|
<file>lang/qbittorrent_cs.qm</file>
|
||||||
|
<file>lang/qbittorrent_pl.qm</file>
|
||||||
|
<file>lang/qbittorrent_bg.qm</file>
|
||||||
|
<file>lang/qbittorrent_ar.qm</file>
|
||||||
|
<file>lang/qbittorrent_es.qm</file>
|
||||||
|
<file>lang/qbittorrent_en.qm</file>
|
||||||
|
<file>lang/qbittorrent_hr.qm</file>
|
||||||
|
<file>lang/qbittorrent_ro.qm</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||