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 }