Mercurial > hg > orthanc
diff OrthancServer/Sources/ServerJobs/MergeStudyJob.cpp @ 4717:783f8a048035 openssl-3.x
integration mainline->openssl-3.x
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 23 Jun 2021 16:23:23 +0200 |
parents | f0038043fb97 fb98db281d1d |
children | 70d2a97ca8cb |
line wrap: on
line diff
--- a/OrthancServer/Sources/ServerJobs/MergeStudyJob.cpp Tue Jun 22 10:40:28 2021 +0200 +++ b/OrthancServer/Sources/ServerJobs/MergeStudyJob.cpp Wed Jun 23 16:23:23 2021 +0200 @@ -30,10 +30,20 @@ namespace Orthanc { + static void RegisterSeries(std::map<std::string, std::string>& target, + const std::string& series) + { + // Generate a target SeriesInstanceUID for this series + if (target.find(series) == target.end()) + { + target[series] = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Series); + } + } + + void MergeStudyJob::AddSourceSeriesInternal(const std::string& series) { - // Generate a target SeriesInstanceUID for this series - seriesUidMap_[series] = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Series); + RegisterSeries(seriesUidMap_, series); // Add all the instances of the series as to be processed std::list<std::string> instances; @@ -228,7 +238,7 @@ } - void MergeStudyJob::AddSource(const std::string& studyOrSeries) + void MergeStudyJob::AddSource(const std::string& publicId) { ResourceType level; @@ -236,28 +246,31 @@ { throw OrthancException(ErrorCode_BadSequenceOfCalls); } - else if (!GetContext().GetIndex().LookupResourceType(level, studyOrSeries)) + else if (!GetContext().GetIndex().LookupResourceType(level, publicId)) { throw OrthancException(ErrorCode_UnknownResource, - "Cannot find this resource: " + studyOrSeries); + "Cannot find this resource: " + publicId); } else { switch (level) { case ResourceType_Study: - AddSourceStudyInternal(studyOrSeries); + AddSourceStudyInternal(publicId); break; case ResourceType_Series: - AddSourceSeries(studyOrSeries); + AddSourceSeries(publicId); + break; + + case ResourceType_Instance: + AddSourceInstance(publicId); break; default: throw OrthancException(ErrorCode_UnknownResource, - "This resource is neither a study, nor a series: " + - studyOrSeries + " is a " + - std::string(EnumerationToString(level))); + "This resource is neither a study, nor a series, nor an instance: " + + publicId + " is a " + std::string(EnumerationToString(level))); } } } @@ -310,6 +323,34 @@ } + void MergeStudyJob::AddSourceInstance(const std::string& instance) + { + std::string parentStudy, parentSeries; + + if (IsStarted()) + { + throw OrthancException(ErrorCode_BadSequenceOfCalls); + } + else if (!GetContext().GetIndex().LookupParent(parentSeries, instance, ResourceType_Series) || + !GetContext().GetIndex().LookupParent(parentStudy, parentSeries, ResourceType_Study)) + { + throw OrthancException(ErrorCode_UnknownResource, + "This resource is not an instance: " + instance); + } + else if (parentStudy == targetStudy_) + { + throw OrthancException(ErrorCode_UnknownResource, + "Cannot merge instance " + instance + + " into its parent study " + targetStudy_); + } + else + { + RegisterSeries(seriesUidMap_, parentSeries); + AddInstance(instance); + } + } + + void MergeStudyJob::GetPublicContent(Json::Value& value) { CleaningInstancesJob::GetPublicContent(value);