From 428762710d0b4ba32a38295ec59f4e227c080885f9bf8bb918e50f4c26404569 Mon Sep 17 00:00:00 2001 From: Axel Braun Date: Mon, 9 Feb 2026 17:51:51 +0100 Subject: [PATCH] update --- OrthancWSI-3.2.tar.gz | 3 - OrthancWSI-3.3.tar.gz | 3 + bootstrap-5.3.3.zip | 3 + framework.patch | 367 +++++++++++++++++++++++++++++++ openlayers-10.4.0-package.tar.gz | 3 - openlayers-10.6.1-package.tar.gz | 3 + orthanc-wsi.changes | 26 +++ orthanc-wsi.spec | 15 +- popper-2.11.8.min.js.gz | 3 + 9 files changed, 416 insertions(+), 10 deletions(-) delete mode 100644 OrthancWSI-3.2.tar.gz create mode 100644 OrthancWSI-3.3.tar.gz create mode 100644 bootstrap-5.3.3.zip create mode 100644 framework.patch delete mode 100644 openlayers-10.4.0-package.tar.gz create mode 100644 openlayers-10.6.1-package.tar.gz create mode 100644 popper-2.11.8.min.js.gz diff --git a/OrthancWSI-3.2.tar.gz b/OrthancWSI-3.2.tar.gz deleted file mode 100644 index 51db2ad..0000000 --- a/OrthancWSI-3.2.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1b1440d6bce376a801af5a436aca71f8d5361ce952a862c187da83e81405218 -size 245814 diff --git a/OrthancWSI-3.3.tar.gz b/OrthancWSI-3.3.tar.gz new file mode 100644 index 0000000..6fe8f59 --- /dev/null +++ b/OrthancWSI-3.3.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdbb5958ffd5efcd9daa5e222b2b7ebdc72b41d2bd5307fe0c1a985951c847ce +size 250342 diff --git a/bootstrap-5.3.3.zip b/bootstrap-5.3.3.zip new file mode 100644 index 0000000..5162f81 --- /dev/null +++ b/bootstrap-5.3.3.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55d7f1ce795040afb8311df09d29d0d34648400c1eaabb2d0a2ed2216b3db05d +size 8594807 diff --git a/framework.patch b/framework.patch new file mode 100644 index 0000000..5d70abf --- /dev/null +++ b/framework.patch @@ -0,0 +1,367 @@ + +# HG changeset patch +# User Sebastien Jodogne +# Date 1764142996 -3600 +# Node ID 4fa295cdb6d8cf2a56cd669f05fb7a2883a96d98 +# Parent 21570147471a8939aca3024502bc8c76ffbc8b44 +fix build with Orthanc framework 1.12.10 + +diff -r 21570147471a -r 4fa295cdb6d8 Framework/Outputs/MultiframeDicomWriter.cpp +--- a/Framework/Outputs/MultiframeDicomWriter.cpp Fri Nov 07 14:28:02 2025 +0100 ++++ b/Framework/Outputs/MultiframeDicomWriter.cpp Wed Nov 26 08:43:16 2025 +0100 +@@ -337,8 +337,14 @@ + + Orthanc::IDicomTranscoder::DicomImage transcoded; + ++#if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 12, 10) ++ const Orthanc::TranscodingSopInstanceUidMode allowNewSopInstanceUid = Orthanc::TranscodingSopInstanceUidMode_AllowNew; ++#else ++ const bool allowNewSopInstanceUid = true; ++#endif ++ + Orthanc::DcmtkTranscoder transcoder(1); +- if (transcoder.Transcode(transcoded, source, s, true)) ++ if (transcoder.Transcode(transcoded, source, s, allowNewSopInstanceUid)) + { + ResetImage(); + SaveDicomToMemory(target, transcoded.GetParsed(), transferSyntax_); +diff -r 21570147471a -r 4fa295cdb6d8 Resources/Orthanc/CMake/Compiler.cmake +--- a/Resources/Orthanc/CMake/Compiler.cmake Fri Nov 07 14:28:02 2025 +0100 ++++ b/Resources/Orthanc/CMake/Compiler.cmake Wed Nov 26 08:43:16 2025 +0100 +@@ -246,6 +246,9 @@ + # fix this error that appears with recent compilers on MacOS: boost/mpl/aux_/integral_wrapper.hpp:73:31: error: integer value -1 is outside the valid range of values [0, 3] for this enumeration type [-Wenum-constexpr-conversion] + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-enum-constexpr-conversion") + ++ # it seems that some recent MacOS compilers don't set these flags correctly which prevents zlib from building correctly ++ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE64_SOURCE=1 -D_FILE_OFFSET_BITS=64") ++ + add_definitions( + -D_XOPEN_SOURCE=1 + ) +diff -r 21570147471a -r 4fa295cdb6d8 Resources/Orthanc/CMake/DownloadOrthancFramework.cmake +--- a/Resources/Orthanc/CMake/DownloadOrthancFramework.cmake Fri Nov 07 14:28:02 2025 +0100 ++++ b/Resources/Orthanc/CMake/DownloadOrthancFramework.cmake Wed Nov 26 08:43:16 2025 +0100 +@@ -215,6 +215,10 @@ + # Advanced storage 0.2.2 (framework pre-1.12.10) + set(ORTHANC_FRAMEWORK_PRE_RELEASE ON) + set(ORTHANC_FRAMEWORK_MD5 "bd5ba2cec329010b912209345acbdeaf") ++ elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "0ebe8cfd9bf7") ++ # Worklists plugin 0.9.0 (framework pre-1.12.10) ++ set(ORTHANC_FRAMEWORK_PRE_RELEASE ON) ++ set(ORTHANC_FRAMEWORK_MD5 "17a5ca9254e881ab89c93d052d4655cb") + endif() + endif() + endif() +diff -r 21570147471a -r 4fa295cdb6d8 Resources/Orthanc/Plugins/OrthancPluginCppWrapper.cpp +--- a/Resources/Orthanc/Plugins/OrthancPluginCppWrapper.cpp Fri Nov 07 14:28:02 2025 +0100 ++++ b/Resources/Orthanc/Plugins/OrthancPluginCppWrapper.cpp Wed Nov 26 08:43:16 2025 +0100 +@@ -221,6 +221,19 @@ + } + + ++ MemoryBuffer::~MemoryBuffer() ++ { ++ try ++ { ++ Clear(); ++ } ++ catch (ORTHANC_PLUGINS_EXCEPTION_CLASS&) ++ { ++ // Don't throw exceptions in destructors ++ } ++ } ++ ++ + void MemoryBuffer::Clear() + { + if (buffer_.data != NULL) +@@ -351,6 +364,8 @@ + } + } + ++ ++#if (HAS_ORTHANC_PLUGIN_PEERS == 1) || (HAS_ORTHANC_PLUGIN_HTTP_CLIENT == 1) || (HAS_ORTHANC_PLUGIN_GENERIC_CALL_REST_API == 1) + static void DecodeHttpHeaders(HttpHeaders& target, + const MemoryBuffer& source) + { +@@ -378,6 +393,8 @@ + } + } + } ++#endif ++ + + // helper class to convert std::map of headers to the plugin SDK C structure + class PluginHttpHeaders +@@ -652,6 +669,19 @@ + } + + ++ OrthancString::~OrthancString() ++ { ++ try ++ { ++ Clear(); ++ } ++ catch (ORTHANC_PLUGINS_EXCEPTION_CLASS&) ++ { ++ // Don't throw exceptions in destructors ++ } ++ } ++ ++ + void OrthancString::Assign(char* str) + { + Clear(); +@@ -1301,6 +1331,20 @@ + } + } + ++ ++ OrthancImage::~OrthancImage() ++ { ++ try ++ { ++ Clear(); ++ } ++ catch (ORTHANC_PLUGINS_EXCEPTION_CLASS&) ++ { ++ // Don't throw exceptions in destructors ++ } ++ } ++ ++ + void OrthancImage::UncompressPngImage(const void* data, + size_t size) + { +@@ -2676,32 +2720,42 @@ + + return; + } +- else if (state == "Running") ++ else if (state == "Running" || ++ state == "Pending" || ++ state == "Paused" || ++ state == "Retry") + { + continue; + } +- else if (!status.isMember("ErrorCode") || +- status["ErrorCode"].type() != Json::intValue) ++ else if (state == "Failure") + { +- ORTHANC_PLUGINS_THROW_PLUGIN_ERROR_CODE(OrthancPluginErrorCode_InternalError); ++ if (!status.isMember("ErrorCode") || ++ status["ErrorCode"].type() != Json::intValue) ++ { ++ ORTHANC_PLUGINS_THROW_PLUGIN_ERROR_CODE(OrthancPluginErrorCode_InternalError); ++ } ++ else ++ { ++ if (!status.isMember("ErrorDescription") || ++ status["ErrorDescription"].type() != Json::stringValue) ++ { ++ ORTHANC_PLUGINS_THROW_PLUGIN_ERROR_CODE(status["ErrorCode"].asInt()); ++ } ++ else ++ { ++ #if HAS_ORTHANC_EXCEPTION == 1 ++ throw Orthanc::OrthancException(static_cast(status["ErrorCode"].asInt()), ++ status["ErrorDescription"].asString()); ++ #else ++ ORTHANC_PLUGINS_LOG_ERROR("Exception while executing the job: " + status["ErrorDescription"].asString()); ++ ORTHANC_PLUGINS_THROW_PLUGIN_ERROR_CODE(status["ErrorCode"].asInt()); ++ #endif ++ } ++ } + } + else + { +- if (!status.isMember("ErrorDescription") || +- status["ErrorDescription"].type() != Json::stringValue) +- { +- ORTHANC_PLUGINS_THROW_PLUGIN_ERROR_CODE(status["ErrorCode"].asInt()); +- } +- else +- { +-#if HAS_ORTHANC_EXCEPTION == 1 +- throw Orthanc::OrthancException(static_cast(status["ErrorCode"].asInt()), +- status["ErrorDescription"].asString()); +-#else +- ORTHANC_PLUGINS_LOG_ERROR("Exception while executing the job: " + status["ErrorDescription"].asString()); +- ORTHANC_PLUGINS_THROW_PLUGIN_ERROR_CODE(status["ErrorCode"].asInt()); +-#endif +- } ++ ORTHANC_PLUGINS_THROW_PLUGIN_ERROR_CODE(OrthancPluginErrorCode_InternalError); + } + } + } +@@ -4607,8 +4661,11 @@ + uint8_t found = false; + OrthancPlugins::MemoryBuffer valueBuffer; + ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + OrthancPluginErrorCode code = OrthancPluginDequeueValue(OrthancPlugins::GetGlobalContext(), &found, + *valueBuffer, queueId_.c_str(), origin); ++#pragma GCC diagnostic pop + + if (code != OrthancPluginErrorCode_Success) + { +@@ -4643,4 +4700,54 @@ + } + } + #endif ++ ++ ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ bool Queue::ReserveInternal(std::string& value, uint64_t& valueId, OrthancPluginQueueOrigin origin, uint32_t releaseTimeout) ++ { ++ uint8_t found = false; ++ OrthancPlugins::MemoryBuffer valueBuffer; ++ ++ OrthancPluginErrorCode code = OrthancPluginReserveQueueValue(OrthancPlugins::GetGlobalContext(), &found, ++ *valueBuffer, &valueId, queueId_.c_str(), origin, releaseTimeout); ++ ++ if (code != OrthancPluginErrorCode_Success) ++ { ++ ORTHANC_PLUGINS_THROW_PLUGIN_ERROR_CODE(code); ++ } ++ else if (found) ++ { ++ valueBuffer.ToString(value); ++ return true; ++ } ++ else ++ { ++ return false; ++ } ++ } ++#endif ++ ++ ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ bool Queue::ReserveBack(std::string& value, uint64_t& valueId, uint32_t releaseTimeout) ++ { ++ return ReserveInternal(value, valueId, OrthancPluginQueueOrigin_Back, releaseTimeout); ++ } ++#endif ++ ++ ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ bool Queue::ReserveFront(std::string& value, uint64_t& valueId, uint32_t releaseTimeout) ++ { ++ return ReserveInternal(value, valueId, OrthancPluginQueueOrigin_Front, releaseTimeout); ++ } ++#endif ++ ++ ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ void Queue::Acknowledge(uint64_t valueId) ++ { ++ OrthancPluginAcknowledgeQueueValue(OrthancPlugins::GetGlobalContext(), queueId_.c_str(), valueId); ++ } ++#endif + } +diff -r 21570147471a -r 4fa295cdb6d8 Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h +--- a/Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h Fri Nov 07 14:28:02 2025 +0100 ++++ b/Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h Wed Nov 26 08:43:16 2025 +0100 +@@ -142,6 +142,12 @@ + # define HAS_ORTHANC_PLUGIN_QUEUES 0 + #endif + ++#if ORTHANC_PLUGINS_VERSION_IS_ABOVE(1, 12, 10) ++# define HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE 1 ++#else ++# define HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE 0 ++#endif ++ + + // Macro to tag a function as having been deprecated + #if (__cplusplus >= 201402L) // C++14 +@@ -213,10 +219,7 @@ + public: + MemoryBuffer(); + +- ~MemoryBuffer() +- { +- Clear(); +- } ++ ~MemoryBuffer(); + + OrthancPluginMemoryBuffer* operator*() + { +@@ -371,10 +374,7 @@ + { + } + +- ~OrthancString() +- { +- Clear(); +- } ++ ~OrthancString(); + + // This transfers ownership, warning: The string must have been + // allocated by the Orthanc core +@@ -491,10 +491,7 @@ + uint32_t pitch, + void* buffer); + +- ~OrthancImage() +- { +- Clear(); +- } ++ ~OrthancImage(); + + void UncompressPngImage(const void* data, + size_t size); +@@ -1726,6 +1723,10 @@ + + bool DequeueInternal(std::string& value, OrthancPluginQueueOrigin origin); + ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ bool ReserveInternal(std::string& value, uint64_t& valueId, OrthancPluginQueueOrigin origin, uint32_t releaseTimeout); ++#endif ++ + public: + explicit Queue(const std::string& queueId) : + queueId_(queueId) +@@ -1745,17 +1746,37 @@ + Enqueue(value.empty() ? NULL : value.c_str(), value.size()); + } + ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ // Use ReserveBack() instead ++ ORTHANC_PLUGIN_DEPRECATED ++#endif + bool DequeueBack(std::string& value) + { + return DequeueInternal(value, OrthancPluginQueueOrigin_Back); + } + ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ // Use ReserveFront() instead ++ ORTHANC_PLUGIN_DEPRECATED ++#endif + bool DequeueFront(std::string& value) + { + return DequeueInternal(value, OrthancPluginQueueOrigin_Front); + } + + uint64_t GetSize(); ++ ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ bool ReserveBack(std::string& value, uint64_t& valueId, uint32_t releaseTimeout); ++#endif ++ ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ bool ReserveFront(std::string& value, uint64_t& valueId, uint32_t releaseTimeout); ++#endif ++ ++#if HAS_ORTHANC_PLUGIN_RESERVE_QUEUE_VALUE == 1 ++ void Acknowledge(uint64_t valueId); ++#endif + }; + #endif + } + diff --git a/openlayers-10.4.0-package.tar.gz b/openlayers-10.4.0-package.tar.gz deleted file mode 100644 index 7a00682..0000000 --- a/openlayers-10.4.0-package.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1e69a0190b760baca77f4a1f2d70b646a1a5f8cc91d0a2e0b4e1375b57f0851 -size 2404990 diff --git a/openlayers-10.6.1-package.tar.gz b/openlayers-10.6.1-package.tar.gz new file mode 100644 index 0000000..a6f6d51 --- /dev/null +++ b/openlayers-10.6.1-package.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04503eadea55cc739011327ece9822624628738100a9c17c00467a611c2dcf7f +size 2412941 diff --git a/orthanc-wsi.changes b/orthanc-wsi.changes index da0b9aa..c07d4a6 100644 --- a/orthanc-wsi.changes +++ b/orthanc-wsi.changes @@ -1,3 +1,29 @@ +------------------------------------------------------------------- +Wed Dec 10 10:40:23 UTC 2025 - Axel Braun + +- framework.patch added to fix build error w framework 1.12.10 + +------------------------------------------------------------------- +Sun Nov 9 09:12:40 UTC 2025 - Axel Braun + +- version 3.3 + * OrthancWSIDicomizer: + - New option "--encoding" to specify the specific character set of DICOM instances + - Placeholder tags are now automatically inserted when the "--dataset" option + provides incomplete data, ensuring the generated DICOM instances remain valid + - The version of the DICOM-izer is available in DICOM tag "SoftwareVersions" + - ImagedVolumeWidth and ImagedVolumeHeight are swapped with respect to releases <= 3.2: + https://discourse.orthanc-server.org/t/5912 + * Viewer plugin: + - Added rotation button in the viewer + - The viewer displays a label if the "description" GET parameter is provided + - Upgraded to OpenLayers 10.6.1 + +------------------------------------------------------------------- +Wed Sep 10 09:37:16 UTC 2025 - Axel Braun + +- remove libboost_system-devel for TW (removed in boost 1.89) + ------------------------------------------------------------------- Tue Apr 8 18:10:22 UTC 2025 - Axel Braun diff --git a/orthanc-wsi.spec b/orthanc-wsi.spec index a3dedaa..06c427f 100644 --- a/orthanc-wsi.spec +++ b/orthanc-wsi.spec @@ -1,7 +1,7 @@ # # spec file for package orthanc-wsi # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # Copyright (c) 2019-2025 Dr. Axel Braun # # All modifications and additions to the file contributed by third parties @@ -21,13 +21,16 @@ Name: orthanc-wsi Summary: Whole Slide Imaging for Orthanc License: AGPL-3.0-or-later Group: Productivity/Graphics/Viewers -Version: 3.2 +Version: 3.3 Release: 0 URL: https://orthanc-server.com Source0: https://orthanc.uclouvain.be/downloads/sources/%{name}/OrthancWSI-%{version}.tar.gz #%%Source1: openlayers-3.19.0-dist.zip -Source1: https://orthanc.uclouvain.be/downloads/third-party-downloads/WSI/openlayers-10.4.0-package.tar.gz +Source1: https://orthanc.uclouvain.be/downloads/third-party-downloads/WSI/openlayers-10.6.1-package.tar.gz +Source2: https://orthanc.uclouvain.be/downloads/third-party-downloads/bootstrap-5.3.3.zip +Source3: https://orthanc.uclouvain.be/downloads/third-party-downloads/WSI/popper-2.11.8.min.js.gz Source11: orthanc-wsi-readme.SUSE +Patch0: framework.patch BuildRequires: boost-devel BuildRequires: cmake @@ -48,7 +51,9 @@ BuildRequires: libboost_iostreams-devel >= 1.66 BuildRequires: libboost_locale-devel >= 1.66 BuildRequires: libboost_program_options-devel >= 1.66 BuildRequires: libboost_regex-devel >= 1.66 +%if 0%{?suse_version} <= 1600 BuildRequires: libboost_system-devel >= 1.66 +%endif BuildRequires: libboost_thread-devel >= 1.66 BuildRequires: libicu-devel BuildRequires: libjpeg-devel @@ -76,13 +81,15 @@ The Orthanc project provides three official tools to support DICOM for whole-sli - Another command-line tool that converts a DICOM series stored inside Orthanc, to a standard hierarchical TIFF image. %prep -%autosetup -n OrthancWSI-%{version} +%autosetup -p1 -n OrthancWSI-%{version} #OrthanPlugin may ask for additional files to be loaded #Putting them into this folder prevents download of sources from the web mkdir ViewerPlugin/ThirdPartyDownloads cp %{S:1} ViewerPlugin/ThirdPartyDownloads/. +cp %{S:2} ViewerPlugin/ThirdPartyDownloads/. +cp %{S:3} ViewerPlugin/ThirdPartyDownloads/. %build %if 0%{?suse_version} == 1500 && 0%{?sle_version} > 150200 diff --git a/popper-2.11.8.min.js.gz b/popper-2.11.8.min.js.gz new file mode 100644 index 0000000..aa48f5b --- /dev/null +++ b/popper-2.11.8.min.js.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56f7fcf3fdd215111f7c11e6c26c4239c2cd85bdf882a2fc1364886fd753dd6d +size 7384 -- 2.51.1