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


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 1.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
