Changes in 26.04.1:
- Fixed a bug where we would try to connect with TCP even if the only use uTP setting was enabled.

Changes in 26.04:
- Fixed the header file include statements in the API reference docs
- Renamed the function FileNameToLong to FileNameTooLong
- Ported the Array class to be implicitly convertible to std::span and QByteArrayView. It is no longer implicitly convertible to char *.
- Modernized the codebase by converting typedef's to type aliases and adding [[nodiscard]] attributes to const functions
- Fixed minor memory leaks in SuperSeeder and the UTP server
- Require C++20
- ConnectionLimit tokens are now given as unique_ptr instead of QSharedPointer

Changes in 25.12.0:
- Fixed a crash when killing the DataCheckerJob
- Cleaned up the brief line for class documentation
- Implemented move semantics for File and deleted its unsafe copy constructor
- Fixed superseeding to prefer sending the rarest pieces to the swarm
- Removed some enums, made some enums private, and ported an enum to QFlags
- Modernized a few things with unique_ptr and move semantics

Changes in 25.08.1:
- Fixed the parsing of the UDP tracker scrape response

Changes in 25.08.0:
- Removed `using <typename>` directives in header files to avoid namespace pollution
- BEncoder now takes a unique_ptr to its output class
- BDecoder now returns a unique_ptr to the root node
- Removed the broken custom doxygen style
- Optimized packet allocations
- Optimized cache file
- Save the last download/upload activity time to the stats file
- Fixed building the docs and fixed some minor issues with documented function parameters
- Added an OpenSSL backend to the RC4 encryptor

Changes in 25.04.0:
- Send and receive IPv6 peers via peer exchange

Changes in 24.12.0:
- Allow loading HTTPS webseeds
- Re-added support for Windows

Changes in 24.05.0:
- Fixed two issues the UPnP port forwarding
- Implement changes to allow renaming files in KTorrent

Changes in 24.02.0:
- Fixed HTTP webseeds
- Switched to only support Qt6
- Changed the crypto backend for SHA1 hash from QCA to QCryptographicHash

Changes in 22.08.0:
- Added initial build support for Qt6

Changes in 22.04.0:
- Limit the number of pieces a peer can request at one time to 512 pieces and 8 MiB per piece. This is to prevent excessive RAM usage when confronted by bad actors

Changes in 21.12.0:
- Fixes to DHT to prevent unbounded memory usage
- Fixed UPnP port forwarding (404135)
- Handle URLs without a host and port in UPnP

Changes in 21.08.0:
- Split the PREVIEW_PRIORITY level of the chunk selector priority enum to allow setting first, normal, and last priority previews

Changes in 21.04.0:
- Increased the maximum torrent metadata size for the ut_metadata extension to allow downloading large torrents via a magnet link

Changes in 20.12.0:
- libktorrent is now a part of KDE Gear and will follow its version scheme

Changes in 2.0.1:
- Fix ui lags and hangs when downloading to ntfs partition

Changes in 2.0:
- Port to KF5/Qt5: QHttp-based tracker communication was dropped in favour of KIO-based one
- Optimize queue data structures shown up by callgrind
- fix issues found by Coverity static analyzer

Changes in 1.4:
- Decrease code redundancy in torrent loading code
- Add support for TR-064 IGD's
- Make sure we do not connect to the custom IP or the routers IP (316446)
- Fix url query not getting passed to webseed download requests (318325)
- Fix bug causing eta estimation to go wrong during uploading (320699)

Changes in 1.3.2:
- Fix bug causing authenticated peers not to get accepted

Changes in 1.3.1:
- Add workaround for broken handling of btrfs subvolumes by solid (306825)
- Fix crash when preallocating diskspace when a file is enabled during the download of a torrent (307178) 
- Make sure stats get updated properly during data check (308707)
- Bind peer sockets to preferred interface for outbound connections
- Fix bug causing UDP connections not to get established on FreeBSD because FIONREAD returns the size of the data and the peer address (Review: 108076)

Changes in 1.3:
- Do not pass link local IPv6 addresses to ip parameter of tracker (305187)

