diff OrthancServer/DicomProtocol/DicomFindAnswers.cpp @ 2207:6dc3bdb4088b

Fix handling of encodings in C-FIND for worklists
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 09 Dec 2016 11:24:04 +0100
parents 9b373b7d6713
children a3a65de1840f
line wrap: on
line diff
--- a/OrthancServer/DicomProtocol/DicomFindAnswers.cpp	Thu Dec 08 16:29:34 2016 +0100
+++ b/OrthancServer/DicomProtocol/DicomFindAnswers.cpp	Fri Dec 09 11:24:04 2016 +0100
@@ -33,8 +33,8 @@
 #include "../PrecompiledHeadersServer.h"
 #include "DicomFindAnswers.h"
 
+#include "../OrthancInitialization.h"
 #include "../FromDcmtkBridge.h"
-#include "../ToDcmtkBridge.h"
 #include "../../Core/OrthancException.h"
 
 #include <memory>
@@ -44,72 +44,42 @@
 
 namespace Orthanc
 {
-  class DicomFindAnswers::Answer : public boost::noncopyable
+  void DicomFindAnswers::AddAnswerInternal(ParsedDicomFile* answer)
   {
-  private:
-    ParsedDicomFile* dicom_;
-    DicomMap*        map_;
+    std::auto_ptr<ParsedDicomFile> protection(answer);
 
-    void CleanupDicom(bool isWorklist)
+    if (isWorklist_)
     {
-      if (isWorklist &&
-          dicom_ != NULL)
-      {
-        // These lines are necessary when serving worklists, otherwise
-        // Orthanc does not behave as "wlmscpfs"
-        dicom_->Remove(DICOM_TAG_MEDIA_STORAGE_SOP_INSTANCE_UID);
-        dicom_->Remove(DICOM_TAG_SOP_INSTANCE_UID);
-      }
-    }
-
-  public:
-    Answer(bool isWorklist,
-           ParsedDicomFile& dicom) : 
-      dicom_(dicom.Clone()),
-      map_(NULL)
-    {
-      CleanupDicom(isWorklist);
+      // These lines are necessary when serving worklists, otherwise
+      // Orthanc does not behave as "wlmscpfs"
+      protection->Remove(DICOM_TAG_MEDIA_STORAGE_SOP_INSTANCE_UID);
+      protection->Remove(DICOM_TAG_SOP_INSTANCE_UID);
     }
 
-    Answer(bool isWorklist,
-           const void* dicom,
-           size_t size) : 
-      dicom_(new ParsedDicomFile(dicom, size)),
-      map_(NULL)
+    protection->ChangeEncoding(encoding_);
+
+    answers_.push_back(protection.release());
+  }
+
+
+  DicomFindAnswers::DicomFindAnswers(bool isWorklist) : 
+    encoding_(Configuration::GetDefaultEncoding()),
+    isWorklist_(isWorklist),
+    complete_(true)
+  {
+  }
+
+
+  void DicomFindAnswers::SetEncoding(Encoding encoding)
+  {
+    for (size_t i = 0; i < answers_.size(); i++)
     {
-      CleanupDicom(isWorklist);
-    }
-
-    Answer(const DicomMap& map) : 
-      dicom_(NULL),
-      map_(map.Clone())
-    {
+      assert(answers_[i] != NULL);
+      answers_[i]->ChangeEncoding(encoding);
     }
 
-    ~Answer()
-    {
-      if (dicom_ != NULL)
-      {
-        delete dicom_;
-      }
-
-      if (map_ != NULL)
-      {
-        delete map_;
-      }
-    }
-
-    ParsedDicomFile& GetDicomFile()
-    {
-      if (dicom_ == NULL)
-      {
-        assert(map_ != NULL);
-        dicom_ = new ParsedDicomFile(*map_);
-      }
-
-      return *dicom_;
-    }
-  };
+    encoding_ = encoding;
+  }
 
 
   void DicomFindAnswers::SetWorklist(bool isWorklist)
@@ -149,28 +119,27 @@
 
   void DicomFindAnswers::Add(const DicomMap& map)
   {
-    answers_.push_back(new Answer(map));
+    AddAnswerInternal(new ParsedDicomFile(map, encoding_));
   }
 
 
   void DicomFindAnswers::Add(ParsedDicomFile& dicom)
   {
-    answers_.push_back(new Answer(isWorklist_, dicom));
+    AddAnswerInternal(dicom.Clone());
   }
 
-
   void DicomFindAnswers::Add(const void* dicom,
                              size_t size)
   {
-    answers_.push_back(new Answer(isWorklist_, dicom, size));
+    AddAnswerInternal(new ParsedDicomFile(dicom, size));
   }
 
 
-  DicomFindAnswers::Answer& DicomFindAnswers::GetAnswerInternal(size_t index) const
+  ParsedDicomFile& DicomFindAnswers::GetAnswer(size_t index) const
   {
     if (index < answers_.size())
     {
-      return *answers_.at(index);
+      return *answers_[index];
     }
     else
     {
@@ -179,12 +148,6 @@
   }
 
 
-  ParsedDicomFile& DicomFindAnswers::GetAnswer(size_t index) const
-  {
-    return GetAnswerInternal(index).GetDicomFile();
-  }
-
-
   DcmDataset* DicomFindAnswers::ExtractDcmDataset(size_t index) const
   {
     return new DcmDataset(*GetAnswer(index).GetDcmtkObject().getDataset());