=Changes=

==1.10.2== 2026-11-11
  * Added   - KeyzyLicenseActivator::migrateHostIdV1toV2(HostIdMigrationMode): moves a product released with HostIdScheme::V1 to HostIdScheme::V2 on the end user's device, without user input. Construct the activator with HostIdScheme::V2 and call it on every start, in place of the first step of your start-up flow. It returns HostIdMigrationResult { status, state }; on HostIdMigrationState::StayedOnV1, use an activator constructed with HostIdScheme::V1 for the rest of that run. Semi-online and online activation are supported, offline activation is not. See "Moving a released product to V2" in the documentation.
  * Added   - HostIdMigrationMode, HostIdMigrationState and HostIdMigrationResult. They will be removed together with migrateHostIdV1toV2() in a later release, after it has been marked deprecated.
  * Changed - Activations now show the SDK version and the host id scheme in the Device Tag column of the KEYZY dashboard, for example "Mac OSX 26.5__64bits__sdk-cpp-1.10.2__hostid-v2". No code change needed.
  * Changed - Recommended upgrade path for products released on an SDK before 1.10.0: keep HostIdScheme::V2 and call migrateHostIdV1toV2() on every start, instead of staying on HostIdScheme::V1. This needs a change in your start-up flow. Products sold with offline licenses still stay on V1.

==1.10.1== 2026-10-26
  * BREAKING - KeyzyLicenseValidator::getHostIdHash() no longer throws CannotReadHostIdError; it returns an empty string when the device identifier cannot be read. If you catch the exception around this call, check for an empty string instead.
  * Fixed   - Creating KeyzyLicenseActivator no longer throws CannotReadHostIdError when the device identifier cannot be read; validateOffline() and activateOffline() return LicenseStatus::CANNOT_READ_HOST_ID instead. An existing try/catch around the constructor keeps compiling but is no longer needed.
  * Fixed   - End users no longer have to re-enter their serial number after starting the application without network access, or after a temporary server-side error.
  * Changed - When a license stops for a reason that can be undone (for example an expired subscription, or a product or SKU switched off), the end user no longer has to re-enter the serial number once the cause is fixed. To benefit, call activateSemiOnline() without a serial number before asking the user for one (see the updated semi-online activation tutorial).

==1.10.0== 2026-09-24
  * BREAKING - Host ID scheme V2 is now the default. For a product released on an SDK version before 1.10.0, set ProductData::_hostIdScheme = HostIdScheme::V1 when upgrading unless you have decided to move to V2; otherwise device host ids change and all existing activations require re-activation.
  * Added   - Host ID scheme v2, selectable per product via the new ProductData::_hostIdScheme parameter (enum HostIdScheme: V1 / V2). V2 uses more stable hardware information: the host id survives network changes and OS reinstalls. On Linux, V2 is identical to V1.
  * Fixed   - LicenseStatus::NETWORK_PROXY_REQUIRED is now actually produced. It shipped in 1.9.0 but could never be returned: with HTTPS the proxy answers the CONNECT handshake, so its 407 never appears as the response status of the request itself. The SDK now reads the CONNECT result and reports NETWORK_PROXY_REQUIRED when a proxy refuses the tunnel until the client authenticates.
  * Added   - CANNOT_READ_HOST_ID error code to LicenseStatus, and the CannotReadHostIdError exception. Returned under scheme V2 when the device identifier cannot be read.
  * Deprecated - Client-only trials: activateClientTrial(), deactivateClientTrial(), validateTrialLicense(), getDaysToExpireTrial(), KeyzyLicenseManager::setTrialLicense() / deleteTrialLicense(), KeyzyUtils::getTrialLicenseFile() / getRegistryPathToTrial(). They are validated purely against the local clock with no server-side protection and will be removed in a future release. Use server-side trials (LicenseDepositHandler::registerTrial()) instead.

