diff Core/DicomNetworking/DicomUserConnection.cpp @ 3613:c1e2b91c2ab4 storage-commitment

all the abstractions for storage commitment are available
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 21 Jan 2020 17:01:46 +0100
parents 0ce9c1c6474f
children 8c0ef729d5a8
line wrap: on
line diff
--- a/Core/DicomNetworking/DicomUserConnection.cpp	Tue Jan 21 14:20:50 2020 +0100
+++ b/Core/DicomNetworking/DicomUserConnection.cpp	Tue Jan 21 17:01:46 2020 +0100
@@ -1388,13 +1388,17 @@
   static void FillSopSequence(DcmDataset& dataset,
                               const DcmTagKey& tag,
                               const std::vector<std::string>& sopClassUids,
-                              const std::vector<std::string>& sopInstanceUids)
+                              const std::vector<std::string>& sopInstanceUids,
+                              bool hasFailureReason,
+                              Uint16 failureReason)
   {
     for (size_t i = 0; i < sopClassUids.size(); i++)
     {
       std::auto_ptr<DcmItem> item(new DcmItem);
       if (!item->putAndInsertString(DCM_ReferencedSOPClassUID, sopClassUids[i].c_str()).good() ||
           !item->putAndInsertString(DCM_ReferencedSOPInstanceUID, sopInstanceUids[i].c_str()).good() ||
+          (hasFailureReason &&
+           !item->putAndInsertUint16(DCM_FailureReason, failureReason).good()) ||
           !dataset.insertSequenceItem(tag, item.release()).good())
       {
         throw OrthancException(ErrorCode_InternalError);
@@ -1463,7 +1467,8 @@
           throw OrthancException(ErrorCode_InternalError);
         }
 
-        FillSopSequence(dataset, DCM_ReferencedSOPSequence, successSopClassUids, successSopInstanceUids);
+        FillSopSequence(dataset, DCM_ReferencedSOPSequence, successSopClassUids,
+                        successSopInstanceUids, false, 0);
 
         // http://dicom.nema.org/medical/dicom/2019a/output/chtml/part04/sect_J.3.3.html
         if (failureSopClassUids.empty())
@@ -1473,7 +1478,11 @@
         else
         {
           content.EventTypeID = 2;  // "Storage Commitment Request Complete - Failures Exist"
-          FillSopSequence(dataset, DCM_FailedSOPSequence, failureSopClassUids, failureSopInstanceUids);
+
+          // Failure reason
+          // http://dicom.nema.org/medical/dicom/2019a/output/chtml/part03/sect_C.14.html#sect_C.14.1.1
+          FillSopSequence(dataset, DCM_FailedSOPSequence, failureSopClassUids,
+                          failureSopInstanceUids, true, 0x0112 /* No such object instance == 274 */);
         }
 
         int presID = ASC_findAcceptedPresentationContextID(
@@ -1601,7 +1610,7 @@
           throw OrthancException(ErrorCode_InternalError);
         }
 
-        FillSopSequence(dataset, DCM_ReferencedSOPSequence, sopClassUids, sopInstanceUids);
+        FillSopSequence(dataset, DCM_ReferencedSOPSequence, sopClassUids, sopInstanceUids, false, 0);
 
         int presID = ASC_findAcceptedPresentationContextID(
           pimpl_->assoc_, UID_StorageCommitmentPushModelSOPClass);