Mercurial > hg > orthanc
comparison OrthancServer/DicomProtocol/DicomUserConnection.cpp @ 2222:21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 13 Dec 2016 14:34:33 +0100 |
parents | 9b373b7d6713 |
children | a3a65de1840f |
comparison
equal
deleted
inserted
replaced
2221:e7beca979562 | 2222:21713ce8717b |
---|---|
152 | 152 |
153 void CheckIsOpen() const; | 153 void CheckIsOpen() const; |
154 | 154 |
155 void Store(DcmInputStream& is, | 155 void Store(DcmInputStream& is, |
156 DicomUserConnection& connection, | 156 DicomUserConnection& connection, |
157 const std::string& moveOriginatorAET, | |
157 uint16_t moveOriginatorID); | 158 uint16_t moveOriginatorID); |
158 }; | 159 }; |
159 | 160 |
160 | 161 |
161 static void Check(const OFCondition& cond) | 162 static void Check(const OFCondition& cond) |
257 } | 258 } |
258 | 259 |
259 | 260 |
260 void DicomUserConnection::PImpl::Store(DcmInputStream& is, | 261 void DicomUserConnection::PImpl::Store(DcmInputStream& is, |
261 DicomUserConnection& connection, | 262 DicomUserConnection& connection, |
263 const std::string& moveOriginatorAET, | |
262 uint16_t moveOriginatorID) | 264 uint16_t moveOriginatorID) |
263 { | 265 { |
264 CheckIsOpen(); | 266 CheckIsOpen(); |
265 | 267 |
266 DcmFileFormat dcmff; | 268 DcmFileFormat dcmff; |
339 strncpy(request.AffectedSOPClassUID, sopClass, DIC_UI_LEN); | 341 strncpy(request.AffectedSOPClassUID, sopClass, DIC_UI_LEN); |
340 request.Priority = DIMSE_PRIORITY_MEDIUM; | 342 request.Priority = DIMSE_PRIORITY_MEDIUM; |
341 request.DataSetType = DIMSE_DATASET_PRESENT; | 343 request.DataSetType = DIMSE_DATASET_PRESENT; |
342 strncpy(request.AffectedSOPInstanceUID, sopInstance, DIC_UI_LEN); | 344 strncpy(request.AffectedSOPInstanceUID, sopInstance, DIC_UI_LEN); |
343 | 345 |
344 strncpy(request.MoveOriginatorApplicationEntityTitle, | 346 if (!moveOriginatorAET.empty()) |
345 connection.GetLocalApplicationEntityTitle().c_str(), DIC_AE_LEN); | 347 { |
346 request.opts = O_STORE_MOVEORIGINATORAETITLE; | 348 strncpy(request.MoveOriginatorApplicationEntityTitle, |
347 | 349 moveOriginatorAET.c_str(), DIC_AE_LEN); |
348 if (moveOriginatorID != 0) | 350 request.opts = O_STORE_MOVEORIGINATORAETITLE; |
349 { | 351 |
350 request.MoveOriginatorID = moveOriginatorID; // The type DIC_US is an alias for uint16_t | 352 request.MoveOriginatorID = moveOriginatorID; // The type DIC_US is an alias for uint16_t |
351 request.opts |= O_STORE_MOVEORIGINATORID; | 353 request.opts |= O_STORE_MOVEORIGINATORID; |
352 } | 354 } |
353 | 355 |
354 // Finally conduct transmission of data | 356 // Finally conduct transmission of data |
959 return pimpl_->IsOpen(); | 961 return pimpl_->IsOpen(); |
960 } | 962 } |
961 | 963 |
962 void DicomUserConnection::Store(const char* buffer, | 964 void DicomUserConnection::Store(const char* buffer, |
963 size_t size, | 965 size_t size, |
966 const std::string& moveOriginatorAET, | |
964 uint16_t moveOriginatorID) | 967 uint16_t moveOriginatorID) |
965 { | 968 { |
966 // Prepare an input stream for the memory buffer | 969 // Prepare an input stream for the memory buffer |
967 DcmInputBufferStream is; | 970 DcmInputBufferStream is; |
968 if (size > 0) | 971 if (size > 0) |
969 is.setBuffer(buffer, size); | 972 is.setBuffer(buffer, size); |
970 is.setEos(); | 973 is.setEos(); |
971 | 974 |
972 pimpl_->Store(is, *this, moveOriginatorID); | 975 pimpl_->Store(is, *this, moveOriginatorAET, moveOriginatorID); |
973 } | 976 } |
974 | 977 |
975 void DicomUserConnection::Store(const std::string& buffer, | 978 void DicomUserConnection::Store(const std::string& buffer, |
979 const std::string& moveOriginatorAET, | |
976 uint16_t moveOriginatorID) | 980 uint16_t moveOriginatorID) |
977 { | 981 { |
978 if (buffer.size() > 0) | 982 if (buffer.size() > 0) |
979 Store(reinterpret_cast<const char*>(&buffer[0]), buffer.size(), moveOriginatorID); | 983 Store(reinterpret_cast<const char*>(&buffer[0]), buffer.size(), moveOriginatorAET, moveOriginatorID); |
980 else | 984 else |
981 Store(NULL, 0, moveOriginatorID); | 985 Store(NULL, 0, moveOriginatorAET, moveOriginatorID); |
982 } | 986 } |
983 | 987 |
984 void DicomUserConnection::StoreFile(const std::string& path, | 988 void DicomUserConnection::StoreFile(const std::string& path, |
989 const std::string& moveOriginatorAET, | |
985 uint16_t moveOriginatorID) | 990 uint16_t moveOriginatorID) |
986 { | 991 { |
987 // Prepare an input stream for the file | 992 // Prepare an input stream for the file |
988 DcmInputFileStream is(path.c_str()); | 993 DcmInputFileStream is(path.c_str()); |
989 pimpl_->Store(is, *this, moveOriginatorID); | 994 pimpl_->Store(is, *this, moveOriginatorAET, moveOriginatorID); |
990 } | 995 } |
991 | 996 |
992 bool DicomUserConnection::Echo() | 997 bool DicomUserConnection::Echo() |
993 { | 998 { |
994 CheckIsOpen(); | 999 CheckIsOpen(); |