==1.9.0== 2026-06-03
  * Added   - KeyzyLicenseValidator::getDealerName(). For dealer-distributed licenses the SDK now exposes the issuing dealer's name, so the partner application can display it. Non-dealer licenses return an empty string.
  * Added   - Finer-grained network failure statuses on LicenseStatus: NETWORK_DNS_FAILED, NETWORK_REFUSED, NETWORK_TIMEOUT, NETWORK_TLS_FAILED, NETWORK_PROXY_REQUIRED, NETWORK_HOSTS_TAMPERED. Integrations can now tell connectivity problems apart and show a more specific message instead of a single CONNECTION_ERROR.
  * Changed - CONNECTION_ERROR is now the fallback for network failures that do not match a specific NETWORK_* status. Existing switch(status) code keeps working unchanged; the new statuses are reached only when partner code adds explicit cases.

==1.8.0== 2026-05-07
  * Changed - registerTrial() and registerOfflineDistributedLicense() now require a non-empty email parameter. Server-side hardening on 2026-04-20 made email mandatory; the client mirrors this and rejects empty-email calls early with LicenseStatus::EMAIL_VALIDATION (no network round-trip).
  * Added   - SERIAL_VALIDATION, CODE_VALIDATION error codes to LicenseStatus, mapped from per-field 422 server responses on register-trial and register-offline-distributed.
  * Deprecated - LicenseStatus::NAME_OR_EMAIL_VALIDATION. The server no longer emits the underlying message after 2026-04-20 hardening. Kept for ABI compatibility.

==1.7.1== 2026-04-16
  * Fixed   - Windows dynamic runtime (MD) library configuration corrected for all build variants. Static runtime (MT) builds were not affected.

==1.7.0== 2026-03-17
  * Added   - Single-parameter upgradeLicense(targetSerial) in KeyzyLicenseActivator. Uses the stored serial as the source automatically.
  * Changed - Improved HTTP networking layer.
  * Added   - Multiple security hardening improvements.
  * Changed - Linux TLS backend switched from OpenSSL to mbedTLS (no system dependency needed).
  * Changed - Platform TLS backends: Secure Transport (macOS), Schannel (Windows), mbedTLS (Linux).

==1.6.1== 2026-02-18
  * Removed - Deprecated validateLicenseSerial() and validateLicenseFile() functions. Use validateOnline() and validateOffline() instead.
  * Fixed   - Security improvements.

==1.6.0== 2023-09-29
  * Added   - LicenseDepositHandler::registerOfflineDistributedLicense() function. Now, the client-side can register an offline license.
  * Fixed   - LicenseStatus::CONNECTION_ERROR bug. It was blocked in the 1.5.0 version and cannot be used.
  * Added   - New errors to the LicenseStatus Enum.

==1.5.0== 2023-06-20
  * Added   - LicenseDepositHandler class with registerTrial() function. Now, the client-side can request a trial license using the registerTrial() function.
  * Added   - std::uint64_t getDaysLeft() and std::uint64_t getDaysTotal() to the KeyzyLicenseValidator class. They are meaningful for Trial and Subscription licenses. getDaysLeft() also works for the Offline License Life parameter of Perpetual licenses.
  * Added   - std::uint64_t getDaysLeft() and std::uint64_t getDaysTotal() to the KeyzyLicenseValidator class.
  * Added   - A new constructor to the ProductData struct. It can now be created using the constructor.
  * Added   - LicenseType getLicenseTypeEnum() to the KeyzyLicenseValidator class.
  * Added   - LicenseInfo struct to the KeyzyTypes.h file.
  * Added   - LicenseType enum class to the KeyzyTypes.h file.
  * Added   - NO_FREE_LICENSES error code to the LicenseStatus enum class.
  * Added   - SKU_NUMBER_VALIDATION, PRODUCT_CODE_VALIDATION, NAME_VALIDATION, EMAIL_VALIDATION error codes to the LicenseStatus enum class.
  * Added   - ANOTHER_TRIAL_LICENSE_ALREADY_ACTIVATED error code to the LicenseStatus enum class.

==1.4.0== 2022-10-10
  * Added   - Info parameter (KeyzyLicenseValidator::getInfo())

