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 }