# HG changeset patch # User Sebastien Jodogne # Date 1786531434 -7200 # Node ID a4a2eaf3401c6b577ea6203225f7ff460bcee357 # Parent c762f878e1f7cf2f06b4925b2cc03bde8859461c# Parent 66f7a5185a4c59e88c6963a464021957e36b202d integration mainline->streaming diff -r c762f878e1f7 -r a4a2eaf3401c NEWS --- a/NEWS Wed Aug 12 12:36:31 2026 +0200 +++ b/NEWS Wed Aug 12 12:43:54 2026 +0200 @@ -57,7 +57,8 @@ - "Name" was documented as "MyOrthanc" while its default value is "ORTHANC". * Orthanc no longer accepts DICOM association from modalities whose AET contains invalid characters. * Orthanc now ignores leading/trailing spaces in AET. - +* Experimental: New "Manufacturer" "SiemensSyngoCT" to propose both the SCU and SCP C-Store roles when + performing a C-Get SCU. REST API -------- diff -r c762f878e1f7 -r a4a2eaf3401c OrthancFramework/Sources/DataSource/DataSourceAnswer.cpp --- a/OrthancFramework/Sources/DataSource/DataSourceAnswer.cpp Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancFramework/Sources/DataSource/DataSourceAnswer.cpp Wed Aug 12 12:43:54 2026 +0200 @@ -54,7 +54,7 @@ DataSourceAnswer::Item::Item(IDataIdentifier* id /* takes ownership */, const OrthancException& error) : id_(id), - error_(new OrthancException(error)), + error_(new OrthancException(error)), // NOLINT(bugprone-throw-keyword-missing) memorySize_(0) { if (id == NULL) diff -r c762f878e1f7 -r a4a2eaf3401c OrthancFramework/Sources/DicomNetworking/DicomControlUserConnection.cpp --- a/OrthancFramework/Sources/DicomNetworking/DicomControlUserConnection.cpp Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancFramework/Sources/DicomNetworking/DicomControlUserConnection.cpp Wed Aug 12 12:43:54 2026 +0200 @@ -296,9 +296,16 @@ throw OrthancException(ErrorCode_BadSequenceOfCalls); // the acceptedStorageSopClassUids should always be defined for a C-Get } + DicomAssociationRole proposedStoreRole = DicomAssociationRole_Scp; + + if (parameters_.GetRemoteModality().GetManufacturer() == ModalityManufacturer_SiemensSyngoCT) + { + proposedStoreRole = DicomAssociationRole_Default; // it seems SyngoCT won't accept a C-Store/SCP only and requires both SCU and SCP roles to be proposed + } + for (std::set::const_iterator it = acceptedStorageSopClasses.begin(); it != acceptedStorageSopClasses.end(); ++it) { - association_->ProposePresentationContext(*it, proposedStorageTransferSyntaxes, DicomAssociationRole_Scp); + association_->ProposePresentationContext(*it, proposedStorageTransferSyntaxes, proposedStoreRole); } } } diff -r c762f878e1f7 -r a4a2eaf3401c OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp --- a/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp Wed Aug 12 12:43:54 2026 +0200 @@ -729,7 +729,7 @@ Uint16* content_; public: - ValueRepresentationReader_AT(DcmElement& element) : + explicit ValueRepresentationReader_AT(DcmElement& element) : valid_(false) { DcmAttributeTag& e = dynamic_cast(element); @@ -813,7 +813,7 @@ Float32* content_; public: - ValueRepresentationReader_OF(DcmElement& element) : + explicit ValueRepresentationReader_OF(DcmElement& element) : valid_(false) { /** @@ -889,7 +889,7 @@ Float64* content_; public: - ValueRepresentationReader_OD(DcmElement& element) : + explicit ValueRepresentationReader_OD(DcmElement& element) : valid_(false) { /** @@ -967,7 +967,7 @@ Uint16* content_; public: - ValueRepresentationReader_OW(DcmElement& element) : + explicit ValueRepresentationReader_OW(DcmElement& element) : valid_(false) { DcmOtherByteOtherWord& e = dynamic_cast(element); @@ -1036,7 +1036,7 @@ Uint32* content_; public: - ValueRepresentationReader_OL(DcmElement& element) : + explicit ValueRepresentationReader_OL(DcmElement& element) : valid_(false) { /** @@ -1112,7 +1112,7 @@ Uint64* content_; public: - ValueRepresentationReader_OV(DcmElement& element) : + explicit ValueRepresentationReader_OV(DcmElement& element) : valid_(false) { DcmUnsigned64bitVeryLong& e = dynamic_cast(element); @@ -4006,7 +4006,7 @@ Uint64 f; if (content.getUint64(f, i).good()) { - values.push_back(f); + values.push_back(static_cast(f)); if (static_cast(values.back()) != f) { diff -r c762f878e1f7 -r a4a2eaf3401c OrthancFramework/Sources/DicomParsing/Internals/DicomImageDecoder.cpp --- a/OrthancFramework/Sources/DicomParsing/Internals/DicomImageDecoder.cpp Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancFramework/Sources/DicomParsing/Internals/DicomImageDecoder.cpp Wed Aug 12 12:43:54 2026 +0200 @@ -573,15 +573,13 @@ throw OrthancException(ErrorCode_NotImplemented, std::string("Palette Color Lookup Table Descriptor not supported: '") + r.c_str() + "'"); } - const unsigned int width = target->GetWidth(); - const unsigned int height = target->GetHeight(); const uint16_t* source = reinterpret_cast(pixelData + expectedFrameSourceSize * frameToDecode); - for (unsigned int y = 0; y < height; y++) + for (unsigned int y = 0; y < static_cast(height); y++) { uint16_t* p = reinterpret_cast(target->GetRow(y)); - for (unsigned int x = 0; x < width; x++) + for (unsigned int x = 0; x < static_cast(width); x++) { p[0] = lutRed[*source]; p[1] = lutGreen[*source]; diff -r c762f878e1f7 -r a4a2eaf3401c OrthancFramework/Sources/Enumerations.cpp --- a/OrthancFramework/Sources/Enumerations.cpp Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancFramework/Sources/Enumerations.cpp Wed Aug 12 12:43:54 2026 +0200 @@ -816,7 +816,10 @@ case ModalityManufacturer_GE: return "GE"; - + + case ModalityManufacturer_SiemensSyngoCT: + return "SiemensSyngoCT"; + default: throw OrthancException(ErrorCode_ParameterOutOfRange); } @@ -1633,6 +1636,10 @@ { return ModalityManufacturer_GE; } + else if (manufacturer == "SiemensSyngoCT") + { + return ModalityManufacturer_SiemensSyngoCT; + } else if (manufacturer == "AgfaImpax" || manufacturer == "SyngoVia") { diff -r c762f878e1f7 -r a4a2eaf3401c OrthancFramework/Sources/Enumerations.h --- a/OrthancFramework/Sources/Enumerations.h Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancFramework/Sources/Enumerations.h Wed Aug 12 12:43:54 2026 +0200 @@ -679,7 +679,8 @@ ModalityManufacturer_GenericNoWildcardInDates, ModalityManufacturer_GenericNoUniversalWildcard, ModalityManufacturer_Vitrea, - ModalityManufacturer_GE + ModalityManufacturer_GE, + ModalityManufacturer_SiemensSyngoCT }; enum DicomRequestType diff -r c762f878e1f7 -r a4a2eaf3401c OrthancFramework/Sources/Logging.cpp --- a/OrthancFramework/Sources/Logging.cpp Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancFramework/Sources/Logging.cpp Wed Aug 12 12:43:54 2026 +0200 @@ -1577,7 +1577,7 @@ { (*it)->HandleLog(level_, category_, pluginName_, file_, line_, messageStream_.str()); } - catch (...) + catch (...) // NOLINT(bugprone-empty-catch) { // Don't throw in destructors } diff -r c762f878e1f7 -r a4a2eaf3401c OrthancFramework/Sources/Logging.h --- a/OrthancFramework/Sources/Logging.h Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancFramework/Sources/Logging.h Wed Aug 12 12:43:54 2026 +0200 @@ -94,7 +94,7 @@ size_t count_; public: - ScopedSetter(const ThreadContextMemento& memento); + explicit ScopedSetter(const ThreadContextMemento& memento); ~ScopedSetter(); }; diff -r c762f878e1f7 -r a4a2eaf3401c OrthancServer/Plugins/Engine/OrthancPlugins.cpp --- a/OrthancServer/Plugins/Engine/OrthancPlugins.cpp Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancServer/Plugins/Engine/OrthancPlugins.cpp Wed Aug 12 12:43:54 2026 +0200 @@ -2584,7 +2584,7 @@ cgroups_.resize(what.size() - 1); for (size_t i = 1; i < what.size(); i++) { - groups_[i - 1] = what[i]; + groups_[i - 1] = what[static_cast(i)]; cgroups_[i - 1] = groups_[i - 1].c_str(); } } diff -r c762f878e1f7 -r a4a2eaf3401c OrthancServer/Resources/Configuration.json --- a/OrthancServer/Resources/Configuration.json Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancServer/Resources/Configuration.json Wed Aug 12 12:43:54 2026 +0200 @@ -385,6 +385,8 @@ * - "Vitrea", * - "GE" (Enterprise Archive, MRI consoles and Advantage Workstation * from GE Healthcare). + * - "SiemensSyngoCT" (proposes both SCP and SCU C-Store roles when performing + * a C-Get SCU) * * This parameter is case-sensitive. **/ diff -r c762f878e1f7 -r a4a2eaf3401c OrthancServer/Resources/RunCppCheck-2.20.0.sh --- a/OrthancServer/Resources/RunCppCheck-2.20.0.sh Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancServer/Resources/RunCppCheck-2.20.0.sh Wed Aug 12 12:43:54 2026 +0200 @@ -13,10 +13,10 @@ assertWithSideEffect:../../OrthancFramework/Sources/DataSource/DataSourceReader.cpp:310 assertWithSideEffect:../../OrthancServer/Sources/Database/Compatibility/DatabaseLookup.cpp:292 assertWithSideEffect:../../OrthancServer/Sources/Database/Compatibility/DatabaseLookup.cpp:391 -assertWithSideEffect:../../OrthancServer/Sources/ServerJobs/ResourceModificationJob.cpp:293 -constParameterPointer:../../OrthancFramework/Sources/Logging.cpp:450 -constParameterPointer:../../OrthancFramework/Sources/Logging.cpp:454 -constParameterPointer:../../OrthancFramework/Sources/Toolbox.cpp:3351 +assertWithSideEffect:../../OrthancServer/Sources/ServerJobs/ResourceModificationJob.cpp:287 +constParameterPointer:../../OrthancFramework/Sources/Logging.cpp:452 +constParameterPointer:../../OrthancFramework/Sources/Logging.cpp:456 +constParameterPointer:../../OrthancFramework/Sources/Toolbox.cpp:3467 missingInclude:../../OrthancServer/Plugins/Engine/OrthancPluginDatabaseV4.cpp:41 nullPointer:../../OrthancFramework/UnitTestsSources/RestApiTests.cpp:321 stlFindInsert:../../OrthancFramework/Sources/RestApi/RestApiCallDocumentation.cpp:166 @@ -25,11 +25,17 @@ syntaxError:../../OrthancFramework/Sources/SQLite/FunctionContext.h syntaxError:../../OrthancFramework/UnitTestsSources/DicomMapTests.cpp:74 syntaxError:../../OrthancServer/UnitTestsSources/UnitTestsMain.cpp:325 -useInitializationList:../../OrthancFramework/Sources/Images/PngReader.cpp:100 +useInitializationList:../../OrthancFramework/Sources/Images/PngReader.cpp:95 useInitializationList:../../OrthancFramework/Sources/Images/PngWriter.cpp:99 useInitializationList:../../OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp:277 variableScope:../../OrthancServer/Sources/OrthancRestApi/OrthancRestApi.cpp:230 variableScope:../../OrthancServer/Sources/ServerJobs/OrthancPeerStoreJob.cpp:98 +sizeofCalculation:../../OrthancFramework/UnitTestsSources/ToolboxTests.cpp:517 +sizeofCalculation:../../OrthancFramework/UnitTestsSources/ToolboxTests.cpp:518 +sizeofCalculation:../../OrthancFramework/UnitTestsSources/ToolboxTests.cpp:519 +sizeofCalculation:../../OrthancFramework/UnitTestsSources/ToolboxTests.cpp:520 +sizeofCalculation:../../OrthancFramework/UnitTestsSources/ToolboxTests.cpp:521 +sizeofCalculation:../../OrthancFramework/UnitTestsSources/ToolboxTests.cpp:522 EOF CPPCHECK_BUILD_DIR=/tmp/cppcheck-build-dir-2.20.0/ diff -r c762f878e1f7 -r a4a2eaf3401c OrthancServer/Sources/OrthancConfiguration.cpp --- a/OrthancServer/Sources/OrthancConfiguration.cpp Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancServer/Sources/OrthancConfiguration.cpp Wed Aug 12 12:43:54 2026 +0200 @@ -607,8 +607,7 @@ } - bool OrthancConfiguration::GetIntegerParameter(int& target, - const std::string& parameter) const + int OrthancConfiguration::GetIntegerParameter(const std::string& parameter) const { int v; diff -r c762f878e1f7 -r a4a2eaf3401c OrthancServer/Sources/OrthancConfiguration.h --- a/OrthancServer/Sources/OrthancConfiguration.h Wed Aug 12 12:36:31 2026 +0200 +++ b/OrthancServer/Sources/OrthancConfiguration.h Wed Aug 12 12:43:54 2026 +0200 @@ -221,8 +221,7 @@ const std::string& parameter) const; // If the parameter is not part of the user configuration, it it retrieved from the default configuration - bool GetIntegerParameter(int& target, - const std::string& parameter) const; + int GetIntegerParameter(const std::string& parameter) const; bool LookupUnsignedIntegerParameter(unsigned int& target, const std::string& parameter) const; diff -r c762f878e1f7 -r a4a2eaf3401c OrthancServer/Sources/ServerJobs/ArchiveJob.cpp diff -r c762f878e1f7 -r a4a2eaf3401c OrthancServer/Sources/ServerTranscoder.h