1
0
mirror of https://github.com/d47081/qBittorrent.git synced 2025-01-23 13:04:23 +00:00
2022-09-29 06:49:34 +03:00

470 lines
22 KiB
C++

/*
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2015-2022 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
*
* 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.
*/
#pragma once
#include <QtContainerFwd>
#include <QObject>
#include "base/pathfwd.h"
#include "addtorrentparams.h"
#include "categoryoptions.h"
#include "trackerentry.h"
class QString;
// These values should remain unchanged when adding new items
// so as not to break the existing user settings.
enum MaxRatioAction
{
Pause = 0,
Remove = 1,
DeleteFiles = 3,
EnableSuperSeeding = 2
};
enum DeleteOption
{
DeleteTorrent,
DeleteTorrentAndFiles
};
namespace BitTorrent
{
class InfoHash;
class MagnetUri;
class Torrent;
class TorrentID;
class TorrentInfo;
struct CacheStatus;
struct SessionStatus;
// Using `Q_ENUM_NS()` without a wrapper namespace in our case is not advised
// since `Q_NAMESPACE` cannot be used when the same namespace resides at different files.
// https://www.kdab.com/new-qt-5-8-meta-object-support-namespaces/#comment-143779
inline namespace SessionSettingsEnums
{
Q_NAMESPACE
enum class BTProtocol : int
{
Both = 0,
TCP = 1,
UTP = 2
};
Q_ENUM_NS(BTProtocol)
enum class ChokingAlgorithm : int
{
FixedSlots = 0,
RateBased = 1
};
Q_ENUM_NS(ChokingAlgorithm)
enum class DiskIOReadMode : int
{
DisableOSCache = 0,
EnableOSCache = 1
};
Q_ENUM_NS(DiskIOReadMode)
enum class DiskIOType : int
{
Default = 0,
MMap = 1,
Posix = 2
};
Q_ENUM_NS(DiskIOType)
enum class DiskIOWriteMode : int
{
DisableOSCache = 0,
EnableOSCache = 1,
#ifdef QBT_USES_LIBTORRENT2
WriteThrough = 2
#endif
};
Q_ENUM_NS(DiskIOWriteMode)
enum class MixedModeAlgorithm : int
{
TCP = 0,
Proportional = 1
};
Q_ENUM_NS(MixedModeAlgorithm)
enum class SeedChokingAlgorithm : int
{
RoundRobin = 0,
FastestUpload = 1,
AntiLeech = 2
};
Q_ENUM_NS(SeedChokingAlgorithm)
enum class ResumeDataStorageType
{
Legacy,
SQLite
};
Q_ENUM_NS(ResumeDataStorageType)
}
class Session : public QObject
{
Q_OBJECT
Q_DISABLE_COPY_MOVE(Session)
public:
static void initInstance();
static void freeInstance();
static Session *instance();
using QObject::QObject;
virtual Path savePath() const = 0;
virtual void setSavePath(const Path &path) = 0;
virtual Path downloadPath() const = 0;
virtual void setDownloadPath(const Path &path) = 0;
virtual bool isDownloadPathEnabled() const = 0;
virtual void setDownloadPathEnabled(bool enabled) = 0;
static bool isValidCategoryName(const QString &name);
// returns category itself and all top level categories
static QStringList expandCategory(const QString &category);
virtual QStringList categories() const = 0;
virtual CategoryOptions categoryOptions(const QString &categoryName) const = 0;
virtual Path categorySavePath(const QString &categoryName) const = 0;
virtual Path categoryDownloadPath(const QString &categoryName) const = 0;
virtual bool addCategory(const QString &name, const CategoryOptions &options = {}) = 0;
virtual bool editCategory(const QString &name, const CategoryOptions &options) = 0;
virtual bool removeCategory(const QString &name) = 0;
virtual bool isSubcategoriesEnabled() const = 0;
virtual void setSubcategoriesEnabled(bool value) = 0;
virtual bool useCategoryPathsInManualMode() const = 0;
virtual void setUseCategoryPathsInManualMode(bool value) = 0;
static bool isValidTag(const QString &tag);
virtual QSet<QString> tags() const = 0;
virtual bool hasTag(const QString &tag) const = 0;
virtual bool addTag(const QString &tag) = 0;
virtual bool removeTag(const QString &tag) = 0;
// Torrent Management Mode subsystem (TMM)
//
// Each torrent can be either in Manual mode or in Automatic mode
// In Manual Mode various torrent properties are set explicitly(eg save path)
// In Automatic Mode various torrent properties are set implicitly(eg save path)
// based on the associated category.
// In Automatic Mode torrent save path can be changed in following cases:
// 1. Default save path changed
// 2. Torrent category save path changed
// 3. Torrent category changed
// (unless otherwise is specified)
virtual bool isAutoTMMDisabledByDefault() const = 0;
virtual void setAutoTMMDisabledByDefault(bool value) = 0;
virtual bool isDisableAutoTMMWhenCategoryChanged() const = 0;
virtual void setDisableAutoTMMWhenCategoryChanged(bool value) = 0;
virtual bool isDisableAutoTMMWhenDefaultSavePathChanged() const = 0;
virtual void setDisableAutoTMMWhenDefaultSavePathChanged(bool value) = 0;
virtual bool isDisableAutoTMMWhenCategorySavePathChanged() const = 0;
virtual void setDisableAutoTMMWhenCategorySavePathChanged(bool value) = 0;
virtual qreal globalMaxRatio() const = 0;
virtual void setGlobalMaxRatio(qreal ratio) = 0;
virtual int globalMaxSeedingMinutes() const = 0;
virtual void setGlobalMaxSeedingMinutes(int minutes) = 0;
virtual bool isDHTEnabled() const = 0;
virtual void setDHTEnabled(bool enabled) = 0;
virtual bool isLSDEnabled() const = 0;
virtual void setLSDEnabled(bool enabled) = 0;
virtual bool isPeXEnabled() const = 0;
virtual void setPeXEnabled(bool enabled) = 0;
virtual bool isAddTorrentPaused() const = 0;
virtual void setAddTorrentPaused(bool value) = 0;
virtual TorrentContentLayout torrentContentLayout() const = 0;
virtual void setTorrentContentLayout(TorrentContentLayout value) = 0;
virtual bool isTrackerEnabled() const = 0;
virtual void setTrackerEnabled(bool enabled) = 0;
virtual bool isAppendExtensionEnabled() const = 0;
virtual void setAppendExtensionEnabled(bool enabled) = 0;
virtual int refreshInterval() const = 0;
virtual void setRefreshInterval(int value) = 0;
virtual bool isPreallocationEnabled() const = 0;
virtual void setPreallocationEnabled(bool enabled) = 0;
virtual Path torrentExportDirectory() const = 0;
virtual void setTorrentExportDirectory(const Path &path) = 0;
virtual Path finishedTorrentExportDirectory() const = 0;
virtual void setFinishedTorrentExportDirectory(const Path &path) = 0;
virtual int globalDownloadSpeedLimit() const = 0;
virtual void setGlobalDownloadSpeedLimit(int limit) = 0;
virtual int globalUploadSpeedLimit() const = 0;
virtual void setGlobalUploadSpeedLimit(int limit) = 0;
virtual int altGlobalDownloadSpeedLimit() const = 0;
virtual void setAltGlobalDownloadSpeedLimit(int limit) = 0;
virtual int altGlobalUploadSpeedLimit() const = 0;
virtual void setAltGlobalUploadSpeedLimit(int limit) = 0;
virtual int downloadSpeedLimit() const = 0;
virtual void setDownloadSpeedLimit(int limit) = 0;
virtual int uploadSpeedLimit() const = 0;
virtual void setUploadSpeedLimit(int limit) = 0;
virtual bool isAltGlobalSpeedLimitEnabled() const = 0;
virtual void setAltGlobalSpeedLimitEnabled(bool enabled) = 0;
virtual bool isBandwidthSchedulerEnabled() const = 0;
virtual void setBandwidthSchedulerEnabled(bool enabled) = 0;
virtual bool isPerformanceWarningEnabled() const = 0;
virtual void setPerformanceWarningEnabled(bool enable) = 0;
virtual int saveResumeDataInterval() const = 0;
virtual void setSaveResumeDataInterval(int value) = 0;
virtual int port() const = 0;
virtual void setPort(int port) = 0;
virtual QString networkInterface() const = 0;
virtual void setNetworkInterface(const QString &iface) = 0;
virtual QString networkInterfaceName() const = 0;
virtual void setNetworkInterfaceName(const QString &name) = 0;
virtual QString networkInterfaceAddress() const = 0;
virtual void setNetworkInterfaceAddress(const QString &address) = 0;
virtual int encryption() const = 0;
virtual void setEncryption(int state) = 0;
virtual int maxActiveCheckingTorrents() const = 0;
virtual void setMaxActiveCheckingTorrents(int val) = 0;
virtual bool isProxyPeerConnectionsEnabled() const = 0;
virtual void setProxyPeerConnectionsEnabled(bool enabled) = 0;
virtual ChokingAlgorithm chokingAlgorithm() const = 0;
virtual void setChokingAlgorithm(ChokingAlgorithm mode) = 0;
virtual SeedChokingAlgorithm seedChokingAlgorithm() const = 0;
virtual void setSeedChokingAlgorithm(SeedChokingAlgorithm mode) = 0;
virtual bool isAddTrackersEnabled() const = 0;
virtual void setAddTrackersEnabled(bool enabled) = 0;
virtual QString additionalTrackers() const = 0;
virtual void setAdditionalTrackers(const QString &trackers) = 0;
virtual bool isIPFilteringEnabled() const = 0;
virtual void setIPFilteringEnabled(bool enabled) = 0;
virtual Path IPFilterFile() const = 0;
virtual void setIPFilterFile(const Path &path) = 0;
virtual bool announceToAllTrackers() const = 0;
virtual void setAnnounceToAllTrackers(bool val) = 0;
virtual bool announceToAllTiers() const = 0;
virtual void setAnnounceToAllTiers(bool val) = 0;
virtual int peerTurnover() const = 0;
virtual void setPeerTurnover(int val) = 0;
virtual int peerTurnoverCutoff() const = 0;
virtual void setPeerTurnoverCutoff(int val) = 0;
virtual int peerTurnoverInterval() const = 0;
virtual void setPeerTurnoverInterval(int val) = 0;
virtual int requestQueueSize() const = 0;
virtual void setRequestQueueSize(int val) = 0;
virtual int asyncIOThreads() const = 0;
virtual void setAsyncIOThreads(int num) = 0;
virtual int hashingThreads() const = 0;
virtual void setHashingThreads(int num) = 0;
virtual int filePoolSize() const = 0;
virtual void setFilePoolSize(int size) = 0;
virtual int checkingMemUsage() const = 0;
virtual void setCheckingMemUsage(int size) = 0;
virtual int diskCacheSize() const = 0;
virtual void setDiskCacheSize(int size) = 0;
virtual int diskCacheTTL() const = 0;
virtual void setDiskCacheTTL(int ttl) = 0;
virtual qint64 diskQueueSize() const = 0;
virtual void setDiskQueueSize(qint64 size) = 0;
virtual DiskIOType diskIOType() const = 0;
virtual void setDiskIOType(DiskIOType type) = 0;
virtual DiskIOReadMode diskIOReadMode() const = 0;
virtual void setDiskIOReadMode(DiskIOReadMode mode) = 0;
virtual DiskIOWriteMode diskIOWriteMode() const = 0;
virtual void setDiskIOWriteMode(DiskIOWriteMode mode) = 0;
virtual bool isCoalesceReadWriteEnabled() const = 0;
virtual void setCoalesceReadWriteEnabled(bool enabled) = 0;
virtual bool usePieceExtentAffinity() const = 0;
virtual void setPieceExtentAffinity(bool enabled) = 0;
virtual bool isSuggestModeEnabled() const = 0;
virtual void setSuggestMode(bool mode) = 0;
virtual int sendBufferWatermark() const = 0;
virtual void setSendBufferWatermark(int value) = 0;
virtual int sendBufferLowWatermark() const = 0;
virtual void setSendBufferLowWatermark(int value) = 0;
virtual int sendBufferWatermarkFactor() const = 0;
virtual void setSendBufferWatermarkFactor(int value) = 0;
virtual int connectionSpeed() const = 0;
virtual void setConnectionSpeed(int value) = 0;
virtual int socketBacklogSize() const = 0;
virtual void setSocketBacklogSize(int value) = 0;
virtual bool isAnonymousModeEnabled() const = 0;
virtual void setAnonymousModeEnabled(bool enabled) = 0;
virtual bool isQueueingSystemEnabled() const = 0;
virtual void setQueueingSystemEnabled(bool enabled) = 0;
virtual bool ignoreSlowTorrentsForQueueing() const = 0;
virtual void setIgnoreSlowTorrentsForQueueing(bool ignore) = 0;
virtual int downloadRateForSlowTorrents() const = 0;
virtual void setDownloadRateForSlowTorrents(int rateInKibiBytes) = 0;
virtual int uploadRateForSlowTorrents() const = 0;
virtual void setUploadRateForSlowTorrents(int rateInKibiBytes) = 0;
virtual int slowTorrentsInactivityTimer() const = 0;
virtual void setSlowTorrentsInactivityTimer(int timeInSeconds) = 0;
virtual int outgoingPortsMin() const = 0;
virtual void setOutgoingPortsMin(int min) = 0;
virtual int outgoingPortsMax() const = 0;
virtual void setOutgoingPortsMax(int max) = 0;
virtual int UPnPLeaseDuration() const = 0;
virtual void setUPnPLeaseDuration(int duration) = 0;
virtual int peerToS() const = 0;
virtual void setPeerToS(int value) = 0;
virtual bool ignoreLimitsOnLAN() const = 0;
virtual void setIgnoreLimitsOnLAN(bool ignore) = 0;
virtual bool includeOverheadInLimits() const = 0;
virtual void setIncludeOverheadInLimits(bool include) = 0;
virtual QString announceIP() const = 0;
virtual void setAnnounceIP(const QString &ip) = 0;
virtual int maxConcurrentHTTPAnnounces() const = 0;
virtual void setMaxConcurrentHTTPAnnounces(int value) = 0;
virtual bool isReannounceWhenAddressChangedEnabled() const = 0;
virtual void setReannounceWhenAddressChangedEnabled(bool enabled) = 0;
virtual void reannounceToAllTrackers() const = 0;
virtual int stopTrackerTimeout() const = 0;
virtual void setStopTrackerTimeout(int value) = 0;
virtual int maxConnections() const = 0;
virtual void setMaxConnections(int max) = 0;
virtual int maxConnectionsPerTorrent() const = 0;
virtual void setMaxConnectionsPerTorrent(int max) = 0;
virtual int maxUploads() const = 0;
virtual void setMaxUploads(int max) = 0;
virtual int maxUploadsPerTorrent() const = 0;
virtual void setMaxUploadsPerTorrent(int max) = 0;
virtual int maxActiveDownloads() const = 0;
virtual void setMaxActiveDownloads(int max) = 0;
virtual int maxActiveUploads() const = 0;
virtual void setMaxActiveUploads(int max) = 0;
virtual int maxActiveTorrents() const = 0;
virtual void setMaxActiveTorrents(int max) = 0;
virtual BTProtocol btProtocol() const = 0;
virtual void setBTProtocol(BTProtocol protocol) = 0;
virtual bool isUTPRateLimited() const = 0;
virtual void setUTPRateLimited(bool limited) = 0;
virtual MixedModeAlgorithm utpMixedMode() const = 0;
virtual void setUtpMixedMode(MixedModeAlgorithm mode) = 0;
virtual bool isIDNSupportEnabled() const = 0;
virtual void setIDNSupportEnabled(bool enabled) = 0;
virtual bool multiConnectionsPerIpEnabled() const = 0;
virtual void setMultiConnectionsPerIpEnabled(bool enabled) = 0;
virtual bool validateHTTPSTrackerCertificate() const = 0;
virtual void setValidateHTTPSTrackerCertificate(bool enabled) = 0;
virtual bool isSSRFMitigationEnabled() const = 0;
virtual void setSSRFMitigationEnabled(bool enabled) = 0;
virtual bool blockPeersOnPrivilegedPorts() const = 0;
virtual void setBlockPeersOnPrivilegedPorts(bool enabled) = 0;
virtual bool isTrackerFilteringEnabled() const = 0;
virtual void setTrackerFilteringEnabled(bool enabled) = 0;
virtual bool isExcludedFileNamesEnabled() const = 0;
virtual void setExcludedFileNamesEnabled(const bool enabled) = 0;
virtual QStringList excludedFileNames() const = 0;
virtual void setExcludedFileNames(const QStringList &newList) = 0;
virtual bool isFilenameExcluded(const QString &fileName) const = 0;
virtual QStringList bannedIPs() const = 0;
virtual void setBannedIPs(const QStringList &newList) = 0;
virtual ResumeDataStorageType resumeDataStorageType() const = 0;
virtual void setResumeDataStorageType(ResumeDataStorageType type) = 0;
virtual bool isRestored() const = 0;
virtual Torrent *getTorrent(const TorrentID &id) const = 0;
virtual Torrent *findTorrent(const InfoHash &infoHash) const = 0;
virtual QVector<Torrent *> torrents() const = 0;
virtual qsizetype torrentsCount() const = 0;
virtual bool hasActiveTorrents() const = 0;
virtual bool hasUnfinishedTorrents() const = 0;
virtual bool hasRunningSeed() const = 0;
virtual const SessionStatus &status() const = 0;
virtual const CacheStatus &cacheStatus() const = 0;
virtual bool isListening() const = 0;
virtual MaxRatioAction maxRatioAction() const = 0;
virtual void setMaxRatioAction(MaxRatioAction act) = 0;
virtual void banIP(const QString &ip) = 0;
virtual bool isKnownTorrent(const InfoHash &infoHash) const = 0;
virtual bool addTorrent(const QString &source, const AddTorrentParams &params = {}) = 0;
virtual bool addTorrent(const MagnetUri &magnetUri, const AddTorrentParams &params = {}) = 0;
virtual bool addTorrent(const TorrentInfo &torrentInfo, const AddTorrentParams &params = {}) = 0;
virtual bool deleteTorrent(const TorrentID &id, DeleteOption deleteOption = DeleteOption::DeleteTorrent) = 0;
virtual bool downloadMetadata(const MagnetUri &magnetUri) = 0;
virtual bool cancelDownloadMetadata(const TorrentID &id) = 0;
virtual void recursiveTorrentDownload(const TorrentID &id) = 0;
virtual void increaseTorrentsQueuePos(const QVector<TorrentID> &ids) = 0;
virtual void decreaseTorrentsQueuePos(const QVector<TorrentID> &ids) = 0;
virtual void topTorrentsQueuePos(const QVector<TorrentID> &ids) = 0;
virtual void bottomTorrentsQueuePos(const QVector<TorrentID> &ids) = 0;
signals:
void startupProgressUpdated(int progress);
void allTorrentsFinished();
void categoryAdded(const QString &categoryName);
void categoryRemoved(const QString &categoryName);
void downloadFromUrlFailed(const QString &url, const QString &reason);
void downloadFromUrlFinished(const QString &url);
void fullDiskError(Torrent *torrent, const QString &msg);
void IPFilterParsed(bool error, int ruleCount);
void loadTorrentFailed(const QString &error);
void metadataDownloaded(const TorrentInfo &info);
void recursiveTorrentDownloadPossible(Torrent *torrent);
void restored();
void speedLimitModeChanged(bool alternative);
void statsUpdated();
void subcategoriesSupportChanged();
void tagAdded(const QString &tag);
void tagRemoved(const QString &tag);
void torrentAboutToBeRemoved(Torrent *torrent);
void torrentAdded(Torrent *torrent);
void torrentCategoryChanged(Torrent *torrent, const QString &oldCategory);
void torrentFinished(Torrent *torrent);
void torrentFinishedChecking(Torrent *torrent);
void torrentMetadataReceived(Torrent *torrent);
void torrentPaused(Torrent *torrent);
void torrentResumed(Torrent *torrent);
void torrentSavePathChanged(Torrent *torrent);
void torrentSavingModeChanged(Torrent *torrent);
void torrentsLoaded(const QVector<Torrent *> &torrents);
void torrentsUpdated(const QVector<Torrent *> &torrents);
void torrentTagAdded(Torrent *torrent, const QString &tag);
void torrentTagRemoved(Torrent *torrent, const QString &tag);
void trackerError(Torrent *torrent, const QString &tracker);
void trackerlessStateChanged(Torrent *torrent, bool trackerless);
void trackersAdded(Torrent *torrent, const QVector<TrackerEntry> &trackers);
void trackersChanged(Torrent *torrent);
void trackersRemoved(Torrent *torrent, const QStringList &trackers);
void trackerSuccess(Torrent *torrent, const QString &tracker);
void trackerWarning(Torrent *torrent, const QString &tracker);
void trackerEntriesUpdated(const QHash<Torrent *, QSet<QString>> &updateInfos);
};
}