comparison OrthancServer/OrthancMoveRequestHandler.cpp @ 2624:714dcddeb65f jobs

asynchronous c-movoe
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 24 May 2018 21:44:22 +0200
parents 5e2730c8e23c
children 5469dda691cd
comparison
equal deleted inserted replaced
2623:bd6e0b70e915 2624:714dcddeb65f
36 36
37 #include "OrthancInitialization.h" 37 #include "OrthancInitialization.h"
38 #include "../../Core/DicomParsing/FromDcmtkBridge.h" 38 #include "../../Core/DicomParsing/FromDcmtkBridge.h"
39 #include "../Core/DicomFormat/DicomArray.h" 39 #include "../Core/DicomFormat/DicomArray.h"
40 #include "../Core/Logging.h" 40 #include "../Core/Logging.h"
41 #include "ServerJobs/DicomModalityStoreJob.h"
41 42
42 namespace Orthanc 43 namespace Orthanc
43 { 44 {
44 namespace 45 namespace
45 { 46 {
46 // Anonymous namespace to avoid clashes between compilation modules 47 // Anonymous namespace to avoid clashes between compilation modules
47 48
48 class OrthancMoveRequestIterator : public IMoveRequestIterator 49 class SynchronousMove : public IMoveRequestIterator
49 { 50 {
50 private: 51 private:
51 ServerContext& context_; 52 ServerContext& context_;
52 const std::string& localAet_; 53 const std::string& localAet_;
53 std::vector<std::string> instances_; 54 std::vector<std::string> instances_;
56 std::string originatorAet_; 57 std::string originatorAet_;
57 uint16_t originatorId_; 58 uint16_t originatorId_;
58 std::auto_ptr<DicomUserConnection> connection_; 59 std::auto_ptr<DicomUserConnection> connection_;
59 60
60 public: 61 public:
61 OrthancMoveRequestIterator(ServerContext& context, 62 SynchronousMove(ServerContext& context,
62 const std::string& aet, 63 const std::string& aet,
63 const std::string& publicId, 64 const std::string& publicId,
64 const std::string& originatorAet, 65 const std::string& originatorAet,
65 uint16_t originatorId) : 66 uint16_t originatorId) :
66 context_(context), 67 context_(context),
67 localAet_(context.GetDefaultLocalApplicationEntityTitle()), 68 localAet_(context.GetDefaultLocalApplicationEntityTitle()),
68 position_(0), 69 position_(0),
69 originatorAet_(originatorAet), 70 originatorAet_(originatorAet),
70 originatorId_(originatorId) 71 originatorId_(originatorId)
106 } 107 }
107 108
108 connection_->Store(dicom, originatorAet_, originatorId_); 109 connection_->Store(dicom, originatorAet_, originatorId_);
109 110
110 return Status_Success; 111 return Status_Success;
112 }
113 };
114
115
116 class AsynchronousMove : public IMoveRequestIterator
117 {
118 private:
119 ServerContext& context_;
120 std::auto_ptr<DicomModalityStoreJob> job_;
121 size_t position_;
122
123 public:
124 AsynchronousMove(ServerContext& context,
125 const std::string& aet,
126 const std::string& publicId,
127 const std::string& originatorAet,
128 uint16_t originatorId) :
129 context_(context),
130 job_(new DicomModalityStoreJob(context)),
131 position_(0)
132 {
133 LOG(INFO) << "Sending resource " << publicId << " to modality \"" << aet << "\"";
134
135 job_->SetDescription("C-MOVE");
136 job_->SetPermissive(true);
137 job_->SetLocalAet(context.GetDefaultLocalApplicationEntityTitle());
138 job_->SetRemoteModality(Configuration::GetModalityUsingAet(aet));
139
140 if (originatorId != 0)
141 {
142 job_->SetMoveOriginator(originatorAet, originatorId);
143 }
144
145 std::list<std::string> tmp;
146 context_.GetIndex().GetChildInstances(tmp, publicId);
147
148 job_->Reserve(tmp.size());
149
150 for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); ++it)
151 {
152 job_->AddInstance(*it);
153 }
154 }
155
156 virtual unsigned int GetSubOperationCount() const
157 {
158 return 1;
159 }
160
161 virtual Status DoNext()
162 {
163 if (position_ == 0)
164 {
165 context_.GetJobsEngine().GetRegistry().Submit(job_.release(), 0 /* priority */);
166 return Status_Success;
167 }
168 else
169 {
170 return Status_Failure;
171 }
111 } 172 }
112 }; 173 };
113 } 174 }
114 175
115 176
215 if (LookupIdentifier(publicId, ResourceType_Instance, input) || 276 if (LookupIdentifier(publicId, ResourceType_Instance, input) ||
216 LookupIdentifier(publicId, ResourceType_Series, input) || 277 LookupIdentifier(publicId, ResourceType_Series, input) ||
217 LookupIdentifier(publicId, ResourceType_Study, input) || 278 LookupIdentifier(publicId, ResourceType_Study, input) ||
218 LookupIdentifier(publicId, ResourceType_Patient, input)) 279 LookupIdentifier(publicId, ResourceType_Patient, input))
219 { 280 {
220 return new OrthancMoveRequestIterator(context_, targetAet, publicId, originatorAet, originatorId); 281 return new AsynchronousMove(context_, targetAet, publicId, originatorAet, originatorId);
282 //return new SynchronousMove(context_, targetAet, publicId, originatorAet, originatorId);
221 } 283 }
222 else 284 else
223 { 285 {
224 // No identifier is present in the request. 286 // No identifier is present in the request.
225 throw OrthancException(ErrorCode_BadRequest); 287 throw OrthancException(ErrorCode_BadRequest);
236 298
237 std::string publicId; 299 std::string publicId;
238 300
239 if (LookupIdentifier(publicId, level, input)) 301 if (LookupIdentifier(publicId, level, input))
240 { 302 {
241 return new OrthancMoveRequestIterator(context_, targetAet, publicId, originatorAet, originatorId); 303 return new AsynchronousMove(context_, targetAet, publicId, originatorAet, originatorId);
304 //return new SynchronousMove(context_, targetAet, publicId, originatorAet, originatorId);
242 } 305 }
243 else 306 else
244 { 307 {
245 throw OrthancException(ErrorCode_BadRequest); 308 throw OrthancException(ErrorCode_BadRequest);
246 } 309 }