Mercurial > hg > orthanc
diff Plugins/Engine/OrthancPlugins.cpp @ 2827:d4fd4614f275
IncomingWorklistRequestFilter() to filter incoming C-FIND worklist queries
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 19 Sep 2018 21:10:49 +0200 |
parents | 807169f85ba9 |
children | 7133ad478eea |
line wrap: on
line diff
--- a/Plugins/Engine/OrthancPlugins.cpp Wed Sep 19 16:06:41 2018 +0200 +++ b/Plugins/Engine/OrthancPlugins.cpp Wed Sep 19 21:10:49 2018 +0200 @@ -62,6 +62,7 @@ #include "../../Core/Images/JpegWriter.h" #include "../../Core/Images/ImageProcessing.h" #include "../../OrthancServer/DefaultDicomImageDecoder.h" +#include "../../OrthancServer/OrthancFindRequestHandler.h" #include "PluginsEnumerations.h" #include "PluginsJob.h" @@ -454,11 +455,13 @@ private: OrthancPlugins& that_; std::auto_ptr<HierarchicalMatcher> matcher_; + std::auto_ptr<ParsedDicomFile> filtered_; ParsedDicomFile* currentQuery_; void Reset() { - matcher_.reset(NULL); + matcher_.reset(); + filtered_.reset(); currentQuery_ = NULL; } @@ -475,12 +478,41 @@ const std::string& calledAet, ModalityManufacturer manufacturer) { + static const char* LUA_CALLBACK = "IncomingWorklistRequestFilter"; + + { + PImpl::ServerContextLock lock(*that_.pimpl_); + LuaScripting::Lock lua(lock.GetContext().GetLuaScripting()); + + if (!lua.GetLua().IsExistingFunction(LUA_CALLBACK)) + { + currentQuery_ = &query; + } + else + { + Json::Value source, origin; + query.DatasetToJson(source, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0); + + OrthancFindRequestHandler::FormatOrigin + (origin, remoteIp, remoteAet, calledAet, manufacturer); + + LuaFunctionCall call(lua.GetLua(), LUA_CALLBACK); + call.PushJson(source); + call.PushJson(origin); + + Json::Value target; + call.ExecuteToJson(target, true); + + filtered_.reset(ParsedDicomFile::CreateFromJson(target, DicomFromJsonFlags_None)); + currentQuery_ = filtered_.get(); + } + } + + matcher_.reset(new HierarchicalMatcher(*currentQuery_)); + { boost::mutex::scoped_lock lock(that_.pimpl_->worklistCallbackMutex_); - matcher_.reset(new HierarchicalMatcher(query)); - currentQuery_ = &query; - if (that_.pimpl_->worklistCallback_) { OrthancPluginErrorCode error = that_.pimpl_->worklistCallback_