==1.3.0== 2022-06-03
  * Added   - StartTime parameter (KeyzyLicenseValidator::getStartTime()) for Trial and Subscription licenses
  * Added   - EndTime parameter (KeyzyLicenseValidator::getEndTime()) for Trial and Subscription licenses
  * Added   - LicenseType parameter (KeyzyLicenseValidator::getLicenseType())

==1.0.1== 2022-01-28
  * Fixed   - Crash for some VirtualBox images.

==1.0.0== 2021-12-03
  * Added   - Upgrade license functionality (KeyzyLicenseActivator::upgradeLicense()).
  * Removed - All asserts were removed. Those make problems in Windows Debug mode.

==0.0.20== 2021-07-08
  * Added - SKU information (KeyzyLicenseValidator::getSku()) to the license file (Semi-Online, Offline). Please look at the examples.
  * Added - Licensee's Name (KeyzyLicenseValidator::getLicenseeName()) and Licensee's Email (KeyzyLicenseValidator::getLicenseeEmail()) to the library. Please look at the examples.
  * Added - Apple Slicon Support.
  * Added - iOS Support.
  * Fixed - Minor bugs.

==0.0.19== 2021-01-08
  * Added - Versioning Feature.
  * Updated - Validation object should be get from Activation object. Please look at the examples.
  * Fixed - Minor bugs.
  * Added  - NO_ACTIVE_SUBSCRIPTION error was added.

==0.0.18== 2020-05-08
  * Fixed a very rare OSX system only bug.

==0.0.17== 2020-01-29
  * Added CONNECTION_ERROR enum to LicenseStatus. 
  * Added TOO_MANY_REQUESTS enum to LicenseStatus. 
  * Added trim function to serial number input processes. 

==0.0.16== 2019-12-06
  * Added online and semi-online deactivations which were connected to KEYZE servers. Now, your user can deactivate the license in your software.
  * KeyzyLicenseActivator class was added.
  * Added CANNOT_KEEP_SERIAL, CANNOT_KEEP_LICENSE_FILE, ACTIVATION_DELETED, CLIENT_SERIAL_DOES_NOT_EXIST enums to LicenseStatus
  * KeyzyLicenseValidator::validateLicenseFile() is deprecated. Use KeyzyLicenseValidator::validateOffline()
  * KeyzyLicenseValidator::validateLicenseSerial() is deprecated. Use KeyzyLicenseValidator::validateOnline()
  * Documentation is updated.
  * Sample code is updated.

==0.0.15== 2019-10-15
  * Documentation is updated. 
  * Sample code is updated. 

==0.0.14== 2019-09-18
  * BIG UPDATE
  * Operating system information with bits is sent to KEYZY servers.
  * HostID generation was changed. KeyzyLicenseValidator::getHostIdHash() gives a longer string. Now, it's stronger and more secure. BE CAREFUL, YOUR USERS' OLD ACTIVATIONS WILL BE INVALID.
  * KeyzyLicenseValidator::getHostIdHashLegacy() was added to support backward compatibility If you ever use it for yourself.

==0.0.13== 2019-07-19
  * Added new error codes for subscription and trial licenses.
  * Added LicenseStatus::SUBSCRIPTION_LICENSE_EXPIRED
  * Added LicenseStatus::SUBSCRIPTION_LICENSE_NOT_STARTED
  * Added LicenseStatus::TRIAL_LICENSE_EXPIRED
  * Added LicenseStatus::TRIAL_LICENSE_NOT_STARTED

==0.0.12== 2019-07-02
  * Added VS2019 static libraries.
  * Fix for documentation in semi-online activation sample.

==0.0.11== 2019-05-15
  * Added KeyzyLicenseManager::downloadLicenseFile() with empty arguments to call with the serial already in the system. 

==0.0.10== 
  * Added compability with the new license file - subscription and offline license life features.

==0.0.9==
  * Added KeyzyLicenseManager::downloadLicenseFile() member funtion.
  * Added LicenseStatus::PRODUCT_NOT_EXIST_FOR_SKU validation error code.
  * Added LicenseStatus::ACTIVATION_DEACTIVATED validation error code.
  * Documentation has a main page with information and sample codes.
  * Changed ProductData::_appID with ProductData::_appId (Be careful).
