# HG changeset patch # User Alain Mazy # Date 1591695472 -7200 # Node ID ceba3213cb9ecd266ac3ef9f1a5d67fdfd95c134 # Parent 320cde762fd90d9bf9affea0b43867880079ff70# Parent bf35c4628777f27e2018ba292002fae61ecb3ac7 merge diff -r bf35c4628777 -r ceba3213cb9e OrthancServer/OrthancFindRequestHandler.cpp --- a/OrthancServer/OrthancFindRequestHandler.cpp Tue Jun 09 09:20:09 2020 +0200 +++ b/OrthancServer/OrthancFindRequestHandler.cpp Tue Jun 09 11:37:52 2020 +0200 @@ -303,7 +303,8 @@ const DicomArray& query, const std::list& sequencesToReturn, const DicomMap* counters, - const std::string& defaultPrivateCreator) + const std::string& defaultPrivateCreator, + const std::map& 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& 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& privateCreators_; // the private creators defined in the query itself public: LookupVisitor(DicomFindAnswers& answers, ServerContext& context, ResourceType level, const DicomMap& query, - const std::list& sequencesToReturn) : + const std::list& sequencesToReturn, + const std::map& 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 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 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); }