2023-02-11 20:49:42 +00:00
|
|
|
// This file Copyright © 2017-2023 Mnemosyne LLC.
|
2022-08-08 18:05:39 +00:00
|
|
|
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
|
2022-01-20 18:27:56 +00:00
|
|
|
// or any future license endorsed by Mnemosyne LLC.
|
|
|
|
// License text can be found in the licenses/ folder.
|
2017-06-18 12:34:21 +00:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2021-10-22 02:40:55 +00:00
|
|
|
#include <array>
|
2022-04-08 01:50:26 +00:00
|
|
|
#include <cstddef> // size_t
|
2023-01-01 19:22:50 +00:00
|
|
|
#include <cstdint> // uint32_t
|
2021-10-22 02:40:55 +00:00
|
|
|
|
2023-01-07 14:27:54 +00:00
|
|
|
// ---
|
2022-12-23 21:21:40 +00:00
|
|
|
|
|
|
|
#ifdef _MSVC_LANG
|
|
|
|
#define TR_CPLUSPLUS _MSVC_LANG
|
|
|
|
#else
|
|
|
|
#define TR_CPLUSPLUS __cplusplus
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if ((TR_CPLUSPLUS >= 202002L) && (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE > 9)) || \
|
|
|
|
(TR_CPLUSPLUS >= 201709L && TR_GCC_VERSION >= 1002)
|
|
|
|
#define TR_CONSTEXPR20 constexpr
|
|
|
|
#else
|
|
|
|
#define TR_CONSTEXPR20
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Placeholder for future use.
|
|
|
|
// Can't implement right now because __cplusplus version for C++23 is currently TBD
|
|
|
|
#define TR_CONSTEXPR23
|
|
|
|
|
2023-01-07 14:27:54 +00:00
|
|
|
// ---
|
2017-06-18 12:34:21 +00:00
|
|
|
|
|
|
|
#ifndef __has_builtin
|
|
|
|
#define __has_builtin(x) 0
|
|
|
|
#endif
|
|
|
|
|
2017-11-27 22:22:44 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
#define TR_IF_WIN32(ThenValue, ElseValue) ThenValue
|
|
|
|
#else
|
|
|
|
#define TR_IF_WIN32(ThenValue, ElseValue) ElseValue
|
|
|
|
#endif
|
|
|
|
|
2017-06-18 12:34:21 +00:00
|
|
|
#ifdef __GNUC__
|
2021-08-15 09:41:48 +00:00
|
|
|
#define TR_GNUC_CHECK_VERSION(major, minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
|
2017-06-18 12:34:21 +00:00
|
|
|
#else
|
|
|
|
#define TR_GNUC_CHECK_VERSION(major, minor) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __UCLIBC__
|
|
|
|
#define TR_UCLIBC_CHECK_VERSION(major, minor, micro) \
|
2021-08-15 09:41:48 +00:00
|
|
|
(__UCLIBC_MAJOR__ > (major) || (__UCLIBC_MAJOR__ == (major) && __UCLIBC_MINOR__ > (minor)) || \
|
|
|
|
(__UCLIBC_MAJOR__ == (major) && __UCLIBC_MINOR__ == (minor) && __UCLIBC_SUBLEVEL__ >= (micro)))
|
2017-06-18 12:34:21 +00:00
|
|
|
#else
|
|
|
|
#define TR_UCLIBC_CHECK_VERSION(major, minor, micro) 0
|
|
|
|
#endif
|
|
|
|
|
2023-01-22 19:21:30 +00:00
|
|
|
// ---
|
2017-06-18 12:34:21 +00:00
|
|
|
|
|
|
|
#if __has_builtin(__builtin_expect) || TR_GNUC_CHECK_VERSION(3, 0)
|
2022-06-01 16:56:59 +00:00
|
|
|
#define TR_LIKELY(x) __builtin_expect((x) ? 1L : 0L, 1L)
|
|
|
|
#define TR_UNLIKELY(x) __builtin_expect((x) ? 1L : 0L, 0L)
|
2017-06-18 12:34:21 +00:00
|
|
|
#else
|
|
|
|
#define TR_LIKELY(x) (x)
|
|
|
|
#define TR_UNLIKELY(x) (x)
|
|
|
|
#endif
|
|
|
|
|
2021-12-14 08:43:27 +00:00
|
|
|
#define TR_DISABLE_COPY_MOVE(Class) \
|
2022-04-08 00:20:29 +00:00
|
|
|
Class& operator=(Class const&) = delete; \
|
|
|
|
Class& operator=(Class&&) = delete; \
|
|
|
|
Class(Class const&) = delete; \
|
|
|
|
Class(Class&&) = delete;
|
2021-12-14 08:43:27 +00:00
|
|
|
|
2023-01-22 19:21:30 +00:00
|
|
|
// ---
|
2017-06-18 12:34:21 +00:00
|
|
|
|
2021-11-13 00:10:04 +00:00
|
|
|
#define TR_PATH_DELIMITER '/'
|
|
|
|
|
2017-06-18 12:34:21 +00:00
|
|
|
#define TR_INET6_ADDRSTRLEN 46
|
|
|
|
|
2020-09-13 21:43:29 +00:00
|
|
|
#define TR_ADDRSTRLEN 64
|
|
|
|
|
2021-08-15 09:41:48 +00:00
|
|
|
// Mostly to enforce better formatting
|
|
|
|
#define TR_ARG_TUPLE(...) __VA_ARGS__
|
2021-10-22 02:40:55 +00:00
|
|
|
|
2023-01-01 19:22:50 +00:00
|
|
|
// https://www.bittorrent.org/beps/bep_0007.html
|
|
|
|
// "The client SHOULD include a key parameter in its announces. The key
|
|
|
|
// should remain the same for a particular infohash during a torrent
|
|
|
|
// session. Together with the peer_id this allows trackers to uniquely
|
|
|
|
// identify clients for the purpose of statistics-keeping when they
|
|
|
|
// announce from multiple IP.
|
|
|
|
// The key should be generated so it has at least 32bits worth of entropy."
|
|
|
|
//
|
|
|
|
// https://www.bittorrent.org/beps/bep_0015.html
|
|
|
|
// "Clients that resolve hostnames to v4 and v6 and then announce to both
|
|
|
|
// should use the same [32-bit integer] key for both so that trackers that
|
|
|
|
// care about accurate statistics-keeping can match the two announces."
|
|
|
|
using tr_announce_key_t = uint32_t;
|
|
|
|
|
2021-10-22 02:40:55 +00:00
|
|
|
// https://www.bittorrent.org/beps/bep_0003.html
|
|
|
|
// A string of length 20 which this downloader uses as its id. Each
|
|
|
|
// downloader generates its own id at random at the start of a new
|
|
|
|
// download. This value will also almost certainly have to be escaped.
|
2023-01-21 23:53:58 +00:00
|
|
|
using tr_peer_id_t = std::array<char, 20>;
|
2021-10-29 18:24:30 +00:00
|
|
|
|
2022-09-05 13:55:17 +00:00
|
|
|
using tr_sha1_digest_t = std::array<std::byte, 20>;
|
2022-07-01 14:49:33 +00:00
|
|
|
|
2022-09-05 13:55:17 +00:00
|
|
|
using tr_sha256_digest_t = std::array<std::byte, 32>;
|