annotate OrthancServer/Sources/main.cpp @ 4239:c8754c4c1862

upload DICOM using WebDAV
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 09 Oct 2020 11:38:03 +0200
parents c007fb7c8395
children 799c0c527ced
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
62
a70bb32802ae renaming Server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 57
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1872
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
1288
6e7e5ed91c2d upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1285
diff changeset
4 * Department, University Hospital of Liege, Belgium
3640
94f4a18a79cc upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 *
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * This program is free software: you can redistribute it and/or
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * modify it under the terms of the GNU General Public License as
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * published by the Free Software Foundation, either version 3 of the
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * License, or (at your option) any later version.
136
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
11 *
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
12 * In addition, as a special exception, the copyright holders of this
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
13 * program give permission to link the code of its release with the
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
15 * that use the same license as the "OpenSSL" library), and distribute
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
16 * the linked executables. You must obey the GNU General Public License
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
17 * in all respects for all of the code used other than "OpenSSL". If you
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
18 * modify file(s) with this exception, you may extend this exception to
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
19 * your version of the file(s), but you are not obligated to do so. If
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
20 * you do not wish to do so, delete this exception statement from your
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
21 * version. If you delete this exception statement from all source files
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
22 * in the program, then also delete it here.
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 *
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 * This program is distributed in the hope that it will be useful, but
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 * WITHOUT ANY WARRANTY; without even the implied warranty of
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 * General Public License for more details.
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 *
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 * You should have received a copy of the GNU General Public License
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 * along with this program. If not, see <http://www.gnu.org/licenses/>.
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 **/
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33
831
84513f2ee1f3 pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 824
diff changeset
34 #include "PrecompiledHeadersServer.h"
750
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 730
diff changeset
35 #include "OrthancRestApi/OrthancRestApi.h"
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
37 #include <boost/algorithm/string/predicate.hpp>
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
39 #include "../../OrthancFramework/Sources/Compatibility.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
40 #include "../../OrthancFramework/Sources/DicomFormat/DicomArray.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
41 #include "../../OrthancFramework/Sources/DicomNetworking/DicomAssociationParameters.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
42 #include "../../OrthancFramework/Sources/DicomNetworking/DicomServer.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
43 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
44 #include "../../OrthancFramework/Sources/HttpServer/FilesystemHttpHandler.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
45 #include "../../OrthancFramework/Sources/HttpServer/HttpServer.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
46 #include "../../OrthancFramework/Sources/Logging.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
47 #include "../../OrthancFramework/Sources/Lua/LuaFunctionCall.h"
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
48 #include "../Plugins/Engine/OrthancPlugins.h"
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
49 #include "EmbeddedResourceHttpHandler.h"
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
50 #include "OrthancConfiguration.h"
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
51 #include "OrthancFindRequestHandler.h"
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
52 #include "OrthancGetRequestHandler.h"
62
a70bb32802ae renaming Server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 57
diff changeset
53 #include "OrthancInitialization.h"
619
70d0f27e5bd3 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 618
diff changeset
54 #include "OrthancMoveRequestHandler.h"
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
55 #include "ServerContext.h"
3636
bce6ee64f2a4 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3635
diff changeset
56 #include "ServerJobs/StorageCommitmentScpJob.h"
730
309e686b41e7 better logging about nonexistent tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 725
diff changeset
57 #include "ServerToolbox.h"
3736
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
58 #include "StorageCommitmentReports.h"
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
60 #include "../../OrthancFramework/Sources/HttpServer/WebDavStorage.h" // TODO
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
61 #include "Search/DatabaseLookup.h" // TODO
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
62 #include <boost/regex.hpp> // TODO
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
63
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
64
62
a70bb32802ae renaming Server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 57
diff changeset
65 using namespace Orthanc;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67
613
60d90e48e809 query/retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 565
diff changeset
68 class OrthancStoreRequestHandler : public IStoreRequestHandler
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 private:
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
71 ServerContext& context_;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
74 explicit OrthancStoreRequestHandler(ServerContext& context) :
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
75 context_(context)
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78
1573
3309878b3e16 more information about the origin of requests submitted to the DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1572
diff changeset
79
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
80 virtual void Handle(const std::string& dicomFile,
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 const DicomMap& dicomSummary,
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 const Json::Value& dicomJson,
1573
3309878b3e16 more information about the origin of requests submitted to the DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1572
diff changeset
83 const std::string& remoteIp,
1285
5730f374e4e6 Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1280
diff changeset
84 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
85 const std::string& calledAet) ORTHANC_OVERRIDE
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 if (dicomFile.size() > 0)
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 {
1005
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
89 DicomInstanceToStore toStore;
2664
a21b244efb37 serialization of DicomModalityStoreJob, OrthancPeerStoreJob and ResourceModificationJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2640
diff changeset
90 toStore.SetOrigin(DicomInstanceOrigin::FromDicomProtocol
a21b244efb37 serialization of DicomModalityStoreJob, OrthancPeerStoreJob and ResourceModificationJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2640
diff changeset
91 (remoteIp.c_str(), remoteAet.c_str(), calledAet.c_str()));
3841
be7df7fe3d80 avoid one memcpy of the DICOM buffer on "POST /instances"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3801
diff changeset
92 toStore.SetBuffer(dicomFile.c_str(), dicomFile.size());
1005
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
93 toStore.SetSummary(dicomSummary);
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
94 toStore.SetJson(dicomJson);
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
95
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
96 std::string id;
3814
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
97 context_.Store(id, toStore, StoreInstanceMode_Default);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 };
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102
1797
23722a191e4e worklists are working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1796
diff changeset
103
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
104 class OrthancStorageCommitmentRequestHandler : public IStorageCommitmentRequestHandler
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
105 {
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
106 private:
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
107 ServerContext& context_;
3606
33ba63637d48 DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3604
diff changeset
108
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
109 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
110 explicit OrthancStorageCommitmentRequestHandler(ServerContext& context) :
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
111 context_(context)
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
112 {
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
113 }
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
114
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
115 virtual void HandleRequest(const std::string& transactionUid,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
116 const std::vector<std::string>& referencedSopClassUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
117 const std::vector<std::string>& referencedSopInstanceUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
118 const std::string& remoteIp,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
119 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
120 const std::string& calledAet) ORTHANC_OVERRIDE
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
121 {
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
122 if (referencedSopClassUids.size() != referencedSopInstanceUids.size())
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
123 {
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
124 throw OrthancException(ErrorCode_InternalError);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 }
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
126
3767
c6658187e4b1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3736
diff changeset
127 std::unique_ptr<StorageCommitmentScpJob> job(
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
128 new StorageCommitmentScpJob(context_, transactionUid, remoteAet, calledAet));
3606
33ba63637d48 DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3604
diff changeset
129
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
130 for (size_t i = 0; i < referencedSopClassUids.size(); i++)
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
131 {
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
132 job->AddInstance(referencedSopClassUids[i], referencedSopInstanceUids[i]);
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
133 }
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
134
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
135 job->MarkAsReady();
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
136
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
137 context_.GetJobsEngine().GetRegistry().Submit(job.release(), 0 /* default priority */);
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
138 }
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
139
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
140 virtual void HandleReport(const std::string& transactionUid,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
141 const std::vector<std::string>& successSopClassUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
142 const std::vector<std::string>& successSopInstanceUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
143 const std::vector<std::string>& failedSopClassUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
144 const std::vector<std::string>& failedSopInstanceUids,
3736
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
145 const std::vector<StorageCommitmentFailureReason>& failureReasons,
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
146 const std::string& remoteIp,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
147 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
148 const std::string& calledAet) ORTHANC_OVERRIDE
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
149 {
3736
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
150 if (successSopClassUids.size() != successSopInstanceUids.size() ||
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
151 failedSopClassUids.size() != failedSopInstanceUids.size() ||
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
152 failedSopClassUids.size() != failureReasons.size())
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
153 {
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
154 throw OrthancException(ErrorCode_InternalError);
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
155 }
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
156
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
157 std::unique_ptr<StorageCommitmentReports::Report> report(
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
158 new StorageCommitmentReports::Report(remoteAet));
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
159
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
160 for (size_t i = 0; i < successSopClassUids.size(); i++)
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
161 {
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
162 report->AddSuccess(successSopClassUids[i], successSopInstanceUids[i]);
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
163 }
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
164
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
165 for (size_t i = 0; i < failedSopClassUids.size(); i++)
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
166 {
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
167 report->AddFailure(failedSopClassUids[i], failedSopInstanceUids[i], failureReasons[i]);
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
168 }
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
169
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
170 report->MarkAsComplete();
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
171
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
172 context_.GetStorageCommitmentReports().Store(transactionUid, report.release());
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 };
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176
1797
23722a191e4e worklists are working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1796
diff changeset
177
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
178 class ModalitiesFromConfiguration : public DicomServer::IRemoteModalities
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
179 {
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
180 public:
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
181 virtual bool IsSameAETitle(const std::string& aet1,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
182 const std::string& aet2) ORTHANC_OVERRIDE
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
183 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
184 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
185 return lock.GetConfiguration().IsSameAETitle(aet1, aet2);
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
186 }
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
187
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
188 virtual bool LookupAETitle(RemoteModalityParameters& modality,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
189 const std::string& aet) ORTHANC_OVERRIDE
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
190 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
191 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
192 return lock.GetConfiguration().LookupDicomModalityUsingAETitle(modality, aet);
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
193 }
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
194 };
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
195
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
196
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
197 class MyDicomServerFactory :
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
198 public IStoreRequestHandlerFactory,
1800
30e97a1f4093 callback for handling worklists with plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1799
diff changeset
199 public IFindRequestHandlerFactory,
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
200 public IMoveRequestHandlerFactory,
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
201 public IGetRequestHandlerFactory,
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
202 public IStorageCommitmentRequestHandlerFactory
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
203 {
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
204 private:
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
205 ServerContext& context_;
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
206
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
207 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
208 explicit MyDicomServerFactory(ServerContext& context) : context_(context)
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
212 virtual IStoreRequestHandler* ConstructStoreRequestHandler() ORTHANC_OVERRIDE
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 {
613
60d90e48e809 query/retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 565
diff changeset
214 return new OrthancStoreRequestHandler(context_);
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
215 }
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
216
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
217 virtual IFindRequestHandler* ConstructFindRequestHandler() ORTHANC_OVERRIDE
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
218 {
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3643
diff changeset
219 std::unique_ptr<OrthancFindRequestHandler> result(new OrthancFindRequestHandler(context_));
941
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
220
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
221 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
222 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
223 result->SetMaxResults(lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindResults", 0));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
224 result->SetMaxInstances(lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindInstances", 0));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
225 }
941
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
226
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
227 if (result->GetMaxResults() == 0)
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
228 {
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
229 LOG(INFO) << "No limit on the number of C-FIND results at the Patient, Study and Series levels";
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
230 }
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
231 else
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
232 {
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
233 LOG(INFO) << "Maximum " << result->GetMaxResults()
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
234 << " results for C-FIND queries at the Patient, Study and Series levels";
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
235 }
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
236
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
237 if (result->GetMaxInstances() == 0)
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
238 {
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
239 LOG(INFO) << "No limit on the number of C-FIND results at the Instance level";
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
240 }
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
241 else
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
242 {
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
243 LOG(INFO) << "Maximum " << result->GetMaxInstances()
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
244 << " instances will be returned for C-FIND queries at the Instance level";
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
245 }
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
246
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
247 return result.release();
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
248 }
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
249
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
250 virtual IMoveRequestHandler* ConstructMoveRequestHandler() ORTHANC_OVERRIDE
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
251 {
613
60d90e48e809 query/retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 565
diff changeset
252 return new OrthancMoveRequestHandler(context_);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 }
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
254
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
255 virtual IGetRequestHandler* ConstructGetRequestHandler() ORTHANC_OVERRIDE
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
256 {
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
257 return new OrthancGetRequestHandler(context_);
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
258 }
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
259
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
260 virtual IStorageCommitmentRequestHandler* ConstructStorageCommitmentRequestHandler() ORTHANC_OVERRIDE
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
261 {
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
262 return new OrthancStorageCommitmentRequestHandler(context_);
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
263 }
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
264
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
265
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 void Done()
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 };
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
272 class OrthancApplicationEntityFilter : public IApplicationEntityFilter
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
273 {
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
274 private:
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
275 ServerContext& context_;
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
276 bool alwaysAllowEcho_;
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
277 bool alwaysAllowStore_;
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
278
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
279 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
280 explicit OrthancApplicationEntityFilter(ServerContext& context) :
2353
2421c137c304 reject connections earlier if DicomAlwaysAllowStore == false
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2352
diff changeset
281 context_(context)
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
282 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
283 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
284 alwaysAllowEcho_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowEcho", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
285 alwaysAllowStore_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowStore", true);
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
286 }
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
287
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
288 virtual bool IsAllowedConnection(const std::string& remoteIp,
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
289 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
290 const std::string& calledAet) ORTHANC_OVERRIDE
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
291 {
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
292 LOG(INFO) << "Incoming connection from AET " << remoteAet
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
293 << " on IP " << remoteIp << ", calling AET " << calledAet;
2353
2421c137c304 reject connections earlier if DicomAlwaysAllowStore == false
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2352
diff changeset
294
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
295 if (alwaysAllowEcho_ ||
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
296 alwaysAllowStore_)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
297 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
298 return true;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
299 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
300 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
301 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
302 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
303 return lock.GetConfiguration().IsKnownAETitle(remoteAet, remoteIp);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
304 }
620
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
305 }
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
306
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
307 virtual bool IsAllowedRequest(const std::string& remoteIp,
1799
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
308 const std::string& remoteAet,
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
309 const std::string& calledAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
310 DicomRequestType type) ORTHANC_OVERRIDE
620
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
311 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
312 LOG(INFO) << "Incoming " << EnumerationToString(type) << " request from AET "
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
313 << remoteAet << " on IP " << remoteIp << ", calling AET " << calledAet;
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
314
2375
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
315 if (type == DicomRequestType_Echo &&
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
316 alwaysAllowEcho_)
620
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
317 {
2375
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
318 // Incoming C-Echo requests are always accepted, even from unknown AET
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
319 return true;
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
320 }
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
321 else if (type == DicomRequestType_Store &&
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
322 alwaysAllowStore_)
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
323 {
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
324 // Incoming C-Store requests are always accepted, even from unknown AET
620
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
325 return true;
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
326 }
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
327 else
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
328 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
329 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
330
4182
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
331 std::list<RemoteModalityParameters> modalities;
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
332 if (lock.GetConfiguration().LookupDicomModalitiesUsingAETitle(modalities, remoteAet))
2872
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
333 {
4182
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
334 if (modalities.size() == 1) // don't check the IP if there's only one modality with this AET
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
335 {
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
336 return modalities.front().IsRequestAllowed(type);
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
337 }
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
338 else // if there are multiple modalities with the same AET, check the one matching this IP
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
339 {
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
340 for (std::list<RemoteModalityParameters>::const_iterator it = modalities.begin(); it != modalities.end(); ++it)
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
341 {
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
342 if (it->GetHost() == remoteIp)
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
343 {
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
344 return it->IsRequestAllowed(type);
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
345 }
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
346 }
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
347
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
348 LOG(WARNING) << "Unable to check DICOM authorization for AET " << remoteAet
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
349 << " on IP " << remoteIp << ", " << modalities.size()
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
350 << " modalites found with this AET but none of them matching the IP";
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
351 }
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
352 return false;
2872
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
353 }
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
354 else
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
355 {
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
356 return false;
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
357 }
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
358 }
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
359 }
1163
3db41779d8f9 abstraction to allow/prevent transfer syntaxes on AET basis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1135
diff changeset
360
1799
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
361 virtual bool IsAllowedTransferSyntax(const std::string& remoteIp,
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
362 const std::string& remoteAet,
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
363 const std::string& calledAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
364 TransferSyntax syntax) ORTHANC_OVERRIDE
1163
3db41779d8f9 abstraction to allow/prevent transfer syntaxes on AET basis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1135
diff changeset
365 {
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
366 std::string configuration;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
367
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
368 switch (syntax)
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
369 {
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
370 case TransferSyntax_Deflated:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
371 configuration = "DeflatedTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
372 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
373
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
374 case TransferSyntax_Jpeg:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
375 configuration = "JpegTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
376 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
377
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
378 case TransferSyntax_Jpeg2000:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
379 configuration = "Jpeg2000TransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
380 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
381
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
382 case TransferSyntax_JpegLossless:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
383 configuration = "JpegLosslessTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
384 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
385
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
386 case TransferSyntax_Jpip:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
387 configuration = "JpipTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
388 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
389
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
390 case TransferSyntax_Mpeg2:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
391 configuration = "Mpeg2TransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
392 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
393
3643
fa3ff492fb3b added TransferSyntax_Mpeg4
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
394 case TransferSyntax_Mpeg4:
fa3ff492fb3b added TransferSyntax_Mpeg4
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
395 configuration = "Mpeg4TransferSyntaxAccepted";
fa3ff492fb3b added TransferSyntax_Mpeg4
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
396 break;
fa3ff492fb3b added TransferSyntax_Mpeg4
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
397
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
398 case TransferSyntax_Rle:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
399 configuration = "RleTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
400 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
401
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
402 default:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
403 throw OrthancException(ErrorCode_ParameterOutOfRange);
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
404 }
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
405
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
406 {
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
407 std::string name = "Is" + configuration;
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
408
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
409 LuaScripting::Lock lock(context_.GetLuaScripting());
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
410
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
411 if (lock.GetLua().IsExistingFunction(name.c_str()))
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
412 {
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
413 LuaFunctionCall call(lock.GetLua(), name.c_str());
1799
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
414 call.PushString(remoteAet);
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
415 call.PushString(remoteIp);
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
416 call.PushString(calledAet);
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
417 return call.ExecutePredicate();
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
418 }
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
419 }
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
420
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
421 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
422 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
423 return lock.GetConfiguration().GetBooleanParameter(configuration, true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
424 }
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
425 }
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
426
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
427
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
428 virtual bool IsUnknownSopClassAccepted(const std::string& remoteIp,
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
429 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
430 const std::string& calledAet) ORTHANC_OVERRIDE
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
431 {
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
432 static const char* configuration = "UnknownSopClassAccepted";
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
433
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
434 {
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
435 std::string lua = "Is" + std::string(configuration);
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
436
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
437 LuaScripting::Lock lock(context_.GetLuaScripting());
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
438
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
439 if (lock.GetLua().IsExistingFunction(lua.c_str()))
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
440 {
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
441 LuaFunctionCall call(lock.GetLua(), lua.c_str());
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
442 call.PushString(remoteAet);
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
443 call.PushString(remoteIp);
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
444 call.PushString(calledAet);
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
445 return call.ExecutePredicate();
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
446 }
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
447 }
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
448
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
449 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
450 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
451 return lock.GetConfiguration().GetBooleanParameter(configuration, false);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
452 }
1163
3db41779d8f9 abstraction to allow/prevent transfer syntaxes on AET basis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1135
diff changeset
453 }
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
454 };
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
455
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
456
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
457 class MyIncomingHttpRequestFilter : public IIncomingHttpRequestFilter
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
458 {
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
459 private:
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
460 ServerContext& context_;
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
461 OrthancPlugins* plugins_;
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
462
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
463 public:
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
464 MyIncomingHttpRequestFilter(ServerContext& context,
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
465 OrthancPlugins* plugins) :
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
466 context_(context),
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
467 plugins_(plugins)
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
468 {
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
469 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
470
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
471 virtual bool IsAllowed(HttpMethod method,
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
472 const char* uri,
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
473 const char* ip,
1959
45c4387a379c Access to the HTTP headers in the "IncomingHttpRequestFilter()" callback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1949
diff changeset
474 const char* username,
2268
ce5c13b95dac New function: OrthancPluginRegisterIncomingHttpRequestFilter2()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2246
diff changeset
475 const IHttpHandler::Arguments& httpHeaders,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
476 const IHttpHandler::GetArguments& getArguments) ORTHANC_OVERRIDE
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
477 {
3048
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
478 #if ORTHANC_ENABLE_PLUGINS == 1
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
479 if (plugins_ != NULL &&
2268
ce5c13b95dac New function: OrthancPluginRegisterIncomingHttpRequestFilter2()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2246
diff changeset
480 !plugins_->IsAllowed(method, uri, ip, username, httpHeaders, getArguments))
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
481 {
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
482 return false;
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
483 }
3048
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
484 #endif
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
485
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
486 static const char* HTTP_FILTER = "IncomingHttpRequestFilter";
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
487
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
488 LuaScripting::Lock lock(context_.GetLuaScripting());
996
cf52f3bcb2b3 clarification of Lua classes wrt multithreading
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 941
diff changeset
489
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
490 // Test if the instance must be filtered out
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
491 if (lock.GetLua().IsExistingFunction(HTTP_FILTER))
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
492 {
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
493 LuaFunctionCall call(lock.GetLua(), HTTP_FILTER);
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
494
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
495 switch (method)
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
496 {
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
497 case HttpMethod_Get:
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
498 call.PushString("GET");
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
499 break;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
500
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
501 case HttpMethod_Put:
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
502 call.PushString("PUT");
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
503 break;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
504
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
505 case HttpMethod_Post:
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
506 call.PushString("POST");
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
507 break;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
508
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
509 case HttpMethod_Delete:
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
510 call.PushString("DELETE");
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
511 break;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
512
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
513 default:
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
514 return true;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
515 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
516
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
517 call.PushString(uri);
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
518 call.PushString(ip);
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
519 call.PushString(username);
1959
45c4387a379c Access to the HTTP headers in the "IncomingHttpRequestFilter()" callback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1949
diff changeset
520 call.PushStringMap(httpHeaders);
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
521
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
522 if (!call.ExecutePredicate())
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
523 {
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
524 LOG(INFO) << "An incoming HTTP request has been discarded by the filter";
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
525 return false;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
526 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
527 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
528
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
529 return true;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
530 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
531 };
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
532
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
533
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
534
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
535 class MyHttpExceptionFormatter : public IHttpExceptionFormatter
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
536 {
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
537 private:
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
538 bool describeErrors_;
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
539 OrthancPlugins* plugins_;
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
540
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
541 public:
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
542 MyHttpExceptionFormatter(bool describeErrors,
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
543 OrthancPlugins* plugins) :
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
544 describeErrors_(describeErrors),
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
545 plugins_(plugins)
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
546 {
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
547 }
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
548
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
549 virtual void Format(HttpOutput& output,
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
550 const OrthancException& exception,
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
551 HttpMethod method,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
552 const char* uri) ORTHANC_OVERRIDE
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
553 {
1650
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
554 {
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
555 bool isPlugin = false;
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
556
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
557 #if ORTHANC_ENABLE_PLUGINS == 1
1650
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
558 if (plugins_ != NULL)
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
559 {
1651
2e692c83e2f3 improved custom error login
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1650
diff changeset
560 plugins_->GetErrorDictionary().LogError(exception.GetErrorCode(), true);
1650
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
561 isPlugin = true;
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
562 }
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
563 #endif
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
564
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
565 if (!isPlugin)
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
566 {
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
567 LOG(ERROR) << "Exception in the HTTP handler: " << exception.What();
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
568 }
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
569 }
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
570
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
571 Json::Value message = Json::objectValue;
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
572 ErrorCode errorCode = exception.GetErrorCode();
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
573 HttpStatus httpStatus = exception.GetHttpStatus();
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
574
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
575 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
576 bool isPlugin = false;
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
577
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
578 #if ORTHANC_ENABLE_PLUGINS == 1
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
579 if (plugins_ != NULL &&
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
580 plugins_->GetErrorDictionary().Format(message, httpStatus, exception))
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
581 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
582 errorCode = ErrorCode_Plugin;
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
583 isPlugin = true;
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
584 }
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
585 #endif
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
586
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
587 if (!isPlugin)
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
588 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
589 message["Message"] = exception.What();
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
590 }
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
591 }
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
592
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
593 if (!describeErrors_)
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
594 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
595 output.SendStatus(httpStatus);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
596 }
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
597 else
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
598 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
599 message["Method"] = EnumerationToString(method);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
600 message["Uri"] = uri;
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
601 message["HttpError"] = EnumerationToString(httpStatus);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
602 message["HttpStatus"] = httpStatus;
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
603 message["OrthancError"] = EnumerationToString(errorCode);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
604 message["OrthancStatus"] = errorCode;
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
605
2952
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
606 if (exception.HasDetails())
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
607 {
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
608 message["Details"] = exception.GetDetails();
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
609 }
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
610
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
611 std::string info = message.toStyledString();
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
612 output.SendStatus(httpStatus, info);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
613 }
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
614 }
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
615 };
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
616
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
617
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
618
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
619
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
620
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
621
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
622
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
623 static const char* const UPLOAD_FOLDER = "upload";
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
624
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
625 class DummyBucket : public IWebDavBucket // TODO
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
626 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
627 private:
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
628 ServerContext& context_;
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
629 WebDavStorage storage_;
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
630
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
631 bool IsUploadedFolder(const UriComponents& path) const
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
632 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
633 return (path.size() >= 1 && path[0] == UPLOAD_FOLDER);
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
634 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
635
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
636 public:
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
637 DummyBucket(ServerContext& context,
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
638 bool isMemory) :
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
639 context_(context),
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
640 storage_(isMemory)
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
641 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
642 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
643
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
644 virtual bool IsExistingFolder(const UriComponents& path) ORTHANC_OVERRIDE
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
645 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
646 if (IsUploadedFolder(path))
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
647 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
648 return storage_.IsExistingFolder(UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
649 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
650 else
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
651 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
652 return (path.size() == 0 ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
653 (path.size() == 1 && path[0] == "Folder1") ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
654 (path.size() == 2 && path[0] == "Folder1" && path[1] == "Folder2"));
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
655 }
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
656 }
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
657
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
658 virtual bool ListCollection(Collection& collection,
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
659 const UriComponents& path) ORTHANC_OVERRIDE
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
660 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
661 if (IsUploadedFolder(path))
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
662 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
663 return storage_.ListCollection(collection, UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
664 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
665 else if (IsExistingFolder(path))
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
666 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
667 if (path.empty())
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
668 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
669 collection.AddResource(new Folder(UPLOAD_FOLDER));
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
670 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
671
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
672 for (unsigned int i = 0; i < 5; i++)
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
673 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
674 std::unique_ptr<File> f(new File("IM" + boost::lexical_cast<std::string>(i) + ".dcm"));
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
675 f->SetContentLength(1024 * i);
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
676 f->SetMimeType(MimeType_PlainText);
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
677 collection.AddResource(f.release());
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
678 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
679
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
680 for (unsigned int i = 0; i < 5; i++)
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
681 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
682 collection.AddResource(new Folder("Folder" + boost::lexical_cast<std::string>(i)));
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
683 }
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
684
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
685 return true;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
686 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
687 else
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
688 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
689 return false;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
690 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
691 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
692
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
693 virtual bool GetFileContent(MimeType& mime,
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
694 std::string& content,
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
695 boost::posix_time::ptime& time,
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
696 const UriComponents& path) ORTHANC_OVERRIDE
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
697 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
698 if (path.empty())
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
699 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
700 return false;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
701 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
702 else if (IsUploadedFolder(path))
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
703 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
704 return storage_.GetFileContent(mime, content, time,
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
705 UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
706 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
707 else if (path.back() == "IM0.dcm" ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
708 path.back() == "IM1.dcm" ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
709 path.back() == "IM2.dcm" ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
710 path.back() == "IM3.dcm" ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
711 path.back() == "IM4.dcm")
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
712 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
713 time = boost::posix_time::second_clock::universal_time();
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
714
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
715 std::string s;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
716 for (size_t i = 0; i < path.size(); i++)
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
717 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
718 s += "/" + path[i];
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
719 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
720
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
721 content = "Hello world!\r\n" + s + "\r\n";
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
722 mime = MimeType_PlainText;
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
723 return true;
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
724 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
725 else
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
726 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
727 return false;
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
728 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
729 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
730
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
731
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
732 virtual bool StoreFile(const std::string& content,
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
733 const UriComponents& path) ORTHANC_OVERRIDE
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
734 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
735 if (IsUploadedFolder(path))
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
736 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
737 return storage_.StoreFile(content, UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
738 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
739 else
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
740 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
741 LOG(WARNING) << "Writing to a read-only location in WebDAV: " << Toolbox::FlattenUri(path);
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
742 return false;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
743 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
744 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
745
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
746
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
747 virtual bool CreateFolder(const UriComponents& path) ORTHANC_OVERRIDE
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
748 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
749 if (IsUploadedFolder(path))
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
750 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
751 return storage_.CreateFolder(UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
752 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
753 else
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
754 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
755 LOG(WARNING) << "Writing to a read-only location in WebDAV: " << Toolbox::FlattenUri(path);
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
756 return false;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
757 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
758 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
759
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
760 virtual bool DeleteItem(const std::vector<std::string>& path) ORTHANC_OVERRIDE
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
761 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
762 return false; // read-only
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
763 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
764
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
765 virtual void Start() ORTHANC_OVERRIDE
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
766 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
767 LOG(WARNING) << "Starting WebDAV";
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
768 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
769
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
770 virtual void Stop() ORTHANC_OVERRIDE
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
771 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
772 LOG(WARNING) << "Stopping WebDAV";
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
773 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
774 };
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
775
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
776
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
777
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
778
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
779
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
780 static const char* const BY_PATIENTS = "by-patients";
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
781 static const char* const BY_STUDIES = "by-studies";
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
782 static const char* const BY_DATE = "by-dates";
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
783 static const char* const BY_UIDS = "by-uids";
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
784 static const char* const UPLOADS = "uploads";
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
785 static const char* const MAIN_DICOM_TAGS = "MainDicomTags";
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
786
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
787 class DummyBucket2 : public IWebDavBucket // TODO
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
788 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
789 private:
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
790 typedef std::map<ResourceType, std::string> Templates;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
791
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
792
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
793 static boost::posix_time::ptime GetNow()
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
794 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
795 return boost::posix_time::second_clock::universal_time();
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
796 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
797
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
798
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
799 static void LookupTime(boost::posix_time::ptime& target,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
800 ServerContext& context,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
801 const std::string& publicId,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
802 MetadataType metadata)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
803 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
804 std::string value;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
805 if (context.GetIndex().LookupMetadata(value, publicId, metadata))
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
806 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
807 try
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
808 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
809 target = boost::posix_time::from_iso_string(value);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
810 return;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
811 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
812 catch (std::exception& e)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
813 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
814 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
815 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
816
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
817 target = GetNow();
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
818 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
819
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
820
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
821 class DicomIdentifiersVisitor : public ServerContext::ILookupVisitor
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
822 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
823 private:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
824 ServerContext& context_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
825 bool isComplete_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
826 Collection& target_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
827 ResourceType level_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
828
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
829 public:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
830 DicomIdentifiersVisitor(ServerContext& context,
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
831 Collection& target,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
832 ResourceType level) :
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
833 context_(context),
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
834 isComplete_(false),
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
835 target_(target),
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
836 level_(level)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
837 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
838 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
839
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
840 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
841 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
842 return false; // (*)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
843 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
844
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
845 virtual void MarkAsComplete() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
846 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
847 isComplete_ = true; // TODO
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
848 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
849
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
850 virtual void Visit(const std::string& publicId,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
851 const std::string& instanceId /* unused */,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
852 const DicomMap& mainDicomTags,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
853 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
854 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
855 DicomTag tag(0, 0);
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
856 MetadataType timeMetadata;
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
857
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
858 switch (level_)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
859 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
860 case ResourceType_Study:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
861 tag = DICOM_TAG_STUDY_INSTANCE_UID;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
862 timeMetadata = MetadataType_LastUpdate;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
863 break;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
864
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
865 case ResourceType_Series:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
866 tag = DICOM_TAG_SERIES_INSTANCE_UID;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
867 timeMetadata = MetadataType_LastUpdate;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
868 break;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
869
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
870 case ResourceType_Instance:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
871 tag = DICOM_TAG_SOP_INSTANCE_UID;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
872 timeMetadata = MetadataType_Instance_ReceptionDate;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
873 break;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
874
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
875 default:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
876 throw OrthancException(ErrorCode_InternalError);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
877 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
878
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
879 std::string s;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
880 if (mainDicomTags.LookupStringValue(s, tag, false) &&
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
881 !s.empty())
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
882 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
883 std::unique_ptr<Resource> resource;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
884
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
885 if (level_ == ResourceType_Instance)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
886 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
887 FileInfo info;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
888 if (context_.GetIndex().LookupAttachment(info, publicId, FileContentType_Dicom))
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
889 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
890 std::unique_ptr<File> f(new File(s + ".dcm"));
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
891 f->SetMimeType(MimeType_Dicom);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
892 f->SetContentLength(info.GetUncompressedSize());
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
893 resource.reset(f.release());
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
894 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
895 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
896 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
897 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
898 resource.reset(new Folder(s));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
899 }
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
900
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
901 if (resource.get() != NULL)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
902 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
903 boost::posix_time::ptime t;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
904 LookupTime(t, context_, publicId, timeMetadata);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
905 resource->SetCreationTime(t);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
906 target_.AddResource(resource.release());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
907 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
908 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
909 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
910 };
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
911
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
912 class DicomFileVisitor : public ServerContext::ILookupVisitor
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
913 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
914 private:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
915 ServerContext& context_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
916 bool success_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
917 std::string& target_;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
918 boost::posix_time::ptime& time_;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
919
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
920 public:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
921 DicomFileVisitor(ServerContext& context,
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
922 std::string& target,
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
923 boost::posix_time::ptime& time) :
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
924 context_(context),
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
925 success_(false),
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
926 target_(target),
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
927 time_(time)
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
928 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
929 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
930
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
931 bool IsSuccess() const
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
932 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
933 return success_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
934 }
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
935
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
936 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
937 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
938 return false; // (*)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
939 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
940
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
941 virtual void MarkAsComplete() ORTHANC_OVERRIDE
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
942 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
943 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
944
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
945 virtual void Visit(const std::string& publicId,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
946 const std::string& instanceId /* unused */,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
947 const DicomMap& mainDicomTags,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
948 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
949 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
950 if (success_)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
951 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
952 success_ = false; // Two matches => Error
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
953 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
954 else
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
955 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
956 LookupTime(time_, context_, publicId, MetadataType_Instance_ReceptionDate);
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
957 context_.ReadDicom(target_, publicId);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
958 success_ = true;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
959 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
960 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
961 };
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
962
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
963 class OrthancJsonVisitor : public ServerContext::ILookupVisitor
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
964 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
965 private:
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
966 ServerContext& context_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
967 bool success_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
968 std::string& target_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
969 ResourceType level_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
970
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
971 public:
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
972 OrthancJsonVisitor(ServerContext& context,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
973 std::string& target,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
974 ResourceType level) :
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
975 context_(context),
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
976 success_(false),
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
977 target_(target),
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
978 level_(level)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
979 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
980 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
981
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
982 bool IsSuccess() const
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
983 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
984 return success_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
985 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
986
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
987 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
988 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
989 return false; // (*)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
990 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
991
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
992 virtual void MarkAsComplete() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
993 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
994 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
995
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
996 virtual void Visit(const std::string& publicId,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
997 const std::string& instanceId /* unused */,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
998 const DicomMap& mainDicomTags,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
999 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1000 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1001 Json::Value info;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1002 if (context_.GetIndex().LookupResource(info, publicId, level_))
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1003 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1004 if (success_)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1005 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1006 success_ = false; // Two matches => Error
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1007 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1008 else
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1009 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1010 target_ = info.toStyledString();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1011
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1012 // Replace UNIX newlines with DOS newlines
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1013 boost::replace_all(target_, "\n", "\r\n");
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1014
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1015 success_ = true;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1016 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1017 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1018 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1019 };
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1020
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1021
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1022 void AddVirtualFile(Collection& collection,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1023 const UriComponents& path,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1024 const std::string& filename)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1025 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1026 MimeType mime;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1027 std::string content;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1028 boost::posix_time::ptime modification;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1029
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1030 UriComponents p = path;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1031 p.push_back(filename);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1032
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1033 if (GetFileContent(mime, content, modification, p))
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1034 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1035 std::unique_ptr<File> f(new File(filename));
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1036 f->SetMimeType(mime);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1037 f->SetContentLength(content.size());
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1038 f->SetCreationTime(modification);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1039 collection.AddResource(f.release());
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1040 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1041 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1042
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1043
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1044
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1045
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1046 class ResourcesIndex : public boost::noncopyable
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1047 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1048 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1049 typedef std::map<std::string, std::string> Map;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1050
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1051 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1052 ServerContext& context_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1053 ResourceType level_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1054 std::string template_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1055 Map pathToResource_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1056 Map resourceToPath_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1057
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1058 void CheckInvariants()
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1059 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1060 #ifndef NDEBUG
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1061 assert(pathToResource_.size() == resourceToPath_.size());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1062
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1063 for (Map::const_iterator it = pathToResource_.begin(); it != pathToResource_.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1064 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1065 assert(resourceToPath_[it->second] == it->first);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1066 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1067
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1068 for (Map::const_iterator it = resourceToPath_.begin(); it != resourceToPath_.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1069 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1070 assert(pathToResource_[it->second] == it->first);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1071 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1072 #endif
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1073 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1074
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1075 void AddTags(DicomMap& target,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1076 const std::string& resourceId,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1077 ResourceType tagsFromLevel)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1078 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1079 DicomMap tags;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1080 if (context_.GetIndex().GetMainDicomTags(tags, resourceId, level_, tagsFromLevel))
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1081 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1082 target.Merge(tags);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1083 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1084 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1085
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1086 void Register(const std::string& resourceId)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1087 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1088 // Don't register twice the same resource
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1089 if (resourceToPath_.find(resourceId) == resourceToPath_.end())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1090 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1091 std::string name = template_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1092
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1093 DicomMap tags;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1094
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1095 AddTags(tags, resourceId, level_);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1096
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1097 if (level_ == ResourceType_Study)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1098 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1099 AddTags(tags, resourceId, ResourceType_Patient);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1100 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1101
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1102 DicomArray arr(tags);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1103 for (size_t i = 0; i < arr.GetSize(); i++)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1104 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1105 const DicomElement& element = arr.GetElement(i);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1106 if (!element.GetValue().IsNull() &&
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1107 !element.GetValue().IsBinary())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1108 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1109 const std::string tag = FromDcmtkBridge::GetTagName(element.GetTag(), "");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1110 boost::replace_all(name, "{{" + tag + "}}", element.GetValue().GetContent());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1111 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1112 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1113
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1114 // Blank the tags that were not matched
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1115 static const boost::regex REGEX_BLANK_TAGS("{{.*?}}"); // non-greedy match
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1116 name = boost::regex_replace(name, REGEX_BLANK_TAGS, "");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1117
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1118 // UTF-8 characters cannot be used on Windows XP
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1119 name = Toolbox::ConvertToAscii(name);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1120 boost::replace_all(name, "/", "");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1121 boost::replace_all(name, "\\", "");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1122
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1123 // Trim sequences of spaces as one single space
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1124 static const boost::regex REGEX_TRIM_SPACES("{{.*?}}");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1125 name = boost::regex_replace(name, REGEX_TRIM_SPACES, " ");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1126 name = Toolbox::StripSpaces(name);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1127
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1128 size_t count = 0;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1129 for (;;)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1130 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1131 std::string path = name;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1132 if (count > 0)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1133 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1134 path += " (" + boost::lexical_cast<std::string>(count) + ")";
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1135 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1136
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1137 if (pathToResource_.find(path) == pathToResource_.end())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1138 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1139 pathToResource_[path] = resourceId;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1140 resourceToPath_[resourceId] = path;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1141 return;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1142 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1143
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1144 count++;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1145 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1146
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1147 throw OrthancException(ErrorCode_InternalError);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1148 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1149 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1150
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1151 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1152 ResourcesIndex(ServerContext& context,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1153 ResourceType level,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1154 const std::string& templateString) :
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1155 context_(context),
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1156 level_(level),
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1157 template_(templateString)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1158 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1159 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1160
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1161 ResourceType GetLevel() const
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1162 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1163 return level_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1164 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1165
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1166 void Refresh(std::set<std::string>& removedPaths /* out */,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1167 const std::set<std::string>& resources)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1168 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1169 CheckInvariants();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1170
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1171 // Detect the resources that have been removed since last refresh
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1172 removedPaths.clear();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1173 std::set<std::string> removedResources;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1174
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1175 for (Map::iterator it = resourceToPath_.begin(); it != resourceToPath_.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1176 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1177 if (resources.find(it->first) == resources.end())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1178 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1179 const std::string& path = it->second;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1180
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1181 assert(pathToResource_.find(path) != pathToResource_.end());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1182 pathToResource_.erase(path);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1183 removedPaths.insert(path);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1184
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1185 removedResources.insert(it->first); // Delay the removal to avoid disturbing the iterator
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1186 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1187 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1188
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1189 // Remove the missing resources
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1190 for (std::set<std::string>::const_iterator it = removedResources.begin(); it != removedResources.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1191 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1192 assert(resourceToPath_.find(*it) != resourceToPath_.end());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1193 resourceToPath_.erase(*it);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1194 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1195
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1196 CheckInvariants();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1197
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1198 for (std::set<std::string>::const_iterator it = resources.begin(); it != resources.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1199 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1200 Register(*it);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1201 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1202
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1203 CheckInvariants();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1204 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1205
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1206 const Map& GetPathToResource() const
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1207 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1208 return pathToResource_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1209 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1210 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1211
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1212
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1213 class INode : public boost::noncopyable
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1214 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1215 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1216 virtual ~INode()
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1217 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1218 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1219
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1220 virtual bool ListCollection(IWebDavBucket::Collection& target,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1221 const UriComponents& path) = 0;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1222
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1223 virtual bool GetFileContent(MimeType& mime,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1224 std::string& content,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1225 boost::posix_time::ptime& time,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1226 const UriComponents& path) = 0;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1227 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1228
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1229
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1230
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1231 class InstancesOfSeries : public INode
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1232 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1233 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1234 ServerContext& context_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1235 std::string parentSeries_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1236
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1237 public:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1238 InstancesOfSeries(ServerContext& context,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1239 const std::string& parentSeries) :
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1240 context_(context),
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1241 parentSeries_(parentSeries)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1242 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1243 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1244
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1245 virtual bool ListCollection(IWebDavBucket::Collection& target,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1246 const UriComponents& path) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1247 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1248 if (path.empty())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1249 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1250 std::list<std::string> resources;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1251 try
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1252 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1253 context_.GetIndex().GetChildren(resources, parentSeries_);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1254 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1255 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1256 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1257 // Unknown (or deleted) parent series
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1258 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1259 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1260
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1261 for (std::list<std::string>::const_iterator
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1262 it = resources.begin(); it != resources.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1263 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1264 boost::posix_time::ptime time;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1265 LookupTime(time, context_, *it, MetadataType_Instance_ReceptionDate);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1266
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1267 FileInfo info;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1268 if (context_.GetIndex().LookupAttachment(info, *it, FileContentType_Dicom))
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1269 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1270 std::unique_ptr<File> resource(new File(*it + ".dcm"));
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1271 resource->SetMimeType(MimeType_Dicom);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1272 resource->SetContentLength(info.GetUncompressedSize());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1273 resource->SetCreationTime(time);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1274 target.AddResource(resource.release());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1275 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1276 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1277
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1278 return true;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1279 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1280 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1281 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1282 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1283 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1284 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1285
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1286 virtual bool GetFileContent(MimeType& mime,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1287 std::string& content,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1288 boost::posix_time::ptime& time,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1289 const UriComponents& path) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1290 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1291 if (path.size() == 1 &&
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1292 boost::ends_with(path[0], ".dcm"))
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1293 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1294 std::string instanceId = path[0].substr(0, path[0].size() - 4);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1295
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1296 try
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1297 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1298 mime = MimeType_Dicom;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1299 context_.ReadDicom(content, instanceId);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1300 LookupTime(time, context_, instanceId, MetadataType_Instance_ReceptionDate);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1301 return true;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1302 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1303 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1304 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1305 // File was removed
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1306 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1307 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1308 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1309 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1310 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1311 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1312 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1313 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1314 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1315
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1316
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1317
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1318 /**
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1319 * The "InternalNode" class corresponds to a non-leaf node in the
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1320 * WebDAV tree, that only contains subfolders (no file).
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1321 *
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1322 * TODO: Implement a LRU index to dynamically remove the oldest
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1323 * children on high RAM usage.
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1324 **/
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1325 class InternalNode : public INode
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1326 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1327 private:
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1328 typedef std::map<std::string, INode*> Children;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1329
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1330 Children children_;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1331
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1332 INode* GetChild(const std::string& path) // Don't delete the result pointer!
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1333 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1334 Children::const_iterator child = children_.find(path);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1335 if (child == children_.end())
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1336 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1337 INode* child = CreateChild(path);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1338
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1339 if (child == NULL)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1340 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1341 return NULL;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1342 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1343 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1344 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1345 children_[path] = child;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1346 return child;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1347 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1348 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1349 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1350 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1351 assert(child->second != NULL);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1352 return child->second;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1353 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1354 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1355
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1356 protected:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1357 void RemoveSubfolder(const std::string& path)
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1358 {
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1359 Children::iterator child = children_.find(path);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1360 if (child != children_.end())
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1361 {
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1362 assert(child->second != NULL);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1363 delete child->second;
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1364 children_.erase(child);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1365 }
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1366 }
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1367
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1368 virtual void Refresh() = 0;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1369
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1370 virtual bool ListSubfolders(IWebDavBucket::Collection& target) = 0;
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1371
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1372 virtual INode* CreateChild(const std::string& path) = 0;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1373
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1374 public:
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1375 virtual ~InternalNode()
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1376 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1377 for (Children::iterator it = children_.begin(); it != children_.end(); ++it)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1378 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1379 assert(it->second != NULL);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1380 delete it->second;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1381 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1382 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1383
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1384 virtual bool ListCollection(IWebDavBucket::Collection& target,
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1385 const UriComponents& path)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1386 ORTHANC_OVERRIDE ORTHANC_FINAL
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1387 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1388 Refresh();
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1389
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1390 if (path.empty())
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1391 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1392 return ListSubfolders(target);
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1393 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1394 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1395 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1396 // Recursivity
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1397 INode* child = GetChild(path[0]);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1398 if (child == NULL)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1399 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1400 return false;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1401 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1402 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1403 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1404 UriComponents subpath(path.begin() + 1, path.end());
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1405 return child->ListCollection(target, subpath);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1406 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1407 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1408 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1409
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1410 virtual bool GetFileContent(MimeType& mime,
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1411 std::string& content,
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1412 boost::posix_time::ptime& time,
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1413 const UriComponents& path)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1414 ORTHANC_OVERRIDE ORTHANC_FINAL
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1415 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1416 if (path.empty())
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1417 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1418 return false; // An internal node doesn't correspond to a file
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1419 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1420 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1421 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1422 // Recursivity
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1423 Refresh();
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1424
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1425 INode* child = GetChild(path[0]);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1426 if (child == NULL)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1427 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1428 return false;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1429 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1430 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1431 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1432 UriComponents subpath(path.begin() + 1, path.end());
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1433 return child->GetFileContent(mime, content, time, subpath);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1434 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1435 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1436 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1437 };
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1438
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1439
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1440 class ListOfResources : public InternalNode
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1441 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1442 private:
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1443 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1444 const Templates& templates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1445 std::unique_ptr<ResourcesIndex> index_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1446 MetadataType timeMetadata_;
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1447
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1448 protected:
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1449 virtual void Refresh() ORTHANC_OVERRIDE ORTHANC_FINAL
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1450 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1451 std::list<std::string> resources;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1452 GetCurrentResources(resources);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1453
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1454 std::set<std::string> removedPaths;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1455 index_->Refresh(removedPaths, std::set<std::string>(resources.begin(), resources.end()));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1456
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1457 // Remove the children whose associated resource doesn't exist anymore
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1458 for (std::set<std::string>::const_iterator
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1459 it = removedPaths.begin(); it != removedPaths.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1460 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1461 RemoveSubfolder(*it);
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1462 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1463 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1464
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1465 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE ORTHANC_FINAL
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1466 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1467 if (index_->GetLevel() == ResourceType_Instance)
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1468 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1469 // Not a collection, no subfolders
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1470 return false;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1471 }
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1472 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1473 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1474 const ResourcesIndex::Map& paths = index_->GetPathToResource();
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1475
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1476 for (ResourcesIndex::Map::const_iterator it = paths.begin(); it != paths.end(); ++it)
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1477 {
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1478 boost::posix_time::ptime time;
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1479 LookupTime(time, context_, it->second, timeMetadata_);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1480
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1481 std::unique_ptr<IWebDavBucket::Resource> resource(new IWebDavBucket::Folder(it->first));
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1482 resource->SetCreationTime(time);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1483 target.AddResource(resource.release());
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1484 }
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1485
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1486 return true;
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1487 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1488 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1489
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1490 virtual INode* CreateChild(const std::string& path) ORTHANC_OVERRIDE ORTHANC_FINAL
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1491 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1492 ResourcesIndex::Map::const_iterator resource = index_->GetPathToResource().find(path);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1493 if (resource == index_->GetPathToResource().end())
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1494 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1495 return NULL;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1496 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1497 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1498 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1499 return CreateResourceNode(resource->second);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1500 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1501 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1502
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1503 ServerContext& GetContext() const
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1504 {
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1505 return context_;
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1506 }
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1507
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1508 virtual void GetCurrentResources(std::list<std::string>& resources) = 0;
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1509
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1510 virtual INode* CreateResourceNode(const std::string& resource) = 0;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1511
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1512 public:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1513 ListOfResources(ServerContext& context,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1514 ResourceType level,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1515 const Templates& templates) :
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1516 context_(context),
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1517 templates_(templates)
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1518 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1519 Templates::const_iterator t = templates.find(level);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1520 if (t == templates.end())
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1521 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1522 throw OrthancException(ErrorCode_ParameterOutOfRange);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1523 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1524
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1525 index_.reset(new ResourcesIndex(context, level, t->second));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1526
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1527 if (level == ResourceType_Instance)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1528 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1529 timeMetadata_ = MetadataType_Instance_ReceptionDate;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1530 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1531 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1532 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1533 timeMetadata_ = MetadataType_LastUpdate;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1534 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1535 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1536
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1537 ResourceType GetLevel() const
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1538 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1539 return index_->GetLevel();
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1540 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1541
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1542 const Templates& GetTemplates() const
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1543 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1544 return templates_;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1545 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1546 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1547
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1548
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1549
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1550 class SingleDicomResource : public ListOfResources
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1551 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1552 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1553 std::string parentId_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1554
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1555 protected:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1556 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1557 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1558 try
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1559 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1560 GetContext().GetIndex().GetChildren(resources, parentId_);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1561 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1562 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1563 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1564 // Unknown parent resource
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1565 resources.clear();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1566 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1567 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1568
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1569 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1570 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1571 if (GetLevel() == ResourceType_Instance)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1572 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1573 return NULL;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1574 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1575 else if (GetLevel() == ResourceType_Series)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1576 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1577 return new InstancesOfSeries(GetContext(), resource);
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1578 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1579 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1580 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1581 ResourceType l = GetChildResourceType(GetLevel());
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1582 return new SingleDicomResource(GetContext(), l, resource, GetTemplates());
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1583 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1584 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1585
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1586 public:
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1587 SingleDicomResource(ServerContext& context,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1588 ResourceType level,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1589 const std::string& parentId,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1590 const Templates& templates) :
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1591 ListOfResources(context, level, templates),
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1592 parentId_(parentId)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1593 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1594 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1595 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1596
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1597
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1598 class RootNode : public ListOfResources
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1599 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1600 protected:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1601 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1602 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1603 GetContext().GetIndex().GetAllUuids(resources, GetLevel());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1604 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1605
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1606 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1607 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1608 if (GetLevel() == ResourceType_Series)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1609 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1610 return new InstancesOfSeries(GetContext(), resource);
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1611 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1612 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1613 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1614 ResourceType l = GetChildResourceType(GetLevel());
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1615 return new SingleDicomResource(GetContext(), l, resource, GetTemplates());
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1616 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1617 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1618
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1619 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1620 RootNode(ServerContext& context,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1621 ResourceType level,
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1622 const Templates& templates) :
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1623 ListOfResources(context, level, templates)
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1624 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1625 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1626 };
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1627
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1628
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1629 class ListOfStudiesByDate : public ListOfResources
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1630 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1631 private:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1632 std::string year_;
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1633 std::string month_;
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1634
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1635 class Visitor : public ServerContext::ILookupVisitor
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1636 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1637 private:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1638 std::list<std::string>& resources_;
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1639
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1640 public:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1641 Visitor(std::list<std::string>& resources) :
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1642 resources_(resources)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1643 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1644 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1645
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1646 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1647 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1648 return false; // (*)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1649 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1650
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1651 virtual void MarkAsComplete() ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1652 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1653 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1654
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1655 virtual void Visit(const std::string& publicId,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1656 const std::string& instanceId /* unused */,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1657 const DicomMap& mainDicomTags,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1658 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1659 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1660 resources_.push_back(publicId);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1661 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1662 };
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1663
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1664 protected:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1665 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1666 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1667 DatabaseLookup query;
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1668 query.AddRestConstraint(DICOM_TAG_STUDY_DATE, year_ + month_ + "01-" + year_ + month_ + "31",
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1669 true /* case sensitive */, true /* mandatory tag */);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1670
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1671 Visitor visitor(resources);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1672 GetContext().Apply(visitor, query, ResourceType_Study, 0 /* since */, 0 /* no limit */);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1673 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1674
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1675 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1676 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1677 return new SingleDicomResource(GetContext(), ResourceType_Series, resource, GetTemplates());
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1678 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1679
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1680 public:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1681 ListOfStudiesByDate(ServerContext& context,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1682 const std::string& year,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1683 const std::string& month,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1684 const Templates& templates) :
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1685 ListOfResources(context, ResourceType_Study, templates),
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1686 year_(year),
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1687 month_(month)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1688 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1689 if (year.size() != 4 ||
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1690 month.size() != 2)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1691 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1692 throw OrthancException(ErrorCode_ParameterOutOfRange);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1693 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1694 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1695 };
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1696
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1697
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1698 class ListOfStudiesByMonth : public InternalNode
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1699 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1700 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1701 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1702 std::string year_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1703 const Templates& templates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1704
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1705 class Visitor : public ServerContext::ILookupVisitor
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1706 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1707 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1708 std::set<std::string> months_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1709
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1710 public:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1711 Visitor()
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1712 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1713 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1714
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1715 const std::set<std::string>& GetMonths() const
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1716 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1717 return months_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1718 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1719
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1720 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1721 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1722 return false; // (*)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1723 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1724
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1725 virtual void MarkAsComplete() ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1726 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1727 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1728
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1729 virtual void Visit(const std::string& publicId,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1730 const std::string& instanceId /* unused */,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1731 const DicomMap& mainDicomTags,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1732 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1733 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1734 std::string s;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1735 if (mainDicomTags.LookupStringValue(s, DICOM_TAG_STUDY_DATE, false) &&
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1736 s.size() == 8)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1737 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1738 months_.insert(s.substr(4, 2)); // Get the month from "YYYYMMDD"
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1739 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1740 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1741 };
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1742
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1743 protected:
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1744 virtual void Refresh() ORTHANC_OVERRIDE
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1745 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1746 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1747
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1748 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1749 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1750 DatabaseLookup query;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1751 query.AddRestConstraint(DICOM_TAG_STUDY_DATE, year_ + "0101-" + year_ + "1231",
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1752 true /* case sensitive */, true /* mandatory tag */);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1753
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1754 Visitor visitor;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1755 context_.Apply(visitor, query, ResourceType_Study, 0 /* since */, 0 /* no limit */);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1756
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1757 for (std::set<std::string>::const_iterator it = visitor.GetMonths().begin();
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1758 it != visitor.GetMonths().end(); ++it)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1759 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1760 target.AddResource(new IWebDavBucket::Folder(year_ + "-" + *it));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1761 }
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1762
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1763 return true;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1764 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1765
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1766 virtual INode* CreateChild(const std::string& path) ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1767 {
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1768 if (path.size() != 7) // Format: "YYYY-MM"
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1769 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1770 throw OrthancException(ErrorCode_InternalError);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1771 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1772 else
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1773 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1774 const std::string year = path.substr(0, 4);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1775 const std::string month = path.substr(5, 2);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1776 return new ListOfStudiesByDate(context_, year, month, templates_);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1777 }
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1778 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1779
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1780 public:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1781 ListOfStudiesByMonth(ServerContext& context,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1782 const std::string& year,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1783 const Templates& templates) :
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1784 context_(context),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1785 year_(year),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1786 templates_(templates)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1787 {
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1788 if (year_.size() != 4)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1789 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1790 throw OrthancException(ErrorCode_ParameterOutOfRange);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1791 }
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1792 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1793 };
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1794
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1795
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1796 class ListOfStudiesByYear : public InternalNode
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1797 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1798 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1799 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1800 const Templates& templates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1801
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1802 protected:
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1803 virtual void Refresh() ORTHANC_OVERRIDE
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1804 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1805 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1806
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1807 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1808 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1809 std::list<std::string> resources;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1810 context_.GetIndex().GetAllUuids(resources, ResourceType_Study);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1811
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1812 std::set<std::string> years;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1813
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1814 for (std::list<std::string>::const_iterator it = resources.begin(); it != resources.end(); ++it)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1815 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1816 DicomMap tags;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1817 std::string studyDate;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1818 if (context_.GetIndex().GetMainDicomTags(tags, *it, ResourceType_Study, ResourceType_Study) &&
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1819 tags.LookupStringValue(studyDate, DICOM_TAG_STUDY_DATE, false) &&
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1820 studyDate.size() == 8)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1821 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1822 years.insert(studyDate.substr(0, 4)); // Get the year from "YYYYMMDD"
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1823 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1824 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1825
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1826 for (std::set<std::string>::const_iterator it = years.begin(); it != years.end(); ++it)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1827 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1828 target.AddResource(new IWebDavBucket::Folder(*it));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1829 }
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1830
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1831 return true;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1832 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1833
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1834 virtual INode* CreateChild(const std::string& path) ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1835 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1836 return new ListOfStudiesByMonth(context_, path, templates_);
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1837 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1838
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1839 public:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1840 ListOfStudiesByYear(ServerContext& context,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1841 const Templates& templates) :
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1842 context_(context),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1843 templates_(templates)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1844 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1845 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1846 };
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1847
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1848
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1849 static void UploadWorker(DummyBucket2* that)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1850 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1851 assert(that != NULL);
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1852
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1853 boost::posix_time::ptime lastModification = GetNow();
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1854
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1855 while (that->running_)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1856 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1857 std::unique_ptr<IDynamicObject> obj(that->uploadQueue_.Dequeue(100));
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1858 if (obj.get() != NULL)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1859 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1860 that->Upload(reinterpret_cast<const SingleValueObject<std::string>&>(*obj).GetValue());
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1861 lastModification = GetNow();
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1862 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1863 else if (GetNow() - lastModification > boost::posix_time::seconds(10))
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1864 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1865 // After every 10 seconds of inactivity, remove the empty folders
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1866 LOG(INFO) << "Cleaning up the empty WebDAV upload folders";
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1867 that->uploads_.RemoveEmptyFolders();
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1868 lastModification = GetNow();
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1869 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1870 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1871 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1872
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1873 void Upload(const std::string& path)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1874 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1875 UriComponents uri;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1876 Toolbox::SplitUriComponents(uri, path);
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1877
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1878 LOG(INFO) << "Upload from WebDAV: " << path;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1879
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1880 MimeType mime;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1881 std::string content;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1882 boost::posix_time::ptime time;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1883 if (uploads_.GetFileContent(mime, content, time, uri))
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1884 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1885 DicomInstanceToStore instance;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1886 // instance.SetOrigin(DicomInstanceOrigin_WebDav);
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1887 instance.SetBuffer(content.c_str(), content.size());
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1888
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1889 std::string publicId;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1890 StoreStatus status = context_.Store(publicId, instance, StoreInstanceMode_Default);
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1891 if (status == StoreStatus_Success ||
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1892 status == StoreStatus_AlreadyStored)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1893 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1894 LOG(INFO) << "Successfully imported DICOM instance from WebDAV: " << path << " (Orthanc ID: " << publicId << ")";
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1895 uploads_.DeleteItem(uri);
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1896 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1897 else
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1898 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1899 LOG(WARNING) << "Cannot import DICOM instance from WebWAV: " << path;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1900 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1901 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1902 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1903
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1904
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1905 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1906 std::unique_ptr<INode> patients_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1907 std::unique_ptr<INode> studies_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1908 std::unique_ptr<INode> dates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1909 Templates patientsTemplates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1910 Templates studiesTemplates_;
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1911 WebDavStorage uploads_;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1912 SharedMessageQueue uploadQueue_;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1913 boost::thread uploadThread_;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1914 bool running_;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1915
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1916 public:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1917 DummyBucket2(ServerContext& context) :
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1918 context_(context),
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1919 uploads_(false /* store uploads as temporary files */),
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1920 running_(false)
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1921 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1922 patientsTemplates_[ResourceType_Patient] = "{{PatientID}} - {{PatientName}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1923 patientsTemplates_[ResourceType_Study] = "{{StudyDate}} - {{StudyDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1924 patientsTemplates_[ResourceType_Series] = "{{Modality}} - {{SeriesDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1925
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1926 studiesTemplates_[ResourceType_Study] = "{{PatientID}} - {{PatientName}} - {{StudyDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1927 studiesTemplates_[ResourceType_Series] = patientsTemplates_[ResourceType_Series];
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1928
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1929 patients_.reset(new RootNode(context, ResourceType_Patient, patientsTemplates_));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1930 studies_.reset(new RootNode(context, ResourceType_Study, studiesTemplates_));
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1931 dates_.reset(new ListOfStudiesByYear(context, studiesTemplates_));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1932 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1933
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1934 virtual ~DummyBucket2()
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1935 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1936 Stop();
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1937 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1938
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1939 virtual bool IsExistingFolder(const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1940 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1941 if (path.empty())
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1942 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1943 return true;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1944 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1945 else if (path[0] == BY_UIDS)
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1946 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1947 return (path.size() <= 3 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1948 (path.size() != 3 || path[2] != "study.json"));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1949 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1950 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1951 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1952 IWebDavBucket::Collection tmp;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1953 return patients_->ListCollection(tmp, UriComponents(path.begin() + 1, path.end()));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1954 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1955 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1956 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1957 IWebDavBucket::Collection tmp;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1958 return studies_->ListCollection(tmp, UriComponents(path.begin() + 1, path.end()));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1959 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1960 else if (path[0] == BY_DATE)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1961 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1962 IWebDavBucket::Collection tmp;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1963 return dates_->ListCollection(tmp, UriComponents(path.begin() + 1, path.end()));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1964 }
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1965 else if (path[0] == UPLOADS)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1966 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1967 return uploads_.IsExistingFolder(UriComponents(path.begin() + 1, path.end()));
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1968 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1969 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1970 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1971 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1972 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1973 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1974
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1975 virtual bool ListCollection(Collection& collection,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1976 const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1977 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1978 if (path.empty())
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1979 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1980 collection.AddResource(new Folder(BY_DATE));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1981 collection.AddResource(new Folder(BY_PATIENTS));
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1982 collection.AddResource(new Folder(BY_STUDIES));
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1983 collection.AddResource(new Folder(BY_UIDS));
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
1984 collection.AddResource(new Folder(UPLOADS));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1985 return true;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1986 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1987 else if (path[0] == BY_UIDS)
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1988 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1989 DatabaseLookup query;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1990 ResourceType level;
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1991 size_t limit = 0; // By default, no limits
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1992
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1993 if (path.size() == 1)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1994 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1995 level = ResourceType_Study;
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1996 limit = 100; // TODO
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1997 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1998 else if (path.size() == 2)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1999 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2000 AddVirtualFile(collection, path, "study.json");
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2001
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2002 level = ResourceType_Series;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2003 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1],
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2004 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2005 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2006 else if (path.size() == 3)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2007 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2008 AddVirtualFile(collection, path, "series.json");
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2009
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2010 level = ResourceType_Instance;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2011 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1],
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2012 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2013 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2],
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2014 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2015 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2016 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2017 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2018 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2019 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2020
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2021 DicomIdentifiersVisitor visitor(context_, collection, level);
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2022 context_.Apply(visitor, query, level, 0 /* since */, limit);
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2023
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2024 return true;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2025 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2026 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2027 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2028 return patients_->ListCollection(collection, UriComponents(path.begin() + 1, path.end()));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2029 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2030 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2031 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2032 return studies_->ListCollection(collection, UriComponents(path.begin() + 1, path.end()));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2033 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2034 else if (path[0] == BY_DATE)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2035 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2036 return dates_->ListCollection(collection, UriComponents(path.begin() + 1, path.end()));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2037 }
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2038 else if (path[0] == UPLOADS)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2039 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2040 return uploads_.ListCollection(collection, UriComponents(path.begin() + 1, path.end()));
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2041 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2042 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2043 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2044 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2045 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2046 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2047
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2048 virtual bool GetFileContent(MimeType& mime,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2049 std::string& content,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2050 boost::posix_time::ptime& modificationTime,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2051 const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2052 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2053 if (path.empty())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2054 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2055 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2056 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2057 else if (path[0] == BY_UIDS)
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2058 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2059 if (path.size() == 3 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2060 path[2] == "study.json")
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2061 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2062 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2063 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1],
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2064 true /* case sensitive */, true /* mandatory tag */);
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2065
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2066 OrthancJsonVisitor visitor(context_, content, ResourceType_Study);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2067 context_.Apply(visitor, query, ResourceType_Study, 0 /* since */, 0 /* no limit */);
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2068
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2069 mime = MimeType_Json;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2070 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2071 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2072 else if (path.size() == 4 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2073 path[3] == "series.json")
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2074 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2075 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2076 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1],
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2077 true /* case sensitive */, true /* mandatory tag */);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2078 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2],
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2079 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2080
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2081 OrthancJsonVisitor visitor(context_, content, ResourceType_Series);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2082 context_.Apply(visitor, query, ResourceType_Series, 0 /* since */, 0 /* no limit */);
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2083
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2084 mime = MimeType_Json;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2085 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2086 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2087 else if (path.size() == 4 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2088 boost::ends_with(path[3], ".dcm"))
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2089 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2090 std::string sopInstanceUid = path[3];
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2091 sopInstanceUid.resize(sopInstanceUid.size() - 4);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2092
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2093 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2094 query.AddRestConstraint(DICOM_TAG_STUDY_INSTANCE_UID, path[1],
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2095 true /* case sensitive */, true /* mandatory tag */);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2096 query.AddRestConstraint(DICOM_TAG_SERIES_INSTANCE_UID, path[2],
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2097 true /* case sensitive */, true /* mandatory tag */);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2098 query.AddRestConstraint(DICOM_TAG_SOP_INSTANCE_UID, sopInstanceUid,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2099 true /* case sensitive */, true /* mandatory tag */);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2100
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2101 DicomFileVisitor visitor(context_, content, modificationTime);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2102 context_.Apply(visitor, query, ResourceType_Instance, 0 /* since */, 0 /* no limit */);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2103
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2104 mime = MimeType_Dicom;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2105 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2106 }
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2107 else
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2108 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2109 return false;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2110 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2111 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2112 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2113 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2114 return patients_->GetFileContent(mime, content, modificationTime, UriComponents(path.begin() + 1, path.end()));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2115 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2116 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2117 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2118 return studies_->GetFileContent(mime, content, modificationTime, UriComponents(path.begin() + 1, path.end()));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2119 }
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2120 else if (path[0] == UPLOADS)
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2121 {
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2122 return uploads_.GetFileContent(mime, content, modificationTime, UriComponents(path.begin() + 1, path.end()));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2123 }
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2124 else
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2125 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2126 return false;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2127 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2128 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2129
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2130
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2131 virtual bool StoreFile(const std::string& content,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2132 const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2133 {
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2134 if (path.size() >= 1 &&
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2135 path[0] == UPLOADS)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2136 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2137 UriComponents subpath(UriComponents(path.begin() + 1, path.end()));
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2138
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2139 if (uploads_.StoreFile(content, subpath))
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2140 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2141 if (!content.empty())
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2142 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2143 uploadQueue_.Enqueue(new SingleValueObject<std::string>(Toolbox::FlattenUri(subpath)));
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2144 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2145 return true;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2146 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2147 else
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2148 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2149 return false;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2150 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2151 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2152 else
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2153 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2154 return false;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2155 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2156 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2157
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2158
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2159 virtual bool CreateFolder(const UriComponents& path)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2160 {
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2161 if (path.size() >= 1 &&
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2162 path[0] == UPLOADS)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2163 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2164 return uploads_.CreateFolder(UriComponents(path.begin() + 1, path.end()));
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2165 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2166 else
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2167 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2168 return false;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2169 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2170 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2171
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2172 virtual bool DeleteItem(const std::vector<std::string>& path) ORTHANC_OVERRIDE
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2173 {
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2174 if (path.size() >= 1 &&
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2175 path[0] == UPLOADS)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2176 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2177 return uploads_.DeleteItem(UriComponents(path.begin() + 1, path.end()));
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2178 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2179 else
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2180 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2181 return false; // read-only
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2182 }
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2183 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2184
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2185 virtual void Start() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2186 {
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2187 if (running_)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2188 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2189 throw OrthancException(ErrorCode_BadSequenceOfCalls);
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2190 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2191 else
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2192 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2193 LOG(INFO) << "Starting the WebDAV upload thread";
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2194 running_ = true;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2195 uploadThread_ = boost::thread(UploadWorker, this);
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2196 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2197 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2198
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2199 virtual void Stop() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2200 {
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2201 if (running_)
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2202 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2203 LOG(INFO) << "Stopping the WebDAV upload thread";
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2204 running_ = false;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2205 if (uploadThread_.joinable())
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2206 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2207 uploadThread_.join();
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2208 }
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4238
diff changeset
2209 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2210 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2211 };
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2212
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2213
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2214
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2215 static void PrintHelp(const char* path)
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2216 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2217 std::cout
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2218 << "Usage: " << path << " [OPTION]... [CONFIGURATION]" << std::endl
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
2219 << "Orthanc, lightweight, RESTful DICOM server for healthcare and medical research." << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2220 << std::endl
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2221 << "The \"CONFIGURATION\" argument can be a single file or a directory. In the " << std::endl
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2222 << "case of a directory, all the JSON files it contains will be merged. " << std::endl
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2223 << "If no configuration path is given on the command line, a set of default " << std::endl
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
2224 << "parameters is used. Please refer to the Orthanc homepage for the full " << std::endl
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2225 << "instructions about how to use Orthanc <http://www.orthanc-server.com/>." << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2226 << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2227 << "Command-line options:" << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2228 << " --help\t\tdisplay this help and exit" << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2229 << " --logdir=[dir]\tdirectory where to store the log files" << std::endl
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2230 << "\t\t\t(by default, the log is dumped to stderr)" << std::endl
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2231 << " --logfile=[file]\tfile where to store the log of Orthanc" << std::endl
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2232 << "\t\t\t(by default, the log is dumped to stderr)" << std::endl
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
2233 << " --config=[file]\tcreate a sample configuration file and exit" << std::endl
3526
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
2234 << "\t\t\t(if file is \"-\", dumps to stdout)" << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2235 << " --errors\t\tprint the supported error codes and exit" << std::endl
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2236 << " --verbose\t\tbe verbose in logs" << std::endl
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
2237 << " --trace\t\thighest verbosity in logs (for debug)" << std::endl
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2238 << " --upgrade\t\tallow Orthanc to upgrade the version of the" << std::endl
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2239 << "\t\t\tdatabase (beware that the database will become" << std::endl
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2240 << "\t\t\tincompatible with former versions of Orthanc)" << std::endl
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2241 << " --no-jobs\t\tDon't restart the jobs that were stored during" << std::endl
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2242 << "\t\t\tthe last execution of Orthanc" << std::endl
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
2243 << " --version\t\toutput version information and exit" << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2244 << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2245 << "Exit status:" << std::endl
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2246 << " 0 if success," << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2247 #if defined(_WIN32)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2248 << "!= 0 if error (use the --errors option to get the list of possible errors)." << std::endl
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2249 #else
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2250 << " -1 if error (have a look at the logs)." << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2251 #endif
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2252 << std::endl;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2253 }
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2254
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2255
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2256 static void PrintVersion(const char* path)
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2257 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2258 std::cout
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2259 << path << " " << ORTHANC_VERSION << std::endl
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1872
diff changeset
2260 << "Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics Department, University Hospital of Liege (Belgium)" << std::endl
3640
94f4a18a79cc upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
2261 << "Copyright (C) 2017-2020 Osimis S.A. (Belgium)" << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2262 << "Licensing GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>, with OpenSSL exception." << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2263 << "This is free software: you are free to change and redistribute it." << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2264 << "There is NO WARRANTY, to the extent permitted by law." << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2265 << std::endl
3063
fa5ad4368fe3 new mail address
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3060
diff changeset
2266 << "Written by Sebastien Jodogne <s.jodogne@orthanc-labs.com>" << std::endl;
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2267 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2268
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2269
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2270 static void PrintErrorCode(ErrorCode code, const char* description)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2271 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2272 std::cout
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2273 << std::right << std::setw(16)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2274 << static_cast<int>(code)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2275 << " " << description << std::endl;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2276 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2277
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2278
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2279 static void PrintErrors(const char* path)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2280 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2281 std::cout
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2282 << path << " " << ORTHANC_VERSION << std::endl
1734
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2283 << "Orthanc, lightweight, RESTful DICOM server for healthcare and medical research."
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2284 << std::endl << std::endl
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2285 << "List of error codes that could be returned by Orthanc:"
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2286 << std::endl << std::endl;
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2287
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2288 // The content of the following brackets is automatically generated
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2289 // by the "GenerateErrorCodes.py" script
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2290 {
1734
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2291 PrintErrorCode(ErrorCode_InternalError, "Internal error");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2292 PrintErrorCode(ErrorCode_Success, "Success");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2293 PrintErrorCode(ErrorCode_Plugin, "Error encountered within the plugin engine");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2294 PrintErrorCode(ErrorCode_NotImplemented, "Not implemented yet");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2295 PrintErrorCode(ErrorCode_ParameterOutOfRange, "Parameter out of range");
2133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2132
diff changeset
2296 PrintErrorCode(ErrorCode_NotEnoughMemory, "The server hosting Orthanc is running out of memory");
1734
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2297 PrintErrorCode(ErrorCode_BadParameterType, "Bad type for a parameter");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2298 PrintErrorCode(ErrorCode_BadSequenceOfCalls, "Bad sequence of calls");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2299 PrintErrorCode(ErrorCode_InexistentItem, "Accessing an inexistent item");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2300 PrintErrorCode(ErrorCode_BadRequest, "Bad request");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2301 PrintErrorCode(ErrorCode_NetworkProtocol, "Error in the network protocol");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2302 PrintErrorCode(ErrorCode_SystemCommand, "Error while calling a system command");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2303 PrintErrorCode(ErrorCode_Database, "Error with the database engine");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2304 PrintErrorCode(ErrorCode_UriSyntax, "Badly formatted URI");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2305 PrintErrorCode(ErrorCode_InexistentFile, "Inexistent file");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2306 PrintErrorCode(ErrorCode_CannotWriteFile, "Cannot write to file");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2307 PrintErrorCode(ErrorCode_BadFileFormat, "Bad file format");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2308 PrintErrorCode(ErrorCode_Timeout, "Timeout");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2309 PrintErrorCode(ErrorCode_UnknownResource, "Unknown resource");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2310 PrintErrorCode(ErrorCode_IncompatibleDatabaseVersion, "Incompatible version of the database");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2311 PrintErrorCode(ErrorCode_FullStorage, "The file storage is full");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2312 PrintErrorCode(ErrorCode_CorruptedFile, "Corrupted file (e.g. inconsistent MD5 hash)");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2313 PrintErrorCode(ErrorCode_InexistentTag, "Inexistent tag");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2314 PrintErrorCode(ErrorCode_ReadOnly, "Cannot modify a read-only data structure");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2315 PrintErrorCode(ErrorCode_IncompatibleImageFormat, "Incompatible format of the images");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2316 PrintErrorCode(ErrorCode_IncompatibleImageSize, "Incompatible size of the images");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2317 PrintErrorCode(ErrorCode_SharedLibrary, "Error while using a shared library (plugin)");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2318 PrintErrorCode(ErrorCode_UnknownPluginService, "Plugin invoking an unknown service");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2319 PrintErrorCode(ErrorCode_UnknownDicomTag, "Unknown DICOM tag");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2320 PrintErrorCode(ErrorCode_BadJson, "Cannot parse a JSON document");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2321 PrintErrorCode(ErrorCode_Unauthorized, "Bad credentials were provided to an HTTP request");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2322 PrintErrorCode(ErrorCode_BadFont, "Badly formatted font file");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2323 PrintErrorCode(ErrorCode_DatabasePlugin, "The plugin implementing a custom database back-end does not fulfill the proper interface");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2324 PrintErrorCode(ErrorCode_StorageAreaPlugin, "Error in the plugin implementing a custom storage area");
1746
d143db00a794 SetOfResources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
2325 PrintErrorCode(ErrorCode_EmptyRequest, "The request is empty");
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1746
diff changeset
2326 PrintErrorCode(ErrorCode_NotAcceptable, "Cannot send a response which is acceptable according to the Accept HTTP header");
2132
a43708636890 ErrorCode_NotEnoughMemory and ErrorCode_NullPointer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2079
diff changeset
2327 PrintErrorCode(ErrorCode_NullPointer, "Cannot handle a NULL pointer");
2486
ad8f30fc28d1 new error code: DatabaseUnavailable
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
2328 PrintErrorCode(ErrorCode_DatabaseUnavailable, "The database is currently not available (probably a transient situation)");
2581
8da2cffc2378 JobsRegistry::Cancel()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2572
diff changeset
2329 PrintErrorCode(ErrorCode_CanceledJob, "This job was canceled");
3376
56ea9c476dba new error code for Stone: BadGeometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3180
diff changeset
2330 PrintErrorCode(ErrorCode_BadGeometry, "Geometry error encountered in Stone");
3801
9fe1d64a748c upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3767
diff changeset
2331 PrintErrorCode(ErrorCode_SslInitialization, "Cannot initialize SSL encryption, check out your certificates");
1734
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2332 PrintErrorCode(ErrorCode_SQLiteNotOpened, "SQLite: The database is not opened");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2333 PrintErrorCode(ErrorCode_SQLiteAlreadyOpened, "SQLite: Connection is already open");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2334 PrintErrorCode(ErrorCode_SQLiteCannotOpen, "SQLite: Unable to open the database");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2335 PrintErrorCode(ErrorCode_SQLiteStatementAlreadyUsed, "SQLite: This cached statement is already being referred to");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2336 PrintErrorCode(ErrorCode_SQLiteExecute, "SQLite: Cannot execute a command");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2337 PrintErrorCode(ErrorCode_SQLiteRollbackWithoutTransaction, "SQLite: Rolling back a nonexistent transaction (have you called Begin()?)");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2338 PrintErrorCode(ErrorCode_SQLiteCommitWithoutTransaction, "SQLite: Committing a nonexistent transaction");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2339 PrintErrorCode(ErrorCode_SQLiteRegisterFunction, "SQLite: Unable to register a function");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2340 PrintErrorCode(ErrorCode_SQLiteFlush, "SQLite: Unable to flush the database");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2341 PrintErrorCode(ErrorCode_SQLiteCannotRun, "SQLite: Cannot run a cached statement");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2342 PrintErrorCode(ErrorCode_SQLiteCannotStep, "SQLite: Cannot step over a cached statement");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2343 PrintErrorCode(ErrorCode_SQLiteBindOutOfRange, "SQLite: Bing a value while out of range (serious error)");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2344 PrintErrorCode(ErrorCode_SQLitePrepareStatement, "SQLite: Cannot prepare a cached statement");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2345 PrintErrorCode(ErrorCode_SQLiteTransactionAlreadyStarted, "SQLite: Beginning the same transaction twice");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2346 PrintErrorCode(ErrorCode_SQLiteTransactionCommit, "SQLite: Failure when committing the transaction");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2347 PrintErrorCode(ErrorCode_SQLiteTransactionBegin, "SQLite: Cannot start a transaction");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2348 PrintErrorCode(ErrorCode_DirectoryOverFile, "The directory to be created is already occupied by a regular file");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2349 PrintErrorCode(ErrorCode_FileStorageCannotWrite, "Unable to create a subdirectory or a file in the file storage");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2350 PrintErrorCode(ErrorCode_DirectoryExpected, "The specified path does not point to a directory");
1949
d90f737f2dde warn about the use of privileged ports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
2351 PrintErrorCode(ErrorCode_HttpPortInUse, "The TCP port of the HTTP server is privileged or already in use");
d90f737f2dde warn about the use of privileged ports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
2352 PrintErrorCode(ErrorCode_DicomPortInUse, "The TCP port of the DICOM server is privileged or already in use");
1734
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2353 PrintErrorCode(ErrorCode_BadHttpStatusInRest, "This HTTP status is not allowed in a REST API");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2354 PrintErrorCode(ErrorCode_RegularFileExpected, "The specified path does not point to a regular file");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2355 PrintErrorCode(ErrorCode_PathToExecutable, "Unable to get the path to the executable");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2356 PrintErrorCode(ErrorCode_MakeDirectory, "Cannot create a directory");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2357 PrintErrorCode(ErrorCode_BadApplicationEntityTitle, "An application entity title (AET) cannot be empty or be longer than 16 characters");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2358 PrintErrorCode(ErrorCode_NoCFindHandler, "No request handler factory for DICOM C-FIND SCP");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2359 PrintErrorCode(ErrorCode_NoCMoveHandler, "No request handler factory for DICOM C-MOVE SCP");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2360 PrintErrorCode(ErrorCode_NoCStoreHandler, "No request handler factory for DICOM C-STORE SCP");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2361 PrintErrorCode(ErrorCode_NoApplicationEntityFilter, "No application entity filter");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2362 PrintErrorCode(ErrorCode_NoSopClassOrInstance, "DicomUserConnection: Unable to find the SOP class and instance");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2363 PrintErrorCode(ErrorCode_NoPresentationContext, "DicomUserConnection: No acceptable presentation context for modality");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2364 PrintErrorCode(ErrorCode_DicomFindUnavailable, "DicomUserConnection: The C-FIND command is not supported by the remote SCP");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2365 PrintErrorCode(ErrorCode_DicomMoveUnavailable, "DicomUserConnection: The C-MOVE command is not supported by the remote SCP");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2366 PrintErrorCode(ErrorCode_CannotStoreInstance, "Cannot store an instance");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2367 PrintErrorCode(ErrorCode_CreateDicomNotString, "Only string values are supported when creating DICOM instances");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2368 PrintErrorCode(ErrorCode_CreateDicomOverrideTag, "Trying to override a value inherited from a parent module");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2369 PrintErrorCode(ErrorCode_CreateDicomUseContent, "Use \"Content\" to inject an image into a new DICOM instance");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2370 PrintErrorCode(ErrorCode_CreateDicomNoPayload, "No payload is present for one instance in the series");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2371 PrintErrorCode(ErrorCode_CreateDicomUseDataUriScheme, "The payload of the DICOM instance must be specified according to Data URI scheme");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2372 PrintErrorCode(ErrorCode_CreateDicomBadParent, "Trying to attach a new DICOM instance to an inexistent resource");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2373 PrintErrorCode(ErrorCode_CreateDicomParentIsInstance, "Trying to attach a new DICOM instance to an instance (must be a series, study or patient)");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2374 PrintErrorCode(ErrorCode_CreateDicomParentEncoding, "Unable to get the encoding of the parent resource");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2375 PrintErrorCode(ErrorCode_UnknownModality, "Unknown modality");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2376 PrintErrorCode(ErrorCode_BadJobOrdering, "Bad ordering of filters in a job");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2377 PrintErrorCode(ErrorCode_JsonToLuaTable, "Cannot convert the given JSON object to a Lua table");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2378 PrintErrorCode(ErrorCode_CannotCreateLua, "Cannot create the Lua context");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2379 PrintErrorCode(ErrorCode_CannotExecuteLua, "Cannot execute a Lua command");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2380 PrintErrorCode(ErrorCode_LuaAlreadyExecuted, "Arguments cannot be pushed after the Lua function is executed");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2381 PrintErrorCode(ErrorCode_LuaBadOutput, "The Lua function does not give the expected number of outputs");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2382 PrintErrorCode(ErrorCode_NotLuaPredicate, "The Lua function is not a predicate (only true/false outputs allowed)");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2383 PrintErrorCode(ErrorCode_LuaReturnsNoString, "The Lua function does not return a string");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2384 PrintErrorCode(ErrorCode_StorageAreaAlreadyRegistered, "Another plugin has already registered a custom storage area");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2385 PrintErrorCode(ErrorCode_DatabaseBackendAlreadyRegistered, "Another plugin has already registered a custom database back-end");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2386 PrintErrorCode(ErrorCode_DatabaseNotInitialized, "Plugin trying to call the database during its initialization");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2387 PrintErrorCode(ErrorCode_SslDisabled, "Orthanc has been built without SSL support");
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
2388 PrintErrorCode(ErrorCode_CannotOrderSlices, "Unable to order the slices of the series");
1786
164d78911382 primitives to handle dicom worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
2389 PrintErrorCode(ErrorCode_NoWorklistHandler, "No request handler factory for DICOM C-Find Modality SCP");
1980
ebce5f456b8e new error code: ErrorCode_AlreadyExistingTag
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1965
diff changeset
2390 PrintErrorCode(ErrorCode_AlreadyExistingTag, "Cannot override the value of a tag that already exists");
4047
0327421506ad fix paths in GenerateErrorCodes.py
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
2391 PrintErrorCode(ErrorCode_NoStorageCommitmentHandler, "No request handler factory for DICOM N-ACTION SCP (storage commitment)");
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
2392 PrintErrorCode(ErrorCode_NoCGetHandler, "No request handler factory for DICOM C-GET SCP");
3404
e280ced38a4c ErrorCode_UnsupportedMediaType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3376
diff changeset
2393 PrintErrorCode(ErrorCode_UnsupportedMediaType, "Unsupported media type");
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2394 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2395
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2396 std::cout << std::endl;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2397 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2398
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2399
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2400
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2401 #if ORTHANC_ENABLE_PLUGINS == 1
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
2402 static void LoadPlugins(OrthancPlugins& plugins)
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2403 {
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2404 std::list<std::string> pathList;
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2405
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2406 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2407 OrthancConfiguration::ReaderLock lock;
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2408 lock.GetConfiguration().GetListOfStringsParameter(pathList, "Plugins");
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2409 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2410
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2411 for (std::list<std::string>::const_iterator
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2412 it = pathList.begin(); it != pathList.end(); ++it)
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2413 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2414 std::string path;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2415
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2416 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2417 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2418 path = lock.GetConfiguration().InterpretStringParameterAsPath(*it);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2419 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2420
1321
0f9e0e808e0f more explicit message
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1310
diff changeset
2421 LOG(WARNING) << "Loading plugin(s) from: " << path;
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
2422 plugins.GetManager().RegisterPlugin(path);
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2423 }
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2424 }
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1630
diff changeset
2425 #endif
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2426
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2427
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2428
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2429 // Returns "true" if restart is required
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2430 static bool WaitForExit(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2431 const OrthancRestApi& restApi)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2432 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2433 LOG(WARNING) << "Orthanc has started";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2434
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2435 #if ORTHANC_ENABLE_PLUGINS == 1
1741
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2436 if (context.HasPlugins())
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2437 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2438 context.GetPlugins().SignalOrthancStarted();
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2439 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2440 #endif
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2441
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2442 context.GetLuaScripting().Start();
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2443 context.GetLuaScripting().Execute("Initialize");
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2444
2010
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2445 bool restart;
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2446
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2447 for (;;)
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2448 {
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2136
diff changeset
2449 ServerBarrierEvent event = SystemToolbox::ServerBarrier(restApi.LeaveBarrierFlag());
2010
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2450 restart = restApi.IsResetRequestReceived();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2451
2010
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2452 if (!restart &&
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2453 event == ServerBarrierEvent_Reload)
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2454 {
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2455 // Handling of SIGHUP
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2456
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2457 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2458 if (lock.GetConfiguration().HasConfigurationChanged())
2010
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2459 {
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2460 LOG(WARNING) << "A SIGHUP signal has been received, resetting Orthanc";
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2461 Logging::Flush();
2010
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2462 restart = true;
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2463 break;
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2464 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2465 else
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2466 {
2946
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2467 LOG(WARNING) << "A SIGHUP signal has been received, but is ignored "
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2468 << "as the configuration has not changed on the disk";
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2469 Logging::Flush();
2010
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2470 continue;
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2471 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2472 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2473 else
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2474 {
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2475 break;
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2476 }
2009
e2dd40abce72 catching SIGHUP signal
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2000
diff changeset
2477 }
e2dd40abce72 catching SIGHUP signal
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2000
diff changeset
2478
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2479 context.GetLuaScripting().Execute("Finalize");
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2480 context.GetLuaScripting().Stop();
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2481
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2482 #if ORTHANC_ENABLE_PLUGINS == 1
1741
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2483 if (context.HasPlugins())
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2484 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2485 context.GetPlugins().SignalOrthancStopped();
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2486 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2487 #endif
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2488
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2489 if (restart)
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2490 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2491 LOG(WARNING) << "Reset request received, restarting Orthanc";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2492 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2493
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2494 // We're done
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2495 LOG(WARNING) << "Orthanc is stopping";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2496
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2497 return restart;
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2498 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2499
1368
b22ba8c5edbe query retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1366
diff changeset
2500
b22ba8c5edbe query retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1366
diff changeset
2501
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2502 static bool StartHttpServer(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2503 const OrthancRestApi& restApi,
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2504 OrthancPlugins* plugins)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2505 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2506 bool httpServerEnabled;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2507
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2508 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2509 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2510 httpServerEnabled = lock.GetConfiguration().GetBooleanParameter("HttpServerEnabled", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2511 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2512
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2513 if (!httpServerEnabled)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2514 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2515 LOG(WARNING) << "The HTTP server is disabled";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2516 return WaitForExit(context, restApi);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2517 }
1310
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2518 else
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2519 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2520 MyIncomingHttpRequestFilter httpFilter(context, plugins);
3138
ab46e537f92e renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3137
diff changeset
2521 HttpServer httpServer;
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2522 bool httpDescribeErrors;
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2523
3137
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2524 #if ORTHANC_ENABLE_MONGOOSE == 1
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2525 const bool defaultKeepAlive = false;
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2526 #elif ORTHANC_ENABLE_CIVETWEB == 1
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2527 const bool defaultKeepAlive = true;
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2528 #else
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2529 # error "Either Mongoose or Civetweb must be enabled to compile this file"
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2530 #endif
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2531
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2532 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2533 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2534
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2535 httpDescribeErrors = lock.GetConfiguration().GetBooleanParameter("HttpDescribeErrors", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2536
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2537 // HTTP server
3852
ee0a1211419f reverting default HttpThreadsCount to 50, as this slows performance of integration tests from 40s to 170s
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3842
diff changeset
2538 httpServer.SetThreadsCount(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpThreadsCount", 50));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2539 httpServer.SetPortNumber(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpPort", 8042));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2540 httpServer.SetRemoteAccessAllowed(lock.GetConfiguration().GetBooleanParameter("RemoteAccessAllowed", false));
3137
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2541 httpServer.SetKeepAliveEnabled(lock.GetConfiguration().GetBooleanParameter("KeepAlive", defaultKeepAlive));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2542 httpServer.SetHttpCompressionEnabled(lock.GetConfiguration().GetBooleanParameter("HttpCompressionEnabled", true));
3137
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2543 httpServer.SetTcpNoDelay(lock.GetConfiguration().GetBooleanParameter("TcpNoDelay", true));
3537
9cc09f4c0fa9 New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3535
diff changeset
2544 httpServer.SetRequestTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpRequestTimeout", 30));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2545
3534
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2546 // Let's assume that the HTTP server is secure
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2547 context.SetHttpServerSecure(true);
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2548
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2549 bool authenticationEnabled;
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2550 if (lock.GetConfiguration().LookupBooleanParameter(authenticationEnabled, "AuthenticationEnabled"))
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2551 {
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2552 httpServer.SetAuthenticationEnabled(authenticationEnabled);
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2553
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2554 if (httpServer.IsRemoteAccessAllowed() &&
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2555 !authenticationEnabled)
3501
27b53c61aa99 warning when authentication is automatically enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3500
diff changeset
2556 {
3533
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2557 LOG(WARNING) << "====> Remote access is enabled while user authentication is explicitly disabled, "
3534
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2558 << "your setup is POSSIBLY INSECURE <====";
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2559 context.SetHttpServerSecure(false);
3501
27b53c61aa99 warning when authentication is automatically enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3500
diff changeset
2560 }
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2561 }
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2562 else if (httpServer.IsRemoteAccessAllowed())
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2563 {
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2564 // Starting with Orthanc 1.5.8, it is impossible to enable
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2565 // remote access without having explicitly disabled user
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2566 // authentication.
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2567 LOG(WARNING) << "Remote access is allowed but \"AuthenticationEnabled\" is not in the configuration, "
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2568 << "automatically enabling HTTP authentication for security";
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2569 httpServer.SetAuthenticationEnabled(true);
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2570 }
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2571 else
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2572 {
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2573 // If Orthanc only listens on the localhost, it is OK to have
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2574 // "AuthenticationEnabled" disabled
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2575 httpServer.SetAuthenticationEnabled(false);
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2576 }
1310
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2577
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2578 bool hasUsers = lock.GetConfiguration().SetupRegisteredUsers(httpServer);
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2579
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2580 if (httpServer.IsAuthenticationEnabled() &&
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2581 !hasUsers)
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2582 {
3533
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2583 if (httpServer.IsRemoteAccessAllowed())
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2584 {
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2585 /**
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2586 * Starting with Orthanc 1.5.8, if no user is explicitly
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2587 * defined while remote access is allowed, we create a
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2588 * default user, and Orthanc Explorer shows a warning
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2589 * message about an "Insecure setup". This convention is
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2590 * used in Docker images "jodogne/orthanc",
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2591 * "jodogne/orthanc-plugins" and "osimis/orthanc".
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2592 **/
3534
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2593 LOG(WARNING) << "====> HTTP authentication is enabled, but no user is declared. "
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2594 << "Creating a default user: Review your configuration option \"RegisteredUsers\". "
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2595 << "Your setup is INSECURE <====";
3533
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2596
3534
cac8ffcb9cef forcing AuthenticationEnabled to false is considered as insecure if remote access is allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3533
diff changeset
2597 context.SetHttpServerSecure(false);
3533
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2598
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2599 // This is the username/password of the default user in Orthanc.
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2600 httpServer.RegisterUser("orthanc", "orthanc");
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2601 }
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2602 else
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2603 {
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2604 LOG(WARNING) << "HTTP authentication is enabled, but no user is declared, "
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2605 << "check the value of configuration option \"RegisteredUsers\"";
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2606 }
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3526
diff changeset
2607 }
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2608
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2609 if (lock.GetConfiguration().GetBooleanParameter("SslEnabled", false))
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2610 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2611 std::string certificate = lock.GetConfiguration().InterpretStringParameterAsPath(
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2612 lock.GetConfiguration().GetStringParameter("SslCertificate", "certificate.pem"));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2613 httpServer.SetSslEnabled(true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2614 httpServer.SetSslCertificate(certificate.c_str());
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2615 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2616 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2617 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2618 httpServer.SetSslEnabled(false);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2619 }
3535
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2620
4190
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2621 if (lock.GetConfiguration().GetBooleanParameter("SslVerifyPeers", false))
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2622 {
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2623 std::string trustedClientCertificates = lock.GetConfiguration().InterpretStringParameterAsPath(
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2624 lock.GetConfiguration().GetStringParameter("SslTrustedClientCertificates", "trustedCertificates.pem"));
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2625 httpServer.SetSslVerifyPeers(true);
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2626 httpServer.SetSslTrustedClientCertificates(trustedClientCertificates.c_str());
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2627 }
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2628 else
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2629 {
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2630 httpServer.SetSslVerifyPeers(false);
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2631 }
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2632
3535
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2633 if (lock.GetConfiguration().GetBooleanParameter("ExecuteLuaEnabled", false))
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2634 {
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2635 context.SetExecuteLuaEnabled(true);
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2636 LOG(WARNING) << "====> Remote LUA script execution is enabled. Review your configuration option \"ExecuteLuaEnabled\". "
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2637 << "Your setup is POSSIBLY INSECURE <====";
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2638 }
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2639 else
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2640 {
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2641 context.SetExecuteLuaEnabled(false);
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2642 LOG(WARNING) << "Remote LUA script execution is disabled";
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2643 }
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2644 }
1949
d90f737f2dde warn about the use of privileged ports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
2645
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2646 MyHttpExceptionFormatter exceptionFormatter(httpDescribeErrors, plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2647
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2648 httpServer.SetIncomingHttpRequestFilter(httpFilter);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2649 httpServer.SetHttpExceptionFormatter(exceptionFormatter);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2650 httpServer.Register(context.GetHttpHandler());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2651
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2652 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
2653 UriComponents root; // TODO
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
2654 root.push_back("a");
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
2655 root.push_back("b");
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2656 //httpServer.Register(root, new WebDavStorage(true));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2657 //httpServer.Register(root, new DummyBucket(context, true));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2658 httpServer.Register(root, new DummyBucket2(context));
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2659 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2660
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2661 if (httpServer.GetPortNumber() < 1024)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2662 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2663 LOG(WARNING) << "The HTTP port is privileged ("
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2664 << httpServer.GetPortNumber() << " is below 1024), "
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2665 << "make sure you run Orthanc as root/administrator";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2666 }
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2667
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2668 httpServer.Start();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2669
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2670 bool restart = WaitForExit(context, restApi);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2671
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2672 httpServer.Stop();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2673 LOG(WARNING) << " HTTP server has stopped";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2674
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2675 return restart;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2676 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2677 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2678
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2679
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2680 static bool StartDicomServer(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2681 const OrthancRestApi& restApi,
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2682 OrthancPlugins* plugins)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2683 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2684 bool dicomServerEnabled;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2685
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2686 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2687 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2688 dicomServerEnabled = lock.GetConfiguration().GetBooleanParameter("DicomServerEnabled", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2689 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2690
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2691 if (!dicomServerEnabled)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2692 {
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2693 LOG(WARNING) << "The DICOM server is disabled";
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2694 return StartHttpServer(context, restApi, plugins);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2695 }
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2696 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2697 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2698 MyDicomServerFactory serverFactory(context);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2699 OrthancApplicationEntityFilter dicomFilter(context);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2700 ModalitiesFromConfiguration modalities;
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
2701
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2702 // Setup the DICOM server
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2703 DicomServer dicomServer;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2704 dicomServer.SetRemoteModalities(modalities);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2705 dicomServer.SetStoreRequestHandlerFactory(serverFactory);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2706 dicomServer.SetMoveRequestHandlerFactory(serverFactory);
3918
dba48c162b7b C-Get SCP always enabled; no more server config
Alain Mazy <alain@mazy.be>
parents: 3867
diff changeset
2707 dicomServer.SetGetRequestHandlerFactory(serverFactory);
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2708 dicomServer.SetFindRequestHandlerFactory(serverFactory);
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
2709 dicomServer.SetStorageCommitmentRequestHandlerFactory(serverFactory);
2069
fabf7820d1f1 New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2018
diff changeset
2710
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2711 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2712 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2713 dicomServer.SetCalledApplicationEntityTitleCheck(lock.GetConfiguration().GetBooleanParameter("DicomCheckCalledAet", false));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2714 dicomServer.SetAssociationTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("DicomScpTimeout", 30));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2715 dicomServer.SetPortNumber(lock.GetConfiguration().GetUnsignedIntegerParameter("DicomPort", 4242));
4143
1ec3e1e18f50 Add missing tag "Retrieve AE Title (0008,0054)" in C-FIND SCP responses
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4047
diff changeset
2716 dicomServer.SetApplicationEntityTitle(lock.GetConfiguration().GetOrthancAET());
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2717 }
1786
164d78911382 primitives to handle dicom worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
2718
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2719 #if ORTHANC_ENABLE_PLUGINS == 1
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2720 if (plugins != NULL)
1995
f0acfa753973 New callback to handle non-worklists C-Find requests: OrthancPluginRegisterCFindCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1987
diff changeset
2721 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2722 if (plugins->HasWorklistHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2723 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2724 dicomServer.SetWorklistRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2725 }
1999
364cc624eb65 New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1995
diff changeset
2726
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2727 if (plugins->HasFindHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2728 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2729 dicomServer.SetFindRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2730 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2731
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2732 if (plugins->HasMoveHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2733 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2734 dicomServer.SetMoveRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2735 }
1999
364cc624eb65 New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1995
diff changeset
2736 }
1800
30e97a1f4093 callback for handling worklists with plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1799
diff changeset
2737 #endif
1786
164d78911382 primitives to handle dicom worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
2738
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2739 dicomServer.SetApplicationEntityFilter(dicomFilter);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2740
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2741 if (dicomServer.GetPortNumber() < 1024)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2742 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2743 LOG(WARNING) << "The DICOM port is privileged ("
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2744 << dicomServer.GetPortNumber() << " is below 1024), "
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2745 << "make sure you run Orthanc as root/administrator";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2746 }
1949
d90f737f2dde warn about the use of privileged ports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
2747
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2748 dicomServer.Start();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2749 LOG(WARNING) << "DICOM server listening with AET " << dicomServer.GetApplicationEntityTitle()
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2750 << " on port: " << dicomServer.GetPortNumber();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2751
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2752 bool restart = false;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2753 ErrorCode error = ErrorCode_Success;
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2754
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2755 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2756 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2757 restart = StartHttpServer(context, restApi, plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2758 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2759 catch (OrthancException& e)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2760 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2761 error = e.GetErrorCode();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2762 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2763
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2764 dicomServer.Stop();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2765 LOG(WARNING) << " DICOM server has stopped";
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2766
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2767 serverFactory.Done();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2768
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2769 if (error != ErrorCode_Success)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2770 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2771 throw OrthancException(error);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2772 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2773
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2774 return restart;
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2775 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2776 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2777
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2778
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2779 static bool ConfigureHttpHandler(ServerContext& context,
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2780 OrthancPlugins *plugins,
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2781 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2782 {
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2783 #if ORTHANC_ENABLE_PLUGINS == 1
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2784 // By order of priority, first apply the "plugins" layer, so that
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2785 // plugins can overwrite the built-in REST API of Orthanc
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2786 if (plugins)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2787 {
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2788 assert(context.HasPlugins());
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2789 context.GetHttpHandler().Register(*plugins, false);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2790 }
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1630
diff changeset
2791 #endif
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
2792
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2793 // Secondly, apply the "static resources" layer
1443
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2794 #if ORTHANC_STANDALONE == 1
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
2795 EmbeddedResourceHttpHandler staticResources("/app", ServerResources::ORTHANC_EXPLORER);
1443
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2796 #else
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2797 FilesystemHttpHandler staticResources("/app", ORTHANC_PATH "/OrthancExplorer");
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2798 #endif
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2799
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2800 context.GetHttpHandler().Register(staticResources, false);
1135
67c3c1e4a6e0 index-only mode, and custom storage area with plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1134
diff changeset
2801
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2802 // Thirdly, consider the built-in REST API of Orthanc
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2803 OrthancRestApi restApi(context);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2804 context.GetHttpHandler().Register(restApi, true);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2805
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2806 context.SetupJobsEngine(false /* not running unit tests */, loadJobsFromDatabase);
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2807
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2808 bool restart = StartDicomServer(context, restApi, plugins);
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2809
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2810 context.Stop();
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2811
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2812 return restart;
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2813 }
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2814
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2815
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2816 static void UpgradeDatabase(IDatabaseWrapper& database,
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2817 IStorageArea& storageArea)
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2818 {
1668
de1413733c97 reconstructing main dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1666
diff changeset
2819 // Upgrade the schema of the database, if needed
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2820 unsigned int currentVersion = database.GetDatabaseVersion();
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2821
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2822 LOG(WARNING) << "Starting the upgrade of the database schema";
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2823 LOG(WARNING) << "Current database version: " << currentVersion;
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2824 LOG(WARNING) << "Database version expected by Orthanc: " << ORTHANC_DATABASE_VERSION;
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2825
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2826 if (currentVersion == ORTHANC_DATABASE_VERSION)
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2827 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2828 LOG(WARNING) << "No upgrade is needed, start Orthanc without the \"--upgrade\" argument";
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2829 return;
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2830 }
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2831
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2832 if (currentVersion > ORTHANC_DATABASE_VERSION)
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2833 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2834 throw OrthancException(ErrorCode_IncompatibleDatabaseVersion,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2835 "The version of the database schema (" +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2836 boost::lexical_cast<std::string>(currentVersion) +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2837 ") is too recent for this version of Orthanc. Please upgrade Orthanc.");
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2838 }
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2839
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2840 LOG(WARNING) << "Upgrading the database from schema version "
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2841 << currentVersion << " to " << ORTHANC_DATABASE_VERSION;
1869
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2842
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2843 try
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2844 {
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2845 database.Upgrade(ORTHANC_DATABASE_VERSION, storageArea);
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2846 }
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2847 catch (OrthancException&)
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2848 {
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2849 LOG(ERROR) << "Unable to run the automated upgrade, please use the replication instructions: "
3135
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3126
diff changeset
2850 << "http://book.orthanc-server.com/users/replication.html";
1869
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2851 throw;
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2852 }
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2853
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2854 // Sanity check
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2855 currentVersion = database.GetDatabaseVersion();
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2856 if (ORTHANC_DATABASE_VERSION != currentVersion)
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2857 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2858 throw OrthancException(ErrorCode_IncompatibleDatabaseVersion,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2859 "The database schema was not properly upgraded, it is still at version " +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2860 boost::lexical_cast<std::string>(currentVersion));
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2861 }
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2862 else
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2863 {
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2864 LOG(WARNING) << "The database schema was successfully upgraded, "
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2865 << "you can now start Orthanc without the \"--upgrade\" argument";
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2866 }
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2867 }
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2868
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2869
2941
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2870
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2871 namespace
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2872 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2873 class ServerContextConfigurator : public boost::noncopyable
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2874 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2875 private:
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2876 ServerContext& context_;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2877 OrthancPlugins* plugins_;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2878
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2879 public:
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2880 ServerContextConfigurator(ServerContext& context,
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2881 OrthancPlugins* plugins) :
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2882 context_(context),
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2883 plugins_(plugins)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2884 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2885 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2886 OrthancConfiguration::WriterLock lock;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2887 lock.GetConfiguration().SetServerIndex(context.GetIndex());
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2888 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2889
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2890 #if ORTHANC_ENABLE_PLUGINS == 1
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2891 if (plugins_ != NULL)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2892 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2893 plugins_->SetServerContext(context_);
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2894 context_.SetPlugins(*plugins_);
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2895 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2896 #endif
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2897 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2898
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2899 ~ServerContextConfigurator()
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2900 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2901 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2902 OrthancConfiguration::WriterLock lock;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2903 lock.GetConfiguration().ResetServerIndex();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2904 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2905
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2906 #if ORTHANC_ENABLE_PLUGINS == 1
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2907 if (plugins_ != NULL)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2908 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2909 plugins_->ResetServerContext();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2910 context_.ResetPlugins();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2911 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2912 #endif
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2913 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2914 };
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2915 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2916
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2917
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2918 static bool ConfigureServerContext(IDatabaseWrapper& database,
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2919 IStorageArea& storageArea,
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2920 OrthancPlugins *plugins,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2921 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2922 {
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2923 size_t maxCompletedJobs;
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2924
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2925 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2926 OrthancConfiguration::ReaderLock lock;
2069
fabf7820d1f1 New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2018
diff changeset
2927
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2928 // These configuration options must be set before creating the
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2929 // ServerContext, otherwise the possible Lua scripts will not be
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2930 // able to properly issue HTTP/HTTPS queries
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2931 HttpClient::ConfigureSsl(lock.GetConfiguration().GetBooleanParameter("HttpsVerifyPeers", true),
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2932 lock.GetConfiguration().InterpretStringParameterAsPath
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2933 (lock.GetConfiguration().GetStringParameter("HttpsCACertificates", "")));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2934 HttpClient::SetDefaultVerbose(lock.GetConfiguration().GetBooleanParameter("HttpVerbose", false));
3428
6add197274b1 default value of HttpTimeout is now 60 seconds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3404
diff changeset
2935
6add197274b1 default value of HttpTimeout is now 60 seconds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3404
diff changeset
2936 // The value "0" below makes the class HttpClient use its default
6add197274b1 default value of HttpTimeout is now 60 seconds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3404
diff changeset
2937 // value (DEFAULT_HTTP_TIMEOUT = 60 seconds in Orthanc 1.5.7)
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2938 HttpClient::SetDefaultTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpTimeout", 0));
3428
6add197274b1 default value of HttpTimeout is now 60 seconds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3404
diff changeset
2939
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2940 HttpClient::SetDefaultProxy(lock.GetConfiguration().GetStringParameter("HttpProxy", ""));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2941
3865
ff0718a4633a fix missing DicomAssociationParameters::SetDefaultTimeout()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3852
diff changeset
2942 DicomAssociationParameters::SetDefaultTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("DicomScuTimeout", 10));
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2943
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2944 maxCompletedJobs = lock.GetConfiguration().GetUnsignedIntegerParameter("JobsHistorySize", 10);
3164
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2945
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2946 if (maxCompletedJobs == 0)
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2947 {
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2948 LOG(WARNING) << "Setting option \"JobsHistorySize\" to zero is not recommended";
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2949 }
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2950 }
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2951
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2952 ServerContext context(database, storageArea, false /* not running unit tests */, maxCompletedJobs);
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2953
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2954 {
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2955 OrthancConfiguration::ReaderLock lock;
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2956
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2957 context.SetCompressionEnabled(lock.GetConfiguration().GetBooleanParameter("StorageCompression", false));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2958 context.SetStoreMD5ForAttachments(lock.GetConfiguration().GetBooleanParameter("StoreMD5ForAttachments", true));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2959
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2960 // New option in Orthanc 1.4.2
3813
aaaa442bfe39 moving SetOverwriteInstances from ServerIndex to ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3801
diff changeset
2961 context.SetOverwriteInstances(lock.GetConfiguration().GetBooleanParameter("OverwriteInstances", false));
2069
fabf7820d1f1 New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2018
diff changeset
2962
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2963 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2964 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2965 context.GetIndex().SetMaximumPatientCount(lock.GetConfiguration().GetUnsignedIntegerParameter("MaximumPatientCount", 0));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2966 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2967 catch (...)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2968 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2969 context.GetIndex().SetMaximumPatientCount(0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2970 }
2825
8aa6aef11b70 New configuration option "OverwriteInstances" to choose how duplicate SOPInstanceUID are handled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2815
diff changeset
2971
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2972 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2973 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2974 uint64_t size = lock.GetConfiguration().GetUnsignedIntegerParameter("MaximumStorageSize", 0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2975 context.GetIndex().SetMaximumStorageSize(size * 1024 * 1024);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2976 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2977 catch (...)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2978 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2979 context.GetIndex().SetMaximumStorageSize(0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2980 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2981 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2982
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2983 {
2941
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2984 ServerContextConfigurator configurator(context, plugins);
2946
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2985
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2986 {
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2987 OrthancConfiguration::WriterLock lock;
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2988 lock.GetConfiguration().LoadModalitiesAndPeers();
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2989 }
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2990
2941
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2991 return ConfigureHttpHandler(context, plugins, loadJobsFromDatabase);
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2992 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2993 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2994
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2995
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2996 static bool ConfigureDatabase(IDatabaseWrapper& database,
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2997 IStorageArea& storageArea,
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2998 OrthancPlugins *plugins,
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2999 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3000 bool loadJobsFromDatabase)
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3001 {
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3002 database.Open();
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3003
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3004 unsigned int currentVersion = database.GetDatabaseVersion();
2699
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2633
diff changeset
3005
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3006 if (upgradeDatabase)
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3007 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3008 UpgradeDatabase(database, storageArea);
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3009 return false; // Stop and don't restart Orthanc (cf. issue 29)
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3010 }
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3011 else if (currentVersion != ORTHANC_DATABASE_VERSION)
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3012 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
3013 throw OrthancException(ErrorCode_IncompatibleDatabaseVersion,
3018
e3b5c07146a3 speeding up the computation of the size of the attachments in SQLite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3014 "The database schema must be upgraded from version " +
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
3015 boost::lexical_cast<std::string>(currentVersion) + " to " +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
3016 boost::lexical_cast<std::string>(ORTHANC_DATABASE_VERSION) +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
3017 ": Please run Orthanc with the \"--upgrade\" argument");
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3018 }
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3019
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3020 bool success = ConfigureServerContext
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3021 (database, storageArea, plugins, loadJobsFromDatabase);
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3022
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3023 database.Close();
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3024
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3025 return success;
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3026 }
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3027
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
3028
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3029 static bool ConfigurePlugins(int argc,
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3030 char* argv[],
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3031 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3032 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3033 {
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3643
diff changeset
3034 std::unique_ptr<IDatabaseWrapper> databasePtr;
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3643
diff changeset
3035 std::unique_ptr<IStorageArea> storage;
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3036
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
3037 #if ORTHANC_ENABLE_PLUGINS == 1
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3038 OrthancPlugins plugins;
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3039 plugins.SetCommandLineArguments(argc, argv);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3040 LoadPlugins(plugins);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3041
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3042 IDatabaseWrapper* database = NULL;
1630
ffd23c0104af "/system" URI gives information about the plugins used for storage area and DB back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1615
diff changeset
3043 if (plugins.HasDatabaseBackend())
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3044 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3045 LOG(WARNING) << "Using a custom database from plugins";
1630
ffd23c0104af "/system" URI gives information about the plugins used for storage area and DB back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1615
diff changeset
3046 database = &plugins.GetDatabaseBackend();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3047 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3048 else
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3049 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
3050 databasePtr.reset(CreateDatabaseWrapper());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3051 database = databasePtr.get();
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3052 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3053
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3054 if (plugins.HasStorageArea())
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3055 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3056 LOG(WARNING) << "Using a custom storage area from plugins";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3057 storage.reset(plugins.CreateStorageArea());
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3058 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3059 else
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3060 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
3061 storage.reset(CreateStorageArea());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3062 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3063
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3064 assert(database != NULL);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3065 assert(storage.get() != NULL);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3066
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3067 return ConfigureDatabase(*database, *storage, &plugins,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3068 upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3069
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
3070 #elif ORTHANC_ENABLE_PLUGINS == 0
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3071 // The plugins are disabled
3048
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3072
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3073 databasePtr.reset(CreateDatabaseWrapper());
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3074 storage.reset(CreateStorageArea());
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3075
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3076 assert(databasePtr.get() != NULL);
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3077 assert(storage.get() != NULL);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3078
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3079 return ConfigureDatabase(*databasePtr, *storage, NULL,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3080 upgradeDatabase, loadJobsFromDatabase);
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
3081
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
3082 #else
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
3083 # error The macro ORTHANC_ENABLE_PLUGINS must be set to 0 or 1
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3084 #endif
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3085 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3086
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3087
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3088 static bool StartOrthanc(int argc,
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3089 char* argv[],
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3090 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3091 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3092 {
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3093 return ConfigurePlugins(argc, argv, upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3094 }
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3095
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
3096
2079
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3097 static bool DisplayPerformanceWarning()
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3098 {
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3099 (void) DisplayPerformanceWarning; // Disable warning about unused function
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3100 LOG(WARNING) << "Performance warning: Non-release build, runtime debug assertions are turned on";
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3101 return true;
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3102 }
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3103
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3104
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3105 int main(int argc, char* argv[])
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3106 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
3107 Logging::Initialize();
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3108
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3109 bool upgradeDatabase = false;
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3110 bool loadJobsFromDatabase = true;
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3111 const char* configurationFile = NULL;
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3112
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3113
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3114 /**
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3115 * Parse the command-line options.
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3116 **/
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3117
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3118 for (int i = 1; i < argc; i++)
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3119 {
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3120 std::string argument(argv[i]);
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3121
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3122 if (argument.empty())
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3123 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3124 // Ignore empty arguments
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3125 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3126 else if (argument[0] != '-')
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3127 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3128 if (configurationFile != NULL)
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3129 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3130 LOG(ERROR) << "More than one configuration path were provided on the command line, aborting";
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3131 return -1;
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3132 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3133 else
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3134 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3135 // Use the first argument that does not start with a "-" as
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3136 // the configuration file
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3137
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3138 // TODO WHAT IS THE ENCODING?
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3139 configurationFile = argv[i];
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3140 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3141 }
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3142 else if (argument == "--errors")
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3143 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3144 PrintErrors(argv[0]);
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3145 return 0;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3146 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3147 else if (argument == "--help")
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3148 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3149 PrintHelp(argv[0]);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3150 return 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3151 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3152 else if (argument == "--version")
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3153 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3154 PrintVersion(argv[0]);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3155 return 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3156 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3157 else if (argument == "--verbose")
137
0e97abc7b950 fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 136
diff changeset
3158 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
3159 Logging::EnableInfoLevel(true);
137
0e97abc7b950 fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 136
diff changeset
3160 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3161 else if (argument == "--trace")
137
0e97abc7b950 fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 136
diff changeset
3162 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
3163 Logging::EnableTraceLevel(true);
137
0e97abc7b950 fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 136
diff changeset
3164 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3165 else if (boost::starts_with(argument, "--logdir="))
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3166 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3167 // TODO WHAT IS THE ENCODING?
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3168 std::string directory = argument.substr(9);
1490
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3169
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3170 try
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3171 {
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3172 Logging::SetTargetFolder(directory);
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3173 }
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3174 catch (OrthancException&)
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3175 {
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3176 LOG(ERROR) << "The directory where to store the log files ("
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3177 << directory << ") is inexistent, aborting.";
1490
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3178 return -1;
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3179 }
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3180 }
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3181 else if (boost::starts_with(argument, "--logfile="))
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3182 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3183 // TODO WHAT IS THE ENCODING?
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3184 std::string file = argument.substr(10);
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3185
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3186 try
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3187 {
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3188 Logging::SetTargetFile(file);
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3189 }
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3190 catch (OrthancException&)
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3191 {
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3192 LOG(ERROR) << "Cannot write to the specified log file ("
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3193 << file << "), aborting.";
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3194 return -1;
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3195 }
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3196 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3197 else if (argument == "--upgrade")
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3198 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3199 upgradeDatabase = true;
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3200 }
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3201 else if (argument == "--no-jobs")
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3202 {
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3203 loadJobsFromDatabase = false;
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3204 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3205 else if (boost::starts_with(argument, "--config="))
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3206 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3207 // TODO WHAT IS THE ENCODING?
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3208 std::string configurationSample;
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
3209 GetFileResource(configurationSample, ServerResources::CONFIGURATION_SAMPLE);
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3210
684
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3211 #if defined(_WIN32)
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3212 // Replace UNIX newlines with DOS newlines
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3213 boost::replace_all(configurationSample, "\n", "\r\n");
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3214 #endif
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3215
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3216 std::string target = argument.substr(9);
2295
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3217
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3218 try
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3219 {
3526
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3220 if (target == "-")
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3221 {
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3222 // New in 1.5.8: Print to stdout
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3223 std::cout << configurationSample;
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3224 }
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3225 else
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3226 {
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3227 SystemToolbox::WriteFile(configurationSample, target);
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3228 }
2295
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3229 return 0;
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3230 }
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3231 catch (OrthancException&)
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3232 {
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3233 LOG(ERROR) << "Cannot write sample configuration as file \"" << target << "\"";
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3234 return -1;
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3235 }
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3236 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3237 else
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3238 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3239 LOG(WARNING) << "Option unsupported by the core of Orthanc: " << argument;
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3240 }
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3241 }
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3242
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3243
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3244 /**
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3245 * Launch Orthanc.
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3246 **/
1102
ce6386b37afd avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
3247
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3248 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3249 std::string version(ORTHANC_VERSION);
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3250
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3251 if (std::string(ORTHANC_VERSION) == "mainline")
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3252 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3253 try
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3254 {
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2136
diff changeset
3255 boost::filesystem::path exe(SystemToolbox::GetPathToExecutable());
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3256 std::time_t creation = boost::filesystem::last_write_time(exe);
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3257 boost::posix_time::ptime converted(boost::posix_time::from_time_t(creation));
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3258 version += " (" + boost::posix_time::to_iso_string(converted) + ")";
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3259 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3260 catch (...)
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3261 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3262 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3263 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3264
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3265 LOG(WARNING) << "Orthanc version: " << version;
2079
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
3266 assert(DisplayPerformanceWarning());
4009
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3267
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3268 std::string s = "Architecture: ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3269 if (sizeof(void*) == 4)
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3270 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3271 s += "32-bit, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3272 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3273 else if (sizeof(void*) == 8)
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3274 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3275 s += "64-bit, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3276 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3277 else
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3278 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3279 s += "unsupported pointer size, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3280 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3281
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3282 switch (Toolbox::DetectEndianness())
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3283 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3284 case Endianness_Little:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3285 s += "little endian";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3286 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3287
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3288 case Endianness_Big:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3289 s += "big endian";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3290 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3291
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3292 default:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3293 s += "unsupported endianness";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3294 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3295 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3296
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3297 LOG(INFO) << s;
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3298 }
1102
ce6386b37afd avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
3299
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3300 int status = 0;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3301 try
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3302 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3303 for (;;)
270
e6a4c4329481 parameters for storage capacity
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 236
diff changeset
3304 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3305 OrthancInitialize(configurationFile);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3306
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3307 bool restart = StartOrthanc(argc, argv, upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3308 if (restart)
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3309 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3310 OrthancFinalize();
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3311 LOG(WARNING) << "Logging system is resetting";
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3312 Logging::Reset();
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3313 }
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3314 else
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3315 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3316 break;
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3317 }
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3318 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3319 }
1245
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3320 catch (const OrthancException& e)
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3321 {
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3322 LOG(ERROR) << "Uncaught exception, stopping now: [" << e.What() << "] (code " << e.GetErrorCode() << ")";
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3323 #if defined(_WIN32)
1734
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3324 if (e.GetErrorCode() >= ErrorCode_START_PLUGINS)
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3325 {
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3326 status = static_cast<int>(ErrorCode_Plugin);
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3327 }
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3328 else
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3329 {
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3330 status = static_cast<int>(e.GetErrorCode());
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3331 }
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3332
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3333 #else
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3334 status = -1;
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3335 #endif
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3336 }
1245
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3337 catch (const std::exception& e)
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3338 {
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3339 LOG(ERROR) << "Uncaught exception, stopping now: [" << e.what() << "]";
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3340 status = -1;
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3341 }
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3342 catch (const std::string& s)
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3343 {
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3344 LOG(ERROR) << "Uncaught exception, stopping now: [" << s << "]";
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3345 status = -1;
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3346 }
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3347 catch (...)
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3348 {
1223
5bd4c9f85b4c fix race condition while unregistering plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1210
diff changeset
3349 LOG(ERROR) << "Native exception, stopping now. Check your plugins, if any.";
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3350 status = -1;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3351 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3352
690
2e67366aab83 case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
3353 LOG(WARNING) << "Orthanc has stopped";
2e67366aab83 case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
3354
4026
05a363186da6 ORTHANC_BUILDING_FRAMEWORK_LIBRARY, Orthanc::InitializeFramework()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4009
diff changeset
3355 OrthancFinalize();
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
3356
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3357 return status;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3358 }