0.20.2 (2020-03-10)

+ Add encrypt_key and decrypt_key to fz::symmetric key
- fz::datetime::set_rfc822 now parses the zone offset
- Removed unneeded asserts from format.hpp

0.20.1 (2020-02-24)

- Fix potential crash after removing the last speed limit bucket
- TLS: Fix reported key exchange algorithm and improve details

0.20.0 (2020-02-14)

+ Added fz::symmetric_key
+ Added itertions parameter to fz::private_key::from_password
+ Added fz::base32_encode and fz::base32_decode
+ Unified all decode functions to always return a vector, added alternatives returning string with a _s suffix in the function name
+ Changed equal_insensitive_ascii to take (w)string_view

0.19.3 (2019-12-19)

- Rate limiting: Fix a divide by zero when distributing overflow

0.19.2 (2019-12-19)

+ Rate limiting: Added debt repay mechanism to bucket removal
- *nix: Fix returned permissions in fz::local_filesys::get_file_info/get_next_file

0.19.1 (2019-11-15)

+ Return error information to fz::local_filesys::begin_find_files
- Fix for version.hpp not getting installed

0.19.0 (2019-11-07)

+ Addded rate limiting code and a new rate-limited socket layer
+ Added fz::mutex::try_lock
+ Implemented libtool's library versioning scheme for shared library builds of libfilezilla

0.18.2 (2019-09-16)

+ Added operator== and != to fz::uri

0.18.1 (2019-08-14)

+ Added fz::buffer::resize

0.18.0 (2019-08-02)

+ Added fz::spawn_detached_process
+ Add operator+ to fz::duration
+ *nix: If available, use eventfd instead of a self-pipe
+ fz::to_integral and fz::hex_decode now work with string literals
+ Added fz::listen_socket::fast_accept that only returns a descriptor instead of a fully-initialized fz::socket for use in a tight accept-and-dispatch loop
+ Functions in libfilezilla/iputils.hpp now take string_view as arguments
+ Added fz::socket::set_flags which can atomically enable or disable flags
- fz::socket not returns an error instead of silently failing in case of file descriptor exhaustion
- Fix socket errors sometimes not being forwarded in fz::tls_layer when when writing fails in the underlying layer
- Fix double-closing of socket descriptios if connection establishment fails
- fz::tls_layer now fails the handshake instead of waiting indefinitely if started on a layer that has progressed passed the connected state
- Small compile-time improvements to fz::sprintf

0.17.1 (2019-06-21)

+ Added support for detached signatures
- Fixed crash if using the system trust store

0.17.0 (2019-06-17)

+ libfilezilla now requires C++17
+ Changed a lot of functions to use std::string_view
+ Added fz::socket_layer as base class for layers on top of sockets
+ Added fz::tls_layer, a Transport Layer Security layer, requiring GnuTLS 3.5.7 or later
+ Added fz::translate for gettext-style translatable strings. GNU Gettext is now a built-time (but not runtime) dependency
+ Added fz::bitscan and fz::bitscan_reverse to get the index of least and most significant bit set
+ Added fz::logger_interface as a base for logging system
- *nix: Small speed-up of fz::local_filesys through the use of fstatat()

0.16.0 (2019-04-21)

+ Add fz::socket
+ Add operator*= to fz::duration
+ fz::event_loop can now also be created using fz::thread_pool or threadless.
- fz::async_task now releases the thread back to the pool immediately when the task has completed without waiting for the join
- *nix: Fix file descriptor leaks on exec()

0.15.1 (2018-11-22)

+ Add argument to fz::strtok to return empty tokens
- Fix compatibility issue with Nettle < 3.3
- Fix fz::random_bytes on MinGW
- Fix memory leak in fz::buffer

0.15.0 (2018-10-19)

+ libfilezilla now depends on Nettle >= 3.1
+ Added fz::sha512, fz::sha256, fz::sha1 and fz::md5 hash functions
+ Added fz::hash_accumulator
+ Added fz::hmac_sha256 HMAC function
+ Added asymmetric encryption scheme using X25519
+ Added signature scheme using Ed25519
- Changed and documented semantics of the return value of fz::remove_file, removing a non-existing file is not an error

0.14.0 (2018-10-04)

+ Added fz::equal_insensitive_ascii
+ Added insensitive_ascii parameter to fz::starts_with and fz::ends_with
- Fixed namespace of to_wstring in wx glue

0.13.2 (2018-09-21)

- Fix regression in fz::shared_value::clear
- Fix parsing of URIs without path

0.13.1 (2018-09-10)

+ Made fz::scoped_lock movable
- Fix a few compiler warnings

0.13.0 (2018-07-16)

+ Add bool return value to replace_substrings to indicate whether something has been replaced.
+ fz::sprintf: Added %c format specifier
- MSW: Work around problematic DLL export of templates, timers now work if libfilezilla has been built as DLL

