Mercurial > hg > orthanc
comparison OrthancServer/OrthancRestApi/OrthancRestModalities.cpp @ 2602:c25f1a52acbc jobs
reorganization
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 18 May 2018 15:34:11 +0200 |
parents | a3fdfb6979ed |
children | 714dcddeb65f |
comparison
equal
deleted
inserted
replaced
2601:5b6c3d77a2a1 | 2602:c25f1a52acbc |
---|---|
32 | 32 |
33 | 33 |
34 #include "../PrecompiledHeadersServer.h" | 34 #include "../PrecompiledHeadersServer.h" |
35 #include "OrthancRestApi.h" | 35 #include "OrthancRestApi.h" |
36 | 36 |
37 #include "../../Core/DicomParsing/FromDcmtkBridge.h" | |
38 #include "../../Core/Logging.h" | |
37 #include "../OrthancInitialization.h" | 39 #include "../OrthancInitialization.h" |
38 #include "../../Core/HttpClient.h" | |
39 #include "../../Core/Logging.h" | |
40 #include "../../Core/DicomParsing/FromDcmtkBridge.h" | |
41 #include "../Scheduler/ServerJob.h" | |
42 #include "../Scheduler/StoreScuCommand.h" | |
43 #include "../Scheduler/StorePeerCommand.h" | |
44 #include "../QueryRetrieveHandler.h" | 40 #include "../QueryRetrieveHandler.h" |
41 #include "../ServerJobs/DicomModalityStoreJob.h" | |
42 #include "../ServerJobs/OrthancPeerStoreJob.h" | |
45 #include "../ServerToolbox.h" | 43 #include "../ServerToolbox.h" |
46 | |
47 #include "../../Core/JobsEngine/SetOfInstancesJob.h" | |
48 | |
49 | |
50 namespace Orthanc | |
51 { | |
52 class DicomStoreJob : public SetOfInstancesJob | |
53 { | |
54 private: | |
55 ServerContext& context_; | |
56 std::string localAet_; | |
57 RemoteModalityParameters remote_; | |
58 std::string moveOriginatorAet_; | |
59 uint16_t moveOriginatorId_; | |
60 std::auto_ptr<DicomUserConnection> connection_; | |
61 | |
62 void OpenConnection() | |
63 { | |
64 if (connection_.get() == NULL) | |
65 { | |
66 connection_.reset(new DicomUserConnection); | |
67 connection_->SetLocalApplicationEntityTitle(localAet_); | |
68 connection_->SetRemoteModality(remote_); | |
69 } | |
70 } | |
71 | |
72 protected: | |
73 virtual bool HandleInstance(const std::string& instance) | |
74 { | |
75 OpenConnection(); | |
76 | |
77 LOG(INFO) << "Sending instance " << instance << " to modality \"" | |
78 << remote_.GetApplicationEntityTitle() << "\""; | |
79 | |
80 std::string dicom; | |
81 context_.ReadDicom(dicom, instance); | |
82 | |
83 if (HasMoveOriginator()) | |
84 { | |
85 connection_->Store(dicom, moveOriginatorAet_, moveOriginatorId_); | |
86 } | |
87 else | |
88 { | |
89 connection_->Store(dicom); | |
90 } | |
91 | |
92 //boost::this_thread::sleep(boost::posix_time::milliseconds(500)); | |
93 | |
94 return true; | |
95 } | |
96 | |
97 public: | |
98 DicomStoreJob(ServerContext& context) : | |
99 context_(context), | |
100 localAet_("ORTHANC"), | |
101 moveOriginatorId_(0) // By default, not a C-MOVE | |
102 { | |
103 } | |
104 | |
105 const std::string& GetLocalAet() const | |
106 { | |
107 return localAet_; | |
108 } | |
109 | |
110 void SetLocalAet(const std::string& aet) | |
111 { | |
112 if (IsStarted()) | |
113 { | |
114 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
115 } | |
116 else | |
117 { | |
118 localAet_ = aet; | |
119 } | |
120 } | |
121 | |
122 const RemoteModalityParameters& GetRemoteModality() const | |
123 { | |
124 return remote_; | |
125 } | |
126 | |
127 void SetRemoteModality(const RemoteModalityParameters& remote) | |
128 { | |
129 if (IsStarted()) | |
130 { | |
131 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
132 } | |
133 else | |
134 { | |
135 remote_ = remote; | |
136 } | |
137 } | |
138 | |
139 bool HasMoveOriginator() const | |
140 { | |
141 return moveOriginatorId_ != 0; | |
142 } | |
143 | |
144 const std::string& GetMoveOriginatorAet() const | |
145 { | |
146 if (HasMoveOriginator()) | |
147 { | |
148 return moveOriginatorAet_; | |
149 } | |
150 else | |
151 { | |
152 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
153 } | |
154 } | |
155 | |
156 uint16_t GetMoveOriginatorId() const | |
157 { | |
158 if (HasMoveOriginator()) | |
159 { | |
160 return moveOriginatorId_; | |
161 } | |
162 else | |
163 { | |
164 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
165 } | |
166 } | |
167 | |
168 void SetMoveOriginator(const std::string& aet, | |
169 int id) | |
170 { | |
171 if (IsStarted()) | |
172 { | |
173 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
174 } | |
175 else if (id < 0 || | |
176 id >= 65536) | |
177 { | |
178 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
179 } | |
180 else | |
181 { | |
182 moveOriginatorId_ = static_cast<uint16_t>(id); | |
183 moveOriginatorAet_ = aet; | |
184 } | |
185 } | |
186 | |
187 virtual void ReleaseResources() // For pausing jobs | |
188 { | |
189 connection_.reset(NULL); | |
190 } | |
191 | |
192 virtual void GetJobType(std::string& target) | |
193 { | |
194 target = "DicomStore"; | |
195 } | |
196 | |
197 virtual void GetPublicContent(Json::Value& value) | |
198 { | |
199 value["LocalAet"] = localAet_; | |
200 value["RemoteAet"] = remote_.GetApplicationEntityTitle(); | |
201 | |
202 if (HasMoveOriginator()) | |
203 { | |
204 value["MoveOriginatorAET"] = GetMoveOriginatorAet(); | |
205 value["MoveOriginatorID"] = GetMoveOriginatorId(); | |
206 } | |
207 | |
208 value["InstancesCount"] = static_cast<uint32_t>(GetInstances().size()); | |
209 value["FailedInstancesCount"] = static_cast<uint32_t>(GetFailedInstances().size()); | |
210 } | |
211 }; | |
212 | |
213 | |
214 class OrthancPeerStoreJob : public SetOfInstancesJob | |
215 { | |
216 private: | |
217 ServerContext& context_; | |
218 WebServiceParameters peer_; | |
219 std::auto_ptr<HttpClient> client_; | |
220 | |
221 protected: | |
222 virtual bool HandleInstance(const std::string& instance) | |
223 { | |
224 //boost::this_thread::sleep(boost::posix_time::milliseconds(500)); | |
225 | |
226 if (client_.get() == NULL) | |
227 { | |
228 client_.reset(new HttpClient(peer_, "instances")); | |
229 client_->SetMethod(HttpMethod_Post); | |
230 } | |
231 | |
232 LOG(INFO) << "Sending instance " << instance << " to peer \"" | |
233 << peer_.GetUrl() << "\""; | |
234 | |
235 context_.ReadDicom(client_->GetBody(), instance); | |
236 | |
237 std::string answer; | |
238 if (client_->Apply(answer)) | |
239 { | |
240 return true; | |
241 } | |
242 else | |
243 { | |
244 throw OrthancException(ErrorCode_NetworkProtocol); | |
245 } | |
246 } | |
247 | |
248 public: | |
249 OrthancPeerStoreJob(ServerContext& context) : | |
250 context_(context) | |
251 { | |
252 } | |
253 | |
254 void SetPeer(const WebServiceParameters& peer) | |
255 { | |
256 if (IsStarted()) | |
257 { | |
258 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
259 } | |
260 else | |
261 { | |
262 peer_ = peer; | |
263 } | |
264 } | |
265 | |
266 const WebServiceParameters& GetPeer() const | |
267 { | |
268 return peer_; | |
269 } | |
270 | |
271 virtual void ReleaseResources() // For pausing jobs | |
272 { | |
273 client_.reset(NULL); | |
274 } | |
275 | |
276 virtual void GetJobType(std::string& target) | |
277 { | |
278 target = "OrthancPeerStore"; | |
279 } | |
280 | |
281 virtual void GetPublicContent(Json::Value& value) | |
282 { | |
283 Json::Value v; | |
284 peer_.ToJson(v); | |
285 value["Peer"] = v; | |
286 | |
287 value["InstancesCount"] = static_cast<uint32_t>(GetInstances().size()); | |
288 value["FailedInstancesCount"] = static_cast<uint32_t>(GetFailedInstances().size()); | |
289 } | |
290 }; | |
291 } | |
292 | |
293 | |
294 | 44 |
295 | 45 |
296 namespace Orthanc | 46 namespace Orthanc |
297 { | 47 { |
298 /*************************************************************************** | 48 /*************************************************************************** |
1015 int moveOriginatorID = Toolbox::GetJsonIntegerField | 765 int moveOriginatorID = Toolbox::GetJsonIntegerField |
1016 (request, "MoveOriginatorID", 0 /* By default, not a C-MOVE */); | 766 (request, "MoveOriginatorID", 0 /* By default, not a C-MOVE */); |
1017 | 767 |
1018 RemoteModalityParameters p = Configuration::GetModalityUsingSymbolicName(remote); | 768 RemoteModalityParameters p = Configuration::GetModalityUsingSymbolicName(remote); |
1019 | 769 |
1020 std::auto_ptr<DicomStoreJob> job(new DicomStoreJob(context)); | 770 std::auto_ptr<DicomModalityStoreJob> job(new DicomModalityStoreJob(context)); |
1021 job->SetLocalAet(localAet); | 771 job->SetLocalAet(localAet); |
1022 job->SetRemoteModality(p); | 772 job->SetRemoteModality(p); |
1023 | 773 |
1024 if (moveOriginatorID != 0) | 774 if (moveOriginatorID != 0) |
1025 { | 775 { |