comparison OrthancServer/OrthancRestApi.cpp @ 248:2442033911d6

creation of zip files
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 04 Dec 2012 17:49:37 +0100
parents e4148b0ab1d0
children 5694365ecb96
comparison
equal deleted inserted replaced
247:c9b3ba0fd140 248:2442033911d6
32 32
33 #include "OrthancRestApi.h" 33 #include "OrthancRestApi.h"
34 34
35 #include "../Core/HttpServer/FilesystemHttpSender.h" 35 #include "../Core/HttpServer/FilesystemHttpSender.h"
36 #include "../Core/Uuid.h" 36 #include "../Core/Uuid.h"
37 #include "../Core/Compression/HierarchicalZipWriter.h"
37 #include "DicomProtocol/DicomUserConnection.h" 38 #include "DicomProtocol/DicomUserConnection.h"
38 #include "FromDcmtkBridge.h" 39 #include "FromDcmtkBridge.h"
39 #include "OrthancInitialization.h" 40 #include "OrthancInitialization.h"
40 #include "ServerToolbox.h" 41 #include "ServerToolbox.h"
41 42
348 call.GetOutput().AnswerJson(result); 349 call.GetOutput().AnswerJson(result);
349 } 350 }
350 } 351 }
351 352
352 353
354 // Download of ZIP files ----------------------------------------------------
355
356 static void GetPatientArchive(RestApi::GetCall& call)
357 {
358 RETRIEVE_CONTEXT(call);
359
360 Json::Value patient;
361 if (!context.GetIndex().LookupResource(patient, call.GetUriComponent("id", ""), ResourceType_Patient))
362 {
363 return;
364 }
365
366 Toolbox::TemporaryFile tmp;
367
368 {
369 HierarchicalZipWriter writer(tmp.GetPath().c_str());
370
371 for (size_t i = 0; i < patient["Studies"].size(); i++)
372 {
373 Json::Value study;
374 if (context.GetIndex().LookupResource(study, patient["Studies"][i].asString(), ResourceType_Study))
375 {
376 writer.CreateDirectory(study["MainDicomTags"]["StudyDescription"].asString().c_str());
377
378 for (size_t i = 0; i < study["Series"].size(); i++)
379 {
380 Json::Value series;
381 if (context.GetIndex().LookupResource(series, study["Series"][i].asString(), ResourceType_Series))
382 {
383 std::string m = series["MainDicomTags"]["Modality"].asString();
384 std::string s = series["MainDicomTags"]["SeriesDescription"].asString();
385 writer.CreateDirectory((m + " " + s).c_str());
386
387 for (size_t i = 0; i < series["Instances"].size(); i++)
388 {
389 Json::Value instance;
390 if (context.GetIndex().LookupResource(instance, series["Instances"][i].asString(), ResourceType_Instance))
391 {
392 writer.CreateFile(instance["MainDicomTags"]["SOPInstanceUID"].asString().c_str());
393 }
394 }
395
396 writer.CloseDirectory();
397 }
398 }
399
400 writer.CloseDirectory();
401 }
402 }
403 }
404
405 FilesystemHttpSender sender(tmp.GetPath().c_str());
406 call.GetOutput().AnswerFile(sender);
407 }
408
409
353 // Changes API -------------------------------------------------------------- 410 // Changes API --------------------------------------------------------------
354 411
355 static void GetSinceAndLimit(int64_t& since, 412 static void GetSinceAndLimit(int64_t& since,
356 unsigned int& limit, 413 unsigned int& limit,
357 bool& last, 414 bool& last,
651 Register("/patients/{id}", GetSingleResource<ResourceType_Patient>); 708 Register("/patients/{id}", GetSingleResource<ResourceType_Patient>);
652 Register("/series/{id}", DeleteSingleResource<ResourceType_Series>); 709 Register("/series/{id}", DeleteSingleResource<ResourceType_Series>);
653 Register("/series/{id}", GetSingleResource<ResourceType_Series>); 710 Register("/series/{id}", GetSingleResource<ResourceType_Series>);
654 Register("/studies/{id}", DeleteSingleResource<ResourceType_Study>); 711 Register("/studies/{id}", DeleteSingleResource<ResourceType_Study>);
655 Register("/studies/{id}", GetSingleResource<ResourceType_Study>); 712 Register("/studies/{id}", GetSingleResource<ResourceType_Study>);
713 Register("/patients/{id}/archive", GetPatientArchive);
656 714
657 Register("/instances/{id}/file", GetInstanceFile); 715 Register("/instances/{id}/file", GetInstanceFile);
658 Register("/instances/{id}/tags", GetInstanceTags<false>); 716 Register("/instances/{id}/tags", GetInstanceTags<false>);
659 Register("/instances/{id}/simplified-tags", GetInstanceTags<true>); 717 Register("/instances/{id}/simplified-tags", GetInstanceTags<true>);
660 Register("/instances/{id}/frames", ListFrames); 718 Register("/instances/{id}/frames", ListFrames);