diff Core/DicomParsing/FromDcmtkBridge.cpp @ 3199:9316f341e40f

unit testing json for dicomweb
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 06 Feb 2019 10:37:03 +0100
parents 7724ed267b5c
children f6374c36a671
line wrap: on
line diff
--- a/Core/DicomParsing/FromDcmtkBridge.cpp	Wed Feb 06 07:28:58 2019 +0100
+++ b/Core/DicomParsing/FromDcmtkBridge.cpp	Wed Feb 06 10:37:03 2019 +0100
@@ -90,8 +90,10 @@
 #include <dcmtk/dcmdata/dcvrss.h>
 #include <dcmtk/dcmdata/dcvrst.h>
 #include <dcmtk/dcmdata/dcvrtm.h>
+#include <dcmtk/dcmdata/dcvruc.h>
 #include <dcmtk/dcmdata/dcvrui.h>
 #include <dcmtk/dcmdata/dcvrul.h>
+#include <dcmtk/dcmdata/dcvrur.h>
 #include <dcmtk/dcmdata/dcvrus.h>
 #include <dcmtk/dcmdata/dcvrut.h>
 
@@ -1289,7 +1291,7 @@
       case EVR_OB:
         return ValueRepresentation_OtherByte;
 
-#if DCMTK_VERSION_NUMBER >= 362
+#if DCMTK_VERSION_NUMBER >= 361
         case EVR_OD:
           return ValueRepresentation_OtherDouble;
 #endif
@@ -1326,7 +1328,7 @@
       case EVR_TM:
         return ValueRepresentation_Time;
 
-#if DCMTK_VERSION_NUMBER >= 362
+#if DCMTK_VERSION_NUMBER >= 361
       case EVR_UC:
         return ValueRepresentation_UnlimitedCharacters;
 #endif
@@ -1340,7 +1342,7 @@
       case EVR_UN:
         return ValueRepresentation_Unknown;
 
-#if DCMTK_VERSION_NUMBER >= 362
+#if DCMTK_VERSION_NUMBER >= 361
       case EVR_UR:
         return ValueRepresentation_UniversalResource;
 #endif
@@ -1359,7 +1361,14 @@
 
   static bool IsBinaryTag(const DcmTag& key)
   {
-    return (key.isUnknownVR() || 
+    return (key.isUnknownVR() ||
+#if DCMTK_VERSION_NUMBER >= 361
+            key.getEVR() == EVR_OD ||
+#endif
+            
+#if DCMTK_VERSION_NUMBER >= 362
+            key.getEVR() == EVR_OL ||
+#endif            
             key.getEVR() == EVR_OB ||
             key.getEVR() == EVR_OF ||
             key.getEVR() == EVR_OW ||
@@ -1386,6 +1395,14 @@
        * Binary types, handled above
        **/
     
+#if DCMTK_VERSION_NUMBER >= 361
+      case EVR_OD:
+#endif            
+
+#if DCMTK_VERSION_NUMBER >= 362
+      case EVR_OL:
+#endif            
+
       case EVR_OB:  // other byte
       case EVR_OF:  // other float
       case EVR_OW:  // other word
@@ -1444,6 +1461,12 @@
       case EVR_PN:  // person name
         return new DcmPersonName(key);
 
+      case EVR_UC:  // unlimited characters
+        return new DcmUnlimitedCharacters(key);
+
+      case EVR_UR:  // URI/URL
+        return new DcmUniversalResourceIdentifierOrLocator(key);
+          
         
       /**
        * Numerical types
@@ -1544,7 +1567,29 @@
     if (tag.IsPrivate() ||
         IsBinaryTag(key))
     {
-      if (element.putUint8Array((const Uint8*) decoded->c_str(), decoded->size()).good())
+      bool ok;
+
+      switch (key.getEVR())
+      {
+        case EVR_OW:
+          if (decoded->size() % sizeof(Uint16) != 0)
+          {
+            LOG(ERROR) << "A tag with OW VR must have an even number of bytes";
+            ok = false;
+          }
+          else
+          {
+            ok = element.putUint16Array((const Uint16*) decoded->c_str(), decoded->size() / sizeof(Uint16)).good();
+          }
+          
+          break;
+      
+        default:
+          ok = element.putUint8Array((const Uint8*) decoded->c_str(), decoded->size()).good();
+          break;
+      }
+      
+      if (ok)
       {
         return;
       }
@@ -1595,6 +1640,8 @@
         case EVR_UT:  // unlimited text
         case EVR_PN:  // person name
         case EVR_UI:  // unique identifier
+        case EVR_UC:  // unlimited characters
+        case EVR_UR:  // URI/URL
         {
           ok = element.putString(decoded->c_str()).good();
           break;
@@ -2199,16 +2246,25 @@
 
     if (evr == EVR_OB ||  // other byte
         evr == EVR_OF ||  // other float
+#if DCMTK_VERSION_NUMBER >= 361
+        evr == EVR_OD ||  // other double
+#endif
 #if DCMTK_VERSION_NUMBER >= 362
-        evr == EVR_OD ||  // other double
         evr == EVR_OL ||  // other long
 #endif
         evr == EVR_OW ||  // other word
         evr == EVR_UN)    // unknown value representation
     {
+      Uint16* data16 = NULL;
       Uint8* data = NULL;
 
-      if (element.getUint8Array(data) == EC_Normal)
+      if (evr == EVR_OW &&
+          element.getUint16Array(data16) == EC_Normal)
+      {
+        visitor.VisitBinary(parentTags, parentIndexes, tag, vr, data16, element.getLength());
+      }
+      else if (evr != EVR_OW &&
+               element.getUint8Array(data) == EC_Normal)
       {
         visitor.VisitBinary(parentTags, parentIndexes, tag, vr, data, element.getLength());
       }