* feat: allow upnp to recover from errors
* feat: allow natpmp to recover from errors
* chore: housekeeping
* code review: explicitly list all states to start discovering from
* fix: recover from failed UPnP discovery
* refactor: remove `UpnpState::Failed`
std::chrono::duration is just a wrapper, underlying numerical value member will be default initialized to zero as expected.
See https://en.cppreference.com/w/cpp/chrono/duration
Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com>
* fix: queue torrent verification as soon as metadata complete
* fix: avoid heap-use-after-free in `tr_peerMsgsImpl::process_peer_message()`
Details: https://github.com/transmission/transmission/pull/6383#discussion_r1429202253
* code review: move `tr_torrent::do_magnet_idle_work()` to private
* code review: `std::deque::empty()` is not `constexpr`
* fix: test
* chore: housekeeping
* refactor: convert `on_idle()` to class method
* refactor: convert `task_request_next_chunk()` to class method
* refactor: convert `onPartialDataFetched()` to class method
* refactor: convert `onBufferGotData()` to class method
* refactor: convert `useFetchedBlocks()` to class method
* refactor: hide some `tr_webseed_task` fields and methods
* refactor: convert `tr_webseed_task` methods to snake_case
* refactor: remove `write_block_data`
* refactor: store reference to `tr_torrent` directly
* refactor: convert `ConnectionLimiter` methods to snake_case
* refactor: convert `tr_webseed` methods to snake_case
* refactor: hide `tr_webseed` callback member variables
* refactor: convert `tr_webseed` to C++ interface
* feat(macos): added last known location
* fix data file label and reveal data button positions
* code review: code style
---------
Co-authored-by: BogdanArdelean <bogdan.ardelean@ymail.com>
* support macos-14 universal builds
* Apply suggestions from code review
Co-authored-by: Dzmitry Neviadomski <nevack.d@gmail.com>
* add the arch to the job's name
* revert support macos-14 universal builds
---------
Co-authored-by: Dzmitry Neviadomski <nevack.d@gmail.com>
* feat: accept ipv6 string in square brackets for `tr_address::from_string()`
* test: add test case for ipv6 string in square brackets
* fix: include square brackets in host component
According to RFC3986:
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
* fix: set ipv6-only socket before binding UDP socket
Will return EINVAL on Linux otherwise
* refactor: simplify code using `evutil` when binding TCP socket
* fix: do not set SO_REUSEADDR for listening sockets on Windows systems
Reason: https://stackoverflow.com/a/14388707/11390656
* fix: do not enclose ipv4 address string in square brackets