Mercurial > hg > orthanc
diff OrthancServer/QueryRetrieveHandler.cpp @ 2218:3eefb84ac0bd
dynamically fix outgoing C-Find requests using "OutgoingFindRequestFilter()"
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 13 Dec 2016 10:27:20 +0100 |
parents | e3fd5bc429a2 |
children | e7beca979562 |
line wrap: on
line diff
--- a/OrthancServer/QueryRetrieveHandler.cpp Mon Dec 12 11:56:26 2016 +0100 +++ b/OrthancServer/QueryRetrieveHandler.cpp Tue Dec 13 10:27:20 2016 +0100 @@ -34,10 +34,43 @@ #include "QueryRetrieveHandler.h" #include "OrthancInitialization.h" +#include "FromDcmtkBridge.h" namespace Orthanc { + static void FixQuery(DicomMap& query, + ServerContext& context, + const std::string& modality) + { + LuaScripting::Locker locker(context.GetLua()); + static const char* CALLBACK = "OutgoingFindRequestFilter"; + + if (locker.GetLua().IsExistingFunction(CALLBACK)) + { + LuaFunctionCall call(locker.GetLua(), CALLBACK); + call.PushDicom(query); + call.PushJson(modality); + FromDcmtkBridge::ExecuteToDicom(query, call); + } + } + + + static void FixQuery(DicomMap& query, + ModalityManufacturer manufacturer) + { + /** + * Introduce patches for specific manufacturers below. + **/ + + switch (manufacturer) + { + default: + break; + } + } + + void QueryRetrieveHandler::Invalidate() { done_ = false; @@ -49,8 +82,20 @@ { if (!done_) { - ReusableDicomUserConnection::Locker locker(context_.GetReusableDicomUserConnection(), localAet_, modality_); - locker.GetConnection().Find(answers_, level_, query_); + // Firstly, fix the content of the query for specific manufacturers + DicomMap fixed; + fixed.Assign(query_); + FixQuery(fixed, modality_.GetManufacturer()); + + // Secondly, possibly fix the query with the user-provider Lua callback + FixQuery(fixed, context_, modality_.GetApplicationEntityTitle()); + + { + // Finally, run the C-FIND SCU against the fixed query + ReusableDicomUserConnection::Locker locker(context_.GetReusableDicomUserConnection(), localAet_, modality_); + locker.GetConnection().Find(answers_, level_, fixed); + } + done_ = true; } }