Mercurial > hg > orthanc
comparison OrthancServer/OrthancMoveRequestHandler.cpp @ 2625:5469dda691cd jobs
new configuration option: SynchronousCMove
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 25 May 2018 10:54:33 +0200 |
parents | 714dcddeb65f |
children | 00504dcc996f |
comparison
equal
deleted
inserted
replaced
2624:714dcddeb65f | 2625:5469dda691cd |
---|---|
58 uint16_t originatorId_; | 58 uint16_t originatorId_; |
59 std::auto_ptr<DicomUserConnection> connection_; | 59 std::auto_ptr<DicomUserConnection> connection_; |
60 | 60 |
61 public: | 61 public: |
62 SynchronousMove(ServerContext& context, | 62 SynchronousMove(ServerContext& context, |
63 const std::string& aet, | 63 const std::string& targetAet, |
64 const std::string& publicId, | 64 const std::string& publicId, |
65 const std::string& originatorAet, | 65 const std::string& originatorAet, |
66 uint16_t originatorId) : | 66 uint16_t originatorId) : |
67 context_(context), | 67 context_(context), |
68 localAet_(context.GetDefaultLocalApplicationEntityTitle()), | 68 localAet_(context.GetDefaultLocalApplicationEntityTitle()), |
69 position_(0), | 69 position_(0), |
70 originatorAet_(originatorAet), | 70 originatorAet_(originatorAet), |
71 originatorId_(originatorId) | 71 originatorId_(originatorId) |
72 { | 72 { |
73 LOG(INFO) << "Sending resource " << publicId << " to modality \"" << aet << "\""; | 73 LOG(INFO) << "Sending resource " << publicId << " to modality \"" << targetAet << "\""; |
74 | 74 |
75 std::list<std::string> tmp; | 75 std::list<std::string> tmp; |
76 context_.GetIndex().GetChildInstances(tmp, publicId); | 76 context_.GetIndex().GetChildInstances(tmp, publicId); |
77 | 77 |
78 instances_.reserve(tmp.size()); | 78 instances_.reserve(tmp.size()); |
79 for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); ++it) | 79 for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); ++it) |
80 { | 80 { |
81 instances_.push_back(*it); | 81 instances_.push_back(*it); |
82 } | 82 } |
83 | 83 |
84 remote_ = Configuration::GetModalityUsingAet(aet); | 84 remote_ = Configuration::GetModalityUsingAet(targetAet); |
85 } | 85 } |
86 | 86 |
87 virtual unsigned int GetSubOperationCount() const | 87 virtual unsigned int GetSubOperationCount() const |
88 { | 88 { |
89 return instances_.size(); | 89 return instances_.size(); |
120 std::auto_ptr<DicomModalityStoreJob> job_; | 120 std::auto_ptr<DicomModalityStoreJob> job_; |
121 size_t position_; | 121 size_t position_; |
122 | 122 |
123 public: | 123 public: |
124 AsynchronousMove(ServerContext& context, | 124 AsynchronousMove(ServerContext& context, |
125 const std::string& aet, | 125 const std::string& targetAet, |
126 const std::string& publicId, | 126 const std::string& publicId, |
127 const std::string& originatorAet, | 127 const std::string& originatorAet, |
128 uint16_t originatorId) : | 128 uint16_t originatorId) : |
129 context_(context), | 129 context_(context), |
130 job_(new DicomModalityStoreJob(context)), | 130 job_(new DicomModalityStoreJob(context)), |
131 position_(0) | 131 position_(0) |
132 { | 132 { |
133 LOG(INFO) << "Sending resource " << publicId << " to modality \"" << aet << "\""; | 133 LOG(INFO) << "Sending resource " << publicId << " to modality \"" << targetAet << "\""; |
134 | 134 |
135 job_->SetDescription("C-MOVE"); | 135 job_->SetDescription("C-MOVE"); |
136 job_->SetPermissive(true); | 136 job_->SetPermissive(true); |
137 job_->SetLocalAet(context.GetDefaultLocalApplicationEntityTitle()); | 137 job_->SetLocalAet(context.GetDefaultLocalApplicationEntityTitle()); |
138 job_->SetRemoteModality(Configuration::GetModalityUsingAet(aet)); | 138 job_->SetRemoteModality(Configuration::GetModalityUsingAet(targetAet)); |
139 | 139 |
140 if (originatorId != 0) | 140 if (originatorId != 0) |
141 { | 141 { |
142 job_->SetMoveOriginator(originatorAet, originatorId); | 142 job_->SetMoveOriginator(originatorAet, originatorId); |
143 } | 143 } |
230 return true; | 230 return true; |
231 } | 231 } |
232 } | 232 } |
233 | 233 |
234 | 234 |
235 static IMoveRequestIterator* CreateIterator(ServerContext& context, | |
236 const std::string& targetAet, | |
237 const std::string& publicId, | |
238 const std::string& originatorAet, | |
239 uint16_t originatorId) | |
240 { | |
241 bool synchronous = Configuration::GetGlobalBoolParameter("SynchronousCMove", false); | |
242 | |
243 if (synchronous) | |
244 { | |
245 return new SynchronousMove(context, targetAet, publicId, originatorAet, originatorId); | |
246 } | |
247 else | |
248 { | |
249 return new AsynchronousMove(context, targetAet, publicId, originatorAet, originatorId); | |
250 } | |
251 } | |
252 | |
253 | |
235 IMoveRequestIterator* OrthancMoveRequestHandler::Handle(const std::string& targetAet, | 254 IMoveRequestIterator* OrthancMoveRequestHandler::Handle(const std::string& targetAet, |
236 const DicomMap& input, | 255 const DicomMap& input, |
237 const std::string& originatorIp, | 256 const std::string& originatorIp, |
238 const std::string& originatorAet, | 257 const std::string& originatorAet, |
239 const std::string& calledAet, | 258 const std::string& calledAet, |
252 << " = " << query.GetElement(i).GetValue().GetContent(); | 271 << " = " << query.GetElement(i).GetValue().GetContent(); |
253 } | 272 } |
254 } | 273 } |
255 } | 274 } |
256 | 275 |
257 | |
258 /** | 276 /** |
259 * Retrieve the query level. | 277 * Retrieve the query level. |
260 **/ | 278 **/ |
261 | 279 |
262 const DicomValue* levelTmp = input.TestAndGetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL); | 280 const DicomValue* levelTmp = input.TestAndGetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL); |
276 if (LookupIdentifier(publicId, ResourceType_Instance, input) || | 294 if (LookupIdentifier(publicId, ResourceType_Instance, input) || |
277 LookupIdentifier(publicId, ResourceType_Series, input) || | 295 LookupIdentifier(publicId, ResourceType_Series, input) || |
278 LookupIdentifier(publicId, ResourceType_Study, input) || | 296 LookupIdentifier(publicId, ResourceType_Study, input) || |
279 LookupIdentifier(publicId, ResourceType_Patient, input)) | 297 LookupIdentifier(publicId, ResourceType_Patient, input)) |
280 { | 298 { |
281 return new AsynchronousMove(context_, targetAet, publicId, originatorAet, originatorId); | 299 return CreateIterator(context_, targetAet, publicId, originatorAet, originatorId); |
282 //return new SynchronousMove(context_, targetAet, publicId, originatorAet, originatorId); | |
283 } | 300 } |
284 else | 301 else |
285 { | 302 { |
286 // No identifier is present in the request. | 303 // No identifier is present in the request. |
287 throw OrthancException(ErrorCode_BadRequest); | 304 throw OrthancException(ErrorCode_BadRequest); |
298 | 315 |
299 std::string publicId; | 316 std::string publicId; |
300 | 317 |
301 if (LookupIdentifier(publicId, level, input)) | 318 if (LookupIdentifier(publicId, level, input)) |
302 { | 319 { |
303 return new AsynchronousMove(context_, targetAet, publicId, originatorAet, originatorId); | 320 return CreateIterator(context_, targetAet, publicId, originatorAet, originatorId); |
304 //return new SynchronousMove(context_, targetAet, publicId, originatorAet, originatorId); | |
305 } | 321 } |
306 else | 322 else |
307 { | 323 { |
308 throw OrthancException(ErrorCode_BadRequest); | 324 throw OrthancException(ErrorCode_BadRequest); |
309 } | 325 } |