refactor: use new tr_variant API in daemon (#7103)

This commit is contained in:
Yat Ho
2025-11-13 03:04:55 +08:00
committed by GitHub
parent 48ec09771c
commit 8d25484cdb

View File

@@ -392,13 +392,14 @@ tr_rpc_callback_status on_rpc_callback(tr_session* /*session*/, tr_rpc_callback_
tr_variant load_settings(char const* config_dir) tr_variant load_settings(char const* config_dir)
{ {
auto app_defaults = tr_variant::make_map(); auto app_defaults_map = tr_variant::Map{ 6U };
tr_variantDictAddStrView(&app_defaults, TR_KEY_watch_dir, ""sv); app_defaults_map.try_emplace(TR_KEY_watch_dir, tr_variant::unmanaged_string(""sv));
tr_variantDictAddBool(&app_defaults, TR_KEY_watch_dir_enabled, false); app_defaults_map.try_emplace(TR_KEY_watch_dir_enabled, false);
tr_variantDictAddBool(&app_defaults, TR_KEY_watch_dir_force_generic, false); app_defaults_map.try_emplace(TR_KEY_watch_dir_force_generic, false);
tr_variantDictAddBool(&app_defaults, TR_KEY_rpc_enabled, true); app_defaults_map.try_emplace(TR_KEY_rpc_enabled, true);
tr_variantDictAddBool(&app_defaults, TR_KEY_start_paused, false); app_defaults_map.try_emplace(TR_KEY_start_paused, false);
tr_variantDictAddStrView(&app_defaults, TR_KEY_pidfile, ""sv); app_defaults_map.try_emplace(TR_KEY_pidfile, tr_variant::unmanaged_string(""sv));
auto const app_defaults = tr_variant{ std::move(app_defaults_map) };
return tr_sessionLoadSettings(&app_defaults, config_dir, MyName); return tr_sessionLoadSettings(&app_defaults, config_dir, MyName);
} }
@@ -460,6 +461,12 @@ bool tr_daemon::parse_args(int argc, char const* const* argv, bool* dump_setting
*dump_settings = false; *dump_settings = false;
*foreground = false; *foreground = false;
auto* const map = settings_.get_if<tr_variant::Map>();
if (map == nullptr)
{
return false;
}
tr_optind = 1; tr_optind = 1;
while ((c = tr_getopt(Usage, argc, argv, std::data(Options), &optstr)) != TR_OPT_DONE) while ((c = tr_getopt(Usage, argc, argv, std::data(Options), &optstr)) != TR_OPT_DONE)
@@ -467,46 +474,46 @@ bool tr_daemon::parse_args(int argc, char const* const* argv, bool* dump_setting
switch (c) switch (c)
{ {
case 'a': case 'a':
tr_variantDictAddStr(&settings_, TR_KEY_rpc_whitelist, optstr); map->insert_or_assign(TR_KEY_rpc_whitelist, optstr);
tr_variantDictAddBool(&settings_, TR_KEY_rpc_whitelist_enabled, true); map->insert_or_assign(TR_KEY_rpc_whitelist_enabled, true);
break; break;
case 'b': case 'b':
tr_variantDictAddBool(&settings_, TR_KEY_blocklist_enabled, true); map->insert_or_assign(TR_KEY_blocklist_enabled, true);
break; break;
case 'B': case 'B':
tr_variantDictAddBool(&settings_, TR_KEY_blocklist_enabled, false); map->insert_or_assign(TR_KEY_blocklist_enabled, false);
break; break;
case 'c': case 'c':
tr_variantDictAddStr(&settings_, TR_KEY_watch_dir, optstr); map->insert_or_assign(TR_KEY_watch_dir, optstr);
tr_variantDictAddBool(&settings_, TR_KEY_watch_dir_enabled, true); map->insert_or_assign(TR_KEY_watch_dir_enabled, true);
break; break;
case 'C': case 'C':
tr_variantDictAddBool(&settings_, TR_KEY_watch_dir_enabled, false); map->insert_or_assign(TR_KEY_watch_dir_enabled, false);
break; break;
case 941: case 941:
tr_variantDictAddStr(&settings_, TR_KEY_incomplete_dir, optstr); map->insert_or_assign(TR_KEY_incomplete_dir, optstr);
tr_variantDictAddBool(&settings_, TR_KEY_incomplete_dir_enabled, true); map->insert_or_assign(TR_KEY_incomplete_dir_enabled, true);
break; break;
case 942: case 942:
tr_variantDictAddBool(&settings_, TR_KEY_incomplete_dir_enabled, false); map->insert_or_assign(TR_KEY_incomplete_dir_enabled, false);
break; break;
case 943: case 943:
tr_variantDictAddStr(&settings_, TR_KEY_default_trackers, optstr); map->insert_or_assign(TR_KEY_default_trackers, optstr);
break; break;
case 994: case 994:
tr_variantDictAddBool(&settings_, TR_KEY_sequential_download, true); map->insert_or_assign(TR_KEY_sequential_download, true);
break; break;
case 995: case 995:
tr_variantDictAddBool(&settings_, TR_KEY_sequential_download, false); map->insert_or_assign(TR_KEY_sequential_download, false);
break; break;
case 'd': case 'd':
@@ -534,125 +541,125 @@ bool tr_daemon::parse_args(int argc, char const* const* argv, bool* dump_setting
return false; return false;
case 'o': case 'o':
tr_variantDictAddBool(&settings_, TR_KEY_dht_enabled, true); map->insert_or_assign(TR_KEY_dht_enabled, true);
break; break;
case 'O': case 'O':
tr_variantDictAddBool(&settings_, TR_KEY_dht_enabled, false); map->insert_or_assign(TR_KEY_dht_enabled, false);
break; break;
case 'p': case 'p':
if (auto const rpc_port = tr_num_parse<uint16_t>(optstr); rpc_port) if (auto const rpc_port = tr_num_parse<uint16_t>(optstr); rpc_port)
{ {
tr_variantDictAddInt(&settings_, TR_KEY_rpc_port, *rpc_port); map->insert_or_assign(TR_KEY_rpc_port, *rpc_port);
} }
break; break;
case 't': case 't':
tr_variantDictAddBool(&settings_, TR_KEY_rpc_authentication_required, true); map->insert_or_assign(TR_KEY_rpc_authentication_required, true);
break; break;
case 'T': case 'T':
tr_variantDictAddBool(&settings_, TR_KEY_rpc_authentication_required, false); map->insert_or_assign(TR_KEY_rpc_authentication_required, false);
break; break;
case 'u': case 'u':
tr_variantDictAddStr(&settings_, TR_KEY_rpc_username, optstr); map->insert_or_assign(TR_KEY_rpc_username, optstr);
break; break;
case 'v': case 'v':
tr_variantDictAddStr(&settings_, TR_KEY_rpc_password, optstr); map->insert_or_assign(TR_KEY_rpc_password, optstr);
break; break;
case 'w': case 'w':
tr_variantDictAddStr(&settings_, TR_KEY_download_dir, optstr); map->insert_or_assign(TR_KEY_download_dir, optstr);
break; break;
case 'P': case 'P':
if (auto const peer_port = tr_num_parse<uint16_t>(optstr); peer_port) if (auto const peer_port = tr_num_parse<uint16_t>(optstr); peer_port)
{ {
tr_variantDictAddInt(&settings_, TR_KEY_peer_port, *peer_port); map->insert_or_assign(TR_KEY_peer_port, *peer_port);
} }
break; break;
case 'm': case 'm':
tr_variantDictAddBool(&settings_, TR_KEY_port_forwarding_enabled, true); map->insert_or_assign(TR_KEY_port_forwarding_enabled, true);
break; break;
case 'M': case 'M':
tr_variantDictAddBool(&settings_, TR_KEY_port_forwarding_enabled, false); map->insert_or_assign(TR_KEY_port_forwarding_enabled, false);
break; break;
case 'L': case 'L':
if (auto const peer_limit_global = tr_num_parse<int64_t>(optstr); peer_limit_global && *peer_limit_global >= 0) if (auto const peer_limit_global = tr_num_parse<int64_t>(optstr); peer_limit_global && *peer_limit_global >= 0)
{ {
tr_variantDictAddInt(&settings_, TR_KEY_peer_limit_global, *peer_limit_global); map->insert_or_assign(TR_KEY_peer_limit_global, *peer_limit_global);
} }
break; break;
case 'l': case 'l':
if (auto const peer_limit_tor = tr_num_parse<int64_t>(optstr); peer_limit_tor && *peer_limit_tor >= 0) if (auto const peer_limit_tor = tr_num_parse<int64_t>(optstr); peer_limit_tor && *peer_limit_tor >= 0)
{ {
tr_variantDictAddInt(&settings_, TR_KEY_peer_limit_per_torrent, *peer_limit_tor); map->insert_or_assign(TR_KEY_peer_limit_per_torrent, *peer_limit_tor);
} }
break; break;
case 800: case 800:
tr_variantDictAddBool(&settings_, TR_KEY_start_paused, true); map->insert_or_assign(TR_KEY_start_paused, true);
break; break;
case 910: case 910:
tr_variantDictAddInt(&settings_, TR_KEY_encryption, TR_ENCRYPTION_REQUIRED); map->insert_or_assign(TR_KEY_encryption, TR_ENCRYPTION_REQUIRED);
break; break;
case 911: case 911:
tr_variantDictAddInt(&settings_, TR_KEY_encryption, TR_ENCRYPTION_PREFERRED); map->insert_or_assign(TR_KEY_encryption, TR_ENCRYPTION_PREFERRED);
break; break;
case 912: case 912:
tr_variantDictAddInt(&settings_, TR_KEY_encryption, TR_CLEAR_PREFERRED); map->insert_or_assign(TR_KEY_encryption, TR_CLEAR_PREFERRED);
break; break;
case 'i': case 'i':
tr_variantDictAddStr(&settings_, TR_KEY_bind_address_ipv4, optstr); map->insert_or_assign(TR_KEY_bind_address_ipv4, optstr);
break; break;
case 'I': case 'I':
tr_variantDictAddStr(&settings_, TR_KEY_bind_address_ipv6, optstr); map->insert_or_assign(TR_KEY_bind_address_ipv6, optstr);
break; break;
case 'r': case 'r':
tr_variantDictAddStr(&settings_, TR_KEY_rpc_bind_address, optstr); map->insert_or_assign(TR_KEY_rpc_bind_address, optstr);
break; break;
case 953: case 953:
if (auto const ratio_limit = tr_num_parse<double>(optstr); ratio_limit) if (auto const ratio_limit = tr_num_parse<double>(optstr); ratio_limit)
{ {
tr_variantDictAddReal(&settings_, TR_KEY_ratio_limit, *ratio_limit); map->insert_or_assign(TR_KEY_ratio_limit, *ratio_limit);
} }
tr_variantDictAddBool(&settings_, TR_KEY_ratio_limit_enabled, true); map->insert_or_assign(TR_KEY_ratio_limit_enabled, true);
break; break;
case 954: case 954:
tr_variantDictAddBool(&settings_, TR_KEY_ratio_limit_enabled, false); map->insert_or_assign(TR_KEY_ratio_limit_enabled, false);
break; break;
case 'x': case 'x':
tr_variantDictAddStr(&settings_, TR_KEY_pidfile, optstr); map->insert_or_assign(TR_KEY_pidfile, optstr);
break; break;
case 'y': case 'y':
tr_variantDictAddBool(&settings_, TR_KEY_lpd_enabled, true); map->insert_or_assign(TR_KEY_lpd_enabled, true);
break; break;
case 'Y': case 'Y':
tr_variantDictAddBool(&settings_, TR_KEY_lpd_enabled, false); map->insert_or_assign(TR_KEY_lpd_enabled, false);
break; break;
case 810: case 810:
if (auto const level = tr_logGetLevelFromKey(optstr); level) if (auto const level = tr_logGetLevelFromKey(optstr); level)
{ {
tr_variantDictAddInt(&settings_, TR_KEY_message_level, *level); map->insert_or_assign(TR_KEY_message_level, *level);
} }
else else
{ {
@@ -663,25 +670,25 @@ bool tr_daemon::parse_args(int argc, char const* const* argv, bool* dump_setting
case 811: case 811:
std::cerr << "WARN: --log-error is deprecated. Use --log-level=error" << std::endl; std::cerr << "WARN: --log-error is deprecated. Use --log-level=error" << std::endl;
tr_variantDictAddInt(&settings_, TR_KEY_message_level, TR_LOG_ERROR); map->insert_or_assign(TR_KEY_message_level, TR_LOG_ERROR);
break; break;
case 812: case 812:
std::cerr << "WARN: --log-info is deprecated. Use --log-level=info" << std::endl; std::cerr << "WARN: --log-info is deprecated. Use --log-level=info" << std::endl;
tr_variantDictAddInt(&settings_, TR_KEY_message_level, TR_LOG_INFO); map->insert_or_assign(TR_KEY_message_level, TR_LOG_INFO);
break; break;
case 813: case 813:
std::cerr << "WARN: --log-debug is deprecated. Use --log-level=debug" << std::endl; std::cerr << "WARN: --log-debug is deprecated. Use --log-level=debug" << std::endl;
tr_variantDictAddInt(&settings_, TR_KEY_message_level, TR_LOG_DEBUG); map->insert_or_assign(TR_KEY_message_level, TR_LOG_DEBUG);
break; break;
case 830: case 830:
tr_variantDictAddBool(&settings_, TR_KEY_utp_enabled, true); map->insert_or_assign(TR_KEY_utp_enabled, true);
break; break;
case 831: case 831:
tr_variantDictAddBool(&settings_, TR_KEY_utp_enabled, false); map->insert_or_assign(TR_KEY_utp_enabled, false);
break; break;
case TR_OPT_UNK: case TR_OPT_UNK:
@@ -778,9 +785,15 @@ int tr_daemon::start([[maybe_unused]] bool foreground)
tr_logAddInfo(fmt::format(fmt::runtime(_("Loading settings from '{path}'")), fmt::arg("path", cdir))); tr_logAddInfo(fmt::format(fmt::runtime(_("Loading settings from '{path}'")), fmt::arg("path", cdir)));
tr_sessionSaveSettings(session, cdir, settings_); tr_sessionSaveSettings(session, cdir, settings_);
auto sv = std::string_view{}; auto const* const settings_map = settings_.get_if<tr_variant::Map>();
(void)tr_variantDictFindStrView(&settings_, TR_KEY_pidfile, &sv); if (settings_map == nullptr)
auto const sz_pid_filename = std::string{ sv }; {
static auto constexpr Errmsg = "Unreachable code, please file a bug report"sv;
printMessage(log_stream_, TR_LOG_ERROR, MyName, Errmsg, __FILE__, __LINE__);
return 1;
}
auto const sz_pid_filename = std::string{ settings_map->value_if<std::string_view>(TR_KEY_pidfile).value_or(""sv) };
auto pidfile_created = false; auto pidfile_created = false;
if (!std::empty(sz_pid_filename)) if (!std::empty(sz_pid_filename))
{ {
@@ -809,7 +822,7 @@ int tr_daemon::start([[maybe_unused]] bool foreground)
} }
} }
if (auto tmp_bool = false; tr_variantDictFindBool(&settings_, TR_KEY_rpc_authentication_required, &tmp_bool) && tmp_bool) if (settings_map->value_if<bool>(TR_KEY_rpc_authentication_required).value_or(false))
{ {
tr_logAddInfo(_("Requiring authentication")); tr_logAddInfo(_("Requiring authentication"));
} }
@@ -824,14 +837,11 @@ int tr_daemon::start([[maybe_unused]] bool foreground)
/* maybe add a watchdir */ /* maybe add a watchdir */
auto watchdir = std::unique_ptr<Watchdir>{}; auto watchdir = std::unique_ptr<Watchdir>{};
if (auto tmp_bool = false; tr_variantDictFindBool(&settings_, TR_KEY_watch_dir_enabled, &tmp_bool) && tmp_bool) if (settings_map->value_if<bool>(TR_KEY_watch_dir_enabled).value_or(false))
{ {
auto force_generic = false; auto const force_generic = settings_map->value_if<bool>(TR_KEY_watch_dir_force_generic).value_or(false);
(void)tr_variantDictFindBool(&settings_, TR_KEY_watch_dir_force_generic, &force_generic);
auto dir = std::string_view{}; if (auto dir = settings_map->value_if<std::string_view>(TR_KEY_watch_dir).value_or(""sv); !std::empty(dir))
(void)tr_variantDictFindStrView(&settings_, TR_KEY_watch_dir, &dir);
if (!std::empty(dir))
{ {
tr_logAddInfo(fmt::format(fmt::runtime(_("Watching '{path}' for new torrent files")), fmt::arg("path", dir))); tr_logAddInfo(fmt::format(fmt::runtime(_("Watching '{path}' for new torrent files")), fmt::arg("path", dir)));
@@ -850,7 +860,7 @@ int tr_daemon::start([[maybe_unused]] bool foreground)
{ {
tr_ctor* ctor = tr_ctorNew(my_session_); tr_ctor* ctor = tr_ctorNew(my_session_);
if (auto paused = false; tr_variantDictFindBool(&settings_, TR_KEY_start_paused, &paused) && paused) if (settings_map->value_if<bool>(TR_KEY_start_paused).value_or(false))
{ {
tr_ctorSetPaused(ctor, TR_FORCE, true); tr_ctorSetPaused(ctor, TR_FORCE, true);
} }