* fix: save log level, encryption mod, preallocation mode as ints
* fix: ensure log level is saved in tr_sessionGetSettings()
* fix: ensure the right verbosity row is selected
* refactor: make tr_session.private_peer_port a private field
chore: make tr_session.public_peer_port a private field
* refactor: make tr_session.web_ a private field
* refactor: make tr_session.lpd_ a private field
* refactor: make tr_session.bind_ipv4_ private
refactor: make tr_session.bind_ipv6_ private
* refactor: make tr_session.bandwidth_groups_ private; add const accessor
* refactor: make tr_session.port_forwarding_ private
* refactor: make tr_session.peerMgr private pt 1: add tr_session::addIncoming()
* refactor: make tr_session.peerMgr private pt 1: add tr_session::addTorrent()
* refactor: make tr_session.peer_mgr_ private
* refactor: make tr_session.setPeerPort() private
* chore: move private tr_session struct declaration to beginning of class
* chore: move all tr_session fields into the same code section
* chore: move private constexpr, const fields before mutable ones
* chore: move trivial fields before nontrivial fields
* chore: reconcile with refactor/session-const-fields-first
* refactor: add a Mediator class to decouple tr_session and tr_port_forwarding
* refactor: add tr_port_forwarding::Mediator::privatePeerPort()
* refactor: add tr_port_forwarding::Mediator::onPortForwarded()
* chore: avoid unnecessary include of timer.h in other headers
* refactor: use a uniform timerMaker() API in mediators
* refactor: rename state enum type as tr_port_forwarding_state
* chore: use snake_case for tr_shared struct fields
* refactor: replace tr_shared with tr_port_forwarding
* refactor: make tr_natpmp_state an enum class
* refactor: uniform naming for port-forwarding module
* refactor: move output-only parameters in tr_natpmp::pulse() to return struct
* fix: use a nullptr multicastif if bindaddr is empty
* chore: use PascalCase for enum class values
* chore: clean up port-forwarding #includes
* chore: remove unused tr_port_forwarding::peerPort()
* chore: use typesafe sin_addr assignment instead of memcpy()
* refactor: make tr_dhtPrintableStatus private
* refactor: make tr_dhtStatus() private
* refactor: make tr_dht status enum private
* refactor: add safety mutex wrapper around libdht API calls
* refactor: make tr_dht::Status an enum class
* refactor: rename private functions
* refactor: const correctness
* refactor: use typesafe assignment instead of memcpy
* refactor: tr_session does not directly call tr_dht
* refactor: tr_dhtPort() returns std::optional
* refactor: use tr_address::fromCompact4 in tr-dht.cc
* Use std::unique_ptr to manage UDP core object
N.B.: it's no longer valid to call socket adjustments quirks from
tr_sessionSetUTPEnabled() because the corresponding object may be
not created yet. We have to create (or re-create) it explicitly
(like it's done in tr_sessionSetDHTEnabled()) or just set
is_utp_enabled_ flag of the session and assume that socket
adjustments will be done later when the object is constructed.
When Transmission listens on both IPv4 and IPv6 interfaces IPv4 listen address
is always passed to CURL's CURLOPT_INTERFACE. In general it stays unnoticed but
if user has multiple IPv6 addresses configured on his system random (first?)
IPv6 address is used. It happens because passed value to CURLOPT_INTERFACE
is not correct -- IPv6 expected but IPv4 is passed.