comparison 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
comparison
equal deleted inserted replaced
1472:474360793956 1473:9cbc6d21ae89
22 #include "SeriesThumbnailsLoader.h" 22 #include "SeriesThumbnailsLoader.h"
23 23
24 #include <DicomFormat/DicomMap.h> 24 #include <DicomFormat/DicomMap.h>
25 #include <DicomFormat/DicomInstanceHasher.h> 25 #include <DicomFormat/DicomInstanceHasher.h>
26 #include <Images/ImageProcessing.h> 26 #include <Images/ImageProcessing.h>
27 #include <Images/JpegReader.h>
27 #include <Images/JpegWriter.h> 28 #include <Images/JpegWriter.h>
28 #include <OrthancException.h> 29 #include <OrthancException.h>
29 30
30 #include <boost/algorithm/string/predicate.hpp> 31 #include <boost/algorithm/string/predicate.hpp>
31 32
67 if (type == SeriesThumbnailType_Image) 68 if (type == SeriesThumbnailType_Image)
68 { 69 {
69 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); 70 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
70 } 71 }
71 } 72 }
73
74
75 Orthanc::ImageAccessor* SeriesThumbnailsLoader::SuccessMessage::DecodeImage() const
76 {
77 if (GetType() != SeriesThumbnailType_Image)
78 {
79 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
80 }
81
82 Orthanc::MimeType mime;
83 if (!Orthanc::LookupMimeType(mime, GetMime()))
84 {
85 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented,
86 "Unsupported MIME type for thumbnail: " + GetMime());
87 }
88
89 switch (mime)
90 {
91 case Orthanc::MimeType_Jpeg:
92 {
93 std::unique_ptr<Orthanc::JpegReader> reader(new Orthanc::JpegReader);
94 reader->ReadFromMemory(GetEncodedImage());
95 return reader.release();
96 }
97
98 default:
99 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented,
100 "Cannot decode MIME type for thumbnail: " + GetMime());
101 }
102 }
103
72 104
73 105
74 void SeriesThumbnailsLoader::AcquireThumbnail(const DicomSource& source, 106 void SeriesThumbnailsLoader::AcquireThumbnail(const DicomSource& source,
75 const std::string& studyInstanceUid, 107 const std::string& studyInstanceUid,
76 const std::string& seriesInstanceUid, 108 const std::string& seriesInstanceUid,
90 assert(found->second != NULL); 122 assert(found->second != NULL);
91 delete found->second; 123 delete found->second;
92 found->second = protection.release(); 124 found->second = protection.release();
93 } 125 }
94 126
95 ThumbnailLoadedMessage message(*this, source, studyInstanceUid, seriesInstanceUid, *thumbnail); 127 SuccessMessage message(*this, source, studyInstanceUid, seriesInstanceUid, *thumbnail);
96 BroadcastMessage(message); 128 BroadcastMessage(message);
97 } 129 }
98 130
99 131
100 class SeriesThumbnailsLoader::Handler : public Orthanc::IDynamicObject 132 class SeriesThumbnailsLoader::Handler : public Orthanc::IDynamicObject
245 } 277 }
246 278
247 virtual void HandleError() 279 virtual void HandleError()
248 { 280 {
249 // The DICOMweb wasn't able to generate a thumbnail, try to 281 // The DICOMweb wasn't able to generate a thumbnail, try to
250 // retrieve the SopClassUID tag using QIDO-RS 282 // retrieve the SopClassUID tag using a call to "/metadata"
251
252 std::map<std::string, std::string> arguments, headers;
253 arguments["0020000D"] = GetStudyInstanceUid();
254 arguments["0020000E"] = GetSeriesInstanceUid();
255 arguments["includefield"] = "00080016";
256 283
257 std::unique_ptr<IOracleCommand> command( 284 std::unique_ptr<IOracleCommand> command(
258 GetSource().CreateDicomWebCommand( 285 GetSource().CreateDicomWebCommand(
259 "/instances", arguments, headers, new DicomWebSopClassHandler( 286 "/studies/" + GetStudyInstanceUid() + "/series/" + GetSeriesInstanceUid() + "/metadata",
287 new DicomWebSopClassHandler(
260 GetLoader(), GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid()))); 288 GetLoader(), GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid())));
261 GetLoader()->Schedule(command.release()); 289 GetLoader()->Schedule(command.release());
262 } 290 }
263 }; 291 };
264 292
453 height_(128) 481 height_(128)
454 { 482 {
455 } 483 }
456 484
457 485
458 boost::shared_ptr<IObserver> SeriesThumbnailsLoader::Factory::Create(ILoadersContext::ILock& stone) 486 boost::shared_ptr<SeriesThumbnailsLoader> SeriesThumbnailsLoader::Create(ILoadersContext::ILock& stone,
459 { 487 int priority)
460 boost::shared_ptr<SeriesThumbnailsLoader> result(new SeriesThumbnailsLoader(stone.GetContext(), priority_)); 488 {
489 boost::shared_ptr<SeriesThumbnailsLoader> result(new SeriesThumbnailsLoader(stone.GetContext(), priority));
461 result->Register<GetOrthancImageCommand::SuccessMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); 490 result->Register<GetOrthancImageCommand::SuccessMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle);
462 result->Register<HttpCommand::SuccessMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); 491 result->Register<HttpCommand::SuccessMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle);
463 result->Register<OracleCommandExceptionMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); 492 result->Register<OracleCommandExceptionMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle);
464 result->Register<OrthancRestApiCommand::SuccessMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); 493 result->Register<OrthancRestApiCommand::SuccessMessage>(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle);
465 return result; 494 return result;