view NEWS @ 5617:8905ffa45fc2 find-refactoring

started listing of children resources
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 09 May 2024 14:59:17 +0200
parents f1ce8dd361b7
children 2c95a34af64f
line wrap: on
line source

Pending changes in the mainline
===============================

REST API
--------

* API version upgraded to 24
* Added "MaximumPatientCount" in /system
* Added a new "LimitToThisLevelMainDicomTags" field in the payload of 
  /patients|studies|series/instances/../reconstruct to speed up the reconstruction
  in case you just want to update the MainDicomTags of that resource level only 
  e.g. after you have updated the 'ExtraMainDicomTags' for this level.
* The "requestedTags" GET argument was deprecated in favor of "requested-tags".
* TODO-FIND: complete the list of updated routes:
  /studies?expand and sibbling routes now also return "Metadata" (if the DB implements 'extended-api-v1')

Plugins
-------

* Multitenant DICOM plugin: added support for locales
* Housekeeper plugin: Added an option "LimitMainDicomTagsReconstructLevel"
  (allowed values: "Patient", "Study", "Series", "Instance").  This can greatly speed
  up the housekeeper process e.g. if you have only update the Study level ExtraMainDicomTags.
* SDK: added OrthancPluginLogMessage() that is a new primitive for
  plugins to log messages.  This new primitive will display the plugin
  name, the plugin file name, and the plugin line number in the
  logs. If they are not using the LOG() facilities provided by the
  OrthancFramework, plugins should now use ORTHANC_PLUGINS_LOG_INFO(),
  ORTHANC_PLUGINS_LOG_WARNING(), and ORTHANC_PLUGINS_LOG_ERROR().

Maintenance
-----------

* In C-Find queries including GenericGroupLength tags, Orthanc was still
  extracting these tags from the storage although they were already ignored
  and not returned in the response.
  They are now removed from the query earlier to avoid this disk access that
  could slow down the response time.  Note that this seems to happen mainly
  when the query originates from some GE devices (AWS).
* The 0x0111 DIMSE Status is now considered as a warning instead of an error
  when received as a response to a C-Store.
  See https://discourse.orthanc-server.org/t/ignore-dimse-status-0x0111-when-sending-partial-duplicate-studies/4555/3
* Removed potential PHI from the logs when Orthanc encounters an error while
  creating a zip file.
* Monitoring of stable resources now also takes into consideration the
  resource type, not only the resource identifier identifier.
* When working with "DicomTlsEnabled": true and "DicomTlsRemoteCertificateRequired": false,
  Orthanc was refusing to start if no "DicomTlsTrustedCertificates" was provided.


Version 1.12.3 (2024-01-31)
===========================

General
-------

* Performance of databases:
  - At startup, if using a database plugin, displays the latency to access the DB.
  - Added support for new DB primitives to enable the "READ COMMITTED"
    transaction mode in the PostgreSQL plugin.

REST API
--------

* API version upgraded to 23
* Added a 'KeepLabels' option in /modify routes (default = false)

Maintenance
-----------

* Upgraded dependencies for static builds:
  - boost 1.84.0
  - curl 8.5.0
  - dcmtk 3.6.8
  - jsoncpp 1.9.5
  - libjpeg 9f
  - libpng 1.6.40
  - openssl 3.1.4
  - pugixml 1.14
  - zlib 1.3.1


Version 1.12.2 (2023-12-19)
===========================

General
-------

* Performance:
  - Allow multiple plugins to use the plugin SDK at the same time.  In previous versions,
    functions like instance transcoding or instance reading where mutually exclusive.
    This can bring some significant improvements, especially in viewers.
  - Optimized the StorageCache to prevent loading the same file multiple times if
    multiple users request the same file at the same time.
  - The StorageCache is now also storing transcoded instances that have been requested by /file?transcode=...
    that is now used by the DICOMweb plugin.  This speeds up retrieval of transcoded frames through WADO-RS.
  - Now displaying timings when reading from/writing to disk in the verbose logs.
* HTTP compression:
  - The default value of the "HttpCompressionEnabled" is now false by default.  This reduces
    the Orthanc overall CPU usage and latency.  This is suitable for setups with large  
    bandwidth network like LAN.
  - When "HttpCompressionEnabled" is true, only the content that is clearly identified as
    compressible is compressed (JSON, XML, HTML, text, ...).  DICOM files are never
    compressed over HTTP.  In prior versions, all content types were compressed.
    This notably greatly improves loading time of large DICOM 
    files through WADO-RS e.g in StoneViewer when working on large bandwidth networks.
  - When "HttpCompressionEnabled" is true, content < 2KB are never compressed.
* Logs:
  - Each line of log now contains the name of the thread that is logging the message.
    A new "--logs-no-thread" command line option can be used to get back to the previous behavior to
    keep backward compatibility.

REST API
--------

* API version upgraded to 22
* Added a route to delete completed jobs from history: DELETE /jobs/{id}
* Added a "transcode" option to the /file route:
  e.g: /instances/../file?transcode=1.2.840.10008.1.2.4.80
* now accepting GET requests on these 3 routes to create archive/media:
  /tools/create-archive?resources=..,..2&transcode=1.2.840.10008.1.2.4.80
  /tools/create-media?resources=..,..2&transcode=1.2.840.10008.1.2.4.80
  /tools/create-media-extended?resources=..,..2&transcode=1.2.840.10008.1.2.4.80
* All "expand" GET arguments now accepts "expand=true" and "expand=false" values.
  The /studies/../instances and sibling routes are the only whose expand is true if not specified.
  These routes now accepts "expand=false" to simply list the child resources ids.
* In /tools/metrics-prometheus:
  - "orthanc_dicom_cache_size" renamed as "orthanc_dicom_cache_size_mb"
  - added "orthanc_storage_cache_count" and "orthanc_storage_cache_size_mb"

Plugins
-------

* Housekeeper plugin:
  - Update to rebuild the cache of the DICOMweb plugin when updating to DICOMweb 1.15.
  - New trigger configuration: "DicomWebCacheChange"
  - Fixed reading the triggers configuration.
  - Introduced a "sleep" to lower CPU usage when idle.
* Plugins are now allowed to modify/delete private metadata/attachments
  (i.e. whose identifiers are < 1024)
* Added "OrthancPluginSetCurrentThreadName()" in the plugin SDK.

Maintenance
-----------

* Fix unit test PngWriter.Color16Pattern on big-endian architectures,
  as suggested by Etienne Mollier: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1041813
* Prevent the leak of the full path of the source files in the binaries
* Fix loading of DCMTK dictionary in the MultitenantDicom plugin when built dynamically:
  https://discourse.orthanc-server.org/t/dimse-failure-using-multitenant-plugin/3665
* Support multiple values in SpecificCharacterSet in C-Find answers:
  https://discourse.orthanc-server.org/t/c-find-fails-on-unknown-specific-character-set-iso-2022-ir-6-iso-2022-ir-100/3947
* When exporting a study archive, make sure to use the PatientName from the study and not from the patient
  in case of PatientID collision.
* DICOM C-Store:
  - Avoid some unnecessary renegotiation of DICOM association.
  - Force renegotiation in case no presentation context were accepted in previous association (we have
    observed PACS that were not consistent in the accepted presentation contexts)
  - Improved logging
* Solved a deadlock related to the Job Engine events and plugins.  Job events are now pushed
  into a queue to be handled asynchronously by plugins.
* ZIP of studies whose PatientName and PatientID did not contain any ASCII character are now valid.
* Upgraded minizip library to stay away from CVE-2023-45853 although Orthanc is likely not affected since ZIP
  filenames are based on DICOM Tag values whose length is limited in size.
  Great thanks to James Addison for notifying us about the vulnerability and patch to apply !
* Fix XSS in Orthanc error reporting (as reported by Sébastien Doria, Vumetric Cybersecurity) by:
  - always including a "Content-Type" header in HTTP responses with a body.
  - always including "X-Content-Type-Options: nosniff"
* Upgraded dependencies for static builds:
  - boost 1.83.0


Version 1.12.1 (2023-07-04)
===========================

General
-------

* Orthanc now anonymizes according to Basic Profile of PS 3.15-2023b Table E.1-1
* Added metrics:
  - "orthanc_storage_read_bytes" 
  - "orthanc_storage_written_bytes"
  - "orthanc_memory_trimming_duration_ms"

REST API
--------

* API version upgraded to 21
* "/tools/create-dicom" can now be used to create Encapsulated 3D
  Manufacturing Model IODs (MTL, OBJ, or STL)
* Added a route to delete the output of an asynchronous job (right now
  only for archive jobs): e.g. DELETE /jobs/../archive

Plugins
-------

* Added "OrthancPluginLoadDicomInstance()" to load DICOM instances from the database
* Added "OrthancPluginSetMetricsIntegerValue()" to track metrics with integer values

Maintenance
-----------

* Fix decoding of YBR_FULL RLE images for which the "Planar Configuration" 
  tag (0028,0006) equals 1
