Mercurial > hg > orthanc-dicomweb
changeset 175:8d306c53f547
sync
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 14 Dec 2016 16:44:20 +0100 |
parents | ac2adc1afd3c |
children | ae79d443f780 |
files | Orthanc/Core/Enumerations.cpp Orthanc/Core/OrthancException.h Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.h |
diffstat | 4 files changed, 188 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/Orthanc/Core/Enumerations.cpp Tue Nov 29 13:46:27 2016 +0100 +++ b/Orthanc/Core/Enumerations.cpp Wed Dec 14 16:44:20 2016 +0100 @@ -1083,15 +1083,18 @@ bool GetDicomEncoding(Encoding& encoding, const char* specificCharacterSet) { - std::string s = specificCharacterSet; + std::string s = Toolbox::StripSpaces(specificCharacterSet); Toolbox::ToUpperCase(s); // http://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.12.1.1.2 // https://github.com/dcm4che/dcm4che/blob/master/dcm4che-core/src/main/java/org/dcm4che3/data/SpecificCharacterSet.java if (s == "ISO_IR 6" || - s == "ISO_IR 192" || s == "ISO 2022 IR 6") { + encoding = Encoding_Ascii; + } + else if (s == "ISO_IR 192") + { encoding = Encoding_Utf8; } else if (s == "ISO_IR 100" || @@ -1238,8 +1241,10 @@ // http://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.12.1.1.2 switch (encoding) { + case Encoding_Ascii: + return "ISO_IR 6"; + case Encoding_Utf8: - case Encoding_Ascii: return "ISO_IR 192"; case Encoding_Latin1:
--- a/Orthanc/Core/OrthancException.h Tue Nov 29 13:46:27 2016 +0100 +++ b/Orthanc/Core/OrthancException.h Wed Dec 14 16:44:20 2016 +0100 @@ -45,7 +45,7 @@ HttpStatus httpStatus_; public: - OrthancException(ErrorCode errorCode) : + explicit OrthancException(ErrorCode errorCode) : errorCode_(errorCode), httpStatus_(ConvertErrorCodeToHttpStatus(errorCode)) {
--- a/Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp Tue Nov 29 13:46:27 2016 +0100 +++ b/Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp Wed Dec 14 16:44:20 2016 +0100 @@ -276,11 +276,24 @@ } - OrthancString::OrthancString(OrthancPluginContext* context, - char* str) : - context_(context), - str_(str) + void MemoryBuffer::GetDicomQuery(const OrthancPluginWorklistQuery* query) + { + Clear(); + Check(OrthancPluginWorklistGetDicomQuery(context_, &buffer_, query)); + } + + + void OrthancString::Assign(char* str) { + if (str == NULL) + { + ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_InternalError); + } + else + { + Clear(); + str_ = str; + } } @@ -322,12 +335,25 @@ ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat); } } + + + void MemoryBuffer::DicomToJson(Json::Value& target, + OrthancPluginDicomToJsonFormat format, + OrthancPluginDicomToJsonFlags flags, + uint32_t maxStringLength) + { + OrthancString str(context_); + str.Assign(OrthancPluginDicomBufferToJson(context_, GetData(), GetSize(), format, flags, maxStringLength)); + str.ToJson(target); + } + OrthancConfiguration::OrthancConfiguration(OrthancPluginContext* context) : context_(context) { - OrthancString str(context, OrthancPluginGetConfiguration(context)); + OrthancString str(context); + str.Assign(OrthancPluginGetConfiguration(context)); if (str.GetContent() == NULL) { @@ -809,6 +835,83 @@ } + +#if HAS_ORTHANC_PLUGIN_FIND_MATCHER == 1 + FindMatcher::FindMatcher(OrthancPluginContext* context, + const OrthancPluginWorklistQuery* worklist) : + context_(context), + matcher_(NULL), + worklist_(worklist) + { + if (worklist_ == NULL) + { + ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_ParameterOutOfRange); + } + } + + + void FindMatcher::SetupDicom(OrthancPluginContext* context, + const void* query, + uint32_t size) + { + context_ = context; + worklist_ = NULL; + + matcher_ = OrthancPluginCreateFindMatcher(context_, query, size); + if (matcher_ == NULL) + { + ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_InternalError); + } + } + + + FindMatcher::~FindMatcher() + { + // The "worklist_" field + + if (matcher_ != NULL) + { + OrthancPluginFreeFindMatcher(context_, matcher_); + } + } + + + + bool FindMatcher::IsMatch(const void* dicom, + uint32_t size) const + { + int32_t result; + + if (matcher_ != NULL) + { + result = OrthancPluginFindMatcherIsMatch(context_, matcher_, dicom, size); + } + else if (worklist_ != NULL) + { + result = OrthancPluginWorklistIsMatch(context_, worklist_, dicom, size); + } + else + { + ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_InternalError); + } + + if (result == 0) + { + return false; + } + else if (result == 1) + { + return true; + } + else + { + ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_InternalError); + } + } + +#endif /* HAS_ORTHANC_PLUGIN_FIND_MATCHER == 1 */ + + bool RestApiGet(Json::Value& result, OrthancPluginContext* context, const std::string& uri,
--- a/Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.h Tue Nov 29 13:46:27 2016 +0100 +++ b/Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.h Wed Dec 14 16:44:20 2016 +0100 @@ -50,6 +50,17 @@ #endif +#if (ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER >= 2 || \ + (ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER == 1 && \ + ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER >= 2)) +// The "OrthancPluginFindMatcher()" primitive was introduced in Orthanc 1.2.0 +# define HAS_ORTHANC_PLUGIN_FIND_MATCHER 1 +#else +# define HAS_ORTHANC_PLUGIN_FIND_MATCHER 0 +#endif + + + namespace OrthancPlugins { @@ -172,6 +183,13 @@ OrthancPluginCreateDicomFlags flags); void ReadFile(const std::string& path); + + void GetDicomQuery(const OrthancPluginWorklistQuery* query); + + void DicomToJson(Json::Value& target, + OrthancPluginDicomToJsonFormat format, + OrthancPluginDicomToJsonFlags flags, + uint32_t maxStringLength); }; @@ -181,16 +199,23 @@ OrthancPluginContext* context_; char* str_; + void Clear(); + public: - OrthancString(OrthancPluginContext* context, - char* str); + OrthancString(OrthancPluginContext* context) : + context_(context), + str_(NULL) + { + } ~OrthancString() { Clear(); } - void Clear(); + // This transfers ownership, warning: The string must have been + // allocated by the Orthanc core + void Assign(char* str); const char* GetContent() const { @@ -262,7 +287,7 @@ float defaultValue) const; }; - class OrthancImage + class OrthancImage : public boost::noncopyable { private: OrthancPluginContext* context_; @@ -320,6 +345,48 @@ }; +#if HAS_ORTHANC_PLUGIN_FIND_MATCHER == 1 + class FindMatcher : public boost::noncopyable + { + private: + OrthancPluginContext* context_; + OrthancPluginFindMatcher* matcher_; + const OrthancPluginWorklistQuery* worklist_; + + void SetupDicom(OrthancPluginContext* context, + const void* query, + uint32_t size); + + public: + FindMatcher(OrthancPluginContext* context, + const OrthancPluginWorklistQuery* worklist); + + FindMatcher(OrthancPluginContext* context, + const void* query, + uint32_t size) + { + SetupDicom(context, query, size); + } + + FindMatcher(OrthancPluginContext* context, + const MemoryBuffer& dicom) + { + SetupDicom(context, dicom.GetData(), dicom.GetSize()); + } + + ~FindMatcher(); + + bool IsMatch(const void* dicom, + uint32_t size) const; + + bool IsMatch(const MemoryBuffer& dicom) const + { + return IsMatch(dicom.GetData(), dicom.GetSize()); + } + }; +#endif + + bool RestApiGet(Json::Value& result, OrthancPluginContext* context, const std::string& uri,