Skip to content

Commit 2af9ea8

Browse files
committed
Schedule Pause bittorrent session with scheduler
1 parent 1284a77 commit 2af9ea8

10 files changed

Lines changed: 99 additions & 1 deletion

File tree

.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
.vscode/
2+
.zed/
3+
.idea/
24

35
src/gui/geoip/GeoIP.dat
46
src/gui/geoip/GeoIP.dat.gz
@@ -41,3 +43,10 @@ src/icons/skin/build-icons/icons/*.png
4143

4244
# CMake build directory
4345
build/
46+
47+
48+
# clang cache
49+
.cache/
50+
51+
# Node.js dependencies
52+
node_modules/

src/app/application.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,6 +1043,15 @@ int Application::exec()
10431043
for (const QBtCommandLineParameters &params : asConst(m_paramsQueue))
10441044
processParams(params);
10451045
m_paramsQueue.clear();
1046+
1047+
//FIXME this is a workaround to apply session state immediately after startup.
1048+
// Otherwise, session will start unpaused regardless of the Schedule Pause Session setting being enabled,
1049+
// and Alternative Speed Limits active
1050+
// Should find a better way to handle this
1051+
BitTorrent::Session::instance()->applySessionState(BitTorrent::Session::instance()->isAltGlobalSpeedLimitEnabled() &&
1052+
BitTorrent::Session::instance()->isSchedulePauseSessionEnabled());
1053+
1054+
10461055
});
10471056

10481057
const QBtCommandLineParameters params = commandLineArgs();

src/base/bittorrent/session.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,11 @@ namespace BitTorrent
256256
virtual void setUploadSpeedLimit(int limit) = 0;
257257
virtual bool isAltGlobalSpeedLimitEnabled() const = 0;
258258
virtual void setAltGlobalSpeedLimitEnabled(bool enabled) = 0;
259+
virtual bool isSchedulePauseSessionEnabled() const = 0;
260+
virtual void setSchedulePauseSessionEnabled(bool enabled) = 0;
259261
virtual bool isBandwidthSchedulerEnabled() const = 0;
260262
virtual void setBandwidthSchedulerEnabled(bool enabled) = 0;
263+
virtual void applySessionState(bool schedule_paused) = 0;
261264

262265
virtual bool isPerformanceWarningEnabled() const = 0;
263266
virtual void setPerformanceWarningEnabled(bool enable) = 0;

src/base/bittorrent/sessionimpl.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,7 @@ SessionImpl::SessionImpl(QObject *parent)
538538
, m_altGlobalDownloadSpeedLimit(BITTORRENT_SESSION_KEY(u"AlternativeGlobalDLSpeedLimit"_s), 10, lowerLimited(0))
539539
, m_altGlobalUploadSpeedLimit(BITTORRENT_SESSION_KEY(u"AlternativeGlobalUPSpeedLimit"_s), 10, lowerLimited(0))
540540
, m_isAltGlobalSpeedLimitEnabled(BITTORRENT_SESSION_KEY(u"UseAlternativeGlobalSpeedLimit"_s), false)
541+
, m_isSchedulePauseSessionEnabled(BITTORRENT_SESSION_KEY(u"SchedulePauseSession"_s), false)
541542
, m_isBandwidthSchedulerEnabled(BITTORRENT_SESSION_KEY(u"BandwidthSchedulerEnabled"_s), false)
542543
, m_isPerformanceWarningEnabled(BITTORRENT_SESSION_KEY(u"PerformanceWarning"_s), false)
543544
, m_saveResumeDataInterval(BITTORRENT_SESSION_KEY(u"SaveResumeDataInterval"_s), 60)
@@ -1321,6 +1322,20 @@ void SessionImpl::applyBandwidthLimits()
13211322
m_nativeSession->apply_settings(std::move(settingsPack));
13221323
}
13231324

1325+
void SessionImpl::applySessionState(bool scheduled_pause)
1326+
{
1327+
BitTorrent::Session *const session = BitTorrent::Session::instance();
1328+
1329+
// if session is not ready during startup, just return
1330+
if(nullptr == session)
1331+
return;
1332+
1333+
if (true == scheduled_pause)
1334+
session->pause();
1335+
else
1336+
session->resume();
1337+
}
1338+
13241339
void SessionImpl::configure()
13251340
{
13261341
m_nativeSession->apply_settings(loadLTSettings());
@@ -3632,10 +3647,28 @@ void SessionImpl::setAltGlobalSpeedLimitEnabled(const bool enabled)
36323647
// Save new state to remember it on startup
36333648
m_isAltGlobalSpeedLimitEnabled = enabled;
36343649
applyBandwidthLimits();
3650+
applySessionState(isAltGlobalSpeedLimitEnabled() && isSchedulePauseSessionEnabled());
36353651
// Notify
36363652
emit speedLimitModeChanged(m_isAltGlobalSpeedLimitEnabled);
36373653
}
36383654

3655+
bool SessionImpl::isSchedulePauseSessionEnabled() const
3656+
{
3657+
return m_isSchedulePauseSessionEnabled;
3658+
}
3659+
3660+
3661+
void SessionImpl::setSchedulePauseSessionEnabled(const bool enabled)
3662+
{
3663+
if (enabled == isSchedulePauseSessionEnabled()) return;
3664+
3665+
// Save new state to remember it on startup
3666+
m_isSchedulePauseSessionEnabled = enabled;
3667+
3668+
// Notify
3669+
//emit speedLimitModeChanged(m_isAltGlobalSpeedLimitEnabled);
3670+
}
3671+
36393672
bool SessionImpl::isBandwidthSchedulerEnabled() const
36403673
{
36413674
return m_isBandwidthSchedulerEnabled;

src/base/bittorrent/sessionimpl.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,15 +231,18 @@ namespace BitTorrent
231231
void setUploadSpeedLimit(int limit) override;
232232
bool isAltGlobalSpeedLimitEnabled() const override;
233233
void setAltGlobalSpeedLimitEnabled(bool enabled) override;
234+
bool isSchedulePauseSessionEnabled() const override;
235+
void setSchedulePauseSessionEnabled(bool enabled) override;
234236
bool isBandwidthSchedulerEnabled() const override;
235237
void setBandwidthSchedulerEnabled(bool enabled) override;
238+
void applySessionState(bool schedule_paused) override;
236239

237240
bool isPerformanceWarningEnabled() const override;
238241
void setPerformanceWarningEnabled(bool enable) override;
239242
int saveResumeDataInterval() const override;
240243
void setSaveResumeDataInterval(int value) override;
241244
std::chrono::minutes saveStatisticsInterval() const override;
242-
void setSaveStatisticsInterval(std::chrono::minutes value) override;
245+
void setSaveStatisticsInterval(std::chrono::minutes timeInMinutes) override;
243246
int shutdownTimeout() const override;
244247
void setShutdownTimeout(int value) override;
245248
int port() const override;
@@ -736,6 +739,7 @@ namespace BitTorrent
736739
CachedSettingValue<int> m_altGlobalDownloadSpeedLimit;
737740
CachedSettingValue<int> m_altGlobalUploadSpeedLimit;
738741
CachedSettingValue<bool> m_isAltGlobalSpeedLimitEnabled;
742+
CachedSettingValue<bool> m_isSchedulePauseSessionEnabled;
739743
CachedSettingValue<bool> m_isBandwidthSchedulerEnabled;
740744
CachedSettingValue<bool> m_isPerformanceWarningEnabled;
741745
CachedSettingValue<int> m_saveResumeDataInterval;

src/gui/optionsdialog.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,6 +1082,7 @@ void OptionsDialog::loadSpeedTabOptions()
10821082
m_ui->timeEditScheduleFrom->setTime(pref->getSchedulerStartTime());
10831083
m_ui->timeEditScheduleTo->setTime(pref->getSchedulerEndTime());
10841084
m_ui->comboBoxScheduleDays->setCurrentIndex(static_cast<int>(pref->getSchedulerDays()));
1085+
m_ui->checkBoxSchedulePauseSession->setChecked(session->isSchedulePauseSessionEnabled());
10851086

10861087
m_ui->checkLimituTPConnections->setChecked(session->isUTPRateLimited());
10871088
m_ui->checkLimitTransportOverhead->setChecked(session->includeOverheadInLimits());
@@ -1105,6 +1106,7 @@ void OptionsDialog::loadSpeedTabOptions()
11051106
connect(m_ui->timeEditScheduleFrom, &QDateTimeEdit::timeChanged, this, &ThisType::enableApplyButton);
11061107
connect(m_ui->timeEditScheduleTo, &QDateTimeEdit::timeChanged, this, &ThisType::enableApplyButton);
11071108
connect(m_ui->comboBoxScheduleDays, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton);
1109+
connect(m_ui->checkBoxSchedulePauseSession, &QAbstractButton::toggled, this, &ThisType::enableApplyButton);
11081110

11091111
connect(m_ui->checkLimituTPConnections, &QAbstractButton::toggled, this, &ThisType::enableApplyButton);
11101112
connect(m_ui->checkLimitTransportOverhead, &QAbstractButton::toggled, this, &ThisType::enableApplyButton);
@@ -1131,6 +1133,7 @@ void OptionsDialog::saveSpeedTabOptions() const
11311133
pref->setSchedulerStartTime(m_ui->timeEditScheduleFrom->time());
11321134
pref->setSchedulerEndTime(m_ui->timeEditScheduleTo->time());
11331135
pref->setSchedulerDays(static_cast<Scheduler::Days>(m_ui->comboBoxScheduleDays->currentIndex()));
1136+
session->setSchedulePauseSessionEnabled(m_ui->checkBoxSchedulePauseSession->isChecked());
11341137

11351138
session->setUTPRateLimited(m_ui->checkLimituTPConnections->isChecked());
11361139
session->setIncludeOverheadInLimits(m_ui->checkLimitTransportOverhead->isChecked());
@@ -2283,3 +2286,11 @@ void OptionsDialog::on_IPSubnetWhitelistButton_clicked()
22832286
connect(dialog, &QDialog::accepted, this, &OptionsDialog::enableApplyButton);
22842287
dialog->open();
22852288
}
2289+
2290+
void OptionsDialog::on_groupBoxSchedule_clicked(bool checked)
2291+
{
2292+
if(!checked)
2293+
{
2294+
m_ui->checkBoxSchedulePauseSession->setChecked(checked);
2295+
}
2296+
}

src/gui/optionsdialog.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ private slots:
113113
void setupWebUIAPIKey();
114114
#endif
115115

116+
void on_groupBoxSchedule_clicked(bool checked);
117+
116118
private:
117119
void showEvent(QShowEvent *e) override;
118120

src/gui/optionsdialog.ui

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2674,6 +2674,13 @@ readme[0-9].txt: filter 'readme1.txt', 'readme2.txt' but not 'readme10.txt'.</st
26742674
</item>
26752675
</widget>
26762676
</item>
2677+
<item row="1" column="4">
2678+
<widget class="QCheckBox" name="checkBoxSchedulePauseSession">
2679+
<property name="text">
2680+
<string>Schedule Pause session</string>
2681+
</property>
2682+
</widget>
2683+
</item>
26772684
</layout>
26782685
</widget>
26792686
</item>

src/webui/api/appcontroller.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,8 @@ void AppController::preferencesAction()
294294
data[u"schedule_to_hour"_s] = end_time.hour();
295295
data[u"schedule_to_min"_s] = end_time.minute();
296296
data[u"scheduler_days"_s] = static_cast<int>(pref->getSchedulerDays());
297+
data[u"schedule_pause_session"_s] = session->isSchedulePauseSessionEnabled();
298+
297299

298300
// Bittorrent
299301
// Privacy
@@ -817,6 +819,8 @@ void AppController::setPreferencesAction()
817819
pref->setSchedulerEndTime({hourIter.value().toInt(), minIter.value().toInt()});
818820
if (hasKey(u"scheduler_days"_s))
819821
pref->setSchedulerDays(static_cast<Scheduler::Days>(it.value().toInt()));
822+
if (hasKey(u"schedule_pause_session"_s))
823+
session->setSchedulePauseSessionEnabled(it.value().toBool());
820824

821825
// Bittorrent
822826
// Privacy

src/webui/www/private/views/preferences.html

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,10 @@
698698
<label id="scheduleToHourLabel">QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog]</label>
699699
<input type="text" id="schedule_to_hour" aria-labelledby="scheduleToHourLabel" style="width: 3.6em;">:<input type="text" id="schedule_to_min" aria-labelledby="scheduleToHourLabel" style="width: 3.6em;">
700700
</div>
701+
<div>
702+
<input type="checkbox" id="schedule_pause_session_checkbox">
703+
<label for="schedule_pause_session_checkbox">QBT_TR(Schedule Pause session)QBT_TR[CONTEXT=OptionsDialog]</label>
704+
</div>
701705
<div class="formRow">
702706
<label for="schedule_freq_select">QBT_TR(When:)QBT_TR[CONTEXT=OptionsDialog]</label>
703707
<select id="schedule_freq_select">
@@ -2133,13 +2137,23 @@
21332137
};
21342138

21352139
// Speed tab
2140+
const updateSchedulePauseSessionCheckbox = () => {
2141+
const isLimitSchedulingEnabled = document.getElementById("limitSchedulingCheckbox").checked;
2142+
2143+
// disable and uncheck when scheduling disabled
2144+
document.getElementById("schedule_pause_session_checkbox").disabled = !isLimitSchedulingEnabled;
2145+
if (!isLimitSchedulingEnabled)
2146+
document.getElementById("schedule_pause_session_checkbox").checked = false;
2147+
};
2148+
21362149
const updateSchedulingEnabled = () => {
21372150
const isLimitSchedulingEnabled = document.getElementById("limitSchedulingCheckbox").checked;
21382151
document.getElementById("schedule_from_hour").disabled = !isLimitSchedulingEnabled;
21392152
document.getElementById("schedule_from_min").disabled = !isLimitSchedulingEnabled;
21402153
document.getElementById("schedule_to_hour").disabled = !isLimitSchedulingEnabled;
21412154
document.getElementById("schedule_to_min").disabled = !isLimitSchedulingEnabled;
21422155
document.getElementById("schedule_freq_select").disabled = !isLimitSchedulingEnabled;
2156+
updateSchedulePauseSessionCheckbox();
21432157
};
21442158

21452159
// Bittorrent tab
@@ -2583,6 +2597,7 @@
25832597
document.getElementById("schedule_to_hour").value = time_padding(pref.schedule_to_hour);
25842598
document.getElementById("schedule_to_min").value = time_padding(pref.schedule_to_min);
25852599
document.getElementById("schedule_freq_select").value = pref.scheduler_days;
2600+
document.getElementById("schedule_pause_session_checkbox").checked = pref.schedule_pause_session;
25862601
updateSchedulingEnabled();
25872602

25882603
// Bittorrent tab
@@ -3004,6 +3019,7 @@
30043019
settings["schedule_to_hour"] = Number(document.getElementById("schedule_to_hour").value);
30053020
settings["schedule_to_min"] = Number(document.getElementById("schedule_to_min").value);
30063021
settings["scheduler_days"] = Number(document.getElementById("schedule_freq_select").value);
3022+
settings["schedule_pause_session"] = document.getElementById("schedule_pause_session_checkbox").checked;
30073023
}
30083024

30093025
// Bittorrent tab

0 commit comments

Comments
 (0)