* Made Orthanc more resilient to common spelling errors in SpecificCharacterSet
* Modality worklists plugin: Allow searching on private tags (exact match only)
* Fix orphan files remaining in storage when working with MaximumStorageSize
  (https://discourse.orthanc-server.org/t/issue-with-deleting-incoming-dicoms-when-maximumstoragesize-is-reached/3510)
* When deleting a resource, the "LastUpdate" metadata of its parents are now updated
* Reduced the memory usage when downloading archives when "ZipLoaderThreads" > 0
* Metrics can be stored either as floating-point numbers, or as integers
* Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle
  CPU load (https://discourse.orthanc-server.org/t/onchange-callbacks-and-cpu-loads/3534).
* Upgraded dependencies for static builds:
  - boost 1.82.0


Version 1.12.0 (2023-04-14)
===========================

General
-------

* Support for labels associated with patients, studies, series, and instances
* Added a sample plugin bringing multitenant DICOM support through labels

REST API
--------

* API version upgraded to 20
* New URIs "/.../{id}/labels/{label}" to test/set/remove labels
* "/patients/{id}", "/studies/{id}", "/series/{id}" and "/instances/{id}"
  contain the "Labels" field
* "/tools/find" now accepts the "Labels" and "LabelsConstraint" arguments
* "/tools/labels" lists all the labels that are associated with any resource
* "/system": added "UserMetadata" and "HasLabels"
* Added option "?numeric" if listing metadata

Plugins
-------

* Added "OrthancPluginRegisterDatabaseBackendV4()" to communicate using Google
  Protocol Buffers between the Orthanc core and database plugins

Orthanc Explorer
----------------

* Added support for labels
* Added buttons to copy the URL of ZIP archives and DICOM files to the clipboard

Maintenance
-----------

* Enforce the existence of the patient/study/instance while creating its archive
* Security: New configuration option "RestApiWriteToFileSystemEnabled"
  to allow "/instances/../export" (the latter is now disabled by default)
* Fix issue 214: VOILUTSequence is not returned in Wado-RS
* Fix /tools/reset crashing when ExtraMainDicomTags were defined
* Fix Housekeeper plugin infinite loop if Orthanc is empty.
* Fix a crash in /tools/reconstruct triggered by the Housekeeper plugin 
  when only changing the StorageCompression.
* Avoid the use of "externalproject_add()" to build the sample plugins
* Upgraded dependencies for static builds:
  - openssl 3.1.0


Version 1.11.3 (2023-02-03)
===========================

General
-------

* C-Store SCU now gives priority to the preferred TransferSyntax
  proposed by the receiving SCP instead of Orthanc own
  AcceptedTransferSyntaxes.
* Made the default SQLite DB more robust wrt future updates like
  adding new columns in DB.
* Made the HTTP Client errors more verbose by including the URL in the logs.
* Optimization: now using multiple threads to transcode files for
  asynchronous download of studies archive.
* New configuration "KeepAliveTimeout" with a default value of 1 second.
* ResourceModification jobs (/modify + /anonymize) can now use multiple threads to speed up processing
  - New configuration "JobsEngineThreadsCount.ResourceModification" to configure the number of threads.
* For systems using glibc > 2.8 (most of Linux systems except LSB
  binaries): Introduced a new thread for to trim memory in Orthanc (different
  from the Housekeeper sample plugin). This thread regularly try to
  give back memory that Orthanc no longer uses to the system. This
  reduces the overall memory consumption. More information in
  OrthancServer/Resources/ImplementationNotes/memory_consumption.txt.

REST API
--------

* API version upgraded to 19
* Loosen the sanity checks for DICOM modifications, if "Force" option is given:
  - allow modification of PatientID at study level
  - allow modification of PatientID, StudyInstanceUID at series level
  - allow modification of PatientID, StudyInstanceUID, SeriesInstanceUID at instance level
  - allow modification of a patient without changing her PatientID
  Added sanity checks for modifications to make sure the user preserves the DICOM model when modifying high level tags.
    E.g. if you modify the PatientID at study level, also make sure to modify all other Patient related
    tags (PatientName, PatientBirthDate, ...)
* Automatically reconstruct the modified resources at the end of the DICOM modifications job to ensure
  improved consistency of the DICOM model.
* If specifying 'Transcode' option to /modify or /anonymize, this value will take over the 'IngestTranscoding'
  global configuration
* Allow the HTTP server to return responses > 2GB (fixes asynchronous download of zip studies > 2GB)
* /modalities/.../store now accepts "CalledAet", "Host", "Port" to override the modality configuration 
  from the configuration file for a specific operation.
* /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
* Tolerance for "image/jpg" MIME type instead of "image/jpeg" in /tools/create-dicom
* /system: added MaximumStorageMode and MaximumStorageSize

Plugins
-------

* Added a "header" argument to all OrthancPeers::DoPost, DoPut, ... in the "OrthancPluginCppWrapper"
* Added "OrthancPluginCreateJob2()" in the plugin SDK to avoid
  possible crashes when "OrthancPluginJobGetContent()" or
  "OrthancPluginJobGetSerialized()" get called

Maintenance
-----------

* Fix decoding of RLE images for which the "Planar Configuration" tag (0028,0006) equals 1
* Fix issue #212 (Anonymization process transcodes data and loses resource link).


Version 1.11.2 (2022-08-30)
===========================

General
-------

* Added support for RGBA64 images in tools/create-dicom and /preview
* New configuration "MaximumStorageMode" to choose between recyling of
  old patients (default behavior) and rejection of new incoming data when
  the MaximumStorageSize has been reached.

Bug Fixes
---------

* Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing
  files (bug introduced in 1.11.0).
* Fix the Storage Cache for compressed files (bug introduced in 1.11.1).

Maintenance
-----------

* DelayedDeletion plugin: Fix leaking of symbols
* SQLite now closes and deletes WAL and SHM files on exit.  This should improve
  handling of SQLite DB over network drives.
* Fix static compilation of boost 1.69 on Ubuntu 22.04
* Upgraded dependencies for static builds:
  - boost 1.80.0
  - dcmtk 3.6.7  (fixes CVE-2022-2119 and CVE-2022-2120)
  - openssl 3.0.5


Version 1.11.1 (2022-06-30)
===========================

General
-------

* New sample plugin: "DelayedDeletion" that will delete files from disk
  asynchronously to speed up deletion of large studies.
* Lua: new "SetHttpTimeout" function
* Lua: new "OnHeartBeat" callback called at regular interval provided that
       you have configured "LuaHeartBeatPeriod" > 0.
* "ExtraMainDicomTags" configuration now accepts Dicom Sequences.  Sequences are
  stored in a dedicated new metadata "MainDicomSequences".  This should improve
  DicomWeb QIDO-RS and avoid warnings like "Accessing Dicom tags from storage when 
  accessing series : 0040,0275".
  Main dicom sequences can now be returned in "MainDicomTags" and in "RequestedTags".

Bug Fixes
---------

* Fix the storage cache that was not used by the Plugin SDK.  This fixes the 
  DicomWeb plugin "/rendered" route performance issues.

Maintenance
-----------

* Housekeeper plugin: Fix resume of previous processing
* Added missing MOVEPatientRootQueryRetrieveInformationModel in 
  DicomControlUserConnection::SetupPresentationContexts()
* Improved HttpClient error logging (add method + URL)

REST API
--------

* API version upgraded to 18
* /system is now reporting "DatabaseServerIdentifier"
* Added an Asynchronous mode to /modalities/../move.
* "RequestedTags" option can now include DICOM sequences.

Plugins
-------

* New function in the SDK: "OrthancPluginGetDatabaseServerIdentifier"

OrthancFramework (C++)
----------------------

* DicomMap::ParseMainDicomTags has been deprecated -> retrieve "full" tags
  and use DicomMap::FromDicomAsJson instead


Version 1.11.0 (2022-05-09)
===========================

General
-------

* New configuration "ExtraMainDicomTags" to store more tags in the Index DB
  to speed up, e.g, building C-Find, dicom-web or tools/find answers
* New sample plugin: "Housekeeper" that will re-construct the DB/Storage
  when it detects there is room for improvements, e.g:
  - if files were stored with a version of Orthanc prior to 1.9.1,
    the storage might still contain dicom-as-json files that are not needed
    anymore -> it will remove them
  - if "ExtraMainDicomTags" has changed.
  - if "StorageCompression" or "IngestTranscoding" has chagned.
* New configuration "Warnings" to enable/disable individual warnings that can
  be identified by a W0XX prefix in the logs.
  These warnings have been added:
  - W001_TagsBeingReadFromStorage
  - W002_InconsistentDicomTagsInDb
* C-Find and QIDO-RS can now return the InstanceAvailability tag.  Value is 
  always "ONLINE"
* Improved decoding of US Images with Implicit VR.
* Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries.

REST API
--------

* API version upgraded to 17
* new options in tools/find:
  - "RequestedTags" (to use together with "Expand": true) contains a list of tags 
    that you'll receive in the "RequestedTags" field in the answers.  These tags
    may be tags from the MainDicomTags in DB, from the DICOM file or 'computed'
    like ModalitiesInStudy.  Check the new configuration "ExtraMainDicomTags" and
    "Warnings" to optimize your queries.
* new query argument "requestedTags" in all API routes listing resources:
  - /patients, /patients/../studies, /patients/../series, /patients/../instances
  - /studies, /studies/../series, /studies/../instances
  - /series, /series/../instances
  - /instances
  ex:
  - /studies/c27857df-4078c84c-1a79ea78-ac357bb2-9dadc119?requestedTags=ModalitiesInStudy
  - /studies?expand&since=0&limit=10&requestedTags=ModalitiesInStudy
  
* /reconstruct routes:
  - new options "ReconstructFiles" (false by default to keep backward compatibility) to 
    potentialy compress/uncompress the files or transcode them if "StorageCompression"
    or "IngestTranscoding" has changed since the file has been ingested.
  POSSIBLE BREAKING-CHANGES:
  - the /reconstruct routes now preserve all metadata
  - the /reconstruct routes now skip the IncomingInstanceFilter
  - the /reconstruct routes won't generate new events like NewStudy, StableStudy, ...
    therefore, the corresponding callbacks won't be called anymore
  - the /reconstruct routes won't affect the patient recycling anymore
* new fields reported in the /system route:
  - "MainDicomTags" to list the tags that are saved in DB
  - "StorageCompression", "OverwriteInstances", "IngestTranscoding" reported from the 
    configuration file
* New option "filename" in "/.../{id}/archive" and "/.../{id}/media" to
  manually set the filename in the "Content-Disposition" HTTP header


Version 1.10.1 (2022-03-23)
===========================

General
-------

* Improved DICOM authorization checks when multiple modalities are
  declared with the same AET.

Plugins
-------

* New function in the SDK: "OrthancPluginRegisterWebDavCollection()"
  to map a WebDAV virtual filesystem into the REST API of Orthanc.

Documentation
-------------

* Removed the "LimitJobs" configuration that is not used anymore since
  the new JobEngine has been introduced (in Orthanc 1.4.0). The
  pending list of jobs is unlimited.


Version 1.10.0 (2022-02-23)
===========================

General
-------

* New configuration "DicomAlwaysAllowFindWorklist" to complement the existing
  "DicomAlwaysAllowFind" configuration.  "DicomAlwaysAllowFind" applies now 
  only to C-Find for Patients/Studies/Series/Instances while C-Find for worklists are
  covered by "DicomAlwaysAllowFindWorklist".  The same changes applies to new 
  configurations in "DicomModalities": "AllowFind" is now complemented by 
  "AllowFindWorklist".
  This new option allows improved security management.  E.g: a modality might have
  only "AllowStore" and "AllowFindWorklist" enabled but might have "AllowFind"
  disabled to prevent listing past patient studies.
  Possible BREAKING-CHANGE: if you relied on "DicomAlwaysAllowFind" or "AllowFind"
  to specifically authorize C-Find for worklist, you now need to explicitly enable
  "DicomAlwaysAllowFindWorklist" and/or "AllowFindWorklist"
* Added a storage cache in RAM to avoid reading the same files multiple times from 
  the storage.  This greatly improves, among other things, the performance of WADO-RS
  retrieval of individual frames of multiframe instances.
* New configuration option "MaximumStorageCacheSize" to configure the size of
  the new storage cache.
* New experimental configuration option "ZipLoaderThreads" to configure the number of 
  threads used to read instances from storage when creating a Zip archive/media.
* Support decoding of black-and-white images (with 1 bit per pixel), notably DICOM SEG
* Added links to download attachments from the Orthanc Explorer
* Fix XSS inside DICOM in Orthanc Explorer (as reported by Stuart Kurutac, NCC Group).  
  XSS Issues were re-introduced in Orthanc 1.9.4.

REST API
--------

* API version upgraded to 16
* If an image can not be decoded, "../preview" and "../rendered" routes
  are now returning "unsupported.png" only if the
  "?returnUnsupportedImage" option is specified; otherwise, it raises
  a 415 HTTP error code.
* Archive jobs response now contains a header Content-Disposition:filename='archive.zip'
* "/instances/{...}/frames/{...}/numpy": Download the frame as a Python numpy array
* "/instances/{...}/numpy": Download the instance as a Python numpy array
* "/series/{...}/numpy": Download the series as a Python numpy array
* Added a "?full" option to "/patients|studies|series|instances/{...}/attachments" route
  to show the mapping alias<->numerical id.
* Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve
  the full information about an attachment (size, type, MD5 and UUID)

Lua
---

* New "ReceivedCStoreInstanceFilter" Lua callback to filter instances received
  through C-Store and return a specific C-Store status code.

Plugins
-------

* New functions in the SDK:
  - OrthancPluginRegisterIncomingCStoreInstanceFilter()
  - OrthancPluginRegisterReceivedInstanceCallback()

Maintenance
-----------

* Removed the OpenSSL license exception, as binary versions of Orthanc are now
  designed to use OpenSSL 3.x, that was re-licensed under Apache 2.0, making
  it compatible with the GPL/AGPL licenses used by the Orthanc project:
  https://en.wikipedia.org/wiki/OpenSSL#Licensing
  https://people.gnome.org/~markmc/openssl-and-the-gpl.html
* Fix handling of option "DeidentifyLogs", notably for tags (0010,0010) and (0010,0020)
* New configuration options:
  - "DicomThreadsCount" to set the number of threads in the embedded DICOM server
* Fix instances accumulating in DB while their attachments were not stored because of 
  MaximumStorageSize limit reached with a single patient in DB.
* Dropped support for static compilation of OpenSSL 1.0.2
* Upgraded dependencies for static builds (notably on Windows and LSB):
  - openssl 3.0.1


Version 1.9.7 (2021-08-31)
==========================

General
-------

* New configuration option "DicomAlwaysAllowMove" to disable verification of
  the remote modality in C-MOVE SCP

REST API
--------

* API version upgraded to 15
* Added "Level" option to POST /tools/bulk-modify
* Added missing OpenAPI documentation of "KeepSource" in ".../modify" and ".../anonymize"

Maintenance
-----------

* Added file CITATION.cff
* Linux Standard Base (LSB) builds of Orthanc can load non-LSB builds of plugins
* Fix upload of ZIP archives containing a DICOMDIR file
* Fix computation of the estimated time of arrival in jobs
* Support detection of windowing and rescale in Philips multiframe images


Version 1.9.6 (2021-07-21)
==========================

Orthanc Explorer
----------------

* In lookup and query/retrieve, possibility to provide a specific study date
* Clicking on "Send to remote modality" displays the job information to monitor progress

Maintenance
-----------

* Fix orphaned attachments if bad revision number is provided


Version 1.9.5 (2021-07-08)
==========================

General
-------

* Anonymization is applied recursively to nested tags

REST API
--------

* API version upgraded to 14
* Added "Short", "Simplify" and/or "Full" options to control the format of DICOM tags in:
  - POST /modalities/{id}/find-worklist
  - POST /queries/{id}/answers/{index}/retrieve
  - POST /queries/{id}/retrieve

Maintenance
-----------

* Fix broken "Do lookup" button in Orthanc Explorer
* Error code and description of jobs are now saved into the Orthanc database


Version 1.9.4 (2021-06-24)
==========================

General
-------

* Orthanc now anonymizes according to Basic Profile of PS 3.15-2021b Table E.1-1
* New configuration options:
  - "ExternalDictionaries" to load external DICOM dictionaries (useful for DICONDE)
  - "SynchronousZipStream" to disable streaming of ZIP

Orthanc Explorer
----------------

* Orthanc Explorer supports the DICONDE dictionary

REST API
--------

* API version upgraded to 13
* New routes to handle groups of multiple, unrelated DICOM resources at once:
  - "/tools/bulk-anonymize" to anonymize a set of resources
  - "/tools/bulk-content" to get the content of a set of resources
  - "/tools/bulk-delete" to delete a set of resources
  - "/tools/bulk-modify" to modify a set of resources
* ZIP archive/media generated in synchronous mode are now streamed by default
* "Replace" tags in "/modify" and "/anonymize" now supports value representation AT
* "/jobs/..." has new field "ErrorDetails" to help identify the cause of an error
* "Replace", "Keep" and "Remove" in "/modify" and "/anonymize" accept paths to subsequences
  using the syntax of the dcmodify command-line tool (wildcards are supported as well)
* Added "short", "simplify" and/or "full" options to control the format of DICOM tags in:
  - GET /patients, GET /studies, GET /series, GET /instances (together with "&expand")
  - GET /patients/{id}, GET /studies/{id}, GET /series/{id}, GET /instances/{id}
  - GET /patients/{id}/studies, GET /patients/{id}/series, GET /patients/{id}/instances
  - GET /studies/{id}/patient, GET /studies/{id}/series, GET /studies/{id}/instances
  - GET /series/{id}/patient, GET /series/{id}/study, GET /series/{id}/instances
  - GET /instances/{id}/patient, GET /instances/{id}/study, GET /instances/{id}/series
  - GET /patients/{id}/instances-tags, GET /patients/{id}/shared-tags
  - GET /studies/{id}/instances-tags, GET /series/{id}/shared-tags
  - GET /series/{id}/instances-tags, GET /studies/{id}/shared-tags
  - GET /patients/{id}/module, GET /patients/{id}/patient-module
  - GET /series/{id}/module, GET /studies/{id}/module, GET /instances/{id}/module
  - GET /queries/{id}/answers&expand, GET /queries/{id}/answers/{index}/content
  - POST /tools/find
* "/studies/{id}/split" accepts "Instances" parameter to split instances instead of series
* "/studies/{id}/merge" accepts instances inside its "Resources" parameter

Maintenance
-----------

* Full support of hierarchical relationships in tags whose VR is UI during anonymization
* C-MOVE SCP: added possible DIMSE status "Sub-operations Complete - One or more Failures"
* Fix issue #146 (Update Anonyization to 2019c) - was actually updated to 2021b
* Upgraded dependencies for static builds (notably on Windows):
  - curl 7.77.0


Version 1.9.3 (2021-05-07)
==========================

General
-------

* New configuration option: "DicomTlsRemoteCertificateRequired" to allow secure DICOM TLS
  connections without certificate

REST API
--------

* "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)

Maintenance
-----------

* New CMake option: "ORTHANC_LUA_VERSION" to use a specific version of system-wide Lua
* Fix the lifetime of temporary files associated with jobs that create ZIP archive/media:
  - In synchronous mode, their number could grow up to "JobsHistorySize" in Orthanc <= 1.9.2
  - In asynchronous mode, the temporary files are removed as soon as their job gets canceled
* Fix regression in the handling of "DicomCheckModalityHost" configuration option
  introduced by changeset 4182 in Orthanc 1.7.4
* Reduced memory consumption of "OrthancPluginHttpClient()", "OrthancPluginHttpClient2()" and
  "OrthancPluginCallPeerApi()" on POST/PUT if chunked transfer is disabled
* Fix issue #195 (No need for BulkDataURI when Data Element is empty)


Version 1.9.2 (2021-04-22)
==========================

General
-------

* New configuration options related to multiple readers/writers:
  - "DatabaseServerIdentifier" identifies the server in the DB among a pool of Orthanc servers
  - "CheckRevisions" to protect against concurrent modifications of metadata and attachments

REST API
--------

* API version upgraded to 12
* "/system" reports the value of the "CheckRevisions" global option
* "/.../{id}/metadata/{name}" and "/.../{id}/attachments/{name}/..." URIs handle the
  HTTP headers "If-Match", "If-None-Match" and "ETag" to cope with revisions

Plugins
-------

* New function in the SDK: OrthancPluginCallRestApi()
* Full refactoring of the database plugin SDK to handle multiple readers/writers,
  which notably implies the handling of retries in the case of collisions

Maintenance
-----------

* Use the local timezone for query/retrieve in the Orthanc Explorer interface (was UTC before)
* Fix "OrthancServer/Resources/Samples/Python/Replicate.py" for Python 3.x
* Fix issue #83 (ServerIndex shall implement retries for DB temporary errors)
* Upgraded dependencies for static builds (notably on Windows and LSB):
  - civetweb 1.14
  - openssl 1.1.1k


Version 1.9.1 (2021-02-25)
==========================

General
-------

* The "dicom-as-json" attachments are not explicitly stored anymore to improve performance
* If the storage area doesn't support range reading, or if "StorageCompression"
  is enabled, a new type of attachment "dicom-until-pixel-data" is generated
* New metadata automatically computed at the instance level: "PixelDataOffset"
* New configuration option related to networking:
  - "Timeout" in "DicomModalities" to set DICOM SCU timeout on a per-modality basis
  - "Timeout" in "OrthancPeers" to set HTTP client timeout on a per-peer basis

REST API
--------

* API version upgraded to 11
* BREAKING CHANGES:
  - External applications should not call "/instances/.../attachments/dicom-as-json" anymore,
    and should use "/instances/.../tags" instead
  - "/instances/.../tags" route does not report the tags after "Pixel Data" (7fe0,0010) anymore
* "/peers/{id}/store-straight": Synchronously send the DICOM instance in POST body to the peer
* New arguments in the REST API:
  - "Timeout" in "/modalities/.../query"
  - "Timeout" in "/modalities/.../storage-commitment"
  - "Timeout" in "/queries/.../answers/.../query-{studies|series|instances}"
  
Plugins
-------

* New value in enumeration: OrthancPluginDicomToJsonFlags_StopAfterPixelData
* New value in enumeration: OrthancPluginDicomToJsonFlags_SkipGroupLengths

Maintenance
-----------

* Improved precision of floating-point numbers in DICOM-as-JSON and DICOM summary
* Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
* Fix build on big-endian architectures
* Handle public tags with "UN" value representation and containing a string (cf. DICOM CP 246)
* The numbering of sequences in Orthanc Explorer now uses the DICOM convention (starts at 1)
* Possibility to generate a static library containing the Orthanc Framework


Version 1.9.0 (2021-01-29)
==========================

General
-------

* Support of DICOM TLS
* New configuration options related to DICOM networking:
  - "DicomTlsEnabled" to enable DICOM TLS in Orthanc SCP
  - "DicomTlsCertificate" to provide the TLS certificate to be used in both Orthanc SCU and SCP
  - "DicomTlsPrivateKey" to provide the private key of the TLS certificate
  - "DicomTlsTrustedCertificates" to provide the list of TLS certificates to be trusted by Orthanc
  - "UseDicomTls" in "DicomModalities" to enable DICOM TLS in outgoing SCU on a per-modality basis
  - "MaximumPduLength" to tune the maximum PDU length (Protocol Data Unit)
  - "LocalAet" in "DicomModalities" to overwrite global "DicomAet" for SCU on a per-modality basis
  - "AcceptedTransferSyntaxes" to set the transfer syntax UIDs accepted by Orthanc C-STORE SCP
  - "H265TransferSyntaxAccepted" to enable/disable all the transfer syntaxes related to H.265
  - "DicomAlwaysAllowFind" to disable verification of the remote modality in C-FIND SCP
  - "DicomAlwaysAllowGet" to disable verification of the remote modality in C-GET SCP
* New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
* New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
* New metadata automatically computed at the series level: "RemoteAET"

Orthanc Explorer
----------------

* The DICOM meta-header and the transfer syntax are displayed at the "Instance" level

REST API
--------

* API version upgraded to 10
* "/tools/accepted-transfer-syntaxes": Get/set transfer syntaxes accepted by Orthanc C-STORE SCP
* "/tools/unknown-sop-class-accepted": Get/set whether C-STORE SCP accepts unknown SOP class UID
* "/modalities/{...}/query": New string argument "LocalAet"
* "/tools/create-dicom": New flag "Force" to bypass consistency checks for the DICOM tags

Lua
---

* BREAKING CHANGE: All the Lua callbacks "IsXXXTransferSyntaxAccepted()" and
  "IsUnknownSopClassAccepted()" have been removed

Plugins
-------

* New functions in the SDK:
  - OrthancPluginCreateMemoryBuffer64()
  - OrthancPluginRegisterStorageArea2()
  - OrthancPluginCreateDicom2()

Maintenance
-----------

* Refactoring and improvements to the cache of DICOM files (it can now hold many files)
* New Prometheus metrics "orthanc_dicom_cache_count" and "orthanc_dicom_cache_size"
* Fix upload of multiple DICOM files using one single POST call to "multipart/form-data"
  Could be the final resolution of issue #21 (DICOM files missing after uploading with Firefox)
* Partial fix of issue #48 (Windows service not stopped properly), cf. comments 4 and 5
* Explicitly use little-endian to encode uncompressed file size with zlib compression
* Upgraded dependencies for static builds (notably on Windows):
  - dcmtk 3.6.6
  - jsoncpp 1.9.4


Version 1.8.2 (2020-12-18)
==========================

General
-------

* ZIP archives containing DICOM files can be uploaded using WebDAV
* New config option "MallocArenaMax" to control memory usage on GNU/Linux
* Explicit error log if trying to load a 32bit (resp. 64bit) plugin into
  a 64bit (resp. 32bit) version of Orthanc
* New configuration options contributed by Varian Medical Systems:
  - "DeidentifyLogs" to remove patient identification from the logs (C-GET, C-MOVE, C-FIND)
  - "DeidentifyLogsDicomVersion" to specify the deidentification rules for the logs
  - "OrthancExplorerEnabled" to enable/disable the Orthanc Explorer Web user interface
  - "SslMinimumProtocolVersion" to set the minimal SSL protocol version (now defaults to SSL 1.2)
  - "SslCiphersAccepted" to set the accepted ciphers over SSL (now defaults to FIPS 140-2)
* New configuration options related to ingest transcoding:
  - "IngestTranscodingOfUncompressed" to control whether uncompressed transfer syntaxes are transcoded
  - "IngestTranscodingOfCompressed" to control whether compressed transfer syntaxes are transcoded

REST API
--------

* "/instances" can be used to import ZIP archives provided in the POST body

Maintenance
-----------

* Allow concurrency on the OrthancPluginRegisterIncomingHttpRequestFilter() callbacks
* Allow empty request body in "/modalities/{id}/echo"
* If meta-header is missing, best-effort to extract "TransferSyntax" in "/instances/{id}/metadata"


Version 1.8.1 (2020-12-07)
==========================

General
-------

* New sample tool "OrthancImport.py" to easily import compressed archives (ZIP) into Orthanc
* Logging categories (cf. command-line options starting with "--verbose-" and "--trace=")
* New command-line option "--trace-dicom" to access full debug information from DCMTK
* New config option "DicomEchoChecksFind" to automatically complement C-GET SCU with C-FIND SCU

REST API
--------

* API version upgraded to 9
* "/tools/dicom-echo": Execute C-Echo SCU to a modality that is not registered in "/modalities"
* "/tools/log-level-*": Dynamically access and/or change the verbosity of logging categories
* "/peers/{id}/configuration": Get the configuration of one peer (cf. "/peers?expand")
* "/modalities/{id}/configuration": Get the configuration of one modality (cf. "/modalities?expand")
* "/tools/dicom-echo" and "/modalities/{id}/echo" now accept the field "CheckFind" in their JSON
  body to complement C-GET SCU with C-FIND SCU ("DicomEchoChecksFind" on a per-connection basis)
* Archive/media jobs report the size of the created ZIP file in content field "ArchiveSizeMB"

Plugins
-------

* New function in the SDK: OrthancPluginGenerateRestApiAuthorizationToken()

Maintenance
-----------

* C-GET SCP: Fix responses and handling of cancel
* Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
* Fix keep-alive in the embedded HTTP server by setting the "Keep-Alive" HTTP header
* Fix access to videos as a single raw frame (feature broken since Orthanc 1.6.0)
* REST API now returns 404 error if deleting an inexistent peer or modality
* Improved forward ABI compatibility of Orthanc Framework (notably, no inline methods anymore)
* Upgraded dependencies for static builds (notably on Windows and LSB):
  - civetweb 1.13


Version 1.8.0 (2020-10-16)
==========================

General
-------

* Serving the content of Orthanc as a WebDAV network share
* New config options: "WebDavEnabled", "WebDavDeleteAllowed" and "WebDavUploadAllowed"

Plugins
-------

* New available origin for a DICOM instance: "OrthancPluginInstanceOrigin_WebDav"


Version 1.7.4 (2020-09-18)
==========================

General
-------

* New configuration options to enable HTTP peers identification through certificates:
  "SslVerifyPeers" and "SslTrustedClientCertificates"
* New configuration option "SyncStorageArea" to immediately commit the files onto the disk
  (through fsync()), so as to avoid discrepencies between DB and filesystem in case of hard
  shutdown of the machine running Orthanc. This slows down adding new files into Orthanc.

Maintenance
-----------

* Underscores are now allowed in peers/modalities symbolic names
* Fix compatibility with C-MOVE SCU requests issued by Ambra
* Fix transcoding in C-MOVE SCP, in the case where "SynchronousCMove" is "true"
* When checking DICOM allowed methods, if there are multiple modalities with the same AET, 
  differentiate them from the calling IP
* Enable the access to raw frames in Philips ELSCINT1 proprietary compression
* Support empty key passwords when using HTTP client certificates
* Fix handling of "ModalitiesInStudy" (0008,0061) in C-FIND and "/tools/find"


Version 1.7.3 (2020-08-24)
==========================

REST API
--------

* API version upgraded to 8
* "/peers/{id}/store": New option "Compress" to compress DICOM data using gzip
* "OrthancPeerStore" jobs now report the transmitted size in their public content

Plugins
-------

* New config option "Worklist.LimitAnswers" for the sample modality worklist plugin

Maintenance
-----------

* Add missing tag "Retrieve AE Title (0008,0054)" in C-FIND SCP responses
* Fix DICOM SCP filters if some query tag has > 256 characters (list of UIDs matching)
* "/series/.../ordered-slices" supports spaces in Image Position/Orientation Patient tags
* Fix possible crash in HttpClient if sending multipart body (can occur in STOW-RS)
* Support receiving multipart messages larger than 2GB in the embedded HTTP server


Version 1.7.2 (2020-07-08)
==========================

General
-------

* C-FIND SCP now returns private tags (cf. option "DefaultPrivateCreator")
* Packaging of the Orthanc framework as a shared library

Plugins
-------

* New change types in the SDK: JobSubmitted, JobSuccess, JobFailure

Maintenance
-----------

* Issue #182: Better reporting of errors in plugins reading chunked HTTP body
* Fix issue #183 (C-ECHO always fails in Orthanc Explorer, regression from 1.6.1 to 1.7.0)


Version 1.7.1 (2020-05-27)
==========================

* Fix decoding of DICOM images for plugins (for compatibility with
  Orthanc Web Viewer 2.6)


Version 1.7.0 (2020-05-22)
==========================

General
-------

* Support of DICOM C-GET SCP (contribution by Varian Medical Systems)
* DICOM transcoding over the REST API
* Transcoding from compressed to uncompressed transfer syntaxes over DICOM
  C-STORE SCU (if the remote modality doesn't support compressed syntaxes)
* New configuration options related to transcoding:
  "TranscodeDicomProtocol", "BuiltinDecoderTranscoderOrder",
  "IngestTranscoding" and "DicomLossyTranscodingQuality"

REST API
--------

* API version upgraded to 7
* Improved:
  - "/instances/../modify": it is now possible to "Keep" the "SOPInstanceUID".  
    Note that it was already possible to "Replace" it.
  - added "Timeout" parameter to every DICOM operation
  - "/queries/.../answers/../retrieve": "TargetAet" not mandatory anymore
    (defaults to the local AET)
* Changes:
  - "/{patients|studies|series}/.../modify": New option "KeepSource"
  - "/{patients|studies|series|instances}/.../modify": New option "Transcode"
  - "/peers/{id}/store": New option "Transcode"
  - ".../archive", ".../media", "/tools/create-media" and
    "/tools/create-archive": New option "Transcode"
  - "/ordered-slices": reverted the change introduced in 1.5.8 and go-back 
    to 1.5.7 behaviour.

Plugins
-------

* New functions in the SDK:
  - OrthancPluginCreateDicomInstance()
  - OrthancPluginCreateMemoryBuffer()
  - OrthancPluginEncodeDicomWebJson2()
  - OrthancPluginEncodeDicomWebXml2()
  - OrthancPluginFreeDicomInstance()
  - OrthancPluginGetInstanceAdvancedJson()
  - OrthancPluginGetInstanceDecodedFrame()
  - OrthancPluginGetInstanceDicomWebJson()
  - OrthancPluginGetInstanceDicomWebXml()
  - OrthancPluginGetInstanceFramesCount()
  - OrthancPluginGetInstanceRawFrame()
  - OrthancPluginRegisterTranscoderCallback()
  - OrthancPluginSerializeDicomInstance()
  - OrthancPluginTranscodeDicomInstance()
* "OrthancPluginDicomInstance" structure wrapped in "OrthancPluginCppWrapper.h"
* Allow concurrent calls to the custom image decoders provided by the plugins

Maintenance
-----------

* Moved the GDCM sample plugin out of the Orthanc repository as a separate plugin
* Fix missing body in "OrthancPluginHttpPost()" and "OrthancPluginHttpPut()"
* Fix issue #169 (TransferSyntaxUID change from Explicit to Implicit during C-STORE SCU)
* Fix issue #179 (deadlock in Python plugins)
* Upgraded dependencies for static builds (notably on Windows and LSB):
  - openssl 1.1.1g


Version 1.6.1 (2020-04-21)
==========================

REST API
--------

* API version has been upgraded to 6
* Added:
  - "/modalities/{id}/store-straight": Synchronously send the DICOM instance in POST
    body to another modality (alternative to command-line tools such as "storescu")

Plugins
-------

* New functions in the SDK:
  - OrthancPluginRegisterIncomingDicomInstanceFilter()
  - OrthancPluginGetInstanceTransferSyntaxUid()
  - OrthancPluginHasInstancePixelData()

Lua
---

* New "info" field in "ReceivedInstanceFilter()" callback, containing
  "HasPixelData" and "TransferSyntaxUID" information

Maintenance
-----------

* Source code repository moved from BitBucket to self-hosted server
* Fix OpenSSL initialization on Linux Standard Base
* Fix lookup form in Orthanc Explorer (wildcards not allowed in StudyDate)
* Fix signature of "OrthancPluginRegisterStorageCommitmentScpCallback()" in plugins SDK
* Error reporting on failure while initializing SSL
* Fix unit test ParsedDicomFile.ToJsonFlags2 on big-endian architectures
* Avoid one memcpy of the DICOM buffer on "POST /instances"
* Upgraded dependencies for static builds (notably on Windows):
  - civetweb 1.12
  - openssl 1.1.1f


Version 1.6.0 (2020-03-18)
==========================

General
-------

* Support of DICOM storage commitment

REST API
--------

* API version has been upgraded to 5
* Added:
  - "/peers/{id}/system": Test the connectivity with a remote peer
    (and also retrieve its version number)
  - "/tools/log-level": Access and/or change the log level without restarting Orthanc
  - "/instances/{id}/frames/{frame}/rendered" and "/instances/{id}/rendered":
    Render frames, taking windowing and resizing into account
  - "/modalities/{...}/storage-commitment": Trigger storage commitment SCU
  - "/storage-commitment/{...}": Access storage commitment reports
  - "/storage-commitment/{...}/remove": Remove instances from storage commitment reports
* Improved:
  - "/changes": Allow the "limit" argument to be greater than 100
  - "/instances": Support "Content-Encoding: gzip" to upload gzip-compressed DICOM files
  - ".../modify" and "/tools/create-dicom": New option "PrivateCreator" for private tags
  - "/modalities/{...}/store": New Boolean argument "StorageCommitment"

Plugins
-------

* New sample plugin: "ConnectivityChecks"
* New primitives to handle storage commitment SCP by plugins

Lua
---

* New events:
  - "OnDeletedPatient", "OnDeletedStudy", "OnDeletedSeries", "OnDeletedInstance":
    triggered when a resource is deleted
  - "OnUpdatedPatient", "OnUpdatedStudy", "OnUpdatedSeries", "OnUpdatedInstance":
    triggered when an attachment or a metadata is updated

Maintenance
-----------

* New configuration options: "DefaultPrivateCreator" and "StorageCommitmentReportsSize"
* Support of MPEG4 transfer syntaxes in C-Store SCP
* C-FIND SCU at Instance level now sets the 0008,0052 tag to IMAGE per default (was INSTANCE).
  Therefore, the "ClearCanvas" and "Dcm4Chee" modality manufacturer have now been deprecated.
* More strict C-FIND SCP wrt. the DICOM standard: Forbid wildcard
  matching on some VRs, ignore main tags below the queried level
* Fix issue #65 (Logging improvements)
* Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
* Fix issue #140 (Modifying private tags with REST API changes VR from LO to UN)
* Fix issue #154 (Matching against list of UID-s by C-MOVE)
* Fix issue #156 (Chunked Dicom-web transfer uses 100% CPU)
* Fix issue #165 (Boundary parameter in multipart Content-Type is too long)
* Fix issue #166 (CMake find_boost version is now broken with newer boost/cmake)
* Fix issue #167 (Job can't be cancelled - Handling of timeouts after established association)
* Fix issue #168 (Plugins can't read private tags from the configuration file)
* Upgraded dependencies for static builds (notably on Windows):
  - dcmtk 3.6.5
  - openssl 1.1.1d
  - jsoncpp 0.10.7 for pre-C++11 compilers


Version 1.5.8 (2019-10-16)
==========================

REST API
--------

* API version has been upgraded to 4
* In /ordered-slices route, ignore instances without position/normal/seriesIndex,
  unless there are only such instances in the series

Maintenance
-----------

* Security: If remote access is enabled, HTTP authentication is also
  enabled by default. This modification was done to mitigate security
  risks reported by independant security researcher Amitay Dan.
* Security: New configuration option "ExecuteLuaEnabled" to allow "/tools/execute-script"
* New configuration option: "HttpRequestTimeout"
* Log an explicit error if uploading an empty DICOM file using REST API
* Name of temporary files now include the process ID to ease design of scripts cleaning /tmp
* Fix compatibility of LSB binaries with Ubuntu >= 18.04
* Fix generation of "SOP Instance UID" on split and merge
* Orthanc Explorer: include the URL search params into HTTP headers to
  the REST API to ease usage of the Authorization plugin. Note that
  only the 'token', 'auth-token' & 'authorization' search params are
  transmitted into HTTP headers.
* Fix lost relationships between CT and RT-STRUCT during anonymization


Version 1.5.7 (2019-06-25)
==========================

REST API
--------

* API version has been upgraded to 3
* "/modalities/{id}/query": New argument "Normalize" can be set to "false"
  to bypass the automated correction of outgoing C-FIND queries
* Reporting of "ParentResources" in "DicomModalityStore" and "DicomModalityStore" jobs

Plugins
-------

* New functions in the SDK:
  - OrthancPluginHttpClientChunkedBody(): HTTP client for POST/PUT with a chunked body
  - OrthancPluginRegisterMultipartRestCallback(): HTTP server for POST/PUT with multipart body
  - OrthancPluginGetTagName(): Retrieve the name of a DICOM tag from its group and element

Maintenance
-----------

* Orthanc now accepts "-H 'Transfer-Encoding: chunked'" option from curl
* Size of the Orthanc static binaries are reduced by compressing ICU data
* Anonymization: Preserve hierarchical relationships in (0008,1115) [] (0020,000e)
* Allow the serialization of signed 16bpp images in PAM format
* HTTP header "Accept-Encoding" is honored for streams without built-in support for compression
* The default HTTP timeout is now 60 seconds (instead of 10 seconds in previous versions)
* Allow anonymizing/modifying instances without the PatientID tag
* Fix issue #106 (Unable to export preview as jpeg from Lua script)
* Fix issue #136 (C-FIND request fails when found DICOM file does not have certain tags)
* Fix issue #137 (C-STORE fails for unknown SOP Class although server is configured to accept any)
* Fix issue #138 (POST to modalities/{name} accepts invalid characters)
* Fix issue #141 (/tools/create-dicom removes non-ASCII characters from study description)


Version 1.5.6 (2019-03-01)
==========================

Orthanc Explorer
----------------

* If performing a Query/Retrieve operation, the default value for the
  tags is set to an empty string instead of '*', which allows one to match
  even if the tag is not present. This allows malformed DICOM files to
  be matched, even though they lack required tags such as "PatientSex"

Maintenance
-----------

* Enlarge the support of JSON-to-XML conversion in the REST API
* Fix missing DB transactions in some write operations
* Fix performance issue in DICOM protocol by disabling Nagle's algorithm


Version 1.5.5 (2019-02-25)
==========================

General
-------

* Support of the following multi-byte specific character sets:
  - Japanese Kanji (ISO 2022 IR 87)
  - Korean (ISO 2022 IR 149)
  - Simplified Chinese (ISO 2022 IR 58)
* Basic support for character sets with code extensions (ISO 2022 escape sequences)

REST API
--------

* API version has been upgraded to 2
* "DicomMoveScu" jobs provide the associated C-FIND answer in their "Query" public field

Plugins
-------

* Separation of ideographic and phonetic characters in DICOMweb JSON and XML

Maintenance
-----------

* Accept SOP classes: BreastProjectionXRayImageStorageForProcessing/Presentation
* More tolerance wrt. missing DICOM tags that must be returned by Orthanc C-FIND SCP
* Orthanc now interprets the "DCMDICTPATH" environment variable the same way as DCMTK
* New CMake option: "-DMSVC_MULTIPLE_PROCESSES=ON" for parallel build with Visual Studio
* Fix issue #126 (Orthanc and DCMDICTPATH)
* Fix issue #131 (C-MOVE failure due to duplicate StudyInstanceUID in the database)
* Fix issue #134 (/patient/modify gives 500, should really be 400)
* Upgraded dependencies for static builds (notably on Windows):
  - boost 1.69.0
  - curl 7.64.0
  - dcmtk 3.6.4
  - e2fsprogs 1.44.5 (libuuid)
  - googletest 1.8.1
  - libjpeg 9c
  - libpng 1.6.36
  - openssl 1.0.2p
  - pugixml 1.9
  - sqlite amalgamation 3.27.1


Version 1.5.4 (2019-02-08)
==========================

General
-------

* New configuration options:
  - "MetricsEnabled" to enable the tracking of the metrics of Orthanc
  - "HttpThreadsCount" to set the number of threads in the embedded HTTP server
  - "TemporaryDirectory" to set the folder containing the temporary files

REST API
--------

* API version has been upgraded to 1.4
* URI "/instances/.../file" can return DICOMweb JSON or XML, depending
  on the content of the "Accept" HTTP header
* New URI "/tools/metrics" to dynamically enable/disable the collection of metrics
* New URI "/tools/metrics-prometheus" to retrieve metrics using Prometheus text format
* URI "/peers?expand" provides more information about the peers

Plugins
-------

* New functions in the SDK:
  - OrthancPluginSetMetricsValue() to set the value of a metrics
  - OrthancPluginRegisterRefreshMetricsCallback() to ask to refresh metrics
  - OrthancPluginEncodeDicomWebJson() to convert DICOM to "application/dicom+json"
  - OrthancPluginEncodeDicomWebXml() to convert DICOM to "application/dicom+xml"
* New extensions in the database SDK: LookupResourceAndParent and GetAllMetadata

Maintenance
-----------

* Fix regression if calling "/tools/find" with the tag "ModalitiesInStudy"
* Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
* Fix issue #130 (Orthanc failed to start when /tmp partition was full)


Version 1.5.3 (2019-01-25)
==========================

General
-------

* New configuration option: "SaveJobs" to specify whether jobs are stored in the database

Maintenance
-----------

* Don't return tags whose group is below 0x0008 in C-FIND SCP answers
* Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
* Fix issue #73 (/modalities/{modalityId}/store raises 500 errors instead of 404)
* Fix issue #90 (C-Find shall match missing tags to null/empty string)
* Fix issue #119 (/patients/.../archive returns a 500 when JobsHistorySize is 0)
* Fix issue #128 (Asynchronous C-MOVE: invalid number of remaining sub-operations)


Version 1.5.2 (2019-01-18)
==========================

General
-------

* CivetWeb is now the default embedded HTTP server (instead of Mongoose)
* New configuration option: "TcpNoDelay" to disable Nagle's algorithm in HTTP server

REST API
--------

* API version has been upgraded to 1.3
* More consistent handling of the "Last" field returned by the "/changes" URI

Plugins
-------

* New primitives to speed up databases (custom index plugins)

Maintenance
-----------

* Ignore tags whose group is below 0x0008 in C-FIND SCP requests
* Compatibility with DCMTK 3.6.4
* Fix issue #21 (DICOM files missing after uploading with Firefox)
* Fix issue #32 (HTTP keep-alive is now enabled by default)
* Fix issue #58 (Patient recycling order should be defined by their received last instance)
* Fix issue #118 (Wording in Configuration.json regarding SynchronousCMove)
* Fix issue #124 (GET /studies/ID/media fails for certain dicom file)
* Fix issue #125 (Mongoose: /instances/{id} returns 500 on invalid HTTP Method)
* Fixed Orthanc Explorer on IE and Firefox: Explorer always show "too many results"
  and it's therefore impossible to browse the content
* Upgraded dependencies for static and Windows builds:
  - civetweb 1.11


Version 1.5.1 (2018-12-20)
==========================

General
-------

* Optimization: On C-FIND, avoid accessing the storage area whenever possible
* New configuration option:
  - "StorageAccessOnFind" to rule the access to the storage area during C-FIND

Maintenance
-----------

* Removal of the "AllowFindSopClassesInStudy" old configuration option
* "/tools/create-dicom" is more tolerant wrt. invalid specific character set


Version 1.5.0 (2018-12-10)
==========================

General
-------

* Possibility to restrict the allowed DICOM commands for each modality
* The Orthanc configuration file can use environment variables
* New configuration options:
  - "DicomModalitiesInDatabase" to store the definitions of modalities in the database
  - "OrthancPeersInDatabase" to store the definitions of Orthanc peers in the database

Orthanc Explorer
----------------

* The first screen of Orthanc Explorer is now a form to do studies lookups
* Support of large databases, by limiting the results to 100 patients or studies

REST API
--------

* API version has been upgraded to 1.2
* Asynchronous generation of ZIP archives and DICOM medias
* New URI: "/studies/.../merge" to merge a study
* New URI: "/studies/.../split" to split a study
* POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
* GET "/modalities/?expand" now returns a JSON object instead of a JSON array
* New "Details" field in HTTP answers on error (cf. "HttpDescribeErrors" option)
* New options to URI "/queries/.../answers": "?expand" and "?simplify"
* New URIs to launch new C-FIND to explore the hierarchy of a C-FIND answer:
  - "/queries/.../answers/.../query-instances" to C-FIND child instances
  - "/queries/.../answers/.../query-series" to C-FIND child series
  - "/queries/.../answers/.../query-studies" to C-FIND child studies
* New "DicomDiskSize" and "DicomUncompressedSize" fields in statistics about resources

Plugins
-------

* New functions in the SDK:
  - "OrthancPluginSetHttpErrorDetails()"
  - "OrthancPluginAutodetectMimeType()"

Maintenance
-----------

* "SynchronousCMove" is now "true" by default
* New modality manufacturer: "GE" for GE Healthcare EA and AW
* Executing a query/retrieve from the REST API now creates a job
* Fix: Closing DICOM associations after running query/retrieve from REST API
* Fix: Allow creation of MONOCHROME1 grayscale images in tools/create-dicom
* Remove invalid characters from badly-encoded UTF-8 strings (impacts PostgreSQL)
* Orthanc starts even if jobs from a previous execution cannot be unserialized
* New CMake option "ENABLE_DCMTK_LOG" to disable logging internal to DCMTK
* Fix issue 114 (Boost 1.68 doesn't support SHA-1 anymore)
* Support of "JobsHistorySize" set to zero
* Upgraded dependencies for static and Windows builds:
  - boost 1.68.0
  - lua 5.3.5


Version 1.4.2 (2018-09-20)
==========================

General
-------

* "OrthancPeers" configuration option now allows one to specify HTTP headers
* New main DICOM tag: "ImageOrientationPatient" at the instance level
* New configuration options:
  - "HttpVerbose" to debug outgoing HTTP connections
  - "OverwriteInstances" to choose how duplicate SOPInstanceUID are handled

Orthanc Explorer
----------------

* Query/retrieve: Added button for "DX" modality

REST API
--------

* "/tools/reconstruct" to reconstruct the main DICOM tags, the JSON summary and
  the metadata of all the instances stored in Orthanc. This is a slow operation!

Plugins
-------

* New primitives to access Orthanc peers from plugins
* New events in change callbacks: "UpdatedPeers" and "UpdatedModalities"
* New primitives to handle jobs from plugins: "OrthancPluginSubmitJob()"
  and "OrthancPluginRegisterJobsUnserializer()"

Lua
---

* IncomingWorklistRequestFilter() to filter incoming C-FIND worklist queries

Maintenance
-----------

* Fix "/series/.../ordered-slices" in the presence of non-parallel slices
* Fix incoming DICOM C-Store filtering for JPEG-LS transfer syntaxes
* Fix OrthancPluginHttpClient() to return the HTTP status on errors
* Fix HTTPS requests to sites using a certificate encrypted with ECDSA
* Fix handling of incoming C-FIND queries containing Generic Group Length (*, 0x0000)
* Fix issue 54 (quoting multipart answers), for OsiriX compatibility through DICOMweb
* Fix issue 98 (DCMTK configuration fails with GCC 6.4.0 on Alpine)
* Fix issue 99 (PamWriter test segfaults on alpine linux with gcc 6.4.0)


Version 1.4.1 (2018-07-17)
==========================

* Fix deadlock in Lua scripting
* Simplification to the "DatabaseWrapper" class


Version 1.4.0 (2018-07-13)
==========================

General
-------

* New advanced job engine
* New configuration options:
  - "ConcurrentJobs": Max number of jobs that are simultaneously running
  - "SynchronousCMove": Whether to run DICOM C-Move operations synchronously
  - "JobsHistorySize": Max number of completed jobs that are kept in memory
* New metadata automatically computed at the instance level: 
  "RemoteIp", "CalledAet" and "HttpUsername"

Orthanc Explorer
----------------

* New screen listing all the available studies

REST API
--------

* "/jobs/..." to manage the jobs from the REST API
* New option "?short" to list DICOM tags using their hexadecimal ID in:
  - "/instances/.../tags?short"
  - "/instances/.../header?short"
  - "/{patients|studies|series}/.../instances-tags?short"
  - "/{patients|studies|series}/.../shared-tags?short"
  - "/{patients|studies|series|instances}/.../module?short"
  - "/studies/.../module-patient?short"
* "/instances/.../tags" URI was returning only the first value of
  DicomTags containing multiple numerical value.  It now returns all
  values in a string separated by \\ (i.e.: "1\\2\\3").  Note that,
  for data already in Orthanc, you'll need to reconstruct the data by
  sending a POST request to the ".../reconstruct" URI.  This change
  triggered an update of ORTHANC_API_VERSION from 1.0 to 1.1
* "/instances/.../frame/../image-uint8 and friends now accepts a 
  "image/pam" MIME type to retrieve images in PAM format
  (https://en.wikipedia.org/wiki/Netpbm#PAM_graphics_format)
* New option "?expand" to "/instances/.../metadata"

Plugins
-------

* New primitive in database SDK: "lookupIdentifierRange" to speed up range searches
* New function in the SDK: "OrthancPluginCheckVersionAdvanced()"

Maintenance
-----------

* Configuration option "LogExportedResources" is now "false" by default
* Header "OrthancCppDatabasePlugin.h" is now part of the "orthanc-databases" project
* Fix generation of DICOMDIR if PatientID is empty
* Fix issue 25 (Deadlock with Lua scripts): The event queue is now implemented for Lua
* Fix issue 94 (Instance modification should not modify FrameOfReferenceUID)
* Fix issue 77 (Lua access to REST-API is null terminated)
* Fix memory leak introduced by changeset #99116ed6f38c in Orthanc 1.3.2
* Upgraded dependencies for static and Windows builds:
  - boost 1.67.0
  - openssl 1.0.2o


Version 1.3.2 (2018-04-18)
==========================

REST API
--------

* "/system" URI returns the version of the Orthanc REST API
* "/tools/now" returns the current UTC (universal) time
* "/tools/now-local" returns the curent local time.
  This was the behavior of "/tools/now" until release 1.3.1.
* Added "?expand" GET argument to "/peers" and "/modalities" routes
* New URI: "/tools/create-media-extended" to generate a DICOMDIR
  archive from several resources, including additional type-3 tags
* Preservation of UID relationships while anonymizing

Lua
---

* New CMake option: "-DENABLE_LUA_MODULES=ON" to enable support for
  loading external Lua modules if the Lua engine is statically linked

Plugins
-------

* New error code: DatabaseUnavailable

Maintenance
-----------

* Orthanc now uses UTC (universal time) instead of local time in its database
* Fix to allow creating DICOM instances with empty Specific Character Set (0008,0005)
* Support of Linux Standard Base
* Static linking against libuuid (from e2fsprogs)
* Fix static build on CentOS 6
* Possibility of using JsonCpp 0.10.6 if the compiler does not support C++11
  with the "-DUSE_LEGACY_JSONCPP=ON" CMake option
* Upgraded dependencies for static and Windows builds:
  - boost 1.66.0
  - curl 7.57.0
  - jsoncpp 1.8.4
  - zlib 1.2.11


Version 1.3.1 (2017-11-29)
==========================

General
-------

* Built-in decoding of palette images

REST API
--------

* New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
* New argument "ignore-length" to force the inclusion of too long tags in JSON
* New argument "/.../media?extended" to include additional type-3 tags in DICOMDIR

Plugins
-------

* New pixel formats exposed in SDK: BGRA32, Float32, Grayscale32, RGB48

Maintenance
-----------

* Creation of ./Resources/CMake/OrthancFramework*.cmake to reuse the Orthanc
  C++ framework in other projects
* New security-related options: "DicomAlwaysAllowEcho"
* Use "GBK" (frequently used in China) as an alias for "GB18030"
* Experimental support of actively maintained Civetweb to replace Mongoose 3.8
* Fix issue 31 for good (create new modality types for Philips ADW, GE Xeleris, GE AWServer)
* Fix issue 64 (OpenBSD support)
* Fix static compilation of DCMTK 3.6.2 on Fedora
* Upgrade to Boost 1.65.1 in static builds
* Upgrade to SQLite amalgamation 3.21.0 in static builds


Version 1.3.0 (2017-07-19)
==========================

General
-------

* Orthanc now anonymizes according to Basic Profile of PS 3.15-2017c Table E.1-1
* In the "DicomModalities" configuration:
  - Manufacturer type MedInria is now obsolete
  - Manufacturer types AgfaImpax and SyngoVia are obsolete too
    (use GenericNoWildcardInDates instead)
  - Obsolete manufacturers are still accepted but might disappear in the future
  - Added new manufacturer: GenericNoUniversalWildcard to replace all '*' by '' in
    outgoing C-Find requests
* New security-related options: "DicomAlwaysAllowStore" and "DicomCheckModalityHost"

REST API
--------

* Argument "Since" in URI "/tools/find" (related to issue 53)
* Argument "DicomVersion" in URIs "/{...}/{...}/anonymization"

Plugins
-------

* New function: "OrthancPluginRegisterIncomingHttpRequestFilter2()"

Lua
---

* Added HTTP headers support for Lua HttpPost/HttpGet/HttpPut/HttpDelete

Orthanc Explorer
----------------

* Query/retrieve: Added button for "DR" modality

Maintenance
-----------

* Ability to retrieve raw frames encoded as unsigned 32-bits integers
* Fix issue 29 (more consistent handling of the "--upgrade" argument)
* Fix issue 31 (create new modality types for Philips ADW, GE Xeleris, GE AWServer)
* Fix issue 35 (AET name is not transferred to Orthanc using DCMTK 3.6.0)
* Fix issue 44 (bad interpretation of photometric interpretation MONOCHROME1)
* Fix issue 45 (crash when providing a folder to "--config" command-line option)
* Fix issue 46 (PHI remaining after anonymization)
* Fix issue 49 (worklists: accentuated characters are removed from C-Find responses)
* Fix issue 52 (DICOM level security association problems)
* Fix issue 55 (modification/anonymization of tags that might break the database
  model now requires the "Force" parameter to be set to "true" in the query)
* Fix issue 56 (case-insensitive matching over accents)
* Fix Debian #865606 (orthanc FTBFS with libdcmtk-dev 3.6.1~20170228-2)
* Fix XSS inside DICOM in Orthanc Explorer (as reported by Victor Pasnkel, Morphus Labs)
* Upgrade to DCMTK 3.6.2 in static builds (released on 2017-07-17)
* Upgrade to Boost 1.64.0 in static builds
* New advanced "Locale" configuration option
* Removed configuration option "USE_DCMTK_361_PRIVATE_DIC"


Version 1.2.0 (2016/12/13)
==========================

General
-------

* Handling of private tags/creators in the "Dictionary" configuration option
* New configuration options: "LoadPrivateDictionary", "DicomScuTimeout" and "DicomScpTimeout"
* New metadata automatically computed at the instance level: "TransferSyntax" and "SopClassUid"

REST API
--------

* "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
  (useful if private tags are registered, or if changing the default encoding)
* "Permissive" flag for URI "/modalities/{...}/store" to ignore C-STORE transfer errors
* "Asynchronous" flag for URIs "/modalities/{...}/store" and "/peers/{...}/store"
  to avoid waiting for the completion of image transfers
* Possibility to DELETE "dicom-as-json" attachments to reconstruct the JSON summaries
  (useful if "Dictionary" has changed)
* "Keep" option for modifications to keep original DICOM identifiers (advanced feature)
* "/tools/default-encoding" to get or temporarily change the default encoding
* "/{resource}/{id}/reconstruct" to reconstruct the main DICOM tags, the JSON summary and
  the metadata of a resource (useful to compute new metadata, or if using "Keep" above)

Plugins
-------

* New function: "OrthancPluginRegisterPrivateDictionaryTag()" to register private tags
* More control over client cache in the ServeFolders plugin
* New C++ help wrappers in "Plugins/Samples/Common/" to read DICOM datasets from REST API
* New data structure: "OrthancPluginFindMatcher" to match DICOM against C-FIND queries

Maintenance
-----------

* Fix handling of encodings in C-FIND requests (including for worklists)
* Use of DCMTK 3.6.1 dictionary of private tags in standalone builds
* Avoid hard crash if not enough memory (handling of std::bad_alloc)
* Improved robustness of Orthanc Explorer wrt. query/retrieve (maybe fix issue 24)
* Fix serious performance issue with C-FIND
* Fix extraction of the symbolic name of the private tags
* Performance warning if runtime debug assertions are turned on
* Improved robustness against files with no PatientID
* Upgrade to curl 7.50.3 for static and Windows builds
* Content-Type for JSON documents is now "application/json; charset=utf-8"
* Ignore "Group Length" tags in C-FIND queries
* Fix handling of worklist SCP with ReferencedStudySequence and ReferencedPatientSequence
* Fix handling of Move Originator AET and ID in C-MOVE SCP
* Fix vulnerability ZSL-2016-5379 "Unquoted Service Path Privilege Escalation" in the
  Windows service
* Fix vulnerability ZSL-2016-5380 "Remote Memory Corruption Vulnerability" in DCMTK 3.6.0


Version 1.1.0 (2016/06/27)
==========================

General
-------

* HTTPS client certificates can be associated with Orthanc peers to enhance security over Internet
* Possibility to use PKCS#11 authentication for hardware security modules with Orthanc peers
* New command-line option "--logfile" to output the Orthanc log to the given file
* Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)

REST API
--------

* New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
* New URI "/modalities/.../move" to issue C-MOVE SCU requests
* "MoveOriginatorID" can be specified for "/modalities/.../store"

Dicom protocol
--------------

* Support of optional tags for counting resources in C-FIND:
  0008-0061, 0008-0062, 0020-1200, 0020-1202, 0020-1204, 0020-1206, 0020-1208, 0020-1209
* Support of Move Originator Message ID (0000,1031) in C-STORE responses driven by C-MOVE

Plugins
-------

* Speedup in plugins by removing unnecessary locks
* New callback to filter incoming HTTP requests: OrthancPluginRegisterIncomingHttpRequestFilter()
* New callback to handle non-worklists C-FIND requests: OrthancPluginRegisterFindCallback()
* New callback to handle C-MOVE requests: OrthancPluginRegisterMoveCallback()
* New function: "OrthancPluginHttpClient()" to do HTTP requests with full control
* New function: "OrthancPluginGenerateUuid()" to generate a UUID
* More than one custom image decoder can be installed (e.g. to handle different transfer syntaxes)

Lua
---

* Possibility to dynamically fix outgoing C-FIND requests using "OutgoingFindRequestFilter()"
* Access to the HTTP headers in the "IncomingHttpRequestFilter()" callback

Image decoding
--------------

* Huge speedup if decoding the family of JPEG transfer syntaxes
* Refactoring leading to speedups with custom image decoders (including Web viewer plugin)
* Support decoding of RLE Lossless transfer syntax
* Support of signed 16bpp images in ParsedDicomFile

Maintenance
-----------

* New logo of Orthanc
* Fix issue 11 (is_regular_file() fails for FILE_ATTRIBUTE_REPARSE_POINT)
* Fix issue 16 ("Limit" parameter error in REST API /tools/find method)
* Fix of Debian bug #818512 ("FTBFS: Please install libdcmtk*-dev")
* Fix of Debian bug #823139 ("orthanc: Please provide RecoverCompressedFile.cpp")
* Replaced "localhost" by "127.0.0.1", as it might impact performance on Windows
* Compatibility with CMake >= 3.5.0
* Possibility to use forthcoming DCMTK 3.6.1 in static builds (instead of 3.6.0)
* Upgrade to Boost 1.60.0 for static builds
* Use of HTTP status 403 Forbidden (instead of 401) if access to a REST resource is disallowed
* Option "HttpsVerifyPeers" can be used to connect against self-signed HTTPS certificates
* New configuration option "AllowFindSopClassesInStudy"
* Macro "__linux" (now obsolete) replaced by macro "__linux__" (maybe solves Debian bug #821011)
* Modification of instances can now replace PixelData (resp. EncapsulatedDocument) with 
  provided a PNG/JPEG image (resp. PDF file) if it is encoded using Data URI Scheme
* Dropped support of Google Log


Version 1.0.0 (2015/12/15)
==========================

* Lua: "IncomingFindRequestFilter()" to apply filters to incoming C-FIND requests
* New function in plugin SDK: "OrthancPluginSendMultipartItem2()"
* Fix of DICOMDIR generation with DCMTK 3.6.1, support of encodings
* Fix range search if the lower or upper limit is absent
* Fix modality worklists lookups if tags with UN (unknown) VR are present
* Warn about badly formatted modality/peer definitions in configuration file at startup


Version 0.9.6 (2015/12/08)
==========================

* Promiscuous mode (accept unknown SOP class UID) is now turned off by default
* Fix serialization of DICOM buffers that might contain garbage trailing
* Fix modality worklists server if some fields are null
* More tolerant "/series/.../ordered-slices" with broken series
* Improved logging information if upgrade fails
* Fix formatting of multipart HTTP answers (bis)


Version 0.9.5 (2015/12/02)
==========================

Major
-----

* Experimental support of DICOM C-FIND SCP for modality worklists through plugins
* Support of DICOM C-FIND SCU for modality worklists ("/modalities/{dicom}/find-worklist")

REST API
--------

* New URIs:
  - "/series/.../ordered-slices" to order the slices of a 2D+t or 3D series
  - "/tools/shutdown" to stop Orthanc from the REST API
  - ".../compress", ".../uncompress" and ".../is-compressed" for attachments
  - "/tools/create-archive" to create ZIP from a set of resources
  - "/tools/create-media" to create ZIP+DICOMDIR from a set of resources
  - "/instances/.../header" to get the meta information (header) of the DICOM instance
* "/tools/create-dicom":
  - Support of binary tags encoded using data URI scheme
  - Support of hierarchical structures (creation of sequences)
  - Create tags with unknown VR
* "/modify" can insert/modify sequences
* ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
* "Origin" metadata for the instances

Minor
-----

* New configuration options:
  - "UnknownSopClassAccepted" to disable promiscuous mode (accept unknown SOP class UID)
  - New configuration option: "Dictionary" to declare custom DICOM tags
* Add ".dcm" suffix to files in ZIP archives (cf. URI ".../archive")
* MIME content type can be associated to custom attachments (cf. "UserContentType")

Plugins
-------

* New functions:
  - "OrthancPluginRegisterDecodeImageCallback()" to replace the built-in image decoder
  - "OrthancPluginDicomInstanceToJson()" to convert DICOM to JSON
  - "OrthancPluginDicomBufferToJson()" to convert DICOM to JSON
  - "OrthancPluginRegisterErrorCode()" to declare custom error codes
  - "OrthancPluginRegisterDictionaryTag()" to declare custom DICOM tags
  - "OrthancPluginLookupDictionary()" to get information about some DICOM tag
  - "OrthancPluginRestApiGet2()" to provide HTTP headers when calling Orthanc API
  - "OrthancPluginGetInstanceOrigin()" to know through which mechanism an instance was received
  - "OrthancPluginCreateImage()" and "OrthancPluginCreateImageAccessor()" to create images
  - "OrthancPluginDecodeDicomImage()" to decode DICOM images
  - "OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
* New events in change callbacks:
  - "OrthancStarted"
  - "OrthancStopped"
  - "UpdatedAttachment" 
  - "UpdatedMetadata"
* "/system" URI gives information about the plugins used for storage area and DB back-end
* Plugin callbacks must now return explicit "OrthancPluginErrorCode" (instead of integers)

Lua
---

* Optional argument "keepStrings" in "DumpJson()"

Maintenance
-----------

* Full indexation of the patient/study tags to speed up searches and C-FIND
* Many refactorings, notably of the searching features and of the image decoding
* C-MOVE SCP for studies using AccessionNumber tag
* Fix issue 4 (C-STORE Association not renegotiated on Specific-to-specific transfer syntax change)
* Fix formatting of multipart HTTP answers
* "--logdir" flag creates a single log file instead of 3 separate files for errors/warnings/infos
* "--errors" flag lists the error codes that could be returned by Orthanc
* Under Windows, the exit status of Orthanc corresponds to the encountered error code
* New "AgfaImpax", "EFilm2" and "Vitrea" modality manufacturers
* C-FIND SCP will return tags with sequence value representation
* Upgrade to Boost 1.59.0 for static builds


Version 0.9.4 (2015/09/16)
==========================

* Preview of PDF files encapsulated in DICOM from Orthanc Explorer
* Creation of DICOM files with encapsulated PDF through "/tools/create-dicom"
* "limit" and "since" arguments while retrieving DICOM resources in the REST API
* Support of "deflate" and "gzip" content-types in HTTP requests
* Options to validate peers against CA certificates in HTTPS requests
* New configuration option: "HttpTimeout" to set the default timeout for HTTP requests

Lua
---

* More information about the origin request in the "OnStoredInstance()" and
  "ReceivedInstanceFilter()" callbacks. WARNING: This can result in
  incompatibilities wrt. previous versions of Orthanc.
* New function "GetOrthancConfiguration()" to get the Orthanc configuration

Plugins
-------

* New functions to compress/uncompress images using PNG and JPEG
* New functions to issue HTTP requests from plugins
* New function "OrthancPluginBufferCompression()" to (un)compress memory buffers
* New function "OrthancPluginReadFile()" to read files from the filesystem
* New function "OrthancPluginWriteFile()" to write files to the filesystem
* New function "OrthancPluginGetErrorDescription()" to convert error codes to strings
* New function "OrthancPluginSendHttpStatus()" to send HTTP status with a body
* New function "OrthancPluginRegisterRestCallbackNoLock()" for high-performance plugins
* Plugins have access to explicit error codes 
* Improvements to the sample "ServeFolders" plugin
* Primitives to upgrade the database version in plugins

Maintenance
-----------

* Many code refactorings
* Improved error codes (no more custom descriptions in exceptions)
* If error while calling the REST API, the answer body contains description of the error
  (this feature can be disabled with the "HttpDescribeErrors" option)
* Upgrade to curl 7.44.0 for static and Windows builds
* Upgrade to openssl 1.0.2d for static and Windows builds
* Depends on libjpeg 9a
* Bypass zlib uncompression if "StorageCompression" is enabled and HTTP client supports deflate


Version 0.9.3 (2015/08/07)
==========================

* C-Echo testing can be triggered from Orthanc Explorer (in the query/retrieve page)
* Removal of the dependency upon Google Log, Orthanc now uses its internal logger 
  (use -DENABLE_GOOGLE_LOG=ON to re-enable Google Log)
* Upgrade to JsonCpp 0.10.5 for static and Windows builds


Version 0.9.2 (2015/08/02)
==========================

* Upgrade to Boost 1.58.0 for static and Windows builds
* Source code repository moved from Google Code to BitBucket
* Inject version information into Windows binaries
* Fix access to binary data in HTTP/REST requests by Lua scripts
* Fix potential deadlock in the callbacks of plugins


Version 0.9.1 (2015/07/02)
==========================

General
-------

* The configuration can be splitted into several files stored inside the same folder
* Custom setting of the local AET during C-STORE SCU (both in Lua and in the REST API)
* Many code refactorings

Lua
---

* Access to the REST API of Orthanc (RestApiGet, RestApiPost, RestApiPut, RestApiDelete)
* Functions to convert between Lua values and JSON strings: "ParseJson" and "DumpJson"
* New events: "OnStablePatient", "OnStableStudy", "OnStableSeries", "Initialize", "Finalize"

Plugins
-------

* Plugins can retrieve the configuration file directly as a JSON string
* Plugins can send answers as multipart messages

Fixes
-----

* Fix compatibility issues for C-FIND SCU to Siemens Syngo.Via modalities SCP
* Fix issue 15 (Lua scripts making HTTP requests)
* Fix issue 35 (Characters in PatientID string are not protected for C-FIND)
* Fix issue 37 (Hyphens trigger range query even if datatype does not support ranges)


Version 0.9.0 (2015/06/03)
==========================

Major
-----

* DICOM Query/Retrieve available from Orthanc Explorer
* C-MOVE SCU and C-FIND SCU are accessible through the REST API
* "?expand" flag for URIs "/patients", "/studies" and "/series"
* "/tools/find" URI to search for DICOM resources from REST
* Support of FreeBSD
* The "Orthanc Client" SDK is now a separate project

Minor
-----

* Speed-up in Orthanc Explorer for large amount of images
* Speed-up of the C-FIND SCP server of Orthanc
* Allow replacing PatientID/StudyInstanceUID/SeriesInstanceUID from Lua scripts
* Option "CaseSensitivePN" to enable case-insensitive C-FIND SCP

Fixes
-----

* Prevent freeze on C-FIND if no DICOM tag is to be returned
* Fix slow C-STORE SCP on recent versions of GNU/Linux, if
  USE_SYSTEM_DCMTK is set to OFF (http://forum.dcmtk.org/viewtopic.php?f=1&t=4009)
* Fix issue 30 (QR response missing "Query/Retrieve Level" (008,0052))
* Fix issue 32 (Cyrillic symbols): Introduction of the "Windows1251" encoding
* Plugins now receive duplicated GET arguments in their REST callbacks


Version 0.8.6 (2015/02/12)
==========================

Major
-----

* URIs to get all the parents of a given resource in a single REST call
* Instances without PatientID are now allowed
* Support of HTTP proxy to access Orthanc peers

Minor
-----

* Support of Tudor DICOM in Query/Retrieve
* More flexible "/modify" and "/anonymize" for single instance
* Access to called AET and remote AET from Lua scripts ("OnStoredInstance")
* Option "DicomAssociationCloseDelay" to set delay before closing DICOM association
* ZIP archives now display the accession number of the studies

Plugins
-------

* Introspection of plugins (cf. the "/plugins" URI)
* Plugins can access the command-line arguments used to launch Orthanc
* Plugins can extend Orthanc Explorer with custom JavaScript
* Plugins can get/set global properties to save their configuration
* Plugins can do REST calls to other plugins (cf. "xxxAfterPlugins()")
* Scan of folders for plugins

Fixes
-----

* Code refactorings
* Fix issue 25 (AET with underscore not allowed)
* Fix replacement and insertion of private DICOM tags
* Fix anonymization generating non-portable DICOM files


Version 0.8.5 (2014/11/04)
==========================

General
-------

* Major speed-up thanks to a new database schema
* Plugins can monitor changes through callbacks
* Download ZIP + DICOMDIR from Orthanc Explorer
* Sample plugin framework to serve static resources (./Plugins/Samples/WebSkeleton/)

Fixes
-----

* Fix issue 19 (YBR_FULL are decoded incorrectly)
* Fix issue 21 (Microsoft Visual Studio precompiled headers)
* Fix issue 22 (Error decoding multi-frame instances)
* Fix issue 24 (Build fails on OSX when directory has .DS_Store files)
* Fix crash when bad HTTP credentials are provided


Version 0.8.4 (2014/09/19)
==========================

* "/instances-tags" to get the tags of all the child instances of a
  patient/study/series with a single REST call (bulk tags retrieval)
* Configuration/Lua to select the accepted C-STORE SCP transfer syntaxes
* Fix reporting of errors in Orthanc Explorer when sending images to peers/modalities
* Installation of plugin SDK in CMake


Version 0.8.3 (2014/09/11)
==========================

Major
-----

* Creation of ZIP archives for media storage, with DICOMDIR
* URIs to get all the children of a given resource in a single REST call
* "/tools/lookup" URI to map DICOM UIDs to Orthanc identifiers
* Support of index-only mode (using the "StoreDicom" option)
* Plugins can implement a custom storage area

Minor
-----

* Configuration option to enable HTTP Keep-Alive
* Configuration option to disable the logging of exported resources in "/exports"
* Plugins can retrieve the path to Orthanc and to its configuration file
* "/tools/create-dicom" now accepts the "PatientID" DICOM tag (+ updated sample)
* Possibility to set HTTP headers from plugins
* "LastUpdate" metadata is now always returned for patients, studies and series

Maintenance
-----------

* Refactoring of HttpOutput ("Content-Length" header is now always sent)
* Upgrade to Mongoose 3.8
* Fixes for Visual Studio 2013 and Windows 64bit
* Fix issue 16: Handling of "AT" value representations in JSON
* Fix issue 17


Version 0.8.2 (2014/08/07)
==========================

* Support of the standard text encodings
* Hot restart of Orthanc by posting to "/tools/reset"
* More fault-tolerant commands in Lua scripts
* Parameter to set the default encoding for DICOM files without SpecificCharacterSet
* Fix of issue #14 (support of XCode 5.1)
* Upgrade to Google Test 1.7.0


Version 0.8.1 (2014/07/29)
==========================

General
-------

* Access patient module at the study level to cope with PatientID collisions
* On-the-fly conversion of JSON to XML according to the HTTP Accept header
* C-Echo SCU in the REST API
* DICOM conformance statement available at URI "/tools/dicom-conformance"

Lua scripts
-----------

* Lua scripts can do HTTP requests, and thus can call Web services
* Lua scripts can invoke system commands, with CallSystem()

Plugins
-------

* Lookup for DICOM UIDs in the plugin SDK
* Plugins have access to the HTTP headers and can answer with HTTP status codes
* Callback to react to the incoming of DICOM instances

Fixes
-----

* Fix build of Google Log with Visual Studio >= 11.0
* Fix automated generation of the list of resource children in the REST API


Version 0.8.0 (2014/07/10)
==========================

Major changes
-------------

* Routing images with Lua scripts
* Introduction of the Orthanc Plugin SDK
* Official support of OS X (Darwin) 10.8

Minor changes
-------------

* Extraction of tags for the patient/study/series/instance DICOM modules
* Extraction of the tags shared by all the instances of a patient/study/series
* Options to limit the number of results for an incoming C-FIND query
* Support of kFreeBSD
* Several code refactorings
* Fix OrthancCppClient::GetVoxelSizeZ()


Version 0.7.6 (2014/06/11)
==========================

* Support of JPEG and JPEG-LS decompression
* Download DICOM images as Matlab/Octave arrays
* Precompiled headers for Microsoft Visual Studio


Version 0.7.5 (2014/05/08)
==========================

* Dynamic negotiation of SOP classes for C-STORE SCU
* Creation of DICOM instances using the REST API
* Embedding of images within DICOM instances
* Adding/removal/modification of remote modalities/peers through REST
* Reuse of the previous SCU connection to avoid unnecessary handshakes
* Fix problems with anonymization and modification
* Fix missing licensing terms about reuse of some code from DCMTK
* Various code refactorings


Version 0.7.4 (2014/04/16)
==========================

* Switch to openssl-1.0.1g in static builds (cf. Heartbleed exploit)
* Switch to boost 1.55.0 in static builds (to solve compiling errors)
* Better logging about nonexistent tags
* Dcm4Chee manufacturer
* Automatic discovering of the path to the DICOM dictionaries
* In the "DicomModalities" config, the port number can be a string


Version 0.7.3 (2014/02/14)
==========================

Major changes
-------------

* Fixes in the implementation of the C-FIND handler for Query/Retrieve
* Custom attachment of files to patients, studies, series or instances
* Access to lowlevel info about the attached files through the REST API
* Recover pixel data for more transfer syntaxes (notably JPEG)

Minor changes
-------------

* AET comparison is now case-insensitive by default
* Possibility to disable the HTTP server or the DICOM server
* Automatic computation of MD5 hashes for the stored DICOM files
* Maintenance tool to recover DICOM files compressed by Orthanc
* The newline characters in the configuration file are fixed for GNU/Linux
* Capture of the SIGTERM signal in GNU/Linux


Version 0.7.2 (2013/11/08)
==========================

* Support of Query/Retrieve from medInria
* Accept more transfer syntaxes for C-STORE SCP and SCU (notably JPEG)
* Create the meta-header when receiving files through C-STORE SCP
* Fixes and improvements thanks to the static analyzer cppcheck


Version 0.7.1 (2013/10/30)
==========================

* Use ZIP64 only when required to improve compatibility (cf. issue #7)
* Refactoring of the CMake options
* Fix for big-endian architectures (RedHat bug #985748)
* Use filenames with 8 characters in ZIP files for maximum compatibility
* Possibility to build Orthanc inplace (in the source directory)


Version 0.7.0 (2013/10/25)
==========================

Major changes
-------------

* DICOM Query/Retrieve is supported

Minor changes
-------------

* Possibility to keep the PatientID during an anonymization
* Check whether "unzip", "tar" and/or "7-zip" are installed from CMake


Version 0.6.2 (2013/10/04)
==========================

* Build of the C++ client as a shared library
* Improvements and documentation of the C++ client API
* Fix of Debian bug #724947 (licensing issue with the SHA-1 library)
* Switch to Boost 1.54.0 (cf. issue #9)
* "make uninstall" is now possible


Version 0.6.1 (2013/09/16)
==========================

* Detection of stable patients/studies/series
* C-FIND SCU at the instance level
* Link from modified to original resource in Orthanc Explorer
* Fix of issue #8
* Anonymization of the medical alerts tag (0010,2000)


Version 0.6.0 (2013/07/16)
==========================

Major changes
-------------

* Introduction of the C++ client
* Send DICOM resources to other Orthanc instances through HTTP
* Access to signed images (instances/.../image-int16)
  (Closes: Debian #716958)

Minor changes
-------------

* Export of DICOM files to the host filesystem (instances/.../export)
* Statistics about patients, studies, series and instances
* Link from anonymized to original resource in Orthanc Explorer
* Fixes for Red Hat and Debian packaging
* Fixes for history in Orthanc Explorer
* Fixes for boost::thread, as reported by Cyril Paulus
* Fix licensing (Closes: Debian #712038)

Metadata
--------

* Access to the metadata through the REST API (.../metadata)
* Support of user-defined metadata
* "LastUpdate" metadata for patients, studies and series
* "/tools/now" to be used in combination with "LastUpdate"
* Improved support of series with temporal positions


Version 0.5.2 (2013/05/07)
==========================

* "Bulk" Store-SCU (send several DICOM instances with the same
  DICOM connection)
* Store-SCU for patients and studies in Orthanc Explorer
* Filtering of incoming DICOM instances (through Lua scripting)
* Filtering of incoming HTTP requests (through Lua scripting)
* Clearing of "/exports" and "/changes"
* Check MD5 of third party downloads
* Faking of the HTTP methods PUT and DELETE


Version 0.5.1 (2013/04/17)
==========================

* Support of RGB images
* Fix of store SCU in release builds
* Possibility to store the SQLite index at another place than the
  DICOM instances (for performance)


Version 0.5.0 (2013/01/31)
==========================

Major changes
-------------

* Download of modified or anonymized DICOM instances
* Inplace modification and anonymization of DICOM series, studies and patients

Minor changes
-------------

* Support of private tags
* Implementation of the PMSCT_RLE1 image decoding for Philips modalities
* Generation of random DICOM UID through the REST API (/tools/generate-uid)


Version 0.4.0 (2012/12/14)
==========================

Major changes
-------------

* Recycling of disk space
* Raw access to the value of the DICOM tags in the REST API

Minor changes
-------------

* Protection of patients against recycling (also in Orthanc Explorer)
* The DICOM dictionaries are embedded in Windows builds


Version 0.3.1 (2012/12/05)
==========================

* Download archives of patients, studies and series as ZIP files
* Orthanc now checks the version of its database schema before starting


Version 0.3.0 (2012/11/30)
==========================

Major changes
-------------

* Transparent compression of the DICOM instances on the disk
* The patient/study/series/instances are now indexed by SHA-1 digests
  of their DICOM Instance IDs (and not by UUIDs anymore): The same
  DICOM objects are thus always identified by the same Orthanc IDs
* Log of exported instances through DICOM C-STORE SCU ("/exported" URI)
* Full refactoring of the DB schema and of the REST API
* Introduction of generic classes for REST APIs (in Core/RestApi)

Minor changes
-------------

* "/statistics" URI
* "last" flag to retrieve the last change from the "/changes" URI
* Generate a sample configuration file from command line
* "CompletedSeries" event in the changes API
* Thread to continuously flush DB to disk (SQLite checkpoints for
  improved robustness)


Version 0.2.3 (2012/10/26)
==========================

* Use HTTP Content-Disposition to set a filename when downloading JSON/DCM
* URI "/system" for general information about Orthanc
* Versioning info and help on the command line
* Improved logging
* Possibility of dynamic linking against jsoncpp, sqlite, boost and dmctk
  for Debian packaging
* Fix some bugs
* Switch to default 8042 port for HTTP


Version 0.2.2 (2012/10/04)
==========================

* Switch to Google Log
* Fixes to Debian packaging


Version 0.2.1 (2012/09/28)
==========================

* Status of series
* Continuous Integration Server is up and running
* Ready for Debian packaging


Version 0.2.0 (2012/09/16)
==========================

Major changes
-------------

* Renaming to "Orthanc"
* Focus on security: Support of SSL, HTTP Basic Authentication and
  interdiction of remote access
* Access to multi-frame images (for nuclear medicine)
* Access to the raw PNG images (in 8bpp and 16bpp)

Minor changes
-------------

* Change of the licensing of the "Core/SQLite" folder to BSD (to
  reflect the original licensing terms of Chromium, from which the
  code derives)
* Standalone build for cross-compilation


Version 0.1.1 (2012/07/20)
==========================

* Fix Windows version
* Native Windows build with Microsoft Visual Studio 2005
* Add path to storage in Configuration.json


Version 0.1.0 (2012/07/19)
==========================

* Initial release