mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-01-09 08:37:27 +03:00
c37e5abeff
It was reported that qbittorrent crashes on Mac OS X when user deletes torrents from label view when label filter is active. The callstack of the crash is the following: 1 abort + 129 2 __assert_rtn + 321 3 QTorrentHandle::total_size() const + 124 4 TorrentModelItem::data(int, int) const + 307 5 TorrentModel::data(QModelIndex const&, int) const + 255 6 QSortFilterProxyModel::data(QModelIndex const&, int) const + 109 7 QSortFilterProxyModel::data(QModelIndex const&, int) const + 109 8 QSortFilterProxyModel::data(QModelIndex const&, int) const + 109 9 QItemDelegate::rect(QStyleOptionViewItem const&, QModelIndex const&, int) const + 75 10 QItemDelegate::sizeHint(QStyleOptionViewItem const&, QModelIndex const&) const + 172 11 TransferListDelegate::sizeHint(QStyleOptionViewItem const&, QModelIndex const&) const + 14 12 QTreeView::indexRowSizeHint(QModelIndex const&) const + 887 13 QTreeViewPrivate::layout(int, bool, bool) + 462 14 QTreeView::doItemsLayout() + 356 15 QTreeViewPrivate::updateScrollBars() + 109 16 QTreeView::scrollTo(QModelIndex const&, QAbstractItemView::ScrollHint) + 124 17 TransferListWidget::currentChanged(QModelIndex const&, QModelIndex const&) + 548 18 TransferListWidget::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 641 19 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2196 20 QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(QModelIndex const&, int, int) + 3729 21 QItemSelectionModel::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 398 22 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2196 23 QAbstractItemModel::rowsAboutToBeRemoved(QModelIndex const&, int, int) + 78 24 QAbstractItemModel::beginRemoveRows(QModelIndex const&, int, int) + 106 25 QSortFilterProxyModelPrivate::remove_proxy_interval(QVector<int>&, QVector<int>&, int, int, QModelIndex const&, Qt::Orientation, bool) + 58 26 QSortFilterProxyModelPrivate::remove_source_items(QVector<int>&, QVector<int>&, QVector<int> const&, QModelIndex const&, Qt::Orientation, bool) + 265 27 QSortFilterProxyModelPrivate::source_items_about_to_be_removed(QModelIndex const&, int, int, Qt::Orientation) + 232 28 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2196 29 QAbstractItemModel::rowsAboutToBeRemoved(QModelIndex const&, int, int) + 78 30 QAbstractItemModel::beginRemoveRows(QModelIndex const&, int, int) + 106 31 QSortFilterProxyModelPrivate::remove_proxy_interval(QVector<int>&, QVector<int>&, int, int, QModelIndex const&, Qt::Orientation, bool) + 58 32 QSortFilterProxyModelPrivate::remove_source_items(QVector<int>&, QVector<int>&, QVector<int> const&, QModelIndex const&, Qt::Orientation, bool) + 265 33 QSortFilterProxyModelPrivate::source_items_about_to_be_removed(QModelIndex const&, int, int, Qt::Orientation) + 232 34 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2196 35 QAbstractItemModel::rowsAboutToBeRemoved(QModelIndex const&, int, int) + 78 36 QAbstractItemModel::beginRemoveRows(QModelIndex const&, int, int) + 106 37 QSortFilterProxyModelPrivate::remove_proxy_interval(QVector<int>&, QVector<int>&, int, int, QModelIndex const&, Qt::Orientation, bool) + 58 38 QSortFilterProxyModelPrivate::remove_source_items(QVector<int>&, QVector<int>&, QVector<int> const&, QModelIndex const&, Qt::Orientation, bool) + 265 39 QSortFilterProxyModelPrivate::source_items_about_to_be_removed(QModelIndex const&, int, int, Qt::Orientation) + 232 40 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2196 41 QAbstractItemModel::rowsAboutToBeRemoved(QModelIndex const&, int, int) + 78 42 QAbstractItemModel::beginRemoveRows(QModelIndex const&, int, int) + 106 43 TorrentModel::removeTorrent(QString const&) + 81 44 TorrentModel::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 345 45 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2196 46 QBtSession::deletedTorrent(QString const&) + 56 47 QBtSession::deleteTorrent(QString const&, bool) + 2855 48 TransferListWidget::deleteSelectedTorrents() + 292 49 TransferListWidget::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 230 50 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2196 51 QAction::activate(QAction::ActionEvent) + 227 52 QMenuPrivate::activateCausedStack(QList<QPointer<QWidget> > const&, QAction*, QAction::ActionEvent, bool) + 77 53 QMenuPrivate::activateAction(QAction*, QAction::ActionEvent, bool) + 470 54 QWidget::event(QEvent*) + 687 55 QMenu::event(QEvent*) + 617 56 QApplicationPrivate::notify_helper(QObject*, QEvent*) + 194 57 QApplication::notify(QObject*, QEvent*) + 2716 58 SessionApplication::notify(QObject*, QEvent*) + 21 59 QCoreApplication::notifyInternal(QObject*, QEvent*) + 118 60 QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) + 448 61 qt_mac_handleMouseEvent(NSEvent*, QEvent::Type, Qt::MouseButton, QWidget*, bool) + 1300 62 -[NSWindow _reallySendEvent:] + 759 63 -[NSWindow sendEvent:] + 368 64 -[QCocoaPanel sendEvent:] + 113 65 -[NSApplication sendEvent:] + 2238 66 -[QNSApplication sendEvent:] + 97 67 -[NSApplication run] + 711 68 QEventDispatcherMac::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 1522 69 QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 77 70 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 370 71 QMenu::exec(QPoint const&, QAction*) + 103 72 TransferListWidget::displayListMenu(QPoint const&) + 8741 73 TransferListWidget::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 622 74 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2196 75 QWidget::event(QEvent*) + 3082 76 QFrame::event(QEvent*) + 45 77 QAbstractScrollArea::viewportEvent(QEvent*) + 108 78 QAbstractItemView::viewportEvent(QEvent*) + 1390 79 QTreeView::viewportEvent(QEvent*) + 218 80 QAbstractScrollAreaFilter::eventFilter(QObject*, QEvent*) + 37 81 QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) + 115 82 QApplicationPrivate::notify_helper(QObject*, QEvent*) + 178 83 QApplication::notify(QObject*, QEvent*) + 5742 84 SessionApplication::notify(QObject*, QEvent*) + 21 85 QCoreApplication::notifyInternal(QObject*, QEvent*) + 118 86 qt_sendSpontaneousEvent(QObject*, QEvent*) + 45 87 qt_mac_handleMouseEvent(NSEvent*, QEvent::Type, Qt::MouseButton, QWidget*, bool) + 1378 88 -[NSWindow _reallySendEvent:] + 5682 89 -[NSWindow sendEvent:] + 368 90 -[QCocoaWindow sendEvent:] + 113 91 -[NSApplication sendEvent:] + 2238 92 -[QNSApplication sendEvent:] + 97 93 -[NSApplication run] + 711 94 QEventDispatcherMac::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 1522 95 QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 77 96 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 370 97 QCoreApplication::exec() + 199 98 main + 3415 99 start + 52 As we can see the user deleted some torrent (48). QBtSession deleted the torrent from libtorrent::session (47) and emitted a signal (46), about torrent deletion. In responce to the signal (43) the TorrentModel notifies (42) its views about a change. After a long chain of notifications (42-6) the view requested (5) a value of total_size from TorrentModel. QTorrentHandle is already invalid as the torrent was removed in (47). So we've got a crash in (3). The fix is relatively straightforward: do notify TorrentModel about removal not after, but before torrent is removed from libtorrent::session. This commit does the same thing to TorrentSpeedMonitor. This bug reveals a major flaw in a design: currently we have a several components all subscribed to the torrent removal signal. Signal is delivered to them in arbitrary order, but they access each other in the handlers of this signal. E.g. TorrentModel can access TorrentSpeedMonitor. This doesn't lead to a crash because TorrentSpeedMonitor returns MAX_ETA when ETA is queried for unknown torrent.
357 lines
14 KiB
C++
Executable file
357 lines
14 KiB
C++
Executable file
/*
|
|
* 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.
|
|
*
|
|
* In addition, as a special exception, the copyright holders give permission to
|
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
|
* and distribute the linked executables. You must obey the GNU General Public
|
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
|
* modify file(s), you may extend this exception to your version of the file(s),
|
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
|
* exception statement from your version.
|
|
*
|
|
* Contact : chris@qbittorrent.org
|
|
*/
|
|
#ifndef __BITTORRENT_H__
|
|
#define __BITTORRENT_H__
|
|
|
|
#include <QMap>
|
|
#include <QHash>
|
|
#include <QUrl>
|
|
#include <QStringList>
|
|
#ifdef DISABLE_GUI
|
|
#include <QCoreApplication>
|
|
#else
|
|
#include <QApplication>
|
|
#include <QPalette>
|
|
#endif
|
|
#include <QPointer>
|
|
#include <QTimer>
|
|
#include <QNetworkCookie>
|
|
|
|
#include <libtorrent/version.hpp>
|
|
|
|
#include "qtorrenthandle.h"
|
|
#include "trackerinfos.h"
|
|
#include "misc.h"
|
|
|
|
namespace libtorrent {
|
|
struct add_torrent_params;
|
|
struct pe_settings;
|
|
struct proxy_settings;
|
|
class session;
|
|
struct session_status;
|
|
|
|
class alert;
|
|
struct torrent_finished_alert;
|
|
struct save_resume_data_alert;
|
|
struct file_renamed_alert;
|
|
struct torrent_deleted_alert;
|
|
struct storage_moved_alert;
|
|
struct storage_moved_failed_alert;
|
|
struct metadata_received_alert;
|
|
struct file_error_alert;
|
|
struct file_completed_alert;
|
|
struct torrent_paused_alert;
|
|
struct tracker_error_alert;
|
|
struct tracker_reply_alert;
|
|
struct tracker_warning_alert;
|
|
struct portmap_error_alert;
|
|
struct portmap_alert;
|
|
struct peer_blocked_alert;
|
|
struct peer_ban_alert;
|
|
struct fastresume_rejected_alert;
|
|
struct url_seed_alert;
|
|
struct listen_succeeded_alert;
|
|
struct listen_failed_alert;
|
|
struct torrent_checked_alert;
|
|
struct external_ip_alert;
|
|
struct state_update_alert;
|
|
struct stats_alert;
|
|
|
|
#if LIBTORRENT_VERSION_NUM < 10000
|
|
class upnp;
|
|
class natpmp;
|
|
#endif
|
|
}
|
|
|
|
class DownloadThread;
|
|
class FilterParserThread;
|
|
class HttpServer;
|
|
class BandwidthScheduler;
|
|
class ScanFoldersModel;
|
|
class TorrentSpeedMonitor;
|
|
class TorrentStatistics;
|
|
class DNSUpdater;
|
|
class QAlertDispatcher;
|
|
|
|
const int MAX_LOG_MESSAGES = 1000;
|
|
|
|
enum TorrentExportFolder {
|
|
RegularTorrentExportFolder,
|
|
FinishedTorrentExportFolder
|
|
};
|
|
|
|
class QTracker;
|
|
|
|
class QBtSession : public QObject {
|
|
Q_OBJECT
|
|
Q_DISABLE_COPY(QBtSession)
|
|
|
|
public:
|
|
static const qreal MAX_RATIO;
|
|
|
|
private:
|
|
explicit QBtSession();
|
|
static QBtSession* m_instance;
|
|
|
|
public:
|
|
static QBtSession* instance();
|
|
static void drop();
|
|
~QBtSession();
|
|
QTorrentHandle getTorrentHandle(const QString &hash) const;
|
|
std::vector<libtorrent::torrent_handle> getTorrents() const;
|
|
bool isFilePreviewPossible(const QString& hash) const;
|
|
qreal getPayloadDownloadRate() const;
|
|
qreal getPayloadUploadRate() const;
|
|
libtorrent::session_status getSessionStatus() const;
|
|
int getListenPort() const;
|
|
qreal getRealRatio(const libtorrent::torrent_status &status) const;
|
|
QHash<QString, TrackerInfos> getTrackersInfo(const QString &hash) const;
|
|
bool hasActiveTorrents() const;
|
|
bool hasDownloadingTorrents() const;
|
|
//int getMaximumActiveDownloads() const;
|
|
//int getMaximumActiveTorrents() const;
|
|
inline QStringList getConsoleMessages() const { return consoleMessages; }
|
|
inline QStringList getPeerBanMessages() const { return peerBanMessages; }
|
|
inline libtorrent::session* getSession() const { return s; }
|
|
inline bool useTemporaryFolder() const { return !defaultTempPath.isEmpty(); }
|
|
inline QString getDefaultSavePath() const { return defaultSavePath; }
|
|
inline ScanFoldersModel* getScanFoldersModel() const { return m_scanFolders; }
|
|
inline bool isDHTEnabled() const { return DHTEnabled; }
|
|
inline bool isLSDEnabled() const { return LSDEnabled; }
|
|
inline bool isPexEnabled() const { return PeXEnabled; }
|
|
inline bool isQueueingEnabled() const { return queueingEnabled; }
|
|
quint64 getAlltimeDL() const;
|
|
quint64 getAlltimeUL() const;
|
|
void postTorrentUpdate();
|
|
|
|
public slots:
|
|
QTorrentHandle addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false, bool imported = false);
|
|
QTorrentHandle addMagnetUri(QString magnet_uri, bool resumed=false, bool fromScanDir=false, const QString &filePath=QString());
|
|
void loadSessionState();
|
|
void saveSessionState();
|
|
void downloadFromUrl(const QString &url, const QList<QNetworkCookie>& cookies = QList<QNetworkCookie>());
|
|
void deleteTorrent(const QString &hash, bool delete_local_files = false);
|
|
void startUpTorrents();
|
|
void recheckTorrent(const QString &hash);
|
|
void useAlternativeSpeedsLimit(bool alternative);
|
|
qlonglong getETA(const QString& hash, const libtorrent::torrent_status &status) const;
|
|
/* Needed by Web UI */
|
|
void pauseAllTorrents();
|
|
void pauseTorrent(const QString &hash);
|
|
void resumeTorrent(const QString &hash);
|
|
void resumeAllTorrents();
|
|
/* End Web UI */
|
|
void preAllocateAllFiles(bool b);
|
|
void saveFastResumeData();
|
|
void enableIPFilter(const QString &filter_path, bool force=false);
|
|
void disableIPFilter();
|
|
void setQueueingEnabled(bool enable);
|
|
void handleDownloadFailure(QString url, QString reason);
|
|
void handleMagnetRedirect(const QString &url_new, const QString &url_old);
|
|
void downloadUrlAndSkipDialog(QString url, QString save_path=QString(), QString label=QString(), const QList<QNetworkCookie>& cookies = QList<QNetworkCookie>());
|
|
// Session configuration - Setters
|
|
void setListeningPort(int port);
|
|
void setMaxConnectionsPerTorrent(int max);
|
|
void setMaxUploadsPerTorrent(int max);
|
|
void setDownloadRateLimit(long rate);
|
|
void setUploadRateLimit(long rate);
|
|
void setGlobalMaxRatio(qreal ratio);
|
|
qreal getGlobalMaxRatio() const { return global_ratio_limit; }
|
|
void setMaxRatioPerTorrent(const QString &hash, qreal ratio);
|
|
qreal getMaxRatioPerTorrent(const QString &hash, bool *usesGlobalRatio) const;
|
|
void removeRatioPerTorrent(const QString &hash);
|
|
void setDefaultSavePath(const QString &savepath);
|
|
void setDefaultTempPath(const QString &temppath);
|
|
void setAppendLabelToSavePath(bool append);
|
|
void appendLabelToTorrentSavePath(const QTorrentHandle &h);
|
|
void changeLabelInTorrentSavePath(const QTorrentHandle &h, QString old_label, QString new_label);
|
|
void appendqBextensionToTorrent(const QTorrentHandle &h, bool append);
|
|
void setAppendqBExtension(bool append);
|
|
void setDownloadLimit(QString hash, long val);
|
|
void setUploadLimit(QString hash, long val);
|
|
void enableUPnP(bool b);
|
|
void enableLSD(bool b);
|
|
void enableDHT(bool b);
|
|
#ifdef DISABLE_GUI
|
|
void addConsoleMessage(QString msg, QString color=QString::null);
|
|
#else
|
|
void addConsoleMessage(QString msg, QColor color=QApplication::palette().color(QPalette::WindowText));
|
|
#endif
|
|
void addPeerBanMessage(QString msg, bool from_ipfilter);
|
|
void clearConsoleMessages() { consoleMessages.clear(); }
|
|
void clearPeerBanMessages() { peerBanMessages.clear(); }
|
|
void processDownloadedFile(QString, QString);
|
|
void addMagnetSkipAddDlg(const QString& uri, const QString& save_path = QString(), const QString& label = QString(), const QString &uri_old = QString());
|
|
void addMagnetInteractive(const QString& uri);
|
|
void downloadFromURLList(const QStringList& urls);
|
|
void configureSession();
|
|
void banIP(QString ip);
|
|
void recursiveTorrentDownload(const QTorrentHandle &h);
|
|
void unhideMagnet(const QString &hash);
|
|
|
|
private:
|
|
void applyEncryptionSettings(libtorrent::pe_settings se);
|
|
void setProxySettings(libtorrent::proxy_settings proxySettings);
|
|
void setSessionSettings(const libtorrent::session_settings &sessionSettings);
|
|
QString getSavePath(const QString &hash, bool fromScanDir = false, QString filePath = QString::null, bool imported = false);
|
|
bool loadFastResumeData(const QString &hash, std::vector<char> &buf);
|
|
void loadTorrentSettings(QTorrentHandle &h);
|
|
void loadTorrentTempData(QTorrentHandle &h, QString savePath, bool magnet);
|
|
void initializeAddTorrentParams(const QString &hash, libtorrent::add_torrent_params &p);
|
|
void updateRatioTimer();
|
|
void recoverPersistentData(const QString &hash, const std::vector<char> &buf);
|
|
void backupPersistentData(const QString &hash, boost::shared_ptr<libtorrent::entry> data);
|
|
void handleAlert(libtorrent::alert* a);
|
|
void handleTorrentFinishedAlert(libtorrent::torrent_finished_alert* p);
|
|
void handleSaveResumeDataAlert(libtorrent::save_resume_data_alert* p);
|
|
void handleFileRenamedAlert(libtorrent::file_renamed_alert* p);
|
|
void handleTorrentDeletedAlert(libtorrent::torrent_deleted_alert* p);
|
|
void handleStorageMovedAlert(libtorrent::storage_moved_alert* p);
|
|
void handleStorageMovedFailedAlert(libtorrent::storage_moved_failed_alert* p);
|
|
void handleMetadataReceivedAlert(libtorrent::metadata_received_alert* p);
|
|
void handleFileErrorAlert(libtorrent::file_error_alert* p);
|
|
void handleFileCompletedAlert(libtorrent::file_completed_alert* p);
|
|
void handleTorrentPausedAlert(libtorrent::torrent_paused_alert* p);
|
|
void handleTrackerErrorAlert(libtorrent::tracker_error_alert* p);
|
|
void handleTrackerReplyAlert(libtorrent::tracker_reply_alert* p);
|
|
void handleTrackerWarningAlert(libtorrent::tracker_warning_alert* p);
|
|
void handlePortmapWarningAlert(libtorrent::portmap_error_alert* p);
|
|
void handlePortmapAlert(libtorrent::portmap_alert* p);
|
|
void handlePeerBlockedAlert(libtorrent::peer_blocked_alert* p);
|
|
void handlePeerBanAlert(libtorrent::peer_ban_alert* p);
|
|
void handleFastResumeRejectedAlert(libtorrent::fastresume_rejected_alert* p);
|
|
void handleUrlSeedAlert(libtorrent::url_seed_alert* p);
|
|
void handleListenSucceededAlert(libtorrent::listen_succeeded_alert *p);
|
|
void handleListenFailedAlert(libtorrent::listen_failed_alert *p);
|
|
void handleTorrentCheckedAlert(libtorrent::torrent_checked_alert* p);
|
|
void handleExternalIPAlert(libtorrent::external_ip_alert *p);
|
|
void handleStateUpdateAlert(libtorrent::state_update_alert *p);
|
|
void handleStatsAlert(libtorrent::stats_alert *p);
|
|
|
|
private slots:
|
|
void addTorrentsFromScanFolder(QStringList&);
|
|
void readAlerts();
|
|
void processBigRatios();
|
|
void exportTorrentFiles(QString path);
|
|
void saveTempFastResumeData();
|
|
void sendNotificationEmail(const QTorrentHandle &h);
|
|
void autoRunExternalProgram(const QTorrentHandle &h);
|
|
void mergeTorrents(QTorrentHandle& h_ex, boost::intrusive_ptr<libtorrent::torrent_info> t);
|
|
void mergeTorrents(QTorrentHandle& h_ex, const QString& magnet_uri);
|
|
void exportTorrentFile(const QTorrentHandle &h, TorrentExportFolder folder = RegularTorrentExportFolder);
|
|
void initWebUi();
|
|
void handleIPFilterParsed(int ruleCount);
|
|
void handleIPFilterError();
|
|
|
|
signals:
|
|
void addedTorrent(const QTorrentHandle& h);
|
|
void torrentAboutToBeRemoved(const QTorrentHandle &h);
|
|
void pausedTorrent(const QTorrentHandle& h);
|
|
void resumedTorrent(const QTorrentHandle& h);
|
|
void finishedTorrent(const QTorrentHandle& h);
|
|
void fullDiskError(const QTorrentHandle& h, QString msg);
|
|
void trackerError(const QString &hash, QString time, QString msg);
|
|
void trackerAuthenticationRequired(const QTorrentHandle& h);
|
|
void newDownloadedTorrent(QString path, QString url);
|
|
void newDownloadedTorrentFromRss(QString url);
|
|
void newMagnetLink(const QString& link);
|
|
void updateFileSize(const QString &hash);
|
|
void downloadFromUrlFailure(QString url, QString reason);
|
|
void torrentFinishedChecking(const QTorrentHandle& h);
|
|
void metadataReceived(const QTorrentHandle &h);
|
|
void savePathChanged(const QTorrentHandle &h);
|
|
void newConsoleMessage(const QString &msg);
|
|
void newBanMessage(const QString &msg);
|
|
void alternativeSpeedsModeChanged(bool alternative);
|
|
void recursiveTorrentDownloadPossible(const QTorrentHandle &h);
|
|
void ipFilterParsed(bool error, int ruleCount);
|
|
void metadataReceivedHidden(const QTorrentHandle &h);
|
|
void stateUpdate(const std::vector<libtorrent::torrent_status> &statuses);
|
|
void statsReceived(const libtorrent::stats_alert&);
|
|
|
|
private:
|
|
// Bittorrent
|
|
libtorrent::session *s;
|
|
QPointer<BandwidthScheduler> bd_scheduler;
|
|
QMap<QUrl, QPair<QString, QString> > savepathLabel_fromurl; // Use QMap for compatibility with Qt < 4.7: qHash(QUrl)
|
|
QHash<QString, QHash<QString, TrackerInfos> > trackersInfos;
|
|
QHash<QString, QString> savePathsToRemove;
|
|
QStringList torrentsToPausedAfterChecking;
|
|
QTimer resumeDataTimer;
|
|
// Ratio
|
|
QPointer<QTimer> BigRatioTimer;
|
|
// HTTP
|
|
DownloadThread* downloader;
|
|
// File System
|
|
ScanFoldersModel *m_scanFolders;
|
|
// Console / Log
|
|
QStringList consoleMessages;
|
|
QStringList peerBanMessages;
|
|
// Settings
|
|
bool preAllocateAll;
|
|
qreal global_ratio_limit;
|
|
int high_ratio_action;
|
|
bool LSDEnabled;
|
|
bool DHTEnabled;
|
|
bool PeXEnabled;
|
|
bool queueingEnabled;
|
|
bool appendLabelToSavePath;
|
|
bool m_torrentExportEnabled;
|
|
bool m_finishedTorrentExportEnabled;
|
|
bool appendqBExtension;
|
|
QString defaultSavePath;
|
|
QString defaultTempPath;
|
|
// IP filtering
|
|
QPointer<FilterParserThread> filterParser;
|
|
QString filterPath;
|
|
// Web UI
|
|
QPointer<HttpServer> httpServer;
|
|
QList<QUrl> url_skippingDlg;
|
|
// GeoIP
|
|
#ifndef DISABLE_GUI
|
|
bool geoipDBLoaded;
|
|
bool resolve_countries;
|
|
#endif
|
|
// Tracker
|
|
QPointer<QTracker> m_tracker;
|
|
TorrentSpeedMonitor *m_speedMonitor;
|
|
shutDownAction m_shutdownAct;
|
|
// Port forwarding
|
|
#if LIBTORRENT_VERSION_NUM < 10000
|
|
libtorrent::upnp *m_upnp;
|
|
libtorrent::natpmp *m_natpmp;
|
|
#endif
|
|
// DynDNS
|
|
DNSUpdater *m_dynDNSUpdater;
|
|
QAlertDispatcher* m_alertDispatcher;
|
|
TorrentStatistics* m_torrentStatistics;
|
|
};
|
|
|
|
#endif
|