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 {