# HG changeset patch # User Sebastien Jodogne # Date 1544432621 -3600 # Node ID b1ba0a8311b54a872821343c55e9f19b9e6966ff # Parent 32ec5078e32b28648bc7ae08937170c684174d64 exploring hierarchy of C-FIND answers finished diff -r 32ec5078e32b -r b1ba0a8311b5 OrthancServer/OrthancRestApi/OrthancRestModalities.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp Mon Dec 10 09:20:57 2018 +0100 +++ b/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp Mon Dec 10 10:03:41 2018 +0100 @@ -708,7 +708,7 @@ template - static void AnswerQueryChildren(RestApiPostCall& call) + static void QueryAnswerChildren(RestApiPostCall& call) { // New in Orthanc 1.4.3 assert(CHILDREN_LEVEL == ResourceType_Study || @@ -769,6 +769,35 @@ handler->SetQuery(it->first, it->second); } } + + DicomMap answer; + parent.GetHandler().GetAnswer(answer, index); + + // This switch-case mimics "DicomUserConnection::Move()" + switch (parent.GetHandler().GetLevel()) + { + case ResourceType_Patient: + handler->CopyStringTag(answer, DICOM_TAG_PATIENT_ID); + break; + + case ResourceType_Study: + handler->CopyStringTag(answer, DICOM_TAG_STUDY_INSTANCE_UID); + break; + + case ResourceType_Series: + handler->CopyStringTag(answer, DICOM_TAG_STUDY_INSTANCE_UID); + handler->CopyStringTag(answer, DICOM_TAG_SERIES_INSTANCE_UID); + break; + + case ResourceType_Instance: + handler->CopyStringTag(answer, DICOM_TAG_STUDY_INSTANCE_UID); + handler->CopyStringTag(answer, DICOM_TAG_SERIES_INSTANCE_UID); + handler->CopyStringTag(answer, DICOM_TAG_SOP_INSTANCE_UID); + break; + + default: + throw OrthancException(ErrorCode_InternalError); + } } } @@ -1234,11 +1263,11 @@ Register("/queries/{id}/answers/{index}/content", GetQueryOneAnswer); Register("/queries/{id}/answers/{index}/retrieve", RetrieveOneAnswer); Register("/queries/{id}/answers/{index}/query-instances", - AnswerQueryChildren); + QueryAnswerChildren); Register("/queries/{id}/answers/{index}/query-series", - AnswerQueryChildren); + QueryAnswerChildren); Register("/queries/{id}/answers/{index}/query-studies", - AnswerQueryChildren); + QueryAnswerChildren); Register("/queries/{id}/level", GetQueryLevel); Register("/queries/{id}/modality", GetQueryModality); Register("/queries/{id}/query", GetQueryArguments); diff -r 32ec5078e32b -r b1ba0a8311b5 OrthancServer/QueryRetrieveHandler.cpp --- a/OrthancServer/QueryRetrieveHandler.cpp Mon Dec 10 09:20:57 2018 +0100 +++ b/OrthancServer/QueryRetrieveHandler.cpp Mon Dec 10 10:03:41 2018 +0100 @@ -142,6 +142,24 @@ } + void QueryRetrieveHandler::CopyStringTag(const DicomMap& from, + const DicomTag& tag) + { + const DicomValue* value = from.TestAndGetValue(tag); + + if (value == NULL || + value->IsNull() || + value->IsBinary()) + { + throw OrthancException(ErrorCode_InexistentTag); + } + else + { + SetQuery(tag, value->GetContent()); + } + } + + size_t QueryRetrieveHandler::GetAnswersCount() { Run(); diff -r 32ec5078e32b -r b1ba0a8311b5 OrthancServer/QueryRetrieveHandler.h --- a/OrthancServer/QueryRetrieveHandler.h Mon Dec 10 09:20:57 2018 +0100 +++ b/OrthancServer/QueryRetrieveHandler.h Mon Dec 10 10:03:41 2018 +0100 @@ -86,6 +86,9 @@ return query_; } + void CopyStringTag(const DicomMap& from, + const DicomTag& tag); + void Run(); size_t GetAnswersCount();