diff OrthancServer/Sources/ServerContext.cpp @ 4988:8fba26292a9f

Housekeeper plugin: finalizing + integration tests ok
author Alain Mazy <am@osimis.io>
date Sat, 30 Apr 2022 19:39:40 +0200
parents c8cdf5163cd2
children 2f30aa99c2db
line wrap: on
line diff
--- a/OrthancServer/Sources/ServerContext.cpp	Tue Apr 26 16:14:49 2022 +0200
+++ b/OrthancServer/Sources/ServerContext.cpp	Sat Apr 30 19:39:40 2022 +0200
@@ -495,7 +495,8 @@
 
   ServerContext::StoreResult ServerContext::StoreAfterTranscoding(std::string& resultPublicId,
                                                                   DicomInstanceToStore& dicom,
-                                                                  StoreInstanceMode mode)
+                                                                  StoreInstanceMode mode,
+                                                                  bool isReconstruct)
   {
     bool overwrite;
     switch (mode)
@@ -544,6 +545,7 @@
       // Test if the instance must be filtered out
       StoreResult result;
 
+      if (!isReconstruct) // skip all filters if this is a reconstruction
       {
         boost::shared_lock<boost::shared_mutex> lock(listenersMutex_);
 
@@ -615,7 +617,7 @@
       InstanceMetadata  instanceMetadata;
       result.SetStatus(index_.Store(
         instanceMetadata, summary, attachments, dicom.GetMetadata(), dicom.GetOrigin(), overwrite,
-        hasTransferSyntax, transferSyntax, hasPixelDataOffset, pixelDataOffset));
+        hasTransferSyntax, transferSyntax, hasPixelDataOffset, pixelDataOffset, isReconstruct));
 
       // Only keep the metadata for the "instance" level
       dicom.ClearMetadata();
@@ -636,41 +638,47 @@
         }
       }
 
-      switch (result.GetStatus())
+      if (!isReconstruct) // skip logs in case of reconstruction
       {
-        case StoreStatus_Success:
-          LOG(INFO) << "New instance stored";
-          break;
+        switch (result.GetStatus())
+        {
+          case StoreStatus_Success:
+            LOG(INFO) << "New instance stored";
+            break;
 
-        case StoreStatus_AlreadyStored:
-          LOG(INFO) << "Already stored";
-          break;
+          case StoreStatus_AlreadyStored:
+            LOG(INFO) << "Already stored";
+            break;
 
-        case StoreStatus_Failure:
-          LOG(ERROR) << "Store failure";
-          break;
+          case StoreStatus_Failure:
+            LOG(ERROR) << "Store failure";
+            break;
 
-        default:
-          // This should never happen
-          break;
+          default:
+            // This should never happen
+            break;
+        }
       }
 
-      if (result.GetStatus() == StoreStatus_Success ||
-          result.GetStatus() == StoreStatus_AlreadyStored)
+      if (!isReconstruct) // skip all signals if this is a reconstruction
       {
-        boost::shared_lock<boost::shared_mutex> lock(listenersMutex_);
-
-        for (ServerListeners::iterator it = listeners_.begin(); it != listeners_.end(); ++it)
+        if (result.GetStatus() == StoreStatus_Success ||
+            result.GetStatus() == StoreStatus_AlreadyStored)
         {
-          try
+          boost::shared_lock<boost::shared_mutex> lock(listenersMutex_);
+
+          for (ServerListeners::iterator it = listeners_.begin(); it != listeners_.end(); ++it)
           {
-            it->GetListener().SignalStoredInstance(resultPublicId, dicom, simplifiedTags);
-          }
-          catch (OrthancException& e)
-          {
-            LOG(ERROR) << "Error in the " << it->GetDescription() 
-                       << " callback while receiving an instance: " << e.What()
-                       << " (code " << e.GetErrorCode() << ")";
+            try
+            {
+              it->GetListener().SignalStoredInstance(resultPublicId, dicom, simplifiedTags);
+            }
+            catch (OrthancException& e)
+            {
+              LOG(ERROR) << "Error in the " << it->GetDescription() 
+                        << " callback while receiving an instance: " << e.What()
+                        << " (code " << e.GetErrorCode() << ")";
+            }
           }
         }
       }
@@ -743,10 +751,19 @@
     }
 #endif
 
+    return TranscodeAndStore(resultPublicId, dicom, mode);
+  }
+
+  ServerContext::StoreResult ServerContext::TranscodeAndStore(std::string& resultPublicId,
+                                                              DicomInstanceToStore* dicom,
+                                                              StoreInstanceMode mode,
+                                                              bool isReconstruct)
+  {
+
     if (!isIngestTranscoding_)
     {
       // No automated transcoding. This was the only path in Orthanc <= 1.6.1.
-      return StoreAfterTranscoding(resultPublicId, *dicom, mode);
+      return StoreAfterTranscoding(resultPublicId, *dicom, mode, isReconstruct);
     }
     else
     {
@@ -782,7 +799,7 @@
       if (!transcode)
       {
         // No transcoding
-        return StoreAfterTranscoding(resultPublicId, *dicom, mode);
+        return StoreAfterTranscoding(resultPublicId, *dicom, mode, isReconstruct);
       }
       else
       {
@@ -801,7 +818,12 @@
           std::unique_ptr<DicomInstanceToStore> toStore(DicomInstanceToStore::CreateFromParsedDicomFile(*tmp));
           toStore->SetOrigin(dicom->GetOrigin());
 
-          StoreResult result = StoreAfterTranscoding(resultPublicId, *toStore, mode);
+          if (isReconstruct) // the initial instance to store already has its own metadata
+          {
+            toStore->CopyMetadata(dicom->GetMetadata());
+          }
+
+          StoreResult result = StoreAfterTranscoding(resultPublicId, *toStore, mode, isReconstruct);
           assert(resultPublicId == tmp->GetHasher().HashInstance());
 
           return result;
@@ -809,7 +831,7 @@
         else
         {
           // Cannot transcode => store the original file
-          return StoreAfterTranscoding(resultPublicId, *dicom, mode);
+          return StoreAfterTranscoding(resultPublicId, *dicom, mode, isReconstruct);
         }
       }
     }