annotate OrthancServer/Sources/main.cpp @ 4238:c007fb7c8395

studies by date working
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 09 Oct 2020 10:28:34 +0200
parents f39d162ba7e9
children c8754c4c1862
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
62
a70bb32802ae renaming Server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 57
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1872
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
1288
6e7e5ed91c2d upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1285
diff changeset
4 * Department, University Hospital of Liege, Belgium
3640
94f4a18a79cc upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 *
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * This program is free software: you can redistribute it and/or
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * modify it under the terms of the GNU General Public License as
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * published by the Free Software Foundation, either version 3 of the
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * License, or (at your option) any later version.
136
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
11 *
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
12 * In addition, as a special exception, the copyright holders of this
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
13 * program give permission to link the code of its release with the
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
15 * that use the same license as the "OpenSSL" library), and distribute
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
16 * the linked executables. You must obey the GNU General Public License
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
17 * in all respects for all of the code used other than "OpenSSL". If you
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
18 * modify file(s) with this exception, you may extend this exception to
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
19 * your version of the file(s), but you are not obligated to do so. If
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
20 * you do not wish to do so, delete this exception statement from your
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
21 * version. If you delete this exception statement from all source files
fe180eae201d openssl exception
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 133
diff changeset
22 * in the program, then also delete it here.
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 *
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 * This program is distributed in the hope that it will be useful, but
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 * WITHOUT ANY WARRANTY; without even the implied warranty of
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 * General Public License for more details.
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 *
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 * You should have received a copy of the GNU General Public License
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 * along with this program. If not, see <http://www.gnu.org/licenses/>.
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 **/
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33
831
84513f2ee1f3 pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 824
diff changeset
34 #include "PrecompiledHeadersServer.h"
750
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 730
diff changeset
35 #include "OrthancRestApi/OrthancRestApi.h"
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
37 #include <boost/algorithm/string/predicate.hpp>
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
39 #include "../../OrthancFramework/Sources/Compatibility.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
40 #include "../../OrthancFramework/Sources/DicomFormat/DicomArray.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
41 #include "../../OrthancFramework/Sources/DicomNetworking/DicomAssociationParameters.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
42 #include "../../OrthancFramework/Sources/DicomNetworking/DicomServer.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
43 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
44 #include "../../OrthancFramework/Sources/HttpServer/FilesystemHttpHandler.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
45 #include "../../OrthancFramework/Sources/HttpServer/HttpServer.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
46 #include "../../OrthancFramework/Sources/Logging.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
47 #include "../../OrthancFramework/Sources/Lua/LuaFunctionCall.h"
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
48 #include "../Plugins/Engine/OrthancPlugins.h"
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
49 #include "EmbeddedResourceHttpHandler.h"
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
50 #include "OrthancConfiguration.h"
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
51 #include "OrthancFindRequestHandler.h"
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
52 #include "OrthancGetRequestHandler.h"
62
a70bb32802ae renaming Server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 57
diff changeset
53 #include "OrthancInitialization.h"
619
70d0f27e5bd3 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 618
diff changeset
54 #include "OrthancMoveRequestHandler.h"
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
55 #include "ServerContext.h"
3636
bce6ee64f2a4 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3635
diff changeset
56 #include "ServerJobs/StorageCommitmentScpJob.h"
730
309e686b41e7 better logging about nonexistent tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 725
diff changeset
57 #include "ServerToolbox.h"
3736
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
58 #include "StorageCommitmentReports.h"
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
60 #include "../../OrthancFramework/Sources/HttpServer/WebDavStorage.h" // TODO
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
61 #include "Search/DatabaseLookup.h" // TODO
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
62 #include <boost/regex.hpp> // TODO
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
63
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
64
62
a70bb32802ae renaming Server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 57
diff changeset
65 using namespace Orthanc;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67
613
60d90e48e809 query/retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 565
diff changeset
68 class OrthancStoreRequestHandler : public IStoreRequestHandler
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 private:
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
71 ServerContext& context_;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
74 explicit OrthancStoreRequestHandler(ServerContext& context) :
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
75 context_(context)
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78
1573
3309878b3e16 more information about the origin of requests submitted to the DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1572
diff changeset
79
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
80 virtual void Handle(const std::string& dicomFile,
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 const DicomMap& dicomSummary,
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 const Json::Value& dicomJson,
1573
3309878b3e16 more information about the origin of requests submitted to the DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1572
diff changeset
83 const std::string& remoteIp,
1285
5730f374e4e6 Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1280
diff changeset
84 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
85 const std::string& calledAet) ORTHANC_OVERRIDE
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 if (dicomFile.size() > 0)
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 {
1005
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
89 DicomInstanceToStore toStore;
2664
a21b244efb37 serialization of DicomModalityStoreJob, OrthancPeerStoreJob and ResourceModificationJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2640
diff changeset
90 toStore.SetOrigin(DicomInstanceOrigin::FromDicomProtocol
a21b244efb37 serialization of DicomModalityStoreJob, OrthancPeerStoreJob and ResourceModificationJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2640
diff changeset
91 (remoteIp.c_str(), remoteAet.c_str(), calledAet.c_str()));
3841
be7df7fe3d80 avoid one memcpy of the DICOM buffer on "POST /instances"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3801
diff changeset
92 toStore.SetBuffer(dicomFile.c_str(), dicomFile.size());
1005
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
93 toStore.SetSummary(dicomSummary);
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
94 toStore.SetJson(dicomJson);
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
95
84b6d7bca6db refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 996
diff changeset
96 std::string id;
3814
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
97 context_.Store(id, toStore, StoreInstanceMode_Default);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 };
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102
1797
23722a191e4e worklists are working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1796
diff changeset
103
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
104 class OrthancStorageCommitmentRequestHandler : public IStorageCommitmentRequestHandler
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
105 {
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
106 private:
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
107 ServerContext& context_;
3606
33ba63637d48 DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3604
diff changeset
108
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
109 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
110 explicit OrthancStorageCommitmentRequestHandler(ServerContext& context) :
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
111 context_(context)
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
112 {
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
113 }
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
114
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
115 virtual void HandleRequest(const std::string& transactionUid,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
116 const std::vector<std::string>& referencedSopClassUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
117 const std::vector<std::string>& referencedSopInstanceUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
118 const std::string& remoteIp,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
119 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
120 const std::string& calledAet) ORTHANC_OVERRIDE
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
121 {
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
122 if (referencedSopClassUids.size() != referencedSopInstanceUids.size())
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
123 {
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
124 throw OrthancException(ErrorCode_InternalError);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 }
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
126
3767
c6658187e4b1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3736
diff changeset
127 std::unique_ptr<StorageCommitmentScpJob> job(
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
128 new StorageCommitmentScpJob(context_, transactionUid, remoteAet, calledAet));
3606
33ba63637d48 DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3604
diff changeset
129
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
130 for (size_t i = 0; i < referencedSopClassUids.size(); i++)
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
131 {
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
132 job->AddInstance(referencedSopClassUids[i], referencedSopInstanceUids[i]);
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
133 }
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
134
3635
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
135 job->MarkAsReady();
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
136
8c0ef729d5a8 StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3615
diff changeset
137 context_.GetJobsEngine().GetRegistry().Submit(job.release(), 0 /* default priority */);
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
138 }
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
139
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
140 virtual void HandleReport(const std::string& transactionUid,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
141 const std::vector<std::string>& successSopClassUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
142 const std::vector<std::string>& successSopInstanceUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
143 const std::vector<std::string>& failedSopClassUids,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
144 const std::vector<std::string>& failedSopInstanceUids,
3736
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
145 const std::vector<StorageCommitmentFailureReason>& failureReasons,
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
146 const std::string& remoteIp,
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
147 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
148 const std::string& calledAet) ORTHANC_OVERRIDE
3613
c1e2b91c2ab4 all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3608
diff changeset
149 {
3736
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
150 if (successSopClassUids.size() != successSopInstanceUids.size() ||
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
151 failedSopClassUids.size() != failedSopInstanceUids.size() ||
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
152 failedSopClassUids.size() != failureReasons.size())
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
153 {
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
154 throw OrthancException(ErrorCode_InternalError);
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
155 }
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
156
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
157 std::unique_ptr<StorageCommitmentReports::Report> report(
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
158 new StorageCommitmentReports::Report(remoteAet));
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
159
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
160 for (size_t i = 0; i < successSopClassUids.size(); i++)
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
161 {
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
162 report->AddSuccess(successSopClassUids[i], successSopInstanceUids[i]);
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
163 }
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
164
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
165 for (size_t i = 0; i < failedSopClassUids.size(); i++)
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
166 {
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
167 report->AddFailure(failedSopClassUids[i], failedSopInstanceUids[i], failureReasons[i]);
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
168 }
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
169
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
170 report->MarkAsComplete();
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
171
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3734
diff changeset
172 context_.GetStorageCommitmentReports().Store(transactionUid, report.release());
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 };
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176
1797
23722a191e4e worklists are working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1796
diff changeset
177
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
178 class ModalitiesFromConfiguration : public DicomServer::IRemoteModalities
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
179 {
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
180 public:
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
181 virtual bool IsSameAETitle(const std::string& aet1,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
182 const std::string& aet2) ORTHANC_OVERRIDE
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
183 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
184 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
185 return lock.GetConfiguration().IsSameAETitle(aet1, aet2);
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
186 }
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
187
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
188 virtual bool LookupAETitle(RemoteModalityParameters& modality,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
189 const std::string& aet) ORTHANC_OVERRIDE
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
190 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
191 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
192 return lock.GetConfiguration().LookupDicomModalityUsingAETitle(modality, aet);
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
193 }
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
194 };
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
195
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
196
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
197 class MyDicomServerFactory :
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
198 public IStoreRequestHandlerFactory,
1800
30e97a1f4093 callback for handling worklists with plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1799
diff changeset
199 public IFindRequestHandlerFactory,
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
200 public IMoveRequestHandlerFactory,
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
201 public IGetRequestHandlerFactory,
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
202 public IStorageCommitmentRequestHandlerFactory
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
203 {
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
204 private:
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
205 ServerContext& context_;
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
206
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
207 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
208 explicit MyDicomServerFactory(ServerContext& context) : context_(context)
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
212 virtual IStoreRequestHandler* ConstructStoreRequestHandler() ORTHANC_OVERRIDE
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 {
613
60d90e48e809 query/retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 565
diff changeset
214 return new OrthancStoreRequestHandler(context_);
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
215 }
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
216
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
217 virtual IFindRequestHandler* ConstructFindRequestHandler() ORTHANC_OVERRIDE
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
218 {
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3643
diff changeset
219 std::unique_ptr<OrthancFindRequestHandler> result(new OrthancFindRequestHandler(context_));
941
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
220
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
221 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
222 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
223 result->SetMaxResults(lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindResults", 0));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
224 result->SetMaxInstances(lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindInstances", 0));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
225 }
941
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
226
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
227 if (result->GetMaxResults() == 0)
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
228 {
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
229 LOG(INFO) << "No limit on the number of C-FIND results at the Patient, Study and Series levels";
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
230 }
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
231 else
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
232 {
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
233 LOG(INFO) << "Maximum " << result->GetMaxResults()
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
234 << " results for C-FIND queries at the Patient, Study and Series levels";
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
235 }
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
236
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
237 if (result->GetMaxInstances() == 0)
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
238 {
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
239 LOG(INFO) << "No limit on the number of C-FIND results at the Instance level";
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
240 }
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
241 else
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
242 {
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
243 LOG(INFO) << "Maximum " << result->GetMaxInstances()
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
244 << " instances will be returned for C-FIND queries at the Instance level";
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
245 }
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
246
83489fddd8c5 Options to limit the number of results for an incoming C-FIND query
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
247 return result.release();
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
248 }
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
249
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
250 virtual IMoveRequestHandler* ConstructMoveRequestHandler() ORTHANC_OVERRIDE
387
ff647eedfbe1 enabling of Find/Move commands
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 376
diff changeset
251 {
613
60d90e48e809 query/retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 565
diff changeset
252 return new OrthancMoveRequestHandler(context_);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 }
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
254
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
255 virtual IGetRequestHandler* ConstructGetRequestHandler() ORTHANC_OVERRIDE
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
256 {
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
257 return new OrthancGetRequestHandler(context_);
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
258 }
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
259
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
260 virtual IStorageCommitmentRequestHandler* ConstructStorageCommitmentRequestHandler() ORTHANC_OVERRIDE
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
261 {
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
262 return new OrthancStorageCommitmentRequestHandler(context_);
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
263 }
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
264
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
265
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 void Done()
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 {
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 };
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
272 class OrthancApplicationEntityFilter : public IApplicationEntityFilter
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
273 {
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
274 private:
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
275 ServerContext& context_;
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
276 bool alwaysAllowEcho_;
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
277 bool alwaysAllowStore_;
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
278
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
279 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
280 explicit OrthancApplicationEntityFilter(ServerContext& context) :
2353
2421c137c304 reject connections earlier if DicomAlwaysAllowStore == false
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2352
diff changeset
281 context_(context)
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
282 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
283 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
284 alwaysAllowEcho_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowEcho", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
285 alwaysAllowStore_ = lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowStore", true);
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
286 }
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
287
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
288 virtual bool IsAllowedConnection(const std::string& remoteIp,
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
289 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
290 const std::string& calledAet) ORTHANC_OVERRIDE
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
291 {
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
292 LOG(INFO) << "Incoming connection from AET " << remoteAet
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
293 << " on IP " << remoteIp << ", calling AET " << calledAet;
2353
2421c137c304 reject connections earlier if DicomAlwaysAllowStore == false
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2352
diff changeset
294
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
295 if (alwaysAllowEcho_ ||
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
296 alwaysAllowStore_)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
297 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
298 return true;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
299 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
300 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
301 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
302 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
303 return lock.GetConfiguration().IsKnownAETitle(remoteAet, remoteIp);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
304 }
620
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
305 }
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
306
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
307 virtual bool IsAllowedRequest(const std::string& remoteIp,
1799
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
308 const std::string& remoteAet,
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
309 const std::string& calledAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
310 DicomRequestType type) ORTHANC_OVERRIDE
620
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
311 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
312 LOG(INFO) << "Incoming " << EnumerationToString(type) << " request from AET "
2352
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
313 << remoteAet << " on IP " << remoteIp << ", calling AET " << calledAet;
3ab96768d144 Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2299
diff changeset
314
2375
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
315 if (type == DicomRequestType_Echo &&
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
316 alwaysAllowEcho_)
620
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
317 {
2375
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
318 // Incoming C-Echo requests are always accepted, even from unknown AET
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
319 return true;
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
320 }
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
321 else if (type == DicomRequestType_Store &&
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
322 alwaysAllowStore_)
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
323 {
3ec85ff48374 New security-related options: "DicomAlwaysAllowEcho"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2353
diff changeset
324 // Incoming C-Store requests are always accepted, even from unknown AET
620
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
325 return true;
4aa6f0d79947 security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 619
diff changeset
326 }
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
327 else
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
328 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
329 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
330
4182
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
331 std::list<RemoteModalityParameters> modalities;
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
332 if (lock.GetConfiguration().LookupDicomModalitiesUsingAETitle(modalities, remoteAet))
2872
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
333 {
4182
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
334 if (modalities.size() == 1) // don't check the IP if there's only one modality with this AET
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
335 {
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
336 return modalities.front().IsRequestAllowed(type);
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
337 }
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
338 else // if there are multiple modalities with the same AET, check the one matching this IP
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
339 {
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
340 for (std::list<RemoteModalityParameters>::const_iterator it = modalities.begin(); it != modalities.end(); ++it)
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
341 {
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
342 if (it->GetHost() == remoteIp)
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
343 {
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
344 return it->IsRequestAllowed(type);
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
345 }
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
346 }
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
347
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
348 LOG(WARNING) << "Unable to check DICOM authorization for AET " << remoteAet
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
349 << " on IP " << remoteIp << ", " << modalities.size()
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
350 << " modalites found with this AET but none of them matching the IP";
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
351 }
1c9c2c41c015 When checking DICOM allowed methods, if there are multiple modalities with the same AET, differentiate them from the calling IP
Alain Mazy <alain@mazy.be>
parents: 4143
diff changeset
352 return false;
2872
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
353 }
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
354 else
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
355 {
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
356 return false;
9d08edde614b Possibility to restrict the allowed DICOM commands for each modality
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2825
diff changeset
357 }
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
358 }
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
359 }
1163
3db41779d8f9 abstraction to allow/prevent transfer syntaxes on AET basis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1135
diff changeset
360
1799
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
361 virtual bool IsAllowedTransferSyntax(const std::string& remoteIp,
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
362 const std::string& remoteAet,
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
363 const std::string& calledAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
364 TransferSyntax syntax) ORTHANC_OVERRIDE
1163
3db41779d8f9 abstraction to allow/prevent transfer syntaxes on AET basis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1135
diff changeset
365 {
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
366 std::string configuration;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
367
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
368 switch (syntax)
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
369 {
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
370 case TransferSyntax_Deflated:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
371 configuration = "DeflatedTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
372 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
373
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
374 case TransferSyntax_Jpeg:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
375 configuration = "JpegTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
376 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
377
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
378 case TransferSyntax_Jpeg2000:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
379 configuration = "Jpeg2000TransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
380 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
381
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
382 case TransferSyntax_JpegLossless:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
383 configuration = "JpegLosslessTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
384 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
385
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
386 case TransferSyntax_Jpip:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
387 configuration = "JpipTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
388 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
389
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
390 case TransferSyntax_Mpeg2:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
391 configuration = "Mpeg2TransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
392 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
393
3643
fa3ff492fb3b added TransferSyntax_Mpeg4
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
394 case TransferSyntax_Mpeg4:
fa3ff492fb3b added TransferSyntax_Mpeg4
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
395 configuration = "Mpeg4TransferSyntaxAccepted";
fa3ff492fb3b added TransferSyntax_Mpeg4
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
396 break;
fa3ff492fb3b added TransferSyntax_Mpeg4
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
397
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
398 case TransferSyntax_Rle:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
399 configuration = "RleTransferSyntaxAccepted";
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
400 break;
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
401
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
402 default:
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
403 throw OrthancException(ErrorCode_ParameterOutOfRange);
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
404 }
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
405
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
406 {
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
407 std::string name = "Is" + configuration;
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
408
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
409 LuaScripting::Lock lock(context_.GetLuaScripting());
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
410
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
411 if (lock.GetLua().IsExistingFunction(name.c_str()))
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
412 {
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
413 LuaFunctionCall call(lock.GetLua(), name.c_str());
1799
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
414 call.PushString(remoteAet);
4f01c9d73f02 calledAet made available to all the handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1797
diff changeset
415 call.PushString(remoteIp);
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
416 call.PushString(calledAet);
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
417 return call.ExecutePredicate();
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
418 }
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
419 }
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
420
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
421 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
422 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
423 return lock.GetConfiguration().GetBooleanParameter(configuration, true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
424 }
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
425 }
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
426
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
427
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
428 virtual bool IsUnknownSopClassAccepted(const std::string& remoteIp,
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
429 const std::string& remoteAet,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
430 const std::string& calledAet) ORTHANC_OVERRIDE
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
431 {
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
432 static const char* configuration = "UnknownSopClassAccepted";
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
433
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
434 {
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
435 std::string lua = "Is" + std::string(configuration);
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
436
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
437 LuaScripting::Lock lock(context_.GetLuaScripting());
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
438
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
439 if (lock.GetLua().IsExistingFunction(lua.c_str()))
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
440 {
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
441 LuaFunctionCall call(lock.GetLua(), lua.c_str());
1806
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
442 call.PushString(remoteAet);
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
443 call.PushString(remoteIp);
cd213ebcaefd UnknownSopClassAccepted option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1802
diff changeset
444 call.PushString(calledAet);
1164
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
445 return call.ExecutePredicate();
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
446 }
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
447 }
0a55d8eb194e Configuration/Lua to select the accepted C-Store SCP transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1163
diff changeset
448
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
449 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
450 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
451 return lock.GetConfiguration().GetBooleanParameter(configuration, false);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
452 }
1163
3db41779d8f9 abstraction to allow/prevent transfer syntaxes on AET basis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1135
diff changeset
453 }
618
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
454 };
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
455
5ab377df6d8b filtering on aet
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 614
diff changeset
456
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
457 class MyIncomingHttpRequestFilter : public IIncomingHttpRequestFilter
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
458 {
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
459 private:
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
460 ServerContext& context_;
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
461 OrthancPlugins* plugins_;
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
462
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
463 public:
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
464 MyIncomingHttpRequestFilter(ServerContext& context,
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
465 OrthancPlugins* plugins) :
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
466 context_(context),
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
467 plugins_(plugins)
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
468 {
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
469 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
470
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
471 virtual bool IsAllowed(HttpMethod method,
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
472 const char* uri,
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
473 const char* ip,
1959
45c4387a379c Access to the HTTP headers in the "IncomingHttpRequestFilter()" callback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1949
diff changeset
474 const char* username,
2268
ce5c13b95dac New function: OrthancPluginRegisterIncomingHttpRequestFilter2()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2246
diff changeset
475 const IHttpHandler::Arguments& httpHeaders,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
476 const IHttpHandler::GetArguments& getArguments) ORTHANC_OVERRIDE
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
477 {
3048
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
478 #if ORTHANC_ENABLE_PLUGINS == 1
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
479 if (plugins_ != NULL &&
2268
ce5c13b95dac New function: OrthancPluginRegisterIncomingHttpRequestFilter2()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2246
diff changeset
480 !plugins_->IsAllowed(method, uri, ip, username, httpHeaders, getArguments))
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
481 {
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
482 return false;
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
483 }
3048
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
484 #endif
1962
22ddb22fce83 sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1959
diff changeset
485
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
486 static const char* HTTP_FILTER = "IncomingHttpRequestFilter";
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
487
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
488 LuaScripting::Lock lock(context_.GetLuaScripting());
996
cf52f3bcb2b3 clarification of Lua classes wrt multithreading
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 941
diff changeset
489
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
490 // Test if the instance must be filtered out
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
491 if (lock.GetLua().IsExistingFunction(HTTP_FILTER))
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
492 {
2616
2f3007bf0708 event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2612
diff changeset
493 LuaFunctionCall call(lock.GetLua(), HTTP_FILTER);
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
494
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
495 switch (method)
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
496 {
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
497 case HttpMethod_Get:
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
498 call.PushString("GET");
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
499 break;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
500
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
501 case HttpMethod_Put:
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
502 call.PushString("PUT");
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
503 break;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
504
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
505 case HttpMethod_Post:
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
506 call.PushString("POST");
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
507 break;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
508
473
c9a5d72f8481 changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 426
diff changeset
509 case HttpMethod_Delete:
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
510 call.PushString("DELETE");
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
511 break;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
512
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
513 default:
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
514 return true;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
515 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
516
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
517 call.PushString(uri);
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
518 call.PushString(ip);
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
519 call.PushString(username);
1959
45c4387a379c Access to the HTTP headers in the "IncomingHttpRequestFilter()" callback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1949
diff changeset
520 call.PushStringMap(httpHeaders);
409
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
521
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
522 if (!call.ExecutePredicate())
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
523 {
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
524 LOG(INFO) << "An incoming HTTP request has been discarded by the filter";
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
525 return false;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
526 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
527 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
528
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
529 return true;
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
530 }
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
531 };
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
532
63f707278fc8 lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 407
diff changeset
533
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
534
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
535 class MyHttpExceptionFormatter : public IHttpExceptionFormatter
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
536 {
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
537 private:
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
538 bool describeErrors_;
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
539 OrthancPlugins* plugins_;
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
540
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
541 public:
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
542 MyHttpExceptionFormatter(bool describeErrors,
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
543 OrthancPlugins* plugins) :
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
544 describeErrors_(describeErrors),
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
545 plugins_(plugins)
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
546 {
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
547 }
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
548
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
549 virtual void Format(HttpOutput& output,
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
550 const OrthancException& exception,
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
551 HttpMethod method,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
552 const char* uri) ORTHANC_OVERRIDE
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
553 {
1650
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
554 {
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
555 bool isPlugin = false;
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
556
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
557 #if ORTHANC_ENABLE_PLUGINS == 1
1650
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
558 if (plugins_ != NULL)
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
559 {
1651
2e692c83e2f3 improved custom error login
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1650
diff changeset
560 plugins_->GetErrorDictionary().LogError(exception.GetErrorCode(), true);
1650
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
561 isPlugin = true;
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
562 }
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
563 #endif
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
564
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
565 if (!isPlugin)
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
566 {
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
567 LOG(ERROR) << "Exception in the HTTP handler: " << exception.What();
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
568 }
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
569 }
9f34ebfaf2c9 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1649
diff changeset
570
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
571 Json::Value message = Json::objectValue;
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
572 ErrorCode errorCode = exception.GetErrorCode();
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
573 HttpStatus httpStatus = exception.GetHttpStatus();
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
574
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
575 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
576 bool isPlugin = false;
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
577
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
578 #if ORTHANC_ENABLE_PLUGINS == 1
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
579 if (plugins_ != NULL &&
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
580 plugins_->GetErrorDictionary().Format(message, httpStatus, exception))
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
581 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
582 errorCode = ErrorCode_Plugin;
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
583 isPlugin = true;
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
584 }
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
585 #endif
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
586
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
587 if (!isPlugin)
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
588 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
589 message["Message"] = exception.What();
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
590 }
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
591 }
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
592
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
593 if (!describeErrors_)
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
594 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
595 output.SendStatus(httpStatus);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
596 }
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
597 else
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
598 {
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
599 message["Method"] = EnumerationToString(method);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
600 message["Uri"] = uri;
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
601 message["HttpError"] = EnumerationToString(httpStatus);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
602 message["HttpStatus"] = httpStatus;
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
603 message["OrthancError"] = EnumerationToString(errorCode);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
604 message["OrthancStatus"] = errorCode;
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
605
2952
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
606 if (exception.HasDetails())
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
607 {
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
608 message["Details"] = exception.GetDetails();
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
609 }
4ceb9bf7b00c added details string in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
610
1649
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
611 std::string info = message.toStyledString();
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
612 output.SendStatus(httpStatus, info);
8040d56cb0b3 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1645
diff changeset
613 }
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
614 }
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
615 };
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
616
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
617
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
618
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
619
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
620
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
621
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
622
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
623 static const char* const UPLOAD_FOLDER = "upload";
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
624
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
625 class DummyBucket : public IWebDavBucket // TODO
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
626 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
627 private:
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
628 ServerContext& context_;
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
629 WebDavStorage storage_;
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
630
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
631 bool IsUploadedFolder(const UriComponents& path) const
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
632 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
633 return (path.size() >= 1 && path[0] == UPLOAD_FOLDER);
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
634 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
635
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
636 public:
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
637 DummyBucket(ServerContext& context,
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
638 bool isMemory) :
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
639 context_(context),
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
640 storage_(isMemory)
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
641 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
642 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
643
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
644 virtual bool IsExistingFolder(const UriComponents& path) ORTHANC_OVERRIDE
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
645 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
646 if (IsUploadedFolder(path))
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
647 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
648 return storage_.IsExistingFolder(UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
649 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
650 else
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
651 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
652 return (path.size() == 0 ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
653 (path.size() == 1 && path[0] == "Folder1") ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
654 (path.size() == 2 && path[0] == "Folder1" && path[1] == "Folder2"));
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
655 }
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
656 }
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
657
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
658 virtual bool ListCollection(Collection& collection,
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
659 const UriComponents& path) ORTHANC_OVERRIDE
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
660 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
661 if (IsUploadedFolder(path))
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
662 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
663 return storage_.ListCollection(collection, UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
664 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
665 else if (IsExistingFolder(path))
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
666 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
667 if (path.empty())
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
668 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
669 collection.AddResource(new Folder(UPLOAD_FOLDER));
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
670 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
671
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
672 for (unsigned int i = 0; i < 5; i++)
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
673 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
674 std::unique_ptr<File> f(new File("IM" + boost::lexical_cast<std::string>(i) + ".dcm"));
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
675 f->SetContentLength(1024 * i);
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
676 f->SetMimeType(MimeType_PlainText);
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
677 collection.AddResource(f.release());
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
678 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
679
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
680 for (unsigned int i = 0; i < 5; i++)
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
681 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
682 collection.AddResource(new Folder("Folder" + boost::lexical_cast<std::string>(i)));
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
683 }
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
684
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
685 return true;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
686 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
687 else
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
688 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
689 return false;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
690 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
691 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
692
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
693 virtual bool GetFileContent(MimeType& mime,
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
694 std::string& content,
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
695 boost::posix_time::ptime& time,
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
696 const UriComponents& path) ORTHANC_OVERRIDE
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
697 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
698 if (path.empty())
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
699 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
700 return false;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
701 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
702 else if (IsUploadedFolder(path))
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
703 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
704 return storage_.GetFileContent(mime, content, time,
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
705 UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
706 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
707 else if (path.back() == "IM0.dcm" ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
708 path.back() == "IM1.dcm" ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
709 path.back() == "IM2.dcm" ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
710 path.back() == "IM3.dcm" ||
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
711 path.back() == "IM4.dcm")
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
712 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
713 time = boost::posix_time::second_clock::universal_time();
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
714
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
715 std::string s;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
716 for (size_t i = 0; i < path.size(); i++)
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
717 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
718 s += "/" + path[i];
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
719 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
720
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
721 content = "Hello world!\r\n" + s + "\r\n";
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
722 mime = MimeType_PlainText;
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
723 return true;
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
724 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
725 else
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
726 {
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
727 return false;
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
728 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
729 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
730
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
731
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
732 virtual bool StoreFile(const std::string& content,
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
733 const UriComponents& path) ORTHANC_OVERRIDE
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
734 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
735 if (IsUploadedFolder(path))
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
736 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
737 return storage_.StoreFile(content, UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
738 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
739 else
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
740 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
741 LOG(WARNING) << "Writing to a read-only location in WebDAV: " << Toolbox::FlattenUri(path);
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
742 return false;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
743 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
744 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
745
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
746
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
747 virtual bool CreateFolder(const UriComponents& path) ORTHANC_OVERRIDE
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
748 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
749 if (IsUploadedFolder(path))
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
750 {
4230
b313a0001893 WebDavStorage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4228
diff changeset
751 return storage_.CreateFolder(UriComponents(path.begin() + 1, path.end()));
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
752 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
753 else
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
754 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
755 LOG(WARNING) << "Writing to a read-only location in WebDAV: " << Toolbox::FlattenUri(path);
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
756 return false;
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
757 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
758 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
759
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
760 virtual bool DeleteItem(const std::vector<std::string>& path) ORTHANC_OVERRIDE
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
761 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
762 return false; // read-only
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
763 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
764
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
765 virtual void Start() ORTHANC_OVERRIDE
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
766 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
767 LOG(WARNING) << "Starting WebDAV";
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
768 }
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
769
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
770 virtual void Stop() ORTHANC_OVERRIDE
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
771 {
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
772 LOG(WARNING) << "Stopping WebDAV";
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
773 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
774 };
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
775
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
776
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
777
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
778
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
779
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
780 static const char* const BY_PATIENTS = "by-patients";
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
781 static const char* const BY_STUDIES = "by-studies";
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
782 static const char* const BY_DATE = "by-dates";
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
783 static const char* const BY_UIDS = "by-uids";
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
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1223
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1224 class InstancesOfSeries : public INode
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1225 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1226 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1227 ServerContext& context_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1228 std::string parentSeries_;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1229
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1230 public:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1231 InstancesOfSeries(ServerContext& context,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1232 const std::string& parentSeries) :
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1233 context_(context),
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1234 parentSeries_(parentSeries)
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1238 virtual bool ListCollection(IWebDavBucket::Collection& target,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1239 const UriComponents& path) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1240 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1241 if (path.empty())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1242 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1243 std::list<std::string> resources;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1244 try
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1245 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1246 context_.GetIndex().GetChildren(resources, parentSeries_);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1247 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1248 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1249 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1250 // Unknown (or deleted) parent series
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1251 return false;
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1254 for (std::list<std::string>::const_iterator
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1255 it = resources.begin(); it != resources.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1256 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1257 boost::posix_time::ptime time;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1258 LookupTime(time, context_, *it, MetadataType_Instance_ReceptionDate);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1259
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1260 FileInfo info;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1261 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
1262 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1263 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
1264 resource->SetMimeType(MimeType_Dicom);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1265 resource->SetContentLength(info.GetUncompressedSize());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1266 resource->SetCreationTime(time);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1267 target.AddResource(resource.release());
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1271 return true;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1272 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1273 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1274 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1275 return false;
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1279 virtual bool GetFileContent(MimeType& mime,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1280 std::string& content,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1281 boost::posix_time::ptime& time,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1282 const UriComponents& path) ORTHANC_OVERRIDE
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1283 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1284 if (path.size() == 1 &&
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1285 boost::ends_with(path[0], ".dcm"))
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1286 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1287 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
1288
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1289 try
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1290 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1291 mime = MimeType_Dicom;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1292 context_.ReadDicom(content, instanceId);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1293 LookupTime(time, context_, instanceId, MetadataType_Instance_ReceptionDate);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1294 return true;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1295 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1296 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1297 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1298 // File was removed
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1299 return false;
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 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1302 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1303 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1304 return false;
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
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1311 /**
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1312 * The "InternalNode" class corresponds to a non-leaf node in the
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1313 * WebDAV tree, that only contains subfolders (no file).
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1314 *
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1315 * TODO: Implement a LRU index to dynamically remove the oldest
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1316 * children on high RAM usage.
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1317 **/
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1318 class InternalNode : public INode
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1319 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1320 private:
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1321 typedef std::map<std::string, INode*> Children;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1322
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1323 Children children_;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1324
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1325 INode* GetChild(const std::string& path) // Don't delete the result pointer!
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1326 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1327 Children::const_iterator child = children_.find(path);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1328 if (child == children_.end())
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1329 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1330 INode* child = CreateChild(path);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1331
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1332 if (child == NULL)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1333 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1334 return NULL;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1335 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1336 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1337 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1338 children_[path] = child;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1339 return child;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1340 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1341 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1342 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1343 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1344 assert(child->second != NULL);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1345 return child->second;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1346 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1347 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1348
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1349 protected:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1350 void RemoveSubfolder(const std::string& path)
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1351 {
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1352 Children::iterator child = children_.find(path);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1353 if (child != children_.end())
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1354 {
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1355 assert(child->second != NULL);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1356 delete child->second;
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1357 children_.erase(child);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1358 }
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1359 }
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1360
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1361 virtual void Refresh() = 0;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1362
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1363 virtual bool ListSubfolders(IWebDavBucket::Collection& target) = 0;
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1364
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1365 virtual INode* CreateChild(const std::string& path) = 0;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1366
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1367 public:
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1368 virtual ~InternalNode()
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1369 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1370 for (Children::iterator it = children_.begin(); it != children_.end(); ++it)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1371 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1372 assert(it->second != NULL);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1373 delete it->second;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1374 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1375 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1376
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1377 virtual bool ListCollection(IWebDavBucket::Collection& target,
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1378 const UriComponents& path)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1379 ORTHANC_OVERRIDE ORTHANC_FINAL
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1380 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1381 Refresh();
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1382
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1383 if (path.empty())
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1384 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1385 return ListSubfolders(target);
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1386 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1387 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1388 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1389 // Recursivity
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1390 INode* child = GetChild(path[0]);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1391 if (child == NULL)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1392 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1393 return false;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1394 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1395 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1396 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1397 UriComponents subpath(path.begin() + 1, path.end());
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1398 return child->ListCollection(target, subpath);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1399 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1400 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1401 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1402
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1403 virtual bool GetFileContent(MimeType& mime,
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1404 std::string& content,
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1405 boost::posix_time::ptime& time,
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1406 const UriComponents& path)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1407 ORTHANC_OVERRIDE ORTHANC_FINAL
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1408 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1409 if (path.empty())
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1410 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1411 return false; // An internal node doesn't correspond to a file
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1412 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1413 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1414 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1415 // Recursivity
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1416 Refresh();
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1417
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1418 INode* child = GetChild(path[0]);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1419 if (child == NULL)
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1420 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1421 return false;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1422 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1423 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1424 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1425 UriComponents subpath(path.begin() + 1, path.end());
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1426 return child->GetFileContent(mime, content, time, subpath);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1427 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1428 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1429 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1430 };
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1431
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1432
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1433 class ListOfResources : public InternalNode
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 private:
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1436 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1437 const Templates& templates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1438 std::unique_ptr<ResourcesIndex> index_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1439 MetadataType timeMetadata_;
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1440
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1441 protected:
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1442 virtual void Refresh() ORTHANC_OVERRIDE ORTHANC_FINAL
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1443 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1444 std::list<std::string> resources;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1445 GetCurrentResources(resources);
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::set<std::string> removedPaths;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1448 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
1449
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1450 // Remove the children whose associated resource doesn't exist anymore
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1451 for (std::set<std::string>::const_iterator
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1452 it = removedPaths.begin(); it != removedPaths.end(); ++it)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1453 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1454 RemoveSubfolder(*it);
4234
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 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1457
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1458 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE ORTHANC_FINAL
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1459 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1460 if (index_->GetLevel() == ResourceType_Instance)
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1461 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1462 // Not a collection, no subfolders
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1463 return false;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1464 }
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1465 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1466 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1467 const ResourcesIndex::Map& paths = index_->GetPathToResource();
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1468
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1469 for (ResourcesIndex::Map::const_iterator it = paths.begin(); it != paths.end(); ++it)
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1470 {
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1471 boost::posix_time::ptime time;
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1472 LookupTime(time, context_, it->second, timeMetadata_);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1473
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1474 std::unique_ptr<IWebDavBucket::Resource> resource(new IWebDavBucket::Folder(it->first));
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1475 resource->SetCreationTime(time);
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1476 target.AddResource(resource.release());
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1477 }
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1478
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1479 return true;
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1480 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1481 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1482
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1483 virtual INode* CreateChild(const std::string& path) ORTHANC_OVERRIDE ORTHANC_FINAL
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1484 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1485 ResourcesIndex::Map::const_iterator resource = index_->GetPathToResource().find(path);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1486 if (resource == index_->GetPathToResource().end())
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1487 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1488 return NULL;
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1489 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1490 else
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1491 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1492 return CreateResourceNode(resource->second);
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1493 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1494 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1495
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1496 ServerContext& GetContext() const
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1497 {
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1498 return context_;
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1499 }
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1500
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1501 virtual void GetCurrentResources(std::list<std::string>& resources) = 0;
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1502
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1503 virtual INode* CreateResourceNode(const std::string& resource) = 0;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1504
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1505 public:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1506 ListOfResources(ServerContext& context,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1507 ResourceType level,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1508 const Templates& templates) :
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1509 context_(context),
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1510 templates_(templates)
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1511 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1512 Templates::const_iterator t = templates.find(level);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1513 if (t == templates.end())
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1514 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1515 throw OrthancException(ErrorCode_ParameterOutOfRange);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1516 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1517
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1518 index_.reset(new ResourcesIndex(context, level, t->second));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1519
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1520 if (level == ResourceType_Instance)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1521 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1522 timeMetadata_ = MetadataType_Instance_ReceptionDate;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1523 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1524 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1525 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1526 timeMetadata_ = MetadataType_LastUpdate;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1527 }
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
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1530 ResourceType GetLevel() const
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1531 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1532 return index_->GetLevel();
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1533 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1534
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1535 const Templates& GetTemplates() const
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1536 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1537 return templates_;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1538 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1539 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1540
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1541
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1542
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1543 class SingleDicomResource : public ListOfResources
4234
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 private:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1546 std::string parentId_;
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 protected:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1549 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
1550 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1551 try
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().GetChildren(resources, parentId_);
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1554 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1555 catch (OrthancException&)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1556 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1557 // Unknown parent resource
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1558 resources.clear();
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 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1561
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1562 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1563 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1564 if (GetLevel() == ResourceType_Instance)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1565 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1566 return NULL;
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 else if (GetLevel() == ResourceType_Series)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1569 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1570 return new InstancesOfSeries(GetContext(), resource);
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1571 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1572 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1573 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1574 ResourceType l = GetChildResourceType(GetLevel());
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1575 return new SingleDicomResource(GetContext(), l, resource, GetTemplates());
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1576 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1577 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1578
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1579 public:
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1580 SingleDicomResource(ServerContext& context,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1581 ResourceType level,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1582 const std::string& parentId,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1583 const Templates& templates) :
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1584 ListOfResources(context, level, templates),
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1585 parentId_(parentId)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1586 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1587 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1588 };
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1589
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1590
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1591 class RootNode : public ListOfResources
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1592 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1593 protected:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1594 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
1595 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1596 GetContext().GetIndex().GetAllUuids(resources, GetLevel());
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1597 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1598
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1599 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1600 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1601 if (GetLevel() == ResourceType_Series)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1602 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1603 return new InstancesOfSeries(GetContext(), resource);
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1604 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1605 else
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1606 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1607 ResourceType l = GetChildResourceType(GetLevel());
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1608 return new SingleDicomResource(GetContext(), l, resource, GetTemplates());
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1609 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1610 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1611
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1612 public:
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1613 RootNode(ServerContext& context,
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1614 ResourceType level,
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1615 const Templates& templates) :
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1616 ListOfResources(context, level, templates)
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1617 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1618 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1619 };
4235
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
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1622 class ListOfStudiesByDate : public ListOfResources
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1623 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1624 private:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1625 std::string year_;
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1626 std::string month_;
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1627
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1628 class Visitor : public ServerContext::ILookupVisitor
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1629 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1630 private:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1631 std::list<std::string>& resources_;
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1632
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1633 public:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1634 Visitor(std::list<std::string>& resources) :
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1635 resources_(resources)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1636 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1637 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1638
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1639 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1640 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1641 return false; // (*)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1642 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1643
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1644 virtual void MarkAsComplete() ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1645 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1646 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1647
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1648 virtual void Visit(const std::string& publicId,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1649 const std::string& instanceId /* unused */,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1650 const DicomMap& mainDicomTags,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1651 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1652 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1653 resources_.push_back(publicId);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1654 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1655 };
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1656
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1657 protected:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1658 virtual void GetCurrentResources(std::list<std::string>& resources) ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1659 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1660 DatabaseLookup query;
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1661 query.AddRestConstraint(DICOM_TAG_STUDY_DATE, year_ + month_ + "01-" + year_ + month_ + "31",
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1662 true /* case sensitive */, true /* mandatory tag */);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1663
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1664 Visitor visitor(resources);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1665 GetContext().Apply(visitor, query, ResourceType_Study, 0 /* since */, 0 /* no limit */);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1666 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1667
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1668 virtual INode* CreateResourceNode(const std::string& resource) ORTHANC_OVERRIDE
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1669 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1670 return new SingleDicomResource(GetContext(), ResourceType_Series, resource, GetTemplates());
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1671 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1672
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1673 public:
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1674 ListOfStudiesByDate(ServerContext& context,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1675 const std::string& year,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1676 const std::string& month,
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1677 const Templates& templates) :
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1678 ListOfResources(context, ResourceType_Study, templates),
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1679 year_(year),
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1680 month_(month)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1681 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1682 if (year.size() != 4 ||
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1683 month.size() != 2)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1684 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1685 throw OrthancException(ErrorCode_ParameterOutOfRange);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1686 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1687 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1688 };
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1689
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1690
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1691 class ListOfStudiesByMonth : public InternalNode
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1692 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1693 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1694 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1695 std::string year_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1696 const Templates& templates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1697
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1698 class Visitor : public ServerContext::ILookupVisitor
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1699 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1700 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1701 std::set<std::string> months_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1702
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1703 public:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1704 Visitor()
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 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1707
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1708 const std::set<std::string>& GetMonths() const
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1709 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1710 return months_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1711 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1712
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1713 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
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 return false; // (*)
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 virtual void MarkAsComplete() ORTHANC_OVERRIDE
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 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1721
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1722 virtual void Visit(const std::string& publicId,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1723 const std::string& instanceId /* unused */,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1724 const DicomMap& mainDicomTags,
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1725 const Json::Value* dicomAsJson /* unused (*) */) ORTHANC_OVERRIDE
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1726 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1727 std::string s;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1728 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
1729 s.size() == 8)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1730 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1731 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
1732 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1733 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1734 };
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 protected:
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1737 virtual void Refresh() ORTHANC_OVERRIDE
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1738 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1739 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1740
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1741 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1742 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1743 DatabaseLookup query;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1744 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
1745 true /* case sensitive */, true /* mandatory tag */);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1746
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1747 Visitor visitor;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1748 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
1749
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1750 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
1751 it != visitor.GetMonths().end(); ++it)
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 target.AddResource(new IWebDavBucket::Folder(year_ + "-" + *it));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1754 }
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1755
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1756 return true;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1757 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1758
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1759 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
1760 {
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1761 if (path.size() != 7) // Format: "YYYY-MM"
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1762 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1763 throw OrthancException(ErrorCode_InternalError);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1764 }
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1765 else
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1766 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1767 const std::string year = path.substr(0, 4);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1768 const std::string month = path.substr(5, 2);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1769 return new ListOfStudiesByDate(context_, year, month, templates_);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1770 }
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1771 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1772
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1773 public:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1774 ListOfStudiesByMonth(ServerContext& context,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1775 const std::string& year,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1776 const Templates& templates) :
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1777 context_(context),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1778 year_(year),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1779 templates_(templates)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1780 {
4238
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1781 if (year_.size() != 4)
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1782 {
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1783 throw OrthancException(ErrorCode_ParameterOutOfRange);
c007fb7c8395 studies by date working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4237
diff changeset
1784 }
4235
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 };
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
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1789 class ListOfStudiesByYear : public InternalNode
4235
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 private:
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1792 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
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1795 protected:
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1796 virtual void Refresh() ORTHANC_OVERRIDE
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1797 {
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1798 }
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1799
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1800 virtual bool ListSubfolders(IWebDavBucket::Collection& target) ORTHANC_OVERRIDE
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1801 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1802 std::list<std::string> resources;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1803 context_.GetIndex().GetAllUuids(resources, ResourceType_Study);
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1804
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1805 std::set<std::string> years;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1806
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1807 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
1808 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1809 DicomMap tags;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1810 std::string studyDate;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1811 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
1812 tags.LookupStringValue(studyDate, DICOM_TAG_STUDY_DATE, false) &&
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1813 studyDate.size() == 8)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1814 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1815 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
1816 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1817 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1818
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1819 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
1820 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1821 target.AddResource(new IWebDavBucket::Folder(*it));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1822 }
4236
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1823
5639ffda467b preparing merging InternalNode with ResourcesNode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4235
diff changeset
1824 return true;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1825 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1826
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1827 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
1828 {
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1829 return new ListOfStudiesByMonth(context_, path, templates_);
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1830 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1831
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1832 public:
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1833 ListOfStudiesByYear(ServerContext& context,
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1834 const Templates& templates) :
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1835 context_(context),
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1836 templates_(templates)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1837 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1838 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1839 };
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1840
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1841
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1842 ServerContext& context_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1843 std::unique_ptr<INode> patients_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1844 std::unique_ptr<INode> studies_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1845 std::unique_ptr<INode> dates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1846 Templates patientsTemplates_;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1847 Templates studiesTemplates_;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1848
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1849
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1850 public:
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1851 DummyBucket2(ServerContext& context) :
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1852 context_(context)
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1853 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1854 patientsTemplates_[ResourceType_Patient] = "{{PatientID}} - {{PatientName}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1855 patientsTemplates_[ResourceType_Study] = "{{StudyDate}} - {{StudyDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1856 patientsTemplates_[ResourceType_Series] = "{{Modality}} - {{SeriesDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1857
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1858 studiesTemplates_[ResourceType_Study] = "{{PatientID}} - {{PatientName}} - {{StudyDescription}}";
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1859 studiesTemplates_[ResourceType_Series] = patientsTemplates_[ResourceType_Series];
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1860
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1861 patients_.reset(new RootNode(context, ResourceType_Patient, patientsTemplates_));
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1862 studies_.reset(new RootNode(context, ResourceType_Study, studiesTemplates_));
4237
f39d162ba7e9 sharing more code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4236
diff changeset
1863 dates_.reset(new ListOfStudiesByYear(context, studiesTemplates_));
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1864 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1865
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1866 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
1867 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1868 if (path.empty())
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 return true;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1871 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1872 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
1873 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1874 return (path.size() <= 3 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1875 (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
1876 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1877 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1878 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1879 IWebDavBucket::Collection tmp;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1880 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
1881 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1882 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1883 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1884 IWebDavBucket::Collection tmp;
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1885 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
1886 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1887 else if (path[0] == BY_DATE)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1888 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1889 IWebDavBucket::Collection tmp;
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1890 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
1891 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1892 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1893 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1894 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1895 }
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
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1898 virtual bool ListCollection(Collection& collection,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1899 const UriComponents& path) ORTHANC_OVERRIDE
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 if (path.empty())
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1902 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1903 collection.AddResource(new Folder(BY_DATE));
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1904 collection.AddResource(new Folder(BY_PATIENTS));
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1905 collection.AddResource(new Folder(BY_STUDIES));
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1906 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
1907 return true;
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1908 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1909 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
1910 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1911 DatabaseLookup query;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1912 ResourceType level;
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1913 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
1914
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1915 if (path.size() == 1)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1916 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1917 level = ResourceType_Study;
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1918 limit = 100; // TODO
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1919 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1920 else if (path.size() == 2)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1921 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1922 AddVirtualFile(collection, path, "study.json");
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1923
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1924 level = ResourceType_Series;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1925 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
1926 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1927 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1928 else if (path.size() == 3)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1929 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1930 AddVirtualFile(collection, path, "series.json");
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1931
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1932 level = ResourceType_Instance;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1933 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
1934 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1935 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
1936 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1937 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1938 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1939 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1940 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1941 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1942
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1943 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
1944 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
1945
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1946 return true;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1947 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1948 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1949 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1950 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
1951 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1952 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1953 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1954 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
1955 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1956 else if (path[0] == BY_DATE)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1957 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
1958 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
1959 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1960 else
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1961 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1962 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1963 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1964 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1965
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1966 virtual bool GetFileContent(MimeType& mime,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1967 std::string& content,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1968 boost::posix_time::ptime& modificationTime,
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1969 const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1970 {
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1971 if (path.empty())
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1972 {
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1973 return false;
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1974 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
1975 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
1976 {
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1977 if (path.size() == 3 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1978 path[2] == "study.json")
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1979 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1980 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1981 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
1982 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
1983
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1984 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
1985 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
1986
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1987 mime = MimeType_Json;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1988 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1989 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1990 else if (path.size() == 4 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1991 path[3] == "series.json")
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1992 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1993 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1994 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
1995 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
1996 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
1997 true /* case sensitive */, true /* mandatory tag */);
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
1998
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
1999 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
2000 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
2001
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2002 mime = MimeType_Json;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2003 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2004 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2005 else if (path.size() == 4 &&
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2006 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
2007 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2008 std::string sopInstanceUid = path[3];
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2009 sopInstanceUid.resize(sopInstanceUid.size() - 4);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2010
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2011 DatabaseLookup query;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2012 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
2013 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
2014 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
2015 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
2016 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
2017 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
2018
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2019 DicomFileVisitor visitor(context_, content, modificationTime);
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2020 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
2021
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2022 mime = MimeType_Dicom;
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2023 return visitor.IsSuccess();
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2024 }
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2025 }
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2026 else if (path[0] == BY_PATIENTS)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2027 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2028 return patients_->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
2029 }
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2030 else if (path[0] == BY_STUDIES)
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2031 {
4235
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2032 return studies_->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
2033 }
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2034 else if (path[0] == BY_DATE)
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2035 {
b3ec19f369d1 working on sorting by dates
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4234
diff changeset
2036 return dates_->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
2037 }
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2038
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2039 return false;
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2040 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2041
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2042
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2043 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
2044 const UriComponents& path) ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2045 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2046 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2047 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2048
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2049
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2050 virtual bool CreateFolder(const UriComponents& path)
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2051 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2052 return false;
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2053 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2054
4232
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2055 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
2056 {
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2057 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
2058 return false; // read-only
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2059 }
688435755466 added DELETE in WebDAV, first working virtual filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4231
diff changeset
2060
4231
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2061 virtual void Start() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2062 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2063 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2064
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2065 virtual void Stop() ORTHANC_OVERRIDE
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2066 {
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2067 }
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2068 };
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2069
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2070
290ffcb0a147 publishing the DICOM hierarchy as WebDAV bucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4230
diff changeset
2071
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2072 static void PrintHelp(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 << "Usage: " << path << " [OPTION]... [CONFIGURATION]" << std::endl
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
2076 << "Orthanc, lightweight, RESTful DICOM server for healthcare and medical research." << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2077 << std::endl
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2078 << "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
2079 << "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
2080 << "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
2081 << "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
2082 << "instructions about how to use Orthanc <http://www.orthanc-server.com/>." << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2083 << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2084 << "Command-line options:" << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2085 << " --help\t\tdisplay this help and exit" << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2086 << " --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
2087 << "\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
2088 << " --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
2089 << "\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
2090 << " --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
2091 << "\t\t\t(if file is \"-\", dumps to stdout)" << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2092 << " --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
2093 << " --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
2094 << " --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
2095 << " --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
2096 << "\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
2097 << "\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
2098 << " --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
2099 << "\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
2100 << " --version\t\toutput version information and exit" << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2101 << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2102 << "Exit status:" << std::endl
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2103 << " 0 if success," << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2104 #if defined(_WIN32)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2105 << "!= 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
2106 #else
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2107 << " -1 if error (have a look at the logs)." << std::endl
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2108 #endif
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2109 << std::endl;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2110 }
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2111
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2112
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2113 static void PrintVersion(const char* path)
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2114 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2115 std::cout
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2116 << path << " " << ORTHANC_VERSION << std::endl
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1872
diff changeset
2117 << "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
2118 << "Copyright (C) 2017-2020 Osimis S.A. (Belgium)" << std::endl
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2119 << "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
2120 << "This is free software: you are free to change and redistribute it." << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2121 << "There is NO WARRANTY, to the extent permitted by law." << std::endl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2122 << std::endl
3063
fa5ad4368fe3 new mail address
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3060
diff changeset
2123 << "Written by Sebastien Jodogne <s.jodogne@orthanc-labs.com>" << std::endl;
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2124 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2125
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2126
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2127 static void PrintErrorCode(ErrorCode code, const char* description)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2128 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2129 std::cout
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2130 << std::right << std::setw(16)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2131 << static_cast<int>(code)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2132 << " " << description << std::endl;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2133 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2134
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2135
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2136 static void PrintErrors(const char* path)
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2137 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2138 std::cout
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2139 << 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
2140 << "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
2141 << 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
2142 << "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
2143 << std::endl << std::endl;
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2144
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2145 // The content of the following brackets is automatically generated
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2146 // by the "GenerateErrorCodes.py" script
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2147 {
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_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
2149 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
2150 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
2151 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
2152 PrintErrorCode(ErrorCode_ParameterOutOfRange, "Parameter out of range");
2133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2132
diff changeset
2153 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
2154 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
2155 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
2156 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
2157 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
2158 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
2159 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
2160 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
2161 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
2162 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
2163 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
2164 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
2165 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
2166 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
2167 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
2168 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
2169 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
2170 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
2171 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
2172 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
2173 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
2174 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
2175 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
2176 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
2177 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
2178 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
2179 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
2180 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
2181 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
2182 PrintErrorCode(ErrorCode_EmptyRequest, "The request is empty");
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1746
diff changeset
2183 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
2184 PrintErrorCode(ErrorCode_NullPointer, "Cannot handle a NULL pointer");
2486
ad8f30fc28d1 new error code: DatabaseUnavailable
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
2185 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
2186 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
2187 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
2188 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
2189 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
2190 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
2191 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
2192 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
2193 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
2194 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
2195 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
2196 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
2197 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
2198 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
2199 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
2200 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
2201 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
2202 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
2203 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
2204 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
2205 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
2206 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
2207 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
2208 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
2209 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
2210 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
2211 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
2212 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
2213 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
2214 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
2215 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
2216 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
2217 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
2218 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
2219 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
2220 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
2221 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
2222 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
2223 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
2224 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
2225 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
2226 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
2227 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
2228 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
2229 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
2230 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
2231 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
2232 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
2233 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
2234 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
2235 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
2236 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
2237 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
2238 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
2239 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
2240 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
2241 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
2242 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
2243 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
2244 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
2245 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
2246 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
2247 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
2248 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
2249 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
2250 PrintErrorCode(ErrorCode_UnsupportedMediaType, "Unsupported media type");
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2251 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2252
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2253 std::cout << std::endl;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2254 }
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2255
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2256
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2257
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2258 #if ORTHANC_ENABLE_PLUGINS == 1
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
2259 static void LoadPlugins(OrthancPlugins& plugins)
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2260 {
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2261 std::list<std::string> pathList;
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2262
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2263 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2264 OrthancConfiguration::ReaderLock lock;
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2265 lock.GetConfiguration().GetListOfStringsParameter(pathList, "Plugins");
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2266 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2267
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2268 for (std::list<std::string>::const_iterator
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2269 it = pathList.begin(); it != pathList.end(); ++it)
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2270 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2271 std::string path;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2272
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2273 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2274 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2275 path = lock.GetConfiguration().InterpretStringParameterAsPath(*it);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2276 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2277
1321
0f9e0e808e0f more explicit message
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1310
diff changeset
2278 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
2279 plugins.GetManager().RegisterPlugin(path);
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2280 }
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2281 }
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1630
diff changeset
2282 #endif
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2283
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2284
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2285
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2286 // Returns "true" if restart is required
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2287 static bool WaitForExit(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2288 const OrthancRestApi& restApi)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2289 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2290 LOG(WARNING) << "Orthanc has started";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2291
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2292 #if ORTHANC_ENABLE_PLUGINS == 1
1741
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2293 if (context.HasPlugins())
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2294 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2295 context.GetPlugins().SignalOrthancStarted();
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2296 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2297 #endif
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2298
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2299 context.GetLuaScripting().Start();
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2300 context.GetLuaScripting().Execute("Initialize");
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2301
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
2302 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
2303
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2304 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
2305 {
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2136
diff changeset
2306 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
2307 restart = restApi.IsResetRequestReceived();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2308
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
2309 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
2310 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
2311 {
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
2312 // 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
2313
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2314 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2315 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
2316 {
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2317 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
2318 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
2319 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
2320 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
2321 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2322 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
2323 {
2946
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2324 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
2325 << "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
2326 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
2327 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
2328 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2329 }
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2330 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
2331 {
4dafe2a0d3ab Support of SIGHUP signal (restart Orthanc only if the configuration files have changed)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2009
diff changeset
2332 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
2333 }
2009
e2dd40abce72 catching SIGHUP signal
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2000
diff changeset
2334 }
e2dd40abce72 catching SIGHUP signal
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2000
diff changeset
2335
2617
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2336 context.GetLuaScripting().Execute("Finalize");
912a767911b0 back to a single Lua context
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2616
diff changeset
2337 context.GetLuaScripting().Stop();
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2338
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2339 #if ORTHANC_ENABLE_PLUGINS == 1
1741
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2340 if (context.HasPlugins())
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2341 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2342 context.GetPlugins().SignalOrthancStopped();
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2343 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2344 #endif
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1734
diff changeset
2345
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2346 if (restart)
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2347 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2348 LOG(WARNING) << "Reset request received, restarting Orthanc";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2349 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2350
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2351 // We're done
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2352 LOG(WARNING) << "Orthanc is stopping";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2353
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2354 return restart;
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2355 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2356
1368
b22ba8c5edbe query retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1366
diff changeset
2357
b22ba8c5edbe query retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1366
diff changeset
2358
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2359 static bool StartHttpServer(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2360 const OrthancRestApi& restApi,
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2361 OrthancPlugins* plugins)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2362 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2363 bool httpServerEnabled;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2364
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2365 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2366 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2367 httpServerEnabled = lock.GetConfiguration().GetBooleanParameter("HttpServerEnabled", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2368 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2369
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2370 if (!httpServerEnabled)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2371 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2372 LOG(WARNING) << "The HTTP server is disabled";
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2373 return WaitForExit(context, restApi);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2374 }
1310
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2375 else
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2376 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2377 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
2378 HttpServer httpServer;
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2379 bool httpDescribeErrors;
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2380
3137
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2381 #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
2382 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
2383 #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
2384 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
2385 #else
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2386 # 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
2387 #endif
5a3b961e9524 New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3135
diff changeset
2388
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2389 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2390 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2391
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2392 httpDescribeErrors = lock.GetConfiguration().GetBooleanParameter("HttpDescribeErrors", true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2393
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2394 // 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
2395 httpServer.SetThreadsCount(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpThreadsCount", 50));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2396 httpServer.SetPortNumber(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpPort", 8042));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2397 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
2398 httpServer.SetKeepAliveEnabled(lock.GetConfiguration().GetBooleanParameter("KeepAlive", defaultKeepAlive));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2399 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
2400 httpServer.SetTcpNoDelay(lock.GetConfiguration().GetBooleanParameter("TcpNoDelay", true));
3537
9cc09f4c0fa9 New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3535
diff changeset
2401 httpServer.SetRequestTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("HttpRequestTimeout", 30));
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2402
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
2403 // 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
2404 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
2405
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2406 bool authenticationEnabled;
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2407 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
2408 {
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2409 httpServer.SetAuthenticationEnabled(authenticationEnabled);
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2410
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2411 if (httpServer.IsRemoteAccessAllowed() &&
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2412 !authenticationEnabled)
3501
27b53c61aa99 warning when authentication is automatically enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3500
diff changeset
2413 {
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 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
2415 << "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
2416 context.SetHttpServerSecure(false);
3501
27b53c61aa99 warning when authentication is automatically enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3500
diff changeset
2417 }
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2418 }
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2419 else if (httpServer.IsRemoteAccessAllowed())
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2420 {
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2421 // 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
2422 // remote access without having explicitly disabled user
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2423 // authentication.
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2424 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
2425 << "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
2426 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
2427 }
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2428 else
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2429 {
3506
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2430 // 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
2431 // "AuthenticationEnabled" disabled
d2b9981017c4 better handling of HTTP security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3501
diff changeset
2432 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
2433 }
1310
61ce8147f30d custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1289
diff changeset
2434
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2435 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
2436
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2437 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
2438 !hasUsers)
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2439 {
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
2440 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
2441 {
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
2442 /**
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
2443 * 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
2444 * 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
2445 * 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
2446 * 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
2447 * 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
2448 * "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
2449 **/
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
2450 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
2451 << "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
2452 << "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
2453
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
2454 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
2455
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
2456 // 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
2457 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
2458 }
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
2459 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
2460 {
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
2461 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
2462 << "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
2463 }
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
2464 }
3500
0d248cc63ded Security: If remote HTTP access is enabled, HTTP authentication automatically gets enabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3495
diff changeset
2465
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2466 if (lock.GetConfiguration().GetBooleanParameter("SslEnabled", false))
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2467 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2468 std::string certificate = lock.GetConfiguration().InterpretStringParameterAsPath(
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2469 lock.GetConfiguration().GetStringParameter("SslCertificate", "certificate.pem"));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2470 httpServer.SetSslEnabled(true);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2471 httpServer.SetSslCertificate(certificate.c_str());
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2472 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2473 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2474 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2475 httpServer.SetSslEnabled(false);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2476 }
3535
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2477
4190
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2478 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
2479 {
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2480 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
2481 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
2482 httpServer.SetSslVerifyPeers(true);
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2483 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
2484 }
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2485 else
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2486 {
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2487 httpServer.SetSslVerifyPeers(false);
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2488 }
9ce5c89328f5 New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents: 4182
diff changeset
2489
3535
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2490 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
2491 {
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2492 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
2493 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
2494 << "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
2495 }
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2496 else
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2497 {
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
2498 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
2499 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
2500 }
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2501 }
1949
d90f737f2dde warn about the use of privileged ports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
2502
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2503 MyHttpExceptionFormatter exceptionFormatter(httpDescribeErrors, plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2504
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2505 httpServer.SetIncomingHttpRequestFilter(httpFilter);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2506 httpServer.SetHttpExceptionFormatter(exceptionFormatter);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2507 httpServer.Register(context.GetHttpHandler());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2508
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2509 {
4228
c8c0bbaaace3 write access to webdav
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4227
diff changeset
2510 UriComponents root; // TODO
4227
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
2511 root.push_back("a");
7fff7e683d65 basic implementation of WebDAV handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4226
diff changeset
2512 root.push_back("b");
4234
a38376b80cd1 WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4233
diff changeset
2513 //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
2514 //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
2515 httpServer.Register(root, new DummyBucket2(context));
4226
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2516 }
7bd5eab3ba25 prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4205
diff changeset
2517
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2518 if (httpServer.GetPortNumber() < 1024)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2519 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2520 LOG(WARNING) << "The HTTP port is privileged ("
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2521 << httpServer.GetPortNumber() << " is below 1024), "
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2522 << "make sure you run Orthanc as root/administrator";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2523 }
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2524
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2525 httpServer.Start();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2526
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2527 bool restart = WaitForExit(context, restApi);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2528
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2529 httpServer.Stop();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2530 LOG(WARNING) << " HTTP server has stopped";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2531
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2532 return restart;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2533 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2534 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2535
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2536
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2537 static bool StartDicomServer(ServerContext& context,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4190
diff changeset
2538 const OrthancRestApi& restApi,
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2539 OrthancPlugins* plugins)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2540 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2541 bool dicomServerEnabled;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2542
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2543 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2544 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2545 dicomServerEnabled = lock.GetConfiguration().GetBooleanParameter("DicomServerEnabled", true);
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 (!dicomServerEnabled)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2549 {
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2550 LOG(WARNING) << "The DICOM server is disabled";
1645
1558b3226b18 IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
2551 return StartHttpServer(context, restApi, plugins);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2552 }
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2553 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2554 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2555 MyDicomServerFactory serverFactory(context);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2556 OrthancApplicationEntityFilter dicomFilter(context);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2557 ModalitiesFromConfiguration modalities;
2381
b8969010b534 uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2375
diff changeset
2558
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2559 // Setup the DICOM server
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2560 DicomServer dicomServer;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2561 dicomServer.SetRemoteModalities(modalities);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2562 dicomServer.SetStoreRequestHandlerFactory(serverFactory);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2563 dicomServer.SetMoveRequestHandlerFactory(serverFactory);
3918
dba48c162b7b C-Get SCP always enabled; no more server config
Alain Mazy <alain@mazy.be>
parents: 3867
diff changeset
2564 dicomServer.SetGetRequestHandlerFactory(serverFactory);
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2565 dicomServer.SetFindRequestHandlerFactory(serverFactory);
3604
e327b44780bb abstraction: storage commitment handler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3537
diff changeset
2566 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
2567
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2568 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2569 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2570 dicomServer.SetCalledApplicationEntityTitleCheck(lock.GetConfiguration().GetBooleanParameter("DicomCheckCalledAet", false));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2571 dicomServer.SetAssociationTimeout(lock.GetConfiguration().GetUnsignedIntegerParameter("DicomScpTimeout", 30));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2572 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
2573 dicomServer.SetApplicationEntityTitle(lock.GetConfiguration().GetOrthancAET());
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2574 }
1786
164d78911382 primitives to handle dicom worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
2575
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2576 #if ORTHANC_ENABLE_PLUGINS == 1
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2577 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
2578 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2579 if (plugins->HasWorklistHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2580 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2581 dicomServer.SetWorklistRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2582 }
1999
364cc624eb65 New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1995
diff changeset
2583
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2584 if (plugins->HasFindHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2585 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2586 dicomServer.SetFindRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2587 }
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 if (plugins->HasMoveHandler())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2590 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2591 dicomServer.SetMoveRequestHandlerFactory(*plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2592 }
1999
364cc624eb65 New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1995
diff changeset
2593 }
1800
30e97a1f4093 callback for handling worklists with plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1799
diff changeset
2594 #endif
1786
164d78911382 primitives to handle dicom worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
2595
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2596 dicomServer.SetApplicationEntityFilter(dicomFilter);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2597
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2598 if (dicomServer.GetPortNumber() < 1024)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2599 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2600 LOG(WARNING) << "The DICOM port is privileged ("
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2601 << dicomServer.GetPortNumber() << " is below 1024), "
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2602 << "make sure you run Orthanc as root/administrator";
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2603 }
1949
d90f737f2dde warn about the use of privileged ports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
2604
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2605 dicomServer.Start();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2606 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
2607 << " on port: " << dicomServer.GetPortNumber();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2608
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2609 bool restart = false;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2610 ErrorCode error = ErrorCode_Success;
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2611
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2612 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2613 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2614 restart = StartHttpServer(context, restApi, plugins);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2615 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2616 catch (OrthancException& e)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2617 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2618 error = e.GetErrorCode();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2619 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2620
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2621 dicomServer.Stop();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2622 LOG(WARNING) << " DICOM server has stopped";
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2623
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2624 serverFactory.Done();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2625
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2626 if (error != ErrorCode_Success)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2627 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2628 throw OrthancException(error);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2629 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2630
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2631 return restart;
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2632 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2633 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2634
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2635
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2636 static bool ConfigureHttpHandler(ServerContext& context,
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2637 OrthancPlugins *plugins,
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2638 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2639 {
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2640 #if ORTHANC_ENABLE_PLUGINS == 1
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2641 // 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
2642 // 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
2643 if (plugins)
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2644 {
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2645 assert(context.HasPlugins());
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2646 context.GetHttpHandler().Register(*plugins, false);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2647 }
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1630
diff changeset
2648 #endif
3818
4f78da5613a1 Add C-GET SCP support
Stacy Loesch <stacy.loesch@varian.com>
parents: 3801
diff changeset
2649
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2650 // Secondly, apply the "static resources" layer
1443
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2651 #if ORTHANC_STANDALONE == 1
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
2652 EmbeddedResourceHttpHandler staticResources("/app", ServerResources::ORTHANC_EXPLORER);
1443
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2653 #else
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2654 FilesystemHttpHandler staticResources("/app", ORTHANC_PATH "/OrthancExplorer");
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2655 #endif
895ab369d63c refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2656
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2657 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
2658
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2659 // 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
2660 OrthancRestApi restApi(context);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2661 context.GetHttpHandler().Register(restApi, true);
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2662
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2663 context.SetupJobsEngine(false /* not running unit tests */, loadJobsFromDatabase);
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2664
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2665 bool restart = StartDicomServer(context, restApi, plugins);
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2666
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2667 context.Stop();
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2668
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2788
diff changeset
2669 return restart;
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2670 }
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2671
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2672
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2673 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
2674 IStorageArea& storageArea)
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2675 {
1668
de1413733c97 reconstructing main dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1666
diff changeset
2676 // 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
2677 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
2678
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2679 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
2680 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
2681 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
2682
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2683 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
2684 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2685 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
2686 return;
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2687 }
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2688
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2689 if (currentVersion > ORTHANC_DATABASE_VERSION)
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2690 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2691 throw OrthancException(ErrorCode_IncompatibleDatabaseVersion,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2692 "The version of the database schema (" +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2693 boost::lexical_cast<std::string>(currentVersion) +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2694 ") 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
2695 }
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2696
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2697 LOG(WARNING) << "Upgrading the database from schema version "
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2698 << currentVersion << " to " << ORTHANC_DATABASE_VERSION;
1869
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2699
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2700 try
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2701 {
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2702 database.Upgrade(ORTHANC_DATABASE_VERSION, storageArea);
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2703 }
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2704 catch (OrthancException&)
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2705 {
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2706 LOG(ERROR) << "Unable to run the automated upgrade, please use the replication instructions: "
3135
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3126
diff changeset
2707 << "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
2708 throw;
9af3b492b010 invitation to replicate if upgrade fails
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1866
diff changeset
2709 }
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2710
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2711 // Sanity check
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2712 currentVersion = database.GetDatabaseVersion();
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2713 if (ORTHANC_DATABASE_VERSION != currentVersion)
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2714 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2715 throw OrthancException(ErrorCode_IncompatibleDatabaseVersion,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2716 "The database schema was not properly upgraded, it is still at version " +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2717 boost::lexical_cast<std::string>(currentVersion));
1669
a412ad57f0f9 refactoring of sample plugins, OrthancPluginReconstructMainDicomTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1668
diff changeset
2718 }
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2719 else
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2720 {
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2721 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
2722 << "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
2723 }
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2724 }
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2725
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2726
2941
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 namespace
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 class ServerContextConfigurator : public boost::noncopyable
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 private:
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2733 ServerContext& context_;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2734 OrthancPlugins* plugins_;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2735
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2736 public:
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2737 ServerContextConfigurator(ServerContext& context,
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2738 OrthancPlugins* plugins) :
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2739 context_(context),
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2740 plugins_(plugins)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2741 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2742 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2743 OrthancConfiguration::WriterLock lock;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2744 lock.GetConfiguration().SetServerIndex(context.GetIndex());
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2745 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2746
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2747 #if ORTHANC_ENABLE_PLUGINS == 1
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2748 if (plugins_ != NULL)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2749 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2750 plugins_->SetServerContext(context_);
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2751 context_.SetPlugins(*plugins_);
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2752 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2753 #endif
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2754 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2755
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2756 ~ServerContextConfigurator()
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2757 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2758 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2759 OrthancConfiguration::WriterLock lock;
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2760 lock.GetConfiguration().ResetServerIndex();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2761 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2762
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2763 #if ORTHANC_ENABLE_PLUGINS == 1
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2764 if (plugins_ != NULL)
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2765 {
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2766 plugins_->ResetServerContext();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2767 context_.ResetPlugins();
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2768 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2769 #endif
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2770 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2771 };
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2772 }
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2773
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2774
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2775 static bool ConfigureServerContext(IDatabaseWrapper& database,
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2776 IStorageArea& storageArea,
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2777 OrthancPlugins *plugins,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2778 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2779 {
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2780 size_t maxCompletedJobs;
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2781
2940
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 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
2784
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2785 // 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
2786 // 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
2787 // able to properly issue HTTP/HTTPS queries
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2788 HttpClient::ConfigureSsl(lock.GetConfiguration().GetBooleanParameter("HttpsVerifyPeers", true),
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2789 lock.GetConfiguration().InterpretStringParameterAsPath
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2790 (lock.GetConfiguration().GetStringParameter("HttpsCACertificates", "")));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2791 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
2792
6add197274b1 default value of HttpTimeout is now 60 seconds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3404
diff changeset
2793 // 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
2794 // 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
2795 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
2796
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2797 HttpClient::SetDefaultProxy(lock.GetConfiguration().GetStringParameter("HttpProxy", ""));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2798
3865
ff0718a4633a fix missing DicomAssociationParameters::SetDefaultTimeout()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3852
diff changeset
2799 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
2800
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2801 maxCompletedJobs = lock.GetConfiguration().GetUnsignedIntegerParameter("JobsHistorySize", 10);
3164
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2802
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2803 if (maxCompletedJobs == 0)
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2804 {
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2805 LOG(WARNING) << "Setting option \"JobsHistorySize\" to zero is not recommended";
b79ec21747a1 warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3139
diff changeset
2806 }
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2807 }
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2808
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2809 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
2810
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2811 {
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2812 OrthancConfiguration::ReaderLock lock;
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2946
diff changeset
2813
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2814 context.SetCompressionEnabled(lock.GetConfiguration().GetBooleanParameter("StorageCompression", false));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2815 context.SetStoreMD5ForAttachments(lock.GetConfiguration().GetBooleanParameter("StoreMD5ForAttachments", true));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2816
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2817 // 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
2818 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
2819
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2820 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2821 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2822 context.GetIndex().SetMaximumPatientCount(lock.GetConfiguration().GetUnsignedIntegerParameter("MaximumPatientCount", 0));
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2823 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2824 catch (...)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2825 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2826 context.GetIndex().SetMaximumPatientCount(0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2827 }
2825
8aa6aef11b70 New configuration option "OverwriteInstances" to choose how duplicate SOPInstanceUID are handled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2815
diff changeset
2828
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2829 try
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2830 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2831 uint64_t size = lock.GetConfiguration().GetUnsignedIntegerParameter("MaximumStorageSize", 0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2832 context.GetIndex().SetMaximumStorageSize(size * 1024 * 1024);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2833 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2834 catch (...)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2835 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2836 context.GetIndex().SetMaximumStorageSize(0);
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2837 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2838 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2839
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2840 {
2941
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2841 ServerContextConfigurator configurator(context, plugins);
2946
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2842
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2843 {
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2844 OrthancConfiguration::WriterLock lock;
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2845 lock.GetConfiguration().LoadModalitiesAndPeers();
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2846 }
2e751f615e03 new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2941
diff changeset
2847
2941
e292798f9980 OrthancConfiguration::SetServerIndex()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
2848 return ConfigureHttpHandler(context, plugins, loadJobsFromDatabase);
1675
131136aeeaa7 improved exception handling in the main program
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1672
diff changeset
2849 }
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2850 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2851
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2852
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2853 static bool ConfigureDatabase(IDatabaseWrapper& database,
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2854 IStorageArea& storageArea,
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2855 OrthancPlugins *plugins,
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2856 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2857 bool loadJobsFromDatabase)
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2858 {
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2859 database.Open();
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2860
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2861 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
2862
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2863 if (upgradeDatabase)
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2864 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2865 UpgradeDatabase(database, storageArea);
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2866 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
2867 }
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2868 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
2869 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2870 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
2871 "The database schema must be upgraded from version " +
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2872 boost::lexical_cast<std::string>(currentVersion) + " to " +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2873 boost::lexical_cast<std::string>(ORTHANC_DATABASE_VERSION) +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2952
diff changeset
2874 ": Please run Orthanc with the \"--upgrade\" argument");
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2875 }
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2876
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2877 bool success = ConfigureServerContext
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2878 (database, storageArea, plugins, loadJobsFromDatabase);
1672
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2879
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2880 database.Close();
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2881
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2882 return success;
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2883 }
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2884
4c5a85c3ff43 sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1669
diff changeset
2885
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2886 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
2887 char* argv[],
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2888 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2889 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2890 {
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3643
diff changeset
2891 std::unique_ptr<IDatabaseWrapper> databasePtr;
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3643
diff changeset
2892 std::unique_ptr<IStorageArea> storage;
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2893
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2894 #if ORTHANC_ENABLE_PLUGINS == 1
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2895 OrthancPlugins plugins;
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2896 plugins.SetCommandLineArguments(argc, argv);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2897 LoadPlugins(plugins);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2898
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2899 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
2900 if (plugins.HasDatabaseBackend())
1452
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 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
2903 database = &plugins.GetDatabaseBackend();
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2904 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2905 else
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2906 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2907 databasePtr.reset(CreateDatabaseWrapper());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2908 database = databasePtr.get();
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2909 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2910
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2911 if (plugins.HasStorageArea())
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2912 {
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2913 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
2914 storage.reset(plugins.CreateStorageArea());
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2915 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2916 else
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2917 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2903
diff changeset
2918 storage.reset(CreateStorageArea());
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2919 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2920
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2921 assert(database != NULL);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2922 assert(storage.get() != NULL);
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2923
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2924 return ConfigureDatabase(*database, *storage, &plugins,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2925 upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2926
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2927 #elif ORTHANC_ENABLE_PLUGINS == 0
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2928 // The plugins are disabled
3048
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2929
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2930 databasePtr.reset(CreateDatabaseWrapper());
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2931 storage.reset(CreateStorageArea());
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2932
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2933 assert(databasePtr.get() != NULL);
8b331be57606 fix build without plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
2934 assert(storage.get() != NULL);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2935
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2936 return ConfigureDatabase(*databasePtr, *storage, NULL,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2937 upgradeDatabase, loadJobsFromDatabase);
1455
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2938
a68545767975 Initialize() and Finalize() events in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1452
diff changeset
2939 #else
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2133
diff changeset
2940 # 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
2941 #endif
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2942 }
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2943
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2944
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2945 static bool StartOrthanc(int argc,
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2946 char* argv[],
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2947 bool upgradeDatabase,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2948 bool loadJobsFromDatabase)
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2949 {
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2950 return ConfigurePlugins(argc, argv, upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
2951 }
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
2952
893
f57802f8b4dc plugins for windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
2953
2079
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2954 static bool DisplayPerformanceWarning()
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2955 {
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2956 (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
2957 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
2958 return true;
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2959 }
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2960
acb4cd4af771 Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2069
diff changeset
2961
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2962 int main(int argc, char* argv[])
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2963 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
2964 Logging::Initialize();
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
2965
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
2966 bool upgradeDatabase = false;
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
2967 bool loadJobsFromDatabase = true;
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2968 const char* configurationFile = NULL;
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2969
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2970
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2971 /**
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2972 * Parse the command-line options.
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2973 **/
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
2974
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
2975 for (int i = 1; i < argc; i++)
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
2976 {
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2977 std::string argument(argv[i]);
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2978
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2979 if (argument.empty())
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2980 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2981 // Ignore empty arguments
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2982 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2983 else if (argument[0] != '-')
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2984 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2985 if (configurationFile != NULL)
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2986 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2987 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
2988 return -1;
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2989 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2990 else
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2991 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2992 // 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
2993 // the configuration file
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
2994
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
2995 // TODO WHAT IS THE ENCODING?
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2996 configurationFile = argv[i];
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2997 }
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
2998 }
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
2999 else if (argument == "--errors")
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3000 {
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3001 PrintErrors(argv[0]);
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3002 return 0;
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3003 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3004 else if (argument == "--help")
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3005 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3006 PrintHelp(argv[0]);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3007 return 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3008 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3009 else if (argument == "--version")
133
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3010 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3011 PrintVersion(argv[0]);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3012 return 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 128
diff changeset
3013 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3014 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
3015 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
3016 Logging::EnableInfoLevel(true);
137
0e97abc7b950 fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 136
diff changeset
3017 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3018 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
3019 {
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
3020 Logging::EnableTraceLevel(true);
137
0e97abc7b950 fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 136
diff changeset
3021 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3022 else if (boost::starts_with(argument, "--logdir="))
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3023 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3024 // TODO WHAT IS THE ENCODING?
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3025 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
3026
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3027 try
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3028 {
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3029 Logging::SetTargetFolder(directory);
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3030 }
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3031 catch (OrthancException&)
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3032 {
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3033 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
3034 << directory << ") is inexistent, aborting.";
1490
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3035 return -1;
596927722403 support of --logdir by the internal logger
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1489
diff changeset
3036 }
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3037 }
2015
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3038 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
3039 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3040 // 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
3041 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
3042
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3043 try
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3044 {
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3045 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
3046 }
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3047 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
3048 {
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3049 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
3050 << 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
3051 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
3052 }
bcc575732aef New option "--logfile" to output the Orthanc log to the given file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2010
diff changeset
3053 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3054 else if (argument == "--upgrade")
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3055 {
2299
03982a0db696 Fix issue #29 (more consistent handling of the "--upgrade" argument)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2295
diff changeset
3056 upgradeDatabase = true;
1615
c40fe92a68e7 Primitives to upgrade the database version in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1592
diff changeset
3057 }
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3058 else if (argument == "--no-jobs")
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3059 {
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3060 loadJobsFromDatabase = false;
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3061 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3062 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
3063 {
2018
300599489cab USE_BOOST_LOCALE_BACKENDS
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2015
diff changeset
3064 // TODO WHAT IS THE ENCODING?
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3065 std::string configurationSample;
4031
e3b3af80732d ServerResources, and moving EmbeddedResourceHttpHandler from Core to OrthancServer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4026
diff changeset
3066 GetFileResource(configurationSample, ServerResources::CONFIGURATION_SAMPLE);
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3067
684
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3068 #if defined(_WIN32)
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3069 // Replace UNIX newlines with DOS newlines
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3070 boost::replace_all(configurationSample, "\n", "\r\n");
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3071 #endif
96d8410c56cd newlines
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 657
diff changeset
3072
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3073 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
3074
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3075 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
3076 {
3526
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3077 if (target == "-")
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3078 {
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3079 // New in 1.5.8: Print to stdout
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3080 std::cout << configurationSample;
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3081 }
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3082 else
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3083 {
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3084 SystemToolbox::WriteFile(configurationSample, target);
f07352e0375c new configuration option ExecuteLuaEnabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3506
diff changeset
3085 }
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
3086 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
3087 }
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3088 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
3089 {
5465cab476cf Fix issue #45 (crash when providing a folder to "--config" command-line option)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2268
diff changeset
3090 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
3091 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
3092 }
175
662af781a227 sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 158
diff changeset
3093 }
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3094 else
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3095 {
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3096 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
3097 }
112
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3098 }
80ca409f232f logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 108
diff changeset
3099
1666
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3100
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3101 /**
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3102 * Launch Orthanc.
d7039be97eeb better command-line options handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1651
diff changeset
3103 **/
1102
ce6386b37afd avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
3104
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3105 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3106 std::string version(ORTHANC_VERSION);
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3107
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3108 if (std::string(ORTHANC_VERSION) == "mainline")
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3109 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3110 try
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3111 {
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2136
diff changeset
3112 boost::filesystem::path exe(SystemToolbox::GetPathToExecutable());
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3113 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
3114 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
3115 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
3116 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3117 catch (...)
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3118 {
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3119 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3120 }
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3121
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3122 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
3123 assert(DisplayPerformanceWarning());
4009
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3124
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3125 std::string s = "Architecture: ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3126 if (sizeof(void*) == 4)
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3127 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3128 s += "32-bit, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3129 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3130 else if (sizeof(void*) == 8)
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3131 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3132 s += "64-bit, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3133 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3134 else
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3135 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3136 s += "unsupported pointer size, ";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3137 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3138
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3139 switch (Toolbox::DetectEndianness())
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3140 {
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3141 case Endianness_Little:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3142 s += "little endian";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3143 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3144
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3145 case Endianness_Big:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3146 s += "big endian";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3147 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3148
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3149 default:
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3150 s += "unsupported endianness";
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3151 break;
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3152 }
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3153
16978ee28588 print info about cpu architecture
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3920
diff changeset
3154 LOG(INFO) << s;
1866
579bf74f7da1 output creation time for mainline builds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1851
diff changeset
3155 }
1102
ce6386b37afd avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
3156
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3157 int status = 0;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3158 try
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3159 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3160 for (;;)
270
e6a4c4329481 parameters for storage capacity
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 236
diff changeset
3161 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3162 OrthancInitialize(configurationFile);
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3163
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
3164 bool restart = StartOrthanc(argc, argv, upgradeDatabase, loadJobsFromDatabase);
1452
b737acb13da5 refactoring of the main function
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
3165 if (restart)
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3166 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3167 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
3168 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
3169 Logging::Reset();
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3170 }
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3171 else
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3172 {
1103
bec1eccf976c Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1102
diff changeset
3173 break;
23
62bd05fe4b7c support for ssl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 19
diff changeset
3174 }
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3175 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3176 }
1245
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3177 catch (const OrthancException& e)
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3178 {
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3179 LOG(ERROR) << "Uncaught exception, stopping now: [" << e.What() << "] (code " << e.GetErrorCode() << ")";
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3180 #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
3181 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
3182 {
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3183 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
3184 }
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3185 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
3186 {
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3187 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
3188 }
e2675b37eb01 Under Windows, the exit status of Orthanc corresponds to the encountered error code
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1733
diff changeset
3189
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3190 #else
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3191 status = -1;
1733
e1f5ab395297 PrintErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1730
diff changeset
3192 #endif
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3193 }
1245
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3194 catch (const std::exception& e)
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3195 {
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3196 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
3197 status = -1;
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3198 }
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3199 catch (const std::string& s)
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3200 {
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3201 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
3202 status = -1;
aea9277dee75 catch more exceptions (patch from Valdas Rapsevicius)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1232
diff changeset
3203 }
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3204 catch (...)
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3205 {
1223
5bd4c9f85b4c fix race condition while unregistering plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1210
diff changeset
3206 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
3207 status = -1;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3208 }
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3209
690
2e67366aab83 case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
3210 LOG(WARNING) << "Orthanc has stopped";
2e67366aab83 case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
3211
4026
05a363186da6 ORTHANC_BUILDING_FRAMEWORK_LIBRARY, Orthanc::InitializeFramework()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4009
diff changeset
3212 OrthancFinalize();
1485
27661b33f624 Creation of Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1455
diff changeset
3213
291
4d7469f72a0b embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 270
diff changeset
3214 return status;
0
3959d33612cc initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3215 }