# HG changeset patch # User Sebastien Jodogne # Date 1546440644 -3600 # Node ID 495c5edce708e109c5569bd9e7e9b0734b13a697 # Parent 0e9d1731b1b097c1c1ea80f77acb4fbf41db9142 new extension for database plugin SDK: lookupResources diff -r 0e9d1731b1b0 -r 495c5edce708 CMakeLists.txt --- a/CMakeLists.txt Wed Jan 02 13:44:18 2019 +0100 +++ b/CMakeLists.txt Wed Jan 02 15:50:44 2019 +0100 @@ -124,6 +124,8 @@ if (ENABLE_PLUGINS) + include_directories(${CMAKE_SOURCE_DIR}/Plugins/Include) + list(APPEND ORTHANC_SERVER_SOURCES Plugins/Engine/OrthancPluginDatabase.cpp Plugins/Engine/OrthancPlugins.cpp @@ -229,8 +231,6 @@ endif() -include_directories(${CMAKE_SOURCE_DIR}/Plugins/Include) - add_definitions( -DORTHANC_BUILD_UNIT_TESTS=1 -DORTHANC_ENABLE_LOGGING_PLUGIN=0 diff -r 0e9d1731b1b0 -r 495c5edce708 OrthancServer/Search/DatabaseConstraint.cpp --- a/OrthancServer/Search/DatabaseConstraint.cpp Wed Jan 02 13:44:18 2019 +0100 +++ b/OrthancServer/Search/DatabaseConstraint.cpp Wed Jan 02 15:50:44 2019 +0100 @@ -36,6 +36,11 @@ #include "../../Core/OrthancException.h" +#if ORTHANC_ENABLE_PLUGINS == 1 +# include "../../Plugins/Engine/PluginsEnumerations.h" +#endif + + namespace Orthanc { DatabaseConstraint::DatabaseConstraint(ResourceType level, @@ -61,6 +66,31 @@ } +#if ORTHANC_ENABLE_PLUGINS == 1 + DatabaseConstraint::DatabaseConstraint(const OrthancPluginDatabaseConstraint& constraint) : + level_(Plugins::Convert(constraint.level)), + tag_(constraint.tagGroup, constraint.tagElement), + isIdentifier_(constraint.isIdentifierTag), + constraintType_(Plugins::Convert(constraint.type)), + caseSensitive_(constraint.isCaseSensitive), + mandatory_(constraint.isMandatory) + { + if (constraintType_ != ConstraintType_List && + values_.size() != 1) + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + + values_.resize(constraint.valuesCount); + + for (uint32_t i = 0; i < constraint.valuesCount; i++) + { + values_[i].assign(constraint.values[i]); + } + } +#endif + + const std::string& DatabaseConstraint::GetValue(size_t index) const { if (index >= values_.size()) @@ -85,4 +115,29 @@ return values_[0]; } } + + +#if ORTHANC_ENABLE_PLUGINS == 1 + void DatabaseConstraint::EncodeForPlugins(OrthancPluginDatabaseConstraint& constraint, + std::vector& tmpValues) const + { + memset(&constraint, 0, sizeof(constraint)); + + constraint.level = Plugins::Convert(level_); + constraint.tagGroup = tag_.GetGroup(); + constraint.tagElement = tag_.GetElement(); + constraint.isIdentifierTag = isIdentifier_; + constraint.isCaseSensitive = caseSensitive_; + constraint.isMandatory = mandatory_; + constraint.type = Plugins::Convert(constraintType_); + constraint.valuesCount = values_.size(); + + tmpValues.resize(values_.size()); + + for (size_t i = 0; i < values_.size(); i++) + { + tmpValues[i] = values_[i].c_str(); + } + } +#endif } diff -r 0e9d1731b1b0 -r 495c5edce708 OrthancServer/Search/DatabaseConstraint.h --- a/OrthancServer/Search/DatabaseConstraint.h Wed Jan 02 13:44:18 2019 +0100 +++ b/OrthancServer/Search/DatabaseConstraint.h Wed Jan 02 15:50:44 2019 +0100 @@ -36,6 +36,10 @@ #include "../../Core/DicomFormat/DicomMap.h" #include "../ServerEnumerations.h" +#if ORTHANC_ENABLE_PLUGINS == 1 +# include "../../Plugins/Include/orthanc/OrthancCDatabasePlugin.h" +#endif + namespace Orthanc { // This class is also used by the "orthanc-databases" project @@ -58,6 +62,10 @@ const std::vector& values, bool caseSensitive, bool mandatory); + +#if ORTHANC_ENABLE_PLUGINS == 1 + DatabaseConstraint(const OrthancPluginDatabaseConstraint& constraint); +#endif ResourceType GetLevel() const { @@ -99,5 +107,10 @@ } bool IsMatch(const DicomMap& dicom) const; + +#if ORTHANC_ENABLE_PLUGINS == 1 + void EncodeForPlugins(OrthancPluginDatabaseConstraint& constraint, + std::vector& tmpValues) const; +#endif }; } diff -r 0e9d1731b1b0 -r 495c5edce708 Plugins/Engine/OrthancPluginDatabase.cpp --- a/Plugins/Engine/OrthancPluginDatabase.cpp Wed Jan 02 13:44:18 2019 +0100 +++ b/Plugins/Engine/OrthancPluginDatabase.cpp Wed Jan 02 15:50:44 2019 +0100 @@ -1129,7 +1129,7 @@ ResetAnswers(); CheckSuccess(extensions_.lookupIdentifier3(GetContext(), payload_, Plugins::Convert(level), - &tmp, Plugins::Convert(type))); + &tmp, Compatibility::Convert(type))); ForwardAnswers(result); } diff -r 0e9d1731b1b0 -r 495c5edce708 Plugins/Engine/PluginsEnumerations.cpp --- a/Plugins/Engine/PluginsEnumerations.cpp Wed Jan 02 13:44:18 2019 +0100 +++ b/Plugins/Engine/PluginsEnumerations.cpp Wed Jan 02 15:50:44 2019 +0100 @@ -43,6 +43,53 @@ namespace Orthanc { + namespace Compatibility + { + OrthancPluginIdentifierConstraint Convert(IdentifierConstraintType constraint) + { + switch (constraint) + { + case Compatibility::IdentifierConstraintType_Equal: + return OrthancPluginIdentifierConstraint_Equal; + + case Compatibility::IdentifierConstraintType_GreaterOrEqual: + return OrthancPluginIdentifierConstraint_GreaterOrEqual; + + case Compatibility::IdentifierConstraintType_SmallerOrEqual: + return OrthancPluginIdentifierConstraint_SmallerOrEqual; + + case Compatibility::IdentifierConstraintType_Wildcard: + return OrthancPluginIdentifierConstraint_Wildcard; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + } + + + IdentifierConstraintType Convert(OrthancPluginIdentifierConstraint constraint) + { + switch (constraint) + { + case OrthancPluginIdentifierConstraint_Equal: + return Compatibility::IdentifierConstraintType_Equal; + + case OrthancPluginIdentifierConstraint_GreaterOrEqual: + return Compatibility::IdentifierConstraintType_GreaterOrEqual; + + case OrthancPluginIdentifierConstraint_SmallerOrEqual: + return Compatibility::IdentifierConstraintType_SmallerOrEqual; + + case OrthancPluginIdentifierConstraint_Wildcard: + return Compatibility::IdentifierConstraintType_Wildcard; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + } + } + + namespace Plugins { OrthancPluginResourceType Convert(ResourceType type) @@ -266,50 +313,6 @@ } - OrthancPluginIdentifierConstraint Convert(Compatibility::IdentifierConstraintType constraint) - { - switch (constraint) - { - case Compatibility::IdentifierConstraintType_Equal: - return OrthancPluginIdentifierConstraint_Equal; - - case Compatibility::IdentifierConstraintType_GreaterOrEqual: - return OrthancPluginIdentifierConstraint_GreaterOrEqual; - - case Compatibility::IdentifierConstraintType_SmallerOrEqual: - return OrthancPluginIdentifierConstraint_SmallerOrEqual; - - case Compatibility::IdentifierConstraintType_Wildcard: - return OrthancPluginIdentifierConstraint_Wildcard; - - default: - throw OrthancException(ErrorCode_ParameterOutOfRange); - } - } - - - Compatibility::IdentifierConstraintType Convert(OrthancPluginIdentifierConstraint constraint) - { - switch (constraint) - { - case OrthancPluginIdentifierConstraint_Equal: - return Compatibility::IdentifierConstraintType_Equal; - - case OrthancPluginIdentifierConstraint_GreaterOrEqual: - return Compatibility::IdentifierConstraintType_GreaterOrEqual; - - case OrthancPluginIdentifierConstraint_SmallerOrEqual: - return Compatibility::IdentifierConstraintType_SmallerOrEqual; - - case OrthancPluginIdentifierConstraint_Wildcard: - return Compatibility::IdentifierConstraintType_Wildcard; - - default: - throw OrthancException(ErrorCode_ParameterOutOfRange); - } - } - - OrthancPluginInstanceOrigin Convert(RequestOrigin origin) { switch (origin) @@ -590,5 +593,55 @@ throw OrthancException(ErrorCode_ParameterOutOfRange); } } + + + OrthancPluginConstraintType Convert(ConstraintType constraint) + { + switch (constraint) + { + case ConstraintType_Equal: + return OrthancPluginConstraintType_Equal; + + case ConstraintType_GreaterOrEqual: + return OrthancPluginConstraintType_GreaterOrEqual; + + case ConstraintType_SmallerOrEqual: + return OrthancPluginConstraintType_SmallerOrEqual; + + case ConstraintType_Wildcard: + return OrthancPluginConstraintType_Wildcard; + + case ConstraintType_List: + return OrthancPluginConstraintType_List; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + } + + + ConstraintType Convert(OrthancPluginConstraintType constraint) + { + switch (constraint) + { + case OrthancPluginConstraintType_Equal: + return ConstraintType_Equal; + + case OrthancPluginConstraintType_GreaterOrEqual: + return ConstraintType_GreaterOrEqual; + + case OrthancPluginConstraintType_SmallerOrEqual: + return ConstraintType_SmallerOrEqual; + + case OrthancPluginConstraintType_Wildcard: + return ConstraintType_Wildcard; + + case OrthancPluginConstraintType_List: + return ConstraintType_List; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + } } } diff -r 0e9d1731b1b0 -r 495c5edce708 Plugins/Engine/PluginsEnumerations.h --- a/Plugins/Engine/PluginsEnumerations.h Wed Jan 02 13:44:18 2019 +0100 +++ b/Plugins/Engine/PluginsEnumerations.h Wed Jan 02 15:50:44 2019 +0100 @@ -41,6 +41,13 @@ namespace Orthanc { + namespace Compatibility + { + OrthancPluginIdentifierConstraint Convert(IdentifierConstraintType constraint); + + IdentifierConstraintType Convert(OrthancPluginIdentifierConstraint constraint); + } + namespace Plugins { OrthancPluginResourceType Convert(ResourceType type); @@ -59,10 +66,6 @@ DicomToJsonFormat Convert(OrthancPluginDicomToJsonFormat format); - OrthancPluginIdentifierConstraint Convert(Compatibility::IdentifierConstraintType constraint); - - Compatibility::IdentifierConstraintType Convert(OrthancPluginIdentifierConstraint constraint); - OrthancPluginInstanceOrigin Convert(RequestOrigin origin); OrthancPluginHttpMethod Convert(HttpMethod method); @@ -74,6 +77,10 @@ OrthancPluginJobStepStatus Convert(JobStepCode step); JobStepCode Convert(OrthancPluginJobStepStatus step); + + OrthancPluginConstraintType Convert(ConstraintType constraint); + + ConstraintType Convert(OrthancPluginConstraintType constraint); } } diff -r 0e9d1731b1b0 -r 495c5edce708 Plugins/Include/orthanc/OrthancCDatabasePlugin.h --- a/Plugins/Include/orthanc/OrthancCDatabasePlugin.h Wed Jan 02 13:44:18 2019 +0100 +++ b/Plugins/Include/orthanc/OrthancCDatabasePlugin.h Wed Jan 02 15:50:44 2019 +0100 @@ -75,6 +75,7 @@ _OrthancPluginDatabaseAnswerType_Int64 = 15, _OrthancPluginDatabaseAnswerType_Resource = 16, _OrthancPluginDatabaseAnswerType_String = 17, + _OrthancPluginDatabaseAnswerType_MatchingResource = 18, /* New in Orthanc 1.5.2 */ _OrthancPluginDatabaseAnswerType_INTERNAL = 0x7fffffff } _OrthancPluginDatabaseAnswerType; @@ -120,6 +121,25 @@ const char* sopInstanceUid; } OrthancPluginExportedResource; + typedef struct + { + OrthancPluginResourceType level; + uint16_t tagGroup; + uint16_t tagElement; + uint8_t isIdentifierTag; + uint8_t isCaseSensitive; + uint8_t isMandatory; + OrthancPluginConstraintType type; + uint32_t valuesCount; + const char* const* values; + } OrthancPluginDatabaseConstraint; + + typedef struct + { + const char* resourceId; + const char* someInstanceId; /* Can be NULL if not requested */ + } OrthancPluginMatchingResource; + typedef struct { @@ -272,6 +292,19 @@ context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, ¶ms); } + ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerMatchingResource( + OrthancPluginContext* context, + OrthancPluginDatabaseContext* database, + const OrthancPluginMatchingResource* match) + { + _OrthancPluginDatabaseAnswer params; + memset(¶ms, 0, sizeof(params)); + params.database = database; + params.type = _OrthancPluginDatabaseAnswerType_MatchingResource; + params.valueGeneric = match; + context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, ¶ms); + } + ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseSignalDeletedAttachment( OrthancPluginContext* context, OrthancPluginDatabaseContext* database, @@ -694,6 +727,24 @@ uint16_t element, const char* start, const char* end); + + + /** + * Extensions since Orthanc 1.5.2 + **/ + + /* Ouput: Use OrthancPluginDatabaseAnswerMatchingResource */ + OrthancPluginErrorCode (*lookupResources) ( + /* outputs */ + OrthancPluginDatabaseContext* context, + /* inputs */ + void* payload, + uint32_t constraintsCount, + const OrthancPluginDatabaseConstraint* const* constraints, + OrthancPluginResourceType queryLevel, + uint32_t limit, + uint8_t requestSomeInstance); + } OrthancPluginDatabaseExtensions; /*