Mercurial > hg > orthanc
diff OrthancServer/OrthancRestApi.cpp @ 402:d2c69150a979
bulk storescu
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 30 Apr 2013 11:50:51 +0200 |
parents | 4d5f0857ec9c |
children | c3e9b74aab7a |
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi.cpp Tue Apr 30 10:57:00 2013 +0200 +++ b/OrthancServer/OrthancRestApi.cpp Tue Apr 30 11:50:51 2013 +0200 @@ -249,45 +249,67 @@ RETRIEVE_CONTEXT(call); std::string remote = call.GetUriComponent("id", ""); + std::string stripped = Toolbox::StripSpaces(call.GetPostBody()); + + Json::Value request; + if (Toolbox::IsSHA1(stripped)) + { + // This is for compatibility with Orthanc <= 0.5.1. + request = stripped; + } + else if (!call.ParseJsonRequest(request)) + { + // Bad JSON request + return; + } + + std::list<std::string> instances; + if (request.isString()) + { + context.GetIndex().LogExportedResource(request.asString(), remote); + context.GetIndex().GetChildInstances(instances, request.asString()); + } + else if (request.isArray()) + { + for (Json::Value::ArrayIndex i = 0; i < request.size(); i++) + { + if (!request[i].isString()) + { + return; + } + + std::string stripped = Toolbox::StripSpaces(request[i].asString()); + if (!Toolbox::IsSHA1(stripped)) + { + return; + } + + context.GetIndex().LogExportedResource(stripped, remote); + + std::list<std::string> tmp; + context.GetIndex().GetChildInstances(tmp, stripped); + instances.merge(tmp); + assert(tmp.size() == 0); + } + } + else + { + // Neither a string, nor a list of strings. Bad request. + return; + } + DicomUserConnection connection; ConnectToModality(connection, remote); - const std::string& resourceId = call.GetPostBody(); - - Json::Value found; - if (context.GetIndex().LookupResource(found, resourceId, ResourceType_Series)) + for (std::list<std::string>::const_iterator + it = instances.begin(); it != instances.end(); it++) { - // The UUID corresponds to a series - context.GetIndex().LogExportedResource(resourceId, remote); - - for (Json::Value::ArrayIndex i = 0; i < found["Instances"].size(); i++) - { - std::string instanceId = found["Instances"][i].asString(); - std::string dicom; - context.ReadFile(dicom, instanceId, FileContentType_Dicom); - connection.Store(dicom); - } - - call.GetOutput().AnswerBuffer("{}", "application/json"); + std::string dicom; + context.ReadFile(dicom, *it, FileContentType_Dicom); + connection.Store(dicom); } - else if (context.GetIndex().LookupResource(found, resourceId, ResourceType_Instance)) - { - // The UUID corresponds to an instance - context.GetIndex().LogExportedResource(resourceId, remote); - std::string dicom; - context.ReadFile(dicom, resourceId, FileContentType_Dicom); - connection.Store(dicom); - - call.GetOutput().AnswerBuffer("{}", "application/json"); - } - else - { - // The POST body is not a known resource, assume that it - // contains a raw DICOM instance - connection.Store(resourceId); - call.GetOutput().AnswerBuffer("{}", "application/json"); - } + call.GetOutput().AnswerBuffer("{}", "application/json"); }