# HG changeset patch # User Sebastien Jodogne # Date 1647949044 -3600 # Node ID 60cb4b379485f626f1becf03251eb3db8447f56a # Parent 15ce7af202f1a51daf6dadd2761e8c74ba89e4e8 added FromDcmtkBridge::LookupStringValue() diff -r 15ce7af202f1 -r 60cb4b379485 OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp --- a/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp Tue Mar 22 10:20:25 2022 +0100 +++ b/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp Tue Mar 22 12:37:24 2022 +0100 @@ -3226,6 +3226,49 @@ IDicomPathVisitor::Apply(visitor, dataset, path); return visitor.HasFound(); } + + + bool FromDcmtkBridge::LookupStringValue(std::string& target, + DcmDataset& dataset, + const DicomTag& key) + { + DcmTagKey dcmkey(key.GetGroup(), key.GetElement()); + + const char* str = NULL; + const Uint8* data = NULL; + unsigned long size = 0; + + if (dataset.findAndGetString(dcmkey, str).good() && + str != NULL) + { + target.assign(str); + return true; + } + else if (dataset.findAndGetUint8Array(dcmkey, data, &size).good() && + data != NULL && + size > 0) + { + /** + * This special case is necessary for borderline DICOM files + * that have DICOM tags have the "UN" value representation. New + * in Orthanc 1.10.1. + * https://groups.google.com/g/orthanc-users/c/86fobx3ZyoM/m/KBG17un6AQAJ + **/ + unsigned long l = 0; + while (l < size && + data[l] != 0) + { + l++; + } + + target.assign(reinterpret_cast(data), l); + return true; + } + else + { + return false; + } + } } diff -r 15ce7af202f1 -r 60cb4b379485 OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h --- a/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h Tue Mar 22 10:20:25 2022 +0100 +++ b/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h Tue Mar 22 12:37:24 2022 +0100 @@ -283,5 +283,9 @@ DcmDataset& dataset, const DicomPath& path, size_t sequenceIndex); + + static bool LookupStringValue(std::string& target, + DcmDataset& dataset, + const DicomTag& key); }; } diff -r 15ce7af202f1 -r 60cb4b379485 OrthancFramework/Sources/DicomParsing/IDicomTranscoder.cpp --- a/OrthancFramework/Sources/DicomParsing/IDicomTranscoder.cpp Tue Mar 22 10:20:25 2022 +0100 +++ b/OrthancFramework/Sources/DicomParsing/IDicomTranscoder.cpp Tue Mar 22 12:37:24 2022 +0100 @@ -75,13 +75,11 @@ } DcmDataset& dataset = *dicom.getDataset(); - - const char* v = NULL; - if (dataset.findAndGetString(DCM_SOPInstanceUID, v).good() && - v != NULL) + std::string s; + if (FromDcmtkBridge::LookupStringValue(s, dataset, DICOM_TAG_SOP_INSTANCE_UID)) { - return std::string(v); + return s; } else {