Mercurial > hg > orthanc
diff OrthancServer/FromDcmtkBridge.cpp @ 2129:0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 07 Nov 2016 17:44:10 +0100 |
parents | 03b065778fc3 |
children | bb199bccdc45 |
line wrap: on
line diff
--- a/OrthancServer/FromDcmtkBridge.cpp Mon Nov 07 15:13:16 2016 +0100 +++ b/OrthancServer/FromDcmtkBridge.cpp Mon Nov 07 17:44:10 2016 +0100 @@ -423,7 +423,7 @@ if (maxStringLength != 0 && utf8.size() > maxStringLength) { - return new DicomValue; // Create a NULL value + return new DicomValue; // Too long, create a NULL value } else { @@ -432,6 +432,47 @@ } } + + if (element.getVR() == EVR_UN) + { + // Unknown value representation: Lookup in the dictionary. This + // is notably the case for private tags registered with the + // "Dictionary" configuration option. + DictionaryLocker locker; + + const DcmDictEntry* entry = locker->findEntry(element.getTag().getXTag(), + element.getTag().getPrivateCreator()); + if (entry != NULL && + entry->getVR().isaString()) + { + Uint8* data = NULL; + + // At (*), we do not try and convert to UTF-8, as nothing says + // the encoding of the private tag is the same as that of the + // remaining of the DICOM dataset. Only go for ASCII strings. + + if (element.getUint8Array(data) == EC_Normal && + Toolbox::IsAsciiString(data, element.getLength())) // (*) + { + if (data == NULL) + { + return new DicomValue("", false); // Empty string + } + else if (maxStringLength != 0 && + element.getLength() > maxStringLength) + { + return new DicomValue; // Too long, create a NULL value + } + else + { + std::string s(reinterpret_cast<const char*>(data), element.getLength()); + return new DicomValue(s, false); + } + } + } + } + + try { // http://support.dcmtk.org/docs/dcvr_8h-source.html @@ -758,7 +799,8 @@ if (element.isLeaf()) { - std::auto_ptr<DicomValue> v(FromDcmtkBridge::ConvertLeafElement(element, flags, maxStringLength, encoding)); + // The "0" below lets "LeafValueToJson()" take care of "TooLong" values + std::auto_ptr<DicomValue> v(FromDcmtkBridge::ConvertLeafElement(element, flags, 0, encoding)); LeafValueToJson(target, *v, format, flags, maxStringLength); } else