changeset 4020:320cde762fd9

collect private creators from the C-Find query itself; use DefaultPrivateCreator otherwise
author Alain Mazy <alain@mazy.be>
date Tue, 09 Jun 2020 11:37:35 +0200
parents 9d2d2c1afcec
children ceba3213cb9e
files OrthancServer/OrthancFindRequestHandler.cpp
diffstat 1 files changed, 28 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancServer/OrthancFindRequestHandler.cpp	Mon Jun 08 22:43:58 2020 +0200
+++ b/OrthancServer/OrthancFindRequestHandler.cpp	Tue Jun 09 11:37:35 2020 +0200
@@ -303,7 +303,8 @@
                         const DicomArray& query,
                         const std::list<DicomTag>& sequencesToReturn,
                         const DicomMap* counters,
-                        const std::string& defaultPrivateCreator)
+                        const std::string& defaultPrivateCreator,
+                        const std::map<uint16_t, std::string>& privateCreators)
   {
     DicomMap match;
 
@@ -398,7 +399,14 @@
 
           if (tag->IsPrivate())
           {
-            dicom.Replace(*tag, content, false, DicomReplaceMode_InsertIfAbsent, defaultPrivateCreator); // TODO: instead of taking the default private creator, we should get the private createor of the current "group"
+            if (privateCreators.find(tag->GetGroup()) != privateCreators.end())
+            {
+              dicom.Replace(*tag, content, false, DicomReplaceMode_InsertIfAbsent, privateCreators.at(tag->GetGroup()).c_str());
+            }
+            else
+            {
+              dicom.Replace(*tag, content, false, DicomReplaceMode_InsertIfAbsent, defaultPrivateCreator);
+            }
           }
           else
           {
@@ -492,20 +500,23 @@
     const DicomMap&             query_;
     DicomArray                  queryAsArray_;
     const std::list<DicomTag>&  sequencesToReturn_;
-    std::string                 defaultPrivateCreator_;
+    std::string                 defaultPrivateCreator_;       // the private creator to use if the group is not defined in the query itself
+    const std::map<uint16_t, std::string>& privateCreators_;  // the private creators defined in the query itself
 
   public:
     LookupVisitor(DicomFindAnswers&  answers,
                   ServerContext& context,
                   ResourceType level,
                   const DicomMap& query,
-                  const std::list<DicomTag>& sequencesToReturn) :
+                  const std::list<DicomTag>& sequencesToReturn,
+                  const std::map<uint16_t, std::string>& privateCreators) :
       answers_(answers),
       context_(context),
       level_(level),
       query_(query),
       queryAsArray_(query),
-      sequencesToReturn_(sequencesToReturn)
+      sequencesToReturn_(sequencesToReturn),
+      privateCreators_(privateCreators)
     {
       answers_.SetComplete(false);
 
@@ -554,7 +565,7 @@
       std::unique_ptr<DicomMap> counters(ComputeCounters(context_, instanceId, level_, query_));
 
       AddAnswer(answers_, mainDicomTags, dicomAsJson,
-                queryAsArray_, sequencesToReturn_, counters.get(), defaultPrivateCreator_);
+                queryAsArray_, sequencesToReturn_, counters.get(), defaultPrivateCreator_, privateCreators_);
     }
   };
 
@@ -628,6 +639,16 @@
                 << " : sequence tag whose content will be copied";
     }
 
+    // collect the private creators from the query itself
+    std::map<uint16_t, std::string> privateCreators;
+    for (size_t i = 0; i < query.GetSize(); i++)
+    {
+      const DicomElement& element = query.GetElement(i);
+      if (element.GetTag().IsPrivate() && element.GetTag().GetElement() == 0x10)
+      {
+        privateCreators[element.GetTag().GetGroup()] = element.GetValue().GetContent();
+      }
+    }
 
     /**
      * Build up the query object.
@@ -690,7 +711,7 @@
     size_t limit = (level == ResourceType_Instance) ? maxInstances_ : maxResults_;
 
 
-    LookupVisitor visitor(answers, context_, level, *filteredInput, sequencesToReturn);
+    LookupVisitor visitor(answers, context_, level, *filteredInput, sequencesToReturn, privateCreators);
     context_.Apply(visitor, lookup, level, 0 /* "since" is not relevant to C-FIND */, limit);
   }