Mercurial > hg > orthanc
annotate OrthancServer/Sources/OrthancWebDav.cpp @ 5854:65f8c6dfba50 find-refactoring
cleanup
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Mon, 04 Nov 2024 17:51:46 +0100 |
parents | ea547160f27e |
children | d1dea8ad74a6 |
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 | |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
89 class OrthancWebDav::DicomIdentifiersVisitorV2 : public ResourceFinder::IVisitor |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
90 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
91 private: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
92 bool isComplete_; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
93 Collection& target_; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
94 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
95 public: |
5702 | 96 explicit DicomIdentifiersVisitorV2(Collection& target) : |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
97 isComplete_(false), |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
98 target_(target) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
99 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
100 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
101 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
102 virtual void MarkAsComplete() ORTHANC_OVERRIDE |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
103 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
104 isComplete_ = true; // TODO |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
105 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
106 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
107 virtual void Apply(const FindResponse::Resource& resource, |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
108 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
109 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
110 DicomMap resourceTags; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
111 resource.GetMainDicomTags(resourceTags, resource.GetLevel()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
112 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
113 std::string uid; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
114 bool hasUid; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
115 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
116 std::string time; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
117 bool hasTime; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
118 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
119 switch (resource.GetLevel()) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
120 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
121 case ResourceType_Study: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
122 hasUid = resourceTags.LookupStringValue(uid, DICOM_TAG_STUDY_INSTANCE_UID, false); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
123 hasTime = resource.LookupMetadata(time, resource.GetLevel(), MetadataType_LastUpdate); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
124 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
125 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
126 case ResourceType_Series: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
127 hasUid = resourceTags.LookupStringValue(uid, DICOM_TAG_SERIES_INSTANCE_UID, false); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
128 hasTime = resource.LookupMetadata(time, resource.GetLevel(), MetadataType_LastUpdate); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
129 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
130 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
131 case ResourceType_Instance: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
132 hasUid = resourceTags.LookupStringValue(uid, DICOM_TAG_SOP_INSTANCE_UID, false); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
133 hasTime = resource.LookupMetadata(time, resource.GetLevel(), MetadataType_Instance_ReceptionDate); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
134 break; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
135 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
136 default: |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
137 throw OrthancException(ErrorCode_InternalError); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
138 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
139 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
140 if (hasUid && |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
141 !uid.empty()) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
142 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
143 std::unique_ptr<Resource> item; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
144 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
145 if (resource.GetLevel() == ResourceType_Instance) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
146 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
147 FileInfo info; |
5852
ea547160f27e
StatelessDatabaseOperations: reimplementing LookupAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5850
diff
changeset
|
148 int64_t revision; |
ea547160f27e
StatelessDatabaseOperations: reimplementing LookupAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5850
diff
changeset
|
149 if (resource.LookupAttachment(info, revision, FileContentType_Dicom)) |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
150 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
151 std::unique_ptr<File> f(new File(uid + ".dcm")); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
152 f->SetMimeType(MimeType_Dicom); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
153 f->SetContentLength(info.GetUncompressedSize()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
154 item.reset(f.release()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
155 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
156 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
157 else |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
158 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
159 item.reset(new Folder(uid)); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
160 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
161 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
162 if (item.get() != NULL) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
163 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
164 if (hasTime) |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
165 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
166 boost::posix_time::ptime t; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
167 ParseTime(t, time); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
168 item->SetCreationTime(t); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
169 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
170 else |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
171 { |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
172 item->SetCreationTime(GetNow()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
173 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
174 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
175 target_.AddResource(item.release()); |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
176 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
177 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
178 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
179 }; |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
180 |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
181 |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
182 class OrthancWebDav::DicomFileVisitorV2 : public ResourceFinder::IVisitor |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
183 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
184 private: |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
185 ServerContext& context_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
186 bool success_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
187 std::string& target_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
188 boost::posix_time::ptime& time_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
189 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
190 public: |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
191 DicomFileVisitorV2(ServerContext& context, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
192 std::string& target, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
193 boost::posix_time::ptime& time) : |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
194 context_(context), |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
195 success_(false), |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
196 target_(target), |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
197 time_(time) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
198 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
199 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
200 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
201 bool IsSuccess() const |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
202 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
203 return success_; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
204 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
205 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
206 virtual void MarkAsComplete() ORTHANC_OVERRIDE |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
207 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
208 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
209 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
210 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
|
211 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
212 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
213 if (success_) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
214 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
215 success_ = false; // Two matches => Error |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
216 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
217 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
218 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
219 std::string s; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
220 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
|
221 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
222 ParseTime(time_, s); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
223 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
224 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
225 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
226 time_ = GetNow(); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
227 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
228 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
229 context_.ReadDicom(target_, resource.GetIdentifier()); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
230 success_ = true; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
231 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
232 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
233 }; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
234 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
235 |
4240 | 236 class OrthancWebDav::ResourcesIndex : public boost::noncopyable |
237 { | |
238 public: | |
239 typedef std::map<std::string, std::string> Map; | |
240 | |
241 private: | |
242 ServerContext& context_; | |
243 ResourceType level_; | |
244 std::string template_; | |
245 Map pathToResource_; | |
246 Map resourceToPath_; | |
247 | |
248 void CheckInvariants() | |
249 { | |
250 #ifndef NDEBUG | |
251 assert(pathToResource_.size() == resourceToPath_.size()); | |
252 | |
253 for (Map::const_iterator it = pathToResource_.begin(); it != pathToResource_.end(); ++it) | |
254 { | |
255 assert(resourceToPath_[it->second] == it->first); | |
256 } | |
257 | |
258 for (Map::const_iterator it = resourceToPath_.begin(); it != resourceToPath_.end(); ++it) | |
259 { | |
260 assert(pathToResource_[it->second] == it->first); | |
261 } | |
262 #endif | |
263 } | |
264 | |
265 void AddTags(DicomMap& target, | |
266 const std::string& resourceId, | |
267 ResourceType tagsFromLevel) | |
268 { | |
269 DicomMap tags; | |
270 if (context_.GetIndex().GetMainDicomTags(tags, resourceId, level_, tagsFromLevel)) | |
271 { | |
272 target.Merge(tags); | |
273 } | |
274 } | |
275 | |
276 void Register(const std::string& resourceId) | |
277 { | |
278 // Don't register twice the same resource | |
279 if (resourceToPath_.find(resourceId) == resourceToPath_.end()) | |
280 { | |
281 std::string name = template_; | |
282 | |
283 DicomMap tags; | |
284 | |
285 AddTags(tags, resourceId, level_); | |
286 | |
287 if (level_ == ResourceType_Study) | |
288 { | |
289 AddTags(tags, resourceId, ResourceType_Patient); | |
290 } | |
291 | |
292 DicomArray arr(tags); | |
293 for (size_t i = 0; i < arr.GetSize(); i++) | |
294 { | |
295 const DicomElement& element = arr.GetElement(i); | |
296 if (!element.GetValue().IsNull() && | |
297 !element.GetValue().IsBinary()) | |
298 { | |
299 const std::string tag = FromDcmtkBridge::GetTagName(element.GetTag(), ""); | |
300 boost::replace_all(name, "{{" + tag + "}}", element.GetValue().GetContent()); | |
301 } | |
302 } | |
303 | |
304 // Blank the tags that were not matched | |
305 static const boost::regex REGEX_BLANK_TAGS("{{.*?}}"); // non-greedy match | |
306 name = boost::regex_replace(name, REGEX_BLANK_TAGS, ""); | |
307 | |
308 // UTF-8 characters cannot be used on Windows XP | |
309 name = Toolbox::ConvertToAscii(name); | |
310 boost::replace_all(name, "/", ""); | |
311 boost::replace_all(name, "\\", ""); | |
312 | |
313 // Trim sequences of spaces as one single space | |
314 static const boost::regex REGEX_TRIM_SPACES("{{.*?}}"); | |
315 name = boost::regex_replace(name, REGEX_TRIM_SPACES, " "); | |
316 name = Toolbox::StripSpaces(name); | |
317 | |
318 size_t count = 0; | |
319 for (;;) | |
320 { | |
321 std::string path = name; | |
322 if (count > 0) | |
323 { | |
324 path += " (" + boost::lexical_cast<std::string>(count) + ")"; | |
325 } | |
326 | |
327 if (pathToResource_.find(path) == pathToResource_.end()) | |
328 { | |
329 pathToResource_[path] = resourceId; | |
330 resourceToPath_[resourceId] = path; | |
331 return; | |
332 } | |
333 | |
334 count++; | |
335 } | |
336 | |
337 throw OrthancException(ErrorCode_InternalError); | |
338 } | |
339 } | |
340 | |
341 public: | |
342 ResourcesIndex(ServerContext& context, | |
343 ResourceType level, | |
344 const std::string& templateString) : | |
345 context_(context), | |
346 level_(level), | |
347 template_(templateString) | |
348 { | |
349 } | |
350 | |
351 ResourceType GetLevel() const | |
352 { | |
353 return level_; | |
354 } | |
355 | |
356 void Refresh(std::set<std::string>& removedPaths /* out */, | |
357 const std::set<std::string>& resources) | |
358 { | |
359 CheckInvariants(); | |
360 | |
361 // Detect the resources that have been removed since last refresh | |
362 removedPaths.clear(); | |
363 std::set<std::string> removedResources; | |
364 | |
365 for (Map::iterator it = resourceToPath_.begin(); it != resourceToPath_.end(); ++it) | |
366 { | |
367 if (resources.find(it->first) == resources.end()) | |
368 { | |
369 const std::string& path = it->second; | |
370 | |
371 assert(pathToResource_.find(path) != pathToResource_.end()); | |
372 pathToResource_.erase(path); | |
373 removedPaths.insert(path); | |
374 | |
375 removedResources.insert(it->first); // Delay the removal to avoid disturbing the iterator | |
376 } | |
377 } | |
378 | |
379 // Remove the missing resources | |
380 for (std::set<std::string>::const_iterator it = removedResources.begin(); it != removedResources.end(); ++it) | |
381 { | |
382 assert(resourceToPath_.find(*it) != resourceToPath_.end()); | |
383 resourceToPath_.erase(*it); | |
384 } | |
385 | |
386 CheckInvariants(); | |
387 | |
388 for (std::set<std::string>::const_iterator it = resources.begin(); it != resources.end(); ++it) | |
389 { | |
390 Register(*it); | |
391 } | |
392 | |
393 CheckInvariants(); | |
394 } | |
395 | |
396 const Map& GetPathToResource() const | |
397 { | |
398 return pathToResource_; | |
399 } | |
400 }; | |
401 | |
402 | |
403 class OrthancWebDav::InstancesOfSeries : public INode | |
404 { | |
405 private: | |
406 ServerContext& context_; | |
407 std::string parentSeries_; | |
408 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
409 static bool LookupInstanceId(std::string& instanceId, |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
410 const UriComponents& path) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
411 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
412 if (path.size() == 1 && |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
413 boost::ends_with(path[0], ".dcm")) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
414 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
415 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
|
416 return true; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
417 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
418 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
419 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
420 return false; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
421 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
422 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
423 |
4240 | 424 public: |
425 InstancesOfSeries(ServerContext& context, | |
426 const std::string& parentSeries) : | |
427 context_(context), | |
428 parentSeries_(parentSeries) | |
429 { | |
430 } | |
431 | |
432 virtual bool ListCollection(IWebDavBucket::Collection& target, | |
433 const UriComponents& path) ORTHANC_OVERRIDE | |
434 { | |
435 if (path.empty()) | |
436 { | |
437 std::list<std::string> resources; | |
438 try | |
439 { | |
440 context_.GetIndex().GetChildren(resources, parentSeries_); | |
441 } | |
442 catch (OrthancException&) | |
443 { | |
444 // Unknown (or deleted) parent series | |
445 return false; | |
446 } | |
447 | |
448 for (std::list<std::string>::const_iterator | |
449 it = resources.begin(); it != resources.end(); ++it) | |
450 { | |
451 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
|
452 LookupTime(time, context_, *it, ResourceType_Instance, MetadataType_Instance_ReceptionDate); |
4240 | 453 |
454 FileInfo info; | |
4627
f7d5372b59b3
handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4623
diff
changeset
|
455 int64_t revision; // Ignored |
5850
1980354c8113
add level of interest to StatelessDatabaseOperations::LookupAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5833
diff
changeset
|
456 if (context_.GetIndex().LookupAttachment(info, revision, ResourceType_Instance, *it, FileContentType_Dicom)) |
4240 | 457 { |
458 std::unique_ptr<File> resource(new File(*it + ".dcm")); | |
459 resource->SetMimeType(MimeType_Dicom); | |
460 resource->SetContentLength(info.GetUncompressedSize()); | |
461 resource->SetCreationTime(time); | |
462 target.AddResource(resource.release()); | |
463 } | |
464 } | |
465 | |
466 return true; | |
467 } | |
468 else | |
469 { | |
470 return false; | |
471 } | |
472 } | |
473 | |
474 virtual bool GetFileContent(MimeType& mime, | |
475 std::string& content, | |
476 boost::posix_time::ptime& time, | |
477 const UriComponents& path) ORTHANC_OVERRIDE | |
478 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
479 std::string instanceId; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
480 if (LookupInstanceId(instanceId, path)) |
4240 | 481 { |
482 try | |
483 { | |
484 mime = MimeType_Dicom; | |
485 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
|
486 LookupTime(time, context_, instanceId, ResourceType_Instance, MetadataType_Instance_ReceptionDate); |
4240 | 487 return true; |
488 } | |
489 catch (OrthancException&) | |
490 { | |
491 // File was removed | |
492 return false; | |
493 } | |
494 } | |
495 else | |
496 { | |
497 return false; | |
498 } | |
499 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
500 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
501 virtual bool DeleteItem(const UriComponents& path) ORTHANC_OVERRIDE |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
502 { |
4252 | 503 if (path.empty()) |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
504 { |
4252 | 505 // Delete all |
506 std::list<std::string> resources; | |
507 try | |
508 { | |
509 context_.GetIndex().GetChildren(resources, parentSeries_); | |
510 } | |
511 catch (OrthancException&) | |
512 { | |
513 // Unknown (or deleted) parent series | |
514 return true; | |
515 } | |
516 | |
517 for (std::list<std::string>::const_iterator it = resources.begin(); | |
518 it != resources.end(); ++it) | |
519 { | |
520 Json::Value info; | |
521 context_.DeleteResource(info, *it, ResourceType_Instance); | |
522 } | |
523 | |
524 return true; | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
525 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
526 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
527 { |
4252 | 528 std::string instanceId; |
529 if (LookupInstanceId(instanceId, path)) | |
530 { | |
531 Json::Value info; | |
532 return context_.DeleteResource(info, instanceId, ResourceType_Instance); | |
533 } | |
534 else | |
535 { | |
536 return false; | |
537 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
538 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
539 } |
4240 | 540 }; |
541 | |
542 | |
543 | |
544 /** | |
545 * The "InternalNode" class corresponds to a non-leaf node in the | |
546 * WebDAV tree, that only contains subfolders (no file). | |
547 * | |
548 * TODO: Implement a LRU index to dynamically remove the oldest | |
549 * children on high RAM usage. | |
550 **/ | |
551 class OrthancWebDav::InternalNode : public INode | |
552 { | |
553 private: | |
554 typedef std::map<std::string, INode*> Children; | |
555 | |
556 Children children_; | |
557 | |
558 INode* GetChild(const std::string& path) // Don't delete the result pointer! | |
559 { | |
560 Children::const_iterator child = children_.find(path); | |
561 if (child == children_.end()) | |
562 { | |
4253 | 563 INode* node = CreateSubfolder(path); |
4240 | 564 |
4253 | 565 if (node == NULL) |
4240 | 566 { |
567 return NULL; | |
568 } | |
569 else | |
570 { | |
4253 | 571 children_[path] = node; |
572 return node; | |
4240 | 573 } |
574 } | |
575 else | |
576 { | |
577 assert(child->second != NULL); | |
578 return child->second; | |
579 } | |
580 } | |
581 | |
582 protected: | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
583 void InvalidateSubfolder(const std::string& path) |
4240 | 584 { |
585 Children::iterator child = children_.find(path); | |
586 if (child != children_.end()) | |
587 { | |
588 assert(child->second != NULL); | |
589 delete child->second; | |
590 children_.erase(child); | |
591 } | |
592 } | |
593 | |
594 virtual void Refresh() = 0; | |
595 | |
596 virtual bool ListSubfolders(IWebDavBucket::Collection& target) = 0; | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
597 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
598 virtual INode* CreateSubfolder(const std::string& path) = 0; |
4240 | 599 |
600 public: | |
601 virtual ~InternalNode() | |
602 { | |
603 for (Children::iterator it = children_.begin(); it != children_.end(); ++it) | |
604 { | |
605 assert(it->second != NULL); | |
606 delete it->second; | |
607 } | |
608 } | |
609 | |
610 virtual bool ListCollection(IWebDavBucket::Collection& target, | |
611 const UriComponents& path) | |
612 ORTHANC_OVERRIDE ORTHANC_FINAL | |
613 { | |
614 Refresh(); | |
615 | |
616 if (path.empty()) | |
617 { | |
618 return ListSubfolders(target); | |
619 } | |
620 else | |
621 { | |
622 // Recursivity | |
623 INode* child = GetChild(path[0]); | |
624 if (child == NULL) | |
625 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
626 // 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
|
627 // automatically removed through recursive deletion |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
628 return true; |
4240 | 629 } |
630 else | |
631 { | |
632 UriComponents subpath(path.begin() + 1, path.end()); | |
633 return child->ListCollection(target, subpath); | |
634 } | |
635 } | |
636 } | |
637 | |
638 virtual bool GetFileContent(MimeType& mime, | |
639 std::string& content, | |
640 boost::posix_time::ptime& time, | |
641 const UriComponents& path) | |
642 ORTHANC_OVERRIDE ORTHANC_FINAL | |
643 { | |
644 if (path.empty()) | |
645 { | |
646 return false; // An internal node doesn't correspond to a file | |
647 } | |
648 else | |
649 { | |
650 // Recursivity | |
651 Refresh(); | |
652 | |
653 INode* child = GetChild(path[0]); | |
654 if (child == NULL) | |
655 { | |
656 return false; | |
657 } | |
658 else | |
659 { | |
660 UriComponents subpath(path.begin() + 1, path.end()); | |
661 return child->GetFileContent(mime, content, time, subpath); | |
662 } | |
663 } | |
664 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
665 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
666 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
667 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
|
668 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
669 Refresh(); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
670 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
671 if (path.empty()) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
672 { |
4252 | 673 IWebDavBucket::Collection collection; |
674 if (ListSubfolders(collection)) | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
675 { |
4252 | 676 std::set<std::string> content; |
677 collection.ListDisplayNames(content); | |
678 | |
679 for (std::set<std::string>::const_iterator | |
680 it = content.begin(); it != content.end(); ++it) | |
681 { | |
682 INode* node = GetChild(*it); | |
683 if (node) | |
684 { | |
685 node->DeleteItem(path); | |
686 } | |
687 } | |
688 | |
689 return true; | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
690 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
691 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
692 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
693 return false; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
694 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
695 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
696 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
697 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
698 INode* child = GetChild(path[0]); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
699 if (child == NULL) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
700 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
701 return true; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
702 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
703 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
704 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
705 // Recursivity |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
706 UriComponents subpath(path.begin() + 1, path.end()); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
707 return child->DeleteItem(subpath); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
708 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
709 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
710 } |
4240 | 711 }; |
712 | |
713 | |
714 class OrthancWebDav::ListOfResources : public InternalNode | |
715 { | |
716 private: | |
717 ServerContext& context_; | |
718 const Templates& templates_; | |
719 std::unique_ptr<ResourcesIndex> index_; | |
720 MetadataType timeMetadata_; | |
721 | |
722 protected: | |
723 virtual void Refresh() ORTHANC_OVERRIDE ORTHANC_FINAL | |
724 { | |
725 std::list<std::string> resources; | |
726 GetCurrentResources(resources); | |
727 | |
728 std::set<std::string> removedPaths; | |
729 index_->Refresh(removedPaths, std::set<std::string>(resources.begin(), resources.end())); | |
730 | |
731 // Remove the children whose associated resource doesn't exist anymore | |
732 for (std::set<std::string>::const_iterator | |
733 it = removedPaths.begin(); it != removedPaths.end(); ++it) | |
734 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
735 InvalidateSubfolder(*it); |
4240 | 736 } |
737 } | |
738 | |
739 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE ORTHANC_FINAL | |
740 { | |
741 if (index_->GetLevel() == ResourceType_Instance) | |
742 { | |
743 // Not a collection, no subfolders | |
744 return false; | |
745 } | |
746 else | |
747 { | |
748 const ResourcesIndex::Map& paths = index_->GetPathToResource(); | |
749 | |
750 for (ResourcesIndex::Map::const_iterator it = paths.begin(); it != paths.end(); ++it) | |
751 { | |
752 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
|
753 LookupTime(time, context_, it->second, index_->GetLevel(), timeMetadata_); |
4240 | 754 |
755 std::unique_ptr<IWebDavBucket::Resource> resource(new IWebDavBucket::Folder(it->first)); | |
756 resource->SetCreationTime(time); | |
757 target.AddResource(resource.release()); | |
758 } | |
759 | |
760 return true; | |
761 } | |
762 } | |
763 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
764 virtual INode* CreateSubfolder(const std::string& path) ORTHANC_OVERRIDE ORTHANC_FINAL |
4240 | 765 { |
766 ResourcesIndex::Map::const_iterator resource = index_->GetPathToResource().find(path); | |
767 if (resource == index_->GetPathToResource().end()) | |
768 { | |
769 return NULL; | |
770 } | |
771 else | |
772 { | |
773 return CreateResourceNode(resource->second); | |
774 } | |
775 } | |
776 | |
777 ServerContext& GetContext() const | |
778 { | |
779 return context_; | |
780 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
781 |
4240 | 782 virtual void GetCurrentResources(std::list<std::string>& resources) = 0; |
783 | |
784 virtual INode* CreateResourceNode(const std::string& resource) = 0; | |
785 | |
786 public: | |
787 ListOfResources(ServerContext& context, | |
788 ResourceType level, | |
789 const Templates& templates) : | |
790 context_(context), | |
791 templates_(templates) | |
792 { | |
793 Templates::const_iterator t = templates.find(level); | |
794 if (t == templates.end()) | |
795 { | |
796 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
797 } | |
798 | |
799 index_.reset(new ResourcesIndex(context, level, t->second)); | |
800 | |
801 if (level == ResourceType_Instance) | |
802 { | |
803 timeMetadata_ = MetadataType_Instance_ReceptionDate; | |
804 } | |
805 else | |
806 { | |
807 timeMetadata_ = MetadataType_LastUpdate; | |
808 } | |
809 } | |
810 | |
811 ResourceType GetLevel() const | |
812 { | |
813 return index_->GetLevel(); | |
814 } | |
815 | |
816 const Templates& GetTemplates() const | |
817 { | |
818 return templates_; | |
819 } | |
820 }; | |
821 | |
822 | |
823 | |
824 class OrthancWebDav::SingleDicomResource : public ListOfResources | |
825 { | |
826 private: | |
827 std::string parentId_; | |
828 | |
829 protected: | |
830 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE | |
831 { | |
832 try | |
833 { | |
834 GetContext().GetIndex().GetChildren(resources, parentId_); | |
835 } | |
836 catch (OrthancException&) | |
837 { | |
838 // Unknown parent resource | |
839 resources.clear(); | |
840 } | |
841 } | |
842 | |
843 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE | |
844 { | |
845 if (GetLevel() == ResourceType_Instance) | |
846 { | |
847 return NULL; | |
848 } | |
849 else if (GetLevel() == ResourceType_Series) | |
850 { | |
851 return new InstancesOfSeries(GetContext(), resource); | |
852 } | |
853 else | |
854 { | |
855 ResourceType l = GetChildResourceType(GetLevel()); | |
856 return new SingleDicomResource(GetContext(), l, resource, GetTemplates()); | |
857 } | |
858 } | |
859 | |
860 public: | |
861 SingleDicomResource(ServerContext& context, | |
862 ResourceType level, | |
863 const std::string& parentId, | |
864 const Templates& templates) : | |
865 ListOfResources(context, level, templates), | |
866 parentId_(parentId) | |
867 { | |
868 } | |
869 }; | |
870 | |
871 | |
872 class OrthancWebDav::RootNode : public ListOfResources | |
873 { | |
874 protected: | |
875 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE | |
876 { | |
877 GetContext().GetIndex().GetAllUuids(resources, GetLevel()); | |
878 } | |
879 | |
880 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE | |
881 { | |
882 if (GetLevel() == ResourceType_Series) | |
883 { | |
884 return new InstancesOfSeries(GetContext(), resource); | |
885 } | |
886 else | |
887 { | |
888 ResourceType l = GetChildResourceType(GetLevel()); | |
889 return new SingleDicomResource(GetContext(), l, resource, GetTemplates()); | |
890 } | |
891 } | |
892 | |
893 public: | |
894 RootNode(ServerContext& context, | |
895 ResourceType level, | |
896 const Templates& templates) : | |
897 ListOfResources(context, level, templates) | |
898 { | |
899 } | |
900 }; | |
901 | |
902 | |
903 class OrthancWebDav::ListOfStudiesByDate : public ListOfResources | |
904 { | |
905 private: | |
906 std::string year_; | |
907 std::string month_; | |
908 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
909 class Visitor : public ResourceFinder::IVisitor |
4240 | 910 { |
911 private: | |
912 std::list<std::string>& resources_; | |
913 | |
914 public: | |
4253 | 915 explicit Visitor(std::list<std::string>& resources) : |
4240 | 916 resources_(resources) |
917 { | |
918 } | |
919 | |
920 virtual void MarkAsComplete() ORTHANC_OVERRIDE | |
921 { | |
922 } | |
923 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
924 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
|
925 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
4240 | 926 { |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
927 resources_.push_back(resource.GetIdentifier()); |
4240 | 928 } |
929 }; | |
930 | |
931 protected: | |
932 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE | |
933 { | |
934 DatabaseLookup query; | |
935 query.AddRestConstraint(DICOM_TAG_STUDY_DATE, year_ + month_ + "01-" + year_ + month_ + "31", | |
936 true /* case sensitive */, true /* mandatory tag */); | |
937 | |
938 Visitor visitor(resources); | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
939 |
5829 | 940 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
|
941 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
942 finder.Execute(visitor, GetContext()); |
4240 | 943 } |
944 | |
945 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE | |
946 { | |
947 return new SingleDicomResource(GetContext(), ResourceType_Series, resource, GetTemplates()); | |
948 } | |
949 | |
950 public: | |
951 ListOfStudiesByDate(ServerContext& context, | |
952 const std::string& year, | |
953 const std::string& month, | |
954 const Templates& templates) : | |
955 ListOfResources(context, ResourceType_Study, templates), | |
956 year_(year), | |
957 month_(month) | |
958 { | |
959 if (year.size() != 4 || | |
960 month.size() != 2) | |
961 { | |
962 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
963 } | |
964 } | |
965 }; | |
966 | |
967 | |
968 class OrthancWebDav::ListOfStudiesByMonth : public InternalNode | |
969 { | |
970 private: | |
971 ServerContext& context_; | |
972 std::string year_; | |
973 const Templates& templates_; | |
974 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
975 class Visitor : public ResourceFinder::IVisitor |
4240 | 976 { |
977 private: | |
978 std::set<std::string> months_; | |
979 | |
980 public: | |
981 const std::set<std::string>& GetMonths() const | |
982 { | |
983 return months_; | |
984 } | |
985 | |
986 virtual void MarkAsComplete() ORTHANC_OVERRIDE | |
987 { | |
988 } | |
989 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
990 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
|
991 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
4240 | 992 { |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
993 DicomMap mainDicomTags; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
994 resource.GetMainDicomTags(mainDicomTags, ResourceType_Study); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
995 |
4240 | 996 std::string s; |
997 if (mainDicomTags.LookupStringValue(s, DICOM_TAG_STUDY_DATE, false) && | |
998 s.size() == 8) | |
999 { | |
1000 months_.insert(s.substr(4, 2)); // Get the month from "YYYYMMDD" | |
1001 } | |
1002 } | |
1003 }; | |
1004 | |
1005 protected: | |
1006 virtual void Refresh() ORTHANC_OVERRIDE | |
1007 { | |
1008 } | |
1009 | |
1010 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE | |
1011 { | |
1012 DatabaseLookup query; | |
1013 query.AddRestConstraint(DICOM_TAG_STUDY_DATE, year_ + "0101-" + year_ + "1231", | |
1014 true /* case sensitive */, true /* mandatory tag */); | |
1015 | |
1016 Visitor visitor; | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1017 |
5829 | 1018 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
|
1019 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1020 finder.Execute(visitor, context_); |
4240 | 1021 |
1022 for (std::set<std::string>::const_iterator it = visitor.GetMonths().begin(); | |
1023 it != visitor.GetMonths().end(); ++it) | |
1024 { | |
1025 target.AddResource(new IWebDavBucket::Folder(year_ + "-" + *it)); | |
1026 } | |
1027 | |
1028 return true; | |
1029 } | |
1030 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1031 virtual INode* CreateSubfolder(const std::string& path) ORTHANC_OVERRIDE |
4240 | 1032 { |
1033 if (path.size() != 7) // Format: "YYYY-MM" | |
1034 { | |
1035 throw OrthancException(ErrorCode_InternalError); | |
1036 } | |
1037 else | |
1038 { | |
1039 const std::string year = path.substr(0, 4); | |
1040 const std::string month = path.substr(5, 2); | |
1041 return new ListOfStudiesByDate(context_, year, month, templates_); | |
1042 } | |
1043 } | |
1044 | |
1045 public: | |
1046 ListOfStudiesByMonth(ServerContext& context, | |
1047 const std::string& year, | |
1048 const Templates& templates) : | |
1049 context_(context), | |
1050 year_(year), | |
1051 templates_(templates) | |
1052 { | |
1053 if (year_.size() != 4) | |
1054 { | |
1055 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
1056 } | |
1057 } | |
1058 }; | |
1059 | |
1060 | |
1061 class OrthancWebDav::ListOfStudiesByYear : public InternalNode | |
1062 { | |
1063 private: | |
1064 ServerContext& context_; | |
1065 const Templates& templates_; | |
1066 | |
1067 protected: | |
1068 virtual void Refresh() ORTHANC_OVERRIDE | |
1069 { | |
1070 } | |
1071 | |
1072 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE | |
1073 { | |
1074 std::list<std::string> resources; | |
1075 context_.GetIndex().GetAllUuids(resources, ResourceType_Study); | |
1076 | |
1077 std::set<std::string> years; | |
1078 | |
1079 for (std::list<std::string>::const_iterator it = resources.begin(); it != resources.end(); ++it) | |
1080 { | |
1081 DicomMap tags; | |
1082 std::string studyDate; | |
1083 if (context_.GetIndex().GetMainDicomTags(tags, *it, ResourceType_Study, ResourceType_Study) && | |
1084 tags.LookupStringValue(studyDate, DICOM_TAG_STUDY_DATE, false) && | |
1085 studyDate.size() == 8) | |
1086 { | |
1087 years.insert(studyDate.substr(0, 4)); // Get the year from "YYYYMMDD" | |
1088 } | |
1089 } | |
1090 | |
1091 for (std::set<std::string>::const_iterator it = years.begin(); it != years.end(); ++it) | |
1092 { | |
1093 target.AddResource(new IWebDavBucket::Folder(*it)); | |
1094 } | |
1095 | |
1096 return true; | |
1097 } | |
1098 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1099 virtual INode* CreateSubfolder(const std::string& path) ORTHANC_OVERRIDE |
4240 | 1100 { |
1101 return new ListOfStudiesByMonth(context_, path, templates_); | |
1102 } | |
1103 | |
1104 public: | |
1105 ListOfStudiesByYear(ServerContext& context, | |
1106 const Templates& templates) : | |
1107 context_(context), | |
1108 templates_(templates) | |
1109 { | |
1110 } | |
1111 }; | |
1112 | |
1113 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1114 class OrthancWebDav::DicomDeleteVisitor : public ResourceFinder::IVisitor |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1115 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1116 private: |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1117 ServerContext& context_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1118 ResourceType level_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1119 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1120 public: |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1121 DicomDeleteVisitor(ServerContext& context, |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1122 ResourceType level) : |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1123 context_(context), |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1124 level_(level) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1125 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1126 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1127 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1128 virtual void MarkAsComplete() ORTHANC_OVERRIDE |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1129 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1130 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1131 |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1132 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
|
1133 const DicomMap& requestedTags) ORTHANC_OVERRIDE |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1134 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1135 Json::Value info; |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1136 context_.DeleteResource(info, resource.GetIdentifier(), level_); |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1137 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1138 }; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1139 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1140 |
4240 | 1141 void OrthancWebDav::AddVirtualFile(Collection& collection, |
1142 const UriComponents& path, | |
1143 const std::string& filename) | |
1144 { | |
1145 MimeType mime; | |
1146 std::string content; | |
4246 | 1147 boost::posix_time::ptime modification; // Unused, let the date be set to "GetNow()" |
4240 | 1148 |
1149 UriComponents p = path; | |
1150 p.push_back(filename); | |
1151 | |
1152 if (GetFileContent(mime, content, modification, p)) | |
1153 { | |
1154 std::unique_ptr<File> f(new File(filename)); | |
1155 f->SetMimeType(mime); | |
1156 f->SetContentLength(content.size()); | |
1157 collection.AddResource(f.release()); | |
1158 } | |
1159 } | |
1160 | |
1161 | |
1162 void OrthancWebDav::UploadWorker(OrthancWebDav* that) | |
1163 { | |
5450
9ffd6d18daf3
log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents:
5185
diff
changeset
|
1164 Logging::SetCurrentThreadName("WEBDAV-UPLOAD"); |
9ffd6d18daf3
log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents:
5185
diff
changeset
|
1165 |
4240 | 1166 assert(that != NULL); |
1167 | |
1168 boost::posix_time::ptime lastModification = GetNow(); | |
1169 | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1170 while (that->uploadRunning_) |
4240 | 1171 { |
1172 std::unique_ptr<IDynamicObject> obj(that->uploadQueue_.Dequeue(100)); | |
1173 if (obj.get() != NULL) | |
1174 { | |
1175 that->Upload(reinterpret_cast<const SingleValueObject<std::string>&>(*obj).GetValue()); | |
1176 lastModification = GetNow(); | |
1177 } | |
4245
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1178 else if (GetNow() - lastModification > boost::posix_time::seconds(30)) |
4240 | 1179 { |
4245
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1180 /** |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1181 * After every 30 seconds of inactivity, remove the empty |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1182 * folders. This delay is needed to avoid removing |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1183 * just-created folders before the remote WebDAV has time to |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1184 * write files into it. |
c70df925151e
RequestOrigin_WebDav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4244
diff
changeset
|
1185 **/ |
4268
0ae2ca210077
new macro TLOG() to replace VLOG() for trace logs with a category
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4264
diff
changeset
|
1186 LOG(TRACE) << "Cleaning up the empty WebDAV upload folders"; |
4240 | 1187 that->uploads_.RemoveEmptyFolders(); |
1188 lastModification = GetNow(); | |
1189 } | |
1190 } | |
1191 } | |
1192 | |
1193 | |
1194 void OrthancWebDav::Upload(const std::string& path) | |
1195 { | |
1196 UriComponents uri; | |
1197 Toolbox::SplitUriComponents(uri, path); | |
1198 | |
1199 LOG(INFO) << "Upload from WebDAV: " << path; | |
1200 | |
1201 MimeType mime; | |
1202 std::string content; | |
1203 boost::posix_time::ptime time; | |
1204 if (uploads_.GetFileContent(mime, content, time, uri)) | |
1205 { | |
4244
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1206 bool success = false; |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1207 |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1208 if (ZipReader::IsZipMemoryBuffer(content)) |
4240 | 1209 { |
4374
79ef2b6d8e76
there will be a 1.8.2 release before 1.9.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4358
diff
changeset
|
1210 // 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
|
1211 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
|
1212 |
4386 | 1213 std::string filename, uncompressedFile; |
1214 while (reader->ReadNextFile(filename, uncompressedFile)) | |
4244
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1215 { |
4386 | 1216 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
|
1217 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1218 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
|
1219 |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
1220 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
|
1221 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
|
1222 |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1223 std::string publicId; |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1224 |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1225 try |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1226 { |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
1227 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
|
1228 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1229 catch (OrthancException& e) |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1230 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1231 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
|
1232 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1233 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
|
1234 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1235 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1236 } |
4244
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1237 } |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1238 |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1239 success = true; |
4240 | 1240 } |
4358
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1241 else |
4240 | 1242 { |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
1243 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
|
1244 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
|
1245 |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1246 try |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1247 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1248 std::string publicId; |
4796
94616af363ec
added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents:
4697
diff
changeset
|
1249 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
|
1250 if (result.GetStatus() == StoreStatus_Success || |
94616af363ec
added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents:
4697
diff
changeset
|
1251 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
|
1252 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1253 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
|
1254 << 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
|
1255 success = true; |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1256 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1257 } |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1258 catch (OrthancException& e) |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1259 { |
d6929f052ec4
ZIP archives containing DICOM files can be uploaded using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4304
diff
changeset
|
1260 } |
4244
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1261 } |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1262 |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1263 uploads_.DeleteItem(uri); |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1264 |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1265 if (!success) |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1266 { |
416c35da7d25
robustness against non-dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4243
diff
changeset
|
1267 LOG(WARNING) << "Cannot import DICOM instance from WebWAV (maybe not a DICOM file): " << path; |
4240 | 1268 } |
1269 } | |
1270 } | |
1271 | |
1272 | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1273 OrthancWebDav::INode& OrthancWebDav::GetRootNode(const std::string& rootPath) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1274 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1275 if (rootPath == BY_PATIENTS) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1276 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1277 return *patients_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1278 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1279 else if (rootPath == BY_STUDIES) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1280 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1281 return *studies_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1282 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1283 else if (rootPath == BY_DATES) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1284 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1285 return *dates_; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1286 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1287 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1288 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1289 throw OrthancException(ErrorCode_InternalError); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1290 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1291 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1292 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1293 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1294 OrthancWebDav::OrthancWebDav(ServerContext& context, |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1295 bool allowDicomDelete, |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1296 bool allowUpload) : |
4240 | 1297 context_(context), |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1298 allowDicomDelete_(allowDicomDelete), |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1299 allowUpload_(allowUpload), |
4240 | 1300 uploads_(false /* store uploads as temporary files */), |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1301 uploadRunning_(false) |
4240 | 1302 { |
1303 patientsTemplates_[ResourceType_Patient] = "{{PatientID}} - {{PatientName}}"; | |
1304 patientsTemplates_[ResourceType_Study] = "{{StudyDate}} - {{StudyDescription}}"; | |
1305 patientsTemplates_[ResourceType_Series] = "{{Modality}} - {{SeriesDescription}}"; | |
1306 | |
1307 studiesTemplates_[ResourceType_Study] = "{{PatientID}} - {{PatientName}} - {{StudyDescription}}"; | |
1308 studiesTemplates_[ResourceType_Series] = patientsTemplates_[ResourceType_Series]; | |
1309 | |
1310 patients_.reset(new RootNode(context, ResourceType_Patient, patientsTemplates_)); | |
1311 studies_.reset(new RootNode(context, ResourceType_Study, studiesTemplates_)); | |
1312 dates_.reset(new ListOfStudiesByYear(context, studiesTemplates_)); | |
1313 } | |
1314 | |
1315 | |
1316 bool OrthancWebDav::IsExistingFolder(const UriComponents& path) | |
1317 { | |
1318 if (path.empty()) | |
1319 { | |
1320 return true; | |
1321 } | |
1322 else if (path[0] == BY_UIDS) | |
1323 { | |
1324 return (path.size() <= 3 && | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1325 (path.size() != 3 || path[2] != STUDY_INFO)); |
4240 | 1326 } |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1327 else if (path[0] == BY_PATIENTS || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1328 path[0] == BY_STUDIES || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1329 path[0] == BY_DATES) |
4240 | 1330 { |
4252 | 1331 IWebDavBucket::Collection collection; |
1332 return GetRootNode(path[0]).ListCollection(collection, UriComponents(path.begin() + 1, path.end())); | |
4240 | 1333 } |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1334 else if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1335 path[0] == UPLOADS) |
4240 | 1336 { |
1337 return uploads_.IsExistingFolder(UriComponents(path.begin() + 1, path.end())); | |
1338 } | |
1339 else | |
1340 { | |
1341 return false; | |
1342 } | |
1343 } | |
1344 | |
1345 | |
1346 bool OrthancWebDav::ListCollection(Collection& collection, | |
1347 const UriComponents& path) | |
1348 { | |
1349 if (path.empty()) | |
1350 { | |
4241 | 1351 collection.AddResource(new Folder(BY_DATES)); |
4240 | 1352 collection.AddResource(new Folder(BY_PATIENTS)); |
1353 collection.AddResource(new Folder(BY_STUDIES)); | |
1354 collection.AddResource(new Folder(BY_UIDS)); | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1355 |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1356 if (allowUpload_) |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1357 { |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1358 collection.AddResource(new Folder(UPLOADS)); |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1359 } |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1360 |
4240 | 1361 return true; |
1362 } | |
1363 else if (path[0] == BY_UIDS) | |
1364 { | |
1365 DatabaseLookup query; | |
1366 ResourceType level; | |
1367 | |
1368 if (path.size() == 1) | |
1369 { | |
1370 level = ResourceType_Study; | |
5704
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1371 // TODO - Should we limit here? |
4240 | 1372 } |
1373 else if (path.size() == 2) | |
1374 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1375 AddVirtualFile(collection, path, STUDY_INFO); |
4240 | 1376 |
1377 level = ResourceType_Series; | |
1378 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1379 true /* case sensitive */, true /* mandatory tag */); | |
1380 } | |
1381 else if (path.size() == 3) | |
1382 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1383 AddVirtualFile(collection, path, SERIES_INFO); |
4240 | 1384 |
1385 level = ResourceType_Instance; | |
1386 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1387 true /* case sensitive */, true /* mandatory tag */); | |
1388 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2], | |
1389 true /* case sensitive */, true /* mandatory tag */); | |
1390 } | |
1391 else | |
1392 { | |
1393 return false; | |
1394 } | |
1395 | |
5833
58c549b881ae
merged find-refactoring -> find-refactoring-clean
Alain Mazy <am@orthanc.team>
diff
changeset
|
1396 ResourceFinder finder(level, ResponseContentFlags_ID); |
5704
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1397 finder.SetDatabaseLookup(query); |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1398 finder.SetRetrieveMetadata(true); |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1399 |
5704
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1400 switch (level) |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1401 { |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1402 case ResourceType_Study: |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1403 finder.AddRequestedTag(DICOM_TAG_STUDY_INSTANCE_UID); |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1404 break; |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1405 |
5704
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1406 case ResourceType_Series: |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1407 finder.AddRequestedTag(DICOM_TAG_SERIES_INSTANCE_UID); |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1408 break; |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1409 |
5704
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1410 case ResourceType_Instance: |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1411 finder.AddRequestedTag(DICOM_TAG_SOP_INSTANCE_UID); |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1412 finder.SetRetrieveAttachments(true); |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1413 break; |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1414 |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1415 default: |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1416 throw OrthancException(ErrorCode_InternalError); |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1417 } |
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1418 |
5704
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1419 DicomIdentifiersVisitorV2 visitor(collection); |
0c2f0d72d143
only keep experimental versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1420 finder.Execute(visitor, context_); |
5700
1fab9ddaf702
webdav using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
1421 |
4240 | 1422 return true; |
1423 } | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1424 else if (path[0] == BY_PATIENTS || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1425 path[0] == BY_STUDIES || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1426 path[0] == BY_DATES) |
4240 | 1427 { |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1428 return GetRootNode(path[0]).ListCollection(collection, UriComponents(path.begin() + 1, path.end())); |
4240 | 1429 } |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1430 else if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1431 path[0] == UPLOADS) |
4240 | 1432 { |
1433 return uploads_.ListCollection(collection, UriComponents(path.begin() + 1, path.end())); | |
1434 } | |
1435 else | |
1436 { | |
1437 return false; | |
1438 } | |
1439 } | |
1440 | |
1441 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1442 static bool GetOrthancJson(std::string& target, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1443 ServerContext& context, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1444 ResourceType level, |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1445 const DatabaseLookup& query) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1446 { |
5832 | 1447 ResourceFinder finder(level, ResponseContentFlags_ExpandTrue); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1448 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1449 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1450 Json::Value expanded; |
5713
d851a54e49b7
removed "includeAllMetadata_" member from ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5709
diff
changeset
|
1451 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
|
1452 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1453 if (expanded.size() != 1) |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1454 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1455 return false; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1456 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1457 else |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1458 { |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1459 target = expanded[0].toStyledString(); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1460 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1461 // Replace UNIX newlines with DOS newlines |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1462 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
|
1463 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1464 return true; |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1465 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1466 } |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1467 |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1468 |
4240 | 1469 bool OrthancWebDav::GetFileContent(MimeType& mime, |
1470 std::string& content, | |
1471 boost::posix_time::ptime& modificationTime, | |
1472 const UriComponents& path) | |
1473 { | |
1474 if (path.empty()) | |
1475 { | |
1476 return false; | |
1477 } | |
1478 else if (path[0] == BY_UIDS) | |
1479 { | |
1480 if (path.size() == 3 && | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1481 path[2] == STUDY_INFO) |
4240 | 1482 { |
1483 DatabaseLookup query; | |
1484 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1485 true /* case sensitive */, true /* mandatory tag */); | |
1486 | |
1487 mime = MimeType_Json; | |
5706
1404a80dd461
integration find-refactoring->find-refactoring-clean
Sebastien Jodogne <s.jodogne@gmail.com>
diff
changeset
|
1488 return GetOrthancJson(content, context_, ResourceType_Study, query); |
4240 | 1489 } |
1490 else if (path.size() == 4 && | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1491 path[3] == SERIES_INFO) |
4240 | 1492 { |
1493 DatabaseLookup query; | |
1494 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1495 true /* case sensitive */, true /* mandatory tag */); | |
1496 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2], | |
1497 true /* case sensitive */, true /* mandatory tag */); | |
1498 | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1499 mime = MimeType_Json; |
5706
1404a80dd461
integration find-refactoring->find-refactoring-clean
Sebastien Jodogne <s.jodogne@gmail.com>
diff
changeset
|
1500 return GetOrthancJson(content, context_, ResourceType_Series, query); |
4240 | 1501 } |
1502 else if (path.size() == 4 && | |
1503 boost::ends_with(path[3], ".dcm")) | |
1504 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1505 const std::string sopInstanceUid = path[3].substr(0, path[3].size() - 4); |
4240 | 1506 |
1507 DatabaseLookup query; | |
1508 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1], | |
1509 true /* case sensitive */, true /* mandatory tag */); | |
1510 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2], | |
1511 true /* case sensitive */, true /* mandatory tag */); | |
1512 query.AddRestConstraint(DICOM_TAG_SOP_INSTANCE_UID, sopInstanceUid, | |
1513 true /* case sensitive */, true /* mandatory tag */); | |
1514 | |
1515 mime = MimeType_Dicom; | |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1516 |
5833
58c549b881ae
merged find-refactoring -> find-refactoring-clean
Alain Mazy <am@orthanc.team>
diff
changeset
|
1517 ResourceFinder finder(ResourceType_Instance, ResponseContentFlags_ID); |
5706
1404a80dd461
integration find-refactoring->find-refactoring-clean
Sebastien Jodogne <s.jodogne@gmail.com>
diff
changeset
|
1518 finder.SetDatabaseLookup(query); |
1404a80dd461
integration find-refactoring->find-refactoring-clean
Sebastien Jodogne <s.jodogne@gmail.com>
diff
changeset
|
1519 finder.SetRetrieveMetadata(true); |
1404a80dd461
integration find-refactoring->find-refactoring-clean
Sebastien Jodogne <s.jodogne@gmail.com>
diff
changeset
|
1520 finder.SetRetrieveAttachments(true); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1521 |
5706
1404a80dd461
integration find-refactoring->find-refactoring-clean
Sebastien Jodogne <s.jodogne@gmail.com>
diff
changeset
|
1522 DicomFileVisitorV2 visitor(context_, content, modificationTime); |
1404a80dd461
integration find-refactoring->find-refactoring-clean
Sebastien Jodogne <s.jodogne@gmail.com>
diff
changeset
|
1523 finder.Execute(visitor, context_); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1524 |
4240 | 1525 return visitor.IsSuccess(); |
1526 } | |
1527 else | |
1528 { | |
1529 return false; | |
1530 } | |
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 { |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1536 return GetRootNode(path[0]).GetFileContent(mime, content, modificationTime, UriComponents(path.begin() + 1, path.end())); |
4241 | 1537 } |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1538 else if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1539 path[0] == UPLOADS) |
4240 | 1540 { |
1541 return uploads_.GetFileContent(mime, content, modificationTime, UriComponents(path.begin() + 1, path.end())); | |
1542 } | |
1543 else | |
1544 { | |
1545 return false; | |
1546 } | |
1547 } | |
1548 | |
1549 | |
1550 bool OrthancWebDav::StoreFile(const std::string& content, | |
1551 const UriComponents& path) | |
1552 { | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1553 if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1554 path.size() >= 1 && |
4240 | 1555 path[0] == UPLOADS) |
1556 { | |
1557 UriComponents subpath(UriComponents(path.begin() + 1, path.end())); | |
1558 | |
1559 if (uploads_.StoreFile(content, subpath)) | |
1560 { | |
1561 if (!content.empty()) | |
1562 { | |
1563 uploadQueue_.Enqueue(new SingleValueObject<std::string>(Toolbox::FlattenUri(subpath))); | |
1564 } | |
1565 return true; | |
1566 } | |
1567 else | |
1568 { | |
1569 return false; | |
1570 } | |
1571 } | |
1572 else | |
1573 { | |
1574 return false; | |
1575 } | |
1576 } | |
1577 | |
1578 | |
1579 bool OrthancWebDav::CreateFolder(const UriComponents& path) | |
1580 { | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1581 if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1582 path.size() >= 1 && |
4240 | 1583 path[0] == UPLOADS) |
1584 { | |
1585 return uploads_.CreateFolder(UriComponents(path.begin() + 1, path.end())); | |
1586 } | |
1587 else | |
1588 { | |
1589 return false; | |
1590 } | |
1591 } | |
1592 | |
1593 | |
1594 bool OrthancWebDav::DeleteItem(const std::vector<std::string>& path) | |
1595 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1596 if (path.empty()) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1597 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1598 return false; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1599 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1600 else if (path[0] == BY_UIDS && |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1601 path.size() >= 2 && |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1602 path.size() <= 4) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1603 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1604 if (allowDicomDelete_) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1605 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1606 ResourceType level; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1607 DatabaseLookup query; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1608 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1609 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
|
1610 true /* case sensitive */, true /* mandatory tag */); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1611 level = ResourceType_Study; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1612 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1613 if (path.size() >= 3) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1614 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1615 if (path[2] == STUDY_INFO) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1616 { |
4252 | 1617 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
|
1618 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1619 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1620 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
|
1621 true /* case sensitive */, true /* mandatory tag */); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1622 level = ResourceType_Series; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1623 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1624 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1625 if (path.size() == 4) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1626 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1627 if (path[3] == SERIES_INFO) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1628 { |
4252 | 1629 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
|
1630 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1631 else if (boost::ends_with(path[3], ".dcm")) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1632 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1633 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
|
1634 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1635 query.AddRestConstraint(DICOM_TAG_SOP_INSTANCE_UID, sopInstanceUid, |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1636 true /* case sensitive */, true /* mandatory tag */); |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1637 level = ResourceType_Instance; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1638 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1639 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1640 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1641 return false; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1642 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1643 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1644 |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1645 DicomDeleteVisitor visitor(context_, level); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1646 |
5829 | 1647 ResourceFinder finder(level, ResponseContentFlags_ID); |
5705
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1648 finder.SetDatabaseLookup(query); |
eb56ee3c5d63
removed dependency of OrthancWebDav on ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5702
diff
changeset
|
1649 finder.Execute(visitor, context_); |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1650 return true; |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1651 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1652 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1653 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1654 return false; // read-only |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1655 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1656 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1657 else if (path[0] == BY_PATIENTS || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1658 path[0] == BY_STUDIES || |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1659 path[0] == BY_DATES) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1660 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1661 if (allowDicomDelete_) |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1662 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1663 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
|
1664 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1665 else |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1666 { |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1667 return false; // read-only |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1668 } |
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1669 } |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1670 else if (allowUpload_ && |
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1671 path[0] == UPLOADS) |
4240 | 1672 { |
1673 return uploads_.DeleteItem(UriComponents(path.begin() + 1, path.end())); | |
1674 } | |
1675 else | |
1676 { | |
4242
5cfa6ba75dfc
deleting resources from Orthanc WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4241
diff
changeset
|
1677 return false; |
4240 | 1678 } |
1679 } | |
1680 | |
1681 | |
1682 void OrthancWebDav::Start() | |
1683 { | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1684 if (uploadRunning_) |
4240 | 1685 { |
1686 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
1687 } | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1688 else if (allowUpload_) |
4240 | 1689 { |
1690 LOG(INFO) << "Starting the WebDAV upload thread"; | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1691 uploadRunning_ = true; |
4240 | 1692 uploadThread_ = boost::thread(UploadWorker, this); |
1693 } | |
1694 } | |
1695 | |
1696 | |
1697 void OrthancWebDav::Stop() | |
1698 { | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1699 if (uploadRunning_) |
4240 | 1700 { |
1701 LOG(INFO) << "Stopping the WebDAV upload thread"; | |
4243
64f57c9d5f79
configuration options for webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4242
diff
changeset
|
1702 uploadRunning_ = false; |
4240 | 1703 if (uploadThread_.joinable()) |
1704 { | |
1705 uploadThread_.join(); | |
1706 } | |
1707 } | |
1708 } | |
1709 } |