# HG changeset patch # User Sebastien Jodogne # Date 1467309741 -7200 # Node ID 8e67325eaa3fc7bf2d77e08c3bed8f80f12861b4 # Parent 43cd2ab060c7bd7d96beb6fa257bc82e26dd246d fix diff -r 43cd2ab060c7 -r 8e67325eaa3f OrthancServer/DicomProtocol/DicomFindAnswers.cpp --- a/OrthancServer/DicomProtocol/DicomFindAnswers.cpp Thu Jun 30 08:20:23 2016 +0200 +++ b/OrthancServer/DicomProtocol/DicomFindAnswers.cpp Thu Jun 30 20:02:21 2016 +0200 @@ -50,29 +50,34 @@ ParsedDicomFile* dicom_; DicomMap* map_; - void CleanupDicom() + void CleanupDicom(bool isWorklist) { - if (dicom_ != NULL) + 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(ParsedDicomFile& dicom) : + Answer(bool isWorklist, + ParsedDicomFile& dicom) : dicom_(dicom.Clone()), map_(NULL) { - CleanupDicom(); + CleanupDicom(isWorklist); } - Answer(const void* dicom, + Answer(bool isWorklist, + const void* dicom, size_t size) : dicom_(new ParsedDicomFile(dicom, size)), map_(NULL) { - CleanupDicom(); + CleanupDicom(isWorklist); } Answer(const DicomMap& map) : @@ -120,6 +125,20 @@ }; + void DicomFindAnswers::SetWorklist(bool isWorklist) + { + if (answers_.empty()) + { + isWorklist_ = isWorklist; + } + else + { + // This set of answers is not empty anymore, cannot change its type + throw OrthancException(ErrorCode_BadSequenceOfCalls); + } + } + + void DicomFindAnswers::Clear() { for (size_t i = 0; i < answers_.size(); i++) @@ -149,14 +168,14 @@ void DicomFindAnswers::Add(ParsedDicomFile& dicom) { - answers_.push_back(new Answer(dicom)); + answers_.push_back(new Answer(isWorklist_, dicom)); } void DicomFindAnswers::Add(const void* dicom, size_t size) { - answers_.push_back(new Answer(dicom, size)); + answers_.push_back(new Answer(isWorklist_, dicom, size)); } diff -r 43cd2ab060c7 -r 8e67325eaa3f OrthancServer/DicomProtocol/DicomFindAnswers.h --- a/OrthancServer/DicomProtocol/DicomFindAnswers.h Thu Jun 30 08:20:23 2016 +0200 +++ b/OrthancServer/DicomProtocol/DicomFindAnswers.h Thu Jun 30 20:02:21 2016 +0200 @@ -41,13 +41,16 @@ private: class Answer; + bool isWorklist_; std::vector answers_; bool complete_; Answer& GetAnswerInternal(size_t index) const; public: - DicomFindAnswers() : complete_(true) + DicomFindAnswers(bool isWorklist) : + isWorklist_(isWorklist), + complete_(true) { } @@ -56,6 +59,13 @@ Clear(); } + void SetWorklist(bool isWorklist); + + bool IsWorklist() const + { + return isWorklist_; + } + void Clear(); void Reserve(size_t index); diff -r 43cd2ab060c7 -r 8e67325eaa3f OrthancServer/Internals/FindScp.cpp --- a/OrthancServer/Internals/FindScp.cpp Thu Jun 30 08:20:23 2016 +0200 +++ b/OrthancServer/Internals/FindScp.cpp Thu Jun 30 20:02:21 2016 +0200 @@ -103,6 +103,10 @@ const std::string* remoteIp_; const std::string* remoteAet_; const std::string* calledAet_; + + FindScpData() : answers_(false) + { + } }; @@ -132,6 +136,8 @@ { if (sopClassUid == UID_FINDModalityWorklistInformationModel) { + data.answers_.SetWorklist(true); + if (data.worklistHandler_ != NULL) { ParsedDicomFile query(*requestIdentifiers); @@ -147,6 +153,8 @@ } else { + data.answers_.SetWorklist(false); + if (data.findHandler_ != NULL) { std::list sequencesToReturn; diff -r 43cd2ab060c7 -r 8e67325eaa3f OrthancServer/OrthancRestApi/OrthancRestModalities.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp Thu Jun 30 08:20:23 2016 +0200 +++ b/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp Thu Jun 30 20:02:21 2016 +0200 @@ -178,7 +178,7 @@ RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); - DicomFindAnswers answers; + DicomFindAnswers answers(false); FindPatient(answers, locker.GetConnection(), fields); Json::Value result; @@ -208,7 +208,7 @@ RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); - DicomFindAnswers answers; + DicomFindAnswers answers(false); FindStudy(answers, locker.GetConnection(), fields); Json::Value result; @@ -239,7 +239,7 @@ RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); - DicomFindAnswers answers; + DicomFindAnswers answers(false); FindSeries(answers, locker.GetConnection(), fields); Json::Value result; @@ -271,7 +271,7 @@ RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); - DicomFindAnswers answers; + DicomFindAnswers answers(false); FindInstance(answers, locker.GetConnection(), fields); Json::Value result; @@ -308,7 +308,7 @@ RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); - DicomFindAnswers patients; + DicomFindAnswers patients(false); FindPatient(patients, locker.GetConnection(), m); // Loop over the found patients @@ -326,7 +326,7 @@ CopyTagIfExists(m, patients.GetAnswer(i), DICOM_TAG_PATIENT_ID); - DicomFindAnswers studies; + DicomFindAnswers studies(false); FindStudy(studies, locker.GetConnection(), m); patient["Studies"] = Json::arrayValue; @@ -346,7 +346,7 @@ CopyTagIfExists(m, studies.GetAnswer(j), DICOM_TAG_PATIENT_ID); CopyTagIfExists(m, studies.GetAnswer(j), DICOM_TAG_STUDY_INSTANCE_UID); - DicomFindAnswers series; + DicomFindAnswers series(false); FindSeries(series, locker.GetConnection(), m); // Loop over the found series @@ -979,7 +979,7 @@ std::auto_ptr query(ParsedDicomFile::CreateFromJson(json, static_cast(0))); - DicomFindAnswers answers; + DicomFindAnswers answers(true); { ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); diff -r 43cd2ab060c7 -r 8e67325eaa3f OrthancServer/QueryRetrieveHandler.cpp --- a/OrthancServer/QueryRetrieveHandler.cpp Thu Jun 30 08:20:23 2016 +0200 +++ b/OrthancServer/QueryRetrieveHandler.cpp Thu Jun 30 20:02:21 2016 +0200 @@ -60,7 +60,8 @@ context_(context), localAet_(context.GetDefaultLocalApplicationEntityTitle()), done_(false), - level_(ResourceType_Study) + level_(ResourceType_Study), + answers_(false) { } diff -r 43cd2ab060c7 -r 8e67325eaa3f Plugins/Samples/Common/OrthancPluginCppWrapper.cpp --- a/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp Thu Jun 30 08:20:23 2016 +0200 +++ b/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp Thu Jun 30 20:02:21 2016 +0200 @@ -51,6 +51,15 @@ } } + + void PluginException::Check(OrthancPluginErrorCode code) + { + if (code != OrthancPluginErrorCode_Success) + { + throw PluginException(code); + } + } + MemoryBuffer::MemoryBuffer(OrthancPluginContext* context) : context_(context) @@ -233,6 +242,18 @@ } + void MemoryBuffer::CreateDicom(const Json::Value& tags, + OrthancPluginCreateDicomFlags flags) + { + Clear(); + + Json::FastWriter writer; + std::string s = writer.write(tags); + + PluginException::Check(OrthancPluginCreateDicom(context_, &buffer_, s.c_str(), NULL, flags)); + } + + OrthancString::OrthancString(OrthancPluginContext* context, char* str) : context_(context), diff -r 43cd2ab060c7 -r 8e67325eaa3f Plugins/Samples/Common/OrthancPluginCppWrapper.h --- a/Plugins/Samples/Common/OrthancPluginCppWrapper.h Thu Jun 30 08:20:23 2016 +0200 +++ b/Plugins/Samples/Common/OrthancPluginCppWrapper.h Thu Jun 30 20:02:21 2016 +0200 @@ -65,6 +65,8 @@ } const char* GetErrorDescription(OrthancPluginContext* context) const; + + static void Check(OrthancPluginErrorCode code); }; @@ -147,6 +149,9 @@ { return RestApiPut(uri, body.empty() ? NULL : body.c_str(), body.size(), applyPlugins); } + + void CreateDicom(const Json::Value& tags, + OrthancPluginCreateDicomFlags flags); }; @@ -355,19 +360,28 @@ inline void LogError(OrthancPluginContext* context, const std::string& message) { - OrthancPluginLogError(context, message.c_str()); + if (context != NULL) + { + OrthancPluginLogError(context, message.c_str()); + } } inline void LogWarning(OrthancPluginContext* context, const std::string& message) { - OrthancPluginLogWarning(context, message.c_str()); + if (context != NULL) + { + OrthancPluginLogWarning(context, message.c_str()); + } } inline void LogInfo(OrthancPluginContext* context, const std::string& message) { - OrthancPluginLogInfo(context, message.c_str()); + if (context != NULL) + { + OrthancPluginLogInfo(context, message.c_str()); + } } diff -r 43cd2ab060c7 -r 8e67325eaa3f UnitTestsSources/FromDcmtkTests.cpp --- a/UnitTestsSources/FromDcmtkTests.cpp Thu Jun 30 08:20:23 2016 +0200 +++ b/UnitTestsSources/FromDcmtkTests.cpp Thu Jun 30 20:02:21 2016 +0200 @@ -687,7 +687,7 @@ TEST(DicomFindAnswers, Basic) { - DicomFindAnswers a; + DicomFindAnswers a(false); { DicomMap m;