Mercurial > hg > orthanc
annotate OrthancServer/Sources/OrthancRestApi/OrthancRestArchive.cpp @ 5858:66fd63b8601e find-refactoring tip
StorageAccessOnFind: cont
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Mon, 04 Nov 2024 22:34:14 +0100 |
parents | c93ca8047550 |
children |
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 | 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 |
5640
f7adfb22e20e
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5576
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
f7adfb22e20e
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5576
diff
changeset
|
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium |
5485
48b8dae6dc77
upgrade to year 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5447
diff
changeset
|
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
751
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * This program is free software: you can redistribute it and/or |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * 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
|
11 * published by the Free Software Foundation, either version 3 of the |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * License, or (at your option) any later version. |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * 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
|
15 * WITHOUT ANY WARRANTY; without even the implied warranty of |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * General Public License for more details. |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * 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
|
20 * 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
|
21 **/ |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
831
84513f2ee1f3
pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
24 #include "../PrecompiledHeadersServer.h" |
751
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 #include "OrthancRestApi.h" |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 |
4674
cdab941fe17d
ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
27 #include "../../../OrthancFramework/Sources/Compression/ZipWriter.h" |
4045 | 28 #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
|
29 #include "../../../OrthancFramework/Sources/Logging.h" |
4045 | 30 #include "../../../OrthancFramework/Sources/OrthancException.h" |
31 #include "../../../OrthancFramework/Sources/SerializationToolbox.h" | |
5447
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
32 #include "../../../OrthancFramework/Sources/Toolbox.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
|
33 #include "../OrthancConfiguration.h" |
3095
beeeb6096f27
removing dependencies upon ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
34 #include "../ServerContext.h" |
2632 | 35 #include "../ServerJobs/ArchiveJob.h" |
751
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 |
4674
cdab941fe17d
ZIP archive/media generated in synchronous mode are now streamed by default
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
37 #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
|
38 |
3095
beeeb6096f27
removing dependencies upon ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
39 |
751
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 namespace Orthanc |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 { |
2966 | 42 static const char* const KEY_RESOURCES = "Resources"; |
43 static const char* const KEY_EXTENDED = "Extended"; | |
3913
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
44 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
|
45 |
4e765c18ace7
enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents:
4751
diff
changeset
|
46 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
|
47 |
5447
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
48 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
49 static void AddResourcesOfInterestFromString(ArchiveJob& job, |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
50 const std::string& resourcesList) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
51 { |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
52 std::set<std::string> resources; |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
53 Toolbox::SplitString(resources, resourcesList, ','); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
54 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
55 for (std::set<std::string>::const_iterator it = resources.begin(); it != resources.end(); ++it) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
56 { |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
57 job.AddResource(*it, false, ResourceType_Patient /* dummy value */); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
58 } |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
59 } |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
60 |
2966 | 61 static void AddResourcesOfInterestFromArray(ArchiveJob& job, |
62 const Json::Value& resources) | |
1774
784a6b92d2f1
start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1623
diff
changeset
|
63 { |
2966 | 64 if (resources.type() != Json::arrayValue) |
1774
784a6b92d2f1
start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1623
diff
changeset
|
65 { |
2966 | 66 throw OrthancException(ErrorCode_BadFileFormat, |
67 "Expected a list of strings (Orthanc identifiers)"); | |
68 } | |
69 | |
70 for (Json::Value::ArrayIndex i = 0; i < resources.size(); i++) | |
71 { | |
72 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
|
73 { |
2966 | 74 throw OrthancException(ErrorCode_BadFileFormat, |
75 "Expected a list of strings (Orthanc identifiers)"); | |
76 } | |
77 else | |
78 { | |
5169
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
79 job.AddResource(resources[i].asString(), false, ResourceType_Patient /* dummy value */); |
1774
784a6b92d2f1
start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1623
diff
changeset
|
80 } |
2966 | 81 } |
82 } | |
1774
784a6b92d2f1
start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1623
diff
changeset
|
83 |
2966 | 84 |
85 static void AddResourcesOfInterest(ArchiveJob& job /* inout */, | |
86 const Json::Value& body /* in */) | |
87 { | |
88 if (body.type() == Json::arrayValue) | |
89 { | |
90 AddResourcesOfInterestFromArray(job, body); | |
91 } | |
92 else if (body.type() == Json::objectValue) | |
93 { | |
94 if (body.isMember(KEY_RESOURCES)) | |
95 { | |
96 AddResourcesOfInterestFromArray(job, body[KEY_RESOURCES]); | |
97 } | |
98 else | |
99 { | |
100 throw OrthancException(ErrorCode_BadFileFormat, | |
101 "Missing field " + std::string(KEY_RESOURCES) + | |
102 " in the JSON body"); | |
103 } | |
1778
776573e592da
create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1777
diff
changeset
|
104 } |
776573e592da
create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1777
diff
changeset
|
105 else |
776573e592da
create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1777
diff
changeset
|
106 { |
2966 | 107 throw OrthancException(ErrorCode_BadFileFormat); |
108 } | |
109 } | |
110 | |
3913
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 | 120 { |
121 synchronous = OrthancRestApi::IsSynchronousJobRequest | |
122 (true /* synchronous by default */, body); | |
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 | 126 if (body.type() == Json::objectValue && |
127 body.isMember(KEY_EXTENDED)) | |
128 { | |
129 extended = SerializationToolbox::ReadBoolean(body, KEY_EXTENDED); | |
130 } | |
131 else | |
132 { | |
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; |
5426
c65e036d649b
StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents:
5403
diff
changeset
|
140 syntax = Orthanc::GetTransferSyntax(SerializationToolbox::ReadString(body, KEY_TRANSCODE)); |
3913
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 | 163 explicit SynchronousZipChunk(bool done) : |
164 done_(done) | |
165 { | |
166 } | |
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 | 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 | 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 | 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 | 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 | 297 (state == JobState_Pending || |
298 state == JobState_Running || | |
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 | 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 | 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"; |
5116 | 448 boost::shared_ptr<SharedMessageQueue> queue(new SharedMessageQueue); |
4674
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 | 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 " |
5432
59e3b6f8c5be
migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5426
diff
changeset
|
510 "transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html", false) |
4416
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
511 .SetRequestField("Priority", RestApiCallDocumentation::Type_Number, |
5740 | 512 "In asynchronous mode, the priority of the job. The higher the value, the higher the priority.", false) |
4416
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 " |
5432
59e3b6f8c5be
migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5426
diff
changeset
|
515 "generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs") |
4417
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) */ > |
5447
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
531 static void CreateBatchPost(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 | 549 Json::Value body; |
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 | 558 |
5401
fc604681e6be
When exporting a study archive, make sure to use the PatientName from the study and not from the patient in case of PatientID collision
Alain Mazy <am@osimis.io>
parents:
5185
diff
changeset
|
559 std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended, ResourceType_Patient)); |
2966 | 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 | 570 } |
571 else | |
572 { | |
573 throw OrthancException(ErrorCode_BadFileFormat, | |
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 |
5447
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
579 template <bool IS_MEDIA, |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
580 bool DEFAULT_IS_EXTENDED /* only makes sense for media (i.e. not ZIP archives) */ > |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
581 static void CreateBatchGet(RestApiGetCall& call) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
582 { |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
583 static const char* const TRANSCODE = "transcode"; |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
584 static const char* const RESOURCES = "resources"; |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
585 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
586 if (call.IsDocumentation()) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
587 { |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
588 std::string m = (IS_MEDIA ? "DICOMDIR media" : "ZIP archive"); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
589 call.GetDocumentation() |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
590 .SetTag("System") |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
591 .SetSummary("Create " + m) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
592 .SetDescription("Create a " + m + " containing the DICOM resources (patients, studies, series, or instances) " |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
593 "whose Orthanc identifiers are provided in the 'resources' argument") |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
594 .SetHttpGetArgument(TRANSCODE, RestApiCallDocumentation::Type_String, |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
595 "If present, the DICOM files will be transcoded to the provided " |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
596 "transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html", false) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
597 .SetHttpGetArgument(RESOURCES, RestApiCallDocumentation::Type_String, |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
598 "A comma separated list of Orthanc resource identifiers to include in the " + m + ".", true); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
599 return; |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
600 } |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
601 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
602 ServerContext& context = OrthancRestApi::GetContext(call); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
603 bool transcode = false; |
5576
3a6d6d35193c
fix build of Housekeeper plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5485
diff
changeset
|
604 DicomTransferSyntax transferSyntax = DicomTransferSyntax_LittleEndianImplicit; // Initialize variable to avoid warnings |
5447
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
605 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
606 if (call.HasArgument(TRANSCODE)) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
607 { |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
608 transcode = true; |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
609 transferSyntax = GetTransferSyntax(call.GetArgument(TRANSCODE, "")); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
610 } |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
611 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
612 if (!call.HasArgument(RESOURCES)) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
613 { |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
614 throw OrthancException(Orthanc::ErrorCode_BadRequest, std::string("Missing ") + RESOURCES + " argument"); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
615 } |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
616 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
617 std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, DEFAULT_IS_EXTENDED, ResourceType_Patient)); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
618 AddResourcesOfInterestFromString(*job, call.GetArgument(RESOURCES, "")); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
619 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
620 if (transcode) |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
621 { |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
622 job->SetTranscode(transferSyntax); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
623 } |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
624 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
625 SubmitJob(call.GetOutput(), context, job, 0, true, "Archive.zip"); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
626 } |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
627 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
628 |
5169
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
629 template <ResourceType LEVEL, |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
630 bool IS_MEDIA> |
2970
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
631 static void CreateSingleGet(RestApiGetCall& call) |
1778
776573e592da
create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1777
diff
changeset
|
632 { |
4797
4e765c18ace7
enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents:
4751
diff
changeset
|
633 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
|
634 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
|
635 |
4416
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
636 if (call.IsDocumentation()) |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
637 { |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
638 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
|
639 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
|
640 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
|
641 call.GetDocumentation() |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
642 .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
|
643 .SetSummary("Create " + m) |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
644 .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
|
645 " 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
|
646 "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
|
647 "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
|
648 .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
|
649 .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
|
650 "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
|
651 "(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
|
652 .SetHttpGetArgument(TRANSCODE, RestApiCallDocumentation::Type_String, |
4416
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
653 "If present, the DICOM files in the archive will be transcoded to the provided " |
5432
59e3b6f8c5be
migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5426
diff
changeset
|
654 "transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html", false) |
4416
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
655 .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
|
656 if (IS_MEDIA) |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
657 { |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
658 call.GetDocumentation().SetHttpGetArgument( |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
659 "extended", RestApiCallDocumentation::Type_String, |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
660 "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
|
661 } |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
662 return; |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
663 } |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
664 |
2630
00327e989458
creating archives/medias is now a job
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2629
diff
changeset
|
665 ServerContext& context = OrthancRestApi::GetContext(call); |
1778
776573e592da
create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1777
diff
changeset
|
666 |
4987
48b53ac404d9
New option "filename" in "/.../{id}/archive" and "/.../{id}/media"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4902
diff
changeset
|
667 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
|
668 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
|
669 |
2970
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
670 bool extended; |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
671 if (IS_MEDIA) |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
672 { |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
673 extended = call.HasArgument("extended"); |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
674 } |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
675 else |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
676 { |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
677 extended = false; |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
678 } |
3913
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
679 |
5403
05cb668c5f3f
fix to keep backward behaviour when exporting a series archive
Alain Mazy <am@osimis.io>
parents:
5401
diff
changeset
|
680 std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended, (LEVEL == ResourceType_Patient ? ResourceType_Patient : ResourceType_Study))); // use patient info from study except when exporting a patient |
5169
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
681 job->AddResource(id, true, LEVEL); |
1778
776573e592da
create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1777
diff
changeset
|
682 |
3913
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
683 if (call.HasArgument(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(GetTransferSyntax(call.GetArgument(TRANSCODE, ""))); |
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 { |
4e765c18ace7
enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents:
4751
diff
changeset
|
689 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
|
690 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
|
691 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
|
692 } |
4e765c18ace7
enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents:
4751
diff
changeset
|
693 |
2970
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
694 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
|
695 true /* synchronous */, filename); |
1778
776573e592da
create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1777
diff
changeset
|
696 } |
776573e592da
create media refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1777
diff
changeset
|
697 |
1774
784a6b92d2f1
start of refactoring the creation of archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1623
diff
changeset
|
698 |
5169
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
699 template <ResourceType LEVEL, |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
700 bool IS_MEDIA> |
2978 | 701 static void CreateSinglePost(RestApiPostCall& call) |
702 { | |
4416
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
703 if (call.IsDocumentation()) |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
704 { |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
705 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
|
706 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
|
707 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
|
708 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
|
709 call.GetDocumentation() |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
710 .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
|
711 .SetSummary("Create " + m) |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
712 .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
|
713 " 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
|
714 .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
|
715 return; |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
716 } |
0b27841950d5
openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
717 |
2978 | 718 ServerContext& context = OrthancRestApi::GetContext(call); |
719 | |
720 std::string id = call.GetUriComponent("id", ""); | |
721 | |
722 Json::Value body; | |
723 if (call.ParseJsonRequest(body)) | |
724 { | |
3913
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
725 bool synchronous, extended, transcode; |
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
726 DicomTransferSyntax transferSyntax; |
2978 | 727 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
|
728 unsigned int loaderThreads; |
3913
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
729 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
|
730 priority, loaderThreads, body, false /* by default, not extented */); |
2978 | 731 |
5401
fc604681e6be
When exporting a study archive, make sure to use the PatientName from the study and not from the patient in case of PatientID collision
Alain Mazy <am@osimis.io>
parents:
5185
diff
changeset
|
732 std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended, LEVEL)); |
5169
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
733 job->AddResource(id, true, LEVEL); |
3913
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
734 |
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
735 if (transcode) |
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
736 { |
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
737 job->SetTranscode(transferSyntax); |
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
738 } |
6ddad3e0b569
transcoding ZIP archive and media
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
739 |
4797
4e765c18ace7
enable using multiple threads to load instances when generating zip archive/media
Alain Mazy <am@osimis.io>
parents:
4751
diff
changeset
|
740 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
|
741 |
2978 | 742 SubmitJob(call.GetOutput(), context, job, priority, synchronous, id + ".zip"); |
743 } | |
744 else | |
745 { | |
746 throw OrthancException(ErrorCode_BadFileFormat); | |
747 } | |
748 } | |
749 | |
750 | |
751
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
751 void OrthancRestApi::RegisterArchive() |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
752 { |
5169
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
753 Register("/patients/{id}/archive", CreateSingleGet<ResourceType_Patient, false /* ZIP */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
754 Register("/patients/{id}/archive", CreateSinglePost<ResourceType_Patient, false /* ZIP */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
755 Register("/patients/{id}/media", CreateSingleGet<ResourceType_Patient, true /* media */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
756 Register("/patients/{id}/media", CreateSinglePost<ResourceType_Patient, true /* media */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
757 Register("/series/{id}/archive", CreateSingleGet<ResourceType_Series, false /* ZIP */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
758 Register("/series/{id}/archive", CreateSinglePost<ResourceType_Series, false /* ZIP */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
759 Register("/series/{id}/media", CreateSingleGet<ResourceType_Series, true /* media */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
760 Register("/series/{id}/media", CreateSinglePost<ResourceType_Series, true /* media */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
761 Register("/studies/{id}/archive", CreateSingleGet<ResourceType_Study, false /* ZIP */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
762 Register("/studies/{id}/archive", CreateSinglePost<ResourceType_Study, false /* ZIP */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
763 Register("/studies/{id}/media", CreateSingleGet<ResourceType_Study, true /* media */>); |
8b74aa4f3515
enforce the existence of the patient/study/instance while creating its archive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5116
diff
changeset
|
764 Register("/studies/{id}/media", CreateSinglePost<ResourceType_Study, true /* media */>); |
2978 | 765 |
2970
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
766 Register("/tools/create-archive", |
5447
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
767 CreateBatchPost<false /* ZIP */, false /* extended makes no sense in ZIP */>); |
2970
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
768 Register("/tools/create-media", |
5447
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
769 CreateBatchPost<true /* media */, false /* not extended by default */>); |
2970
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2969
diff
changeset
|
770 Register("/tools/create-media-extended", |
5447
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
771 CreateBatchPost<true /* media */, true /* extended by default */>); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
772 |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
773 Register("/tools/create-archive", |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
774 CreateBatchGet<false /* ZIP */, false /* extended makes no sense in ZIP */>); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
775 Register("/tools/create-media", |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
776 CreateBatchGet<true /* media */, false /* not extended by default */>); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
777 Register("/tools/create-media-extended", |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
778 CreateBatchGet<true /* media */, true /* extended by default */>); |
dacdce5e5c22
now accepting GET requests on the /tools/create-archive route and siblings
Alain Mazy <am@osimis.io>
parents:
5432
diff
changeset
|
779 |
751
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
780 } |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
781 } |