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 {