# HG changeset patch # User Sebastien Jodogne # Date 1440085207 -7200 # Node ID 124de28b32edbe433982ba2a3d4923ae23b75c27 # Parent ad1e127b4ed525c7ce9c283b2e629d20fbbcab70 fix encodings of newly created dicom files diff -r ad1e127b4ed5 -r 124de28b32ed Core/Toolbox.cpp --- a/Core/Toolbox.cpp Thu Aug 20 17:29:42 2015 +0200 +++ b/Core/Toolbox.cpp Thu Aug 20 17:40:07 2015 +0200 @@ -1335,5 +1335,56 @@ return static_cast(getpid()); #endif } + + + const char* Toolbox::GetDicomSpecificCharacterSet(Encoding encoding) + { + // http://www.dabsoft.ch/dicom/3/C.12.1.1.2/ + switch (encoding) + { + case Encoding_Utf8: + case Encoding_Ascii: + return "ISO_IR 192"; + + case Encoding_Latin1: + return "ISO_IR 100"; + + case Encoding_Latin2: + return "ISO_IR 101"; + + case Encoding_Latin3: + return "ISO_IR 109"; + + case Encoding_Latin4: + return "ISO_IR 110"; + + case Encoding_Latin5: + return "ISO_IR 148"; + + case Encoding_Cyrillic: + return "ISO_IR 144"; + + case Encoding_Arabic: + return "ISO_IR 127"; + + case Encoding_Greek: + return "ISO_IR 126"; + + case Encoding_Hebrew: + return "ISO_IR 138"; + + case Encoding_Japanese: + return "ISO_IR 13"; + + case Encoding_Chinese: + return "GB18030"; + + case Encoding_Thai: + return "ISO_IR 166"; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + } } diff -r ad1e127b4ed5 -r 124de28b32ed Core/Toolbox.h --- a/Core/Toolbox.h Thu Aug 20 17:29:42 2015 +0200 +++ b/Core/Toolbox.h Thu Aug 20 17:40:07 2015 +0200 @@ -178,5 +178,7 @@ const std::string& prefix); int GetProcessId(); + + const char* GetDicomSpecificCharacterSet(Encoding encoding); } } diff -r ad1e127b4ed5 -r 124de28b32ed OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp Thu Aug 20 17:29:42 2015 +0200 +++ b/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp Thu Aug 20 17:40:07 2015 +0200 @@ -477,17 +477,23 @@ return false; } - std::string tmp; + Encoding encoding; + if (request["Tags"].isMember("SpecificCharacterSet")) { - tmp = request["Tags"]["SpecificCharacterSet"].asString(); + const char* tmp = request["Tags"]["SpecificCharacterSet"].asCString(); + if (!GetDicomEncoding(encoding, tmp)) + { + LOG(ERROR) << "Unknown specific character set: " << tmp; + return false; + } } else { - tmp = Configuration::GetGlobalStringParameter("DefaultEncoding", "Latin1"); + std::string tmp = Configuration::GetGlobalStringParameter("DefaultEncoding", "Latin1"); + encoding = StringToEncoding(tmp.c_str()); } - Encoding encoding = StringToEncoding(tmp.c_str()); dicom.SetEncoding(encoding); ResourceType parentType = ResourceType_Instance; @@ -611,20 +617,23 @@ std::string value = request["Tags"][name].asString(); DicomTag tag = FromDcmtkBridge::ParseTag(name); - if (dicom.HasTag(tag)) + if (tag != DICOM_TAG_SPECIFIC_CHARACTER_SET) { - LOG(ERROR) << "Trying to override a value inherited from a parent module"; - return false; - } + if (dicom.HasTag(tag)) + { + LOG(ERROR) << "Trying to override a value inherited from a parent module"; + return false; + } - if (tag == DICOM_TAG_PIXEL_DATA) - { - LOG(ERROR) << "Use \"Content\" to inject an image into a new DICOM instance"; - return false; - } - else - { - dicom.Replace(tag, Toolbox::ConvertFromUtf8(value, encoding)); + if (tag == DICOM_TAG_PIXEL_DATA) + { + LOG(ERROR) << "Use \"Content\" to inject an image into a new DICOM instance"; + return false; + } + else + { + dicom.Replace(tag, Toolbox::ConvertFromUtf8(value, encoding)); + } } } diff -r ad1e127b4ed5 -r 124de28b32ed OrthancServer/ParsedDicomFile.cpp --- a/OrthancServer/ParsedDicomFile.cpp Thu Aug 20 17:29:42 2015 +0200 +++ b/OrthancServer/ParsedDicomFile.cpp Thu Aug 20 17:40:07 2015 +0200 @@ -1335,73 +1335,14 @@ void ParsedDicomFile::SetEncoding(Encoding encoding) { - std::string s; - - // http://www.dabsoft.ch/dicom/3/C.12.1.1.2/ - switch (encoding) + if (encoding == Encoding_Windows1251) { - case Encoding_Utf8: - case Encoding_Ascii: - s = "ISO_IR 192"; - break; - - case Encoding_Windows1251: - // This Cyrillic codepage is not officially supported by the - // DICOM standard. Do not set the SpecificCharacterSet tag. - return; - - case Encoding_Latin1: - s = "ISO_IR 100"; - break; - - case Encoding_Latin2: - s = "ISO_IR 101"; - break; - - case Encoding_Latin3: - s = "ISO_IR 109"; - break; - - case Encoding_Latin4: - s = "ISO_IR 110"; - break; - - case Encoding_Latin5: - s = "ISO_IR 148"; - break; - - case Encoding_Cyrillic: - s = "ISO_IR 144"; - break; - - case Encoding_Arabic: - s = "ISO_IR 127"; - break; - - case Encoding_Greek: - s = "ISO_IR 126"; - break; - - case Encoding_Hebrew: - s = "ISO_IR 138"; - break; - - case Encoding_Japanese: - s = "ISO_IR 13"; - break; - - case Encoding_Chinese: - s = "GB18030"; - break; - - case Encoding_Thai: - s = "ISO_IR 166"; - break; - - default: - throw OrthancException(ErrorCode_ParameterOutOfRange); + // This Cyrillic codepage is not officially supported by the + // DICOM standard. Do not set the SpecificCharacterSet tag. + return; } + std::string s = Toolbox::GetDicomSpecificCharacterSet(encoding); Replace(DICOM_TAG_SPECIFIC_CHARACTER_SET, s, DicomReplaceMode_InsertIfAbsent); }