mirror of
https://github.com/transmission/transmission.git
synced 2025-12-20 02:18:42 +00:00
refactor: remove TR_N_ELEMENTS macro (#3674)
* refactor: use std::array for keys in transmission-remote * refactor: use std::array for wide_module_path in platform.cc * refactor: use std::array for value in tr_env_get_int() * refactor: use std::array for SysStoreNames in web.cc * chore: remove unused macro TR_N_ELEMENTS
This commit is contained in:
@@ -278,9 +278,9 @@ std::string tr_getWebClientDir([[maybe_unused]] tr_session const* session)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check calling module place */
|
/* check calling module place */
|
||||||
wchar_t wide_module_path[MAX_PATH];
|
auto wide_module_path = std::array<wchar_t, MAX_PATH>{};
|
||||||
GetModuleFileNameW(nullptr, wide_module_path, TR_N_ELEMENTS(wide_module_path));
|
GetModuleFileNameW(nullptr, std::data(wide_module_path), std::size(wide_module_path));
|
||||||
auto const module_path = tr_win32_native_to_utf8(wide_module_path);
|
auto const module_path = tr_win32_native_to_utf8({ std::data(wide_module_path) });
|
||||||
if (auto const dir = tr_sys_path_dirname(module_path); !std::empty(dir))
|
if (auto const dir = tr_sys_path_dirname(module_path); !std::empty(dir))
|
||||||
{
|
{
|
||||||
if (auto const path = tr_pathbuf{ dir, "/Web"sv }; isWebClientDir(path))
|
if (auto const path = tr_pathbuf{ dir, "/Web"sv }; isWebClientDir(path))
|
||||||
|
|||||||
@@ -978,16 +978,16 @@ int tr_env_get_int(char const* key, int default_value)
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
char value[16];
|
auto value = std::array<char, 16>{};
|
||||||
|
|
||||||
if (GetEnvironmentVariableA(key, value, TR_N_ELEMENTS(value)) > 1)
|
if (GetEnvironmentVariableA(key, std::data(value), std::size(value)) > 1)
|
||||||
{
|
{
|
||||||
return atoi(value);
|
return atoi(std::data(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if (char const* value = getenv(key); !tr_str_is_empty(value))
|
if (char const* const value = getenv(key); !tr_str_is_empty(value))
|
||||||
{
|
{
|
||||||
return atoi(value);
|
return atoi(value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,8 +56,6 @@ struct tr_error;
|
|||||||
*****
|
*****
|
||||||
****/
|
****/
|
||||||
|
|
||||||
#define TR_N_ELEMENTS(ary) (sizeof(ary) / sizeof(*(ary)))
|
|
||||||
|
|
||||||
[[nodiscard]] std::string_view tr_get_mime_type_for_filename(std::string_view filename);
|
[[nodiscard]] std::string_view tr_get_mime_type_for_filename(std::string_view filename);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,10 +78,10 @@ constexpr auto tr_saveFile(std::string_view filename, ContiguousRange const& x,
|
|||||||
* @brief Get disk capacity and free disk space (in bytes) for the specified folder.
|
* @brief Get disk capacity and free disk space (in bytes) for the specified folder.
|
||||||
* @return struct with free and total as zero or positive integer on success, -1 in case of error.
|
* @return struct with free and total as zero or positive integer on success, -1 in case of error.
|
||||||
*/
|
*/
|
||||||
tr_disk_space tr_dirSpace(std::string_view directory);
|
[[nodiscard]] tr_disk_space tr_dirSpace(std::string_view directory);
|
||||||
|
|
||||||
/** @brief return the current date in milliseconds */
|
/** @brief return the current date in milliseconds */
|
||||||
uint64_t tr_time_msec();
|
[[nodiscard]] uint64_t tr_time_msec();
|
||||||
|
|
||||||
/** @brief sleep the specified number of milliseconds */
|
/** @brief sleep the specified number of milliseconds */
|
||||||
void tr_wait_msec(long int delay_milliseconds);
|
void tr_wait_msec(long int delay_milliseconds);
|
||||||
@@ -96,9 +94,9 @@ template<typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> =
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
std::string tr_win32_format_message(uint32_t code);
|
[[nodiscard]] std::string tr_win32_format_message(uint32_t code);
|
||||||
std::string tr_win32_native_to_utf8(std::wstring_view);
|
[[nodiscard]] std::string tr_win32_native_to_utf8(std::wstring_view);
|
||||||
std::wstring tr_win32_utf8_to_native(std::string_view);
|
[[nodiscard]] std::wstring tr_win32_utf8_to_native(std::string_view);
|
||||||
|
|
||||||
int tr_main_win32(int argc, char** argv, int (*real_main)(int, char**));
|
int tr_main_win32(int argc, char** argv, int (*real_main)(int, char**));
|
||||||
|
|
||||||
@@ -120,7 +118,7 @@ int tr_main_win32(int argc, char** argv, int (*real_main)(int, char**));
|
|||||||
****
|
****
|
||||||
***/
|
***/
|
||||||
|
|
||||||
constexpr bool tr_str_is_empty(char const* value)
|
[[nodiscard]] constexpr bool tr_str_is_empty(char const* value)
|
||||||
{
|
{
|
||||||
return value == nullptr || *value == '\0';
|
return value == nullptr || *value == '\0';
|
||||||
}
|
}
|
||||||
@@ -295,10 +293,10 @@ constexpr void tr_timeUpdate(time_t now) noexcept
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @brief Portability wrapper for htonll() that uses the system implementation if available */
|
/** @brief Portability wrapper for htonll() that uses the system implementation if available */
|
||||||
uint64_t tr_htonll(uint64_t);
|
[[nodiscard]] uint64_t tr_htonll(uint64_t);
|
||||||
|
|
||||||
/** @brief Portability wrapper for htonll() that uses the system implementation if available */
|
/** @brief Portability wrapper for htonll() that uses the system implementation if available */
|
||||||
uint64_t tr_ntohll(uint64_t);
|
[[nodiscard]] uint64_t tr_ntohll(uint64_t);
|
||||||
|
|
||||||
/***
|
/***
|
||||||
****
|
****
|
||||||
@@ -317,40 +315,40 @@ extern size_t tr_mem_K;
|
|||||||
extern uint64_t tr_size_K; /* unused? */
|
extern uint64_t tr_size_K; /* unused? */
|
||||||
|
|
||||||
/* format a speed from KBps into a user-readable string. */
|
/* format a speed from KBps into a user-readable string. */
|
||||||
std::string tr_formatter_speed_KBps(double KBps);
|
[[nodiscard]] std::string tr_formatter_speed_KBps(double KBps);
|
||||||
|
|
||||||
/* format a memory size from bytes into a user-readable string. */
|
/* format a memory size from bytes into a user-readable string. */
|
||||||
std::string tr_formatter_mem_B(size_t bytes);
|
[[nodiscard]] std::string tr_formatter_mem_B(size_t bytes);
|
||||||
|
|
||||||
/* format a memory size from MB into a user-readable string. */
|
/* format a memory size from MB into a user-readable string. */
|
||||||
static inline std::string tr_formatter_mem_MB(double MBps)
|
[[nodiscard]] static inline std::string tr_formatter_mem_MB(double MBps)
|
||||||
{
|
{
|
||||||
return tr_formatter_mem_B((size_t)(MBps * tr_mem_K * tr_mem_K));
|
return tr_formatter_mem_B((size_t)(MBps * tr_mem_K * tr_mem_K));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* format a file size from bytes into a user-readable string. */
|
/* format a file size from bytes into a user-readable string. */
|
||||||
std::string tr_formatter_size_B(uint64_t bytes);
|
[[nodiscard]] std::string tr_formatter_size_B(uint64_t bytes);
|
||||||
|
|
||||||
void tr_formatter_get_units(void* dict);
|
void tr_formatter_get_units(void* dict);
|
||||||
|
|
||||||
static inline unsigned int tr_toSpeedBytes(unsigned int KBps)
|
[[nodiscard]] static inline unsigned int tr_toSpeedBytes(unsigned int KBps)
|
||||||
{
|
{
|
||||||
return KBps * tr_speed_K;
|
return KBps * tr_speed_K;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline auto tr_toSpeedKBps(unsigned int Bps)
|
[[nodiscard]] static inline auto tr_toSpeedKBps(unsigned int Bps)
|
||||||
{
|
{
|
||||||
return Bps / double(tr_speed_K);
|
return Bps / double(tr_speed_K);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline auto tr_toMemBytes(unsigned int MB)
|
[[nodiscard]] static inline auto tr_toMemBytes(unsigned int MB)
|
||||||
{
|
{
|
||||||
auto B = uint64_t(tr_mem_K) * tr_mem_K;
|
auto B = uint64_t(tr_mem_K) * tr_mem_K;
|
||||||
B *= MB;
|
B *= MB;
|
||||||
return B;
|
return B;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline auto tr_toMemMB(uint64_t B)
|
[[nodiscard]] static inline auto tr_toMemMB(uint64_t B)
|
||||||
{
|
{
|
||||||
return int(B / (tr_mem_K * tr_mem_K));
|
return int(B / (tr_mem_K * tr_mem_K));
|
||||||
}
|
}
|
||||||
@@ -360,13 +358,13 @@ static inline auto tr_toMemMB(uint64_t B)
|
|||||||
***/
|
***/
|
||||||
|
|
||||||
/** @brief Check if environment variable exists. */
|
/** @brief Check if environment variable exists. */
|
||||||
bool tr_env_key_exists(char const* key);
|
[[nodiscard]] bool tr_env_key_exists(char const* key);
|
||||||
|
|
||||||
/** @brief Get environment variable value as int. */
|
/** @brief Get environment variable value as int. */
|
||||||
int tr_env_get_int(char const* key, int default_value);
|
[[nodiscard]] int tr_env_get_int(char const* key, int default_value);
|
||||||
|
|
||||||
/** @brief Get environment variable value as string. */
|
/** @brief Get environment variable value as string. */
|
||||||
std::string tr_env_get_string(std::string_view key, std::string_view default_value = {});
|
[[nodiscard]] std::string tr_env_get_string(std::string_view key, std::string_view default_value = {});
|
||||||
|
|
||||||
/***
|
/***
|
||||||
****
|
****
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
// License text can be found in the licenses/ folder.
|
// License text can be found in the licenses/ folder.
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
@@ -57,14 +58,14 @@ static CURLcode ssl_context_func(CURL* /*curl*/, void* ssl_ctx, void* /*user_dat
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static LPCWSTR const sys_store_names[] = {
|
static auto constexpr SysStoreNames = std::array<LPCWSTR, 2>{
|
||||||
L"CA",
|
L"CA",
|
||||||
L"ROOT",
|
L"ROOT",
|
||||||
};
|
};
|
||||||
|
|
||||||
for (size_t i = 0; i < TR_N_ELEMENTS(sys_store_names); ++i)
|
for (auto& sys_store_name : SysStoreNames)
|
||||||
{
|
{
|
||||||
HCERTSTORE const sys_cert_store = CertOpenSystemStoreW(0, sys_store_names[i]);
|
HCERTSTORE const sys_cert_store = CertOpenSystemStoreW(0, sys_store_name);
|
||||||
if (sys_cert_store == nullptr)
|
if (sys_cert_store == nullptr)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -712,14 +712,16 @@ static void addFiles(tr_variant* args, tr_quark const key, char const* arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static tr_quark const files_keys[] = {
|
// clang-format off
|
||||||
|
|
||||||
|
static auto constexpr FilesKeys = std::array<tr_quark, 4>{
|
||||||
TR_KEY_files,
|
TR_KEY_files,
|
||||||
TR_KEY_name,
|
TR_KEY_name,
|
||||||
TR_KEY_priorities,
|
TR_KEY_priorities,
|
||||||
TR_KEY_wanted,
|
TR_KEY_wanted,
|
||||||
};
|
};
|
||||||
|
|
||||||
static tr_quark const details_keys[] = {
|
static auto constexpr DetailsKeys = std::array<tr_quark, 52>{
|
||||||
TR_KEY_activityDate,
|
TR_KEY_activityDate,
|
||||||
TR_KEY_addedDate,
|
TR_KEY_addedDate,
|
||||||
TR_KEY_bandwidthPriority,
|
TR_KEY_bandwidthPriority,
|
||||||
@@ -771,26 +773,28 @@ static tr_quark const details_keys[] = {
|
|||||||
TR_KEY_uploadLimited,
|
TR_KEY_uploadLimited,
|
||||||
TR_KEY_uploadRatio,
|
TR_KEY_uploadRatio,
|
||||||
TR_KEY_webseeds,
|
TR_KEY_webseeds,
|
||||||
TR_KEY_webseedsSendingToUs,
|
TR_KEY_webseedsSendingToUs
|
||||||
};
|
};
|
||||||
|
|
||||||
static tr_quark const list_keys[] = {
|
static auto constexpr ListKeys = std::array<tr_quark, 14>{
|
||||||
TR_KEY_error, //
|
TR_KEY_error,
|
||||||
TR_KEY_errorString, //
|
TR_KEY_errorString,
|
||||||
TR_KEY_eta, //
|
TR_KEY_eta,
|
||||||
TR_KEY_id, //
|
TR_KEY_id,
|
||||||
TR_KEY_isFinished, //
|
TR_KEY_isFinished,
|
||||||
TR_KEY_leftUntilDone, //
|
TR_KEY_leftUntilDone,
|
||||||
TR_KEY_name, //
|
TR_KEY_name,
|
||||||
TR_KEY_peersGettingFromUs, //
|
TR_KEY_peersGettingFromUs,
|
||||||
TR_KEY_peersSendingToUs, //
|
TR_KEY_peersSendingToUs,
|
||||||
TR_KEY_rateDownload, //
|
TR_KEY_rateDownload,
|
||||||
TR_KEY_rateUpload, //
|
TR_KEY_rateUpload,
|
||||||
TR_KEY_sizeWhenDone, //
|
TR_KEY_sizeWhenDone,
|
||||||
TR_KEY_status, //
|
TR_KEY_status,
|
||||||
TR_KEY_uploadRatio, //
|
TR_KEY_uploadRatio
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
static size_t writeFunc(void* ptr, size_t size, size_t nmemb, void* vbuf)
|
static size_t writeFunc(void* ptr, size_t size, size_t nmemb, void* vbuf)
|
||||||
{
|
{
|
||||||
auto* const buf = static_cast<evbuffer*>(vbuf);
|
auto* const buf = static_cast<evbuffer*>(vbuf);
|
||||||
@@ -2557,9 +2561,9 @@ static int processArgs(char const* rpcurl, int argc, char const* const* argv, Co
|
|||||||
config.filter = optarg;
|
config.filter = optarg;
|
||||||
tr_variantDictAddInt(&top, TR_KEY_tag, TAG_FILTER);
|
tr_variantDictAddInt(&top, TR_KEY_tag, TAG_FILTER);
|
||||||
|
|
||||||
for (size_t i = 0; i < TR_N_ELEMENTS(details_keys); ++i)
|
for (auto const& key : DetailsKeys)
|
||||||
{
|
{
|
||||||
tr_variantListAddQuark(fields, details_keys[i]);
|
tr_variantListAddQuark(fields, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
addIdArg(args, config, "all");
|
addIdArg(args, config, "all");
|
||||||
@@ -2567,9 +2571,9 @@ static int processArgs(char const* rpcurl, int argc, char const* const* argv, Co
|
|||||||
case 'i':
|
case 'i':
|
||||||
tr_variantDictAddInt(&top, TR_KEY_tag, TAG_DETAILS);
|
tr_variantDictAddInt(&top, TR_KEY_tag, TAG_DETAILS);
|
||||||
|
|
||||||
for (size_t i = 0; i < TR_N_ELEMENTS(details_keys); ++i)
|
for (auto const& key : DetailsKeys)
|
||||||
{
|
{
|
||||||
tr_variantListAddQuark(fields, details_keys[i]);
|
tr_variantListAddQuark(fields, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
addIdArg(args, config);
|
addIdArg(args, config);
|
||||||
@@ -2578,9 +2582,9 @@ static int processArgs(char const* rpcurl, int argc, char const* const* argv, Co
|
|||||||
case 'l':
|
case 'l':
|
||||||
tr_variantDictAddInt(&top, TR_KEY_tag, TAG_LIST);
|
tr_variantDictAddInt(&top, TR_KEY_tag, TAG_LIST);
|
||||||
|
|
||||||
for (size_t i = 0; i < TR_N_ELEMENTS(list_keys); ++i)
|
for (auto const& key : ListKeys)
|
||||||
{
|
{
|
||||||
tr_variantListAddQuark(fields, list_keys[i]);
|
tr_variantListAddQuark(fields, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
addIdArg(args, config, "all");
|
addIdArg(args, config, "all");
|
||||||
@@ -2589,9 +2593,9 @@ static int processArgs(char const* rpcurl, int argc, char const* const* argv, Co
|
|||||||
case 940:
|
case 940:
|
||||||
tr_variantDictAddInt(&top, TR_KEY_tag, TAG_FILES);
|
tr_variantDictAddInt(&top, TR_KEY_tag, TAG_FILES);
|
||||||
|
|
||||||
for (size_t i = 0; i < TR_N_ELEMENTS(files_keys); ++i)
|
for (auto const& key : FilesKeys)
|
||||||
{
|
{
|
||||||
tr_variantListAddQuark(fields, files_keys[i]);
|
tr_variantListAddQuark(fields, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
addIdArg(args, config);
|
addIdArg(args, config);
|
||||||
|
|||||||
Reference in New Issue
Block a user