Mercurial > hg > orthanc
comparison OrthancServer/OrthancRestApi/OrthancRestArchive.cpp @ 2628:7ba7d5806911 jobs
reorganization
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 25 May 2018 14:39:58 +0200 |
parents | 00b6a7f935fc |
children | db895b36f4c5 |
comparison
equal
deleted
inserted
replaced
2627:00b6a7f935fc | 2628:7ba7d5806911 |
---|---|
533 } | 533 } |
534 }; | 534 }; |
535 | 535 |
536 | 536 |
537 | 537 |
538 class ArchiveWriterVisitor : public IArchiveVisitor | 538 class ArchiveIndexVisitor : public IArchiveVisitor |
539 { | 539 { |
540 private: | 540 private: |
541 ArchiveCommands& commands_; | 541 ArchiveCommands& commands_; |
542 ServerContext& context_; | 542 ServerContext& context_; |
543 char instanceFormat_[24]; | 543 char instanceFormat_[24]; |
558 return ""; | 558 return ""; |
559 } | 559 } |
560 } | 560 } |
561 | 561 |
562 public: | 562 public: |
563 ArchiveWriterVisitor(ArchiveCommands& commands, | 563 ArchiveIndexVisitor(ArchiveCommands& commands, |
564 ServerContext& context) : | 564 ServerContext& context) : |
565 commands_(commands), | 565 commands_(commands), |
566 context_(context), | 566 context_(context), |
567 counter_(0) | 567 counter_(0) |
568 { | 568 { |
569 if (commands.GetSize() != 0) | 569 if (commands.GetSize() != 0) |
644 snprintf(filename, sizeof(filename) - 1, instanceFormat_, counter_); | 644 snprintf(filename, sizeof(filename) - 1, instanceFormat_, counter_); |
645 counter_ ++; | 645 counter_ ++; |
646 | 646 |
647 commands_.AddWriteInstance(filename, instanceId, dicom); | 647 commands_.AddWriteInstance(filename, instanceId, dicom); |
648 } | 648 } |
649 | |
650 static void Apply(RestApiOutput& output, | |
651 ServerContext& context, | |
652 ArchiveIndex& archive, | |
653 const std::string& filename) | |
654 { | |
655 ArchiveCommands commands; | |
656 | |
657 { | |
658 ArchiveWriterVisitor visitor(commands, context); | |
659 archive.Expand(context.GetIndex()); | |
660 archive.Apply(visitor); | |
661 } | |
662 | |
663 // Create a RAII for the temporary file to manage the ZIP file | |
664 TemporaryFile tmp; | |
665 | |
666 { | |
667 HierarchicalZipWriter writer(tmp.GetPath().c_str()); | |
668 writer.SetZip64(commands.IsZip64()); | |
669 | |
670 for (size_t i = 0; i < commands.GetSize(); i++) | |
671 { | |
672 commands.Apply(writer, context, i); | |
673 } | |
674 } | |
675 | |
676 // Prepare the sending of the ZIP file | |
677 FilesystemHttpSender sender(tmp.GetPath()); | |
678 sender.SetContentType("application/zip"); | |
679 sender.SetContentFilename(filename); | |
680 | |
681 // Send the ZIP | |
682 output.AnswerStream(sender); | |
683 | |
684 // The temporary file is automatically removed thanks to the RAII | |
685 } | |
686 }; | 649 }; |
687 | 650 |
688 | 651 |
689 class MediaWriterVisitor : public IArchiveVisitor | 652 class MediaIndexVisitor : public IArchiveVisitor |
690 { | 653 { |
691 private: | 654 private: |
692 ArchiveCommands& commands_; | 655 ArchiveCommands& commands_; |
693 ServerContext& context_; | 656 ServerContext& context_; |
694 unsigned int counter_; | 657 unsigned int counter_; |
695 | 658 |
696 public: | 659 public: |
697 MediaWriterVisitor(ArchiveCommands& commands, | 660 MediaIndexVisitor(ArchiveCommands& commands, |
698 ServerContext& context) : | 661 ServerContext& context) : |
699 commands_(commands), | 662 commands_(commands), |
700 context_(context), | 663 context_(context), |
701 counter_(0) | 664 counter_(0) |
702 { | 665 { |
703 } | 666 } |
720 std::string filename = "IM" + boost::lexical_cast<std::string>(counter_); | 683 std::string filename = "IM" + boost::lexical_cast<std::string>(counter_); |
721 commands_.AddWriteInstance(filename, instanceId, dicom); | 684 commands_.AddWriteInstance(filename, instanceId, dicom); |
722 | 685 |
723 counter_ ++; | 686 counter_ ++; |
724 } | 687 } |
725 | 688 }; |
726 static void Apply(RestApiOutput& output, | 689 |
727 ServerContext& context, | 690 |
728 ArchiveIndex& archive, | 691 static void CreateArchive(TemporaryFile& tmp, |
729 const std::string& filename, | 692 ServerContext& context, |
730 bool enableExtendedSopClass) | 693 ArchiveIndex& archive) |
731 { | 694 { |
732 static const char* IMAGES_FOLDER = "IMAGES"; | 695 ArchiveCommands commands; |
696 | |
697 { | |
698 ArchiveIndexVisitor visitor(commands, context); | |
699 archive.Expand(context.GetIndex()); | |
700 archive.Apply(visitor); | |
701 } | |
702 | |
703 HierarchicalZipWriter writer(tmp.GetPath().c_str()); | |
704 writer.SetZip64(commands.IsZip64()); | |
705 | |
706 for (size_t i = 0; i < commands.GetSize(); i++) | |
707 { | |
708 commands.Apply(writer, context, i); | |
709 } | |
710 } | |
711 | |
712 | |
713 static void CreateMedia(TemporaryFile& tmp, | |
714 ServerContext& context, | |
715 ArchiveIndex& archive, | |
716 bool enableExtendedSopClass) | |
717 { | |
718 static const char* IMAGES_FOLDER = "IMAGES"; | |
733 | 719 |
734 ArchiveCommands commands; | 720 ArchiveCommands commands; |
735 | 721 |
736 { | 722 { |
737 MediaWriterVisitor visitor(commands, context); | 723 MediaIndexVisitor visitor(commands, context); |
738 archive.Expand(context.GetIndex()); | 724 archive.Expand(context.GetIndex()); |
739 | 725 |
740 commands.AddOpenDirectory(IMAGES_FOLDER); | 726 commands.AddOpenDirectory(IMAGES_FOLDER); |
741 archive.Apply(visitor); | 727 archive.Apply(visitor); |
742 commands.AddCloseDirectory(); | 728 commands.AddCloseDirectory(); |
743 } | 729 } |
744 | 730 |
745 // Create a RAII for the temporary file to manage the ZIP file | 731 DicomDirWriter dicomDir; |
746 TemporaryFile tmp; | 732 dicomDir.EnableExtendedSopClass(enableExtendedSopClass); |
747 | 733 |
748 { | 734 HierarchicalZipWriter writer(tmp.GetPath().c_str()); |
749 DicomDirWriter dicomDir; | 735 writer.SetZip64(commands.IsZip64()); |
750 dicomDir.EnableExtendedSopClass(enableExtendedSopClass); | 736 |
751 | 737 for (size_t i = 0; i < commands.GetSize(); i++) |
752 HierarchicalZipWriter writer(tmp.GetPath().c_str()); | 738 { |
753 writer.SetZip64(commands.IsZip64()); | 739 commands.Apply(writer, context, i, dicomDir, IMAGES_FOLDER); |
754 | 740 } |
755 for (size_t i = 0; i < commands.GetSize(); i++) | 741 |
756 { | 742 // Add the DICOMDIR |
757 commands.Apply(writer, context, i, dicomDir, IMAGES_FOLDER); | 743 writer.OpenFile("DICOMDIR"); |
758 } | 744 std::string s; |
759 | 745 dicomDir.Encode(s); |
760 // Add the DICOMDIR | 746 writer.Write(s); |
761 writer.OpenFile("DICOMDIR"); | 747 } |
762 std::string s; | 748 |
763 dicomDir.Encode(s); | 749 |
764 writer.Write(s); | 750 static void SendTemporaryFile(RestApiOutput& output, |
765 } | 751 TemporaryFile& tmp, |
766 | 752 const std::string& filename) |
767 | 753 { |
768 // Prepare the sending of the ZIP file | 754 // Prepare the sending of the ZIP file |
769 FilesystemHttpSender sender(tmp.GetPath()); | 755 FilesystemHttpSender sender(tmp.GetPath()); |
770 sender.SetContentType("application/zip"); | 756 sender.SetContentType("application/zip"); |
771 sender.SetContentFilename(filename); | 757 sender.SetContentFilename(filename); |
772 | 758 |
773 // Send the ZIP | 759 // Send the ZIP |
774 output.AnswerStream(sender); | 760 output.AnswerStream(sender); |
775 | 761 } |
776 // The temporary file is automatically removed thanks to the RAII | 762 |
777 } | |
778 }; | |
779 | 763 |
780 | 764 |
781 #if 0 | 765 #if 0 |
782 class ArchiveJob : public IJob | 766 class ArchiveJob : public IJob |
783 { | 767 { |
891 { | 875 { |
892 ArchiveIndex archive(ResourceType_Patient); // root | 876 ArchiveIndex archive(ResourceType_Patient); // root |
893 | 877 |
894 if (AddResourcesOfInterest(archive, call)) | 878 if (AddResourcesOfInterest(archive, call)) |
895 { | 879 { |
896 ArchiveWriterVisitor::Apply(call.GetOutput(), | 880 TemporaryFile tmp; |
897 OrthancRestApi::GetContext(call), | 881 CreateArchive(tmp, OrthancRestApi::GetContext(call), archive); |
898 archive, | 882 SendTemporaryFile(call.GetOutput(), tmp, "Archive.zip"); |
899 "Archive.zip"); | |
900 } | 883 } |
901 } | 884 } |
902 | 885 |
903 | 886 |
904 template <bool Extended> | 887 template <bool Extended> |
906 { | 889 { |
907 ArchiveIndex archive(ResourceType_Patient); // root | 890 ArchiveIndex archive(ResourceType_Patient); // root |
908 | 891 |
909 if (AddResourcesOfInterest(archive, call)) | 892 if (AddResourcesOfInterest(archive, call)) |
910 { | 893 { |
911 MediaWriterVisitor::Apply(call.GetOutput(), | 894 TemporaryFile tmp; |
912 OrthancRestApi::GetContext(call), | 895 CreateMedia(tmp, OrthancRestApi::GetContext(call), archive, Extended); |
913 archive, | 896 SendTemporaryFile(call.GetOutput(), tmp, "Archive.zip"); |
914 "Archive.zip", | |
915 Extended); | |
916 } | 897 } |
917 } | 898 } |
918 | 899 |
919 | 900 |
920 static void CreateArchive(RestApiGetCall& call) | 901 static void CreateArchive(RestApiGetCall& call) |
925 ResourceIdentifiers resource(index, id); | 906 ResourceIdentifiers resource(index, id); |
926 | 907 |
927 ArchiveIndex archive(ResourceType_Patient); // root | 908 ArchiveIndex archive(ResourceType_Patient); // root |
928 archive.Add(OrthancRestApi::GetIndex(call), resource); | 909 archive.Add(OrthancRestApi::GetIndex(call), resource); |
929 | 910 |
930 ArchiveWriterVisitor::Apply(call.GetOutput(), | 911 TemporaryFile tmp; |
931 OrthancRestApi::GetContext(call), | 912 CreateArchive(tmp, OrthancRestApi::GetContext(call), archive); |
932 archive, | 913 SendTemporaryFile(call.GetOutput(), tmp, id + ".zip"); |
933 id + ".zip"); | |
934 } | 914 } |
935 | 915 |
936 | 916 |
937 static void CreateMedia(RestApiGetCall& call) | 917 static void CreateMedia(RestApiGetCall& call) |
938 { | 918 { |
942 ResourceIdentifiers resource(index, id); | 922 ResourceIdentifiers resource(index, id); |
943 | 923 |
944 ArchiveIndex archive(ResourceType_Patient); // root | 924 ArchiveIndex archive(ResourceType_Patient); // root |
945 archive.Add(OrthancRestApi::GetIndex(call), resource); | 925 archive.Add(OrthancRestApi::GetIndex(call), resource); |
946 | 926 |
947 MediaWriterVisitor::Apply(call.GetOutput(), | 927 TemporaryFile tmp; |
948 OrthancRestApi::GetContext(call), | 928 CreateMedia(tmp, OrthancRestApi::GetContext(call), archive, call.HasArgument("extended")); |
949 archive, | 929 SendTemporaryFile(call.GetOutput(), tmp, id + ".zip"); |
950 id + ".zip", | |
951 call.HasArgument("extended")); | |
952 } | 930 } |
953 | 931 |
954 | 932 |
955 void OrthancRestApi::RegisterArchive() | 933 void OrthancRestApi::RegisterArchive() |
956 { | 934 { |