Changes in 1.3rc1:
- Implement BEP 32, IPv6 DHT (295194)
- Revamp DHT code and follow spec more closely on routing table
- Revamp SingleFileCache, MultiFileCache and data preallocation
- Webseeds now follow connection limits (184941)
- Add new SignalCatcher class to handle UNIX signals (296835)
- Make TimeEstimator return sortable values (298542)
- Keep track of partitions files of torrents are on
- Add methods to check if storage is mounted
- Make sure all trackers are used of a magnet link (302997, 303269)
- Fix warning message about locale being recreated
- Fix crash in DHT code caused by infinite recursion (300974)

Changes in 1.2.1:
- Fix deadlock in webseeding code (295719)
- Fix individual torrent download limit not working
- Fix build on FreeBSD
- Fix crash due to attempting to call pop_front on an empty list (299536)

Changes in 1.2:
- Fix large file preallocation when not using quick preallocation in some cases (293279)
- Disable current open file checking, it causes performance issues in some situations
- Don't use the gcrypt version macro in it's version check (294866)

Changes in 1.2rc1:
- Make it possible to check data on chunk ranges instead of the entire torrent
- Move data file jobs are now done one after the other (212614)
- Implement partial seeding extension (256263)
- Add support for IPv6 traffic class field
- Make sure a torrent is restarted when it was auto stopped and more files are selected for downloading (179945)
- Emit finished signal when torrent is found completely downloaded in data check
- Seeders and leechers shown in view is now the maximum of all trackers and not the sum
- Do not add trackers with unsupported protocols (278352)
- Improve SIGBUS handling, fixes a crash (276777)
- Remove usage of several deprecated KDE3 networking classes
- Remove obsolete functions of data check during upload
- Simplify blocklist interface
- Revamp networking code
- Remove thread from DHT code
- Prevent file descriptor exhaustion from happening (251120, 282873, 274544)
- Do not count non piece data in upload speed calculation (283170)
- Fix IPv6 address parsing bug
- Improve performance of µTP code
- Fix crash in DHT packet receive code (284627)
- Fill ip parameter of tracker announce with current IPv6 address if not filled in by user in settings (267551)
- Fix crash in PeerManager (287967)
- Fix crash at exit when datachecker job is running (289153)
- Fix crash due to bug in smaller then operator of net::Address (288444)
- Fix crash due to race condition in logging initialization (286597)

Changes in 1.1.3:
- Fix bug causing UPnP not to work properly if there is a question mark in the controlurl
- Fix crash in webseed code (281605)

Changes in 1.1.2:
- Fix bug causing time left calculation to return something when a torrent is paused (272182)
- Improve performance of UTP delay window algorithm
- Fix files not getting downloaded when they change from only seed to some other priority
- Fix crash when cleaning up mse::StreamSocket (277076)

Changes in 1.1.1:
- Fix deadlock in utp::OutputQueue when packet sending fails
- Fix bug causing scrape not to be done after first announce 
- Fix crash in DHT code caused by invalid addresses (269657)
- Fix crash in DHT code caused by unsynchronized access to a QSet (270127)
- Fix bug causing running time to be wrong when pausing torrents (271521)

Changes in 1.1:
- Improve performance of chunk selection code when there are many chunks
- Fix crash in peer authentication cleanup (266622)
- Fix crash due to SIGBUS handler being overwritten by KDE's crash dialog system (266842)
- Be more lenient towards torrents with wrong announce-list field (268145)
- Fix root cause of SHA1HashGen crashes in 1.0 series (268162)

Changes in 1.1rc1:
- Fix bug in UPnP so that it works properly with D-Link DIR 635 routers
- Fix crash due to manipulating timers in the wrong thread (261903)
- Fix compiler warning in TimeEstimator (262618)
- Fix crash due to cleaning up timer in the wrong thread (260712)
- Fix crash due to not properly cleaning up Peers and everything related when switching to superseeding mode (261529)
- Fix invalid read in utp timer cleanup code (263800)
- Fix crashes at exit (264378, 256639)

