# HG changeset patch # User Sebastien Jodogne # Date 1458655913 -3600 # Node ID 72a2fd7fed8bb4fab273b7924ca963772f58cf59 # Parent ff11ba08e5d0bbea03cdebf07a575ccca75f1762 FromDcmtkBridge::FromJson diff -r ff11ba08e5d0 -r 72a2fd7fed8b OrthancServer/FromDcmtkBridge.cpp --- a/OrthancServer/FromDcmtkBridge.cpp Mon Mar 21 16:47:28 2016 +0100 +++ b/OrthancServer/FromDcmtkBridge.cpp Tue Mar 22 15:11:53 2016 +0100 @@ -1579,4 +1579,130 @@ return pixelSequence; } } + + + Encoding FromDcmtkBridge::ExtractEncoding(const Json::Value& json, + Encoding defaultEncoding) + { + if (json.type() != Json::objectValue) + { + throw OrthancException(ErrorCode_BadParameterType); + } + + Encoding encoding = defaultEncoding; + + const Json::Value::Members tags = json.getMemberNames(); + + // Look for SpecificCharacterSet (0008,0005) in the JSON file + for (size_t i = 0; i < tags.size(); i++) + { + DicomTag tag = FromDcmtkBridge::ParseTag(tags[i]); + if (tag == DICOM_TAG_SPECIFIC_CHARACTER_SET) + { + const Json::Value& value = json[tags[i]]; + if (value.type() != Json::stringValue || + !GetDicomEncoding(encoding, value.asCString())) + { + LOG(ERROR) << "Unknown encoding while creating DICOM from JSON: " << value; + throw OrthancException(ErrorCode_BadRequest); + } + } + } + + return encoding; + } + + + static void SetString(DcmDataset& target, + const DcmTag& tag, + const std::string& value) + { + if (!target.putAndInsertString(tag, value.c_str()).good()) + { + throw OrthancException(ErrorCode_InternalError); + } + } + + + DcmDataset* FromDcmtkBridge::FromJson(const Json::Value& json, // Encoded using UTF-8 + bool generateIdentifiers, + bool decodeDataUriScheme, + Encoding defaultEncoding) + { + std::auto_ptr result(new DcmDataset); + Encoding encoding = ExtractEncoding(json, defaultEncoding); + + SetString(*result, DCM_SpecificCharacterSet, GetDicomSpecificCharacterSet(encoding)); + + const Json::Value::Members tags = json.getMemberNames(); + + bool hasPatientId = false; + bool hasStudyInstanceUid = false; + bool hasSeriesInstanceUid = false; + bool hasSopInstanceUid = false; + + for (size_t i = 0; i < tags.size(); i++) + { + DicomTag tag = FromDcmtkBridge::ParseTag(tags[i]); + const Json::Value& value = json[tags[i]]; + + if (tag == DICOM_TAG_PATIENT_ID) + { + hasPatientId = true; + } + else if (tag == DICOM_TAG_STUDY_INSTANCE_UID) + { + hasStudyInstanceUid = true; + } + else if (tag == DICOM_TAG_SERIES_INSTANCE_UID) + { + hasSeriesInstanceUid = true; + } + else if (tag == DICOM_TAG_SOP_INSTANCE_UID) + { + hasSopInstanceUid = true; + } + + if (tag != DICOM_TAG_SPECIFIC_CHARACTER_SET) + { + std::auto_ptr element(FromDcmtkBridge::FromJson(tag, value, decodeDataUriScheme, encoding)); + const DcmTagKey& tag = element->getTag(); + + result->findAndDeleteElement(tag); + + DcmElement* tmp = element.release(); + if (!result->insert(tmp, false, false).good()) + { + delete tmp; + throw OrthancException(ErrorCode_InternalError); + } + } + } + + if (!hasPatientId && + generateIdentifiers) + { + SetString(*result, DCM_PatientID, GenerateUniqueIdentifier(ResourceType_Patient)); + } + + if (!hasStudyInstanceUid && + generateIdentifiers) + { + SetString(*result, DCM_StudyInstanceUID, GenerateUniqueIdentifier(ResourceType_Study)); + } + + if (!hasSeriesInstanceUid && + generateIdentifiers) + { + SetString(*result, DCM_SeriesInstanceUID, GenerateUniqueIdentifier(ResourceType_Series)); + } + + if (!hasSopInstanceUid && + generateIdentifiers) + { + SetString(*result, DCM_SOPInstanceUID, GenerateUniqueIdentifier(ResourceType_Instance)); + } + + return result.release(); + } } diff -r ff11ba08e5d0 -r 72a2fd7fed8b OrthancServer/FromDcmtkBridge.h --- a/OrthancServer/FromDcmtkBridge.h Mon Mar 21 16:47:28 2016 +0100 +++ b/OrthancServer/FromDcmtkBridge.h Tue Mar 22 15:11:53 2016 +0100 @@ -54,7 +54,7 @@ unsigned int minMultiplicity, unsigned int maxMultiplicity); - static Encoding DetectEncoding(DcmDataset& dataset, + static Encoding DetectEncoding(DcmDataset & dataset, Encoding defaultEncoding); static void Convert(DicomMap& target, @@ -141,12 +141,20 @@ Encoding dicomEncoding); static DcmElement* FromJson(const DicomTag& tag, - const Json::Value& element, // Encoding using UTF-8 + const Json::Value& element, // Encoded using UTF-8 bool decodeDataUriScheme, Encoding dicomEncoding); static DcmEVR ParseValueRepresentation(const std::string& s); static DcmPixelSequence* GetPixelSequence(DcmDataset& dataset); + + static Encoding ExtractEncoding(const Json::Value& json, + Encoding defaultEncoding); + + static DcmDataset* FromJson(const Json::Value& json, // Encoded using UTF-8 + bool generateIdentifiers, + bool decodeDataUriScheme, + Encoding defaultEncoding); }; } diff -r ff11ba08e5d0 -r 72a2fd7fed8b OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp Mon Mar 21 16:47:28 2016 +0100 +++ b/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp Tue Mar 22 15:11:53 2016 +0100 @@ -636,8 +636,7 @@ } else { - std::string tmp = Configuration::GetGlobalStringParameter("DefaultEncoding", "Latin1"); - encoding = StringToEncoding(tmp.c_str()); + encoding = Configuration::GetDefaultEncoding(); } dicom.SetEncoding(encoding); diff -r ff11ba08e5d0 -r 72a2fd7fed8b OrthancServer/ParsedDicomFile.cpp --- a/OrthancServer/ParsedDicomFile.cpp Mon Mar 21 16:47:28 2016 +0100 +++ b/OrthancServer/ParsedDicomFile.cpp Tue Mar 22 15:11:53 2016 +0100 @@ -1197,32 +1197,14 @@ ParsedDicomFile* ParsedDicomFile::CreateFromJson(const Json::Value& json, DicomFromJsonFlags flags) { - std::string tmp = Configuration::GetGlobalStringParameter("DefaultEncoding", "Latin1"); - Encoding encoding = StringToEncoding(tmp.c_str()); - - Json::Value::Members tags = json.getMemberNames(); - - for (size_t i = 0; i < tags.size(); i++) - { - DicomTag tag = FromDcmtkBridge::ParseTag(tags[i]); - if (tag == DICOM_TAG_SPECIFIC_CHARACTER_SET) - { - const Json::Value& value = json[tags[i]]; - if (value.type() != Json::stringValue || - !GetDicomEncoding(encoding, value.asCString())) - { - LOG(ERROR) << "Unknown encoding while creating DICOM from JSON: " << value; - throw OrthancException(ErrorCode_BadRequest); - } - } - } - const bool generateIdentifiers = (flags & DicomFromJsonFlags_GenerateIdentifiers); const bool decodeDataUriScheme = (flags & DicomFromJsonFlags_DecodeDataUriScheme); std::auto_ptr result(new ParsedDicomFile(generateIdentifiers)); - result->SetEncoding(encoding); + result->SetEncoding(FromDcmtkBridge::ExtractEncoding(json, Configuration::GetDefaultEncoding())); + const Json::Value::Members tags = json.getMemberNames(); + for (size_t i = 0; i < tags.size(); i++) { DicomTag tag = FromDcmtkBridge::ParseTag(tags[i]);