comparison OrthancServer/OrthancRestApi/OrthancRestModalities.cpp @ 3734:4fc24b69446a storage-commitment

triggering storage commitment scu from REST API
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 10 Mar 2020 13:22:02 +0100
parents 56f2397f027a
children f29843323daf
comparison
equal deleted inserted replaced
3731:e7ff4f9b34bd 3734:4fc24b69446a
961 if (moveOriginatorID != 0) 961 if (moveOriginatorID != 0)
962 { 962 {
963 job->SetMoveOriginator(moveOriginatorAET, moveOriginatorID); 963 job->SetMoveOriginator(moveOriginatorAET, moveOriginatorID);
964 } 964 }
965 965
966 // New in Orthanc 1.6.0
967 if (Toolbox::GetJsonBooleanField(request, "StorageCommitment", false))
968 {
969 job->EnableStorageCommitment(true);
970 }
971
966 OrthancRestApi::GetApi(call).SubmitCommandsJob 972 OrthancRestApi::GetApi(call).SubmitCommandsJob
967 (call, job.release(), true /* synchronous by default */, request); 973 (call, job.release(), true /* synchronous by default */, request);
968 } 974 }
969 975
970 976
1297 throw OrthancException(ErrorCode_BadFileFormat, "Must provide a JSON object"); 1303 throw OrthancException(ErrorCode_BadFileFormat, "Must provide a JSON object");
1298 } 1304 }
1299 } 1305 }
1300 1306
1301 1307
1302 static void TestStorageCommitment(RestApiPostCall& call) 1308 static void StorageCommitment(RestApiPostCall& call)
1303 { 1309 {
1304 ServerContext& context = OrthancRestApi::GetContext(call); 1310 ServerContext& context = OrthancRestApi::GetContext(call);
1305 1311
1306 Json::Value json; 1312 Json::Value json;
1307 if (call.ParseJsonRequest(json)) 1313 if (call.ParseJsonRequest(json) ||
1308 { 1314 json.type() != Json::arrayValue)
1309 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); 1315 {
1310 const RemoteModalityParameters remote = 1316 std::vector<std::string> sopClassUids, sopInstanceUids;
1311 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 1317 sopClassUids.resize(json.size());
1312 1318 sopInstanceUids.resize(json.size());
1313 { 1319
1320 for (Json::Value::ArrayIndex i = 0; i < json.size(); i++)
1321 {
1322 if (json[i].type() == Json::arrayValue)
1323 {
1324 if (json[i].size() != 2 ||
1325 json[i][0].type() != Json::stringValue ||
1326 json[i][1].type() != Json::stringValue)
1327 {
1328 throw OrthancException(ErrorCode_BadFileFormat,
1329 "An instance entry must provide an array with 2 strings: "
1330 "SOP Class UID and SOP Instance UID");
1331 }
1332 else
1333 {
1334 sopClassUids[i] = json[i][0].asString();
1335 sopInstanceUids[i] = json[i][1].asString();
1336 }
1337 }
1338 else if (json[i].type() == Json::objectValue)
1339 {
1340 static const char* const SOP_CLASS_UID = "SOPClassUID";
1341 static const char* const SOP_INSTANCE_UID = "SOPInstanceUID";
1342
1343 if (!json[i].isMember(SOP_CLASS_UID) ||
1344 !json[i].isMember(SOP_INSTANCE_UID) ||
1345 json[i][SOP_CLASS_UID].type() != Json::stringValue ||
1346 json[i][SOP_INSTANCE_UID].type() != Json::stringValue)
1347 {
1348 throw OrthancException(ErrorCode_BadFileFormat,
1349 "An instance entry must provide an object with 2 string fiels: "
1350 "\"" + std::string(SOP_CLASS_UID) + "\" and \"" +
1351 std::string(SOP_INSTANCE_UID));
1352 }
1353 else
1354 {
1355 sopClassUids[i] = json[i][SOP_CLASS_UID].asString();
1356 sopInstanceUids[i] = json[i][SOP_INSTANCE_UID].asString();
1357 }
1358 }
1359 else
1360 {
1361 throw OrthancException(ErrorCode_BadFileFormat,
1362 "JSON array or object is expected to specify one "
1363 "instance to be queried, found: " + json[i].toStyledString());
1364 }
1365 }
1366
1367 const std::string transaction = Toolbox::GenerateDicomPrivateUniqueIdentifier();
1368
1369 {
1370 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle();
1371 const RemoteModalityParameters remote =
1372 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
1373
1314 DicomUserConnection scu(localAet, remote); 1374 DicomUserConnection scu(localAet, remote);
1315 1375 scu.RequestStorageCommitment(transaction, sopClassUids, sopInstanceUids);
1316 std::vector<std::string> sopClassUids, sopInstanceUids; 1376 }
1317 sopClassUids.push_back("a"); 1377
1318 sopInstanceUids.push_back("b"); 1378 Json::Value result = Json::objectValue;
1319 sopClassUids.push_back("1.2.840.10008.5.1.4.1.1.6.1"); 1379 result["ID"] = transaction;
1320 sopInstanceUids.push_back("1.2.840.113543.6.6.4.7.64234348190163144631511103849051737563212"); 1380 result["Path"] = "/storage-commitment/" + transaction;
1321
1322 std::string t = Toolbox::GenerateDicomPrivateUniqueIdentifier();
1323 scu.RequestStorageCommitment(t, sopClassUids, sopInstanceUids);
1324 }
1325
1326 Json::Value result;
1327 call.GetOutput().AnswerJson(result); 1381 call.GetOutput().AnswerJson(result);
1328 } 1382 }
1329 else 1383 else
1330 { 1384 {
1331 throw OrthancException(ErrorCode_BadFileFormat, "Must provide a JSON object"); 1385 throw OrthancException(ErrorCode_BadFileFormat,
1386 "Must provide a JSON array with a list of instances");
1332 } 1387 }
1333 } 1388 }
1334 1389
1335 1390
1336 void OrthancRestApi::RegisterModalities() 1391 void OrthancRestApi::RegisterModalities()
1375 Register("/peers/{id}/store", PeerStore); 1430 Register("/peers/{id}/store", PeerStore);
1376 Register("/peers/{id}/system", PeerSystem); 1431 Register("/peers/{id}/system", PeerSystem);
1377 1432
1378 Register("/modalities/{id}/find-worklist", DicomFindWorklist); 1433 Register("/modalities/{id}/find-worklist", DicomFindWorklist);
1379 1434
1380 Register("/modalities/{id}/storage-commitment", TestStorageCommitment); 1435 Register("/modalities/{id}/storage-commitment", StorageCommitment);
1381 } 1436 }
1382 } 1437 }