Mercurial > hg > orthanc
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 ------------------------------------------------------- |