diff Core/DicomParsing/MemoryBufferTranscoder.cpp @ 3929:7dc5e7e0045d transcoding

simplifying MemoryBufferTranscoder::Transcode() interface
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 14 May 2020 14:40:13 +0200
parents 1f71c2f20e16
children b99acc213937
line wrap: on
line diff
--- a/Core/DicomParsing/MemoryBufferTranscoder.cpp	Thu May 14 13:31:05 2020 +0200
+++ b/Core/DicomParsing/MemoryBufferTranscoder.cpp	Thu May 14 14:40:13 2020 +0200
@@ -37,6 +37,10 @@
 #include "../OrthancException.h"
 #include "FromDcmtkBridge.h"
 
+#if !defined(NDEBUG)  // For debugging
+#  include "ParsedDicomFile.h"
+#endif
+
 namespace Orthanc
 {
   MemoryBufferTranscoder::MemoryBufferTranscoder()
@@ -63,9 +67,31 @@
   }
 
 
+  static void CheckTargetSyntax(const std::string& transcoded,
+                                const std::set<DicomTransferSyntax>& allowedSyntaxes)
+  {
+#if !defined(NDEBUG)
+    // Debug mode
+    ParsedDicomFile parsed(transcoded);
+
+    std::string s;
+    DicomTransferSyntax a, b;
+    if (!parsed.LookupTransferSyntax(s) ||
+        !FromDcmtkBridge::LookupOrthancTransferSyntax(a, parsed.GetDcmtkObject()) ||
+        !LookupTransferSyntax(b, s) ||
+        a != b ||
+        allowedSyntaxes.find(a) == allowedSyntaxes.end())
+    {
+      throw OrthancException(
+        ErrorCode_Plugin,
+        "DEBUG - The transcoding plugin has not written to one of the allowed transfer syntaxes");
+    }
+#endif
+  }
+    
+
   bool MemoryBufferTranscoder::TranscodeParsedToBuffer(
     std::string& target /* out */,
-    DicomTransferSyntax& sourceSyntax /* out */,
     bool& hasSopInstanceUidChanged /* out */,
     DcmFileFormat& dicom /* in, possibly modified */,
     DicomTransferSyntax targetSyntax,
@@ -81,30 +107,23 @@
 
     const void* data = source.empty() ? NULL : source.c_str();
 
-    std::set<DicomTransferSyntax> tmp;
-    tmp.insert(targetSyntax);
-
-    DicomTransferSyntax targetSyntax2;
-    bool success = Transcode(target, sourceSyntax, targetSyntax2, hasSopInstanceUidChanged,
-                             data, source.size(), tmp, allowNewSopInstanceUid);
+    std::set<DicomTransferSyntax> allowedSyntaxes;
+    allowedSyntaxes.insert(targetSyntax);
 
-    if (success &&
-        targetSyntax != targetSyntax2)
-    {
-      throw OrthancException(ErrorCode_InternalError);
-    }
-    
+    bool success = Transcode(target, hasSopInstanceUidChanged,
+                             data, source.size(), allowedSyntaxes, allowNewSopInstanceUid);
+
 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
     if (!success &&
         useDcmtk_ &&
         dcmtk_.TranscodeParsedToBuffer(
-          target, sourceSyntax, hasSopInstanceUidChanged,
-          dicom, targetSyntax, allowNewSopInstanceUid))
+          target, hasSopInstanceUidChanged, dicom, targetSyntax, allowNewSopInstanceUid))
     {
       success = true;
     }
 #endif
 
+    CheckTargetSyntax(target, allowedSyntaxes);
     return success;
   }
   
@@ -116,13 +135,14 @@
     const std::set<DicomTransferSyntax>& allowedSyntaxes,
     bool allowNewSopInstanceUid)
   {
-    DicomTransferSyntax sourceSyntax, targetSyntax;
     bool hasSopInstanceUidChanged;
     
     std::string target;
-    if (Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged,
+    if (Transcode(target, hasSopInstanceUidChanged,
                   buffer, size, allowedSyntaxes, allowNewSopInstanceUid))
     {
+      CheckTargetSyntax(target, allowedSyntaxes);
+      
       const void* data = target.empty() ? NULL : target.c_str();
       return IDicomTranscoder::TranscodedDicom::CreateFromInternal(
         FromDcmtkBridge::LoadFromMemoryBuffer(data, target.size()), hasSopInstanceUidChanged);