diff OrthancServer/OrthancFindRequestHandler.cpp @ 3003:5ae3ff2398e9

refactoring OrthancFindRequestHandler using LookupResource::IVisitor
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 11 Dec 2018 19:02:51 +0100
parents 7695a9c81099
children 8265a6b56100
line wrap: on
line diff
--- a/OrthancServer/OrthancFindRequestHandler.cpp	Tue Dec 11 18:36:52 2018 +0100
+++ b/OrthancServer/OrthancFindRequestHandler.cpp	Tue Dec 11 19:02:51 2018 +0100
@@ -521,6 +521,47 @@
   }
 
 
+  class OrthancFindRequestHandler::LookupVisitor : public LookupResource::IVisitor
+  {
+  private:
+    DicomFindAnswers&           answers_;
+    ServerContext&              context_;
+    ResourceType                level_;
+    const DicomMap&             filteredInput_;
+    const std::list<DicomTag>&  sequencesToReturn_;
+    DicomArray                  query_;
+
+  public:
+    LookupVisitor(DicomFindAnswers&  answers,
+                  ServerContext& context,
+                  ResourceType level,
+                  const DicomMap& filteredInput,
+                  const std::list<DicomTag>& sequencesToReturn) :
+      answers_(answers),
+      context_(context),
+      level_(level),
+      filteredInput_(filteredInput),
+      sequencesToReturn_(sequencesToReturn),
+      query_(filteredInput)
+    {
+      answers_.SetComplete(false);
+    }
+      
+    virtual void MarkAsComplete()
+    {
+      answers_.SetComplete(true);
+    }
+
+    virtual void Visit(const std::string& publicId,
+                       const std::string& instanceId,
+                       const Json::Value& dicom) 
+    {
+      std::auto_ptr<DicomMap> counters(ComputeCounters(context_, instanceId, level_, filteredInput_));
+      AddAnswer(answers_, dicom, query_, sequencesToReturn_, counters.get());
+    }
+  };
+
+
   void OrthancFindRequestHandler::Handle(DicomFindAnswers& answers,
                                          const DicomMap& input,
                                          const std::list<DicomTag>& sequencesToReturn,
@@ -649,6 +690,15 @@
 
     size_t limit = (level == ResourceType_Instance) ? maxInstances_ : maxResults_;
 
+
+#if 1
+    LookupVisitor visitor(answers, context_, level, *filteredInput, sequencesToReturn);
+    context_.Apply(visitor, lookup, 0 /* "since" is not relevant to C-FIND */, limit);
+
+#else
+    // Backup - Implementation of Orthanc <= 1.5.0
+    // TODO - Remove this code
+
     // TODO - Use ServerContext::Apply() at this point, in order to
     // share the code with the "/tools/find" REST URI
     std::vector<std::string> resources, instances;
@@ -685,6 +735,7 @@
     LOG(INFO) << "Number of matching resources: " << answers.GetSize();
 
     answers.SetComplete(complete);
+#endif
   }