diff Core/DicomParsing/ParsedDicomFile.cpp @ 2905:ae20fccdd867

refactoring mime types
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 30 Oct 2018 11:55:23 +0100
parents f3c1eda54e47
children 9d277f8ad698
line wrap: on
line diff
--- a/Core/DicomParsing/ParsedDicomFile.cpp	Tue Oct 30 10:46:17 2018 +0100
+++ b/Core/DicomParsing/ParsedDicomFile.cpp	Tue Oct 30 11:55:23 2018 +0100
@@ -82,8 +82,10 @@
 #include "ParsedDicomFile.h"
 
 #include "FromDcmtkBridge.h"
+#include "Internals/DicomFrameIndex.h"
 #include "ToDcmtkBridge.h"
-#include "Internals/DicomFrameIndex.h"
+
+#include "../Images/PamReader.h"
 #include "../Logging.h"
 #include "../OrthancException.h"
 #include "../Toolbox.h"
@@ -160,8 +162,6 @@
 
 
 #if ORTHANC_ENABLE_CIVETWEB == 1 || ORTHANC_ENABLE_MONGOOSE == 1
-  static const char* CONTENT_TYPE_OCTET_STREAM = "application/octet-stream";
-
   static void ParseTagAndGroup(DcmTagKey& key,
                                const std::string& tag)
   {
@@ -362,14 +362,14 @@
             {
               if (pixelItem->getLength() == 0)
               {
-                output.AnswerBuffer(NULL, 0, CONTENT_TYPE_OCTET_STREAM);
+                output.AnswerBuffer(NULL, 0, MIME_BINARY);
                 return true;
               }
 
               Uint8* buffer = NULL;
               if (pixelItem->getUint8Array(buffer).good() && buffer)
               {
-                output.AnswerBuffer(buffer, pixelItem->getLength(), CONTENT_TYPE_OCTET_STREAM);
+                output.AnswerBuffer(buffer, pixelItem->getLength(), MIME_BINARY);
                 return true;
               }
             }
@@ -692,7 +692,7 @@
     const std::string* decoded = &utf8Value;
 
     if (decodeDataUriScheme &&
-        boost::starts_with(utf8Value, "data:application/octet-stream;base64,"))
+        boost::starts_with(utf8Value, URI_SCHEME_PREFIX_BINARY))
     {
       std::string mime;
       if (!Toolbox::DecodeDataUriScheme(mime, binary, utf8Value))
@@ -825,7 +825,7 @@
     std::string serialized;
     if (FromDcmtkBridge::SaveToMemoryBuffer(serialized, *pimpl_->file_->getDataset()))
     {
-      output.AnswerBuffer(serialized, CONTENT_TYPE_OCTET_STREAM);
+      output.AnswerBuffer(serialized, MIME_BINARY);
     }
   }
 #endif
@@ -1072,7 +1072,7 @@
 
     Toolbox::ToLowerCase(mime);
 
-    if (mime == "image/png")
+    if (mime == MIME_PNG)
     {
 #if ORTHANC_ENABLE_PNG == 1
       EmbedImage(mime, content);
@@ -1081,7 +1081,7 @@
       throw OrthancException(ErrorCode_NotImplemented);
 #endif
     }
-    else if (mime == "image/jpeg")
+    else if (mime == MIME_JPEG)
     {
 #if ORTHANC_ENABLE_JPEG == 1
       EmbedImage(mime, content);
@@ -1090,7 +1090,11 @@
       throw OrthancException(ErrorCode_NotImplemented);
 #endif
     }
-    else if (mime == "application/pdf")
+    else if (mime == MIME_PAM)
+    {
+      EmbedImage(mime, content);
+    }
+    else if (mime == MIME_PDF)
     {
       EmbedPdf(content);
     }
@@ -1113,20 +1117,32 @@
   }
 
 
-#if (ORTHANC_ENABLE_JPEG == 1 &&                \
-     ORTHANC_ENABLE_PNG == 1)
   void ParsedDicomFile::EmbedImage(const std::string& mime,
                                    const std::string& content)
   {
-    if (mime == "image/png")
+#if ORTHANC_ENABLE_JPEG == 1
+    if (mime == MIME_JPEG)
+    {
+      JpegReader reader;
+      reader.ReadFromMemory(content);
+      EmbedImage(reader);
+      return;
+    }
+#endif
+    
+#if ORTHANC_ENABLE_PNG == 1
+    if (mime == MIME_PNG)
     {
       PngReader reader;
       reader.ReadFromMemory(content);
       EmbedImage(reader);
+      return;
     }
-    else if (mime == "image/jpeg")
+#endif
+
+    if (mime == MIME_PAM)
     {
-      JpegReader reader;
+      PamReader reader;
       reader.ReadFromMemory(content);
       EmbedImage(reader);
     }
@@ -1135,7 +1151,6 @@
       throw OrthancException(ErrorCode_NotImplemented);
     }
   }
-#endif
 
 
   void ParsedDicomFile::EmbedImage(const ImageAccessor& accessor)
@@ -1346,7 +1361,7 @@
     ReplacePlainString(DICOM_TAG_SOP_CLASS_UID, UID_EncapsulatedPDFStorage);
     ReplacePlainString(FromDcmtkBridge::Convert(DCM_Modality), "OT");
     ReplacePlainString(FromDcmtkBridge::Convert(DCM_ConversionType), "WSD");
-    ReplacePlainString(FromDcmtkBridge::Convert(DCM_MIMETypeOfEncapsulatedDocument), "application/pdf");
+    ReplacePlainString(FromDcmtkBridge::Convert(DCM_MIMETypeOfEncapsulatedDocument), MIME_PDF);
     //ReplacePlainString(FromDcmtkBridge::Convert(DCM_SeriesNumber), "1");
 
     std::auto_ptr<DcmPolymorphOBOW> element(new DcmPolymorphOBOW(DCM_EncapsulatedDocument));
@@ -1388,7 +1403,7 @@
     if (!GetTagValue(sop, DICOM_TAG_SOP_CLASS_UID) ||
         !GetTagValue(mime, FromDcmtkBridge::Convert(DCM_MIMETypeOfEncapsulatedDocument)) ||
         sop != UID_EncapsulatedPDFStorage ||
-        mime != "application/pdf")
+        mime != MIME_PDF)
     {
       return false;
     }
@@ -1470,16 +1485,16 @@
     switch (transferSyntax)
     {
       case EXS_JPEGProcess1:
-        mime = "image/jpeg";
+        mime = MIME_JPEG;
         break;
        
       case EXS_JPEG2000LosslessOnly:
       case EXS_JPEG2000:
-        mime = "image/jp2";
+        mime = MIME_JPEG2000;
         break;
 
       default:
-        mime = "application/octet-stream";
+        mime = MIME_BINARY;
         break;
     }
   }