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;
     }
   }