comparison 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
comparison
equal deleted inserted replaced
2826:c277e0421200 2827:d4fd4614f275
60 #include "../../Core/Images/PngWriter.h" 60 #include "../../Core/Images/PngWriter.h"
61 #include "../../Core/Images/JpegReader.h" 61 #include "../../Core/Images/JpegReader.h"
62 #include "../../Core/Images/JpegWriter.h" 62 #include "../../Core/Images/JpegWriter.h"
63 #include "../../Core/Images/ImageProcessing.h" 63 #include "../../Core/Images/ImageProcessing.h"
64 #include "../../OrthancServer/DefaultDicomImageDecoder.h" 64 #include "../../OrthancServer/DefaultDicomImageDecoder.h"
65 #include "../../OrthancServer/OrthancFindRequestHandler.h"
65 #include "PluginsEnumerations.h" 66 #include "PluginsEnumerations.h"
66 #include "PluginsJob.h" 67 #include "PluginsJob.h"
67 68
68 #include <boost/regex.hpp> 69 #include <boost/regex.hpp>
69 #include <dcmtk/dcmdata/dcdict.h> 70 #include <dcmtk/dcmdata/dcdict.h>
452 class OrthancPlugins::WorklistHandler : public IWorklistRequestHandler 453 class OrthancPlugins::WorklistHandler : public IWorklistRequestHandler
453 { 454 {
454 private: 455 private:
455 OrthancPlugins& that_; 456 OrthancPlugins& that_;
456 std::auto_ptr<HierarchicalMatcher> matcher_; 457 std::auto_ptr<HierarchicalMatcher> matcher_;
458 std::auto_ptr<ParsedDicomFile> filtered_;
457 ParsedDicomFile* currentQuery_; 459 ParsedDicomFile* currentQuery_;
458 460
459 void Reset() 461 void Reset()
460 { 462 {
461 matcher_.reset(NULL); 463 matcher_.reset();
464 filtered_.reset();
462 currentQuery_ = NULL; 465 currentQuery_ = NULL;
463 } 466 }
464 467
465 public: 468 public:
466 WorklistHandler(OrthancPlugins& that) : that_(that) 469 WorklistHandler(OrthancPlugins& that) : that_(that)
473 const std::string& remoteIp, 476 const std::string& remoteIp,
474 const std::string& remoteAet, 477 const std::string& remoteAet,
475 const std::string& calledAet, 478 const std::string& calledAet,
476 ModalityManufacturer manufacturer) 479 ModalityManufacturer manufacturer)
477 { 480 {
481 static const char* LUA_CALLBACK = "IncomingWorklistRequestFilter";
482
483 {
484 PImpl::ServerContextLock lock(*that_.pimpl_);
485 LuaScripting::Lock lua(lock.GetContext().GetLuaScripting());
486
487 if (!lua.GetLua().IsExistingFunction(LUA_CALLBACK))
488 {
489 currentQuery_ = &query;
490 }
491 else
492 {
493 Json::Value source, origin;
494 query.DatasetToJson(source, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
495
496 OrthancFindRequestHandler::FormatOrigin
497 (origin, remoteIp, remoteAet, calledAet, manufacturer);
498
499 LuaFunctionCall call(lua.GetLua(), LUA_CALLBACK);
500 call.PushJson(source);
501 call.PushJson(origin);
502
503 Json::Value target;
504 call.ExecuteToJson(target, true);
505
506 filtered_.reset(ParsedDicomFile::CreateFromJson(target, DicomFromJsonFlags_None));
507 currentQuery_ = filtered_.get();
508 }
509 }
510
511 matcher_.reset(new HierarchicalMatcher(*currentQuery_));
512
478 { 513 {
479 boost::mutex::scoped_lock lock(that_.pimpl_->worklistCallbackMutex_); 514 boost::mutex::scoped_lock lock(that_.pimpl_->worklistCallbackMutex_);
480
481 matcher_.reset(new HierarchicalMatcher(query));
482 currentQuery_ = &query;
483 515
484 if (that_.pimpl_->worklistCallback_) 516 if (that_.pimpl_->worklistCallback_)
485 { 517 {
486 OrthancPluginErrorCode error = that_.pimpl_->worklistCallback_ 518 OrthancPluginErrorCode error = that_.pimpl_->worklistCallback_
487 (reinterpret_cast<OrthancPluginWorklistAnswers*>(&answers), 519 (reinterpret_cast<OrthancPluginWorklistAnswers*>(&answers),