# HG changeset patch # User Sebastien Jodogne # Date 1523289556 -7200 # Node ID 6db878376018a99b6b4078e6d2293e790d8b824a # Parent b94ed97508e6e5dca850c90b6793aeb1198179e1 support anonymization of CurrentRequestedProcedureEvidenceSequence diff -r b94ed97508e6 -r 6db878376018 Core/DicomFormat/DicomTag.h --- a/Core/DicomFormat/DicomTag.h Thu Mar 29 16:14:10 2018 +0200 +++ b/Core/DicomFormat/DicomTag.h Mon Apr 09 17:59:16 2018 +0200 @@ -201,4 +201,6 @@ static const DicomTag DICOM_TAG_FRAME_OF_REFERENCE_UID(0x0020, 0x0052); static const DicomTag DICOM_TAG_REFERENCED_FRAME_OF_REFERENCE_UID(0x3006, 0x0024); static const DicomTag DICOM_TAG_RELATED_FRAME_OF_REFERENCE_UID(0x3006, 0x00c2); + static const DicomTag DICOM_TAG_CURRENT_REQUESTED_PROCEDURE_EVIDENCE_SEQUENCE(0x0040, 0xa375); + static const DicomTag DICOM_TAG_REFERENCED_SERIES_SEQUENCE(0x0008, 0x1115); } diff -r b94ed97508e6 -r 6db878376018 Core/DicomNetworking/DicomFindAnswers.cpp --- a/Core/DicomNetworking/DicomFindAnswers.cpp Thu Mar 29 16:14:10 2018 +0200 +++ b/Core/DicomNetworking/DicomFindAnswers.cpp Mon Apr 09 17:59:16 2018 +0200 @@ -125,7 +125,7 @@ void DicomFindAnswers::Add(ParsedDicomFile& dicom) { - AddAnswerInternal(dicom.Clone()); + AddAnswerInternal(dicom.Clone(true)); } void DicomFindAnswers::Add(const void* dicom, diff -r b94ed97508e6 -r 6db878376018 Core/DicomParsing/DicomModification.cpp --- a/Core/DicomParsing/DicomModification.cpp Thu Mar 29 16:14:10 2018 +0200 +++ b/Core/DicomParsing/DicomModification.cpp Mon Apr 09 17:59:16 2018 +0200 @@ -125,15 +125,33 @@ ValueRepresentation vr, const std::string& value) { - if ((tag == DICOM_TAG_FRAME_OF_REFERENCE_UID || - tag == DICOM_TAG_REFERENCED_FRAME_OF_REFERENCE_UID || - tag == DICOM_TAG_REFERENCED_SOP_INSTANCE_UID || - tag == DICOM_TAG_RELATED_FRAME_OF_REFERENCE_UID) && - IsEnabled(tag)) + if (!IsEnabled(tag)) + { + return Action_None; + } + else if (tag == DICOM_TAG_FRAME_OF_REFERENCE_UID || + tag == DICOM_TAG_REFERENCED_FRAME_OF_REFERENCE_UID || + tag == DICOM_TAG_REFERENCED_SOP_INSTANCE_UID || + tag == DICOM_TAG_RELATED_FRAME_OF_REFERENCE_UID) { newValue = that_.MapDicomIdentifier(Toolbox::StripSpaces(value), ResourceType_Instance); return Action_Replace; } + else if (parentTags.size() == 1 && + parentTags[0] == DICOM_TAG_CURRENT_REQUESTED_PROCEDURE_EVIDENCE_SEQUENCE && + tag == DICOM_TAG_STUDY_INSTANCE_UID) + { + newValue = that_.MapDicomIdentifier(Toolbox::StripSpaces(value), ResourceType_Study); + return Action_Replace; + } + else if (parentTags.size() == 2 && + parentTags[0] == DICOM_TAG_CURRENT_REQUESTED_PROCEDURE_EVIDENCE_SEQUENCE && + parentTags[1] == DICOM_TAG_REFERENCED_SERIES_SEQUENCE && + tag == DICOM_TAG_SERIES_INSTANCE_UID) + { + newValue = that_.MapDicomIdentifier(Toolbox::StripSpaces(value), ResourceType_Series); + return Action_Replace; + } else { return Action_None; diff -r b94ed97508e6 -r 6db878376018 Core/DicomParsing/ParsedDicomFile.cpp --- a/Core/DicomParsing/ParsedDicomFile.cpp Thu Mar 29 16:14:10 2018 +0200 +++ b/Core/DicomParsing/ParsedDicomFile.cpp Mon Apr 09 17:59:16 2018 +0200 @@ -1007,13 +1007,17 @@ } - ParsedDicomFile::ParsedDicomFile(ParsedDicomFile& other) : + ParsedDicomFile::ParsedDicomFile(ParsedDicomFile& other, + bool keepSopInstanceUid) : pimpl_(new PImpl) { pimpl_->file_.reset(dynamic_cast(other.pimpl_->file_->clone())); - // Create a new instance-level identifier - ReplacePlainString(DICOM_TAG_SOP_INSTANCE_UID, FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Instance)); + if (!keepSopInstanceUid) + { + // Create a new instance-level identifier + ReplacePlainString(DICOM_TAG_SOP_INSTANCE_UID, FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Instance)); + } } @@ -1041,9 +1045,9 @@ } - ParsedDicomFile* ParsedDicomFile::Clone() + ParsedDicomFile* ParsedDicomFile::Clone(bool keepSopInstanceUid) { - return new ParsedDicomFile(*this); + return new ParsedDicomFile(*this, keepSopInstanceUid); } diff -r b94ed97508e6 -r 6db878376018 Core/DicomParsing/ParsedDicomFile.h --- a/Core/DicomParsing/ParsedDicomFile.h Thu Mar 29 16:14:10 2018 +0200 +++ b/Core/DicomParsing/ParsedDicomFile.h Mon Apr 09 17:59:16 2018 +0200 @@ -75,7 +75,8 @@ struct PImpl; PImpl* pimpl_; - ParsedDicomFile(ParsedDicomFile& other); + ParsedDicomFile(ParsedDicomFile& other, + bool keepSopInstanceUid); void CreateFromDicomMap(const DicomMap& source, Encoding defaultEncoding); @@ -111,7 +112,7 @@ DcmFileFormat& GetDcmtkObject() const; - ParsedDicomFile* Clone(); + ParsedDicomFile* Clone(bool keepSopInstanceUid); #if ORTHANC_ENABLE_CIVETWEB == 1 || ORTHANC_ENABLE_MONGOOSE == 1 void SendPathValue(RestApiOutput& output, diff -r b94ed97508e6 -r 6db878376018 OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp Thu Mar 29 16:14:10 2018 +0200 +++ b/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp Mon Apr 09 17:59:16 2018 +0200 @@ -104,7 +104,7 @@ ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), id); - std::auto_ptr modified(locker.GetDicom().Clone()); + std::auto_ptr modified(locker.GetDicom().Clone(true)); modification.Apply(*modified); modified->Answer(call.GetOutput()); } @@ -162,7 +162,7 @@ * Compute the resulting DICOM instance. **/ - std::auto_ptr modified(original.Clone()); + std::auto_ptr modified(original.Clone(true)); modification.Apply(*modified); DicomInstanceToStore toStore; @@ -434,7 +434,7 @@ { for (Json::ArrayIndex i = 0; i < content.size(); i++) { - std::auto_ptr dicom(base.Clone()); + std::auto_ptr dicom(base.Clone(false)); const Json::Value* payload = NULL; if (content[i].type() == Json::stringValue) diff -r b94ed97508e6 -r 6db878376018 OrthancServer/Scheduler/ModifyInstanceCommand.cpp --- a/OrthancServer/Scheduler/ModifyInstanceCommand.cpp Thu Mar 29 16:14:10 2018 +0200 +++ b/OrthancServer/Scheduler/ModifyInstanceCommand.cpp Mon Apr 09 17:59:16 2018 +0200 @@ -95,7 +95,7 @@ { ServerContext::DicomCacheLocker lock(context_, *it); - modified.reset(lock.GetDicom().Clone()); + modified.reset(lock.GetDicom().Clone(true)); } modification_->Apply(*modified); diff -r b94ed97508e6 -r 6db878376018 UnitTestsSources/FromDcmtkTests.cpp --- a/UnitTestsSources/FromDcmtkTests.cpp Thu Mar 29 16:14:10 2018 +0200 +++ b/UnitTestsSources/FromDcmtkTests.cpp Mon Apr 09 17:59:16 2018 +0200 @@ -88,7 +88,7 @@ { char b[1024]; sprintf(b, "UnitTestsResults/anon%06d.dcm", i); - std::auto_ptr f(o.Clone()); + std::auto_ptr f(o.Clone(false)); if (i > 4) o.ReplacePlainString(DICOM_TAG_SERIES_INSTANCE_UID, "coucou"); m.Apply(*f);