Mercurial > hg > orthanc
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());