Previously `bandwidth.allocate()` was called twice in a row, once for
upload bandwidth and once for download bandwidth.
It has some semi-expensive housekeeping though, so avoid doing that work
twice by having a single call to `bandwidth.allocate()` operate on both
up and down bandwidth.
* refactor: group related functions together in the source
* refactor: make tr_peerIo::decrypt() private
* refactor: make tr_peerIo::is_seed() private
* refactor: remove unused tr_isPeerIo()
* refactor: move tr_tracker_http_announce() helper funcs into their own namespace
* refactor: move tr_globalIPv6() helper funcs into their own namespace
* refactor: move tr_address_is_valid_for_peers() helper funcs into their own namespace
* refactor: make tr_address_compare() a private method
* refactor: rename tr_address::isIPv4() to is_ipv4()
* refactor: use snake_case for tr_address methods
* refactor: make tr_address_is_valid_for_peers() a member function
* refactor: make tr_peer_socket.type private
* refactor: reimplement tr_peerIo::address() as a wrapper around tr_peer_socket::address()
* refactor: remove tr_address, tr_port from tr_peerIo
* refactor: replace tr_netClosePeerSocket() with tr_peer_socket::close()
* 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
* Sync translations with code
* Sync translations with Transifex
* Remove Mac menu title that isn't displayed and shouldn't be translated
* Add context to logging level strings in GTK client
* Use "µTP" consistently in code
* Use ellipsis instead of three docs in Qt client strings
* Close HTML tags in blocklist-related strings
* Remove trailing space from a translatable string in Qt client
* Add missing plural forms for English strings in Qt client
* Fix spelling: metaInfo -> metainfo
* 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: make tr_peerIoSetEnabled() a member method
* refactor: make tr_peerIoFlushOutgoingProtocolMsgs() a member method
* refactor: make tr_peerIoFlush() a member method
* refactor: make tr_peerWriteBytes() a member method
* refactor: make tr_peerWriteBuf() a member method
* refactor: make tr_peerIoGetWriteBufferSpace() a member method
* chore: remove unused declaration
* refactor: make tr_peerIoUtpInit() a member method
* refactor: make tr_peerIoNew() a member method
* refactor: make tr_peerIoNewOutgoing() a member method
* refactor: make tr_peerIoNewIncoming() a member method
* refactor: tr_torrentGetMetadataPiece() returns an optional vector
* refactor: use tr_pathbuf in create_temp_path()
* refactor: use tr_pathbuf in win32 create_temp_path()
* refactor: use std::vector in isPeerInteresting()
* refactor: remove tr_new0 from tr_peerMgrPeerStats()
* refactor: remove tr_new0 from rechokeUploads()
* refactor: silence clang nullptr dereference warning
* refactor: make tr_natpmp a C++ class
* refactor: use std::string in tr_log_message
* feat: add convenience variants of TimerMaker::create()
* refactor: use libtransmission::Timer in peer-mgr
* refactor: use libtransmission::Timer in peer-msgs
* refactor: use libtransmission::Timer in tr-utp
* refactor: use libtransmission::Timer in tr-dht
* refactor: use libtransmission::Timer in port-forwarding
* refactor: use libtransmission::Timer in webseed
* refactor: use libtransmission::Timer in tr-lpd
* refactor: use libtransmission::Timer in rpc-server
* chore: remove unused function tr_timerAdd()
* chore: remove unused function tr_gettimeofday()
* fixup! chore: remove unused function tr_timerAdd()
* fixup! refactor: use libtransmission::Timer in port-forwarding
Add a shim between the handshake code and the rest of the codebase to
improve decoupling so that a followup PR can add handshake unit tests.
The handshake code no longer directly relies on tr_torrent, tr_session,
tr_dht, or tr_peerMgr.
* refactor: remove tr_address_compare()
* refactor: remove tr_address_to_string()
* refactor: remove NUM_TR_AF_INET_TYPES
* refactor: replace tr_sessionGetPublicAddress with tr_session::getPublicAddress()
* refactor: tr_peerIo() takes tr_address by value
* refactor: replace tr_sessionIsAddressBlocked with tr_session::isAddressBlocked()
* refactor: tr_peerMgrAddIncoming now takes tr_address by value
* refactor: replace tr_address_is_valid_for_peers() with tr_address.isValidForPeers()
* refactor: tr_netOpenPeerSocket takes tr_address by value
* refactor: remove tr_generateAllowedSet()
* refactor: setup_sockaddr takes a tr_address by value
* refactor: tr_netBindTCP() takes a tr_address by value
* refactor: tr_dhtAddNode() takes a tr_address by value
* refactor: remove tr_address_from_string()
* refactor: rename tr_address.isValidForPeers() to .isValidPeerAddress()
* refactor: replace tr_address_from_sockaddr_storage() with tr_address::fromSockaddrStorage()
* refactor: minor cleanup to tr_address::readable()
* refactor: simplify tr_swarmGetStats()
* refactor: make addStrike() a tr_swarm member function
* refactor: make updateEndgame() a tr_swarm member function
* refactor: limit scope of some constexpr values
* refactor: make tr_swarm.is_endgame private
* refactor: make tr_swarm.isAllSeeds() a member function
* refactor: add tr_peerMsgs.percentDone()
This moves the `progress` and `have` fields from the `tr_peer` parent
class down into BitTorrent peer subclass, since webseeds by definition
are seeds and have everything.
* refactor: use preferred naming for class members
snake_case for variables, camelCase for methods
* refactor: make peer_atom.blocklisted private
* refactor: make tr_atomAddrStr a member function
* refactor: make atomIsSeed a member function
* refactor: make tr_isAtom a member function
* refactor: make peer_atom constructor
* refactor: make getReconnectIntervalSecs a member function
* refactor: make peer_atom.fromFirst const