annotate OrthancServer/Sources/OrthancRestApi/OrthancRestArchive.cpp @ 5057:e6f26be401fa

SQLite: close and delete WAL and SHM files on exit (contribution from Sebastian Höffner)
author Alain Mazy <am@osimis.io>
date Tue, 02 Aug 2022 11:38:31 +0200
parents 48b53ac404d9
children c387ebeb67b5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1847
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
1288
6e7e5ed91c2d upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1121
diff changeset
4 * Department, University Hospital of Liege, Belgium
4870
43e613a7756b upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium
43e613a7756b upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 *
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * This program is free software: you can redistribute it and/or
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * modify it under the terms of the GNU General Public License as
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * published by the Free Software Foundation, either version 3 of the
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * License, or (at your option) any later version.
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 *
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful, but
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * General Public License for more details.
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 *
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 **/
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
831
84513f2ee1f3 pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 824
diff changeset
23 #include "../PrecompiledHeadersServer.h"
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 #include "OrthancRestApi.h"
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
26 #include "../../../OrthancFramework/Sources/Compression/ZipWriter.h"
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
27 #include "../../../OrthancFramework/Sources/HttpServer/FilesystemHttpSender.h"
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
28 #include "../../../OrthancFramework/Sources/Logging.h"
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
29 #include "../../../OrthancFramework/Sources/OrthancException.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
30 #include "../../../OrthancFramework/Sources/SerializationToolbox.h"
3181
6fd38327e777 Fix issue #130 (Orthanc failed to start when /tmp partition was full)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3161
diff changeset
31 #include "../OrthancConfiguration.h"
3095
beeeb6096f27 removing dependencies upon ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3060
diff changeset
32 #include "../ServerContext.h"
2632
2406ae891747 ArchiveJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2630
diff changeset
33 #include "../ServerJobs/ArchiveJob.h"
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
35 #include <boost/filesystem/fstream.hpp>
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
36
3095
beeeb6096f27 removing dependencies upon ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3060
diff changeset
37
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 namespace Orthanc
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 {
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
40 static const char* const KEY_RESOURCES = "Resources";
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
41 static const char* const KEY_EXTENDED = "Extended";
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
42 static const char* const KEY_TRANSCODE = "Transcode";
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
43
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
44 static const char* const CONFIG_LOADER_THREADS = "ZipLoaderThreads";
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
45
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
46 static void AddResourcesOfInterestFromArray(ArchiveJob& job,
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
47 const Json::Value& resources)
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
48 {
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
49 if (resources.type() != Json::arrayValue)
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
50 {
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
51 throw OrthancException(ErrorCode_BadFileFormat,
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
52 "Expected a list of strings (Orthanc identifiers)");
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
53 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
54
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
55 for (Json::Value::ArrayIndex i = 0; i < resources.size(); i++)
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
56 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
57 if (resources[i].type() != Json::stringValue)
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
58 {
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
59 throw OrthancException(ErrorCode_BadFileFormat,
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
60 "Expected a list of strings (Orthanc identifiers)");
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
61 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
62 else
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
63 {
2632
2406ae891747 ArchiveJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2630
diff changeset
64 job.AddResource(resources[i].asString());
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
65 }
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
66 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
67 }
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
68
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
69
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
70 static void AddResourcesOfInterest(ArchiveJob& job /* inout */,
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
71 const Json::Value& body /* in */)
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
72 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
73 if (body.type() == Json::arrayValue)
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
74 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
75 AddResourcesOfInterestFromArray(job, body);
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
76 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
77 else if (body.type() == Json::objectValue)
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
78 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
79 if (body.isMember(KEY_RESOURCES))
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
80 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
81 AddResourcesOfInterestFromArray(job, body[KEY_RESOURCES]);
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
82 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
83 else
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
84 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
85 throw OrthancException(ErrorCode_BadFileFormat,
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
86 "Missing field " + std::string(KEY_RESOURCES) +
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
87 " in the JSON body");
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
88 }
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
89 }
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
90 else
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
91 {
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
92 throw OrthancException(ErrorCode_BadFileFormat);
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
93 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
94 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
95
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
96
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
97 static DicomTransferSyntax GetTransferSyntax(const std::string& value)
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
98 {
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
99 DicomTransferSyntax syntax;
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
100 if (LookupTransferSyntax(syntax, value))
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
101 {
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
102 return syntax;
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
103 }
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
104 else
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
105 {
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
106 throw OrthancException(ErrorCode_ParameterOutOfRange,
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
107 "Unknown transfer syntax: " + value);
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
108 }
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
109 }
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
110
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
111
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
112 static void GetJobParameters(bool& synchronous, /* out */
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
113 bool& extended, /* out */
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
114 bool& transcode, /* out */
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
115 DicomTransferSyntax& syntax, /* out */
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
116 int& priority, /* out */
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
117 unsigned int& loaderThreads, /* out */
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
118 const Json::Value& body, /* in */
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
119 const bool defaultExtended /* in */)
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
120 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
121 synchronous = OrthancRestApi::IsSynchronousJobRequest
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
122 (true /* synchronous by default */, body);
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
123
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
124 priority = OrthancRestApi::GetJobRequestPriority(body);
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
125
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
126 if (body.type() == Json::objectValue &&
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
127 body.isMember(KEY_EXTENDED))
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
128 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
129 extended = SerializationToolbox::ReadBoolean(body, KEY_EXTENDED);
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
130 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
131 else
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
132 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
133 extended = defaultExtended;
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
134 }
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
135
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
136 if (body.type() == Json::objectValue &&
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
137 body.isMember(KEY_TRANSCODE))
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
138 {
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
139 transcode = true;
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
140 syntax = GetTransferSyntax(SerializationToolbox::ReadString(body, KEY_TRANSCODE));
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
141 }
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
142 else
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
143 {
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
144 transcode = false;
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
145 }
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
146
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
147 {
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
148 OrthancConfiguration::ReaderLock lock;
4902
df86d2505df8 Orthanc 1.9.8 is now known as Orthanc 1.10.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
149 loaderThreads = lock.GetConfiguration().GetUnsignedIntegerParameter(CONFIG_LOADER_THREADS, 0); // New in Orthanc 1.10.0
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
150 }
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
151
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
152 }
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
153
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
154
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
155 namespace
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
156 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
157 class SynchronousZipChunk : public IDynamicObject
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
158 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
159 private:
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
160 std::string chunk_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
161 bool done_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
162
4690
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
163 explicit SynchronousZipChunk(bool done) :
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
164 done_(done)
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
165 {
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
166 }
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
167
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
168 public:
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
169 static SynchronousZipChunk* CreateDone()
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
170 {
4690
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
171 return new SynchronousZipChunk(true);
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
172 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
173
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
174 static SynchronousZipChunk* CreateChunk(const std::string& chunk)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
175 {
4690
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
176 std::unique_ptr<SynchronousZipChunk> item(new SynchronousZipChunk(false));
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
177 item->chunk_ = chunk;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
178 return item.release();
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
179 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
180
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
181 bool IsDone() const
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
182 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
183 return done_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
184 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
185
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
186 void SwapString(std::string& target)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
187 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
188 if (done_)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
189 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
190 throw OrthancException(ErrorCode_BadSequenceOfCalls);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
191 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
192 else
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
193 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
194 target.swap(chunk_);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
195 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
196 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
197 };
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
198
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
199
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
200 class SynchronousZipStream : public ZipWriter::IOutputStream
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
201 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
202 private:
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
203 boost::shared_ptr<SharedMessageQueue> queue_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
204 uint64_t archiveSize_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
205
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
206 public:
4690
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
207 explicit SynchronousZipStream(const boost::shared_ptr<SharedMessageQueue>& queue) :
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
208 queue_(queue),
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
209 archiveSize_(0)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
210 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
211 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
212
4690
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
213 virtual uint64_t GetArchiveSize() const ORTHANC_OVERRIDE
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
214 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
215 return archiveSize_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
216 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
217
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
218 virtual void Write(const std::string& chunk) ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
219 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
220 if (queue_.unique())
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
221 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
222 throw OrthancException(ErrorCode_NetworkProtocol,
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
223 "HTTP client has disconnected while creating an archive in synchronous mode");
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
224 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
225 else
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
226 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
227 queue_->Enqueue(SynchronousZipChunk::CreateChunk(chunk));
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
228 archiveSize_ += chunk.size();
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
229 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
230 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
231
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
232 virtual void Close() ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
233 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
234 queue_->Enqueue(SynchronousZipChunk::CreateDone());
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
235 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
236 };
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
237
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
238
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
239 class SynchronousZipSender : public IHttpStreamAnswer
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
240 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
241 private:
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
242 ServerContext& context_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
243 std::string jobId_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
244 boost::shared_ptr<SharedMessageQueue> queue_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
245 std::string filename_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
246 bool done_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
247 std::string chunk_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
248
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
249 public:
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
250 SynchronousZipSender(ServerContext& context,
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
251 const std::string& jobId,
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
252 const boost::shared_ptr<SharedMessageQueue>& queue,
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
253 const std::string& filename) :
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
254 context_(context),
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
255 jobId_(jobId),
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
256 queue_(queue),
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
257 filename_(filename),
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
258 done_(false)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
259 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
260 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
261
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
262 virtual HttpCompression SetupHttpCompression(bool gzipAllowed,
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
263 bool deflateAllowed) ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
264 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
265 // This function is not called by HttpOutput::AnswerWithoutBuffering()
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
266 throw OrthancException(ErrorCode_InternalError);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
267 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
268
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
269 virtual bool HasContentFilename(std::string& filename) ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
270 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
271 filename = filename_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
272 return true;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
273 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
274
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
275 virtual std::string GetContentType() ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
276 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
277 return EnumerationToString(MimeType_Zip);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
278 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
279
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
280 virtual uint64_t GetContentLength() ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
281 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
282 throw OrthancException(ErrorCode_InternalError);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
283 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
284
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
285 virtual bool ReadNextChunk() ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
286 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
287 for (;;)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
288 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
289 std::unique_ptr<IDynamicObject> obj(queue_->Dequeue(100));
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
290
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
291 if (obj.get() == NULL)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
292 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
293 // Check that the job is still active, which indicates
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
294 // that more data might still be returned
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
295 JobState state;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
296 if (context_.GetJobsEngine().GetRegistry().GetState(state, jobId_) &&
4690
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
297 (state == JobState_Pending ||
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
298 state == JobState_Running ||
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
299 state == JobState_Success))
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
300 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
301 continue;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
302 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
303 else
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
304 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
305 return false;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
306 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
307 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
308 else
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
309 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
310 SynchronousZipChunk& item = dynamic_cast<SynchronousZipChunk&>(*obj);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
311 if (item.IsDone())
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
312 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
313 done_ = true;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
314 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
315 else
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
316 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
317 item.SwapString(chunk_);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
318 done_ = false;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
319 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
320
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
321 return !done_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
322 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
323 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
324 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
325
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
326 virtual const char* GetChunkContent() ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
327 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
328 if (done_)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
329 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
330 throw OrthancException(ErrorCode_InternalError);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
331 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
332 else
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
333 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
334 return (chunk_.empty() ? NULL : chunk_.c_str());
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
335 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
336 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
337
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
338 virtual size_t GetChunkSize() ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
339 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
340 if (done_)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
341 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
342 throw OrthancException(ErrorCode_InternalError);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
343 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
344 else
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
345 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
346 return chunk_.size();
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
347 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
348 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
349 };
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
350
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
351
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
352 class SynchronousTemporaryStream : public ZipWriter::IOutputStream
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
353 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
354 private:
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
355 boost::shared_ptr<TemporaryFile> temp_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
356 boost::filesystem::ofstream file_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
357 uint64_t archiveSize_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
358
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
359 public:
4690
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
360 explicit SynchronousTemporaryStream(const boost::shared_ptr<TemporaryFile>& temp) :
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
361 temp_(temp),
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
362 archiveSize_(0)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
363 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
364 file_.open(temp_->GetPath(), std::ofstream::out | std::ofstream::binary);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
365 if (!file_.good())
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
366 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
367 throw OrthancException(ErrorCode_CannotWriteFile);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
368 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
369 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
370
4690
13efc0967cea cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4674
diff changeset
371 virtual uint64_t GetArchiveSize() const ORTHANC_OVERRIDE
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
372 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
373 return archiveSize_;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
374 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
375
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
376 virtual void Write(const std::string& chunk) ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
377 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
378 if (!chunk.empty())
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
379 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
380 try
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
381 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
382 file_.write(chunk.c_str(), chunk.size());
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
383
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
384 if (!file_.good())
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
385 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
386 file_.close();
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
387 throw OrthancException(ErrorCode_CannotWriteFile);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
388 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
389 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
390 catch (boost::filesystem::filesystem_error&)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
391 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
392 throw OrthancException(ErrorCode_CannotWriteFile);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
393 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
394 catch (...) // To catch "std::system_error&" in C++11
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
395 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
396 throw OrthancException(ErrorCode_CannotWriteFile);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
397 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
398 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
399
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
400 archiveSize_ += chunk.size();
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
401 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
402
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
403 virtual void Close() ORTHANC_OVERRIDE
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
404 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
405 try
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
406 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
407 file_.close();
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
408 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
409 catch (boost::filesystem::filesystem_error&)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
410 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
411 throw OrthancException(ErrorCode_CannotWriteFile);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
412 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
413 catch (...) // To catch "std::system_error&" in C++11
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
414 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
415 throw OrthancException(ErrorCode_CannotWriteFile);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
416 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
417 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
418 };
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
419 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
420
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
421
2969
2c16c29b287d preparing for asynchronous generation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2966
diff changeset
422 static void SubmitJob(RestApiOutput& output,
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
423 ServerContext& context,
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
424 std::unique_ptr<ArchiveJob>& job,
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
425 int priority,
2969
2c16c29b287d preparing for asynchronous generation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2966
diff changeset
426 bool synchronous,
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
427 const std::string& filename)
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
428 {
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
429 if (job.get() == NULL)
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
430 {
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
431 throw OrthancException(ErrorCode_NullPointer);
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
432 }
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
433
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
434 job->SetDescription("REST API");
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
435
2969
2c16c29b287d preparing for asynchronous generation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2966
diff changeset
436 if (synchronous)
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
437 {
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
438 bool streaming;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
439
3181
6fd38327e777 Fix issue #130 (Orthanc failed to start when /tmp partition was full)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3161
diff changeset
440 {
6fd38327e777 Fix issue #130 (Orthanc failed to start when /tmp partition was full)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3161
diff changeset
441 OrthancConfiguration::ReaderLock lock;
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
442 streaming = lock.GetConfiguration().GetBooleanParameter("SynchronousZipStream", true); // New in Orthanc 1.9.4
3181
6fd38327e777 Fix issue #130 (Orthanc failed to start when /tmp partition was full)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3161
diff changeset
443 }
6fd38327e777 Fix issue #130 (Orthanc failed to start when /tmp partition was full)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3161
diff changeset
444
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
445 if (streaming)
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
446 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
447 LOG(INFO) << "Streaming a ZIP archive";
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
448 boost::shared_ptr<SharedMessageQueue> queue(new SharedMessageQueue);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
449
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
450 job->AcquireSynchronousTarget(new SynchronousZipStream(queue));
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
451
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
452 std::string jobId;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
453 context.GetJobsEngine().GetRegistry().Submit(jobId, job.release(), priority);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
454
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
455 SynchronousZipSender sender(context, jobId, queue, filename);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
456 output.AnswerWithoutBuffering(sender);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
457
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
458 // If we reach this line, this means that
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
459 // "SynchronousZipSender::ReadNextChunk()" has returned "false"
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
460 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
461 else
2969
2c16c29b287d preparing for asynchronous generation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2966
diff changeset
462 {
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
463 // This was the only behavior in Orthanc <= 1.9.3
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
464 LOG(INFO) << "Not streaming a ZIP archive (use of a temporary file)";
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
465 boost::shared_ptr<TemporaryFile> tmp;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
466
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
467 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
468 OrthancConfiguration::ReaderLock lock;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
469 tmp.reset(lock.GetConfiguration().CreateTemporaryFile());
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
470 }
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
471
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
472 job->AcquireSynchronousTarget(new SynchronousTemporaryStream(tmp));
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
473
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
474 Json::Value publicContent;
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
475 context.GetJobsEngine().GetRegistry().SubmitAndWait
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
476 (publicContent, job.release(), priority);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
477
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
478 {
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
479 // The archive is now created: Prepare the sending of the ZIP file
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
480 FilesystemHttpSender sender(tmp->GetPath(), MimeType_Zip);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
481 sender.SetContentFilename(filename);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
482
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
483 // Send the ZIP
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
484 output.AnswerStream(sender);
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
485 }
2969
2c16c29b287d preparing for asynchronous generation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2966
diff changeset
486 }
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
487 }
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
488 else
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
489 {
2976
cb5d75143da0 Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2970
diff changeset
490 OrthancRestApi::SubmitGenericJob(output, context, job.release(), false, priority);
2969
2c16c29b287d preparing for asynchronous generation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2966
diff changeset
491 }
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
492 }
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
493
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
494
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
495 static void DocumentPostArguments(RestApiPostCall& call,
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
496 bool isMedia,
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
497 bool defaultExtended)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
498 {
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
499 call.GetDocumentation()
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
500 .SetRequestField("Synchronous", RestApiCallDocumentation::Type_Boolean,
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
501 "If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly "
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
502 "contain the ZIP file. This is the default, easy behavior. However, if global configuration option "
4751
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4690
diff changeset
503 "\"SynchronousZipStream\" is set to \"false\", asynchronous transfers should be preferred for "
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
504 "large amount of data, as the creation of the temporary file might lead to network timeouts.", false)
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
505 .SetRequestField("Asynchronous", RestApiCallDocumentation::Type_Boolean,
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
506 "If `true`, create the archive in asynchronous mode, which means that a job is submitted to create "
4674
cdab941fe17d ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
507 "the archive in background.", false)
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
508 .SetRequestField(KEY_TRANSCODE, RestApiCallDocumentation::Type_String,
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
509 "If present, the DICOM files in the archive will be transcoded to the provided "
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
510 "transfer syntax: https://book.orthanc-server.com/faq/transcoding.html", false)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
511 .SetRequestField("Priority", RestApiCallDocumentation::Type_Number,
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
512 "In asynchronous mode, the priority of the job. The lower the value, the higher the priority.", false)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
513 .AddAnswerType(MimeType_Zip, "In synchronous mode, the ZIP file containing the archive")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
514 .AddAnswerType(MimeType_Json, "In asynchronous mode, information about the job that has been submitted to "
4417
a4518adede59 openapi for plugins and jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
515 "generate the archive: https://book.orthanc-server.com/users/advanced-rest.html#jobs")
a4518adede59 openapi for plugins and jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
516 .SetAnswerField("ID", RestApiCallDocumentation::Type_String, "Identifier of the job")
a4518adede59 openapi for plugins and jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
517 .SetAnswerField("Path", RestApiCallDocumentation::Type_String, "Path to access the job in the REST API");
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
518
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
519 if (isMedia)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
520 {
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
521 call.GetDocumentation().SetRequestField(
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
522 KEY_EXTENDED, RestApiCallDocumentation::Type_Boolean, "If `true`, will include additional "
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
523 "tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is " +
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
524 std::string(defaultExtended ? "`true`" : "`false`") + ".", false);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
525 }
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
526 }
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
527
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
528
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
529 template <bool IS_MEDIA,
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
530 bool DEFAULT_IS_EXTENDED /* only makes sense for media (i.e. not ZIP archives) */ >
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
531 static void CreateBatch(RestApiPostCall& call)
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
532 {
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
533 if (call.IsDocumentation())
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
534 {
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
535 DocumentPostArguments(call, IS_MEDIA, DEFAULT_IS_EXTENDED);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
536 std::string m = (IS_MEDIA ? "DICOMDIR media" : "ZIP archive");
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
537 call.GetDocumentation()
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
538 .SetTag("System")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
539 .SetSummary("Create " + m)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
540 .SetDescription("Create a " + m + " containing the DICOM resources (patients, studies, series, or instances) "
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
541 "whose Orthanc identifiers are provided in the body")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
542 .SetRequestField("Resources", RestApiCallDocumentation::Type_JsonListOfStrings,
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
543 "The list of Orthanc identifiers of interest.", false);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
544 return;
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
545 }
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
546
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
547 ServerContext& context = OrthancRestApi::GetContext(call);
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
548
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
549 Json::Value body;
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
550 if (call.ParseJsonRequest(body))
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
551 {
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
552 bool synchronous, extended, transcode;
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
553 DicomTransferSyntax transferSyntax;
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
554 int priority;
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
555 unsigned int loaderThreads;
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
556 GetJobParameters(synchronous, extended, transcode, transferSyntax,
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
557 priority, loaderThreads, body, DEFAULT_IS_EXTENDED);
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
558
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
559 std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended));
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
560 AddResourcesOfInterest(*job, body);
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
561
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
562 if (transcode)
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
563 {
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
564 job->SetTranscode(transferSyntax);
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
565 }
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
566
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
567 job->SetLoaderThreads(loaderThreads);
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
568
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
569 SubmitJob(call.GetOutput(), context, job, priority, synchronous, "Archive.zip");
2966
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
570 }
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
571 else
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
572 {
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
573 throw OrthancException(ErrorCode_BadFileFormat,
10c610e80b15 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
574 "Expected a list of resources to archive in the body");
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
575 }
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
576 }
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
577
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
578
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
579 template <bool IS_MEDIA>
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
580 static void CreateSingleGet(RestApiGetCall& call)
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
581 {
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
582 static const char* const TRANSCODE = "transcode";
4987
48b53ac404d9 New option "filename" in "/.../{id}/archive" and "/.../{id}/media"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4902
diff changeset
583 static const char* const FILENAME = "filename";
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
584
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
585 if (call.IsDocumentation())
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
586 {
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
587 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
588 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
589 std::string m = (IS_MEDIA ? "DICOMDIR media" : "ZIP archive");
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
590 call.GetDocumentation()
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
591 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
592 .SetSummary("Create " + m)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
593 .SetDescription("Synchronously create a " + m + " containing the DICOM " + r +
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
594 " whose Orthanc identifier is provided in the URL. This flavor is synchronous, "
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
595 "which might *not* be desirable to archive large amount of data, as it might "
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
596 "lead to network timeouts. Prefer the asynchronous version using `POST` method.")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
597 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
4987
48b53ac404d9 New option "filename" in "/.../{id}/archive" and "/.../{id}/media"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4902
diff changeset
598 .SetHttpGetArgument(FILENAME, RestApiCallDocumentation::Type_String,
48b53ac404d9 New option "filename" in "/.../{id}/archive" and "/.../{id}/media"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4902
diff changeset
599 "Filename to set in the \"Content-Disposition\" HTTP header "
48b53ac404d9 New option "filename" in "/.../{id}/archive" and "/.../{id}/media"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4902
diff changeset
600 "(including file extension)", false)
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
601 .SetHttpGetArgument(TRANSCODE, RestApiCallDocumentation::Type_String,
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
602 "If present, the DICOM files in the archive will be transcoded to the provided "
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
603 "transfer syntax: https://book.orthanc-server.com/faq/transcoding.html", false)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
604 .AddAnswerType(MimeType_Zip, "ZIP file containing the archive");
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
605 if (IS_MEDIA)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
606 {
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
607 call.GetDocumentation().SetHttpGetArgument(
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
608 "extended", RestApiCallDocumentation::Type_String,
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
609 "If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*", false);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
610 }
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
611 return;
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
612 }
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
613
2630
00327e989458 creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2629
diff changeset
614 ServerContext& context = OrthancRestApi::GetContext(call);
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
615
4987
48b53ac404d9 New option "filename" in "/.../{id}/archive" and "/.../{id}/media"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4902
diff changeset
616 const std::string id = call.GetUriComponent("id", "");
48b53ac404d9 New option "filename" in "/.../{id}/archive" and "/.../{id}/media"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4902
diff changeset
617 const std::string filename = call.GetArgument(FILENAME, id + ".zip"); // New in Orthanc 1.11.0
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
618
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
619 bool extended;
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
620 if (IS_MEDIA)
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
621 {
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
622 extended = call.HasArgument("extended");
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
623 }
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
624 else
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
625 {
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
626 extended = false;
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
627 }
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
628
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
629 std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended));
2632
2406ae891747 ArchiveJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2630
diff changeset
630 job->AddResource(id);
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
631
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
632 if (call.HasArgument(TRANSCODE))
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
633 {
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
634 job->SetTranscode(GetTransferSyntax(call.GetArgument(TRANSCODE, "")));
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
635 }
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
636
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
637 {
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
638 OrthancConfiguration::ReaderLock lock;
4902
df86d2505df8 Orthanc 1.9.8 is now known as Orthanc 1.10.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
639 unsigned int loaderThreads = lock.GetConfiguration().GetUnsignedIntegerParameter(CONFIG_LOADER_THREADS, 0); // New in Orthanc 1.10.0
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
640 job->SetLoaderThreads(loaderThreads);
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
641 }
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
642
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
643 SubmitJob(call.GetOutput(), context, job, 0 /* priority */,
4987
48b53ac404d9 New option "filename" in "/.../{id}/archive" and "/.../{id}/media"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4902
diff changeset
644 true /* synchronous */, filename);
1778
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
645 }
776573e592da create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1777
diff changeset
646
1774
784a6b92d2f1 start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1623
diff changeset
647
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
648 template <bool IS_MEDIA>
2978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
649 static void CreateSinglePost(RestApiPostCall& call)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
650 {
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
651 if (call.IsDocumentation())
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
652 {
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
653 DocumentPostArguments(call, IS_MEDIA, false /* not extended by default */);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
654 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
655 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
656 std::string m = (IS_MEDIA ? "DICOMDIR media" : "ZIP archive");
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
657 call.GetDocumentation()
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
658 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
659 .SetSummary("Create " + m)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
660 .SetDescription("Create a " + m + " containing the DICOM " + r +
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
661 " whose Orthanc identifier is provided in the URL")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
662 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest");
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
663 return;
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
664 }
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
665
2978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
666 ServerContext& context = OrthancRestApi::GetContext(call);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
667
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
668 std::string id = call.GetUriComponent("id", "");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
669
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
670 Json::Value body;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
671 if (call.ParseJsonRequest(body))
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
672 {
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
673 bool synchronous, extended, transcode;
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
674 DicomTransferSyntax transferSyntax;
2978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
675 int priority;
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
676 unsigned int loaderThreads;
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
677 GetJobParameters(synchronous, extended, transcode, transferSyntax,
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
678 priority, loaderThreads, body, false /* by default, not extented */);
2978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
679
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
680 std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended));
2978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
681 job->AddResource(id);
3913
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
682
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
683 if (transcode)
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
684 {
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
685 job->SetTranscode(transferSyntax);
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
686 }
6ddad3e0b569 transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3712
diff changeset
687
4797
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
688 job->SetLoaderThreads(loaderThreads);
4e765c18ace7 enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents: 4751
diff changeset
689
2978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
690 SubmitJob(call.GetOutput(), context, job, priority, synchronous, id + ".zip");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
691 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
692 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
693 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
694 throw OrthancException(ErrorCode_BadFileFormat);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
695 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
696 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
697
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
698
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
699 void OrthancRestApi::RegisterArchive()
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
700 {
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
701 Register("/patients/{id}/archive", CreateSingleGet<false /* ZIP */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
702 Register("/patients/{id}/archive", CreateSinglePost<false /* ZIP */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
703 Register("/patients/{id}/media", CreateSingleGet<true /* media */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
704 Register("/patients/{id}/media", CreateSinglePost<true /* media */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
705 Register("/series/{id}/archive", CreateSingleGet<false /* ZIP */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
706 Register("/series/{id}/archive", CreateSinglePost<false /* ZIP */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
707 Register("/series/{id}/media", CreateSingleGet<true /* media */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
708 Register("/series/{id}/media", CreateSinglePost<true /* media */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
709 Register("/studies/{id}/archive", CreateSingleGet<false /* ZIP */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
710 Register("/studies/{id}/archive", CreateSinglePost<false /* ZIP */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
711 Register("/studies/{id}/media", CreateSingleGet<true /* media */>);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
712 Register("/studies/{id}/media", CreateSinglePost<true /* media */>);
2978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2976
diff changeset
713
2970
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
714 Register("/tools/create-archive",
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
715 CreateBatch<false /* ZIP */, false /* extended makes no sense in ZIP */>);
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
716 Register("/tools/create-media",
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
717 CreateBatch<true /* media */, false /* not extended by default */>);
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
718 Register("/tools/create-media-extended",
eea66afed0db remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2969
diff changeset
719 CreateBatch<true /* media */, true /* extended by default */>);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
720 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
721 }