changeset 7075:a4a2eaf3401c streaming

integration mainline->streaming
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 12 Aug 2026 12:43:54 +0200
parents c762f878e1f7 (current diff) 66f7a5185a4c (diff)
children 0ffe3053d2f8
files NEWS OrthancFramework/Sources/DataSource/DataSourceAnswer.cpp OrthancFramework/Sources/Logging.cpp OrthancFramework/Sources/Logging.h OrthancServer/Plugins/Engine/OrthancPlugins.cpp OrthancServer/Resources/Configuration.json OrthancServer/Resources/RunCppCheck-2.20.0.sh OrthancServer/Sources/OrthancConfiguration.cpp OrthancServer/Sources/OrthancConfiguration.h OrthancServer/Sources/ServerJobs/ArchiveJob.cpp OrthancServer/Sources/ServerTranscoder.h
diffstat 14 files changed, 48 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- 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
 --------
--- 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)
--- 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<std::string>::const_iterator it = acceptedStorageSopClasses.begin(); it != acceptedStorageSopClasses.end(); ++it)
       {
-        association_->ProposePresentationContext(*it, proposedStorageTransferSyntaxes, DicomAssociationRole_Scp);
+        association_->ProposePresentationContext(*it, proposedStorageTransferSyntaxes, proposedStoreRole);
       }
     }
   }
--- 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<DcmAttributeTag&>(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<DcmOtherByteOtherWord&>(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<DcmOther64bitVeryLong&>(element);
@@ -4006,7 +4006,7 @@
             Uint64 f;
             if (content.getUint64(f, i).good())
             {
-              values.push_back(f);
+              values.push_back(static_cast<int64_t>(f));
 
               if (static_cast<Uint64>(values.back()) != f)
               {
--- 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<const uint16_t*>(pixelData + expectedFrameSourceSize * frameToDecode);
         
-        for (unsigned int y = 0; y < height; y++)
+        for (unsigned int y = 0; y < static_cast<unsigned int>(height); y++)
         {
           uint16_t* p = reinterpret_cast<uint16_t*>(target->GetRow(y));
 
-          for (unsigned int x = 0; x < width; x++)
+          for (unsigned int x = 0; x < static_cast<unsigned int>(width); x++)
           {
             p[0] = lutRed[*source];
             p[1] = lutGreen[*source];
--- 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")
     {
--- 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
--- 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
             }
--- 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();
       };
--- 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<int>(i)];
               cgroups_[i - 1] = groups_[i - 1].c_str();
             }
           }
--- 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.
      **/
--- 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/
--- 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;
 
--- 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;