Mercurial > hg > orthanc
view NEWS @ 5857:39996519afce find-refactoring
fix limit/since restrictions
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Mon, 04 Nov 2024 22:06:45 +0100 |
parents | d1dea8ad74a6 |
children |
line wrap: on
line source
Pending changes in the mainline =============================== * TODO-FIND: complete the list of updated routes: - /studies?expand and sibbling routes now also return "Metadata" (if the DB implements 'extended-api-v1') - /studies?since=x&limit=0 and sibbling routes: limit=0 now means "no limit" instead of "no results" General ------- * Database: - Introduced database optimizations "ExtendedFind" to replace many small SQL queries by a small number of large SQL queries to greatly reduce the cost of DB latency. Furthermore, this "ExtendedFind" brings new sorting and filtering features to the Rest API (TODO). - Introduced database optimizations "ExtendedChanges" to allow filtering of /changes. - Reduced the number of SQL queries when ingesting DICOM files. * Introduced a new configuration "ReadOnly" to forbid an Orthanc instance to perform any modifications in the Index DB or in the storage. REST API -------- * API version upgraded to 25 * Improved parsing of multiple numerical values in DICOM tags. https://discourse.orthanc-server.org/t/qido-includefield-with-sequences/4746/6 * in /system, added a new field "Capabilities" with new values: - "HasExtendedChanges" for DB backend that provides this feature (the default SQLite DB or PostgreSQL vX.X, MySQL vX.X, ODBC vX.X). - "HasExtendedFind" for DB backend that provides this feature (the default SQLite DB or PostgreSQL vX.X, MySQL vX.X, ODBC vX.X). * With DB backend with "HasExtendedChanges" support, /changes now supports 2 more options: - 'type' to filter the changes returned by the query - 'to' to potentially cycle through changes in reverse order. example: /changes?type=StableStudy&to=7584&limit=100 * With DB backend with "HasExtendedFind" support, /tools/find now supports new options: - 'OrderBy' to order by DICOM Tag or metadata value - 'ParentPatient', 'ParentStudy', 'ParentSeries' to retrieve only descendants of an Orthanc resource. - 'MetadataQuery' to filter results based on metadata values. - 'ResponseContent' to define what shall be included in the response for each returned resource (e.g: Metadata, Children, ...) * With DB backend with "HasExtendedFind" support, a new /tools/count-resources API route is similar to tools/find but only returns the number of resources matching the criteria. * With DB backend with "HasExtendedFind" support, usage of 'Limit' and 'Since in /tools/find is not allowed if your query includes filtering on DICOM tags that are not stored in DB. Maintenance ----------- * DICOM TLS: "DicomTlsTrustedCertificates" is not required anymore when issuing an outgoing SCU connexion when "DicomTlsRemoteCertificateRequired" is set to false. * Introduced a new thread to update the statistics at regular interval for the DB plugins that are implementing the UpdateAndGetStatistics function (currently only PostgreSQL). This avoids very long update times in case you don't call /statistics for a long period. * Fix C-Find queries not returning computed tags like ModalitiesInStudy, NumberOfStudyRelatedSeries, ... in very specific use-cases. * Fix extremely rare error when 2 threads are trying to create the same folder in the File Storage at the same time. * Metrics: - fix a few metrics that were not published - added 2 metrics: orthanc_storage_cache_miss_count & orthanc_storage_cache_hit_count * Upgraded dependencies for static builds: - curl 8.9.0 - SQLite 3.46 * Added a new fallback when trying to decode a frame: transcode the file using the plugin before decoding the frame. This solves some issues with JP2K Lossy compression: https://discourse.orthanc-server.org/t/decoding-displaying-jpeg2000-lossy-images/5117 * Added new warnings that can be disabled in the configuration: - W003_DecoderFailure - W004_NoMainDicomTagsSignature - W005_RequestingTagFromLowerResourceLevel - W006_RequestingTagFromMetaHeader - W007_MissingRequestedTagsNotReadFromDisk * New default MainDicomTags are now stored in DB. Note that, in order to store these values for resources that were ingested in Orthanc before this release, you would have to run the Housekeeper plugin or call /reconstruct on every resources - At Study Level: - TimezoneOffsetFromUTC (used in QIDO-RS default queries) - At Series Level: - TimezoneOffsetFromUTC (used in QIDO-RS default queries) - PerformedProcedureStepStartDate (used in QIDO-RS default queries) - PerformedProcedureStepStartTime (used in QIDO-RS default queries) - RequestAttributesSequence (used in QIDO-RS default queries) Version 1.12.4 (2024-06-05) =========================== 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 is deprecated in favor of "requested-tags" * Added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data 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. - Fixed broken /instances/../tags route after running the Housekeeper after having changed the "IngestTranscoding". * SDK: added OrthancPluginLogMessage() as 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 ----------- * C-Find queries: - 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). - "TimezoneOffsetFromUTC" is now ignored for matching. * 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 archive. * Monitoring of stable resources now also takes into consideration the resource type, not only the resource identifier identifier. * DICOM TLS: - In prior versions, when "DicomTlsRemoteCertificateRequired" was set to false, Orthanc was still sending a client certificate request during the TLS handshake but was not triggering and error if the client certificate was not trusted (equivalent to the "--verify-peer-cert" DCMTK option). Starting with Orthanc 1.12.4, if this option is set to "false", Orthanc will not send a client certificate request during the TLS handshake anymore (equivalent to the "--ignore-peer-cert" DCMTK option). - When working with "DicomTlsEnabled": true and "DicomTlsRemoteCertificateRequired": false, Orthanc was refusing to start if no "DicomTlsTrustedCertificates" was provided. - New configuration options: - "DicomTlsMinimumProtocolVersion" to select the minimum TLS protocol version - "DicomTlsCiphersAccepted" to fine tune the list of accepted ciphers * Fixed broken /instances/../tags route after calling of /studies/../reconstruct after having changed the "IngestTranscoding". * Upgraded dependencies for static builds: - boost 1.85.0 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