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);