Mercurial > hg > orthanc
diff OrthancServer/ServerJobs/ResourceModificationJob.cpp @ 3948:3d2fc1b5cc8c transcoding
ResourceModificationJob: Fix the SOP instance UID to preserve references
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 19 May 2020 17:23:30 +0200 |
parents | 0b3256c3ee14 |
children | 5fe8c6d3212e |
line wrap: on
line diff
--- a/OrthancServer/ServerJobs/ResourceModificationJob.cpp Tue May 19 16:19:05 2020 +0200 +++ b/OrthancServer/ServerJobs/ResourceModificationJob.cpp Tue May 19 17:23:30 2020 +0200 @@ -39,6 +39,8 @@ #include "../ServerContext.h" #include <dcmtk/dcmdata/dcfilefo.h> +#include <dcmtk/dcmdata/dcdeftag.h> +#include <cassert> namespace Orthanc { @@ -173,6 +175,8 @@ modification_->Apply(*modified); + const std::string modifiedUid = IDicomTranscoder::GetSopInstanceUid(modified->GetDcmtkObject()); + if (transcode_) { std::set<DicomTransferSyntax> syntaxes; @@ -186,6 +190,17 @@ if (GetContext().Transcode(transcoded, hasSopInstanceUidChanged, source, syntaxes, true)) { modified.reset(transcoded.ReleaseAsParsedDicomFile()); + + // Fix the SOP instance UID in order the preserve the + // references between instance UIDs in the DICOM hierarchy + // (the UID might have changed in the case of lossy transcoding) + if (modified.get() == NULL || + modified->GetDcmtkObject().getDataset() == NULL || + !modified->GetDcmtkObject().getDataset()->putAndInsertString( + DCM_SOPInstanceUID, modifiedUid.c_str(), OFTrue /* replace */).good()) + { + throw OrthancException(ErrorCode_InternalError); + } } else { @@ -194,6 +209,8 @@ } } + assert(modifiedUid == IDicomTranscoder::GetSopInstanceUid(modified->GetDcmtkObject())); + DicomInstanceToStore toStore; toStore.SetOrigin(origin_); toStore.SetParsedDicomFile(*modified);