Mercurial > hg > orthanc
diff OrthancServer/OrthancRestApi.cpp @ 344:cd6749e53a03
anonymization from orthanc explorer
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 21 Jan 2013 13:23:26 +0100 |
parents | a58a8be26aff |
children | 1082e8121d10 |
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi.cpp Fri Jan 18 10:25:55 2013 +0100 +++ b/OrthancServer/OrthancRestApi.cpp Mon Jan 21 13:23:26 2013 +0100 @@ -1166,59 +1166,70 @@ ChangeType changeType, RestApi::PostCall& call) { - RETRIEVE_CONTEXT(call); + Json::Value result = Json::objectValue; - boost::mutex::scoped_lock lock(cacheMutex_); - - typedef std::list<std::string> Instances; - Instances instances; - std::string id = call.GetUriComponent("id", ""); - context.GetIndex().GetChildInstances(instances, id); - - if (instances.size() == 0) { - return; - } + boost::mutex::scoped_lock lock(cacheMutex_); + RETRIEVE_CONTEXT(call); - replacements[DICOM_TAG_SERIES_INSTANCE_UID] = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series); + typedef std::list<std::string> Instances; + Instances instances; + std::string id = call.GetUriComponent("id", ""); + context.GetIndex().GetChildInstances(instances, id); - std::string newSeriesId; - for (Instances::const_iterator it = instances.begin(); - it != instances.end(); it++) - { - LOG(INFO) << "Modifying instance " << *it; - ParsedDicomFile& original = context.GetDicomFile(*it); - std::auto_ptr<ParsedDicomFile> modified(original.Clone()); - ReplaceInstanceInternal(*modified, removals, replacements, DicomReplaceMode_InsertIfAbsent, removePrivateTags); - - std::string modifiedInstance; - if (context.Store(modifiedInstance, modified->GetDicom()) != StoreStatus_Success) + if (instances.size() == 0) { - LOG(ERROR) << "Error while storing a modified instance " << *it; return; } - DicomInstanceHasher modifiedHasher = modified->GetHasher(); - DicomInstanceHasher originalHasher = original.GetHasher(); + replacements[DICOM_TAG_SERIES_INSTANCE_UID] = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series); + + std::string newSeriesId, newPatientId; + for (Instances::const_iterator it = instances.begin(); + it != instances.end(); it++) + { + LOG(INFO) << "Modifying instance " << *it; + ParsedDicomFile& original = context.GetDicomFile(*it); + std::auto_ptr<ParsedDicomFile> modified(original.Clone()); + ReplaceInstanceInternal(*modified, removals, replacements, DicomReplaceMode_InsertIfAbsent, removePrivateTags); + + std::string modifiedInstance; + if (context.Store(modifiedInstance, modified->GetDicom()) != StoreStatus_Success) + { + LOG(ERROR) << "Error while storing a modified instance " << *it; + return; + } - if (newSeriesId.size() == 0) - { - assert(id == originalHasher.HashSeries()); - newSeriesId = modifiedHasher.HashSeries(); - context.GetIndex().SetMetadata(newSeriesId, metadataType, id); + DicomInstanceHasher modifiedHasher = modified->GetHasher(); + DicomInstanceHasher originalHasher = original.GetHasher(); + + if (newSeriesId.size() == 0) + { + assert(id == originalHasher.HashSeries()); + newSeriesId = modifiedHasher.HashSeries(); + context.GetIndex().SetMetadata(newSeriesId, metadataType, id); + } + + if (newPatientId.size() == 0) + { + newPatientId = modifiedHasher.HashPatient(); + } + + assert(*it == originalHasher.HashInstance()); + assert(modifiedInstance == modifiedHasher.HashInstance()); + context.GetIndex().SetMetadata(modifiedInstance, metadataType, *it); } - assert(*it == originalHasher.HashInstance()); - assert(modifiedInstance == modifiedHasher.HashInstance()); - context.GetIndex().SetMetadata(modifiedInstance, metadataType, *it); + context.GetIndex().LogChange(changeType, newSeriesId); + + assert(newSeriesId.size() != 0); + result["Type"] = ToString(ResourceType_Series); + result["ID"] = newSeriesId; + result["Path"] = GetBasePath(ResourceType_Series, newSeriesId); + result["PatientID"] = newPatientId; } - context.GetIndex().LogChange(changeType, newSeriesId); - - assert(newSeriesId.size() != 0); - Json::Value result = Json::objectValue; - result["ID"] = newSeriesId; - result["Path"] = GetBasePath(ResourceType_Series, newSeriesId); + // Do not answer before the lock has been released call.GetOutput().AnswerJson(result); } @@ -1230,88 +1241,101 @@ ChangeType changeType, RestApi::PostCall& call) { - RETRIEVE_CONTEXT(call); - boost::mutex::scoped_lock lock(cacheMutex_); - - typedef std::list<std::string> Instances; - typedef std::map<std::string, std::string> SeriesUidMap; + Json::Value result = Json::objectValue; - Instances instances; - std::string id = call.GetUriComponent("id", ""); - context.GetIndex().GetChildInstances(instances, id); - - if (instances.size() == 0) { - return; - } - - std::string newStudyId; - replacements[DICOM_TAG_STUDY_INSTANCE_UID] = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Study); - - SeriesUidMap seriesUidMap; - for (Instances::const_iterator it = instances.begin(); - it != instances.end(); it++) - { - LOG(INFO) << "Modifying instance " << *it; - ParsedDicomFile& original = context.GetDicomFile(*it); + boost::mutex::scoped_lock lock(cacheMutex_); + RETRIEVE_CONTEXT(call); - std::string seriesUid; - if (!original.GetTagValue(seriesUid, DICOM_TAG_SERIES_INSTANCE_UID)) - { - throw OrthancException(ErrorCode_InternalError); - } + typedef std::list<std::string> Instances; + typedef std::map<std::string, std::string> SeriesUidMap; - bool isNewSeries; - SeriesUidMap::const_iterator it2 = seriesUidMap.find(seriesUid); - if (it2 == seriesUidMap.end()) + Instances instances; + std::string id = call.GetUriComponent("id", ""); + context.GetIndex().GetChildInstances(instances, id); + + if (instances.size() == 0) { - std::string newSeriesUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series); - seriesUidMap[seriesUid] = newSeriesUid; - replacements[DICOM_TAG_SERIES_INSTANCE_UID] = newSeriesUid; - isNewSeries = true; - } - else - { - replacements[DICOM_TAG_SERIES_INSTANCE_UID] = it2->second; - isNewSeries = false; - } - - std::auto_ptr<ParsedDicomFile> modified(original.Clone()); - ReplaceInstanceInternal(*modified, removals, replacements, DicomReplaceMode_InsertIfAbsent, removePrivateTags); - - std::string modifiedInstance; - if (context.Store(modifiedInstance, modified->GetDicom()) != StoreStatus_Success) - { - LOG(ERROR) << "Error while storing a modified instance " << *it; return; } - DicomInstanceHasher modifiedHasher = modified->GetHasher(); - DicomInstanceHasher originalHasher = original.GetHasher(); + std::string newPatientId; + std::string newStudyId; + replacements[DICOM_TAG_STUDY_INSTANCE_UID] = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Study); + + SeriesUidMap seriesUidMap; + for (Instances::const_iterator it = instances.begin(); + it != instances.end(); it++) + { + LOG(INFO) << "Modifying instance " << *it; + ParsedDicomFile& original = context.GetDicomFile(*it); + + std::string seriesUid; + if (!original.GetTagValue(seriesUid, DICOM_TAG_SERIES_INSTANCE_UID)) + { + throw OrthancException(ErrorCode_InternalError); + } + + bool isNewSeries; + SeriesUidMap::const_iterator it2 = seriesUidMap.find(seriesUid); + if (it2 == seriesUidMap.end()) + { + std::string newSeriesUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series); + seriesUidMap[seriesUid] = newSeriesUid; + replacements[DICOM_TAG_SERIES_INSTANCE_UID] = newSeriesUid; + isNewSeries = true; + } + else + { + replacements[DICOM_TAG_SERIES_INSTANCE_UID] = it2->second; + isNewSeries = false; + } - if (isNewSeries) - { - context.GetIndex().SetMetadata - (modifiedHasher.HashSeries(), metadataType, originalHasher.HashSeries()); + std::auto_ptr<ParsedDicomFile> modified(original.Clone()); + ReplaceInstanceInternal(*modified, removals, replacements, DicomReplaceMode_InsertIfAbsent, removePrivateTags); + + std::string modifiedInstance; + if (context.Store(modifiedInstance, modified->GetDicom()) != StoreStatus_Success) + { + LOG(ERROR) << "Error while storing a modified instance " << *it; + return; + } + + DicomInstanceHasher modifiedHasher = modified->GetHasher(); + DicomInstanceHasher originalHasher = original.GetHasher(); + + if (isNewSeries) + { + context.GetIndex().SetMetadata + (modifiedHasher.HashSeries(), metadataType, originalHasher.HashSeries()); + } + + if (newStudyId.size() == 0) + { + newStudyId = modifiedHasher.HashStudy(); + context.GetIndex().SetMetadata(newStudyId, metadataType, originalHasher.HashStudy()); + } + + if (newPatientId.size() == 0) + { + newPatientId = modifiedHasher.HashPatient(); + } + + assert(*it == originalHasher.HashInstance()); + assert(modifiedInstance == modifiedHasher.HashInstance()); + context.GetIndex().SetMetadata(modifiedInstance, metadataType, *it); } - if (newStudyId.size() == 0) - { - newStudyId = modifiedHasher.HashStudy(); - context.GetIndex().SetMetadata(newStudyId, metadataType, originalHasher.HashStudy()); - } + context.GetIndex().LogChange(changeType, newStudyId); - assert(*it == originalHasher.HashInstance()); - assert(modifiedInstance == modifiedHasher.HashInstance()); - context.GetIndex().SetMetadata(modifiedInstance, metadataType, *it); + assert(newStudyId.size() != 0); + result["Type"] = ToString(ResourceType_Study); + result["ID"] = newStudyId; + result["Path"] = GetBasePath(ResourceType_Study, newStudyId); + result["PatientID"] = newPatientId; } - context.GetIndex().LogChange(changeType, newStudyId); - - assert(newStudyId.size() != 0); - Json::Value result = Json::objectValue; - result["ID"] = newStudyId; - result["Path"] = GetBasePath(ResourceType_Study, newStudyId); + // Do not answer before the lock has been released call.GetOutput().AnswerJson(result); }