annotate OrthancServer/Sources/main.cpp @ 4235:b3ec19f369d1

working on sorting by dates
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 08 Oct 2020 18:13:01 +0200
parents a38376b80cd1
children 5639ffda467b
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";
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
782 static const char* const BY_DATE = "by-date";
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";
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
784 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
785
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
786 class DummyBucket2 : public IWebDavBucket // TODO
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
787 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
788 private:
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
789 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
790
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
791
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
792 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
793 ServerContext& context,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
794 const std::string& publicId,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
795 MetadataType metadata)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
796 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
797 std::string value;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
798 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
799 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
800 try
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
801 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
802 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
803 return;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
804 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
805 catch (std::exception& e)
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 }
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
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
810 target = boost::posix_time::second_clock::universal_time(); // Now
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
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
813
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
814 class DicomIdentifiersVisitor : public ServerContext::ILookupVisitor
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
815 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
816 private:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
817 ServerContext& context_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
818 bool isComplete_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
819 Collection& target_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
820 ResourceType level_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
821
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
822 public:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
823 DicomIdentifiersVisitor(ServerContext& context,
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
824 Collection& target,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
825 ResourceType level) :
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
826 context_(context),
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
827 isComplete_(false),
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
828 target_(target),
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
829 level_(level)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
830 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
831 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
832
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
833 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
834 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
835 return false; // (*)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
836 }
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 virtual void MarkAsComplete() ORTHANC_OVERRIDE
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 isComplete_ = true; // TODO
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
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
843 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
844 const std::string& instanceId /* unused */,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
845 const DicomMap& mainDicomTags,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
846 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
847 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
848 DicomTag tag(0, 0);
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
849 MetadataType timeMetadata;
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
850
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
851 switch (level_)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
852 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
853 case ResourceType_Study:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
854 tag = DICOM_TAG_STUDY_INSTANCE_UID;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
855 timeMetadata = MetadataType_LastUpdate;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
856 break;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
857
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
858 case ResourceType_Series:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
859 tag = DICOM_TAG_SERIES_INSTANCE_UID;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
860 timeMetadata = MetadataType_LastUpdate;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
861 break;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
862
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
863 case ResourceType_Instance:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
864 tag = DICOM_TAG_SOP_INSTANCE_UID;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
865 timeMetadata = MetadataType_Instance_ReceptionDate;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
866 break;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
867
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
868 default:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
869 throw OrthancException(ErrorCode_InternalError);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
870 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
871
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
872 std::string s;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
873 if (mainDicomTags.LookupStringValue(s, tag, false) &&
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
874 !s.empty())
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
875 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
876 std::unique_ptr<Resource> resource;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
877
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
878 if (level_ == ResourceType_Instance)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
879 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
880 FileInfo info;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
881 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
882 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
883 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
884 f->SetMimeType(MimeType_Dicom);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
885 f->SetContentLength(info.GetUncompressedSize());
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
886 resource.reset(f.release());
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
887 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
888 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
889 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
890 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
891 resource.reset(new Folder(s));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
892 }
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
893
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
894 if (resource.get() != NULL)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
895 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
896 boost::posix_time::ptime t;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
897 LookupTime(t, context_, publicId, timeMetadata);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
898 resource->SetCreationTime(t);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
899 target_.AddResource(resource.release());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
900 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
901 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
902 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
903 };
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
904
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
905 class DicomFileVisitor : public ServerContext::ILookupVisitor
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
906 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
907 private:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
908 ServerContext& context_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
909 bool success_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
910 std::string& target_;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
911 boost::posix_time::ptime& time_;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
912
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
913 public:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
914 DicomFileVisitor(ServerContext& context,
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
915 std::string& target,
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
916 boost::posix_time::ptime& time) :
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
917 context_(context),
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
918 success_(false),
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
919 target_(target),
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
920 time_(time)
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
921 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
922 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
923
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
924 bool IsSuccess() const
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
925 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
926 return success_;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
927 }
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
928
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
929 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
930 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
931 return false; // (*)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
932 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
933
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
934 virtual void MarkAsComplete() ORTHANC_OVERRIDE
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 }
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 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
939 const std::string& instanceId /* unused */,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
940 const DicomMap& mainDicomTags,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
941 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
942 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
943 if (success_)
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 success_ = false; // Two matches => Error
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
946 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
947 else
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
948 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
949 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
950 context_.ReadDicom(target_, publicId);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
951 success_ = true;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
952 }
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 };
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
955
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
956 class OrthancJsonVisitor : public ServerContext::ILookupVisitor
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
957 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
958 private:
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
959 ServerContext& context_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
960 bool success_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
961 std::string& target_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
962 ResourceType level_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
963
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
964 public:
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
965 OrthancJsonVisitor(ServerContext& context,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
966 std::string& target,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
967 ResourceType level) :
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
968 context_(context),
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
969 success_(false),
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
970 target_(target),
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
971 level_(level)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
972 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
973 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
974
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
975 bool IsSuccess() const
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
976 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
977 return success_;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
978 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
979
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
980 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
981 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
982 return false; // (*)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
983 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
984
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
985 virtual void MarkAsComplete() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
986 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
987 }
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 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
990 const std::string& instanceId /* unused */,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
991 const DicomMap& mainDicomTags,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
992 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
993 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
994 Json::Value info;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
995 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
996 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
997 if (success_)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
998 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
999 success_ = false; // Two matches => Error
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1000 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1001 else
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1002 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1003 target_ = info.toStyledString();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1004
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1005 // 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
1006 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
1007
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1008 success_ = true;
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 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1011 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1012 };
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1013
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 void AddVirtualFile(Collection& collection,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1016 const UriComponents& path,
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1017 const std::string& filename)
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1018 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1019 MimeType mime;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1020 std::string content;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1021 boost::posix_time::ptime modification;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1022
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1023 UriComponents p = path;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1024 p.push_back(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 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
1027 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1028 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
1029 f->SetMimeType(mime);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1030 f->SetContentLength(content.size());
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1031 f->SetCreationTime(modification);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1032 collection.AddResource(f.release());
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1033 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1034 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1035
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1036
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1037
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1038
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1039 class ResourcesIndex : public boost::noncopyable
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1040 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1041 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1042 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
1043
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1044 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1045 ServerContext& context_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1046 ResourceType level_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1047 std::string template_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1048 Map pathToResource_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1049 Map resourceToPath_;
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 void CheckInvariants()
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1052 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1053 #ifndef NDEBUG
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1054 assert(pathToResource_.size() == resourceToPath_.size());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1055
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1056 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
1057 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1058 assert(resourceToPath_[it->second] == it->first);
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1061 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
1062 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1063 assert(pathToResource_[it->second] == it->first);
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 #endif
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 void AddTags(DicomMap& target,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1069 const std::string& resourceId,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1070 ResourceType tagsFromLevel)
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 DicomMap tags;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1073 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
1074 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1075 target.Merge(tags);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1076 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1077 }
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 void Register(const std::string& resourceId)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1080 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1081 // Don't register twice the same resource
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1082 if (resourceToPath_.find(resourceId) == resourceToPath_.end())
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 std::string name = template_;
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 DicomMap tags;
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 AddTags(tags, resourceId, level_);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1089
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1090 if (level_ == ResourceType_Study)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1091 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1092 AddTags(tags, resourceId, ResourceType_Patient);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1093 }
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 DicomArray arr(tags);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1096 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
1097 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1098 const DicomElement& element = arr.GetElement(i);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1099 if (!element.GetValue().IsNull() &&
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1100 !element.GetValue().IsBinary())
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 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
1103 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
1104 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1105 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1106
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1107 // Blank the tags that were not matched
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1108 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
1109 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
1110
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1111 // 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
1112 name = Toolbox::ConvertToAscii(name);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1113 boost::replace_all(name, "/", "");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1114 boost::replace_all(name, "\\", "");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1115
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1116 // 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
1117 static const boost::regex REGEX_TRIM_SPACES("{{.*?}}");
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1118 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
1119 name = Toolbox::StripSpaces(name);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1120
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1121 size_t count = 0;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1122 for (;;)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1123 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1124 std::string path = name;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1125 if (count > 0)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1126 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1127 path += " (" + boost::lexical_cast<std::string>(count) + ")";
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1128 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1129
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1130 if (pathToResource_.find(path) == pathToResource_.end())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1131 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1132 pathToResource_[path] = resourceId;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1133 resourceToPath_[resourceId] = path;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1134 return;
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 count++;
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1140 throw OrthancException(ErrorCode_InternalError);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1141 }
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 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1145 ResourcesIndex(ServerContext& context,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1146 ResourceType level,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1147 const std::string& templateString) :
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1148 context_(context),
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1149 level_(level),
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1150 template_(templateString)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1151 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1152 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1153
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1154 ResourceType GetLevel() const
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1155 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1156 return level_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1157 }
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 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
1160 const std::set<std::string>& resources)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1161 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1162 CheckInvariants();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1163
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1164 // 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
1165 removedPaths.clear();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1166 std::set<std::string> removedResources;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1167
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1168 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
1169 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1170 if (resources.find(it->first) == resources.end())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1171 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1172 const std::string& path = it->second;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1173
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1174 assert(pathToResource_.find(path) != pathToResource_.end());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1175 pathToResource_.erase(path);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1176 removedPaths.insert(path);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1177
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1178 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
1179 }
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1182 // Remove the missing resources
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1183 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
1184 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1185 assert(resourceToPath_.find(*it) != resourceToPath_.end());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1186 resourceToPath_.erase(*it);
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 CheckInvariants();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1190
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1191 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
1192 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1193 Register(*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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1199 const Map& GetPathToResource() const
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1200 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1201 return pathToResource_;
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 };
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 class INode : public boost::noncopyable
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 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1209 virtual ~INode()
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 virtual bool ListCollection(IWebDavBucket::Collection& target,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1214 const UriComponents& path) = 0;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1215
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1216 virtual bool GetFileContent(MimeType& mime,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1217 std::string& content,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1218 boost::posix_time::ptime& time,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1219 const UriComponents& path) = 0;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1220 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1221
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 class InstancesNode : public INode
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1224 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1225 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1226 ServerContext& context_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1227 std::string parentSeries_;
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 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1230 InstancesNode(ServerContext& context,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1231 const std::string& parentSeries) :
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1232 context_(context),
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1233 parentSeries_(parentSeries)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1234 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1235 }
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 virtual bool ListCollection(IWebDavBucket::Collection& target,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1238 const UriComponents& path) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1239 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1240 if (path.empty())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1241 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1242 std::list<std::string> resources;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1243 try
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 context_.GetIndex().GetChildren(resources, parentSeries_);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1246 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1247 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1248 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1249 // Unknown (or deleted) parent series
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1250 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1251 }
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 for (std::list<std::string>::const_iterator
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1254 it = resources.begin(); it != resources.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1255 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1256 boost::posix_time::ptime time;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1257 LookupTime(time, context_, *it, MetadataType_Instance_ReceptionDate);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1258
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1259 FileInfo info;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1260 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
1261 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1262 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
1263 resource->SetMimeType(MimeType_Dicom);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1264 resource->SetContentLength(info.GetUncompressedSize());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1265 resource->SetCreationTime(time);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1266 target.AddResource(resource.release());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1267 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1268 }
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 return true;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1271 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1272 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1273 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1274 return false;
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 virtual bool GetFileContent(MimeType& mime,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1279 std::string& content,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1280 boost::posix_time::ptime& time,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1281 const UriComponents& path) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1282 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1283 if (path.size() == 1 &&
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1284 boost::ends_with(path[0], ".dcm"))
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 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
1287
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1288 try
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1289 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1290 mime = MimeType_Dicom;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1291 context_.ReadDicom(content, instanceId);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1292 LookupTime(time, context_, instanceId, MetadataType_Instance_ReceptionDate);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1293 return true;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1294 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1295 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1296 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1297 // File was removed
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1298 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1299 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1300 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1301 else
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 return false;
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 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1306 };
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1310 class ResourcesNode : public INode
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1311 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1312 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1313 typedef std::map<std::string, INode*> Children;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1314
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1315 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1316 const Templates& templates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1317 std::unique_ptr<ResourcesIndex> index_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1318 MetadataType timeMetadata_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1319 Children children_; // Maps Orthanc resource IDs to subnodes
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1320
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1321 void Refresh()
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1322 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1323 std::list<std::string> resources;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1324 GetCurrentResources(resources);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1325
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1326 std::set<std::string> removedPaths;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1327 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
1328
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1329 // Remove the children that have been removed
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1330 for (std::set<std::string>::const_iterator
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1331 it = removedPaths.begin(); it != removedPaths.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1332 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1333 Children::iterator child = children_.find(*it);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1334 if (child != children_.end())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1335 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1336 assert(child->second != NULL);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1337 delete child->second;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1338 children_.erase(child);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1339 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1340 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1341 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1342
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1343 INode* GetChild(const std::string& path) // Don't free the resulting pointer!
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1344 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1345 ResourcesIndex::Map::const_iterator resource = index_->GetPathToResource().find(path);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1346 if (resource == index_->GetPathToResource().end())
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1347 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1348 return NULL;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1349 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1350 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1351 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1352 Children::iterator child = children_.find(resource->second);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1353 if (child != children_.end())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1354 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1355 assert(child->second != NULL);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1356 return child->second;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1357 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1358 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1359 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1360 INode* child = CreateChild(resource->second);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1361 if (child == NULL)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1362 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1363 return NULL;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1364 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1365 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1366 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1367 children_[resource->second] = child;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1368 return child;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1369 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1370 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1371 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1372 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1373
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1374 protected:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1375 ServerContext& GetContext() const
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1376 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1377 return context_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1378 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1379
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1380 virtual void GetCurrentResources(std::list<std::string>& resources) = 0;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1381
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1382 virtual INode* CreateChild(const std::string& resource) = 0;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1383
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1384 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1385 ResourcesNode(ServerContext& context,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1386 ResourceType level,
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1387 const Templates& templates) :
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1388 context_(context),
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1389 templates_(templates)
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1390 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1391 Templates::const_iterator t = templates.find(level);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1392 if (t == templates.end())
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1393 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1394 throw OrthancException(ErrorCode_ParameterOutOfRange);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1395 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1396
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1397 index_.reset(new ResourcesIndex(context, level, t->second));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1398
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1399 if (level == ResourceType_Instance)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1400 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1401 timeMetadata_ = MetadataType_Instance_ReceptionDate;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1402 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1403 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1404 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1405 timeMetadata_ = MetadataType_LastUpdate;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1406 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1407 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1408
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1409 virtual ~ResourcesNode()
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1410 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1411 for (Children::iterator it = children_.begin(); it != children_.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1412 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1413 assert(it->second != NULL);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1414 delete it->second;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1415 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1416 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1417
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1418 ResourceType GetLevel() const
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1419 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1420 return index_->GetLevel();
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1421 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1422
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1423 const Templates& GetTemplates() const
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1424 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1425 return templates_;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1426 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1427
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1428 virtual bool ListCollection(IWebDavBucket::Collection& target,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1429 const UriComponents& path) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1430 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1431 Refresh();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1432
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1433 if (index_->GetLevel() == ResourceType_Instance)
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1434 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1435 // Not a collection, no subfolders
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1436 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1437 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1438 else if (path.empty())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1439 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1440 const ResourcesIndex::Map& paths = index_->GetPathToResource();
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 for (ResourcesIndex::Map::const_iterator it = paths.begin(); it != paths.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1443 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1444 boost::posix_time::ptime time;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1445 LookupTime(time, context_, it->second, timeMetadata_);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1446
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1447 std::unique_ptr<IWebDavBucket::Resource> resource(new IWebDavBucket::Folder(it->first));
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1448 resource->SetCreationTime(time);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1449 target.AddResource(resource.release());
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1452 return true;
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 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1455 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1456 // Recursivity
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1457 INode* child = GetChild(path[0]);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1458 if (child == NULL)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1459 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1460 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1461 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1462 else
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 UriComponents subpath(path.begin() + 1, path.end());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1465 return child->ListCollection(target, subpath);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1466 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1467 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1468 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1469
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1470 virtual bool GetFileContent(MimeType& mime,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1471 std::string& content,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1472 boost::posix_time::ptime& time,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1473 const UriComponents& path) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1474 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1475 Refresh();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1476
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1477 if (path.empty())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1478 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1479 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1480 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1481 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1482 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1483 // Recursivity
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1484 INode* child = GetChild(path[0]);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1485 if (child == NULL)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1486 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1487 return false;
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 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1490 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1491 UriComponents subpath(path.begin() + 1, path.end());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1492 return child->GetFileContent(mime, content, time, subpath);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1493 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1494 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1495 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1496 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1497
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1498
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1499
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1500 class ResourceChildrenNode : public ResourcesNode
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1501 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1502 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1503 std::string parentId_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1504
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1505 protected:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1506 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
1507 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1508 try
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1509 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1510 GetContext().GetIndex().GetChildren(resources, parentId_);
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 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1513 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1514 // Unknown parent resource
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1515 resources.clear();
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1516 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1517 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1518
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1519 virtual INode* CreateChild(const std::string& resource) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1520 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1521 if (GetLevel() == ResourceType_Instance)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1522 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1523 return NULL;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1524 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1525 else if (GetLevel() == ResourceType_Series)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1526 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1527 return new InstancesNode(GetContext(), resource);
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 else
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 ResourceType l = GetChildResourceType(GetLevel());
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1532 return new ResourceChildrenNode(GetContext(), l, resource, GetTemplates());
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1533 }
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 public:
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1537 ResourceChildrenNode(ServerContext& context,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1538 ResourceType level,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1539 const std::string& parentId,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1540 const Templates& templates) :
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1541 ResourcesNode(context, level, templates),
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1542 parentId_(parentId)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1543 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1544 }
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1548 class RootNode : public ResourcesNode
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1549 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1550 protected:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1551 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
1552 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1553 GetContext().GetIndex().GetAllUuids(resources, GetLevel());
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1556 virtual INode* CreateChild(const std::string& resource) 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 if (GetLevel() == ResourceType_Series)
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 return new InstancesNode(GetContext(), resource);
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 else
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 ResourceType l = GetChildResourceType(GetLevel());
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1565 return new ResourceChildrenNode(GetContext(), l, resource, GetTemplates());
4234
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1569 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1570 RootNode(ServerContext& context,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1571 ResourceType level,
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1572 const Templates& templates) :
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1573 ResourcesNode(context, level, templates)
4234
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 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1576 };
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1577
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1578
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1579
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1580 class NodeWithChildren : public INode
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1581 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1582 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1583 typedef std::map<std::string, INode*> Children;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1584
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1585 Children children_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1586
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1587 INode* GetChild(const std::string& path) // Don't delete the result pointer!
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1588 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1589 Children::const_iterator found = children_.find(path);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1590 if (found == children_.end())
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1591 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1592 INode* child = CreateChild(path);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1593
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1594 if (child == NULL)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1595 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1596 return NULL;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1597 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1598 else
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1599 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1600 children_[path] = child;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1601 return child;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1602 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1603 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1604 else
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1605 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1606 assert(found->second != NULL);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1607 return found->second;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1608 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1609 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1610
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1611 protected:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1612 virtual void ListContent(IWebDavBucket::Collection& target) = 0;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1613
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1614 virtual INode* CreateChild(const std::string& path) = 0;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1615
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1616 public:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1617 virtual ~NodeWithChildren()
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1618 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1619 for (Children::iterator it = children_.begin(); it != children_.end(); ++it)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1620 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1621 assert(it->second != NULL);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1622 delete it->second;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1623 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1624 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1625
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1626 virtual bool ListCollection(IWebDavBucket::Collection& target,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1627 const UriComponents& path) ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1628 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1629 if (path.empty())
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1630 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1631 ListContent(target);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1632 return true;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1633 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1634 else
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1635 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1636 INode* child = GetChild(path[0]);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1637 if (child == NULL)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1638 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1639 return false;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1640 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1641 else
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1642 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1643 UriComponents subpath(path.begin() + 1, path.end());
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1644 return child->ListCollection(target, subpath);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1645 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1646 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1647 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1648
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1649 virtual bool GetFileContent(MimeType& mime,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1650 std::string& content,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1651 boost::posix_time::ptime& time,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1652 const UriComponents& path) ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1653 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1654 if (path.empty())
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1655 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1656 return false;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1657 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1658 else
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1659 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1660 INode* child = GetChild(path[0]);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1661 if (child == NULL)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1662 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1663 return false;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1664 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1665 else
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1666 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1667 UriComponents subpath(path.begin() + 1, path.end());
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1668 return child->GetFileContent(mime, content, time, subpath);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1669 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1670 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1671 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1672 };
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1673
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1674
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1675 class StudyMonthsNode : public NodeWithChildren
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1676 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1677 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1678 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1679 std::string year_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1680 const Templates& templates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1681
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1682 class Visitor : public ServerContext::ILookupVisitor
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1683 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1684 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1685 std::set<std::string> months_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1686
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1687 public:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1688 Visitor()
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1689 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1690 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1691
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1692 const std::set<std::string>& GetMonths() const
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1693 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1694 return months_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1695 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1696
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1697 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1698 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1699 return false; // (*)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1700 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1701
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1702 virtual void MarkAsComplete() ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1703 {
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
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1706 virtual void Visit(const std::string& publicId,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1707 const std::string& instanceId /* unused */,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1708 const DicomMap& mainDicomTags,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1709 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1710 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1711 std::string s;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1712 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
1713 s.size() == 8)
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 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
1716 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1717 }
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 protected:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1721 virtual void ListContent(IWebDavBucket::Collection& target)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1722 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1723 DatabaseLookup query;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1724 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
1725 true /* case sensitive */, true /* mandatory tag */);
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 Visitor visitor;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1728 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
1729
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1730 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
1731 it != visitor.GetMonths().end(); ++it)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1732 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1733 target.AddResource(new IWebDavBucket::Folder(year_ + "-" + *it));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1734 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1735 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1736
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1737 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
1738 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1739 return NULL;
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 public:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1743 StudyMonthsNode(ServerContext& context,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1744 const std::string& year,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1745 const Templates& templates) :
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1746 context_(context),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1747 year_(year),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1748 templates_(templates)
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 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1751 };
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1752
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 class StudyYearsNode : public NodeWithChildren
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1755 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1756 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1757 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1758 const Templates& templates_;
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 protected:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1761 virtual void ListContent(IWebDavBucket::Collection& target)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1762 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1763 std::list<std::string> resources;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1764 context_.GetIndex().GetAllUuids(resources, ResourceType_Study);
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 std::set<std::string> years;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1767
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1768 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
1769 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1770 DicomMap tags;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1771 std::string studyDate;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1772 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
1773 tags.LookupStringValue(studyDate, DICOM_TAG_STUDY_DATE, false) &&
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1774 studyDate.size() == 8)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1775 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1776 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
1777 }
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 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
1781 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1782 target.AddResource(new IWebDavBucket::Folder(*it));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1783 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1784 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1785
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1786 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
1787 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1788 return new StudyMonthsNode(context_, path, templates_);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1789 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1790
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1791 public:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1792 StudyYearsNode(ServerContext& context,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1793 const Templates& templates) :
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1794 context_(context),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1795 templates_(templates)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1796 {
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 };
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1799
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1800
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1801 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1802 std::unique_ptr<INode> patients_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1803 std::unique_ptr<INode> studies_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1804 std::unique_ptr<INode> dates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1805 Templates patientsTemplates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1806 Templates studiesTemplates_;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1807
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1808
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1809 public:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1810 DummyBucket2(ServerContext& context) :
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1811 context_(context)
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1812 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1813 patientsTemplates_[ResourceType_Patient] = "{{PatientID}} - {{PatientName}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1814 patientsTemplates_[ResourceType_Study] = "{{StudyDate}} - {{StudyDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1815 patientsTemplates_[ResourceType_Series] = "{{Modality}} - {{SeriesDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1816
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1817 studiesTemplates_[ResourceType_Study] = "{{PatientID}} - {{PatientName}} - {{StudyDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1818 studiesTemplates_[ResourceType_Series] = patientsTemplates_[ResourceType_Series];
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1819
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1820 patients_.reset(new RootNode(context, ResourceType_Patient, patientsTemplates_));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1821 studies_.reset(new RootNode(context, ResourceType_Study, studiesTemplates_));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1822 dates_.reset(new StudyYearsNode(context, studiesTemplates_));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1823 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1824
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1825 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
1826 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1827 if (path.empty())
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1828 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1829 return true;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1830 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1831 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
1832 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1833 return (path.size() <= 3 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1834 (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
1835 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1836 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1837 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1838 IWebDavBucket::Collection tmp;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1839 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
1840 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1841 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1842 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1843 IWebDavBucket::Collection tmp;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1844 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
1845 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1846 else if (path[0] == BY_DATE)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1847 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1848 IWebDavBucket::Collection tmp;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1849 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
1850 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1851 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1852 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1853 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1854 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1855 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1856
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1857 virtual bool ListCollection(Collection& collection,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1858 const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1859 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1860 if (path.empty())
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1861 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1862 collection.AddResource(new Folder(BY_DATE));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1863 collection.AddResource(new Folder(BY_PATIENTS));
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1864 collection.AddResource(new Folder(BY_STUDIES));
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1865 collection.AddResource(new Folder(BY_UIDS));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1866 return true;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1867 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1868 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
1869 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1870 DatabaseLookup query;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1871 ResourceType level;
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1872 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
1873
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1874 if (path.size() == 1)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1875 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1876 level = ResourceType_Study;
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1877 limit = 100; // TODO
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1878 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1879 else if (path.size() == 2)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1880 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1881 AddVirtualFile(collection, path, "study.json");
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1882
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1883 level = ResourceType_Series;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1884 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
1885 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1886 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1887 else if (path.size() == 3)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1888 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1889 AddVirtualFile(collection, path, "series.json");
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1890
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1891 level = ResourceType_Instance;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1892 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
1893 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1894 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
1895 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1896 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1897 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1898 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1899 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1900 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1901
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1902 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
1903 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
1904
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1905 return true;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1906 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1907 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1908 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1909 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
1910 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1911 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1912 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1913 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
1914 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1915 else if (path[0] == BY_DATE)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1916 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1917 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
1918 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1919 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1920 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1921 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1922 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1923 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1924
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1925 virtual bool GetFileContent(MimeType& mime,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1926 std::string& content,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1927 boost::posix_time::ptime& modificationTime,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1928 const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1929 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1930 if (path.empty())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1931 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1932 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1933 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1934 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
1935 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1936 if (path.size() == 3 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1937 path[2] == "study.json")
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1938 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1939 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1940 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
1941 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
1942
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1943 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
1944 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
1945
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1946 mime = MimeType_Json;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1947 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1948 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1949 else if (path.size() == 4 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1950 path[3] == "series.json")
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1951 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1952 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1953 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
1954 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
1955 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
1956 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1957
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1958 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
1959 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
1960
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1961 mime = MimeType_Json;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1962 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1963 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1964 else if (path.size() == 4 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1965 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
1966 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1967 std::string sopInstanceUid = path[3];
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1968 sopInstanceUid.resize(sopInstanceUid.size() - 4);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1969
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1970 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1971 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
1972 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
1973 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
1974 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
1975 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
1976 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
1977
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1978 DicomFileVisitor visitor(context_, content, modificationTime);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1979 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
1980
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1981 mime = MimeType_Dicom;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1982 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1983 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1984 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1985 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1986 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1987 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
1988 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1989 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1990 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1991 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
1992 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1993 else if (path[0] == BY_DATE)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1994 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1995 return dates_->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
1996 }
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1997
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1998 return false;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1999 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2000
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2001
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2002 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
2003 const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2004 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2005 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2006 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2007
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2008
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2009 virtual bool CreateFolder(const UriComponents& path)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2010 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2011 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2012 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2013
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2014 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
2015 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2016 LOG(WARNING) << "DELETE: " << Toolbox::FlattenUri(path);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2017 return false; // read-only
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2018 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2019
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2020 virtual void Start() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2021 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2022 }
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 virtual void Stop() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2025 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2026 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2027 };
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2028
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2029
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2030
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2031 static void PrintHelp(const char* path)
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2032 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2033 std::cout
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2034 << "Usage: " << path << " [OPTION]... [CONFIGURATION]" << std::endl
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
2035 << "Orthanc, lightweight, RESTful DICOM server for healthcare and medical research." << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2036 << std::endl
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2037 << "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
2038 << "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
2039 << "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
2040 << "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
2041 << "instructions about how to use Orthanc <http://www.orthanc-server.com/>." << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2042 << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2043 << "Command-line options:" << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2044 << " --help\t\tdisplay this help and exit" << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2045 << " --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
2046 << "\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
2047 << " --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
2048 << "\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
2049 << " --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
2050 << "\t\t\t(if file is \"-\", dumps to stdout)" << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2051 << " --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
2052 << " --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
2053 << " --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
2054 << " --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
2055 << "\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
2056 << "\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
2057 << " --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
2058 << "\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
2059 << " --version\t\toutput version information and exit" << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2060 << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2061 << "Exit status:" << std::endl
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2062 << " 0 if success," << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2063 #if defined(_WIN32)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2064 << "!= 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
2065 #else
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2066 << " -1 if error (have a look at the logs)." << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2067 #endif
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2068 << std::endl;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2069 }
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2070
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2071
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2072 static void PrintVersion(const char* path)
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2073 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2074 std::cout
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2075 << path << " " << ORTHANC_VERSION << std::endl
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1872
diff changeset
2076 << "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
2077 << "Copyright (C) 2017-2020 Osimis S.A. (Belgium)" << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2078 << "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
2079 << "This is free software: you are free to change and redistribute it." << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2080 << "There is NO WARRANTY, to the extent permitted by law." << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2081 << std::endl
3063
fa5ad4368fe3 new mail address
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3060
diff changeset
2082 << "Written by Sebastien Jodogne <s.jodogne@orthanc-labs.com>" << std::endl;
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2083 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2084
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2085
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2086 static void PrintErrorCode(ErrorCode code, const char* description)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2087 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2088 std::cout
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2089 << std::right << std::setw(16)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2090 << static_cast<int>(code)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2091 << " " << description << std::endl;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2092 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2093
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2094
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2095 static void PrintErrors(const char* path)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2096 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2097 std::cout
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2098 << 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
2099 << "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
2100 << 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
2101 << "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
2102 << std::endl << std::endl;
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2103
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2104 // The content of the following brackets is automatically generated
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2105 // by the "GenerateErrorCodes.py" script
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2106 {
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
2107 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
2108 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
2109 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
2110 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
2111 PrintErrorCode(ErrorCode_ParameterOutOfRange, "Parameter out of range");
2133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2132
diff changeset
2112 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
2113 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
2114 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
2115 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
2116 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
2117 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
2118 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
2119 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
2120 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
2121 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
2122 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
2123 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
2124 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
2125 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
2126 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
2127 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
2128 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
2129 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
2130 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
2131 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
2132 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
2133 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
2134 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
2135 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
2136 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
2137 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
2138 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
2139 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
2140 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
2141 PrintErrorCode(ErrorCode_EmptyRequest, "The request is empty");
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1746
diff changeset
2142 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
2143 PrintErrorCode(ErrorCode_NullPointer, "Cannot handle a NULL pointer");
2486
ad8f30fc28d1 new error code: DatabaseUnavailable
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
2144 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
2145 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
2146 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
2147 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
2148 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
2149 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
2150 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
2151 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
2152 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
2153 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
2154 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
2155 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
2156 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
2157 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
2158 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
2159 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
2160 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
2161 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
2162 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
2163 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
2164 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
2165 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
2166 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
2167 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
2168 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
2169 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
2170 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
2171 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
2172 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
2173 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
2174 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
2175 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
2176 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
2177 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
2178 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
2179 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
2180 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
2181 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
2182 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
2183 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
2184 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
2185 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
2186 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
2187 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
2188 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
2189 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
2190 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
2191 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
2192 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
2193 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
2194 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
2195 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
2196 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
2197 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
2198 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
2199 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
2200 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
2201 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
2202 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
2203 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
2204 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
2205 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
2206 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
2207 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
2208 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
2209 PrintErrorCode(ErrorCode_UnsupportedMediaType, "Unsupported media type");
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2210 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2211
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2212 std::cout << std::endl;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2213 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2214
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2215
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2216
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2217 #if ORTHANC_ENABLE_PLUGINS == 1
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
2218 static void LoadPlugins(OrthancPlugins& plugins)
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2219 {
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2220 std::list<std::string> pathList;
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2221
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2222 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2223 OrthancConfiguration::ReaderLock lock;
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2224 lock.GetConfiguration().GetListOfStringsParameter(pathList, "Plugins");
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2225 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2226
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2227 for (std::list<std::string>::const_iterator
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2228 it = pathList.begin(); it != pathList.end(); ++it)
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2229 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2230 std::string path;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2231
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2232 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2233 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2234 path = lock.GetConfiguration().InterpretStringParameterAsPath(*it);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2235 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2236
1321
0f9e0e808e0f more explicit message
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1310
diff changeset
2237 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
2238 plugins.GetManager().RegisterPlugin(path);
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2239 }
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2240 }
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1630
diff changeset
2241 #endif
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2242
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2243
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2244
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2245 // Returns "true" if restart is required
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2246 static bool WaitForExit(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2247 const OrthancRestApi& restApi)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2248 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2249 LOG(WARNING) << "Orthanc has started";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2250
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2251 #if ORTHANC_ENABLE_PLUGINS == 1
1741
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2252 if (context.HasPlugins())
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2253 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2254 context.GetPlugins().SignalOrthancStarted();
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2255 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2256 #endif
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2257
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2258 context.GetLuaScripting().Start();
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2259 context.GetLuaScripting().Execute("Initialize");
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2260
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
2261 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
2262
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2263 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
2264 {
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2136
diff changeset
2265 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
2266 restart = restApi.IsResetRequestReceived();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2267
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
2268 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
2269 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
2270 {
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2271 // 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
2272
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2273 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2274 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
2275 {
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2276 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
2277 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
2278 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
2279 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
2280 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2281 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
2282 {
2946
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2283 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
2284 << "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
2285 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
2286 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
2287 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2288 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2289 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
2290 {
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2291 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
2292 }
2009
e2dd40abce72 catching SIGHUP signal
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2000
diff changeset
2293 }
e2dd40abce72 catching SIGHUP signal
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2000
diff changeset
2294
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2295 context.GetLuaScripting().Execute("Finalize");
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2296 context.GetLuaScripting().Stop();
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2297
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2298 #if ORTHANC_ENABLE_PLUGINS == 1
1741
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2299 if (context.HasPlugins())
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2300 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2301 context.GetPlugins().SignalOrthancStopped();
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2302 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2303 #endif
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2304
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2305 if (restart)
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2306 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2307 LOG(WARNING) << "Reset request received, restarting Orthanc";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2308 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2309
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2310 // We're done
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2311 LOG(WARNING) << "Orthanc is stopping";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2312
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2313 return restart;
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2314 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2315
1368
b22ba8c5edbe query retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1366
diff changeset
2316
b22ba8c5edbe query retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1366
diff changeset
2317
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2318 static bool StartHttpServer(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2319 const OrthancRestApi& restApi,
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2320 OrthancPlugins* plugins)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2321 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2322 bool httpServerEnabled;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2323
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2324 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2325 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2326 httpServerEnabled = lock.GetConfiguration().GetBooleanParameter("HttpServerEnabled", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2327 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2328
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2329 if (!httpServerEnabled)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2330 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2331 LOG(WARNING) << "The HTTP server is disabled";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2332 return WaitForExit(context, restApi);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2333 }
1310
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2334 else
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2335 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2336 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
2337 HttpServer httpServer;
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2338 bool httpDescribeErrors;
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2339
3137
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2340 #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
2341 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
2342 #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
2343 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
2344 #else
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2345 # 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
2346 #endif
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2347
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2348 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2349 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2350
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2351 httpDescribeErrors = lock.GetConfiguration().GetBooleanParameter("HttpDescribeErrors", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2352
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2353 // 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
2354 httpServer.SetThreadsCount(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpThreadsCount", 50));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2355 httpServer.SetPortNumber(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpPort", 8042));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2356 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
2357 httpServer.SetKeepAliveEnabled(lock.GetConfiguration().GetBooleanParameter("KeepAlive", defaultKeepAlive));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2358 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
2359 httpServer.SetTcpNoDelay(lock.GetConfiguration().GetBooleanParameter("TcpNoDelay", true));
3537
9cc09f4c0fa9 New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3535
diff changeset
2360 httpServer.SetRequestTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpRequestTimeout", 30));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2361
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
2362 // 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
2363 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
2364
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2365 bool authenticationEnabled;
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2366 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
2367 {
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2368 httpServer.SetAuthenticationEnabled(authenticationEnabled);
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2369
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2370 if (httpServer.IsRemoteAccessAllowed() &&
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2371 !authenticationEnabled)
3501
27b53c61aa99 warning when authentication is automatically enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3500
diff changeset
2372 {
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
2373 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
2374 << "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
2375 context.SetHttpServerSecure(false);
3501
27b53c61aa99 warning when authentication is automatically enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3500
diff changeset
2376 }
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2377 }
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2378 else if (httpServer.IsRemoteAccessAllowed())
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2379 {
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2380 // 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
2381 // remote access without having explicitly disabled user
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2382 // authentication.
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2383 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
2384 << "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
2385 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
2386 }
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2387 else
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2388 {
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2389 // 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
2390 // "AuthenticationEnabled" disabled
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2391 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
2392 }
1310
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2393
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2394 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
2395
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2396 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
2397 !hasUsers)
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2398 {
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
2399 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
2400 {
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
2401 /**
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
2402 * 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
2403 * 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
2404 * 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
2405 * 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
2406 * 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
2407 * "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
2408 **/
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
2409 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
2410 << "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
2411 << "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
2412
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
2413 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
2414
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
2415 // 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
2416 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
2417 }
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
2418 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
2419 {
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
2420 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
2421 << "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
2422 }
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
2423 }
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2424
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2425 if (lock.GetConfiguration().GetBooleanParameter("SslEnabled", false))
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2426 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2427 std::string certificate = lock.GetConfiguration().InterpretStringParameterAsPath(
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2428 lock.GetConfiguration().GetStringParameter("SslCertificate", "certificate.pem"));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2429 httpServer.SetSslEnabled(true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2430 httpServer.SetSslCertificate(certificate.c_str());
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2431 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2432 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2433 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2434 httpServer.SetSslEnabled(false);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2435 }
3535
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2436
4190
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2437 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
2438 {
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2439 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
2440 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
2441 httpServer.SetSslVerifyPeers(true);
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2442 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
2443 }
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2444 else
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2445 {
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2446 httpServer.SetSslVerifyPeers(false);
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2447 }
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2448
3535
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2449 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
2450 {
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2451 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
2452 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
2453 << "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
2454 }
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2455 else
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2456 {
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2457 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
2458 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
2459 }
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2460 }
1949
d90f737f2dde warn about the use of privileged ports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
2461
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2462 MyHttpExceptionFormatter exceptionFormatter(httpDescribeErrors, plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2463
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2464 httpServer.SetIncomingHttpRequestFilter(httpFilter);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2465 httpServer.SetHttpExceptionFormatter(exceptionFormatter);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2466 httpServer.Register(context.GetHttpHandler());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2467
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2468 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
2469 UriComponents root; // TODO
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
2470 root.push_back("a");
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
2471 root.push_back("b");
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2472 //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
2473 //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
2474 httpServer.Register(root, new DummyBucket2(context));
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2475 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2476
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2477 if (httpServer.GetPortNumber() < 1024)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2478 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2479 LOG(WARNING) << "The HTTP port is privileged ("
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2480 << httpServer.GetPortNumber() << " is below 1024), "
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2481 << "make sure you run Orthanc as root/administrator";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2482 }
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2483
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2484 httpServer.Start();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2485
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2486 bool restart = WaitForExit(context, restApi);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2487
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2488 httpServer.Stop();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2489 LOG(WARNING) << " HTTP server has stopped";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2490
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2491 return restart;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2492 }
1452
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
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2495
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2496 static bool StartDicomServer(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2497 const OrthancRestApi& restApi,
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2498 OrthancPlugins* plugins)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2499 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2500 bool dicomServerEnabled;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2501
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2502 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2503 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2504 dicomServerEnabled = lock.GetConfiguration().GetBooleanParameter("DicomServerEnabled", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2505 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2506
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2507 if (!dicomServerEnabled)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2508 {
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2509 LOG(WARNING) << "The DICOM server is disabled";
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2510 return StartHttpServer(context, restApi, plugins);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2511 }
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2512 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2513 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2514 MyDicomServerFactory serverFactory(context);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2515 OrthancApplicationEntityFilter dicomFilter(context);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2516 ModalitiesFromConfiguration modalities;
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
2517
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2518 // Setup the DICOM server
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2519 DicomServer dicomServer;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2520 dicomServer.SetRemoteModalities(modalities);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2521 dicomServer.SetStoreRequestHandlerFactory(serverFactory);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2522 dicomServer.SetMoveRequestHandlerFactory(serverFactory);
3918
dba48c162b7b C-Get SCP always enabled; no more server config
Alain Mazy <alain@mazy.be>
parents: 3867
diff changeset
2523 dicomServer.SetGetRequestHandlerFactory(serverFactory);
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2524 dicomServer.SetFindRequestHandlerFactory(serverFactory);
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
2525 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
2526
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2527 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2528 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2529 dicomServer.SetCalledApplicationEntityTitleCheck(lock.GetConfiguration().GetBooleanParameter("DicomCheckCalledAet", false));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2530 dicomServer.SetAssociationTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("DicomScpTimeout", 30));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2531 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
2532 dicomServer.SetApplicationEntityTitle(lock.GetConfiguration().GetOrthancAET());
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2533 }
1786
164d78911382 primitives to handle dicom worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
2534
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2535 #if ORTHANC_ENABLE_PLUGINS == 1
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2536 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
2537 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2538 if (plugins->HasWorklistHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2539 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2540 dicomServer.SetWorklistRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2541 }
1999
364cc624eb65 New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1995
diff changeset
2542
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2543 if (plugins->HasFindHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2544 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2545 dicomServer.SetFindRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2546 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2547
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2548 if (plugins->HasMoveHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2549 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2550 dicomServer.SetMoveRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2551 }
1999
364cc624eb65 New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1995
diff changeset
2552 }
1800
30e97a1f4093 callback for handling worklists with plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1799
diff changeset
2553 #endif
1786
164d78911382 primitives to handle dicom worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
2554
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2555 dicomServer.SetApplicationEntityFilter(dicomFilter);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2556
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2557 if (dicomServer.GetPortNumber() < 1024)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2558 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2559 LOG(WARNING) << "The DICOM port is privileged ("
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2560 << dicomServer.GetPortNumber() << " is below 1024), "
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2561 << "make sure you run Orthanc as root/administrator";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2562 }
1949
d90f737f2dde warn about the use of privileged ports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
2563
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2564 dicomServer.Start();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2565 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
2566 << " on port: " << dicomServer.GetPortNumber();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2567
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2568 bool restart = false;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2569 ErrorCode error = ErrorCode_Success;
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2570
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2571 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2572 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2573 restart = StartHttpServer(context, restApi, plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2574 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2575 catch (OrthancException& e)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2576 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2577 error = e.GetErrorCode();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2578 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2579
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2580 dicomServer.Stop();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2581 LOG(WARNING) << " DICOM server has stopped";
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2582
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2583 serverFactory.Done();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2584
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2585 if (error != ErrorCode_Success)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2586 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2587 throw OrthancException(error);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2588 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2589
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2590 return restart;
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2591 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2592 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2593
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2594
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2595 static bool ConfigureHttpHandler(ServerContext& context,
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2596 OrthancPlugins *plugins,
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2597 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2598 {
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2599 #if ORTHANC_ENABLE_PLUGINS == 1
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2600 // 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
2601 // 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
2602 if (plugins)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2603 {
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2604 assert(context.HasPlugins());
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2605 context.GetHttpHandler().Register(*plugins, false);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2606 }
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1630
diff changeset
2607 #endif
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
2608
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2609 // Secondly, apply the "static resources" layer
1443
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2610 #if ORTHANC_STANDALONE == 1
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
2611 EmbeddedResourceHttpHandler staticResources("/app", ServerResources::ORTHANC_EXPLORER);
1443
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2612 #else
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2613 FilesystemHttpHandler staticResources("/app", ORTHANC_PATH "/OrthancExplorer");
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2614 #endif
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2615
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2616 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
2617
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2618 // 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
2619 OrthancRestApi restApi(context);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2620 context.GetHttpHandler().Register(restApi, true);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2621
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2622 context.SetupJobsEngine(false /* not running unit tests */, loadJobsFromDatabase);
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2623
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2624 bool restart = StartDicomServer(context, restApi, plugins);
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2625
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2626 context.Stop();
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2627
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2628 return restart;
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2629 }
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2630
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2631
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2632 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
2633 IStorageArea& storageArea)
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2634 {
1668
de1413733c97 reconstructing main dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1666
diff changeset
2635 // 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
2636 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
2637
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2638 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
2639 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
2640 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
2641
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2642 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
2643 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2644 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
2645 return;
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2646 }
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2647
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2648 if (currentVersion > ORTHANC_DATABASE_VERSION)
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2649 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2650 throw OrthancException(ErrorCode_IncompatibleDatabaseVersion,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2651 "The version of the database schema (" +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2652 boost::lexical_cast<std::string>(currentVersion) +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2653 ") 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
2654 }
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2655
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2656 LOG(WARNING) << "Upgrading the database from schema version "
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2657 << currentVersion << " to " << ORTHANC_DATABASE_VERSION;
1869
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2658
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2659 try
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2660 {
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2661 database.Upgrade(ORTHANC_DATABASE_VERSION, storageArea);
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2662 }
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2663 catch (OrthancException&)
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2664 {
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2665 LOG(ERROR) << "Unable to run the automated upgrade, please use the replication instructions: "
3135
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3126
diff changeset
2666 << "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
2667 throw;
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2668 }
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2670 // Sanity check
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2671 currentVersion = database.GetDatabaseVersion();
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2672 if (ORTHANC_DATABASE_VERSION != currentVersion)
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2673 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2674 throw OrthancException(ErrorCode_IncompatibleDatabaseVersion,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2675 "The database schema was not properly upgraded, it is still at version " +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2676 boost::lexical_cast<std::string>(currentVersion));
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2677 }
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2678 else
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2679 {
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2680 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
2681 << "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
2682 }
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2683 }
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2684
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2685
2941
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2686
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2687 namespace
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2688 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2689 class ServerContextConfigurator : public boost::noncopyable
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2690 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2691 private:
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2692 ServerContext& context_;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2693 OrthancPlugins* plugins_;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2694
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2695 public:
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2696 ServerContextConfigurator(ServerContext& context,
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2697 OrthancPlugins* plugins) :
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2698 context_(context),
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2699 plugins_(plugins)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2700 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2701 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2702 OrthancConfiguration::WriterLock lock;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2703 lock.GetConfiguration().SetServerIndex(context.GetIndex());
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2704 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2705
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2706 #if ORTHANC_ENABLE_PLUGINS == 1
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2707 if (plugins_ != NULL)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2708 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2709 plugins_->SetServerContext(context_);
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2710 context_.SetPlugins(*plugins_);
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2711 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2712 #endif
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2713 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2714
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2715 ~ServerContextConfigurator()
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2716 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2717 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2718 OrthancConfiguration::WriterLock lock;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2719 lock.GetConfiguration().ResetServerIndex();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2720 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2721
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2722 #if ORTHANC_ENABLE_PLUGINS == 1
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2723 if (plugins_ != NULL)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2724 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2725 plugins_->ResetServerContext();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2726 context_.ResetPlugins();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2727 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2728 #endif
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2729 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2730 };
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2731 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2732
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2733
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2734 static bool ConfigureServerContext(IDatabaseWrapper& database,
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2735 IStorageArea& storageArea,
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2736 OrthancPlugins *plugins,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2737 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2738 {
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2739 size_t maxCompletedJobs;
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2740
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2741 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2742 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
2743
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2744 // 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
2745 // 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
2746 // able to properly issue HTTP/HTTPS queries
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2747 HttpClient::ConfigureSsl(lock.GetConfiguration().GetBooleanParameter("HttpsVerifyPeers", true),
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2748 lock.GetConfiguration().InterpretStringParameterAsPath
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2749 (lock.GetConfiguration().GetStringParameter("HttpsCACertificates", "")));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2750 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
2751
6add197274b1 default value of HttpTimeout is now 60 seconds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3404
diff changeset
2752 // 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
2753 // 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
2754 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
2755
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2756 HttpClient::SetDefaultProxy(lock.GetConfiguration().GetStringParameter("HttpProxy", ""));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2757
3865
ff0718a4633a fix missing DicomAssociationParameters::SetDefaultTimeout()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3852
diff changeset
2758 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
2759
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2760 maxCompletedJobs = lock.GetConfiguration().GetUnsignedIntegerParameter("JobsHistorySize", 10);
3164
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2761
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2762 if (maxCompletedJobs == 0)
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2763 {
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2764 LOG(WARNING) << "Setting option \"JobsHistorySize\" to zero is not recommended";
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2765 }
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2766 }
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2767
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2768 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
2769
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2770 {
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2771 OrthancConfiguration::ReaderLock lock;
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2772
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2773 context.SetCompressionEnabled(lock.GetConfiguration().GetBooleanParameter("StorageCompression", false));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2774 context.SetStoreMD5ForAttachments(lock.GetConfiguration().GetBooleanParameter("StoreMD5ForAttachments", true));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2775
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2776 // 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
2777 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
2778
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2779 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2780 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2781 context.GetIndex().SetMaximumPatientCount(lock.GetConfiguration().GetUnsignedIntegerParameter("MaximumPatientCount", 0));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2782 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2783 catch (...)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2784 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2785 context.GetIndex().SetMaximumPatientCount(0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2786 }
2825
8aa6aef11b70 New configuration option "OverwriteInstances" to choose how duplicate SOPInstanceUID are handled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2815
diff changeset
2787
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2788 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2789 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2790 uint64_t size = lock.GetConfiguration().GetUnsignedIntegerParameter("MaximumStorageSize", 0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2791 context.GetIndex().SetMaximumStorageSize(size * 1024 * 1024);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2792 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2793 catch (...)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2794 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2795 context.GetIndex().SetMaximumStorageSize(0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2796 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2797 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2798
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2799 {
2941
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2800 ServerContextConfigurator configurator(context, plugins);
2946
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2801
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2802 {
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2803 OrthancConfiguration::WriterLock lock;
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2804 lock.GetConfiguration().LoadModalitiesAndPeers();
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2805 }
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2806
2941
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2807 return ConfigureHttpHandler(context, plugins, loadJobsFromDatabase);
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2808 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2809 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2810
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2811
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2812 static bool ConfigureDatabase(IDatabaseWrapper& database,
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2813 IStorageArea& storageArea,
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2814 OrthancPlugins *plugins,
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2815 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2816 bool loadJobsFromDatabase)
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2817 {
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2818 database.Open();
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2819
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2820 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
2821
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2822 if (upgradeDatabase)
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2823 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2824 UpgradeDatabase(database, storageArea);
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2825 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
2826 }
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2827 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
2828 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2829 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
2830 "The database schema must be upgraded from version " +
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2831 boost::lexical_cast<std::string>(currentVersion) + " to " +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2832 boost::lexical_cast<std::string>(ORTHANC_DATABASE_VERSION) +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2833 ": Please run Orthanc with the \"--upgrade\" argument");
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2834 }
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2835
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2836 bool success = ConfigureServerContext
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2837 (database, storageArea, plugins, loadJobsFromDatabase);
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2838
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2839 database.Close();
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2840
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2841 return success;
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2842 }
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2843
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2844
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2845 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
2846 char* argv[],
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2847 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2848 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2849 {
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3643
diff changeset
2850 std::unique_ptr<IDatabaseWrapper> databasePtr;
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3643
diff changeset
2851 std::unique_ptr<IStorageArea> storage;
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2852
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2853 #if ORTHANC_ENABLE_PLUGINS == 1
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2854 OrthancPlugins plugins;
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2855 plugins.SetCommandLineArguments(argc, argv);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2856 LoadPlugins(plugins);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2857
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2858 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
2859 if (plugins.HasDatabaseBackend())
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2860 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2861 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
2862 database = &plugins.GetDatabaseBackend();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2863 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2864 else
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2865 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2866 databasePtr.reset(CreateDatabaseWrapper());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2867 database = databasePtr.get();
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2868 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2869
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2870 if (plugins.HasStorageArea())
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2871 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2872 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
2873 storage.reset(plugins.CreateStorageArea());
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2874 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2875 else
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2876 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2877 storage.reset(CreateStorageArea());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2878 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2879
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2880 assert(database != NULL);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2881 assert(storage.get() != NULL);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2882
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2883 return ConfigureDatabase(*database, *storage, &plugins,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2884 upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2885
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2886 #elif ORTHANC_ENABLE_PLUGINS == 0
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2887 // The plugins are disabled
3048
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2888
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2889 databasePtr.reset(CreateDatabaseWrapper());
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2890 storage.reset(CreateStorageArea());
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2891
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2892 assert(databasePtr.get() != NULL);
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2893 assert(storage.get() != NULL);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2894
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2895 return ConfigureDatabase(*databasePtr, *storage, NULL,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2896 upgradeDatabase, loadJobsFromDatabase);
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2897
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2898 #else
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2899 # 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
2900 #endif
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2901 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2902
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2903
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2904 static bool StartOrthanc(int argc,
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2905 char* argv[],
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2906 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2907 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2908 {
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2909 return ConfigurePlugins(argc, argv, upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2910 }
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2911
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2912
2079
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2913 static bool DisplayPerformanceWarning()
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2914 {
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2915 (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
2916 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
2917 return true;
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2918 }
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2919
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2920
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2921 int main(int argc, char* argv[])
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2922 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
2923 Logging::Initialize();
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2924
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2925 bool upgradeDatabase = false;
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2926 bool loadJobsFromDatabase = true;
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2927 const char* configurationFile = NULL;
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2928
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2929
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2930 /**
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2931 * Parse the command-line options.
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2932 **/
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2933
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
2934 for (int i = 1; i < argc; i++)
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
2935 {
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2936 std::string argument(argv[i]);
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2937
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2938 if (argument.empty())
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2939 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2940 // Ignore empty arguments
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2941 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2942 else if (argument[0] != '-')
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2943 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2944 if (configurationFile != NULL)
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2945 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2946 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
2947 return -1;
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2948 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2949 else
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2950 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2951 // 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
2952 // the configuration file
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
2953
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
2954 // TODO WHAT IS THE ENCODING?
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2955 configurationFile = argv[i];
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2956 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2957 }
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2958 else if (argument == "--errors")
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2959 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2960 PrintErrors(argv[0]);
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2961 return 0;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2962 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2963 else if (argument == "--help")
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2964 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2965 PrintHelp(argv[0]);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2966 return 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2967 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2968 else if (argument == "--version")
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2969 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2970 PrintVersion(argv[0]);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2971 return 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2972 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2973 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
2974 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
2975 Logging::EnableInfoLevel(true);
137
0e97abc7b950 fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 136
diff changeset
2976 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2977 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
2978 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
2979 Logging::EnableTraceLevel(true);
137
0e97abc7b950 fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 136
diff changeset
2980 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2981 else if (boost::starts_with(argument, "--logdir="))
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
2982 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
2983 // TODO WHAT IS THE ENCODING?
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2984 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
2985
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
2986 try
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
2987 {
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
2988 Logging::SetTargetFolder(directory);
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
2989 }
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
2990 catch (OrthancException&)
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
2991 {
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2992 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
2993 << directory << ") is inexistent, aborting.";
1490
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
2994 return -1;
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
2995 }
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
2996 }
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2997 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
2998 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
2999 // 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
3000 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
3001
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3002 try
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3003 {
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3004 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
3005 }
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3006 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
3007 {
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3008 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
3009 << 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
3010 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
3011 }
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3012 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3013 else if (argument == "--upgrade")
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3014 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3015 upgradeDatabase = true;
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3016 }
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3017 else if (argument == "--no-jobs")
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3018 {
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3019 loadJobsFromDatabase = false;
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3020 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3021 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
3022 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3023 // TODO WHAT IS THE ENCODING?
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3024 std::string configurationSample;
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
3025 GetFileResource(configurationSample, ServerResources::CONFIGURATION_SAMPLE);
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3026
684
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3027 #if defined(_WIN32)
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3028 // Replace UNIX newlines with DOS newlines
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3029 boost::replace_all(configurationSample, "\n", "\r\n");
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3030 #endif
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3031
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3032 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
3033
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3034 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
3035 {
3526
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3036 if (target == "-")
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3037 {
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3038 // New in 1.5.8: Print to stdout
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3039 std::cout << configurationSample;
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3040 }
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3041 else
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3042 {
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3043 SystemToolbox::WriteFile(configurationSample, target);
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3044 }
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
3045 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
3046 }
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3047 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
3048 {
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3049 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
3050 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
3051 }
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3052 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3053 else
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3054 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3055 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
3056 }
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3057 }
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3058
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3059
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3060 /**
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3061 * Launch Orthanc.
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3062 **/
1102
ce6386b37afd avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
3063
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3064 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3065 std::string version(ORTHANC_VERSION);
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3066
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3067 if (std::string(ORTHANC_VERSION) == "mainline")
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3068 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3069 try
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3070 {
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2136
diff changeset
3071 boost::filesystem::path exe(SystemToolbox::GetPathToExecutable());
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3072 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
3073 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
3074 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
3075 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3076 catch (...)
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3077 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3078 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3079 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3080
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3081 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
3082 assert(DisplayPerformanceWarning());
4009
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3083
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3084 std::string s = "Architecture: ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3085 if (sizeof(void*) == 4)
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3086 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3087 s += "32-bit, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3088 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3089 else if (sizeof(void*) == 8)
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3090 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3091 s += "64-bit, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3092 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3093 else
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3094 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3095 s += "unsupported pointer size, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3096 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3097
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3098 switch (Toolbox::DetectEndianness())
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3099 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3100 case Endianness_Little:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3101 s += "little endian";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3102 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3103
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3104 case Endianness_Big:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3105 s += "big endian";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3106 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3107
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3108 default:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3109 s += "unsupported endianness";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3110 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3111 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3112
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3113 LOG(INFO) << s;
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3114 }
1102
ce6386b37afd avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
3115
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3116 int status = 0;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3117 try
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3118 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3119 for (;;)
270
e6a4c4329481 parameters for storage capacity
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 236
diff changeset
3120 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3121 OrthancInitialize(configurationFile);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3122
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3123 bool restart = StartOrthanc(argc, argv, upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3124 if (restart)
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3125 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3126 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
3127 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
3128 Logging::Reset();
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3129 }
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3130 else
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3131 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3132 break;
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3133 }
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3134 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3135 }
1245
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3136 catch (const OrthancException& e)
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3137 {
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3138 LOG(ERROR) << "Uncaught exception, stopping now: [" << e.What() << "] (code " << e.GetErrorCode() << ")";
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3139 #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
3140 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
3141 {
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3142 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
3143 }
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3144 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
3145 {
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3146 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
3147 }
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3148
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3149 #else
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3150 status = -1;
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3151 #endif
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3152 }
1245
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3153 catch (const std::exception& e)
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3154 {
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3155 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
3156 status = -1;
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3157 }
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3158 catch (const std::string& s)
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3159 {
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3160 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
3161 status = -1;
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3162 }
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3163 catch (...)
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3164 {
1223
5bd4c9f85b4c fix race condition while unregistering plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1210
diff changeset
3165 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
3166 status = -1;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3167 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3168
690
2e67366aab83 case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
3169 LOG(WARNING) << "Orthanc has stopped";
2e67366aab83 case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
3170
4026
05a363186da6 ORTHANC_BUILDING_FRAMEWORK_LIBRARY, Orthanc::InitializeFramework()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4009
diff changeset
3171 OrthancFinalize();
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
3172
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3173 return status;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3174 }