Mercurial > hg > orthanc
comparison OrthancServer/OrthancRestApi.cpp @ 546:0e510ea3de31 laaw
merge mainline -> laaw
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 13 Sep 2013 11:25:08 +0200 |
parents | d47ae896a754 |
children | 48c9f83587a8 |
comparison
equal
deleted
inserted
replaced
543:fe796b053863 | 546:0e510ea3de31 |
---|---|
74 static void ConnectToModality(DicomUserConnection& connection, | 74 static void ConnectToModality(DicomUserConnection& connection, |
75 const std::string& name) | 75 const std::string& name) |
76 { | 76 { |
77 std::string aet, address; | 77 std::string aet, address; |
78 int port; | 78 int port; |
79 GetDicomModality(name, aet, address, port); | 79 ModalityManufacturer manufacturer; |
80 GetDicomModality(name, aet, address, port, manufacturer); | |
80 connection.SetLocalApplicationEntityTitle(GetGlobalStringParameter("DicomAet", "ORTHANC")); | 81 connection.SetLocalApplicationEntityTitle(GetGlobalStringParameter("DicomAet", "ORTHANC")); |
81 connection.SetDistantApplicationEntityTitle(aet); | 82 connection.SetDistantApplicationEntityTitle(aet); |
82 connection.SetDistantHost(address); | 83 connection.SetDistantHost(address); |
83 connection.SetDistantPort(port); | 84 connection.SetDistantPort(port); |
85 connection.SetDistantManufacturer(manufacturer); | |
84 connection.Open(); | 86 connection.Open(); |
85 } | 87 } |
86 | 88 |
87 static bool MergeQueryAndTemplate(DicomMap& result, | 89 static bool MergeQueryAndTemplate(DicomMap& result, |
88 const std::string& postData) | 90 const std::string& postData) |
171 DicomUserConnection connection; | 173 DicomUserConnection connection; |
172 ConnectToModality(connection, call.GetUriComponent("id", "")); | 174 ConnectToModality(connection, call.GetUriComponent("id", "")); |
173 | 175 |
174 DicomFindAnswers answers; | 176 DicomFindAnswers answers; |
175 connection.FindSeries(answers, m); | 177 connection.FindSeries(answers, m); |
178 | |
179 Json::Value result; | |
180 answers.ToJson(result); | |
181 call.GetOutput().AnswerJson(result); | |
182 } | |
183 | |
184 static void DicomFindInstance(RestApi::PostCall& call) | |
185 { | |
186 DicomMap m; | |
187 DicomMap::SetupFindInstanceTemplate(m); | |
188 if (!MergeQueryAndTemplate(m, call.GetPostBody())) | |
189 { | |
190 return; | |
191 } | |
192 | |
193 if ((m.GetValue(DICOM_TAG_ACCESSION_NUMBER).AsString().size() <= 2 && | |
194 m.GetValue(DICOM_TAG_PATIENT_ID).AsString().size() <= 2) || | |
195 m.GetValue(DICOM_TAG_STUDY_INSTANCE_UID).AsString().size() <= 2 || | |
196 m.GetValue(DICOM_TAG_SERIES_INSTANCE_UID).AsString().size() <= 2) | |
197 { | |
198 return; | |
199 } | |
200 | |
201 DicomUserConnection connection; | |
202 ConnectToModality(connection, call.GetUriComponent("id", "")); | |
203 | |
204 DicomFindAnswers answers; | |
205 connection.FindInstance(answers, m); | |
176 | 206 |
177 Json::Value result; | 207 Json::Value result; |
178 answers.ToJson(result); | 208 answers.ToJson(result); |
179 call.GetOutput().AnswerJson(result); | 209 call.GetOutput().AnswerJson(result); |
180 } | 210 } |
932 { | 962 { |
933 Json::Value result = Json::arrayValue; | 963 Json::Value result = Json::arrayValue; |
934 result.append("find-patient"); | 964 result.append("find-patient"); |
935 result.append("find-study"); | 965 result.append("find-study"); |
936 result.append("find-series"); | 966 result.append("find-series"); |
967 result.append("find-instance"); | |
937 result.append("find"); | 968 result.append("find"); |
938 result.append("store"); | 969 result.append("store"); |
939 call.GetOutput().AnswerJson(result); | 970 call.GetOutput().AnswerJson(result); |
940 } | 971 } |
941 } | 972 } |
1000 if (!removals.isArray()) | 1031 if (!removals.isArray()) |
1001 { | 1032 { |
1002 throw OrthancException(ErrorCode_BadRequest); | 1033 throw OrthancException(ErrorCode_BadRequest); |
1003 } | 1034 } |
1004 | 1035 |
1005 target.clear(); | |
1006 | |
1007 for (Json::Value::ArrayIndex i = 0; i < removals.size(); i++) | 1036 for (Json::Value::ArrayIndex i = 0; i < removals.size(); i++) |
1008 { | 1037 { |
1009 std::string name = removals[i].asString(); | 1038 std::string name = removals[i].asString(); |
1010 DicomTag tag = FromDcmtkBridge::ParseTag(name); | 1039 DicomTag tag = FromDcmtkBridge::ParseTag(name); |
1011 target.insert(tag); | 1040 target.insert(tag); |
1020 { | 1049 { |
1021 if (!replacements.isObject()) | 1050 if (!replacements.isObject()) |
1022 { | 1051 { |
1023 throw OrthancException(ErrorCode_BadRequest); | 1052 throw OrthancException(ErrorCode_BadRequest); |
1024 } | 1053 } |
1025 | |
1026 target.clear(); | |
1027 | 1054 |
1028 Json::Value::Members members = replacements.getMemberNames(); | 1055 Json::Value::Members members = replacements.getMemberNames(); |
1029 for (size_t i = 0; i < members.size(); i++) | 1056 for (size_t i = 0; i < members.size(); i++) |
1030 { | 1057 { |
1031 const std::string& name = members[i]; | 1058 const std::string& name = members[i]; |
1068 removals.insert(DicomTag(0x0008, 0x1070)); // Operators' Name | 1095 removals.insert(DicomTag(0x0008, 0x1070)); // Operators' Name |
1069 removals.insert(DicomTag(0x0008, 0x1080)); // Admitting Diagnoses Description | 1096 removals.insert(DicomTag(0x0008, 0x1080)); // Admitting Diagnoses Description |
1070 removals.insert(DicomTag(0x0008, 0x1155)); // Referenced SOP Instance UID | 1097 removals.insert(DicomTag(0x0008, 0x1155)); // Referenced SOP Instance UID |
1071 removals.insert(DicomTag(0x0008, 0x2111)); // Derivation Description | 1098 removals.insert(DicomTag(0x0008, 0x2111)); // Derivation Description |
1072 removals.insert(DicomTag(0x0010, 0x0010)); // Patient's Name | 1099 removals.insert(DicomTag(0x0010, 0x0010)); // Patient's Name |
1073 removals.insert(DicomTag(0x0010, 0x0020)); // Patient ID | 1100 //removals.insert(DicomTag(0x0010, 0x0020)); // Patient ID => cf. below (*) |
1074 removals.insert(DicomTag(0x0010, 0x0030)); // Patient's Birth Date | 1101 removals.insert(DicomTag(0x0010, 0x0030)); // Patient's Birth Date |
1075 removals.insert(DicomTag(0x0010, 0x0032)); // Patient's Birth Time | 1102 removals.insert(DicomTag(0x0010, 0x0032)); // Patient's Birth Time |
1076 removals.insert(DicomTag(0x0010, 0x0040)); // Patient's Sex | 1103 removals.insert(DicomTag(0x0010, 0x0040)); // Patient's Sex |
1077 removals.insert(DicomTag(0x0010, 0x1000)); // Other Patient Ids | 1104 removals.insert(DicomTag(0x0010, 0x1000)); // Other Patient Ids |
1078 removals.insert(DicomTag(0x0010, 0x1001)); // Other Patient Names | 1105 removals.insert(DicomTag(0x0010, 0x1001)); // Other Patient Names |
1084 removals.insert(DicomTag(0x0010, 0x2180)); // Occupation | 1111 removals.insert(DicomTag(0x0010, 0x2180)); // Occupation |
1085 removals.insert(DicomTag(0x0010, 0x21b0)); // Additional Patient's History | 1112 removals.insert(DicomTag(0x0010, 0x21b0)); // Additional Patient's History |
1086 removals.insert(DicomTag(0x0010, 0x4000)); // Patient Comments | 1113 removals.insert(DicomTag(0x0010, 0x4000)); // Patient Comments |
1087 removals.insert(DicomTag(0x0018, 0x1000)); // Device Serial Number | 1114 removals.insert(DicomTag(0x0018, 0x1000)); // Device Serial Number |
1088 removals.insert(DicomTag(0x0018, 0x1030)); // Protocol Name | 1115 removals.insert(DicomTag(0x0018, 0x1030)); // Protocol Name |
1089 //removals.insert(DicomTag(0x0020, 0x000d)); // Study Instance UID => generated below | 1116 //removals.insert(DicomTag(0x0020, 0x000d)); // Study Instance UID => cf. below (*) |
1090 //removals.insert(DicomTag(0x0020, 0x000e)); // Series Instance UID => generated below | 1117 //removals.insert(DicomTag(0x0020, 0x000e)); // Series Instance UID => cf. below (*) |
1091 removals.insert(DicomTag(0x0020, 0x0010)); // Study ID | 1118 removals.insert(DicomTag(0x0020, 0x0010)); // Study ID |
1092 removals.insert(DicomTag(0x0020, 0x0052)); // Frame of Reference UID | 1119 removals.insert(DicomTag(0x0020, 0x0052)); // Frame of Reference UID |
1093 removals.insert(DicomTag(0x0020, 0x0200)); // Synchronization Frame of Reference UID | 1120 removals.insert(DicomTag(0x0020, 0x0200)); // Synchronization Frame of Reference UID |
1094 removals.insert(DicomTag(0x0020, 0x4000)); // Image Comments | 1121 removals.insert(DicomTag(0x0020, 0x4000)); // Image Comments |
1095 removals.insert(DicomTag(0x0040, 0x0275)); // Request Attributes Sequence | 1122 removals.insert(DicomTag(0x0040, 0x0275)); // Request Attributes Sequence |
1097 removals.insert(DicomTag(0x0040, 0xa730)); // Content Sequence | 1124 removals.insert(DicomTag(0x0040, 0xa730)); // Content Sequence |
1098 removals.insert(DicomTag(0x0088, 0x0140)); // Storage Media File-set UID | 1125 removals.insert(DicomTag(0x0088, 0x0140)); // Storage Media File-set UID |
1099 removals.insert(DicomTag(0x3006, 0x0024)); // Referenced Frame of Reference UID | 1126 removals.insert(DicomTag(0x3006, 0x0024)); // Referenced Frame of Reference UID |
1100 removals.insert(DicomTag(0x3006, 0x00c2)); // Related Frame of Reference UID | 1127 removals.insert(DicomTag(0x3006, 0x00c2)); // Related Frame of Reference UID |
1101 | 1128 |
1129 /** | |
1130 * (*) Patient ID, Study Instance UID and Series Instance UID | |
1131 * are modified by "AnonymizeInstance()" if anonymizing a single | |
1132 * instance, or by "RetrieveMappedUid()" if anonymizing a | |
1133 * patient/study/series. | |
1134 **/ | |
1135 | |
1136 | |
1102 // Some more removals (from the experience of DICOM files at the CHU of Liege) | 1137 // Some more removals (from the experience of DICOM files at the CHU of Liege) |
1103 removals.insert(DicomTag(0x0010, 0x1040)); // Patient's Address | 1138 removals.insert(DicomTag(0x0010, 0x1040)); // Patient's Address |
1104 removals.insert(DicomTag(0x0032, 0x1032)); // Requesting Physician | 1139 removals.insert(DicomTag(0x0032, 0x1032)); // Requesting Physician |
1105 removals.insert(DicomTag(0x0010, 0x2154)); // PatientTelephoneNumbers | 1140 removals.insert(DicomTag(0x0010, 0x2154)); // PatientTelephoneNumbers |
1141 removals.insert(DicomTag(0x0010, 0x2000)); // Medical Alerts | |
1106 | 1142 |
1107 // Set the DeidentificationMethod tag | 1143 // Set the DeidentificationMethod tag |
1108 replacements.insert(std::make_pair(DicomTag(0x0012, 0x0063), "Orthanc " ORTHANC_VERSION " - PS 3.15-2008 Table E.1-1")); | 1144 replacements.insert(std::make_pair(DicomTag(0x0012, 0x0063), "Orthanc " ORTHANC_VERSION " - PS 3.15-2008 Table E.1-1")); |
1109 | 1145 |
1110 // Set the PatientIdentityRemoved | 1146 // Set the PatientIdentityRemoved tag |
1111 replacements.insert(std::make_pair(DicomTag(0x0012, 0x0062), "YES")); | 1147 replacements.insert(std::make_pair(DicomTag(0x0012, 0x0062), "YES")); |
1112 | |
1113 // Generate random study UID if not specified | |
1114 if (replacements.find(DICOM_TAG_STUDY_INSTANCE_UID) == replacements.end()) | |
1115 { | |
1116 replacements.insert(std::make_pair(DICOM_TAG_STUDY_INSTANCE_UID, | |
1117 FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Study))); | |
1118 } | |
1119 | |
1120 // Generate random series UID if not specified | |
1121 if (replacements.find(DICOM_TAG_SERIES_INSTANCE_UID) == replacements.end()) | |
1122 { | |
1123 replacements.insert(std::make_pair(DICOM_TAG_SERIES_INSTANCE_UID, | |
1124 FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series))); | |
1125 } | |
1126 } | 1148 } |
1127 | 1149 |
1128 | 1150 |
1129 static bool ParseModifyRequest(Removals& removals, | 1151 static bool ParseModifyRequest(Removals& removals, |
1130 Replacements& replacements, | 1152 Replacements& replacements, |
1221 | 1243 |
1222 // Generate random Patient's Name if none is specified | 1244 // Generate random Patient's Name if none is specified |
1223 if (replacements.find(DicomTag(0x0010, 0x0010)) == replacements.end()) | 1245 if (replacements.find(DicomTag(0x0010, 0x0010)) == replacements.end()) |
1224 { | 1246 { |
1225 replacements.insert(std::make_pair(DicomTag(0x0010, 0x0010), GeneratePatientName(context))); | 1247 replacements.insert(std::make_pair(DicomTag(0x0010, 0x0010), GeneratePatientName(context))); |
1226 } | |
1227 | |
1228 // Generate random Patient's ID if none is specified | |
1229 if (replacements.find(DICOM_TAG_PATIENT_ID) == replacements.end()) | |
1230 { | |
1231 replacements.insert(std::make_pair(DICOM_TAG_PATIENT_ID, | |
1232 FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Patient))); | |
1233 } | 1248 } |
1234 | 1249 |
1235 return true; | 1250 return true; |
1236 } | 1251 } |
1237 else | 1252 else |
1262 DicomRootLevel level, | 1277 DicomRootLevel level, |
1263 Replacements& replacements, | 1278 Replacements& replacements, |
1264 UidMap& uidMap) | 1279 UidMap& uidMap) |
1265 { | 1280 { |
1266 std::auto_ptr<DicomTag> tag; | 1281 std::auto_ptr<DicomTag> tag; |
1267 if (level == DicomRootLevel_Series) | 1282 |
1268 { | 1283 switch (level) |
1269 tag.reset(new DicomTag(DICOM_TAG_SERIES_INSTANCE_UID)); | 1284 { |
1270 } | 1285 case DicomRootLevel_Series: |
1271 else | 1286 tag.reset(new DicomTag(DICOM_TAG_SERIES_INSTANCE_UID)); |
1272 { | 1287 break; |
1273 assert(level == DicomRootLevel_Study); | 1288 |
1274 tag.reset(new DicomTag(DICOM_TAG_STUDY_INSTANCE_UID)); | 1289 case DicomRootLevel_Study: |
1290 tag.reset(new DicomTag(DICOM_TAG_STUDY_INSTANCE_UID)); | |
1291 break; | |
1292 | |
1293 case DicomRootLevel_Patient: | |
1294 tag.reset(new DicomTag(DICOM_TAG_PATIENT_ID)); | |
1295 break; | |
1296 | |
1297 default: | |
1298 throw OrthancException(ErrorCode_InternalError); | |
1275 } | 1299 } |
1276 | 1300 |
1277 std::string original; | 1301 std::string original; |
1278 if (!dicom.GetTagValue(original, *tag)) | 1302 if (!dicom.GetTagValue(original, *tag)) |
1279 { | 1303 { |
1299 replacements[*tag] = mapped; | 1323 replacements[*tag] = mapped; |
1300 return isNew; | 1324 return isNew; |
1301 } | 1325 } |
1302 | 1326 |
1303 | 1327 |
1304 static void AnonymizeOrModifyResource(Removals& removals, | 1328 static void AnonymizeOrModifyResource(bool isAnonymization, |
1329 Removals& removals, | |
1305 Replacements& replacements, | 1330 Replacements& replacements, |
1306 bool removePrivateTags, | 1331 bool removePrivateTags, |
1307 MetadataType metadataType, | 1332 MetadataType metadataType, |
1308 ChangeType changeType, | 1333 ChangeType changeType, |
1309 ResourceType resourceType, | 1334 ResourceType resourceType, |
1336 it != instances.end(); it++) | 1361 it != instances.end(); it++) |
1337 { | 1362 { |
1338 LOG(INFO) << "Modifying instance " << *it; | 1363 LOG(INFO) << "Modifying instance " << *it; |
1339 ParsedDicomFile& original = context.GetDicomFile(*it); | 1364 ParsedDicomFile& original = context.GetDicomFile(*it); |
1340 | 1365 |
1366 DicomInstanceHasher originalHasher = original.GetHasher(); | |
1367 | |
1368 if (isFirst && !isAnonymization) | |
1369 { | |
1370 // If modifying a study or a series, keep the original patient ID. | |
1371 std::string patientId = originalHasher.GetPatientId(); | |
1372 uidMap[std::make_pair(DicomRootLevel_Patient, patientId)] = patientId; | |
1373 } | |
1374 | |
1341 bool isNewSeries = RetrieveMappedUid(original, DicomRootLevel_Series, replacements, uidMap); | 1375 bool isNewSeries = RetrieveMappedUid(original, DicomRootLevel_Series, replacements, uidMap); |
1342 | 1376 bool isNewStudy = RetrieveMappedUid(original, DicomRootLevel_Study, replacements, uidMap); |
1343 bool isNewStudy = false; | 1377 bool isNewPatient = RetrieveMappedUid(original, DicomRootLevel_Patient, replacements, uidMap); |
1344 if (resourceType == ResourceType_Study || | 1378 |
1345 resourceType == ResourceType_Patient) | |
1346 { | |
1347 isNewStudy = RetrieveMappedUid(original, DicomRootLevel_Study, replacements, uidMap); | |
1348 } | |
1349 | 1379 |
1350 /** | 1380 /** |
1351 * Compute the resulting DICOM instance and store it into the Orthanc store. | 1381 * Compute the resulting DICOM instance and store it into the Orthanc store. |
1352 **/ | 1382 **/ |
1353 | 1383 |
1365 /** | 1395 /** |
1366 * Record metadata information (AnonymizedFrom/ModifiedFrom). | 1396 * Record metadata information (AnonymizedFrom/ModifiedFrom). |
1367 **/ | 1397 **/ |
1368 | 1398 |
1369 DicomInstanceHasher modifiedHasher = modified->GetHasher(); | 1399 DicomInstanceHasher modifiedHasher = modified->GetHasher(); |
1370 DicomInstanceHasher originalHasher = original.GetHasher(); | |
1371 | 1400 |
1372 if (isNewSeries) | 1401 if (isNewSeries) |
1373 { | 1402 { |
1374 context.GetIndex().SetMetadata(modifiedHasher.HashSeries(), | 1403 context.GetIndex().SetMetadata(modifiedHasher.HashSeries(), |
1375 metadataType, originalHasher.HashSeries()); | 1404 metadataType, originalHasher.HashSeries()); |
1377 | 1406 |
1378 if (isNewStudy) | 1407 if (isNewStudy) |
1379 { | 1408 { |
1380 context.GetIndex().SetMetadata(modifiedHasher.HashStudy(), | 1409 context.GetIndex().SetMetadata(modifiedHasher.HashStudy(), |
1381 metadataType, originalHasher.HashStudy()); | 1410 metadataType, originalHasher.HashStudy()); |
1411 } | |
1412 | |
1413 if (isNewPatient) | |
1414 { | |
1415 context.GetIndex().SetMetadata(modifiedHasher.HashPatient(), | |
1416 metadataType, originalHasher.HashPatient()); | |
1382 } | 1417 } |
1383 | 1418 |
1384 assert(*it == originalHasher.HashInstance()); | 1419 assert(*it == originalHasher.HashInstance()); |
1385 assert(modifiedInstance == modifiedHasher.HashInstance()); | 1420 assert(modifiedInstance == modifiedHasher.HashInstance()); |
1386 context.GetIndex().SetMetadata(modifiedInstance, metadataType, *it); | 1421 context.GetIndex().SetMetadata(modifiedInstance, metadataType, *it); |
1390 * Compute the JSON object that is returned by the REST call. | 1425 * Compute the JSON object that is returned by the REST call. |
1391 **/ | 1426 **/ |
1392 | 1427 |
1393 if (isFirst) | 1428 if (isFirst) |
1394 { | 1429 { |
1395 context.GetIndex().SetMetadata(modifiedHasher.HashPatient(), | |
1396 metadataType, originalHasher.HashPatient()); | |
1397 | |
1398 std::string newId; | 1430 std::string newId; |
1399 | 1431 |
1400 switch (resourceType) | 1432 switch (resourceType) |
1401 { | 1433 { |
1402 case ResourceType_Series: | 1434 case ResourceType_Series: |
1447 Replacements replacements; | 1479 Replacements replacements; |
1448 bool removePrivateTags; | 1480 bool removePrivateTags; |
1449 | 1481 |
1450 if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call)) | 1482 if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call)) |
1451 { | 1483 { |
1484 // Generate random patient ID if not specified | |
1485 if (replacements.find(DICOM_TAG_PATIENT_ID) == replacements.end()) | |
1486 { | |
1487 replacements.insert(std::make_pair(DICOM_TAG_PATIENT_ID, | |
1488 FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Patient))); | |
1489 } | |
1490 | |
1491 // Generate random study UID if not specified | |
1492 if (replacements.find(DICOM_TAG_STUDY_INSTANCE_UID) == replacements.end()) | |
1493 { | |
1494 replacements.insert(std::make_pair(DICOM_TAG_STUDY_INSTANCE_UID, | |
1495 FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Study))); | |
1496 } | |
1497 | |
1498 // Generate random series UID if not specified | |
1499 if (replacements.find(DICOM_TAG_SERIES_INSTANCE_UID) == replacements.end()) | |
1500 { | |
1501 replacements.insert(std::make_pair(DICOM_TAG_SERIES_INSTANCE_UID, | |
1502 FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series))); | |
1503 } | |
1504 | |
1452 AnonymizeOrModifyInstance(removals, replacements, removePrivateTags, call); | 1505 AnonymizeOrModifyInstance(removals, replacements, removePrivateTags, call); |
1453 } | 1506 } |
1454 } | 1507 } |
1455 | 1508 |
1456 | 1509 |
1460 Replacements replacements; | 1513 Replacements replacements; |
1461 bool removePrivateTags; | 1514 bool removePrivateTags; |
1462 | 1515 |
1463 if (ParseModifyRequest(removals, replacements, removePrivateTags, call)) | 1516 if (ParseModifyRequest(removals, replacements, removePrivateTags, call)) |
1464 { | 1517 { |
1465 AnonymizeOrModifyResource(removals, replacements, removePrivateTags, | 1518 AnonymizeOrModifyResource(false, removals, replacements, removePrivateTags, |
1466 MetadataType_ModifiedFrom, ChangeType_ModifiedSeries, | 1519 MetadataType_ModifiedFrom, ChangeType_ModifiedSeries, |
1467 ResourceType_Series, call); | 1520 ResourceType_Series, call); |
1468 } | 1521 } |
1469 } | 1522 } |
1470 | 1523 |
1475 Replacements replacements; | 1528 Replacements replacements; |
1476 bool removePrivateTags; | 1529 bool removePrivateTags; |
1477 | 1530 |
1478 if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call)) | 1531 if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call)) |
1479 { | 1532 { |
1480 AnonymizeOrModifyResource(removals, replacements, removePrivateTags, | 1533 AnonymizeOrModifyResource(true, removals, replacements, removePrivateTags, |
1481 MetadataType_AnonymizedFrom, ChangeType_AnonymizedSeries, | 1534 MetadataType_AnonymizedFrom, ChangeType_AnonymizedSeries, |
1482 ResourceType_Series, call); | 1535 ResourceType_Series, call); |
1483 } | 1536 } |
1484 } | 1537 } |
1485 | 1538 |
1490 Replacements replacements; | 1543 Replacements replacements; |
1491 bool removePrivateTags; | 1544 bool removePrivateTags; |
1492 | 1545 |
1493 if (ParseModifyRequest(removals, replacements, removePrivateTags, call)) | 1546 if (ParseModifyRequest(removals, replacements, removePrivateTags, call)) |
1494 { | 1547 { |
1495 AnonymizeOrModifyResource(removals, replacements, removePrivateTags, | 1548 AnonymizeOrModifyResource(false, removals, replacements, removePrivateTags, |
1496 MetadataType_ModifiedFrom, ChangeType_ModifiedStudy, | 1549 MetadataType_ModifiedFrom, ChangeType_ModifiedStudy, |
1497 ResourceType_Study, call); | 1550 ResourceType_Study, call); |
1498 } | 1551 } |
1499 } | 1552 } |
1500 | 1553 |
1505 Replacements replacements; | 1558 Replacements replacements; |
1506 bool removePrivateTags; | 1559 bool removePrivateTags; |
1507 | 1560 |
1508 if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call)) | 1561 if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call)) |
1509 { | 1562 { |
1510 AnonymizeOrModifyResource(removals, replacements, removePrivateTags, | 1563 AnonymizeOrModifyResource(true, removals, replacements, removePrivateTags, |
1511 MetadataType_AnonymizedFrom, ChangeType_AnonymizedStudy, | 1564 MetadataType_AnonymizedFrom, ChangeType_AnonymizedStudy, |
1512 ResourceType_Study, call); | 1565 ResourceType_Study, call); |
1513 } | 1566 } |
1514 } | 1567 } |
1515 | 1568 |
1516 | 1569 |
1517 static void ModifyPatientInplace(RestApi::PostCall& call) | 1570 /*static void ModifyPatientInplace(RestApi::PostCall& call) |
1518 { | 1571 { |
1519 Removals removals; | 1572 Removals removals; |
1520 Replacements replacements; | 1573 Replacements replacements; |
1521 bool removePrivateTags; | 1574 bool removePrivateTags; |
1522 | 1575 |
1523 if (ParseModifyRequest(removals, replacements, removePrivateTags, call)) | 1576 if (ParseModifyRequest(removals, replacements, removePrivateTags, call)) |
1524 { | 1577 { |
1525 AnonymizeOrModifyResource(removals, replacements, removePrivateTags, | 1578 AnonymizeOrModifyResource(false, removals, replacements, removePrivateTags, |
1526 MetadataType_ModifiedFrom, ChangeType_ModifiedPatient, | 1579 MetadataType_ModifiedFrom, ChangeType_ModifiedPatient, |
1527 ResourceType_Patient, call); | 1580 ResourceType_Patient, call); |
1528 } | 1581 } |
1529 } | 1582 }*/ |
1530 | 1583 |
1531 | 1584 |
1532 static void AnonymizePatientInplace(RestApi::PostCall& call) | 1585 static void AnonymizePatientInplace(RestApi::PostCall& call) |
1533 { | 1586 { |
1534 Removals removals; | 1587 Removals removals; |
1535 Replacements replacements; | 1588 Replacements replacements; |
1536 bool removePrivateTags; | 1589 bool removePrivateTags; |
1537 | 1590 |
1538 if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call)) | 1591 if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call)) |
1539 { | 1592 { |
1540 AnonymizeOrModifyResource(removals, replacements, removePrivateTags, | 1593 AnonymizeOrModifyResource(true, removals, replacements, removePrivateTags, |
1541 MetadataType_AnonymizedFrom, ChangeType_AnonymizedPatient, | 1594 MetadataType_AnonymizedFrom, ChangeType_AnonymizedPatient, |
1542 ResourceType_Patient, call); | 1595 ResourceType_Patient, call); |
1543 } | 1596 } |
1544 } | 1597 } |
1545 | 1598 |
1792 Register("/modalities", ListModalities); | 1845 Register("/modalities", ListModalities); |
1793 Register("/modalities/{id}", ListModalityOperations); | 1846 Register("/modalities/{id}", ListModalityOperations); |
1794 Register("/modalities/{id}/find-patient", DicomFindPatient); | 1847 Register("/modalities/{id}/find-patient", DicomFindPatient); |
1795 Register("/modalities/{id}/find-study", DicomFindStudy); | 1848 Register("/modalities/{id}/find-study", DicomFindStudy); |
1796 Register("/modalities/{id}/find-series", DicomFindSeries); | 1849 Register("/modalities/{id}/find-series", DicomFindSeries); |
1850 Register("/modalities/{id}/find-instance", DicomFindInstance); | |
1797 Register("/modalities/{id}/find", DicomFind); | 1851 Register("/modalities/{id}/find", DicomFind); |
1798 Register("/modalities/{id}/store", DicomStore); | 1852 Register("/modalities/{id}/store", DicomStore); |
1799 | 1853 |
1800 Register("/peers", ListPeers); | 1854 Register("/peers", ListPeers); |
1801 Register("/peers/{id}", ListPeerOperations); | 1855 Register("/peers/{id}", ListPeerOperations); |
1802 Register("/peers/{id}/store", PeerStore); | 1856 Register("/peers/{id}/store", PeerStore); |
1803 | 1857 |
1804 Register("/instances/{id}/modify", ModifyInstance); | 1858 Register("/instances/{id}/modify", ModifyInstance); |
1805 Register("/series/{id}/modify", ModifySeriesInplace); | 1859 Register("/series/{id}/modify", ModifySeriesInplace); |
1806 Register("/studies/{id}/modify", ModifyStudyInplace); | 1860 Register("/studies/{id}/modify", ModifyStudyInplace); |
1807 Register("/patients/{id}/modify", ModifyPatientInplace); | 1861 //Register("/patients/{id}/modify", ModifyPatientInplace); |
1808 | 1862 |
1809 Register("/instances/{id}/anonymize", AnonymizeInstance); | 1863 Register("/instances/{id}/anonymize", AnonymizeInstance); |
1810 Register("/series/{id}/anonymize", AnonymizeSeriesInplace); | 1864 Register("/series/{id}/anonymize", AnonymizeSeriesInplace); |
1811 Register("/studies/{id}/anonymize", AnonymizeStudyInplace); | 1865 Register("/studies/{id}/anonymize", AnonymizeStudyInplace); |
1812 Register("/patients/{id}/anonymize", AnonymizePatientInplace); | 1866 Register("/patients/{id}/anonymize", AnonymizePatientInplace); |