Mercurial > hg > orthanc
diff Core/DicomNetworking/DicomStoreUserConnection.cpp @ 3862:594263db316a transcoding
DicomModalityStoreJob now uses DicomStoreUserConnection
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 27 Apr 2020 17:28:55 +0200 |
parents | 83ea6939293d |
children | d5be23fc0106 |
line wrap: on
line diff
--- a/Core/DicomNetworking/DicomStoreUserConnection.cpp Mon Apr 27 15:56:20 2020 +0200 +++ b/Core/DicomNetworking/DicomStoreUserConnection.cpp Mon Apr 27 17:28:55 2020 +0200 @@ -116,16 +116,31 @@ return false; } + + + void DicomStoreUserConnection::Setup() + { + association_.reset(new DicomAssociation); + proposeCommonClasses_ = true; + proposeUncompressedSyntaxes_ = true; + proposeRetiredBigEndian_ = false; + } DicomStoreUserConnection::DicomStoreUserConnection( + const std::string& localAet, + const RemoteModalityParameters& remote) : + parameters_(localAet, remote) + { + Setup(); + } + + + DicomStoreUserConnection::DicomStoreUserConnection( const DicomAssociationParameters& params) : - parameters_(params), - association_(new DicomAssociation), - proposeCommonClasses_(true), - proposeUncompressedSyntaxes_(true), - proposeRetiredBigEndian_(false) + parameters_(params) { + Setup(); } @@ -147,6 +162,32 @@ } + void DicomStoreUserConnection::LookupParameters(std::string& sopClassUid, + std::string& sopInstanceUid, + DicomTransferSyntax& transferSyntax, + DcmDataset& dataset) + { + OFString a, b; + if (!dataset.findAndGetOFString(DCM_SOPClassUID, a).good() || + !dataset.findAndGetOFString(DCM_SOPInstanceUID, b).good()) + { + throw OrthancException(ErrorCode_NoSopClassOrInstance, + "Unable to determine the SOP class/instance for C-STORE with AET " + + parameters_.GetRemoteApplicationEntityTitle()); + } + + sopClassUid.assign(a.c_str()); + sopInstanceUid.assign(b.c_str()); + + if (!FromDcmtkBridge::LookupOrthancTransferSyntax( + transferSyntax, dataset.getOriginalXfer())) + { + throw OrthancException(ErrorCode_InternalError, + "Unknown transfer syntax from DCMTK"); + } + } + + bool DicomStoreUserConnection::NegotiatePresentationContext( uint8_t& presentationContextId, const std::string& sopClassUid, @@ -163,8 +204,12 @@ } // The association must be re-negotiated - LOG(INFO) << "Re-negociating DICOM association with " - << parameters_.GetRemoteApplicationEntityTitle(); + if (association_->IsOpen()) + { + LOG(INFO) << "Re-negociating DICOM association with " + << parameters_.GetRemoteApplicationEntityTitle(); + } + association_->ClearPresentationContexts(); PrepareStorageClass(sopClassUid, transferSyntax); @@ -249,32 +294,18 @@ const std::string& moveOriginatorAET, uint16_t moveOriginatorID) { - OFString a, b; - if (!dataset.findAndGetOFString(DCM_SOPClassUID, a).good() || - !dataset.findAndGetOFString(DCM_SOPInstanceUID, b).good()) + DicomTransferSyntax transferSyntax; + LookupParameters(sopClassUid, sopInstanceUid, transferSyntax, dataset); + + uint8_t presID; + if (!NegotiatePresentationContext(presID, sopClassUid, transferSyntax)) { - throw OrthancException(ErrorCode_NoSopClassOrInstance, - "Unable to determine the SOP class/instance for C-STORE with AET " + - parameters_.GetRemoteApplicationEntityTitle()); - } - - sopClassUid.assign(a.c_str()); - sopInstanceUid.assign(b.c_str()); - - DicomTransferSyntax transferSyntax; - if (!FromDcmtkBridge::LookupOrthancTransferSyntax( - transferSyntax, dataset.getOriginalXfer())) - { - throw OrthancException(ErrorCode_InternalError, - "Unknown transfer syntax from DCMTK"); - } - - // Figure out which accepted presentation context should be used - uint8_t presID; - if (!NegotiatePresentationContext(presID, sopClassUid.c_str(), transferSyntax)) - { - throw OrthancException(ErrorCode_InternalError, - "No valid presentation context was negotiated upfront"); + throw OrthancException(ErrorCode_NetworkProtocol, + "No valid presentation context was negotiated for " + "SOP class UID [" + sopClassUid + "] and transfer " + "syntax [" + GetTransferSyntaxUid(transferSyntax) + "] " + "while sending to modality [" + + parameters_.GetRemoteApplicationEntityTitle() + "]"); } // Prepare the transmission of data @@ -338,6 +369,11 @@ const std::string& moveOriginatorAET, uint16_t moveOriginatorID) { + if (parsed.GetDcmtkObject().getDataset() == NULL) + { + throw OrthancException(ErrorCode_InternalError); + } + Store(sopClassUid, sopInstanceUid, *parsed.GetDcmtkObject().getDataset(), moveOriginatorAET, moveOriginatorID); } @@ -353,6 +389,12 @@ std::unique_ptr<DcmFileFormat> dicom( FromDcmtkBridge::LoadFromMemoryBuffer(buffer, size)); + if (dicom.get() == NULL || + dicom->getDataset() == NULL) + { + throw OrthancException(ErrorCode_InternalError); + } + Store(sopClassUid, sopInstanceUid, *dicom->getDataset(), moveOriginatorAET, moveOriginatorID); }