Mercurial > hg > orthanc
comparison OrthancServer/ServerJobs/DicomModalityStoreJob.cpp @ 3920:82e88ff003d7 c-get
merge default -> c-get
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Tue, 12 May 2020 14:58:24 +0200 |
parents | 8f7ad4989fec |
children |
comparison
equal
deleted
inserted
replaced
3918:dba48c162b7b | 3920:82e88ff003d7 |
---|---|
33 | 33 |
34 #include "../PrecompiledHeadersServer.h" | 34 #include "../PrecompiledHeadersServer.h" |
35 #include "DicomModalityStoreJob.h" | 35 #include "DicomModalityStoreJob.h" |
36 | 36 |
37 #include "../../Core/Compatibility.h" | 37 #include "../../Core/Compatibility.h" |
38 #include "../../Core/DicomNetworking/DicomAssociation.h" | |
38 #include "../../Core/Logging.h" | 39 #include "../../Core/Logging.h" |
39 #include "../../Core/SerializationToolbox.h" | 40 #include "../../Core/SerializationToolbox.h" |
40 #include "../ServerContext.h" | 41 #include "../ServerContext.h" |
41 #include "../StorageCommitmentReports.h" | 42 #include "../StorageCommitmentReports.h" |
42 | 43 |
45 { | 46 { |
46 void DicomModalityStoreJob::OpenConnection() | 47 void DicomModalityStoreJob::OpenConnection() |
47 { | 48 { |
48 if (connection_.get() == NULL) | 49 if (connection_.get() == NULL) |
49 { | 50 { |
50 connection_.reset(new DicomUserConnection(localAet_, remote_)); | 51 connection_.reset(new DicomStoreUserConnection(parameters_)); |
51 } | 52 } |
52 } | 53 } |
53 | 54 |
54 | 55 |
55 bool DicomModalityStoreJob::HandleInstance(const std::string& instance) | 56 bool DicomModalityStoreJob::HandleInstance(const std::string& instance) |
56 { | 57 { |
57 assert(IsStarted()); | 58 assert(IsStarted()); |
58 OpenConnection(); | 59 OpenConnection(); |
59 | 60 |
60 LOG(INFO) << "Sending instance " << instance << " to modality \"" | 61 LOG(INFO) << "Sending instance " << instance << " to modality \"" |
61 << remote_.GetApplicationEntityTitle() << "\""; | 62 << parameters_.GetRemoteModality().GetApplicationEntityTitle() << "\""; |
62 | 63 |
63 std::string dicom; | 64 std::string dicom; |
64 | 65 |
65 try | 66 try |
66 { | 67 { |
71 LOG(WARNING) << "An instance was removed after the job was issued: " << instance; | 72 LOG(WARNING) << "An instance was removed after the job was issued: " << instance; |
72 return false; | 73 return false; |
73 } | 74 } |
74 | 75 |
75 std::string sopClassUid, sopInstanceUid; | 76 std::string sopClassUid, sopInstanceUid; |
76 | 77 context_.StoreWithTranscoding(sopClassUid, sopInstanceUid, *connection_, dicom, |
77 if (HasMoveOriginator()) | 78 HasMoveOriginator(), moveOriginatorAet_, moveOriginatorId_); |
78 { | |
79 connection_->Store(sopClassUid, sopInstanceUid, dicom, moveOriginatorAet_, moveOriginatorId_); | |
80 } | |
81 else | |
82 { | |
83 connection_->Store(sopClassUid, sopInstanceUid, dicom); | |
84 } | |
85 | 79 |
86 if (storageCommitment_) | 80 if (storageCommitment_) |
87 { | 81 { |
88 sopClassUids_.push_back(sopClassUid); | 82 sopClassUids_.push_back(sopClassUid); |
89 sopInstanceUids_.push_back(sopInstanceUid); | 83 sopInstanceUids_.push_back(sopInstanceUid); |
94 throw OrthancException(ErrorCode_InternalError); | 88 throw OrthancException(ErrorCode_InternalError); |
95 } | 89 } |
96 | 90 |
97 if (sopClassUids_.size() == GetInstancesCount()) | 91 if (sopClassUids_.size() == GetInstancesCount()) |
98 { | 92 { |
99 const std::string& remoteAet = remote_.GetApplicationEntityTitle(); | 93 assert(IsStarted()); |
94 connection_.reset(NULL); | |
95 | |
96 const std::string& remoteAet = parameters_.GetRemoteModality().GetApplicationEntityTitle(); | |
100 | 97 |
101 LOG(INFO) << "Sending storage commitment request to modality: " << remoteAet; | 98 LOG(INFO) << "Sending storage commitment request to modality: " << remoteAet; |
102 | 99 |
103 // Create a "pending" storage commitment report BEFORE the | 100 // Create a "pending" storage commitment report BEFORE the |
104 // actual SCU call in order to avoid race conditions | 101 // actual SCU call in order to avoid race conditions |
105 context_.GetStorageCommitmentReports().Store( | 102 context_.GetStorageCommitmentReports().Store( |
106 transactionUid_, new StorageCommitmentReports::Report(remoteAet)); | 103 transactionUid_, new StorageCommitmentReports::Report(remoteAet)); |
107 | 104 |
108 assert(IsStarted()); | |
109 OpenConnection(); | |
110 | |
111 std::vector<std::string> a(sopClassUids_.begin(), sopClassUids_.end()); | 105 std::vector<std::string> a(sopClassUids_.begin(), sopClassUids_.end()); |
112 std::vector<std::string> b(sopInstanceUids_.begin(), sopInstanceUids_.end()); | 106 std::vector<std::string> b(sopInstanceUids_.begin(), sopInstanceUids_.end()); |
113 connection_->RequestStorageCommitment(transactionUid_, a, b); | 107 |
108 DicomAssociation::RequestStorageCommitment(parameters_, transactionUid_, a, b); | |
114 } | 109 } |
115 } | 110 } |
116 | 111 |
117 //boost::this_thread::sleep(boost::posix_time::milliseconds(500)); | 112 //boost::this_thread::sleep(boost::posix_time::milliseconds(500)); |
118 | 113 |
126 } | 121 } |
127 | 122 |
128 | 123 |
129 DicomModalityStoreJob::DicomModalityStoreJob(ServerContext& context) : | 124 DicomModalityStoreJob::DicomModalityStoreJob(ServerContext& context) : |
130 context_(context), | 125 context_(context), |
131 localAet_("ORTHANC"), | |
132 moveOriginatorId_(0), // By default, not a C-MOVE | 126 moveOriginatorId_(0), // By default, not a C-MOVE |
133 storageCommitment_(false) // By default, no storage commitment | 127 storageCommitment_(false) // By default, no storage commitment |
134 { | 128 { |
135 ResetStorageCommitment(); | 129 ResetStorageCommitment(); |
136 } | 130 } |
142 { | 136 { |
143 throw OrthancException(ErrorCode_BadSequenceOfCalls); | 137 throw OrthancException(ErrorCode_BadSequenceOfCalls); |
144 } | 138 } |
145 else | 139 else |
146 { | 140 { |
147 localAet_ = aet; | 141 parameters_.SetLocalApplicationEntityTitle(aet); |
148 } | 142 } |
149 } | 143 } |
150 | 144 |
151 | 145 |
152 void DicomModalityStoreJob::SetRemoteModality(const RemoteModalityParameters& remote) | 146 void DicomModalityStoreJob::SetRemoteModality(const RemoteModalityParameters& remote) |
155 { | 149 { |
156 throw OrthancException(ErrorCode_BadSequenceOfCalls); | 150 throw OrthancException(ErrorCode_BadSequenceOfCalls); |
157 } | 151 } |
158 else | 152 else |
159 { | 153 { |
160 remote_ = remote; | 154 parameters_.SetRemoteModality(remote); |
161 } | 155 } |
162 } | 156 } |
163 | 157 |
164 | 158 |
159 void DicomModalityStoreJob::SetTimeout(uint32_t seconds) | |
160 { | |
161 if (IsStarted()) | |
162 { | |
163 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
164 } | |
165 else | |
166 { | |
167 parameters_.SetTimeout(seconds); | |
168 } | |
169 } | |
170 | |
171 | |
165 const std::string& DicomModalityStoreJob::GetMoveOriginatorAet() const | 172 const std::string& DicomModalityStoreJob::GetMoveOriginatorAet() const |
166 { | 173 { |
167 if (HasMoveOriginator()) | 174 if (HasMoveOriginator()) |
168 { | 175 { |
169 return moveOriginatorAet_; | 176 return moveOriginatorAet_; |
247 | 254 |
248 void DicomModalityStoreJob::GetPublicContent(Json::Value& value) | 255 void DicomModalityStoreJob::GetPublicContent(Json::Value& value) |
249 { | 256 { |
250 SetOfInstancesJob::GetPublicContent(value); | 257 SetOfInstancesJob::GetPublicContent(value); |
251 | 258 |
252 value["LocalAet"] = localAet_; | 259 value["LocalAet"] = parameters_.GetLocalApplicationEntityTitle(); |
253 value["RemoteAet"] = remote_.GetApplicationEntityTitle(); | 260 value["RemoteAet"] = parameters_.GetRemoteModality().GetApplicationEntityTitle(); |
254 | 261 |
255 if (HasMoveOriginator()) | 262 if (HasMoveOriginator()) |
256 { | 263 { |
257 value["MoveOriginatorAET"] = GetMoveOriginatorAet(); | 264 value["MoveOriginatorAET"] = GetMoveOriginatorAet(); |
258 value["MoveOriginatorID"] = GetMoveOriginatorId(); | 265 value["MoveOriginatorID"] = GetMoveOriginatorId(); |
263 value["StorageCommitmentTransactionUID"] = transactionUid_; | 270 value["StorageCommitmentTransactionUID"] = transactionUid_; |
264 } | 271 } |
265 } | 272 } |
266 | 273 |
267 | 274 |
268 static const char* LOCAL_AET = "LocalAet"; | |
269 static const char* REMOTE = "Remote"; | |
270 static const char* MOVE_ORIGINATOR_AET = "MoveOriginatorAet"; | 275 static const char* MOVE_ORIGINATOR_AET = "MoveOriginatorAet"; |
271 static const char* MOVE_ORIGINATOR_ID = "MoveOriginatorId"; | 276 static const char* MOVE_ORIGINATOR_ID = "MoveOriginatorId"; |
272 static const char* STORAGE_COMMITMENT = "StorageCommitment"; | 277 static const char* STORAGE_COMMITMENT = "StorageCommitment"; |
273 | 278 |
274 | 279 |
275 DicomModalityStoreJob::DicomModalityStoreJob(ServerContext& context, | 280 DicomModalityStoreJob::DicomModalityStoreJob(ServerContext& context, |
276 const Json::Value& serialized) : | 281 const Json::Value& serialized) : |
277 SetOfInstancesJob(serialized), | 282 SetOfInstancesJob(serialized), |
278 context_(context) | 283 context_(context) |
279 { | 284 { |
280 localAet_ = SerializationToolbox::ReadString(serialized, LOCAL_AET); | |
281 remote_ = RemoteModalityParameters(serialized[REMOTE]); | |
282 moveOriginatorAet_ = SerializationToolbox::ReadString(serialized, MOVE_ORIGINATOR_AET); | 285 moveOriginatorAet_ = SerializationToolbox::ReadString(serialized, MOVE_ORIGINATOR_AET); |
283 moveOriginatorId_ = static_cast<uint16_t> | 286 moveOriginatorId_ = static_cast<uint16_t> |
284 (SerializationToolbox::ReadUnsignedInteger(serialized, MOVE_ORIGINATOR_ID)); | 287 (SerializationToolbox::ReadUnsignedInteger(serialized, MOVE_ORIGINATOR_ID)); |
285 EnableStorageCommitment(SerializationToolbox::ReadBoolean(serialized, STORAGE_COMMITMENT)); | 288 EnableStorageCommitment(SerializationToolbox::ReadBoolean(serialized, STORAGE_COMMITMENT)); |
289 | |
290 parameters_ = DicomAssociationParameters::UnserializeJob(serialized); | |
286 } | 291 } |
287 | 292 |
288 | 293 |
289 bool DicomModalityStoreJob::Serialize(Json::Value& target) | 294 bool DicomModalityStoreJob::Serialize(Json::Value& target) |
290 { | 295 { |
292 { | 297 { |
293 return false; | 298 return false; |
294 } | 299 } |
295 else | 300 else |
296 { | 301 { |
297 target[LOCAL_AET] = localAet_; | 302 parameters_.SerializeJob(target); |
298 remote_.Serialize(target[REMOTE], true /* force advanced format */); | |
299 target[MOVE_ORIGINATOR_AET] = moveOriginatorAet_; | 303 target[MOVE_ORIGINATOR_AET] = moveOriginatorAet_; |
300 target[MOVE_ORIGINATOR_ID] = moveOriginatorId_; | 304 target[MOVE_ORIGINATOR_ID] = moveOriginatorId_; |
301 target[STORAGE_COMMITMENT] = storageCommitment_; | 305 target[STORAGE_COMMITMENT] = storageCommitment_; |
302 return true; | 306 return true; |
303 } | 307 } |