You've already forked qBittorrent
mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-10-12 03:12:18 +02:00
Compare commits
50 Commits
release-2.
...
release-2.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
7c79537176 | ||
![]() |
2b45e1baa3 | ||
![]() |
476b395166 | ||
![]() |
7157996dc2 | ||
![]() |
218f386502 | ||
![]() |
b492051d32 | ||
![]() |
39c7d884c9 | ||
![]() |
4d2d0bf08d | ||
![]() |
34c1fd759b | ||
![]() |
922aebec9a | ||
![]() |
4d39b3accd | ||
![]() |
c713bd56e0 | ||
![]() |
efcd652e3d | ||
![]() |
8d6df1f15f | ||
![]() |
ca835a105b | ||
![]() |
2de1a7cc30 | ||
![]() |
3de83319a8 | ||
![]() |
cfc75905a2 | ||
![]() |
2c30d5a1ca | ||
![]() |
d162d0c3c6 | ||
![]() |
509eb9bcf0 | ||
![]() |
1766877605 | ||
![]() |
fa78fba559 | ||
![]() |
44ff7161aa | ||
![]() |
96837a3658 | ||
![]() |
e4d93a96e7 | ||
![]() |
ccb2ed9a69 | ||
![]() |
ae5693544d | ||
![]() |
3a72c11e39 | ||
![]() |
4176abd18a | ||
![]() |
cba36fcb14 | ||
![]() |
9f33656e61 | ||
![]() |
a4123a6462 | ||
![]() |
313b2630bd | ||
![]() |
87b0ae9a79 | ||
![]() |
81778a0090 | ||
![]() |
5d0d63d89a | ||
![]() |
764e8a365b | ||
![]() |
e302042520 | ||
![]() |
e453eb9a91 | ||
![]() |
98fcb91dae | ||
![]() |
c8a1f625f0 | ||
![]() |
b70cf7c049 | ||
![]() |
ecdfe63d00 | ||
![]() |
7635fe51f7 | ||
![]() |
8cba38ac62 | ||
![]() |
fab63e6ffc | ||
![]() |
27f257ba03 | ||
![]() |
a2aa462030 | ||
![]() |
0f44804225 |
2
AUTHORS
2
AUTHORS
@@ -83,7 +83,7 @@ Translations authors:
|
||||
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
|
||||
- Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) and Stephanos Antaris (santaris@csd.auth.gr)
|
||||
- Hungarian: Majoros Péter (majoros.j.p@t-online.hu)
|
||||
- Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)
|
||||
- Italian: Matteo Sechi (bu17714@gmail.com)
|
||||
- Japanese: Nardog (alphisation@gmail.com)
|
||||
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
|
||||
- Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net)
|
||||
|
33
Changelog
33
Changelog
@@ -1,3 +1,36 @@
|
||||
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.4.11
|
||||
- BUGFIX: Do not report a progress of 100% in the Web UI unless the
|
||||
torrent is really complete (closes #674349)
|
||||
- BUGFIX: Fix possible incorrect behavior with queueing
|
||||
- BUGFIX: Fix RSS refresh interval saving
|
||||
- BUGFIX: Fix possible crash when setting RSS proxy (closes #676288)
|
||||
- BUGFIX: Fix HTTP redirect issue that would cause the torrent addition to
|
||||
show up for automated RSS downloads (Closes #677565)
|
||||
|
||||
* Wed Nov 10 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.10
|
||||
- BUGFIX: Fix possible crash when selecting a RSS item (really closes #575624)
|
||||
- BUGFIX: Improved IPv6 support (IP filter and Peer list)
|
||||
- BUGFIX: Make IP filter more tolerant towards strangely formatted IPs
|
||||
- BUGFIX: More reliable folder scanning
|
||||
- BUGFIX: Do not create the torrent root folder at final destination if
|
||||
torrent is in the temp dir (closes #673271)
|
||||
- BUGFIX: Fix compilation with libnotify v0.7.0 (closes #671769)
|
||||
- BUGFIX: Use a pointing cursor over status bar buttons
|
||||
|
||||
* Sun Oct 31 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.9
|
||||
- BUGFIX: Fix crash when pressing enter in save path field in torrent addition dialog
|
||||
- BUGFIX: Fix crash when deleting a torrent with no metadata (closes #667528)
|
||||
- BUGFIX: Fix possible crash on clicking a RSS article (closes #575624)
|
||||
- BUGFIX: Correctly update total number of torrents when a torrent is automatically removed (closes #668726)
|
||||
- BUGFIX: Correctly display the hash of torrents with no metadata
|
||||
- BUGFIX: Elide status bar text if it is too wide
|
||||
- BUGFIX: Make sure the splash screen is displayed for 2 seconds
|
||||
- BUGFIX: Make listening on a particular interface more reliable
|
||||
- BUGFIX: Fix torrent size update in torrent addition dialog
|
||||
- BUGFIX: Fix possible crash on qBittorrent shutdown
|
||||
- BUGFIX: Fix and improve file priorities editing (closes #669084)
|
||||
- I18N: Updated Arabic, Italian and Croatian translations
|
||||
|
||||
* Sun Oct 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.8
|
||||
- BUGFIX: Fix possible crash on manual peer ban
|
||||
- BUGFIX: Improved hostname resolution code
|
||||
|
12
src/GUI.cpp
12
src/GUI.cpp
@@ -1035,7 +1035,12 @@ void GUI::showNotificationBaloon(QString title, QString msg) const {
|
||||
#ifdef WITH_LIBNOTIFY
|
||||
if (notify_init ("summary-body")) {
|
||||
NotifyNotification* notification;
|
||||
notification = notify_notification_new (qPrintable(title), qPrintable(msg), "qbittorrent", 0);
|
||||
|
||||
notification = notify_notification_new (qPrintable(title), qPrintable(msg), "qbittorrent"
|
||||
#if !defined(NOTIFY_VERSION_MINOR) || (NOTIFY_VERSION_MAJOR == 0 && NOTIFY_VERSION_MINOR < 7)
|
||||
, 0
|
||||
#endif
|
||||
);
|
||||
gboolean success = notify_notification_show (notification, NULL);
|
||||
g_object_unref(G_OBJECT(notification));
|
||||
notify_uninit ();
|
||||
@@ -1206,3 +1211,8 @@ void GUI::on_actionDownload_from_URL_triggered() {
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::on_actionDonate_money_triggered()
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl("http://sourceforge.net/donate/index.php?group_id=163414"));
|
||||
}
|
||||
|
||||
|
@@ -183,6 +183,7 @@ private slots:
|
||||
void on_actionSpeed_in_title_bar_triggered();
|
||||
void on_actionTop_tool_bar_triggered();
|
||||
void on_actionShutdown_when_downloads_complete_triggered();
|
||||
void on_actionDonate_money_triggered();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
BIN
src/Icons/oxygen/emblem-favorite.png
Normal file
BIN
src/Icons/oxygen/emblem-favorite.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
@@ -1,6 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Categories=Qt;Network;P2P;
|
||||
Comment=V2.4.8
|
||||
Comment=V2.4.11
|
||||
Exec=qbittorrent %f
|
||||
GenericName=Bittorrent client
|
||||
GenericName[ar]=العميل Bittorrent
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 75 KiB |
@@ -47,7 +47,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>2.4.8</string>
|
||||
<string>2.4.11</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
|
@@ -73,7 +73,7 @@ class about : public QDialog, private Ui::AboutDlg{
|
||||
<li><u>German:</u> Niels Hoffmann (zentralmaschine@users.sourceforge.net)</li>\
|
||||
<li><u>Greek:</u> Tsvetan Bankov (emerge_life@users.sourceforge.net)</li>\
|
||||
<li><u>Hungarian:</u> Majoros Péter (majoros.peterj@gmail.com)</li>\
|
||||
<li><u>Italian:</u> Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)</li>\
|
||||
<li><u>Italian:</u> Matteo Sechi (bu17714@gmail.com)</li>\
|
||||
<li><u>Japanese:</u> Nardog (alphisation@gmail.com)</li>\
|
||||
<li><u>Korean:</u> Jin Woo Sin (jin828sin@users.sourceforge.net)</li>\
|
||||
<li><u>Norwegian:</u> Lars-Erik Labori (hamil@users.sourceforge.net)</li>\
|
||||
|
@@ -748,15 +748,23 @@ void Bittorrent::deleteTorrent(QString hash, bool delete_local_files) {
|
||||
qDebug("/!\\ Error: Invalid handle");
|
||||
return;
|
||||
}
|
||||
const QString fileName(h.name());
|
||||
QString fileName;
|
||||
if(h.has_metadata())
|
||||
fileName = h.name();
|
||||
else
|
||||
fileName = h.hash();
|
||||
// Remove it from session
|
||||
if(delete_local_files) {
|
||||
QDir save_dir(h.save_path());
|
||||
if(save_dir != QDir(defaultSavePath) && (defaultTempPath.isEmpty() || save_dir != QDir(defaultTempPath)))
|
||||
savePathsToRemove[hash] = save_dir.absolutePath();
|
||||
if(h.has_metadata()) {
|
||||
QDir save_dir(h.save_path());
|
||||
if(save_dir != QDir(defaultSavePath) && (defaultTempPath.isEmpty() || save_dir != QDir(defaultTempPath)))
|
||||
savePathsToRemove[hash] = save_dir.absolutePath();
|
||||
}
|
||||
s->remove_torrent(h.get_torrent_handle(), session::delete_files);
|
||||
} else {
|
||||
QStringList uneeded_files = h.uneeded_files_path();
|
||||
QStringList uneeded_files;
|
||||
if(h.has_metadata())
|
||||
uneeded_files = h.uneeded_files_path();
|
||||
s->remove_torrent(h.get_torrent_handle());
|
||||
// Remove unneeded files
|
||||
foreach(const QString &uneeded_file, uneeded_files) {
|
||||
@@ -779,7 +787,9 @@ void Bittorrent::deleteTorrent(QString hash, bool delete_local_files) {
|
||||
addConsoleMessage(tr("'%1' was removed from transfer list and hard disk.", "'xxx.avi' was removed...").arg(fileName));
|
||||
else
|
||||
addConsoleMessage(tr("'%1' was removed from transfer list.", "'xxx.avi' was removed...").arg(fileName));
|
||||
qDebug("Torrent deleted.");
|
||||
emit deletedTorrent(hash);
|
||||
qDebug("Deleted signal emitted.");
|
||||
}
|
||||
|
||||
void Bittorrent::pauseAllTorrents() {
|
||||
@@ -1561,13 +1571,15 @@ void Bittorrent::saveFastResumeData() {
|
||||
for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) {
|
||||
QTorrentHandle h = QTorrentHandle(*torrentIT);
|
||||
if(!h.is_valid() || !h.has_metadata()) continue;
|
||||
if(isQueueingEnabled())
|
||||
TorrentPersistentData::savePriority(h);
|
||||
// Actually with should save fast resume data for paused files too
|
||||
//if(h.is_paused()) continue;
|
||||
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) continue;
|
||||
h.save_resume_data();
|
||||
++num_resume_data;
|
||||
try {
|
||||
if(isQueueingEnabled())
|
||||
TorrentPersistentData::savePriority(h);
|
||||
// Actually with should save fast resume data for paused files too
|
||||
//if(h.is_paused()) continue;
|
||||
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) continue;
|
||||
h.save_resume_data();
|
||||
++num_resume_data;
|
||||
} catch(invalid_handle&) {}
|
||||
}
|
||||
while (num_resume_data > 0) {
|
||||
alert const* a = s->wait_for_alert(seconds(30));
|
||||
@@ -1583,8 +1595,9 @@ void Bittorrent::saveFastResumeData() {
|
||||
s->pop_alert();
|
||||
try {
|
||||
// Remove torrent from session
|
||||
s->remove_torrent(rda->handle);
|
||||
}catch(libtorrent::libtorrent_exception){}
|
||||
if(rda->handle.is_valid())
|
||||
s->remove_torrent(rda->handle);
|
||||
}catch(libtorrent::libtorrent_exception&){}
|
||||
continue;
|
||||
}
|
||||
save_resume_data_alert const* rd = dynamic_cast<save_resume_data_alert const*>(a);
|
||||
@@ -1598,16 +1611,18 @@ void Bittorrent::saveFastResumeData() {
|
||||
QDir torrentBackup(misc::BTBackupLocation());
|
||||
const QTorrentHandle h(rd->handle);
|
||||
if(!h.is_valid()) continue;
|
||||
// Remove old fastresume file if it exists
|
||||
const QString file = torrentBackup.absoluteFilePath(h.hash()+".fastresume");
|
||||
if(QFile::exists(file))
|
||||
misc::safeRemove(file);
|
||||
boost::filesystem::ofstream out(boost::filesystem::path(file.toLocal8Bit().constData()), std::ios_base::binary);
|
||||
out.unsetf(std::ios_base::skipws);
|
||||
bencode(std::ostream_iterator<char>(out), *rd->resume_data);
|
||||
// Remove torrent from session
|
||||
s->remove_torrent(rd->handle);
|
||||
s->pop_alert();
|
||||
try {
|
||||
// Remove old fastresume file if it exists
|
||||
const QString file = torrentBackup.absoluteFilePath(h.hash()+".fastresume");
|
||||
if(QFile::exists(file))
|
||||
misc::safeRemove(file);
|
||||
boost::filesystem::ofstream out(boost::filesystem::path(file.toLocal8Bit().constData()), std::ios_base::binary);
|
||||
out.unsetf(std::ios_base::skipws);
|
||||
bencode(std::ostream_iterator<char>(out), *rd->resume_data);
|
||||
// Remove torrent from session
|
||||
s->remove_torrent(rd->handle);
|
||||
s->pop_alert();
|
||||
}catch(libtorrent::libtorrent_exception&){}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1814,15 +1829,27 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
||||
}
|
||||
QNetworkInterface network_iface = QNetworkInterface::interfaceFromName(iface_name);
|
||||
if(!network_iface.isValid()) {
|
||||
qDebug("Invalid network interface: %s", qPrintable(iface_name));
|
||||
addConsoleMessage(tr("The network interface defined is invalid: %1").arg(iface_name), "red");
|
||||
addConsoleMessage(tr("Trying any other network interface available instead."));
|
||||
s->listen_on(ports);
|
||||
return;
|
||||
}
|
||||
QString ip = "127.0.0.1";
|
||||
if(!network_iface.addressEntries().isEmpty()) {
|
||||
ip = network_iface.addressEntries().first().ip().toString();
|
||||
QString ip;
|
||||
qDebug("This network interface has %d IP addresses", network_iface.addressEntries().size());
|
||||
foreach(const QNetworkAddressEntry &entry, network_iface.addressEntries()) {
|
||||
qDebug("Trying to listen on IP %s (%s)", qPrintable(entry.ip().toString()), qPrintable(iface_name));
|
||||
if(s->listen_on(ports, qPrintable(entry.ip().toString()))) {
|
||||
ip = entry.ip().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(s->is_listening()) {
|
||||
addConsoleMessage(tr("Listening on IP address %1 on network interface %2...").arg(ip).arg(iface_name));
|
||||
} else {
|
||||
qDebug("Failed to listen on any of the IP addresses");
|
||||
addConsoleMessage(tr("Failed to listen on network interface %1").arg(iface_name), "red");
|
||||
}
|
||||
qDebug("Listening on interface %s with ip %s", qPrintable(iface_name), qPrintable(ip));
|
||||
s->listen_on(ports, ip.toLocal8Bit().constData());
|
||||
}
|
||||
|
||||
// Set download rate limit
|
||||
@@ -2176,7 +2203,7 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
||||
QTorrentHandle h(p->handle);
|
||||
if(h.is_valid()) {
|
||||
// Attempt to remove old folder if empty
|
||||
const QString& old_save_path = TorrentPersistentData::getPreviousPath(h.hash());
|
||||
const QString old_save_path = TorrentPersistentData::getPreviousPath(h.hash());
|
||||
const QString new_save_path = misc::toQStringU(p->path);
|
||||
qDebug("Torrent moved from %s to %s", qPrintable(old_save_path), qPrintable(new_save_path));
|
||||
QDir old_save_dir(old_save_path);
|
||||
@@ -2254,7 +2281,7 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
||||
else if (file_error_alert* p = dynamic_cast<file_error_alert*>(a.get())) {
|
||||
QTorrentHandle h(p->handle);
|
||||
if(h.is_valid()) {
|
||||
h.auto_managed(false);
|
||||
h.pause();
|
||||
std::cerr << "File Error: " << p->message().c_str() << std::endl;
|
||||
addConsoleMessage(tr("An I/O error occured, '%1' paused.").arg(h.name()));
|
||||
addConsoleMessage(tr("Reason: %1").arg(misc::toQString(p->message())));
|
||||
|
@@ -73,8 +73,12 @@ void CookiesDlg::on_del_btn_clicked() {
|
||||
QList<QByteArray> CookiesDlg::getCookies() const {
|
||||
QList<QByteArray> ret;
|
||||
for(int i=0; i<ui->cookiesTable->rowCount(); ++i) {
|
||||
QString key = ui->cookiesTable->item(i, COOKIE_KEY)->text().trimmed();
|
||||
QString value = ui->cookiesTable->item(i, COOKIE_VALUE)->text().trimmed();
|
||||
QString key;
|
||||
if(ui->cookiesTable->item(i, COOKIE_KEY))
|
||||
key = ui->cookiesTable->item(i, COOKIE_KEY)->text().trimmed();
|
||||
QString value;
|
||||
if(ui->cookiesTable->item(i, COOKIE_VALUE))
|
||||
value = ui->cookiesTable->item(i, COOKIE_VALUE)->text().trimmed();
|
||||
if(!key.isEmpty() && !value.isEmpty()) {
|
||||
const QString raw_cookie = key+"="+value;
|
||||
qDebug("Cookie: %s", qPrintable(raw_cookie));
|
||||
|
@@ -51,7 +51,7 @@ downloadThread::downloadThread(QObject* parent) : QObject(parent) {
|
||||
}
|
||||
|
||||
void downloadThread::processDlFinished(QNetworkReply* reply) {
|
||||
QString url = reply->url().toEncoded().data();
|
||||
QString url = reply->url().toString();
|
||||
qDebug("Download finished: %s", qPrintable(url));
|
||||
if(reply->error() != QNetworkReply::NoError) {
|
||||
// Failure
|
||||
|
@@ -3,11 +3,12 @@
|
||||
|
||||
#include <QFileSystemWatcher>
|
||||
#include <QDir>
|
||||
|
||||
#ifndef Q_WS_WIN
|
||||
#include <QTimer>
|
||||
#include <QPointer>
|
||||
#include <QStringList>
|
||||
#include <QTimer>
|
||||
#include <QHash>
|
||||
|
||||
#ifndef Q_WS_WIN
|
||||
#include <QSet>
|
||||
#include <iostream>
|
||||
#include <errno.h>
|
||||
@@ -19,6 +20,8 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
#ifndef CIFS_MAGIC_NUMBER
|
||||
#define CIFS_MAGIC_NUMBER 0xFF534D42
|
||||
#endif
|
||||
@@ -27,6 +30,9 @@
|
||||
#define NFS_SUPER_MAGIC 0x6969
|
||||
#endif
|
||||
|
||||
const int WATCH_INTERVAL = 10000; // 10 sec
|
||||
const int MAX_PARTIAL_RETRIES = 5;
|
||||
|
||||
/*
|
||||
* Subclassing QFileSystemWatcher in order to support Network File
|
||||
* System watching (NFS, CIFS) on Linux and Mac OS.
|
||||
@@ -39,11 +45,14 @@ private:
|
||||
QList<QDir> watched_folders;
|
||||
QPointer<QTimer> watch_timer;
|
||||
#endif
|
||||
QStringList filters;
|
||||
QStringList m_filters;
|
||||
// Partial torrents
|
||||
QHash<QString, int> m_partialTorrents;
|
||||
QPointer<QTimer> m_partialTorrentTimer;
|
||||
|
||||
#ifndef Q_WS_WIN
|
||||
protected:
|
||||
bool isNetworkFileSystem(QString path) {
|
||||
private:
|
||||
static bool isNetworkFileSystem(QString path) {
|
||||
QString file = path;
|
||||
if(!file.endsWith(QDir::separator()))
|
||||
file += QDir::separator();
|
||||
@@ -99,7 +108,7 @@ protected:
|
||||
|
||||
public:
|
||||
FileSystemWatcher(QObject *parent): QFileSystemWatcher(parent) {
|
||||
filters << "*.torrent";
|
||||
m_filters << "*.torrent";
|
||||
connect(this, SIGNAL(directoryChanged(QString)), this, SLOT(scanLocalFolder(QString)));
|
||||
}
|
||||
|
||||
@@ -108,6 +117,8 @@ public:
|
||||
if(watch_timer)
|
||||
delete watch_timer;
|
||||
#endif
|
||||
if(m_partialTorrentTimer)
|
||||
delete m_partialTorrentTimer;
|
||||
}
|
||||
|
||||
QStringList directories() const {
|
||||
@@ -137,7 +148,7 @@ public:
|
||||
if (!watch_timer) {
|
||||
watch_timer = new QTimer(this);
|
||||
connect(watch_timer, SIGNAL(timeout()), this, SLOT(scanNetworkFolders()));
|
||||
watch_timer->start(5000); // 5 sec
|
||||
watch_timer->start(WATCH_INTERVAL); // 5 sec
|
||||
}
|
||||
} else {
|
||||
#endif
|
||||
@@ -196,21 +207,74 @@ protected slots:
|
||||
#endif
|
||||
}
|
||||
|
||||
void processPartialTorrents() {
|
||||
QStringList no_longer_partial;
|
||||
|
||||
// Check which torrents are still partial
|
||||
foreach(const QString& torrent_path, m_partialTorrents.keys()) {
|
||||
if(!QFile::exists(torrent_path)) {
|
||||
m_partialTorrents.remove(torrent_path);
|
||||
continue;
|
||||
}
|
||||
if(misc::isValidTorrentFile(torrent_path)) {
|
||||
no_longer_partial << torrent_path;
|
||||
m_partialTorrents.remove(torrent_path);
|
||||
} else {
|
||||
if(m_partialTorrents[torrent_path] >= MAX_PARTIAL_RETRIES) {
|
||||
m_partialTorrents.remove(torrent_path);
|
||||
QFile::rename(torrent_path, torrent_path+".invalid");
|
||||
} else {
|
||||
m_partialTorrents[torrent_path]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Stop the partial timer if necessary
|
||||
if(m_partialTorrents.empty()) {
|
||||
m_partialTorrentTimer->stop();
|
||||
m_partialTorrentTimer->deleteLater();
|
||||
qDebug("No longer any partial torrent.");
|
||||
} else {
|
||||
qDebug("Still %d partial torrents after delayed processing.", m_partialTorrents.count());
|
||||
m_partialTorrentTimer->start(WATCH_INTERVAL);
|
||||
}
|
||||
// Notify of new torrents
|
||||
if(!no_longer_partial.isEmpty())
|
||||
emit torrentsAdded(no_longer_partial);
|
||||
}
|
||||
|
||||
signals:
|
||||
void torrentsAdded(QStringList &pathList);
|
||||
|
||||
private:
|
||||
void addTorrentsFromDir(const QDir &dir, QStringList &torrents) {
|
||||
const QStringList files = dir.entryList(filters, QDir::Files, QDir::Unsorted);
|
||||
foreach(const QString &file, files) {
|
||||
#if defined(Q_WS_WIN) || defined(Q_OS_OS2)
|
||||
torrents << dir.absoluteFilePath(file).replace("/", "\\");
|
||||
#else
|
||||
torrents << dir.absoluteFilePath(file);
|
||||
#endif
|
||||
void startPartialTorrentTimer() {
|
||||
Q_ASSERT(!m_partialTorrents.isEmpty());
|
||||
if(!m_partialTorrentTimer) {
|
||||
m_partialTorrentTimer = new QTimer();
|
||||
connect(m_partialTorrentTimer, SIGNAL(timeout()), SLOT(processPartialTorrents()));
|
||||
m_partialTorrentTimer->setSingleShot(true);
|
||||
m_partialTorrentTimer->start(WATCH_INTERVAL);
|
||||
}
|
||||
}
|
||||
|
||||
void addTorrentsFromDir(const QDir &dir, QStringList &torrents) {
|
||||
const QStringList files = dir.entryList(m_filters, QDir::Files, QDir::Unsorted);
|
||||
foreach(const QString &file, files) {
|
||||
const QString file_abspath = dir.absoluteFilePath(file);
|
||||
if(misc::isValidTorrentFile(file_abspath)) {
|
||||
torrents << file_abspath;
|
||||
} else {
|
||||
if(!m_partialTorrents.contains(file_abspath)) {
|
||||
qDebug("Partial torrent detected at: %s", qPrintable(file_abspath));
|
||||
qDebug("Delay the file's processing...");
|
||||
m_partialTorrents.insert(file_abspath, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!m_partialTorrents.empty())
|
||||
startPartialTorrentTimer();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // FILESYSTEMWATCHER_H
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -54,7 +54,7 @@ class HttpConnection : public QObject
|
||||
|
||||
protected slots:
|
||||
void write();
|
||||
virtual void respond();
|
||||
void respond();
|
||||
void respondJson();
|
||||
void respondGenPropertiesJson(QString hash);
|
||||
void respondTrackersPropertiesJson(QString hash);
|
||||
|
@@ -44,7 +44,7 @@ class HttpResponseGenerator : public QHttpResponseHeader
|
||||
void setMessage(const QString message);
|
||||
void stripMessage();
|
||||
void setContentTypeByExt(const QString ext);
|
||||
virtual QByteArray toByteArray() const;
|
||||
QByteArray toByteArray() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -161,6 +161,7 @@
|
||||
<file>Icons/oxygen/encrypted.png</file>
|
||||
<file>Icons/oxygen/folder-remote16.png</file>
|
||||
<file>Icons/oxygen/go-top.png</file>
|
||||
<file>Icons/oxygen/emblem-favorite.png</file>
|
||||
<file>Icons/oxygen/edit_clear.png</file>
|
||||
<file>Icons/oxygen/bug.png</file>
|
||||
<file>Icons/oxygen/gear.png</file>
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
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