0.12.3 (2018-06-08)

+ Event handlers can now removed themselves while inside a callback
+ Added fz::query_string::pairs()

0.12.2 (2018-05-05)

+ Added parameters to base64_encode to control alphabet and padding
+ Improved performance of less_insensitive_ascii
+ *nix: Faster conversion between UTF-8 and wchar_t strings. 

0.12.1 (2018-02-23)

+ Added fz::buffer::operator== and operator!=
- Fixed bug in fz::buffer::get(size_t)

0.12.0 (2018-02-16)

+ Added fz::datetime::operator bool
+ Added fz::datetime::get_rfc822 and fz::datetime::set_rfc822

0.11.2 (2018-01-05)

+ Added fz::starts_with and fz::ends_with
- Fix usage of delete in the fz::buffer destructor

0.11.1 (2017-10-30)

+ Added fz::file::fsync() to sync data to disk

0.11.0 (2017-09-29)

+ Add fz::buffer class
- *nix: fz::process::spawn no longer calls async-signal-unsafe functions between forking and calling execv in the child.

0.10.1 (2017-08-14)

- MSW: Improve handling of reparse points in fz::local_filesys

0.10.0 (2017-07-09)

+ Added fz::percent_encode and fz::percent_encode
+ Added fz::uri and fz::query_string
+ Added fz::less_insensitive_ascii for case-insensitive strings in maps
- Moved encoding functions from string.hpp to encode.hpp
- Use pkg-config instead of cppunit-config to look for cppunit.

0.9.2 (2017-05-25)

+ Added fz::random_bytes to obtain a vector of the passed size of uniformly distributed random bytes
+ Added fz::ltrim and fz::rtim
+ Added parameter to trim functions which characters to trim
+ It is now possible to detach threads from async_task

0.9.1 (2017-02-20)

+ Added a small helper function to fz::file to get the current position in the file
+ Added another version of fz::to_wstring_from_utf8 that takes a char buffer + length
- Fixed extraction of single-character tokens in fz::strtok

0.9.0 (2016-11-28)

+ Added parameter to fz::to_integral to specify which value is returned on error.
+ Added fz::remove_file
+ Added fz::hex_encode and fz::hex_decode

0.8.0 (2016-10-25)

+ Added fz::str_toupper_ascii to complement fz::str_tolower_ascii
+ Added fz::trim and fz::trimmed for removing leading and trailing whitespace from string
+ Added fz::str_is_ascii
- Fixed zero-padding for x and X string format conversion specifiers

0.7.1 (2016-10-03)

- OS X: Work around a nasty bug in XCode where programs explicitly compiled for older versions of OS X were silently pulling in features exclusive to the new version, resulting in crashes at runtime
- MSW: Fix detection of thread creation failures

0.7.0 (2016-09-24)

+ Add fz::base64_decode and fz::base64_encode
+ Add fz::strtok string tokenizer
+ Added non-throwing fz::to_integral
+ Implemented + (always sign) and - (left align) flags for fz::sprintf

0.6.1 (2016-07-27)

- Fix UTF-8 conversion functions and added a testcase

0.6.0 (2016-07-20)

+ Add fz::sprintf, a safe replacement for for the C sprintf function

0.5.3 (2016-06-20)

+ Add fz::replace_substrings to search and replace substrings in std::(w)string
- Explicitly request large file support on 32bit systems

0.5.2 (2016-05-20)

+ Add fz::shared_optional::is_same that checks whether two instances share the same underlying pointer value, like a shallow equal.
+ Add fz::int_to_hex_char as reverse to fz::hex_char_to_int

0.5.1 (2016-05-09)

+ Add constructore to sparse_optional taking pointers
- Fix compilation on systems where iconv's second argument is const

0.5.0 (2016-04-15)

- Handle timestamps where midnight is represented as 24:00:00.000 of the previous day
- Fix inverted return value of fz::datetime::empty()
- Increase performance of event loop if not using timers
- Better compatibility with runtimes that change the src pointer passed to mbsrtowcs or wcsrtombs

0.4.0.1 (2016-02-22)

- Fix compile error in testcase

0.4.0 (2016-02-21)

+ Added shared_optional and sparse_optional classes

0.3.1 (2016-01-31)

- Fixed compile errors affecting some platforms
- Minor documentation fixes

0.3.0 (2016-01-12)

+ Added functions to deal with IP address strings
- Added testcase to verify string conversion functions. Some MinGW installations have broken wcsrtombs and mbsrtowcs implementations.

0.2.0 (2015-11-19)

+ Added local_filesys class
+ Added recursive_remove class
+ Added to_utf8 function to string.hpp as counterpart to the to_(w)string_from_utf8 functions
+ Added missing libfilezilla/glue/wx.hpp header mentioned in the FAQ
- Fixed compile errors

0.1.0 (2015-11-02)

+ First public release of libfilezilla
