Mercurial > hg > orthanc
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 { |