Mercurial > hg > orthanc
diff OrthancServer/OrthancRestApi.cpp @ 304:4eea080e6e7a
refactoring
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 19 Dec 2012 14:57:18 +0100 |
parents | c76a35a85c69 |
children | 86bb79522f19 |
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi.cpp Tue Dec 18 19:01:01 2012 +0100 +++ b/OrthancServer/OrthancRestApi.cpp Wed Dec 19 14:57:18 2012 +0100 @@ -89,7 +89,7 @@ Json::Value::Members members = query.getMemberNames(); for (size_t i = 0; i < members.size(); i++) { - DicomTag t = FromDcmtkBridge::FindTag(members[i]); + DicomTag t = FromDcmtkBridge::ParseTag(members[i]); result.SetValue(t, query[members[i]].asString()); } @@ -765,46 +765,14 @@ LOG(INFO) << "Receiving a DICOM file of " << postData.size() << " bytes through HTTP"; - DcmFileFormat dicomFile; - - { - // Prepare an input stream for the memory buffer - DcmInputBufferStream is; - is.setBuffer(&postData[0], postData.size()); - is.setEos(); - - dicomFile.transferInit(); - if (!dicomFile.read(is).good()) - { - call.GetOutput().SignalError(Orthanc_HttpStatus_415_UnsupportedMediaType); - return; - } - dicomFile.loadAllDataIntoMemory(); - dicomFile.transferEnd(); - } - - DicomMap dicomSummary; - FromDcmtkBridge::Convert(dicomSummary, *dicomFile.getDataset()); - - DicomInstanceHasher hasher(dicomSummary); - - Json::Value dicomJson; - FromDcmtkBridge::ToJson(dicomJson, *dicomFile.getDataset()); - - StoreStatus status = StoreStatus_Failure; - if (postData.size() > 0) - { - status = context.Store - (reinterpret_cast<const char*>(&postData[0]), postData.size(), - dicomSummary, dicomJson, ""); - } - + std::string publicId; + StoreStatus status = context.Store(publicId, postData); Json::Value result = Json::objectValue; if (status != StoreStatus_Failure) { - result["ID"] = hasher.HashInstance(); - result["Path"] = GetBasePath(ResourceType_Instance, hasher.HashInstance()); + result["ID"] = publicId; + result["Path"] = GetBasePath(ResourceType_Instance, publicId); } result["Status"] = ToString(status); @@ -812,6 +780,7 @@ } + // DICOM bridge ------------------------------------------------------------- static bool IsExistingModality(const OrthancRestApi::Modalities& modalities, @@ -870,31 +839,54 @@ - // Modification of DICOM tags ----------------------------------------------- + // Modification of DICOM instances ------------------------------------------ + + static void ModifyInstanceInternal(ParsedDicomFile& toModify, + const Json::Value& replacements) + { + if (!replacements.isObject()) + { + throw OrthancException(ErrorCode_BadRequest); + } + + Json::Value::Members members = replacements.getMemberNames(); - template <enum ResourceType resourceType> - static void Modify(RestApi::PostCall& call) + for (size_t i = 0; i < members.size(); i++) + { + const std::string& name = members[i]; + std::string value = replacements[name].asString(); + + DicomTag tag = FromDcmtkBridge::ParseTag(name); + toModify.Replace(tag, value); + } + + // A new SOP instance UID is automatically generated + std::string instanceUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Instance); + toModify.Replace(DICOM_TAG_SOP_INSTANCE_UID, instanceUid); + } + + + static void ModifyInstance(RestApi::PostCall& call) { RETRIEVE_CONTEXT(call); std::string id = call.GetUriComponent("id", ""); ParsedDicomFile& dicom = context.GetDicomFile(id); - std::auto_ptr<ParsedDicomFile> modified(dicom.Clone()); + Json::Value request; + if (call.ParseJsonRequest(request)) + { + std::auto_ptr<ParsedDicomFile> modified(dicom.Clone()); + ModifyInstanceInternal(*modified, request); + modified->Answer(call.GetOutput()); + } - std::string studyUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Study); + /*std::string studyUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Study); std::string seriesUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series); - std::string instanceUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Instance); - - modified->Replace(DICOM_TAG_SOP_INSTANCE_UID, instanceUid); modified->Replace(DICOM_TAG_SERIES_INSTANCE_UID, seriesUid); - modified->Replace(DICOM_TAG_STUDY_INSTANCE_UID, studyUid); + modified->Replace(DICOM_TAG_STUDY_INSTANCE_UID, studyUid);*/ - modified->InsertOrReplace(DicomTag(0x0010,0x0010), "0.42"); - //modified->Remove(DicomTag(0x0010,0x0020)); - /*modified->Insert(DicomTag(0x0018,0x9082), "0.42"); - modified->Replace(DicomTag(0x0010,0x0010), "Hello");*/ - modified->Answer(call.GetOutput()); + } @@ -954,6 +946,6 @@ Register("/modalities/{id}/find", DicomFind); Register("/modalities/{id}/store", DicomStore); - Register("/instances/{id}/modify", Modify<ResourceType_Instance>); + Register("/instances/{id}/modify", ModifyInstance); } }