Changes in 1.1beta1:
- Use UTF-8 as default codec in bt::Value::toString
- Make sure that SIGBUS signals caused by failed mmapped IO are dealt with properly (241598)
- Move UPnP library from ktorrent/libktupnp to libktorrent
- Add support for superseeding (171661)
- Add command line example ktcli showing how to use libktorrent
- Add TransportProtocol field to Peer::Stats
- Fix crash due to missing reset of Poll object in DHT listening thread (243603)
- Ensure that libktorrent works properly with bindv6only flag on (238688)
- Ensure that torrent names are not interpreted as directories (244418)
- Fix crash when cleaning up PeerConnectors (245796)
- Fix crash on exit when cleaning up UPnP requests
- UPnPRouter now retrieves the external IP of the router
- Fix bug causing error message not to show rich text (247680)
- Use libgcrypt for RC4 implementation
- Use smart pointers for mse::StreamSocket (246693)
- Make sure that data checking fails if files cannot be opened when the maximum file limit is reached
- Add methods to get the current upload and download rate limit
- Fix deadlock in µTP code caused by interlocking mutexes
- Make sure MoveDataFilesJob properly emits signals so ktorrent can show a progress dialog (255369)
- Revamp PieceData management, fixes a crash (247984)
- Add support for warning message parameter in tracker replies
- Make sure connection setup slots are distributed fairly to avoid starvation
- Use weak pointers in PeerConnector and Authenticate (257126)
- When a webseed has 3 connection failures, wait 30 seconds and try again instead of not using it anymore (258210)
- Fix crash in PeerConnector cleanup (258878)
- Queue data checks so that they run one after the other (215711)
- Revamp UTP code with smart pointers
- Disable webseeds if they send data which does not match (261449)
- Fix uninitialized value bug in UDP tracker

Changes in 1.0.5:
- Update PeerID client identifications
- Backport fix for bug which causes some chunks not to get unmapped properly
- Make sure UTPServer is running when setting up a connection with a UTPSocket (254334)
- Increase maximum packet size to fix a bug causing peers to be dropped when they shouldn't (255264)
- Simplify PeerConnector cleanup code
- Fix bug causing file selecting to fail after a torrent was loaded from data (258138)
- Fix crash due to not checking for 0 pointer in multimedia file check (258967)
- Fix a bug with sequence number wrap around being handled badly in UTP
- Make sure that UTP write notifiers are only accessed in µTP thread

Changes in 1.0.4:
- Fix race condition causing timers not to be removed in the µTP code, resulting in a crash (251117)
- Fix deadlock in µTP code caused by keeping a mutex lock longer then necessary

Changes in 1.0.3:
- Fix crash in HTTPAnnounceJob due to abort call (244198)
- Show KDE progress dialogs when moving files (244023)
- Fix crash when µTP binding fails (244935)
- Backport PeerConnector crash fixes (245796)
- Decrease authentication timeout to 5 seconds
- Fix crash due to double delete in µTP code
- Don't throw error when log file cannot be opened, prevents crash (246757)
- Fix bug causing wrong download running time to be saved when a torrent is running (247384)
- Fix crash due to monitor not being notified of a chunk download being removed (246483)
- Fix potential dangling pointer problem in µTP code
- Fix bug causing timer to be started from wrong thread in µTP code
- Fix floating point inaccuracy bug causing seeding to hit the max share ratio a little bit to soon
- Use 2 digit precision when displaying byte sizes

Changes in 1.0.2:
- Fix subtle bug causing some connections to be dropped prematurely
- Fix bug causing tracker replies with only IPv6 addresses to be misinterpreted as an invalid reply
- Fix bug with sequence number wrapping around in µTP causing bad_alloc's (242042)
- Fix deadlock in µTP code
- Fix crash in DecompressFileJob (243243)

Changes in 1.0.1:
- Make sure that KT binds correctly on systems with net.ipv6.bindv6only set to 1 (238688)
- Fix bug causing seeding of readonly files to fail with no free disk space errors (239023)
- Fix crashes caused by ServerInterface::newConnection being called in µTP thread (240003, 239944)
- Fix crash caused by uncaught exception when saving DHT table (240294)
- Fix bug causing lots of diskspace activity (241339)
- Fix bug causing imported bytes to be counted as downloaded bytes in tracker announces

Changes in 1.0:
- Fix crash at shutdown in when UTP is running (236741)
- Remove some logging messages in UTP code
- Log errors being thrown to better debug uncaught exception bugs

Changes in 1.0rc1:
- Add support for base32 magnet links
- Update torrent status properly when torrent is in seeding complete state and a new file is selected for downloading (232278)
- Fix crash in PeerConnector destruction (233775)
- Make move on completion a per torrent feature
- Make sure that during loading of the stats, they are not saved again
- Fix crash caused by dangling pointer to PollPipe
- Add method to calculate the average download speed since the last unchoke of a peer
- Add doxygen api docs generation with cmake
- Remove all KMessageBox's, the client application needs to handle these errors
- Fix crash due to uncaught exception in UTP code
