changeset 658:1ce39017d4fd

cppcheck
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 05 Jun 2024 11:25:43 +0200
parents c59955903971
children c42b1c7eed9e
files Plugin/DicomWebServers.h Plugin/QidoRs.cpp Plugin/WadoRs.cpp
diffstat 3 files changed, 118 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/Plugin/DicomWebServers.h	Thu May 30 21:42:05 2024 +0200
+++ b/Plugin/DicomWebServers.h	Wed Jun 05 11:25:43 2024 +0200
@@ -33,7 +33,7 @@
 
 namespace OrthancPlugins
 {
-  class DicomWebServers
+  class DicomWebServers : public boost::noncopyable
   {
   private:
     typedef std::map<std::string, Orthanc::WebServiceParameters*>  Servers;
--- a/Plugin/QidoRs.cpp	Thu May 30 21:42:05 2024 +0200
+++ b/Plugin/QidoRs.cpp	Wed Jun 05 11:25:43 2024 +0200
@@ -40,7 +40,7 @@
 
 namespace
 {
-  class ModuleMatcher
+  class ModuleMatcher : public boost::noncopyable
   {
   public:
     typedef std::map<Orthanc::DicomTag, std::string>  Filters;
--- a/Plugin/WadoRs.cpp	Thu May 30 21:42:05 2024 +0200
+++ b/Plugin/WadoRs.cpp	Wed Jun 05 11:25:43 2024 +0200
@@ -206,7 +206,7 @@
     bool& isXml_;
 
   public:
-    AcceptMetadataMultipart(bool& isXml /* out */) :
+    explicit AcceptMetadataMultipart(bool& isXml /* out */) :
       isXml_(isXml)
     {
     }
@@ -1199,40 +1199,90 @@
 
 class InstanceToLoad : public Orthanc::IDynamicObject
 {
+private:
+  std::string                  orthancId_;
+  std::string                  studyInstanceUid_;
+  std::string                  seriesInstanceUid_;
+  std::string                  bulkRoot_;
+  boost::mutex&                writerMutex_;
+  OrthancPlugins::DicomWebFormatter::HttpWriter& writer_;
+
 public:
-  std::string                  orthancId;
-  std::string                  studyInstanceUid;
-  std::string                  seriesInstanceUid;
-  std::string                  bulkRoot;
-  boost::mutex&                writerMutex;
-  OrthancPlugins::DicomWebFormatter::HttpWriter& writer;
-  bool                         isXml;
-  OrthancPluginDicomWebBinaryMode mode;
+  InstanceToLoad(const std::string& orthancId,
+                 const std::string& bulkRoot,
+                 boost::mutex& writerMutex,
+                 OrthancPlugins::DicomWebFormatter::HttpWriter& writer,
+                 const std::string& studyInstanceUid,
+                 const std::string& seriesInstanceUid):
+    orthancId_(orthancId),
+    studyInstanceUid_(studyInstanceUid),
+    seriesInstanceUid_(seriesInstanceUid),
+    bulkRoot_(bulkRoot),
+    writerMutex_(writerMutex),
+    writer_(writer)
+  {
+  }
 
-  explicit InstanceToLoad(const std::string& orthancId, const std::string bulkRoot, boost::mutex& writerMutex, OrthancPlugins::DicomWebFormatter::HttpWriter& writer, bool isXml, OrthancPluginDicomWebBinaryMode mode, const std::string& studyInstanceUid, const std::string& seriesInstanceUid)
-  : orthancId(orthancId),
-    studyInstanceUid(studyInstanceUid),
-    seriesInstanceUid(seriesInstanceUid),
-    bulkRoot(bulkRoot),
-    writerMutex(writerMutex),
-    writer(writer),
-    isXml(isXml),
-    mode(mode)
-  {}
+  const std::string& GetStudyInstanceUid() const
+  {
+    return studyInstanceUid_;
+  }
+
+  const std::string& GetSeriesInstanceUid() const
+  {
+    return seriesInstanceUid_;
+  }
+
+  const std::string& GetOrthancId() const
+  {
+    return orthancId_;
+  }
+
+  const std::string& GetBulkRoot() const
+  {
+    return bulkRoot_;
+  }
+
+  void SetBulkRoot(const std::string& root)
+  {
+    bulkRoot_ = root;
+  }
+
+  void AddInstance(const OrthancPlugins::DicomInstance& instance)
+  {
+    boost::mutex::scoped_lock lock(writerMutex_);
+    writer_.AddInstance(instance, bulkRoot_);
+  }
 };
 
-class InstanceWorkerData
+
+class InstanceWorkerData : public boost::noncopyable
 {
+private:
+  Orthanc::SharedMessageQueue* instancesQueue_;
+  std::string wadoBase_;
+
 public:
-  std::string id;
-  Orthanc::SharedMessageQueue* instancesQueue;
-  std::string wadoBase;
+  InstanceWorkerData(Orthanc::SharedMessageQueue* instancesQueue,
+                     const std::string& wadoBase) :
+    instancesQueue_(instancesQueue),
+    wadoBase_(wadoBase)
+  {
+    if (instancesQueue == NULL)
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
+    }
+  }
 
-  InstanceWorkerData(const std::string& id, Orthanc::SharedMessageQueue* instancesQueue, const std::string& wadoBase)
-  : id(id),
-    instancesQueue(instancesQueue),
-    wadoBase(wadoBase)
-  {}
+  InstanceToLoad* Dequeue()
+  {
+    return dynamic_cast<InstanceToLoad*>(instancesQueue_->Dequeue(0));
+  }
+
+  const std::string& GetWadoBase() const
+  {
+    return wadoBase_;
+  }
 };
 
 void InstanceWorkerThread(InstanceWorkerData* data)
@@ -1241,32 +1291,35 @@
   {
     try
     {
-      std::unique_ptr<InstanceToLoad> instanceToLoad(dynamic_cast<InstanceToLoad*>(data->instancesQueue->Dequeue(0)));
+      std::unique_ptr<InstanceToLoad> instanceToLoad(data->Dequeue());
+      if (instanceToLoad.get() == NULL)
+      {
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
+      }
 
-      if (instanceToLoad->orthancId == EXIT_WORKER_MESSAGE)
+      if (instanceToLoad->GetOrthancId() == EXIT_WORKER_MESSAGE)
       {
         return;
       }
 
-      if (instanceToLoad->bulkRoot == "") // we are not in oneLargeQuery mode -> we must load the instance tags to get the SOPInstanceUID
+      if (instanceToLoad->GetBulkRoot().empty()) // we are not in oneLargeQuery mode -> we must load the instance tags to get the SOPInstanceUID
       {
         Json::Value instanceResource;
 
-        if (OrthancPlugins::RestApiGet(instanceResource, "/instances/" + instanceToLoad->orthancId, false))
+        if (OrthancPlugins::RestApiGet(instanceResource, "/instances/" + instanceToLoad->GetOrthancId(), false))
         {
-          instanceToLoad->bulkRoot = (data->wadoBase +
-                              "studies/" + instanceToLoad->studyInstanceUid +
-                              "/series/" + instanceToLoad->seriesInstanceUid + 
-                              "/instances/" + instanceResource[MAIN_DICOM_TAGS]["SOPInstanceUID"].asString() + "/bulk");
+          instanceToLoad->SetBulkRoot((data->GetWadoBase() +
+                                       "studies/" + instanceToLoad->GetStudyInstanceUid() +
+                                       "/series/" + instanceToLoad->GetSeriesInstanceUid() +
+                                       "/instances/" + instanceResource[MAIN_DICOM_TAGS]["SOPInstanceUID"].asString() + "/bulk"));
         }
       }
 
-      std::string content;
       std::unique_ptr<OrthancPlugins::DicomInstance> instance;
 
       try
       {
-        instance.reset(OrthancPlugins::DicomInstance::Load(instanceToLoad->orthancId, OrthancPluginLoadDicomInstanceMode_EmptyPixelData));
+        instance.reset(OrthancPlugins::DicomInstance::Load(instanceToLoad->GetOrthancId(), OrthancPluginLoadDicomInstanceMode_EmptyPixelData));
       }
       catch (Orthanc::OrthancException& e)
       {
@@ -1274,8 +1327,7 @@
 
       if (instance.get() != NULL)
       {
-        boost::mutex::scoped_lock lock(instanceToLoad->writerMutex);
-        instanceToLoad->writer.AddInstance(*instance, instanceToLoad->bulkRoot);
+        instanceToLoad->AddInstance(*instance);
       }
     }
     catch(...)
@@ -1295,28 +1347,28 @@
                                     const std::string& seriesInstanceUid,
                                     const std::string& wadoBase)
 {
-  ChildrenMainDicomMaps instancesDicomMaps;
-  std::string seriesDicomUid;
-
-  unsigned int workersCount =  OrthancPlugins::Configuration::GetMetadataWorkerThreadsCount();
-  bool oneLargeQuery = false;  // we keep this code here for future use once we'll have optimized Orthanc API /series/.../instances?full to minimize the SQL queries
+  const unsigned int workersCount =  OrthancPlugins::Configuration::GetMetadataWorkerThreadsCount();
+  const bool oneLargeQuery = false;  // we keep this code here for future use once we'll have optimized Orthanc API /series/.../instances?full to minimize the SQL queries
                                 // right now, it is faster to call /instances/..?full in each worker but, later, it should be more efficient with a large SQL query in Orthanc
 
-  if (oneLargeQuery)
-  {
-    GetChildrenMainDicomTags(instancesDicomMaps, seriesDicomUid, Orthanc::ResourceType_Series, seriesOrthancId);
-    for (ChildrenMainDicomMaps::const_iterator it = instancesDicomMaps.begin(); it != instancesDicomMaps.end(); ++it)
-    {
-      instancesIds.insert(it->first);
-    }
-  }
-  else
-  {
-    GetChildrenIdentifiers(instancesIds, seriesDicomUid, Orthanc::ResourceType_Series, seriesOrthancId);
-  }
-
   if (workersCount > 1 && mode == OrthancPlugins::MetadataMode_Full)
   {
+    ChildrenMainDicomMaps instancesDicomMaps;
+    std::string seriesDicomUid;
+
+    if (oneLargeQuery)
+    {
+      GetChildrenMainDicomTags(instancesDicomMaps, seriesDicomUid, Orthanc::ResourceType_Series, seriesOrthancId);
+      for (ChildrenMainDicomMaps::const_iterator it = instancesDicomMaps.begin(); it != instancesDicomMaps.end(); ++it)
+      {
+        instancesIds.insert(it->first);
+      }
+    }
+    else
+    {
+      GetChildrenIdentifiers(instancesIds, seriesDicomUid, Orthanc::ResourceType_Series, seriesOrthancId);
+    }
+
     // span a few workers to get the tags from the core and serialize them
     Orthanc::SharedMessageQueue instancesQueue;
     std::vector<boost::shared_ptr<boost::thread> > instancesWorkers;
@@ -1325,7 +1377,7 @@
 
     for (unsigned int t = 0; t < workersCount; t++)
     {
-      InstanceWorkerData* threadData = new InstanceWorkerData(boost::lexical_cast<std::string>(t), &instancesQueue, wadoBase);
+      InstanceWorkerData* threadData = new InstanceWorkerData(&instancesQueue, wadoBase);
       instancesWorkersData.push_back(boost::shared_ptr<InstanceWorkerData>(threadData));
       instancesWorkers.push_back(boost::shared_ptr<boost::thread>(new boost::thread(InstanceWorkerThread, threadData)));
     }
@@ -1339,21 +1391,21 @@
                                 "/series/" + seriesInstanceUid + 
                                 "/instances/" + i->second->GetStringValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "", false) + "/bulk");
 
-        instancesQueue.Enqueue(new InstanceToLoad(i->first, bulkRoot, writerMutex, writer, isXml, OrthancPluginDicomWebBinaryMode_BulkDataUri, studyInstanceUid, seriesInstanceUid));
+        instancesQueue.Enqueue(new InstanceToLoad(i->first, bulkRoot, writerMutex, writer, studyInstanceUid, seriesInstanceUid));
       }
     }
     else
     {
       for (std::set<std::string>::const_iterator i = instancesIds.begin(); i != instancesIds.end(); ++i)
       {
-        instancesQueue.Enqueue(new InstanceToLoad(*i, "", writerMutex, writer, isXml, OrthancPluginDicomWebBinaryMode_BulkDataUri, studyInstanceUid, seriesInstanceUid));
+        instancesQueue.Enqueue(new InstanceToLoad(*i, "", writerMutex, writer, studyInstanceUid, seriesInstanceUid));
       }
     }
 
     // send a dummy "exit" message to all workers such that they stop waiting for messages on the queue
     for (size_t i = 0; i < instancesWorkers.size(); i++)
     {
-      instancesQueue.Enqueue(new InstanceToLoad(EXIT_WORKER_MESSAGE, "", writerMutex, writer, isXml, OrthancPluginDicomWebBinaryMode_BulkDataUri, studyInstanceUid, seriesInstanceUid));
+      instancesQueue.Enqueue(new InstanceToLoad(EXIT_WORKER_MESSAGE, "", writerMutex, writer, studyInstanceUid, seriesInstanceUid));
     }
 
     for (size_t i = 0; i < instancesWorkers.size(); i++)
@@ -1367,7 +1419,8 @@
     instancesWorkers.clear();
   }
   else
-  { // old single threaded code
+  {
+    // old single threaded code
     std::set<std::string> instances;
     std::string seriesDicomUid;  // not used