diff OrthancServer/Sources/ServerJobs/MergeStudyJob.cpp @ 4717:783f8a048035 openssl-3.x

integration mainline->openssl-3.x
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 23 Jun 2021 16:23:23 +0200
parents f0038043fb97 fb98db281d1d
children 70d2a97ca8cb
line wrap: on
line diff
--- a/OrthancServer/Sources/ServerJobs/MergeStudyJob.cpp	Tue Jun 22 10:40:28 2021 +0200
+++ b/OrthancServer/Sources/ServerJobs/MergeStudyJob.cpp	Wed Jun 23 16:23:23 2021 +0200
@@ -30,10 +30,20 @@
 
 namespace Orthanc
 {
+  static void RegisterSeries(std::map<std::string, std::string>& target,
+                             const std::string& series)
+  {
+    // Generate a target SeriesInstanceUID for this series
+    if (target.find(series) == target.end())
+    {
+      target[series] = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Series);
+    }
+  }
+  
+
   void MergeStudyJob::AddSourceSeriesInternal(const std::string& series)
   {
-    // Generate a target SeriesInstanceUID for this series
-    seriesUidMap_[series] = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Series);
+    RegisterSeries(seriesUidMap_, series);
 
     // Add all the instances of the series as to be processed
     std::list<std::string> instances;
@@ -228,7 +238,7 @@
   }
 
 
-  void MergeStudyJob::AddSource(const std::string& studyOrSeries)
+  void MergeStudyJob::AddSource(const std::string& publicId)
   {
     ResourceType level;
     
@@ -236,28 +246,31 @@
     {
       throw OrthancException(ErrorCode_BadSequenceOfCalls);
     }
-    else if (!GetContext().GetIndex().LookupResourceType(level, studyOrSeries))
+    else if (!GetContext().GetIndex().LookupResourceType(level, publicId))
     {
       throw OrthancException(ErrorCode_UnknownResource,
-                             "Cannot find this resource: " + studyOrSeries);
+                             "Cannot find this resource: " + publicId);
     }
     else
     {
       switch (level)
       {
         case ResourceType_Study:
-          AddSourceStudyInternal(studyOrSeries);
+          AddSourceStudyInternal(publicId);
           break;
           
         case ResourceType_Series:
-          AddSourceSeries(studyOrSeries);
+          AddSourceSeries(publicId);
+          break;
+          
+        case ResourceType_Instance:
+          AddSourceInstance(publicId);
           break;
           
         default:
           throw OrthancException(ErrorCode_UnknownResource,
-                                 "This resource is neither a study, nor a series: " +
-                                 studyOrSeries + " is a " +
-                                 std::string(EnumerationToString(level)));
+                                 "This resource is neither a study, nor a series, nor an instance: " +
+                                 publicId + " is a " + std::string(EnumerationToString(level)));
       }
     }    
   }
@@ -310,6 +323,34 @@
   }
 
 
+  void MergeStudyJob::AddSourceInstance(const std::string& instance)
+  {
+    std::string parentStudy, parentSeries;
+
+    if (IsStarted())
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+    else if (!GetContext().GetIndex().LookupParent(parentSeries, instance, ResourceType_Series) ||
+             !GetContext().GetIndex().LookupParent(parentStudy, parentSeries, ResourceType_Study))
+    {
+      throw OrthancException(ErrorCode_UnknownResource,
+                             "This resource is not an instance: " + instance);
+    }
+    else if (parentStudy == targetStudy_)
+    {
+      throw OrthancException(ErrorCode_UnknownResource,
+                             "Cannot merge instance " + instance +
+                             " into its parent study " + targetStudy_);
+    }
+    else
+    {
+      RegisterSeries(seriesUidMap_, parentSeries);
+      AddInstance(instance);
+    }    
+  }
+  
+
   void MergeStudyJob::GetPublicContent(Json::Value& value)
   {
     CleaningInstancesJob::GetPublicContent(value);