diff OrthancServer/ServerJobs/ResourceModificationJob.cpp @ 3948:3d2fc1b5cc8c transcoding

ResourceModificationJob: Fix the SOP instance UID to preserve references
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 19 May 2020 17:23:30 +0200
parents 0b3256c3ee14
children 5fe8c6d3212e
line wrap: on
line diff
--- a/OrthancServer/ServerJobs/ResourceModificationJob.cpp	Tue May 19 16:19:05 2020 +0200
+++ b/OrthancServer/ServerJobs/ResourceModificationJob.cpp	Tue May 19 17:23:30 2020 +0200
@@ -39,6 +39,8 @@
 #include "../ServerContext.h"
 
 #include <dcmtk/dcmdata/dcfilefo.h>
+#include <dcmtk/dcmdata/dcdeftag.h>
+#include <cassert>
 
 namespace Orthanc
 {
@@ -173,6 +175,8 @@
 
     modification_->Apply(*modified);
 
+    const std::string modifiedUid = IDicomTranscoder::GetSopInstanceUid(modified->GetDcmtkObject());
+    
     if (transcode_)
     {
       std::set<DicomTransferSyntax> syntaxes;
@@ -186,6 +190,17 @@
       if (GetContext().Transcode(transcoded, hasSopInstanceUidChanged, source, syntaxes, true))
       {
         modified.reset(transcoded.ReleaseAsParsedDicomFile());
+
+        // Fix the SOP instance UID in order the preserve the
+        // references between instance UIDs in the DICOM hierarchy
+        // (the UID might have changed in the case of lossy transcoding)
+        if (modified.get() == NULL ||
+            modified->GetDcmtkObject().getDataset() == NULL ||
+            !modified->GetDcmtkObject().getDataset()->putAndInsertString(
+              DCM_SOPInstanceUID, modifiedUid.c_str(), OFTrue /* replace */).good())
+        {
+          throw OrthancException(ErrorCode_InternalError);
+        }
       }
       else
       {
@@ -194,6 +209,8 @@
       }
     }
 
+    assert(modifiedUid == IDicomTranscoder::GetSopInstanceUid(modified->GetDcmtkObject()));
+
     DicomInstanceToStore toStore;
     toStore.SetOrigin(origin_);
     toStore.SetParsedDicomFile(*modified);