mirror of
https://github.com/transmission/transmission
synced 2025-02-23 14:40:43 +00:00
* fix: cpp:S3358 conditional-operators-should-not-be-nested warning in gtk client * fix: cpp:S1659 define-each-identifier-in-a-dedicated-statement warning in peer-mgr-wishlist * Revert "fix; cpp:S3642 replace-enum-with-enum-class warning in gtk client" * fix: cpp:S3576 remove-virtual-specifier-or-replace-it-by-override warning in rpc-server::Settings * fix: cpp:S3576 remove-virtual-specifier-or-replace-it-by-override warning in tr_session_alt_speeds::Settings * fix: remove unnecessary Settings subclass declarations * fix: cpp:S1117 shadow warning in qt client * fix: cpp:S6004 use init-statement to limit scope of local * fix: cpp:S5997 replace-std-lock-guard-with-std-sccoped-lock in favicon-cache.h * fix: cpp:S1659 define-each-identifier-in-a-dedicated-statement warning in announcer * fix: cpp:S5817 function-should-be-declared-const warning in cache.h * fix: cpp:S1186 explain-why-method-is-empty warning in favicon-cache * fix: cpp:S5408 constexpr-variables-should-not-be-declared-inline warning in favicon-cache * fix: cpp:S3624 explicitly delete copy assignment, ctor of InFlightData * fix: cpp:S5997 use std-scoped-lock-instead-of-std-lock-guard * fix: cpp:S5997 use std-scoped-lock-instead-of-std-lock-guard * fix: cpp:S5817 function-should-be-declared-const warning in favicon-cache.h * fix: cpp:S5817 function-should-be-declared-const warning in lru-cache * fix: cpp:S1709 add-the-explicit-keyword-to-this-constructor
189 lines
5.2 KiB
C++
189 lines
5.2 KiB
C++
// This file Copyright © Mnemosyne LLC.
|
|
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
|
|
// or any future license endorsed by Mnemosyne LLC.
|
|
// License text can be found in the licenses/ folder.
|
|
|
|
#ifndef __TRANSMISSION__
|
|
#error only libtransmission should #include this header.
|
|
#endif
|
|
|
|
#pragma once
|
|
|
|
#include <bitset>
|
|
#include <cstddef> // size_t
|
|
#include <ctime> // for time_t
|
|
#include <optional>
|
|
|
|
#include "libtransmission/transmission.h" // for TR_SCHED_ALL
|
|
|
|
#include "libtransmission/quark.h"
|
|
#include "libtransmission/settings.h"
|
|
#include "libtransmission/values.h"
|
|
|
|
struct tr_variant;
|
|
|
|
/** Manages alternate speed limits and a scheduler to auto-toggle them. */
|
|
class tr_session_alt_speeds
|
|
{
|
|
using Speed = libtransmission::Values::Speed;
|
|
|
|
public:
|
|
class Settings final : public libtransmission::Settings
|
|
{
|
|
public:
|
|
Settings() = default;
|
|
|
|
explicit Settings(tr_variant const& src)
|
|
{
|
|
load(src);
|
|
}
|
|
|
|
// NB: When adding a field here, you must also add it to
|
|
// fields() if you want it to be in session-settings.json
|
|
bool is_active = false;
|
|
bool scheduler_enabled = false; // whether alt speeds toggle on and off on schedule
|
|
size_t minute_begin = 540U; // minutes past midnight; 9AM
|
|
size_t minute_end = 1020U; // minutes past midnight; 5PM
|
|
size_t speed_down_kbyps = 50U;
|
|
size_t speed_up_kbyps = 50U;
|
|
size_t use_on_these_weekdays = TR_SCHED_ALL;
|
|
|
|
private:
|
|
[[nodiscard]] Fields fields() override
|
|
{
|
|
return {
|
|
{ TR_KEY_alt_speed_enabled, &is_active },
|
|
{ TR_KEY_alt_speed_up, &speed_up_kbyps },
|
|
{ TR_KEY_alt_speed_down, &speed_down_kbyps },
|
|
{ TR_KEY_alt_speed_time_enabled, &scheduler_enabled },
|
|
{ TR_KEY_alt_speed_time_day, &use_on_these_weekdays },
|
|
{ TR_KEY_alt_speed_time_begin, &minute_begin },
|
|
{ TR_KEY_alt_speed_time_end, &minute_end },
|
|
};
|
|
}
|
|
};
|
|
|
|
enum class ChangeReason
|
|
{
|
|
User,
|
|
Scheduler
|
|
};
|
|
|
|
class Mediator
|
|
{
|
|
public:
|
|
virtual ~Mediator() noexcept = default;
|
|
|
|
using ChangeReason = tr_session_alt_speeds::ChangeReason;
|
|
virtual void is_active_changed(bool is_active, ChangeReason reason) = 0;
|
|
|
|
[[nodiscard]] virtual time_t time() = 0;
|
|
};
|
|
|
|
constexpr explicit tr_session_alt_speeds(Mediator& mediator) noexcept
|
|
: mediator_{ mediator }
|
|
{
|
|
}
|
|
|
|
void load(Settings&& settings);
|
|
|
|
[[nodiscard]] constexpr auto const& settings() const noexcept
|
|
{
|
|
return settings_;
|
|
}
|
|
|
|
[[nodiscard]] constexpr bool is_active() const noexcept
|
|
{
|
|
return settings().is_active;
|
|
}
|
|
|
|
void check_scheduler();
|
|
|
|
void set_scheduler_enabled(bool enabled)
|
|
{
|
|
settings_.scheduler_enabled = enabled;
|
|
update_scheduler();
|
|
}
|
|
|
|
// return true iff the scheduler will turn alt speeds on/off
|
|
[[nodiscard]] constexpr auto is_scheduler_enabled() const noexcept
|
|
{
|
|
return settings().scheduler_enabled;
|
|
}
|
|
|
|
void set_start_minute(size_t minute)
|
|
{
|
|
settings_.minute_begin = minute;
|
|
update_scheduler();
|
|
}
|
|
|
|
[[nodiscard]] constexpr auto start_minute() const noexcept
|
|
{
|
|
return settings().minute_begin;
|
|
}
|
|
|
|
void set_end_minute(size_t minute)
|
|
{
|
|
settings_.minute_end = minute;
|
|
update_scheduler();
|
|
}
|
|
|
|
[[nodiscard]] constexpr auto end_minute() const noexcept
|
|
{
|
|
return settings().minute_end;
|
|
}
|
|
|
|
void set_weekdays(tr_sched_day days)
|
|
{
|
|
settings_.use_on_these_weekdays = days;
|
|
update_scheduler();
|
|
}
|
|
|
|
[[nodiscard]] constexpr tr_sched_day weekdays() const noexcept
|
|
{
|
|
return static_cast<tr_sched_day>(settings().use_on_these_weekdays);
|
|
}
|
|
|
|
[[nodiscard]] auto speed_limit(tr_direction const dir) const noexcept
|
|
{
|
|
auto const kbyps = dir == TR_DOWN ? settings().speed_down_kbyps : settings().speed_up_kbyps;
|
|
return Speed{ kbyps, Speed::Units::KByps };
|
|
}
|
|
|
|
constexpr void set_speed_limit(tr_direction dir, Speed const limit) noexcept
|
|
{
|
|
if (dir == TR_DOWN)
|
|
{
|
|
settings_.speed_down_kbyps = limit.count(Speed::Units::KByps);
|
|
}
|
|
else
|
|
{
|
|
settings_.speed_up_kbyps = limit.count(Speed::Units::KByps);
|
|
}
|
|
}
|
|
|
|
void set_active(bool active, ChangeReason reason);
|
|
|
|
private:
|
|
Mediator& mediator_;
|
|
|
|
Settings settings_;
|
|
|
|
void update_scheduler();
|
|
void update_minutes();
|
|
|
|
// whether `time` hits in one of the `minutes_` that is true
|
|
[[nodiscard]] bool is_active_minute(time_t time) const noexcept;
|
|
|
|
static auto constexpr MinutesPerHour = int{ 60 };
|
|
static auto constexpr MinutesPerDay = int{ MinutesPerHour * 24 };
|
|
static auto constexpr MinutesPerWeek = int{ MinutesPerDay * 7 };
|
|
|
|
// bitfield of all the minutes in a week.
|
|
// Each bit's value indicates whether the scheduler wants
|
|
// alt speeds on or off at that given minute.
|
|
std::bitset<10080> minutes_{};
|
|
|
|
// recent change that was made by the scheduler
|
|
std::optional<bool> scheduler_set_is_active_to_;
|
|
};
|