Mercurial > hg > orthanc
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 } |