comparison 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
comparison
equal deleted inserted replaced
401:5962898fb7c8 402:d2c69150a979
247 static void DicomStore(RestApi::PostCall& call) 247 static void DicomStore(RestApi::PostCall& call)
248 { 248 {
249 RETRIEVE_CONTEXT(call); 249 RETRIEVE_CONTEXT(call);
250 250
251 std::string remote = call.GetUriComponent("id", ""); 251 std::string remote = call.GetUriComponent("id", "");
252 std::string stripped = Toolbox::StripSpaces(call.GetPostBody());
253
254 Json::Value request;
255 if (Toolbox::IsSHA1(stripped))
256 {
257 // This is for compatibility with Orthanc <= 0.5.1.
258 request = stripped;
259 }
260 else if (!call.ParseJsonRequest(request))
261 {
262 // Bad JSON request
263 return;
264 }
265
266 std::list<std::string> instances;
267 if (request.isString())
268 {
269 context.GetIndex().LogExportedResource(request.asString(), remote);
270 context.GetIndex().GetChildInstances(instances, request.asString());
271 }
272 else if (request.isArray())
273 {
274 for (Json::Value::ArrayIndex i = 0; i < request.size(); i++)
275 {
276 if (!request[i].isString())
277 {
278 return;
279 }
280
281 std::string stripped = Toolbox::StripSpaces(request[i].asString());
282 if (!Toolbox::IsSHA1(stripped))
283 {
284 return;
285 }
286
287 context.GetIndex().LogExportedResource(stripped, remote);
288
289 std::list<std::string> tmp;
290 context.GetIndex().GetChildInstances(tmp, stripped);
291 instances.merge(tmp);
292 assert(tmp.size() == 0);
293 }
294 }
295 else
296 {
297 // Neither a string, nor a list of strings. Bad request.
298 return;
299 }
300
252 DicomUserConnection connection; 301 DicomUserConnection connection;
253 ConnectToModality(connection, remote); 302 ConnectToModality(connection, remote);
254 303
255 const std::string& resourceId = call.GetPostBody(); 304 for (std::list<std::string>::const_iterator
256 305 it = instances.begin(); it != instances.end(); it++)
257 Json::Value found; 306 {
258 if (context.GetIndex().LookupResource(found, resourceId, ResourceType_Series))
259 {
260 // The UUID corresponds to a series
261 context.GetIndex().LogExportedResource(resourceId, remote);
262
263 for (Json::Value::ArrayIndex i = 0; i < found["Instances"].size(); i++)
264 {
265 std::string instanceId = found["Instances"][i].asString();
266 std::string dicom;
267 context.ReadFile(dicom, instanceId, FileContentType_Dicom);
268 connection.Store(dicom);
269 }
270
271 call.GetOutput().AnswerBuffer("{}", "application/json");
272 }
273 else if (context.GetIndex().LookupResource(found, resourceId, ResourceType_Instance))
274 {
275 // The UUID corresponds to an instance
276 context.GetIndex().LogExportedResource(resourceId, remote);
277
278 std::string dicom; 307 std::string dicom;
279 context.ReadFile(dicom, resourceId, FileContentType_Dicom); 308 context.ReadFile(dicom, *it, FileContentType_Dicom);
280 connection.Store(dicom); 309 connection.Store(dicom);
281 310 }
282 call.GetOutput().AnswerBuffer("{}", "application/json"); 311
283 } 312 call.GetOutput().AnswerBuffer("{}", "application/json");
284 else
285 {
286 // The POST body is not a known resource, assume that it
287 // contains a raw DICOM instance
288 connection.Store(resourceId);
289 call.GetOutput().AnswerBuffer("{}", "application/json");
290 }
291 } 313 }
292 314
293 315
294 316
295 // System information ------------------------------------------------------- 317 // System information -------------------------------------------------------