Mercurial > hg > orthanc
annotate OrthancServer/Sources/OrthancWebDav.cpp @ 5832:dd2af8692cbc find-refactoring
new default ResponseContent
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Wed, 09 Oct 2024 10:23:04 +0200 |
parents | 963945d780d6 |
children | 58c549b881ae |
rev | line source |
---|---|
4240 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5640
f7adfb22e20e
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5485
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:
5485
diff
changeset
|
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium |
5485
48b8dae6dc77
upgrade to year 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5450
diff
changeset
|
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
4240 | 8 * |
9 * This program is free software: you can redistribute it and/or | |
10 * modify it under the terms of the GNU General Public License as | |
11 * published by the Free Software Foundation, either version 3 of the | |
12 * License, or (at your option) any later version. | |
13 * | |
14 * This program is distributed in the hope that it will be useful, but | |
15 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU General Public License | |
20 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 **/ | |
22 | |
23 | |
24 #include "OrthancWebDav.h" | |
25 | |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
26 #include "../../OrthancFramework/Sources/Compression/ZipReader.h" |
4240 | 27 #include "../../OrthancFramework/Sources/DicomFormat/DicomArray.h" |
28 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h" | |
29 #include "../../OrthancFramework/Sources/HttpServer/WebDavStorage.h" | |
4304 | 30 #include "../../OrthancFramework/Sources/Logging.h" |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
31 #include "ResourceFinder.h" |
4240 | 32 #include "Search/DatabaseLookup.h" |
33 #include "ServerContext.h" | |
34 | |
35 #include <boost/regex.hpp> | |
36 #include <boost/algorithm/string/predicate.hpp> | |
37 | |
38 | |
39 static const char* const BY_PATIENTS = "by-patients"; | |
40 static const char* const BY_STUDIES = "by-studies"; | |
4241 | 41 static const char* const BY_DATES = "by-dates"; |
4240 | 42 static const char* const BY_UIDS = "by-uids"; |
43 static const char* const UPLOADS = "uploads"; | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
44 static const char* const STUDY_INFO = "study.json"; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
45 static const char* const SERIES_INFO = "series.json"; |
4240 | 46 |
47 | |
48 namespace Orthanc | |
49 { | |
50 static boost::posix_time::ptime GetNow() | |
51 { | |
52 return boost::posix_time::second_clock::universal_time(); | |
53 } | |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
54 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
55 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
56 static void ParseTime(boost::posix_time::ptime& target, |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
57 const std::string& value) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
58 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
59 try |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
60 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
61 target = boost::posix_time::from_iso_string(value); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
62 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
63 catch (std::exception& e) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
64 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
65 target = GetNow(); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
66 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
67 } |
4240 | 68 |
69 | |
70 static void LookupTime(boost::posix_time::ptime& target, | |
71 ServerContext& context, | |
72 const std::string& publicId, | |
4460
6831de40acd9
New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
73 ResourceType level, |
4240 | 74 MetadataType metadata) |
75 { | |
76 std::string value; | |
4623
95ffe3b6ef7c
handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4588
diff
changeset
|
77 int64_t revision; // Ignored |
95ffe3b6ef7c
handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4588
diff
changeset
|
78 if (context.GetIndex().LookupMetadata(value, revision, publicId, level, metadata)) |
4240 | 79 { |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
80 ParseTime(target, value); |
4240 | 81 } |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
82 else |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
83 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
84 target = GetNow(); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
85 } |
4240 | 86 } |
87 | |
88 | |
89 class OrthancWebDav::DicomIdentifiersVisitor : public ServerContext::ILookupVisitor | |
90 { | |
91 private: | |
92 ServerContext& context_; | |
93 bool isComplete_; | |
94 Collection& target_; | |
95 ResourceType level_; | |
96 | |
97 public: | |
98 DicomIdentifiersVisitor(ServerContext& context, | |
99 Collection& target, | |
100 ResourceType level) : | |
101 context_(context), | |
102 isComplete_(false), | |
103 target_(target), | |
104 level_(level) | |
105 { | |
106 } | |
107 | |
108 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE | |
109 { | |
110 return false; // (*) | |
111 } | |
112 | |
113 virtual void MarkAsComplete() ORTHANC_OVERRIDE | |
114 { | |
115 isComplete_ = true; // TODO | |
116 } | |
117 | |
118 virtual void Visit(const std::string& publicId, | |
119 const std::string& instanceId /* unused */, | |
120 const DicomMap& mainDicomTags, | |
121 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE | |
122 { | |
123 DicomTag tag(0, 0); | |
124 MetadataType timeMetadata; | |
125 | |
126 switch (level_) | |
127 { | |
128 case ResourceType_Study: | |
129 tag = DICOM_TAG_STUDY_INSTANCE_UID; | |
130 timeMetadata = MetadataType_LastUpdate; | |
131 break; | |
132 | |
133 case ResourceType_Series: | |
134 tag = DICOM_TAG_SERIES_INSTANCE_UID; | |
135 timeMetadata = MetadataType_LastUpdate; | |
136 break; | |
137 | |
138 case ResourceType_Instance: | |
139 tag = DICOM_TAG_SOP_INSTANCE_UID; | |
140 timeMetadata = MetadataType_Instance_ReceptionDate; | |
141 break; | |
142 | |
143 default: | |
144 throw OrthancException(ErrorCode_InternalError); | |
145 } | |
146 | |
147 std::string s; | |
148 if (mainDicomTags.LookupStringValue(s, tag, false) && | |
149 !s.empty()) | |
150 { | |
151 std::unique_ptr<Resource> resource; | |
152 | |
153 if (level_ == ResourceType_Instance) | |
154 { | |
155 FileInfo info; | |
4627
f7d5372b59b3
handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4623
diff
changeset
|
156 int64_t revision; // Ignored |
f7d5372b59b3
handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4623
diff
changeset
|
157 if (context_.GetIndex().LookupAttachment(info, revision, publicId, FileContentType_Dicom)) |
4240 | 158 { |
159 std::unique_ptr<File> f(new File(s + ".dcm")); | |
160 f->SetMimeType(MimeType_Dicom); | |
161 f->SetContentLength(info.GetUncompressedSize()); | |
162 resource.reset(f.release()); | |
163 } | |
164 } | |
165 else | |
166 { | |
167 resource.reset(new Folder(s)); | |
168 } | |
169 | |
170 if (resource.get() != NULL) | |
171 { | |
172 boost::posix_time::ptime t; | |
4460
6831de40acd9
New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
173 LookupTime(t, context_, publicId, level_, timeMetadata); |
4240 | 174 resource->SetCreationTime(t); |
175 target_.AddResource(resource.release()); | |
176 } | |
177 } | |
178 } | |
179 }; | |
180 | |
181 | |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
182 class OrthancWebDav::DicomIdentifiersVisitorV2 : public ResourceFinder::IVisitor |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
183 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
184 private: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
185 bool isComplete_; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
186 Collection& target_; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
187 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
188 public: |
5702 | 189 explicit DicomIdentifiersVisitorV2(Collection& target) : |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
190 isComplete_(false), |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
191 target_(target) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
192 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
193 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
194 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
195 virtual void MarkAsComplete() ORTHANC_OVERRIDE |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
196 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
197 isComplete_ = true; // TODO |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
198 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
199 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
200 virtual void Apply(const FindResponse::Resource& resource, |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
201 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
202 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
203 DicomMap resourceTags; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
204 resource.GetMainDicomTags(resourceTags, resource.GetLevel()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
205 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
206 std::string uid; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
207 bool hasUid; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
208 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
209 std::string time; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
210 bool hasTime; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
211 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
212 switch (resource.GetLevel()) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
213 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
214 case ResourceType_Study: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
215 hasUid = resourceTags.LookupStringValue(uid, DICOM_TAG_STUDY_INSTANCE_UID, false); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
216 hasTime = resource.LookupMetadata(time, resource.GetLevel(), MetadataType_LastUpdate); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
217 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
218 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
219 case ResourceType_Series: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
220 hasUid = resourceTags.LookupStringValue(uid, DICOM_TAG_SERIES_INSTANCE_UID, false); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
221 hasTime = resource.LookupMetadata(time, resource.GetLevel(), MetadataType_LastUpdate); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
222 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
223 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
224 case ResourceType_Instance: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
225 hasUid = resourceTags.LookupStringValue(uid, DICOM_TAG_SOP_INSTANCE_UID, false); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
226 hasTime = resource.LookupMetadata(time, resource.GetLevel(), MetadataType_Instance_ReceptionDate); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
227 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
228 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
229 default: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
230 throw OrthancException(ErrorCode_InternalError); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
231 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
232 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
233 if (hasUid && |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
234 !uid.empty()) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
235 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
236 std::unique_ptr<Resource> item; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
237 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
238 if (resource.GetLevel() == ResourceType_Instance) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
239 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
240 FileInfo info; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
241 if (resource.LookupAttachment(info, FileContentType_Dicom)) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
242 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
243 std::unique_ptr<File> f(new File(uid + ".dcm")); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
244 f->SetMimeType(MimeType_Dicom); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
245 f->SetContentLength(info.GetUncompressedSize()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
246 item.reset(f.release()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
247 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
248 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
249 else |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
250 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
251 item.reset(new Folder(uid)); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
252 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
253 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
254 if (item.get() != NULL) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
255 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
256 if (hasTime) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
257 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
258 boost::posix_time::ptime t; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
259 ParseTime(t, time); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
260 item->SetCreationTime(t); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
261 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
262 else |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
263 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
264 item->SetCreationTime(GetNow()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
265 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
266 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
267 target_.AddResource(item.release()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
268 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
269 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
270 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
271 }; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
272 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
273 |
4240 | 274 class OrthancWebDav::DicomFileVisitor : public ServerContext::ILookupVisitor |
275 { | |
276 private: | |
277 ServerContext& context_; | |
278 bool success_; | |
279 std::string& target_; | |
280 boost::posix_time::ptime& time_; | |
281 | |
282 public: | |
283 DicomFileVisitor(ServerContext& context, | |
284 std::string& target, | |
285 boost::posix_time::ptime& time) : | |
286 context_(context), | |
287 success_(false), | |
288 target_(target), | |
289 time_(time) | |
290 { | |
291 } | |
292 | |
293 bool IsSuccess() const | |
294 { | |
295 return success_; | |
296 } | |
297 | |
298 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE | |
299 { | |
300 return false; // (*) | |
301 } | |
302 | |
303 virtual void MarkAsComplete() ORTHANC_OVERRIDE | |
304 { | |
305 } | |
306 | |
307 virtual void Visit(const std::string& publicId, | |
308 const std::string& instanceId /* unused */, | |
309 const DicomMap& mainDicomTags, | |
310 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE | |
311 { | |
312 if (success_) | |
313 { | |
314 success_ = false; // Two matches => Error | |
315 } | |
316 else | |
317 { | |
4460
6831de40acd9
New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
318 LookupTime(time_, context_, publicId, ResourceType_Instance, MetadataType_Instance_ReceptionDate); |
4240 | 319 context_.ReadDicom(target_, publicId); |
320 success_ = true; | |
321 } | |
322 } | |
323 }; | |
324 | |
325 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
326 class OrthancWebDav::DicomFileVisitorV2 : public ResourceFinder::IVisitor |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
327 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
328 private: |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
329 ServerContext& context_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
330 bool success_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
331 std::string& target_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
332 boost::posix_time::ptime& time_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
333 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
334 public: |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
335 DicomFileVisitorV2(ServerContext& context, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
336 std::string& target, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
337 boost::posix_time::ptime& time) : |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
338 context_(context), |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
339 success_(false), |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
340 target_(target), |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
341 time_(time) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
342 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
343 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
344 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
345 bool IsSuccess() const |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
346 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
347 return success_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
348 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
349 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
350 virtual void MarkAsComplete() ORTHANC_OVERRIDE |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
351 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
352 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
353 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
354 virtual void Apply(const FindResponse::Resource& resource, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
355 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
356 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
357 if (success_) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
358 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
359 success_ = false; // Two matches => Error |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
360 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
361 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
362 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
363 std::string s; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
364 if (resource.LookupMetadata(s, ResourceType_Instance, MetadataType_Instance_ReceptionDate)) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
365 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
366 ParseTime(time_, s); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
367 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
368 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
369 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
370 time_ = GetNow(); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
371 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
372 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
373 context_.ReadDicom(target_, resource.GetIdentifier()); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
374 success_ = true; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
375 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
376 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
377 }; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
378 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
379 |
4240 | 380 class OrthancWebDav::OrthancJsonVisitor : public ServerContext::ILookupVisitor |
381 { | |
382 private: | |
383 ServerContext& context_; | |
384 bool success_; | |
385 std::string& target_; | |
386 ResourceType level_; | |
387 | |
388 public: | |
389 OrthancJsonVisitor(ServerContext& context, | |
390 std::string& target, | |
391 ResourceType level) : | |
392 context_(context), | |
393 success_(false), | |
394 target_(target), | |
395 level_(level) | |
396 { | |
397 } | |
398 | |
399 bool IsSuccess() const | |
400 { | |
401 return success_; | |
402 } | |
403 | |
404 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE | |
405 { | |
406 return false; // (*) | |
407 } | |
408 | |
409 virtual void MarkAsComplete() ORTHANC_OVERRIDE | |
410 { | |
411 } | |
412 | |
413 virtual void Visit(const std::string& publicId, | |
414 const std::string& instanceId /* unused */, | |
415 const DicomMap& mainDicomTags, | |
416 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE | |
417 { | |
4554 | 418 Json::Value resource; |
4936
8422e4f99a18
Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents:
4935
diff
changeset
|
419 std::set<DicomTag> emptyRequestedTags; // not supported for webdav |
8422e4f99a18
Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents:
4935
diff
changeset
|
420 |
5058
d4e5ca0c9307
Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents:
4936
diff
changeset
|
421 if (context_.ExpandResource(resource, publicId, level_, DicomToJsonFormat_Human, emptyRequestedTags, true /* allowStorageAccess */)) |
4240 | 422 { |
423 if (success_) | |
424 { | |
425 success_ = false; // Two matches => Error | |
426 } | |
427 else | |
428 { | |
4554 | 429 target_ = resource.toStyledString(); |
4240 | 430 |
431 // Replace UNIX newlines with DOS newlines | |
432 boost::replace_all(target_, "\n", "\r\n"); | |
433 | |
434 success_ = true; | |
435 } | |
436 } | |
437 } | |
438 }; | |
439 | |
440 | |
441 class OrthancWebDav::ResourcesIndex : public boost::noncopyable | |
442 { | |
443 public: | |
444 typedef std::map<std::string, std::string> Map; | |
445 | |
446 private: | |
447 ServerContext& context_; | |
448 ResourceType level_; | |
449 std::string template_; | |
450 Map pathToResource_; | |
451 Map resourceToPath_; | |
452 | |
453 void CheckInvariants() | |
454 { | |
455 #ifndef NDEBUG | |
456 assert(pathToResource_.size() == resourceToPath_.size()); | |
457 | |
458 for (Map::const_iterator it = pathToResource_.begin(); it != pathToResource_.end(); ++it) | |
459 { | |
460 assert(resourceToPath_[it->second] == it->first); | |
461 } | |
462 | |
463 for (Map::const_iterator it = resourceToPath_.begin(); it != resourceToPath_.end(); ++it) | |
464 { | |
465 assert(pathToResource_[it->second] == it->first); | |
466 } | |
467 #endif | |
468 } | |
469 | |
470 void AddTags(DicomMap& target, | |
471 const std::string& resourceId, | |
472 ResourceType tagsFromLevel) | |
473 { | |
474 DicomMap tags; | |
475 if (context_.GetIndex().GetMainDicomTags(tags, resourceId, level_, tagsFromLevel)) | |
476 { | |
477 target.Merge(tags); | |
478 } | |
479 } | |
480 | |
481 void Register(const std::string& resourceId) | |
482 { | |
483 // Don't register twice the same resource | |
484 if (resourceToPath_.find(resourceId) == resourceToPath_.end()) | |
485 { | |
486 std::string name = template_; | |
487 | |
488 DicomMap tags; | |
489 | |
490 AddTags(tags, resourceId, level_); | |
491 | |
492 if (level_ == ResourceType_Study) | |
493 { | |
494 AddTags(tags, resourceId, ResourceType_Patient); | |
495 } | |
496 | |
497 DicomArray arr(tags); | |
498 for (size_t i = 0; i < arr.GetSize(); i++) | |
499 { | |
500 const DicomElement& element = arr.GetElement(i); | |
501 if (!element.GetValue().IsNull() && | |
502 !element.GetValue().IsBinary()) | |
503 { | |
504 const std::string tag = FromDcmtkBridge::GetTagName(element.GetTag(), ""); | |
505 boost::replace_all(name, "{{" + tag + "}}", element.GetValue().GetContent()); | |
506 } | |
507 } | |
508 | |
509 // Blank the tags that were not matched | |
510 static const boost::regex REGEX_BLANK_TAGS("{{.*?}}"); // non-greedy match | |
511 name = boost::regex_replace(name, REGEX_BLANK_TAGS, ""); | |
512 | |
513 // UTF-8 characters cannot be used on Windows XP | |
514 name = Toolbox::ConvertToAscii(name); | |
515 boost::replace_all(name, "/", ""); | |
516 boost::replace_all(name, "\\", ""); | |
517 | |
518 // Trim sequences of spaces as one single space | |
519 static const boost::regex REGEX_TRIM_SPACES("{{.*?}}"); | |
520 name = boost::regex_replace(name, REGEX_TRIM_SPACES, " "); | |
521 name = Toolbox::StripSpaces(name); | |
522 | |
523 size_t count = 0; | |
524 for (;;) | |
525 { | |
526 std::string path = name; | |
527 if (count > 0) | |
528 { | |
529 path += " (" + boost::lexical_cast<std::string>(count) + ")"; | |
530 } | |
531 | |
532 if (pathToResource_.find(path) == pathToResource_.end()) | |
533 { | |
534 pathToResource_[path] = resourceId; | |
535 resourceToPath_[resourceId] = path; | |
536 return; | |
537 } | |
538 | |
539 count++; | |
540 } | |
541 | |
542 throw OrthancException(ErrorCode_InternalError); | |
543 } | |
544 } | |
545 | |
546 public: | |
547 ResourcesIndex(ServerContext& context, | |
548 ResourceType level, | |
549 const std::string& templateString) : | |
550 context_(context), | |
551 level_(level), | |
552 template_(templateString) | |
553 { | |
554 } | |
555 | |
556 ResourceType GetLevel() const | |
557 { | |
558 return level_; | |
559 } | |
560 | |
561 void Refresh(std::set<std::string>& removedPaths /* out */, | |
562 const std::set<std::string>& resources) | |
563 { | |
564 CheckInvariants(); | |
565 | |
566 // Detect the resources that have been removed since last refresh | |
567 removedPaths.clear(); | |
568 std::set<std::string> removedResources; | |
569 | |
570 for (Map::iterator it = resourceToPath_.begin(); it != resourceToPath_.end(); ++it) | |
571 { | |
572 if (resources.find(it->first) == resources.end()) | |
573 { | |
574 const std::string& path = it->second; | |
575 | |
576 assert(pathToResource_.find(path) != pathToResource_.end()); | |
577 pathToResource_.erase(path); | |
578 removedPaths.insert(path); | |
579 | |
580 removedResources.insert(it->first); // Delay the removal to avoid disturbing the iterator | |
581 } | |
582 } | |
583 | |
584 // Remove the missing resources | |
585 for (std::set<std::string>::const_iterator it = removedResources.begin(); it != removedResources.end(); ++it) | |
586 { | |
587 assert(resourceToPath_.find(*it) != resourceToPath_.end()); | |
588 resourceToPath_.erase(*it); | |
589 } | |
590 | |
591 CheckInvariants(); | |
592 | |
593 for (std::set<std::string>::const_iterator it = resources.begin(); it != resources.end(); ++it) | |
594 { | |
595 Register(*it); | |
596 } | |
597 | |
598 CheckInvariants(); | |
599 } | |
600 | |
601 const Map& GetPathToResource() const | |
602 { | |
603 return pathToResource_; | |
604 } | |
605 }; | |
606 | |
607 | |
608 class OrthancWebDav::InstancesOfSeries : public INode | |
609 { | |
610 private: | |
611 ServerContext& context_; | |
612 std::string parentSeries_; | |
613 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
614 static bool LookupInstanceId(std::string& instanceId, |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
615 const UriComponents& path) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
616 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
617 if (path.size() == 1 && |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
618 boost::ends_with(path[0], ".dcm")) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
619 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
620 instanceId = path[0].substr(0, path[0].size() - 4); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
621 return true; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
622 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
623 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
624 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
625 return false; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
626 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
627 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
628 |
4240 | 629 public: |
630 InstancesOfSeries(ServerContext& context, | |
631 const std::string& parentSeries) : | |
632 context_(context), | |
633 parentSeries_(parentSeries) | |
634 { | |
635 } | |
636 | |
637 virtual bool ListCollection(IWebDavBucket::Collection& target, | |
638 const UriComponents& path) ORTHANC_OVERRIDE | |
639 { | |
640 if (path.empty()) | |
641 { | |
642 std::list<std::string> resources; | |
643 try | |
644 { | |
645 context_.GetIndex().GetChildren(resources, parentSeries_); | |
646 } | |
647 catch (OrthancException&) | |
648 { | |
649 // Unknown (or deleted) parent series | |
650 return false; | |
651 } | |
652 | |
653 for (std::list<std::string>::const_iterator | |
654 it = resources.begin(); it != resources.end(); ++it) | |
655 { | |
656 boost::posix_time::ptime time; | |
4460
6831de40acd9
New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
657 LookupTime(time, context_, *it, ResourceType_Instance, MetadataType_Instance_ReceptionDate); |
4240 | 658 |
659 FileInfo info; | |
4627
f7d5372b59b3
handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4623
diff
changeset
|
660 int64_t revision; // Ignored |
f7d5372b59b3
handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4623
diff
changeset
|
661 if (context_.GetIndex().LookupAttachment(info, revision, *it, FileContentType_Dicom)) |
4240 | 662 { |
663 std::unique_ptr<File> resource(new File(*it + ".dcm")); | |
664 resource->SetMimeType(MimeType_Dicom); | |
665 resource->SetContentLength(info.GetUncompressedSize()); | |
666 resource->SetCreationTime(time); | |
667 target.AddResource(resource.release()); | |
668 } | |
669 } | |
670 | |
671 return true; | |
672 } | |
673 else | |
674 { | |
675 return false; | |
676 } | |
677 } | |
678 | |
679 virtual bool GetFileContent(MimeType& mime, | |
680 std::string& content, | |
681 boost::posix_time::ptime& time, | |
682 const UriComponents& path) ORTHANC_OVERRIDE | |
683 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
684 std::string instanceId; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
685 if (LookupInstanceId(instanceId, path)) |
4240 | 686 { |
687 try | |
688 { | |
689 mime = MimeType_Dicom; | |
690 context_.ReadDicom(content, instanceId); | |
4460
6831de40acd9
New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
691 LookupTime(time, context_, instanceId, ResourceType_Instance, MetadataType_Instance_ReceptionDate); |
4240 | 692 return true; |
693 } | |
694 catch (OrthancException&) | |
695 { | |
696 // File was removed | |
697 return false; | |
698 } | |
699 } | |
700 else | |
701 { | |
702 return false; | |
703 } | |
704 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
705 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
706 virtual bool DeleteItem(const UriComponents& path) ORTHANC_OVERRIDE |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
707 { |
4252 | 708 if (path.empty()) |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
709 { |
4252 | 710 // Delete all |
711 std::list<std::string> resources; | |
712 try | |
713 { | |
714 context_.GetIndex().GetChildren(resources, parentSeries_); | |
715 } | |
716 catch (OrthancException&) | |
717 { | |
718 // Unknown (or deleted) parent series | |
719 return true; | |
720 } | |
721 | |
722 for (std::list<std::string>::const_iterator it = resources.begin(); | |
723 it != resources.end(); ++it) | |
724 { | |
725 Json::Value info; | |
726 context_.DeleteResource(info, *it, ResourceType_Instance); | |
727 } | |
728 | |
729 return true; | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
730 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
731 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
732 { |
4252 | 733 std::string instanceId; |
734 if (LookupInstanceId(instanceId, path)) | |
735 { | |
736 Json::Value info; | |
737 return context_.DeleteResource(info, instanceId, ResourceType_Instance); | |
738 } | |
739 else | |
740 { | |
741 return false; | |
742 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
743 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
744 } |
4240 | 745 }; |
746 | |
747 | |
748 | |
749 /** | |
750 * The "InternalNode" class corresponds to a non-leaf node in the | |
751 * WebDAV tree, that only contains subfolders (no file). | |
752 * | |
753 * TODO: Implement a LRU index to dynamically remove the oldest | |
754 * children on high RAM usage. | |
755 **/ | |
756 class OrthancWebDav::InternalNode : public INode | |
757 { | |
758 private: | |
759 typedef std::map<std::string, INode*> Children; | |
760 | |
761 Children children_; | |
762 | |
763 INode* GetChild(const std::string& path) // Don't delete the result pointer! | |
764 { | |
765 Children::const_iterator child = children_.find(path); | |
766 if (child == children_.end()) | |
767 { | |
4253 | 768 INode* node = CreateSubfolder(path); |
4240 | 769 |
4253 | 770 if (node == NULL) |
4240 | 771 { |
772 return NULL; | |
773 } | |
774 else | |
775 { | |
4253 | 776 children_[path] = node; |
777 return node; | |
4240 | 778 } |
779 } | |
780 else | |
781 { | |
782 assert(child->second != NULL); | |
783 return child->second; | |
784 } | |
785 } | |
786 | |
787 protected: | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
788 void InvalidateSubfolder(const std::string& path) |
4240 | 789 { |
790 Children::iterator child = children_.find(path); | |
791 if (child != children_.end()) | |
792 { | |
793 assert(child->second != NULL); | |
794 delete child->second; | |
795 children_.erase(child); | |
796 } | |
797 } | |
798 | |
799 virtual void Refresh() = 0; | |
800 | |
801 virtual bool ListSubfolders(IWebDavBucket::Collection& target) = 0; | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
802 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
803 virtual INode* CreateSubfolder(const std::string& path) = 0; |
4240 | 804 |
805 public: | |
806 virtual ~InternalNode() | |
807 { | |
808 for (Children::iterator it = children_.begin(); it != children_.end(); ++it) | |
809 { | |
810 assert(it->second != NULL); | |
811 delete it->second; | |
812 } | |
813 } | |
814 | |
815 virtual bool ListCollection(IWebDavBucket::Collection& target, | |
816 const UriComponents& path) | |
817 ORTHANC_OVERRIDE ORTHANC_FINAL | |
818 { | |
819 Refresh(); | |
820 | |
821 if (path.empty()) | |
822 { | |
823 return ListSubfolders(target); | |
824 } | |
825 else | |
826 { | |
827 // Recursivity | |
828 INode* child = GetChild(path[0]); | |
829 if (child == NULL) | |
830 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
831 // Must be "true" to allow DELETE on folders that are |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
832 // automatically removed through recursive deletion |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
833 return true; |
4240 | 834 } |
835 else | |
836 { | |
837 UriComponents subpath(path.begin() + 1, path.end()); | |
838 return child->ListCollection(target, subpath); | |
839 } | |
840 } | |
841 } | |
842 | |
843 virtual bool GetFileContent(MimeType& mime, | |
844 std::string& content, | |
845 boost::posix_time::ptime& time, | |
846 const UriComponents& path) | |
847 ORTHANC_OVERRIDE ORTHANC_FINAL | |
848 { | |
849 if (path.empty()) | |
850 { | |
851 return false; // An internal node doesn't correspond to a file | |
852 } | |
853 else | |
854 { | |
855 // Recursivity | |
856 Refresh(); | |
857 | |
858 INode* child = GetChild(path[0]); | |
859 if (child == NULL) | |
860 { | |
861 return false; | |
862 } | |
863 else | |
864 { | |
865 UriComponents subpath(path.begin() + 1, path.end()); | |
866 return child->GetFileContent(mime, content, time, subpath); | |
867 } | |
868 } | |
869 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
870 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
871 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
872 virtual bool DeleteItem(const UriComponents& path) ORTHANC_OVERRIDE ORTHANC_FINAL |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
873 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
874 Refresh(); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
875 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
876 if (path.empty()) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
877 { |
4252 | 878 IWebDavBucket::Collection collection; |
879 if (ListSubfolders(collection)) | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
880 { |
4252 | 881 std::set<std::string> content; |
882 collection.ListDisplayNames(content); | |
883 | |
884 for (std::set<std::string>::const_iterator | |
885 it = content.begin(); it != content.end(); ++it) | |
886 { | |
887 INode* node = GetChild(*it); | |
888 if (node) | |
889 { | |
890 node->DeleteItem(path); | |
891 } | |
892 } | |
893 | |
894 return true; | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
895 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
896 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
897 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
898 return false; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
899 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
900 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
901 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
902 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
903 INode* child = GetChild(path[0]); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
904 if (child == NULL) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
905 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
906 return true; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
907 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
908 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
909 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
910 // Recursivity |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
911 UriComponents subpath(path.begin() + 1, path.end()); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
912 return child->DeleteItem(subpath); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
913 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
914 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
915 } |
4240 | 916 }; |
917 | |
918 | |
919 class OrthancWebDav::ListOfResources : public InternalNode | |
920 { | |
921 private: | |
922 ServerContext& context_; | |
923 const Templates& templates_; | |
924 std::unique_ptr<ResourcesIndex> index_; | |
925 MetadataType timeMetadata_; | |
926 | |
927 protected: | |
928 virtual void Refresh() ORTHANC_OVERRIDE ORTHANC_FINAL | |
929 { | |
930 std::list<std::string> resources; | |
931 GetCurrentResources(resources); | |
932 | |
933 std::set<std::string> removedPaths; | |
934 index_->Refresh(removedPaths, std::set<std::string>(resources.begin(), resources.end())); | |
935 | |
936 // Remove the children whose associated resource doesn't exist anymore | |
937 for (std::set<std::string>::const_iterator | |
938 it = removedPaths.begin(); it != removedPaths.end(); ++it) | |
939 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
940 InvalidateSubfolder(*it); |
4240 | 941 } |
942 } | |
943 | |
944 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE ORTHANC_FINAL | |
945 { | |
946 if (index_->GetLevel() == ResourceType_Instance) | |
947 { | |
948 // Not a collection, no subfolders | |
949 return false; | |
950 } | |
951 else | |
952 { | |
953 const ResourcesIndex::Map& paths = index_->GetPathToResource(); | |
954 | |
955 for (ResourcesIndex::Map::const_iterator it = paths.begin(); it != paths.end(); ++it) | |
956 { | |
957 boost::posix_time::ptime time; | |
4460
6831de40acd9
New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
958 LookupTime(time, context_, it->second, index_->GetLevel(), timeMetadata_); |
4240 | 959 |
960 std::unique_ptr<IWebDavBucket::Resource> resource(new IWebDavBucket::Folder(it->first)); | |
961 resource->SetCreationTime(time); | |
962 target.AddResource(resource.release()); | |
963 } | |
964 | |
965 return true; | |
966 } | |
967 } | |
968 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
969 virtual INode* CreateSubfolder(const std::string& path) ORTHANC_OVERRIDE ORTHANC_FINAL |
4240 | 970 { |
971 ResourcesIndex::Map::const_iterator resource = index_->GetPathToResource().find(path); | |
972 if (resource == index_->GetPathToResource().end()) | |
973 { | |
974 return NULL; | |
975 } | |
976 else | |
977 { | |
978 return CreateResourceNode(resource->second); | |
979 } | |
980 } | |
981 | |
982 ServerContext& GetContext() const | |
983 { | |
984 return context_; | |
985 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
986 |
4240 | 987 virtual void GetCurrentResources(std::list<std::string>& resources) = 0; |
988 | |
989 virtual INode* CreateResourceNode(const std::string& resource) = 0; | |
990 | |
991 public: | |
992 ListOfResources(ServerContext& context, | |
993 ResourceType level, | |
994 const Templates& templates) : | |
995 context_(context), | |
996 templates_(templates) | |
997 { | |
998 Templates::const_iterator t = templates.find(level); | |
999 if (t == templates.end()) | |
1000 { | |
1001 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
1002 } | |
1003 | |
1004 index_.reset(new ResourcesIndex(context, level, t->second)); | |
1005 | |
1006 if (level == ResourceType_Instance) | |
1007 { | |
1008 timeMetadata_ = MetadataType_Instance_ReceptionDate; | |
1009 } | |
1010 else | |
1011 { | |
1012 timeMetadata_ = MetadataType_LastUpdate; | |
1013 } | |
1014 } | |
1015 | |
1016 ResourceType GetLevel() const | |
1017 { | |
1018 return index_->GetLevel(); | |
1019 } | |
1020 | |
1021 const Templates& GetTemplates() const | |
1022 { | |
1023 return templates_; | |
1024 } | |
1025 }; | |
1026 | |
1027 | |
1028 | |
1029 class OrthancWebDav::SingleDicomResource : public ListOfResources | |
1030 { | |
1031 private: | |
1032 std::string parentId_; | |
1033 | |
1034 protected: | |
1035 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE | |
1036 { | |
1037 try | |
1038 { | |
1039 GetContext().GetIndex().GetChildren(resources, parentId_); | |
1040 } | |
1041 catch (OrthancException&) | |
1042 { | |
1043 // Unknown parent resource | |
1044 resources.clear(); | |
1045 } | |
1046 } | |
1047 | |
1048 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE | |
1049 { | |
1050 if (GetLevel() == ResourceType_Instance) | |
1051 { | |
1052 return NULL; | |
1053 } | |
1054 else if (GetLevel() == ResourceType_Series) | |
1055 { | |
1056 return new InstancesOfSeries(GetContext(), resource); | |
1057 } | |
1058 else | |
1059 { | |
1060 ResourceType l = GetChildResourceType(GetLevel()); | |
1061 return new SingleDicomResource(GetContext(), l, resource, GetTemplates()); | |
1062 } | |
1063 } | |
1064 | |
1065 public: | |
1066 SingleDicomResource(ServerContext& context, | |
1067 ResourceType level, | |
1068 const std::string& parentId, | |
1069 const Templates& templates) : | |
1070 ListOfResources(context, level, templates), | |
1071 parentId_(parentId) | |
1072 { | |
1073 } | |
1074 }; | |
1075 | |
1076 | |
1077 class OrthancWebDav::RootNode : public ListOfResources | |
1078 { | |
1079 protected: | |
1080 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE | |
1081 { | |
1082 GetContext().GetIndex().GetAllUuids(resources, GetLevel()); | |
1083 } | |
1084 | |
1085 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE | |
1086 { | |
1087 if (GetLevel() == ResourceType_Series) | |
1088 { | |
1089 return new InstancesOfSeries(GetContext(), resource); | |
1090 } | |
1091 else | |
1092 { | |
1093 ResourceType l = GetChildResourceType(GetLevel()); | |
1094 return new SingleDicomResource(GetContext(), l, resource, GetTemplates()); | |
1095 } | |
1096 } | |
1097 | |
1098 public: | |
1099 RootNode(ServerContext& context, | |
1100 ResourceType level, | |
1101 const Templates& templates) : | |
1102 ListOfResources(context, level, templates) | |
1103 { | |
1104 } | |
1105 }; | |
1106 | |
1107 | |
1108 class OrthancWebDav::ListOfStudiesByDate : public ListOfResources | |
1109 { | |
1110 private: | |
1111 std::string year_; | |
1112 std::string month_; | |
1113 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1114 class Visitor : public ResourceFinder::IVisitor |
4240 | 1115 { |
1116 private: | |
1117 std::list<std::string>& resources_; | |
1118 | |
1119 public: | |
4253 | 1120 explicit Visitor(std::list<std::string>& resources) : |
4240 | 1121 resources_(resources) |
1122 { | |
1123 } | |
1124 | |
1125 virtual void MarkAsComplete() ORTHANC_OVERRIDE | |
1126 { | |
1127 } | |
1128 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1129 virtual void Apply(const FindResponse::Resource& resource, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1130 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
4240 | 1131 { |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1132 resources_.push_back(resource.GetIdentifier()); |
4240 | 1133 } |
1134 }; | |
1135 | |
1136 protected: | |
1137 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE | |
1138 { | |
1139 DatabaseLookup query; | |
1140 query.AddRestConstraint(DICOM_TAG_STUDY_DATE, year_ + month_ + "01-" + year_ + month_ + "31", | |
1141 true /* case sensitive */, true /* mandatory tag */); | |
1142 | |
1143 Visitor visitor(resources); | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1144 |
5829 | 1145 ResourceFinder finder(ResourceType_Study, ResponseContentFlags_ID); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1146 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1147 finder.Execute(visitor, GetContext()); |
4240 | 1148 } |
1149 | |
1150 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE | |
1151 { | |
1152 return new SingleDicomResource(GetContext(), ResourceType_Series, resource, GetTemplates()); | |
1153 } | |
1154 | |
1155 public: | |
1156 ListOfStudiesByDate(ServerContext& context, | |
1157 const std::string& year, | |
1158 const std::string& month, | |
1159 const Templates& templates) : | |
1160 ListOfResources(context, ResourceType_Study, templates), | |
1161 year_(year), | |
1162 month_(month) | |
1163 { | |
1164 if (year.size() != 4 || | |
1165 month.size() != 2) | |
1166 { | |
1167 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
1168 } | |
1169 } | |
1170 }; | |
1171 | |
1172 | |
1173 class OrthancWebDav::ListOfStudiesByMonth : public InternalNode | |
1174 { | |
1175 private: | |
1176 ServerContext& context_; | |
1177 std::string year_; | |
1178 const Templates& templates_; | |
1179 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1180 class Visitor : public ResourceFinder::IVisitor |
4240 | 1181 { |
1182 private: | |
1183 std::set<std::string> months_; | |
1184 | |
1185 public: | |
1186 const std::set<std::string>& GetMonths() const | |
1187 { | |
1188 return months_; | |
1189 } | |
1190 | |
1191 virtual void MarkAsComplete() ORTHANC_OVERRIDE | |
1192 { | |
1193 } | |
1194 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1195 virtual void Apply(const FindResponse::Resource& resource, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1196 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
4240 | 1197 { |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1198 DicomMap mainDicomTags; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1199 resource.GetMainDicomTags(mainDicomTags, ResourceType_Study); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1200 |
4240 | 1201 std::string s; |
1202 if (mainDicomTags.LookupStringValue(s, DICOM_TAG_STUDY_DATE, false) && | |
1203 s.size() == 8) | |
1204 { | |
1205 months_.insert(s.substr(4, 2)); // Get the month from "YYYYMMDD" | |
1206 } | |
1207 } | |
1208 }; | |
1209 | |
1210 protected: | |
1211 virtual void Refresh() ORTHANC_OVERRIDE | |
1212 { | |
1213 } | |
1214 | |
1215 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE | |
1216 { | |
1217 DatabaseLookup query; | |
1218 query.AddRestConstraint(DICOM_TAG_STUDY_DATE, year_ + "0101-" + year_ + "1231", | |
1219 true /* case sensitive */, true /* mandatory tag */); | |
1220 | |
1221 Visitor visitor; | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1222 |
5829 | 1223 ResourceFinder finder(ResourceType_Study, ResponseContentFlags_ID); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1224 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1225 finder.Execute(visitor, context_); |
4240 | 1226 |
1227 for (std::set<std::string>::const_iterator it = visitor.GetMonths().begin(); | |
1228 it != visitor.GetMonths().end(); ++it) | |
1229 { | |
1230 target.AddResource(new IWebDavBucket::Folder(year_ + "-" + *it)); | |
1231 } | |
1232 | |
1233 return true; | |
1234 } | |
1235 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1236 virtual INode* CreateSubfolder(const std::string& path) ORTHANC_OVERRIDE |
4240 | 1237 { |
1238 if (path.size() != 7) // Format: "YYYY-MM" | |
1239 { | |
1240 throw OrthancException(ErrorCode_InternalError); | |
1241 } | |
1242 else | |
1243 { | |
1244 const std::string year = path.substr(0, 4); | |
1245 const std::string month = path.substr(5, 2); | |
1246 return new ListOfStudiesByDate(context_, year, month, templates_); | |
1247 } | |
1248 } | |
1249 | |
1250 public: | |
1251 ListOfStudiesByMonth(ServerContext& context, | |
1252 const std::string& year, | |
1253 const Templates& templates) : | |
1254 context_(context), | |
1255 year_(year), | |
1256 templates_(templates) | |
1257 { | |
1258 if (year_.size() != 4) | |
1259 { | |
1260 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
1261 } | |
1262 } | |
1263 }; | |
1264 | |
1265 | |
1266 class OrthancWebDav::ListOfStudiesByYear : public InternalNode | |
1267 { | |
1268 private: | |
1269 ServerContext& context_; | |
1270 const Templates& templates_; | |
1271 | |
1272 protected: | |
1273 virtual void Refresh() ORTHANC_OVERRIDE | |
1274 { | |
1275 } | |
1276 | |
1277 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE | |
1278 { | |
1279 std::list<std::string> resources; | |
1280 context_.GetIndex().GetAllUuids(resources, ResourceType_Study); | |
1281 | |
1282 std::set<std::string> years; | |
1283 | |
1284 for (std::list<std::string>::const_iterator it = resources.begin(); it != resources.end(); ++it) | |
1285 { | |
1286 DicomMap tags; | |
1287 std::string studyDate; | |
1288 if (context_.GetIndex().GetMainDicomTags(tags, *it, ResourceType_Study, ResourceType_Study) && | |
1289 tags.LookupStringValue(studyDate, DICOM_TAG_STUDY_DATE, false) && | |
1290 studyDate.size() == 8) | |
1291 { | |
1292 years.insert(studyDate.substr(0, 4)); // Get the year from "YYYYMMDD" | |
1293 } | |
1294 } | |
1295 | |
1296 for (std::set<std::string>::const_iterator it = years.begin(); it != years.end(); ++it) | |
1297 { | |
1298 target.AddResource(new IWebDavBucket::Folder(*it)); | |
1299 } | |
1300 | |
1301 return true; | |
1302 } | |
1303 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1304 virtual INode* CreateSubfolder(const std::string& path) ORTHANC_OVERRIDE |
4240 | 1305 { |
1306 return new ListOfStudiesByMonth(context_, path, templates_); | |
1307 } | |
1308 | |
1309 public: | |
1310 ListOfStudiesByYear(ServerContext& context, | |
1311 const Templates& templates) : | |
1312 context_(context), | |
1313 templates_(templates) | |
1314 { | |
1315 } | |
1316 }; | |
1317 | |
1318 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1319 class OrthancWebDav::DicomDeleteVisitor : public ResourceFinder::IVisitor |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1320 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1321 private: |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1322 ServerContext& context_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1323 ResourceType level_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1324 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1325 public: |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1326 DicomDeleteVisitor(ServerContext& context, |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1327 ResourceType level) : |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1328 context_(context), |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1329 level_(level) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1330 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1331 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1332 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1333 virtual void MarkAsComplete() ORTHANC_OVERRIDE |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1334 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1335 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1336 |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1337 virtual void Apply(const FindResponse::Resource& resource, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1338 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1339 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1340 Json::Value info; |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1341 context_.DeleteResource(info, resource.GetIdentifier(), level_); |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1342 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1343 }; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1344 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1345 |
4240 | 1346 void OrthancWebDav::AddVirtualFile(Collection& collection, |
1347 const UriComponents& path, | |
1348 const std::string& filename) | |
1349 { | |
1350 MimeType mime; | |
1351 std::string content; | |
4246 | 1352 boost::posix_time::ptime modification; // Unused, let the date be set to "GetNow()" |
4240 | 1353 |
1354 UriComponents p = path; | |
1355 p.push_back(filename); | |
1356 | |
1357 if (GetFileContent(mime, content, modification, p)) | |
1358 { | |
1359 std::unique_ptr<File> f(new File(filename)); | |
1360 f->SetMimeType(mime); | |
1361 f->SetContentLength(content.size()); | |
1362 collection.AddResource(f.release()); | |
1363 } | |
1364 } | |
1365 | |
1366 | |
1367 void OrthancWebDav::UploadWorker(OrthancWebDav* that) | |
1368 { | |
5450
9ffd6d18daf3
log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents:
5185
diff
changeset
|
1369 Logging::SetCurrentThreadName("WEBDAV-UPLOAD"); |
9ffd6d18daf3
log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents:
5185
diff
changeset
|
1370 |
4240 | 1371 assert(that != NULL); |
1372 | |
1373 boost::posix_time::ptime lastModification = GetNow(); | |
1374 | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1375 while (that->uploadRunning_) |
4240 | 1376 { |
1377 std::unique_ptr<IDynamicObject> obj(that->uploadQueue_.Dequeue(100)); | |
1378 if (obj.get() != NULL) | |
1379 { | |
1380 that->Upload(reinterpret_cast<const SingleValueObject<std::string>&>(*obj).GetValue()); | |
1381 lastModification = GetNow(); | |
1382 } | |
4245
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1383 else if (GetNow() - lastModification > boost::posix_time::seconds(30)) |
4240 | 1384 { |
4245
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1385 /** |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1386 * After every 30 seconds of inactivity, remove the empty |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1387 * folders. This delay is needed to avoid removing |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1388 * just-created folders before the remote WebDAV has time to |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1389 * write files into it. |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1390 **/ |
4268
0ae2ca210077
new macro TLOG() to replace VLOG() for trace logs with a category
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4264
diff
changeset
|
1391 LOG(TRACE) << "Cleaning up the empty WebDAV upload folders"; |
4240 | 1392 that->uploads_.RemoveEmptyFolders(); |
1393 lastModification = GetNow(); | |
1394 } | |
1395 } | |
1396 } | |
1397 | |
1398 | |
1399 void OrthancWebDav::Upload(const std::string& path) | |
1400 { | |
1401 UriComponents uri; | |
1402 Toolbox::SplitUriComponents(uri, path); | |
1403 | |
1404 LOG(INFO) << "Upload from WebDAV: " << path; | |
1405 | |
1406 MimeType mime; | |
1407 std::string content; | |
1408 boost::posix_time::ptime time; | |
1409 if (uploads_.GetFileContent(mime, content, time, uri)) | |
1410 { | |
4244
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1411 bool success = false; |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1412 |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1413 if (ZipReader::IsZipMemoryBuffer(content)) |
4240 | 1414 { |
4374
79ef2b6d8e76
there will be a 1.8.2 release before 1.9.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4358
diff
changeset
|
1415 // New in Orthanc 1.8.2 |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1416 std::unique_ptr<ZipReader> reader(ZipReader::CreateFromMemory(content)); |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1417 |
4386 | 1418 std::string filename, uncompressedFile; |
1419 while (reader->ReadNextFile(filename, uncompressedFile)) | |
4244
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1420 { |
4386 | 1421 if (!uncompressedFile.empty()) |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1422 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1423 LOG(INFO) << "Uploading DICOM file extracted from a ZIP archive in WebDAV: " << filename; |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1424 |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
1425 std::unique_ptr<DicomInstanceToStore> instance(DicomInstanceToStore::CreateFromBuffer(uncompressedFile)); |
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
1426 instance->SetOrigin(DicomInstanceOrigin::FromWebDav()); |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1427 |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1428 std::string publicId; |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1429 |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1430 try |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1431 { |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
1432 context_.Store(publicId, *instance, StoreInstanceMode_Default); |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1433 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1434 catch (OrthancException& e) |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1435 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1436 if (e.GetErrorCode() == ErrorCode_BadFileFormat) |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1437 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1438 LOG(ERROR) << "Cannot import non-DICOM file from ZIP archive: " << filename; |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1439 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1440 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1441 } |
4244
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1442 } |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1443 |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1444 success = true; |
4240 | 1445 } |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1446 else |
4240 | 1447 { |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
1448 std::unique_ptr<DicomInstanceToStore> instance(DicomInstanceToStore::CreateFromBuffer(content)); |
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
1449 instance->SetOrigin(DicomInstanceOrigin::FromWebDav()); |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1450 |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1451 try |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1452 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1453 std::string publicId; |
4796
94616af363ec
added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents:
4697
diff
changeset
|
1454 ServerContext::StoreResult result = context_.Store(publicId, *instance, StoreInstanceMode_Default); |
94616af363ec
added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents:
4697
diff
changeset
|
1455 if (result.GetStatus() == StoreStatus_Success || |
94616af363ec
added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents:
4697
diff
changeset
|
1456 result.GetStatus() == StoreStatus_AlreadyStored) |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1457 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1458 LOG(INFO) << "Successfully imported DICOM instance from WebDAV: " |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1459 << path << " (Orthanc ID: " << publicId << ")"; |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1460 success = true; |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1461 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1462 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1463 catch (OrthancException& e) |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1464 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1465 } |
4244
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1466 } |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1467 |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1468 uploads_.DeleteItem(uri); |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1469 |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1470 if (!success) |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1471 { |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1472 LOG(WARNING) << "Cannot import DICOM instance from WebWAV (maybe not a DICOM file): " << path; |
4240 | 1473 } |
1474 } | |
1475 } | |
1476 | |
1477 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1478 OrthancWebDav::INode& OrthancWebDav::GetRootNode(const std::string& rootPath) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1479 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1480 if (rootPath == BY_PATIENTS) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1481 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1482 return *patients_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1483 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1484 else if (rootPath == BY_STUDIES) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1485 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1486 return *studies_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1487 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1488 else if (rootPath == BY_DATES) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1489 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1490 return *dates_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1491 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1492 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1493 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1494 throw OrthancException(ErrorCode_InternalError); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1495 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1496 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1497 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1498 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1499 OrthancWebDav::OrthancWebDav(ServerContext& context, |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1500 bool allowDicomDelete, |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1501 bool allowUpload) : |
4240 | 1502 context_(context), |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1503 allowDicomDelete_(allowDicomDelete), |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1504 allowUpload_(allowUpload), |
4240 | 1505 uploads_(false /* store uploads as temporary files */), |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1506 uploadRunning_(false) |
4240 | 1507 { |
1508 patientsTemplates_[ResourceType_Patient] = "{{PatientID}} - {{PatientName}}"; | |
1509 patientsTemplates_[ResourceType_Study] = "{{StudyDate}} - {{StudyDescription}}"; | |
1510 patientsTemplates_[ResourceType_Series] = "{{Modality}} - {{SeriesDescription}}"; | |
1511 | |
1512 studiesTemplates_[ResourceType_Study] = "{{PatientID}} - {{PatientName}} - {{StudyDescription}}"; | |
1513 studiesTemplates_[ResourceType_Series] = patientsTemplates_[ResourceType_Series]; | |
1514 | |
1515 patients_.reset(new RootNode(context, ResourceType_Patient, patientsTemplates_)); | |
1516 studies_.reset(new RootNode(context, ResourceType_Study, studiesTemplates_)); | |
1517 dates_.reset(new ListOfStudiesByYear(context, studiesTemplates_)); | |
1518 } | |
1519 | |
1520 | |
1521 bool OrthancWebDav::IsExistingFolder(const UriComponents& path) | |
1522 { | |
1523 if (path.empty()) | |
1524 { | |
1525 return true; | |
1526 } | |
1527 else if (path[0] == BY_UIDS) | |
1528 { | |
1529 return (path.size() <= 3 && | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1530 (path.size() != 3 || path[2] != STUDY_INFO)); |
4240 | 1531 } |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1532 else if (path[0] == BY_PATIENTS || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1533 path[0] == BY_STUDIES || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1534 path[0] == BY_DATES) |
4240 | 1535 { |
4252 | 1536 IWebDavBucket::Collection collection; |
1537 return GetRootNode(path[0]).ListCollection(collection, UriComponents(path.begin() + 1, path.end())); | |
4240 | 1538 } |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1539 else if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1540 path[0] == UPLOADS) |
4240 | 1541 { |
1542 return uploads_.IsExistingFolder(UriComponents(path.begin() + 1, path.end())); | |
1543 } | |
1544 else | |
1545 { | |
1546 return false; | |
1547 } | |
1548 } | |
1549 | |
1550 | |
1551 bool OrthancWebDav::ListCollection(Collection& collection, | |
1552 const UriComponents& path) | |
1553 { | |
1554 if (path.empty()) | |
1555 { | |
4241 | 1556 collection.AddResource(new Folder(BY_DATES)); |
4240 | 1557 collection.AddResource(new Folder(BY_PATIENTS)); |
1558 collection.AddResource(new Folder(BY_STUDIES)); | |
1559 collection.AddResource(new Folder(BY_UIDS)); | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1560 |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1561 if (allowUpload_) |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1562 { |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1563 collection.AddResource(new Folder(UPLOADS)); |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1564 } |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1565 |
4240 | 1566 return true; |
1567 } | |
1568 else if (path[0] == BY_UIDS) | |
1569 { | |
1570 DatabaseLookup query; | |
1571 ResourceType level; | |
1572 size_t limit = 0; // By default, no limits | |
1573 | |
1574 if (path.size() == 1) | |
1575 { | |
1576 level = ResourceType_Study; | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1577 limit = 0; // TODO - Should we limit here? |
4240 | 1578 } |
1579 else if (path.size() == 2) | |
1580 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1581 AddVirtualFile(collection, path, STUDY_INFO); |
4240 | 1582 |
1583 level = ResourceType_Series; | |
1584 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1585 true /* case sensitive */, true /* mandatory tag */); | |
1586 } | |
1587 else if (path.size() == 3) | |
1588 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1589 AddVirtualFile(collection, path, SERIES_INFO); |
4240 | 1590 |
1591 level = ResourceType_Instance; | |
1592 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1593 true /* case sensitive */, true /* mandatory tag */); | |
1594 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2], | |
1595 true /* case sensitive */, true /* mandatory tag */); | |
1596 } | |
1597 else | |
1598 { | |
1599 return false; | |
1600 } | |
1601 | |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1602 if (true) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1603 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1604 /** |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1605 * EXPERIMENTAL VERSION |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1606 **/ |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1607 |
5829 | 1608 ResourceFinder finder(level, ResponseContentFlags_ID); |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1609 finder.SetDatabaseLookup(query); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1610 finder.SetRetrieveMetadata(true); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1611 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1612 switch (level) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1613 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1614 case ResourceType_Study: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1615 finder.AddRequestedTag(DICOM_TAG_STUDY_INSTANCE_UID); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1616 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1617 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1618 case ResourceType_Series: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1619 finder.AddRequestedTag(DICOM_TAG_SERIES_INSTANCE_UID); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1620 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1621 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1622 case ResourceType_Instance: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1623 finder.AddRequestedTag(DICOM_TAG_SOP_INSTANCE_UID); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1624 finder.SetRetrieveAttachments(true); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1625 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1626 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1627 default: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1628 throw OrthancException(ErrorCode_InternalError); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1629 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1630 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1631 DicomIdentifiersVisitorV2 visitor(collection); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1632 finder.Execute(visitor, context_); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1633 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1634 else |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1635 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1636 /** |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1637 * VERSION IN ORTHANC <= 1.12.4 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1638 **/ |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1639 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1640 DicomIdentifiersVisitor visitor(context_, collection, level); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1641 context_.Apply(visitor, query, level, 0 /* since */, limit); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1642 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1643 |
4240 | 1644 return true; |
1645 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1646 else if (path[0] == BY_PATIENTS || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1647 path[0] == BY_STUDIES || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1648 path[0] == BY_DATES) |
4240 | 1649 { |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1650 return GetRootNode(path[0]).ListCollection(collection, UriComponents(path.begin() + 1, path.end())); |
4240 | 1651 } |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1652 else if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1653 path[0] == UPLOADS) |
4240 | 1654 { |
1655 return uploads_.ListCollection(collection, UriComponents(path.begin() + 1, path.end())); | |
1656 } | |
1657 else | |
1658 { | |
1659 return false; | |
1660 } | |
1661 } | |
1662 | |
1663 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1664 static bool GetOrthancJson(std::string& target, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1665 ServerContext& context, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1666 ResourceType level, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1667 const DatabaseLookup& query) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1668 { |
5832 | 1669 ResourceFinder finder(level, ResponseContentFlags_ExpandTrue); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1670 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1671 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1672 Json::Value expanded; |
5713
d851a54e49b7
removed "includeAllMetadata_" member from ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5709
diff
changeset
|
1673 finder.Execute(expanded, context, DicomToJsonFormat_Human, false /* don't add "Metadata" */); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1674 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1675 if (expanded.size() != 1) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1676 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1677 return false; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1678 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1679 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1680 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1681 target = expanded[0].toStyledString(); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1682 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1683 // Replace UNIX newlines with DOS newlines |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1684 boost::replace_all(target, "\n", "\r\n"); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1685 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1686 return true; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1687 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1688 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1689 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1690 |
4240 | 1691 bool OrthancWebDav::GetFileContent(MimeType& mime, |
1692 std::string& content, | |
1693 boost::posix_time::ptime& modificationTime, | |
1694 const UriComponents& path) | |
1695 { | |
1696 if (path.empty()) | |
1697 { | |
1698 return false; | |
1699 } | |
1700 else if (path[0] == BY_UIDS) | |
1701 { | |
1702 if (path.size() == 3 && | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1703 path[2] == STUDY_INFO) |
4240 | 1704 { |
1705 DatabaseLookup query; | |
1706 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1707 true /* case sensitive */, true /* mandatory tag */); | |
1708 | |
1709 mime = MimeType_Json; | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1710 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1711 if (true) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1712 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1713 /** |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1714 * EXPERIMENTAL VERSION |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1715 **/ |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1716 return GetOrthancJson(content, context_, ResourceType_Study, query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1717 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1718 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1719 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1720 /** |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1721 * VERSION IN ORTHANC <= 1.12.4 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1722 **/ |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1723 OrthancJsonVisitor visitor(context_, content, ResourceType_Study); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1724 context_.Apply(visitor, query, ResourceType_Study, 0 /* since */, 0 /* no limit */); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1725 return visitor.IsSuccess(); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1726 } |
4240 | 1727 } |
1728 else if (path.size() == 4 && | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1729 path[3] == SERIES_INFO) |
4240 | 1730 { |
1731 DatabaseLookup query; | |
1732 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1733 true /* case sensitive */, true /* mandatory tag */); | |
1734 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2], | |
1735 true /* case sensitive */, true /* mandatory tag */); | |
1736 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1737 mime = MimeType_Json; |
4240 | 1738 |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1739 if (true) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1740 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1741 /** |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1742 * EXPERIMENTAL VERSION |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1743 **/ |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1744 return GetOrthancJson(content, context_, ResourceType_Series, query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1745 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1746 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1747 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1748 /** |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1749 * VERSION IN ORTHANC <= 1.12.4 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1750 **/ |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1751 OrthancJsonVisitor visitor(context_, content, ResourceType_Series); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1752 context_.Apply(visitor, query, ResourceType_Series, 0 /* since */, 0 /* no limit */); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1753 return visitor.IsSuccess(); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1754 } |
4240 | 1755 } |
1756 else if (path.size() == 4 && | |
1757 boost::ends_with(path[3], ".dcm")) | |
1758 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1759 const std::string sopInstanceUid = path[3].substr(0, path[3].size() - 4); |
4240 | 1760 |
1761 DatabaseLookup query; | |
1762 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1763 true /* case sensitive */, true /* mandatory tag */); | |
1764 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2], | |
1765 true /* case sensitive */, true /* mandatory tag */); | |
1766 query.AddRestConstraint(DICOM_TAG_SOP_INSTANCE_UID, sopInstanceUid, | |
1767 true /* case sensitive */, true /* mandatory tag */); | |
1768 | |
1769 mime = MimeType_Dicom; | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1770 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1771 if (true) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1772 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1773 /** |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1774 * EXPERIMENTAL VERSION |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1775 **/ |
5829 | 1776 ResourceFinder finder(ResourceType_Instance, ResponseContentFlags_ID); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1777 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1778 finder.SetRetrieveMetadata(true); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1779 finder.SetRetrieveAttachments(true); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1780 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1781 DicomFileVisitorV2 visitor(context_, content, modificationTime); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1782 finder.Execute(visitor, context_); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1783 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1784 return visitor.IsSuccess(); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1785 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1786 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1787 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1788 /** |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1789 * VERSION IN ORTHANC <= 1.12.4 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1790 **/ |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1791 DicomFileVisitor visitor(context_, content, modificationTime); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1792 context_.Apply(visitor, query, ResourceType_Instance, 0 /* since */, 0 /* no limit */); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1793 return visitor.IsSuccess(); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1794 } |
4240 | 1795 } |
1796 else | |
1797 { | |
1798 return false; | |
1799 } | |
1800 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1801 else if (path[0] == BY_PATIENTS || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1802 path[0] == BY_STUDIES || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1803 path[0] == BY_DATES) |
4240 | 1804 { |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1805 return GetRootNode(path[0]).GetFileContent(mime, content, modificationTime, UriComponents(path.begin() + 1, path.end())); |
4241 | 1806 } |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1807 else if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1808 path[0] == UPLOADS) |
4240 | 1809 { |
1810 return uploads_.GetFileContent(mime, content, modificationTime, UriComponents(path.begin() + 1, path.end())); | |
1811 } | |
1812 else | |
1813 { | |
1814 return false; | |
1815 } | |
1816 } | |
1817 | |
1818 | |
1819 bool OrthancWebDav::StoreFile(const std::string& content, | |
1820 const UriComponents& path) | |
1821 { | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1822 if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1823 path.size() >= 1 && |
4240 | 1824 path[0] == UPLOADS) |
1825 { | |
1826 UriComponents subpath(UriComponents(path.begin() + 1, path.end())); | |
1827 | |
1828 if (uploads_.StoreFile(content, subpath)) | |
1829 { | |
1830 if (!content.empty()) | |
1831 { | |
1832 uploadQueue_.Enqueue(new SingleValueObject<std::string>(Toolbox::FlattenUri(subpath))); | |
1833 } | |
1834 return true; | |
1835 } | |
1836 else | |
1837 { | |
1838 return false; | |
1839 } | |
1840 } | |
1841 else | |
1842 { | |
1843 return false; | |
1844 } | |
1845 } | |
1846 | |
1847 | |
1848 bool OrthancWebDav::CreateFolder(const UriComponents& path) | |
1849 { | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1850 if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1851 path.size() >= 1 && |
4240 | 1852 path[0] == UPLOADS) |
1853 { | |
1854 return uploads_.CreateFolder(UriComponents(path.begin() + 1, path.end())); | |
1855 } | |
1856 else | |
1857 { | |
1858 return false; | |
1859 } | |
1860 } | |
1861 | |
1862 | |
1863 bool OrthancWebDav::DeleteItem(const std::vector<std::string>& path) | |
1864 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1865 if (path.empty()) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1866 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1867 return false; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1868 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1869 else if (path[0] == BY_UIDS && |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1870 path.size() >= 2 && |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1871 path.size() <= 4) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1872 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1873 if (allowDicomDelete_) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1874 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1875 ResourceType level; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1876 DatabaseLookup query; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1877 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1878 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1879 true /* case sensitive */, true /* mandatory tag */); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1880 level = ResourceType_Study; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1881 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1882 if (path.size() >= 3) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1883 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1884 if (path[2] == STUDY_INFO) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1885 { |
4252 | 1886 return true; // Allow deletion of virtual files (to avoid blocking recursive DELETE) |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1887 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1888 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1889 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2], |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1890 true /* case sensitive */, true /* mandatory tag */); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1891 level = ResourceType_Series; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1892 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1893 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1894 if (path.size() == 4) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1895 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1896 if (path[3] == SERIES_INFO) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1897 { |
4252 | 1898 return true; // Allow deletion of virtual files (to avoid blocking recursive DELETE) |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1899 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1900 else if (boost::ends_with(path[3], ".dcm")) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1901 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1902 const std::string sopInstanceUid = path[3].substr(0, path[3].size() - 4); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1903 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1904 query.AddRestConstraint(DICOM_TAG_SOP_INSTANCE_UID, sopInstanceUid, |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1905 true /* case sensitive */, true /* mandatory tag */); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1906 level = ResourceType_Instance; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1907 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1908 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1909 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1910 return false; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1911 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1912 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1913 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1914 DicomDeleteVisitor visitor(context_, level); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1915 |
5829 | 1916 ResourceFinder finder(level, ResponseContentFlags_ID); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1917 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1918 finder.Execute(visitor, context_); |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1919 return true; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1920 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1921 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1922 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1923 return false; // read-only |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1924 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1925 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1926 else if (path[0] == BY_PATIENTS || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1927 path[0] == BY_STUDIES || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1928 path[0] == BY_DATES) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1929 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1930 if (allowDicomDelete_) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1931 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1932 return GetRootNode(path[0]).DeleteItem(UriComponents(path.begin() + 1, path.end())); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1933 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1934 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1935 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1936 return false; // read-only |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1937 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1938 } |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1939 else if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1940 path[0] == UPLOADS) |
4240 | 1941 { |
1942 return uploads_.DeleteItem(UriComponents(path.begin() + 1, path.end())); | |
1943 } | |
1944 else | |
1945 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1946 return false; |
4240 | 1947 } |
1948 } | |
1949 | |
1950 | |
1951 void OrthancWebDav::Start() | |
1952 { | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1953 if (uploadRunning_) |
4240 | 1954 { |
1955 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
1956 } | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1957 else if (allowUpload_) |
4240 | 1958 { |
1959 LOG(INFO) << "Starting the WebDAV upload thread"; | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1960 uploadRunning_ = true; |
4240 | 1961 uploadThread_ = boost::thread(UploadWorker, this); |
1962 } | |
1963 } | |
1964 | |
1965 | |
1966 void OrthancWebDav::Stop() | |
1967 { | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1968 if (uploadRunning_) |
4240 | 1969 { |
1970 LOG(INFO) << "Stopping the WebDAV upload thread"; | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1971 uploadRunning_ = false; |
4240 | 1972 if (uploadThread_.joinable()) |
1973 { | |
1974 uploadThread_.join(); | |
1975 } | |
1976 } | |
1977 } | |
1978 } |