diff --git a/src/base/bittorrent/dbresumedatastorage.cpp b/src/base/bittorrent/dbresumedatastorage.cpp index 5ac322021..a86b173ef 100644 --- a/src/base/bittorrent/dbresumedatastorage.cpp +++ b/src/base/bittorrent/dbresumedatastorage.cpp @@ -386,7 +386,7 @@ void BitTorrent::DBResumeDataStorage::createDB() const if (!db.commit()) throw RuntimeError(db.lastError().text()); } - catch (const RuntimeError &err) + catch (const RuntimeError &) { db.rollback(); throw; @@ -563,7 +563,7 @@ void BitTorrent::DBResumeDataStorage::Worker::storeQueue(const QVector m_sendBufferWatermark; CachedSettingValue m_sendBufferLowWatermark; CachedSettingValue m_sendBufferWatermarkFactor; + CachedSettingValue m_connectionSpeed; CachedSettingValue m_socketBacklogSize; CachedSettingValue m_isAnonymousModeEnabled; CachedSettingValue m_isQueueingEnabled; diff --git a/src/base/http/types.h b/src/base/http/types.h index 03318bd87..4ff26ea78 100644 --- a/src/base/http/types.h +++ b/src/base/http/types.h @@ -35,43 +35,43 @@ namespace Http { - const char METHOD_GET[] = "GET"; - const char METHOD_POST[] = "POST"; - - const char HEADER_CACHE_CONTROL[] = "cache-control"; - const char HEADER_CONNECTION[] = "connection"; - const char HEADER_CONTENT_DISPOSITION[] = "content-disposition"; - const char HEADER_CONTENT_ENCODING[] = "content-encoding"; - const char HEADER_CONTENT_LENGTH[] = "content-length"; - const char HEADER_CONTENT_SECURITY_POLICY[] = "content-security-policy"; - const char HEADER_CONTENT_TYPE[] = "content-type"; - const char HEADER_DATE[] = "date"; - const char HEADER_HOST[] = "host"; - const char HEADER_ORIGIN[] = "origin"; - const char HEADER_REFERER[] = "referer"; - const char HEADER_REFERRER_POLICY[] = "referrer-policy"; - const char HEADER_SET_COOKIE[] = "set-cookie"; - const char HEADER_X_CONTENT_TYPE_OPTIONS[] = "x-content-type-options"; - const char HEADER_X_FORWARDED_HOST[] = "x-forwarded-host"; - const char HEADER_X_FRAME_OPTIONS[] = "x-frame-options"; - const char HEADER_X_XSS_PROTECTION[] = "x-xss-protection"; - - const char HEADER_REQUEST_METHOD_GET[] = "GET"; - const char HEADER_REQUEST_METHOD_HEAD[] = "HEAD"; - const char HEADER_REQUEST_METHOD_POST[] = "POST"; - - const char CONTENT_TYPE_HTML[] = "text/html"; - const char CONTENT_TYPE_CSS[] = "text/css"; - const char CONTENT_TYPE_TXT[] = "text/plain; charset=UTF-8"; - const char CONTENT_TYPE_JS[] = "application/javascript"; - const char CONTENT_TYPE_JSON[] = "application/json"; - const char CONTENT_TYPE_GIF[] = "image/gif"; - const char CONTENT_TYPE_PNG[] = "image/png"; - const char CONTENT_TYPE_FORM_ENCODED[] = "application/x-www-form-urlencoded"; - const char CONTENT_TYPE_FORM_DATA[] = "multipart/form-data"; + inline const char METHOD_GET[] = "GET"; + inline const char METHOD_POST[] = "POST"; + + inline const char HEADER_CACHE_CONTROL[] = "cache-control"; + inline const char HEADER_CONNECTION[] = "connection"; + inline const char HEADER_CONTENT_DISPOSITION[] = "content-disposition"; + inline const char HEADER_CONTENT_ENCODING[] = "content-encoding"; + inline const char HEADER_CONTENT_LENGTH[] = "content-length"; + inline const char HEADER_CONTENT_SECURITY_POLICY[] = "content-security-policy"; + inline const char HEADER_CONTENT_TYPE[] = "content-type"; + inline const char HEADER_DATE[] = "date"; + inline const char HEADER_HOST[] = "host"; + inline const char HEADER_ORIGIN[] = "origin"; + inline const char HEADER_REFERER[] = "referer"; + inline const char HEADER_REFERRER_POLICY[] = "referrer-policy"; + inline const char HEADER_SET_COOKIE[] = "set-cookie"; + inline const char HEADER_X_CONTENT_TYPE_OPTIONS[] = "x-content-type-options"; + inline const char HEADER_X_FORWARDED_HOST[] = "x-forwarded-host"; + inline const char HEADER_X_FRAME_OPTIONS[] = "x-frame-options"; + inline const char HEADER_X_XSS_PROTECTION[] = "x-xss-protection"; + + inline const char HEADER_REQUEST_METHOD_GET[] = "GET"; + inline const char HEADER_REQUEST_METHOD_HEAD[] = "HEAD"; + inline const char HEADER_REQUEST_METHOD_POST[] = "POST"; + + inline const char CONTENT_TYPE_HTML[] = "text/html"; + inline const char CONTENT_TYPE_CSS[] = "text/css"; + inline const char CONTENT_TYPE_TXT[] = "text/plain; charset=UTF-8"; + inline const char CONTENT_TYPE_JS[] = "application/javascript"; + inline const char CONTENT_TYPE_JSON[] = "application/json"; + inline const char CONTENT_TYPE_GIF[] = "image/gif"; + inline const char CONTENT_TYPE_PNG[] = "image/png"; + inline const char CONTENT_TYPE_FORM_ENCODED[] = "application/x-www-form-urlencoded"; + inline const char CONTENT_TYPE_FORM_DATA[] = "multipart/form-data"; // portability: "\r\n" doesn't guarantee mapping to the correct symbol - const char CRLF[] = {0x0D, 0x0A, '\0'}; + inline const char CRLF[] = {0x0D, 0x0A, '\0'}; struct Environment { @@ -120,7 +120,7 @@ namespace Http HeaderMap headers; QByteArray content; - Response(uint code = 200, const QString &text = "OK") + Response(uint code = 200, const QString &text = QLatin1String("OK")) : status {code, text} { } diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index af0e91cb9..29837b46c 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -116,6 +116,7 @@ namespace SEND_BUF_LOW_WATERMARK, SEND_BUF_WATERMARK_FACTOR, // networking & ports + CONNECTION_SPEED, SOCKET_BACKLOG_SIZE, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, @@ -224,6 +225,8 @@ void AdvancedSettings::saveAdvancedSettings() session->setSendBufferWatermark(m_spinBoxSendBufferWatermark.value()); session->setSendBufferLowWatermark(m_spinBoxSendBufferLowWatermark.value()); session->setSendBufferWatermarkFactor(m_spinBoxSendBufferWatermarkFactor.value()); + // Outgoing connections per second + session->setConnectionSpeed(m_spinBoxConnectionSpeed.value()); // Socket listen backlog size session->setSocketBacklogSize(m_spinBoxSocketBacklogSize.value()); // Save resume data interval @@ -528,6 +531,12 @@ void AdvancedSettings::loadAdvancedSettings() m_spinBoxSendBufferWatermarkFactor.setValue(session->sendBufferWatermarkFactor()); addRow(SEND_BUF_WATERMARK_FACTOR, (tr("Send buffer watermark factor") + ' ' + makeLink("https://www.libtorrent.org/reference-Settings.html#send_buffer_watermark_factor", "(?)")) , &m_spinBoxSendBufferWatermarkFactor); + // Outgoing connections per second + m_spinBoxConnectionSpeed.setMinimum(0); + m_spinBoxConnectionSpeed.setMaximum(std::numeric_limits::max()); + m_spinBoxConnectionSpeed.setValue(session->connectionSpeed()); + addRow(CONNECTION_SPEED, (tr("Outgoing connections per second") + ' ' + makeLink("https://www.libtorrent.org/reference-Settings.html#connection_speed", "(?)")) + , &m_spinBoxConnectionSpeed); // Socket listen backlog size m_spinBoxSocketBacklogSize.setMinimum(1); m_spinBoxSocketBacklogSize.setMaximum(std::numeric_limits::max()); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index fae2e4b77..66991ecc4 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -63,7 +63,7 @@ private: QSpinBox m_spinBoxAsyncIOThreads, m_spinBoxFilePoolSize, m_spinBoxCheckingMemUsage, m_spinBoxSaveResumeDataInterval, m_spinBoxOutgoingPortsMin, m_spinBoxOutgoingPortsMax, m_spinBoxUPnPLeaseDuration, m_spinBoxPeerToS, m_spinBoxListRefresh, m_spinBoxTrackerPort, m_spinBoxSendBufferWatermark, m_spinBoxSendBufferLowWatermark, - m_spinBoxSendBufferWatermarkFactor, m_spinBoxSocketBacklogSize, m_spinBoxMaxConcurrentHTTPAnnounces, m_spinBoxStopTrackerTimeout, + m_spinBoxSendBufferWatermarkFactor, m_spinBoxConnectionSpeed, m_spinBoxSocketBacklogSize, m_spinBoxMaxConcurrentHTTPAnnounces, m_spinBoxStopTrackerTimeout, m_spinBoxSavePathHistoryLength, m_spinBoxPeerTurnover, m_spinBoxPeerTurnoverCutoff, m_spinBoxPeerTurnoverInterval; QCheckBox m_checkBoxOsCache, m_checkBoxRecheckCompleted, m_checkBoxResolveCountries, m_checkBoxResolveHosts, m_checkBoxProgramNotifications, m_checkBoxTorrentAddedNotifications, m_checkBoxReannounceWhenAddressChanged, m_checkBoxTrackerFavicon, m_checkBoxTrackerStatus, diff --git a/src/webui/api/appcontroller.cpp b/src/webui/api/appcontroller.cpp index a33532d0b..590d30147 100644 --- a/src/webui/api/appcontroller.cpp +++ b/src/webui/api/appcontroller.cpp @@ -313,6 +313,8 @@ void AppController::preferencesAction() data["send_buffer_watermark"] = session->sendBufferWatermark(); data["send_buffer_low_watermark"] = session->sendBufferLowWatermark(); data["send_buffer_watermark_factor"] = session->sendBufferWatermarkFactor(); + // Outgoing connections per second + data["connection_speed"] = session->connectionSpeed(); // Socket listen backlog size data["socket_backlog_size"] = session->socketBacklogSize(); // Outgoing ports @@ -776,6 +778,9 @@ void AppController::setPreferencesAction() session->setSendBufferLowWatermark(it.value().toInt()); if (hasKey("send_buffer_watermark_factor")) session->setSendBufferWatermarkFactor(it.value().toInt()); + // Outgoing connections per second + if (hasKey("connection_speed")) + session->setConnectionSpeed(it.value().toInt()); // Socket listen backlog size if (hasKey("socket_backlog_size")) session->setSocketBacklogSize(it.value().toInt()); diff --git a/src/webui/api/serialize/serialize_torrent.h b/src/webui/api/serialize/serialize_torrent.h index 95238b9a3..eab6aca90 100644 --- a/src/webui/api/serialize/serialize_torrent.h +++ b/src/webui/api/serialize/serialize_torrent.h @@ -36,51 +36,51 @@ namespace BitTorrent } // Torrent keys -const char KEY_TORRENT_ID[] = "hash"; -const char KEY_TORRENT_NAME[] = "name"; -const char KEY_TORRENT_MAGNET_URI[] = "magnet_uri"; -const char KEY_TORRENT_SIZE[] = "size"; -const char KEY_TORRENT_PROGRESS[] = "progress"; -const char KEY_TORRENT_DLSPEED[] = "dlspeed"; -const char KEY_TORRENT_UPSPEED[] = "upspeed"; -const char KEY_TORRENT_QUEUE_POSITION[] = "priority"; -const char KEY_TORRENT_SEEDS[] = "num_seeds"; -const char KEY_TORRENT_NUM_COMPLETE[] = "num_complete"; -const char KEY_TORRENT_LEECHS[] = "num_leechs"; -const char KEY_TORRENT_NUM_INCOMPLETE[] = "num_incomplete"; -const char KEY_TORRENT_RATIO[] = "ratio"; -const char KEY_TORRENT_ETA[] = "eta"; -const char KEY_TORRENT_STATE[] = "state"; -const char KEY_TORRENT_SEQUENTIAL_DOWNLOAD[] = "seq_dl"; -const char KEY_TORRENT_FIRST_LAST_PIECE_PRIO[] = "f_l_piece_prio"; -const char KEY_TORRENT_CATEGORY[] = "category"; -const char KEY_TORRENT_TAGS[] = "tags"; -const char KEY_TORRENT_SUPER_SEEDING[] = "super_seeding"; -const char KEY_TORRENT_FORCE_START[] = "force_start"; -const char KEY_TORRENT_SAVE_PATH[] = "save_path"; -const char KEY_TORRENT_CONTENT_PATH[] = "content_path"; -const char KEY_TORRENT_ADDED_ON[] = "added_on"; -const char KEY_TORRENT_COMPLETION_ON[] = "completion_on"; -const char KEY_TORRENT_TRACKER[] = "tracker"; -const char KEY_TORRENT_TRACKERS_COUNT[] = "trackers_count"; -const char KEY_TORRENT_DL_LIMIT[] = "dl_limit"; -const char KEY_TORRENT_UP_LIMIT[] = "up_limit"; -const char KEY_TORRENT_AMOUNT_DOWNLOADED[] = "downloaded"; -const char KEY_TORRENT_AMOUNT_UPLOADED[] = "uploaded"; -const char KEY_TORRENT_AMOUNT_DOWNLOADED_SESSION[] = "downloaded_session"; -const char KEY_TORRENT_AMOUNT_UPLOADED_SESSION[] = "uploaded_session"; -const char KEY_TORRENT_AMOUNT_LEFT[] = "amount_left"; -const char KEY_TORRENT_AMOUNT_COMPLETED[] = "completed"; -const char KEY_TORRENT_MAX_RATIO[] = "max_ratio"; -const char KEY_TORRENT_MAX_SEEDING_TIME[] = "max_seeding_time"; -const char KEY_TORRENT_RATIO_LIMIT[] = "ratio_limit"; -const char KEY_TORRENT_SEEDING_TIME_LIMIT[] = "seeding_time_limit"; -const char KEY_TORRENT_LAST_SEEN_COMPLETE_TIME[] = "seen_complete"; -const char KEY_TORRENT_LAST_ACTIVITY_TIME[] = "last_activity"; -const char KEY_TORRENT_TOTAL_SIZE[] = "total_size"; -const char KEY_TORRENT_AUTO_TORRENT_MANAGEMENT[] = "auto_tmm"; -const char KEY_TORRENT_TIME_ACTIVE[] = "time_active"; -const char KEY_TORRENT_SEEDING_TIME[] = "seeding_time"; -const char KEY_TORRENT_AVAILABILITY[] = "availability"; +inline const char KEY_TORRENT_ID[] = "hash"; +inline const char KEY_TORRENT_NAME[] = "name"; +inline const char KEY_TORRENT_MAGNET_URI[] = "magnet_uri"; +inline const char KEY_TORRENT_SIZE[] = "size"; +inline const char KEY_TORRENT_PROGRESS[] = "progress"; +inline const char KEY_TORRENT_DLSPEED[] = "dlspeed"; +inline const char KEY_TORRENT_UPSPEED[] = "upspeed"; +inline const char KEY_TORRENT_QUEUE_POSITION[] = "priority"; +inline const char KEY_TORRENT_SEEDS[] = "num_seeds"; +inline const char KEY_TORRENT_NUM_COMPLETE[] = "num_complete"; +inline const char KEY_TORRENT_LEECHS[] = "num_leechs"; +inline const char KEY_TORRENT_NUM_INCOMPLETE[] = "num_incomplete"; +inline const char KEY_TORRENT_RATIO[] = "ratio"; +inline const char KEY_TORRENT_ETA[] = "eta"; +inline const char KEY_TORRENT_STATE[] = "state"; +inline const char KEY_TORRENT_SEQUENTIAL_DOWNLOAD[] = "seq_dl"; +inline const char KEY_TORRENT_FIRST_LAST_PIECE_PRIO[] = "f_l_piece_prio"; +inline const char KEY_TORRENT_CATEGORY[] = "category"; +inline const char KEY_TORRENT_TAGS[] = "tags"; +inline const char KEY_TORRENT_SUPER_SEEDING[] = "super_seeding"; +inline const char KEY_TORRENT_FORCE_START[] = "force_start"; +inline const char KEY_TORRENT_SAVE_PATH[] = "save_path"; +inline const char KEY_TORRENT_CONTENT_PATH[] = "content_path"; +inline const char KEY_TORRENT_ADDED_ON[] = "added_on"; +inline const char KEY_TORRENT_COMPLETION_ON[] = "completion_on"; +inline const char KEY_TORRENT_TRACKER[] = "tracker"; +inline const char KEY_TORRENT_TRACKERS_COUNT[] = "trackers_count"; +inline const char KEY_TORRENT_DL_LIMIT[] = "dl_limit"; +inline const char KEY_TORRENT_UP_LIMIT[] = "up_limit"; +inline const char KEY_TORRENT_AMOUNT_DOWNLOADED[] = "downloaded"; +inline const char KEY_TORRENT_AMOUNT_UPLOADED[] = "uploaded"; +inline const char KEY_TORRENT_AMOUNT_DOWNLOADED_SESSION[] = "downloaded_session"; +inline const char KEY_TORRENT_AMOUNT_UPLOADED_SESSION[] = "uploaded_session"; +inline const char KEY_TORRENT_AMOUNT_LEFT[] = "amount_left"; +inline const char KEY_TORRENT_AMOUNT_COMPLETED[] = "completed"; +inline const char KEY_TORRENT_MAX_RATIO[] = "max_ratio"; +inline const char KEY_TORRENT_MAX_SEEDING_TIME[] = "max_seeding_time"; +inline const char KEY_TORRENT_RATIO_LIMIT[] = "ratio_limit"; +inline const char KEY_TORRENT_SEEDING_TIME_LIMIT[] = "seeding_time_limit"; +inline const char KEY_TORRENT_LAST_SEEN_COMPLETE_TIME[] = "seen_complete"; +inline const char KEY_TORRENT_LAST_ACTIVITY_TIME[] = "last_activity"; +inline const char KEY_TORRENT_TOTAL_SIZE[] = "total_size"; +inline const char KEY_TORRENT_AUTO_TORRENT_MANAGEMENT[] = "auto_tmm"; +inline const char KEY_TORRENT_TIME_ACTIVE[] = "time_active"; +inline const char KEY_TORRENT_SEEDING_TIME[] = "seeding_time"; +inline const char KEY_TORRENT_AVAILABILITY[] = "availability"; QVariantMap serialize(const BitTorrent::Torrent &torrent); diff --git a/src/webui/webapplication.cpp b/src/webui/webapplication.cpp index b2e99b21c..18acade46 100644 --- a/src/webui/webapplication.cpp +++ b/src/webui/webapplication.cpp @@ -62,7 +62,8 @@ #include "api/torrentscontroller.h" #include "api/transfercontroller.h" -constexpr int MAX_ALLOWED_FILESIZE = 10 * 1024 * 1024; +const int MAX_ALLOWED_FILESIZE = 10 * 1024 * 1024; +const char C_SID[] = "SID"; // name of session id cookie const QString PATH_PREFIX_ICONS {QStringLiteral("/icons/")}; const QString WWW_FOLDER {QStringLiteral(":/www")}; diff --git a/src/webui/webapplication.h b/src/webui/webapplication.h index 44f8e159e..0f60acd10 100644 --- a/src/webui/webapplication.h +++ b/src/webui/webapplication.h @@ -43,13 +43,11 @@ #include "base/utils/net.h" #include "base/utils/version.h" -constexpr Utils::Version API_VERSION {2, 8, 2}; +inline const Utils::Version API_VERSION {2, 8, 3}; class APIController; class WebApplication; -constexpr char C_SID[] = "SID"; // name of session id cookie - class WebSession final : public ISession { public: diff --git a/src/webui/www/private/views/preferences.html b/src/webui/www/private/views/preferences.html index c9eef210c..d13ee9173 100644 --- a/src/webui/www/private/views/preferences.html +++ b/src/webui/www/private/views/preferences.html @@ -1055,6 +1055,14 @@   % + + + + + + + + @@ -1905,6 +1913,7 @@ $('sendBufferWatermark').setProperty('value', pref.send_buffer_watermark); $('sendBufferLowWatermark').setProperty('value', pref.send_buffer_low_watermark); $('sendBufferWatermarkFactor').setProperty('value', pref.send_buffer_watermark_factor); + $('connectionSpeed').setProperty('value', pref.connection_speed); $('socketBacklogSize').setProperty('value', pref.socket_backlog_size); $('outgoingPortsMin').setProperty('value', pref.outgoing_ports_min); $('outgoingPortsMax').setProperty('value', pref.outgoing_ports_max); @@ -2295,6 +2304,7 @@ settings.set('send_buffer_watermark', $('sendBufferWatermark').getProperty('value')); settings.set('send_buffer_low_watermark', $('sendBufferLowWatermark').getProperty('value')); settings.set('send_buffer_watermark_factor', $('sendBufferWatermarkFactor').getProperty('value')); + settings.set('connection_speed', $('connectionSpeed').getProperty('value')); settings.set('socket_backlog_size', $('socketBacklogSize').getProperty('value')); settings.set('outgoing_ports_min', $('outgoingPortsMin').getProperty('value')); settings.set('outgoing_ports_max', $('outgoingPortsMax').getProperty('value'));