comparison Core/DicomNetworking/DicomUserConnection.cpp @ 3606:33ba63637d48 storage-commitment

DicomUserConnection: sending N-EVENT-REPORT-RQ
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 16 Jan 2020 19:24:52 +0100
parents 05872838ebf3
children d0ecb355db33
comparison
equal deleted inserted replaced
3605:05872838ebf3 3606:33ba63637d48
1367 remotePort_ == remote.GetPortNumber() && 1367 remotePort_ == remote.GetPortNumber() &&
1368 manufacturer_ == remote.GetManufacturer()); 1368 manufacturer_ == remote.GetManufacturer());
1369 } 1369 }
1370 1370
1371 1371
1372 void DicomUserConnection::ReportStorageCommitment() 1372 static void FillSopSequence(DcmDataset& dataset,
1373 { 1373 const DcmTagKey& tag,
1374 const std::vector<std::string>& sopClassUids,
1375 const std::vector<std::string>& sopInstanceUids)
1376 {
1377 for (size_t i = 0; i < sopClassUids.size(); i++)
1378 {
1379 std::auto_ptr<DcmItem> item(new DcmItem);
1380 if (!item->putAndInsertString(DCM_ReferencedSOPClassUID, sopClassUids[i].c_str()).good() ||
1381 !item->putAndInsertString(DCM_ReferencedSOPInstanceUID, sopInstanceUids[i].c_str()).good() ||
1382 !dataset.insertSequenceItem(tag, item.release()).good())
1383 {
1384 throw OrthancException(ErrorCode_InternalError);
1385 }
1386 }
1387 }
1388
1389
1390
1391
1392 void DicomUserConnection::ReportStorageCommitment(
1393 const std::string& transactionUid,
1394 const std::vector<std::string>& successSopClassUids,
1395 const std::vector<std::string>& successSopInstanceUids,
1396 const std::vector<std::string>& failureSopClassUids,
1397 const std::vector<std::string>& failureSopInstanceUids)
1398 {
1399 if (successSopClassUids.size() != successSopInstanceUids.size() ||
1400 failureSopClassUids.size() != failureSopInstanceUids.size())
1401 {
1402 throw OrthancException(ErrorCode_ParameterOutOfRange);
1403 }
1404
1374 if (IsOpen()) 1405 if (IsOpen())
1375 { 1406 {
1376 Close(); 1407 Close();
1377 } 1408 }
1378 1409
1387 * 1418 *
1388 * Status code: 1419 * Status code:
1389 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part07/chapter_10.html#sect_10.1.1.1.8 1420 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part07/chapter_10.html#sect_10.1.1.1.8
1390 **/ 1421 **/
1391 1422
1392 // TODO 1423 T_DIMSE_Message response;
1424 memset(&response, 0, sizeof(response));
1425 response.CommandField = DIMSE_N_EVENT_REPORT_RQ;
1426
1427 T_DIMSE_N_EventReportRQ& content = response.msg.NEventReportRQ;
1428 content.MessageID = pimpl_->assoc_->nextMsgID;
1429 strncpy(content.AffectedSOPClassUID, UID_StorageCommitmentPushModelSOPClass, DIC_UI_LEN);
1430 strncpy(content.AffectedSOPInstanceUID, UID_StorageCommitmentPushModelSOPInstance, DIC_UI_LEN);
1431 content.DataSetType = DIMSE_DATASET_PRESENT;
1432
1433 DcmDataset dataset;
1434 if (!dataset.putAndInsertString(DCM_TransactionUID, transactionUid.c_str()).good())
1435 {
1436 throw OrthancException(ErrorCode_InternalError);
1437 }
1438
1439 FillSopSequence(dataset, DCM_ReferencedSOPSequence, successSopClassUids, successSopInstanceUids);
1440
1441 // http://dicom.nema.org/medical/dicom/2019a/output/chtml/part04/sect_J.3.3.html
1442 if (failureSopClassUids.empty())
1443 {
1444 content.EventTypeID = 1; // "Storage Commitment Request Successful"
1445 }
1446 else
1447 {
1448 content.EventTypeID = 2; // "Storage Commitment Request Complete - Failures Exist"
1449 FillSopSequence(dataset, DCM_FailedSOPSequence, failureSopClassUids, failureSopInstanceUids);
1450 }
1451
1452 dataset.writeXML(std::cout);
1453
1454 int presID = ASC_findAcceptedPresentationContextID(
1455 pimpl_->assoc_, UID_StorageCommitmentPushModelSOPClass);
1456 if (presID == 0)
1457 {
1458 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - "
1459 "Unable to send N-EVENT-REPORT to AET: " + remoteAet_);
1460 }
1461
1462 if (!DIMSE_sendMessageUsingMemoryData(
1463 pimpl_->assoc_, presID, &response, NULL /* status detail */,
1464 &dataset, NULL /* callback */, NULL /* callback context */,
1465 NULL /* commandSet */).good())
1466 {
1467 throw OrthancException(ErrorCode_NetworkProtocol);
1468 }
1469
1470 // TODO - Read answer
1393 1471
1394 Close(); 1472 Close();
1395 } 1473 }
1396 catch (OrthancException&) 1474 catch (OrthancException&)
1397 { 1475 {