diff Framework/Loaders/SeriesThumbnailsLoader.cpp @ 1473:9cbc6d21ae89

SeriesThumbnailsLoader::SuccessMessage::DecodeImage(), fix static builds
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 15 Jun 2020 18:02:49 +0200
parents 30deba7bc8e2
children 4db187d29731
line wrap: on
line diff
--- a/Framework/Loaders/SeriesThumbnailsLoader.cpp	Mon Jun 15 16:26:57 2020 +0200
+++ b/Framework/Loaders/SeriesThumbnailsLoader.cpp	Mon Jun 15 18:02:49 2020 +0200
@@ -24,6 +24,7 @@
 #include <DicomFormat/DicomMap.h>
 #include <DicomFormat/DicomInstanceHasher.h>
 #include <Images/ImageProcessing.h>
+#include <Images/JpegReader.h>
 #include <Images/JpegWriter.h>
 #include <OrthancException.h>
 
@@ -71,6 +72,37 @@
   }
 
 
+  Orthanc::ImageAccessor* SeriesThumbnailsLoader::SuccessMessage::DecodeImage() const
+  {
+    if (GetType() != SeriesThumbnailType_Image)
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
+    }
+
+    Orthanc::MimeType mime;
+    if (!Orthanc::LookupMimeType(mime, GetMime()))
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented,
+                                      "Unsupported MIME type for thumbnail: " + GetMime());
+    }
+
+    switch (mime)
+    {
+      case Orthanc::MimeType_Jpeg:
+      {
+        std::unique_ptr<Orthanc::JpegReader> reader(new Orthanc::JpegReader);
+        reader->ReadFromMemory(GetEncodedImage());
+        return reader.release();
+      }
+
+      default:
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented,
+                                        "Cannot decode MIME type for thumbnail: " + GetMime());
+    }
+  }
+
+
+
   void SeriesThumbnailsLoader::AcquireThumbnail(const DicomSource& source,
                                                 const std::string& studyInstanceUid,
                                                 const std::string& seriesInstanceUid,
@@ -92,7 +124,7 @@
       found->second = protection.release();
     }
 
-    ThumbnailLoadedMessage message(*this, source, studyInstanceUid, seriesInstanceUid, *thumbnail);
+    SuccessMessage message(*this, source, studyInstanceUid, seriesInstanceUid, *thumbnail);
     BroadcastMessage(message);
   }
 
@@ -247,16 +279,12 @@
     virtual void HandleError()
     {
       // The DICOMweb wasn't able to generate a thumbnail, try to
-      // retrieve the SopClassUID tag using QIDO-RS
-
-      std::map<std::string, std::string> arguments, headers;
-      arguments["0020000D"] = GetStudyInstanceUid();
-      arguments["0020000E"] = GetSeriesInstanceUid();
-      arguments["includefield"] = "00080016";
+      // retrieve the SopClassUID tag using a call to "/metadata"
 
       std::unique_ptr<IOracleCommand> command(
         GetSource().CreateDicomWebCommand(
-          "/instances", arguments, headers, new DicomWebSopClassHandler(
+          "/studies/" + GetStudyInstanceUid() + "/series/" + GetSeriesInstanceUid() + "/metadata",
+          new DicomWebSopClassHandler(
             GetLoader(), GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid())));
       GetLoader()->Schedule(command.release());
     }
@@ -455,9 +483,10 @@
   }
     
   
-  boost::shared_ptr<IObserver> SeriesThumbnailsLoader::Factory::Create(ILoadersContext::ILock& stone)
+  boost::shared_ptr<SeriesThumbnailsLoader> SeriesThumbnailsLoader::Create(ILoadersContext::ILock& stone,
+                                                                           int priority)
   {
-    boost::shared_ptr<SeriesThumbnailsLoader> result(new SeriesThumbnailsLoader(stone.GetContext(), priority_));
+    boost::shared_ptr<SeriesThumbnailsLoader> result(new SeriesThumbnailsLoader(stone.GetContext(), priority));
     result->Register<GetOrthancImageCommand::SuccessMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle);
     result->Register<HttpCommand::SuccessMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle);
     result->Register<OracleCommandExceptionMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle);