comparison Core/DicomNetworking/Internals/CommandDispatcher.cpp @ 3736:0540b54324f1 storage-commitment

StorageCommitmentReports
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 10 Mar 2020 17:43:49 +0100
parents 56f2397f027a
children c6658187e4b1
comparison
equal deleted inserted replaced
3735:77183afbf55e 3736:0540b54324f1
926 926
927 return std::string(s); 927 return std::string(s);
928 } 928 }
929 929
930 930
931 static void ReadSopSequence(std::vector<std::string>& sopClassUids, 931 static void ReadSopSequence(
932 std::vector<std::string>& sopInstanceUids, 932 std::vector<std::string>& sopClassUids,
933 DcmDataset& dataset, 933 std::vector<std::string>& sopInstanceUids,
934 const DcmTagKey& tag, 934 std::vector<StorageCommitmentFailureReason>* failureReasons, // Can be NULL
935 bool mandatory) 935 DcmDataset& dataset,
936 const DcmTagKey& tag,
937 bool mandatory)
936 { 938 {
937 sopClassUids.clear(); 939 sopClassUids.clear();
938 sopInstanceUids.clear(); 940 sopInstanceUids.clear();
941
942 if (failureReasons)
943 {
944 failureReasons->clear();
945 }
939 946
940 DcmSequenceOfItems* sequence = NULL; 947 DcmSequenceOfItems* sequence = NULL;
941 if (!dataset.findAndGetSequence(tag, sequence).good() || 948 if (!dataset.findAndGetSequence(tag, sequence).good() ||
942 sequence == NULL) 949 sequence == NULL)
943 { 950 {
955 } 962 }
956 963
957 sopClassUids.reserve(sequence->card()); 964 sopClassUids.reserve(sequence->card());
958 sopInstanceUids.reserve(sequence->card()); 965 sopInstanceUids.reserve(sequence->card());
959 966
967 if (failureReasons)
968 {
969 failureReasons->reserve(sequence->card());
970 }
971
960 for (unsigned long i = 0; i < sequence->card(); i++) 972 for (unsigned long i = 0; i < sequence->card(); i++)
961 { 973 {
962 const char* a = NULL; 974 const char* a = NULL;
963 const char* b = NULL; 975 const char* b = NULL;
964 if (!sequence->getItem(i)->findAndGetString(DCM_ReferencedSOPClassUID, a).good() || 976 if (!sequence->getItem(i)->findAndGetString(DCM_ReferencedSOPClassUID, a).good() ||
966 a == NULL || 978 a == NULL ||
967 b == NULL) 979 b == NULL)
968 { 980 {
969 throw OrthancException(ErrorCode_NetworkProtocol, 981 throw OrthancException(ErrorCode_NetworkProtocol,
970 "Missing Referenced SOP Class/Instance UID " 982 "Missing Referenced SOP Class/Instance UID "
971 "in storage commitment request"); 983 "in storage commitment dataset");
972 } 984 }
973 985
974 sopClassUids.push_back(a); 986 sopClassUids.push_back(a);
975 sopInstanceUids.push_back(b); 987 sopInstanceUids.push_back(b);
988
989 if (failureReasons != NULL)
990 {
991 Uint16 reason;
992 if (!sequence->getItem(i)->findAndGetUint16(DCM_FailureReason, reason).good())
993 {
994 throw OrthancException(ErrorCode_NetworkProtocol,
995 "Missing Failure Reason (0008,1197) "
996 "in storage commitment dataset");
997 }
998
999 failureReasons->push_back(static_cast<StorageCommitmentFailureReason>(reason));
1000 }
976 } 1001 }
977 } 1002 }
978 1003
979 1004
980 OFCondition CommandDispatcher::NActionScp(T_DIMSE_Message* msg, 1005 OFCondition CommandDispatcher::NActionScp(T_DIMSE_Message* msg,
1032 ReadDataset(assoc_, "Cannot read the dataset in N-ACTION SCP", associationTimeout_)); 1057 ReadDataset(assoc_, "Cannot read the dataset in N-ACTION SCP", associationTimeout_));
1033 1058
1034 std::string transactionUid = ReadString(*dataset, DCM_TransactionUID); 1059 std::string transactionUid = ReadString(*dataset, DCM_TransactionUID);
1035 1060
1036 std::vector<std::string> sopClassUid, sopInstanceUid; 1061 std::vector<std::string> sopClassUid, sopInstanceUid;
1037 ReadSopSequence(sopClassUid, sopInstanceUid, 1062 ReadSopSequence(sopClassUid, sopInstanceUid, NULL,
1038 *dataset, DCM_ReferencedSOPSequence, true /* mandatory */); 1063 *dataset, DCM_ReferencedSOPSequence, true /* mandatory */);
1039 1064
1040 LOG(INFO) << "Incoming storage commitment request, with transaction UID: " << transactionUid; 1065 LOG(INFO) << "Incoming storage commitment request, with transaction UID: " << transactionUid;
1041 1066
1042 for (size_t i = 0; i < sopClassUid.size(); i++) 1067 for (size_t i = 0; i < sopClassUid.size(); i++)
1155 ReadDataset(assoc_, "Cannot read the dataset in N-EVENT-REPORT SCP", associationTimeout_)); 1180 ReadDataset(assoc_, "Cannot read the dataset in N-EVENT-REPORT SCP", associationTimeout_));
1156 1181
1157 std::string transactionUid = ReadString(*dataset, DCM_TransactionUID); 1182 std::string transactionUid = ReadString(*dataset, DCM_TransactionUID);
1158 1183
1159 std::vector<std::string> successSopClassUid, successSopInstanceUid; 1184 std::vector<std::string> successSopClassUid, successSopInstanceUid;
1160 ReadSopSequence(successSopClassUid, successSopInstanceUid, 1185 ReadSopSequence(successSopClassUid, successSopInstanceUid, NULL,
1161 *dataset, DCM_ReferencedSOPSequence, 1186 *dataset, DCM_ReferencedSOPSequence,
1162 (report.EventTypeID == 1) /* mandatory in the case of success */); 1187 (report.EventTypeID == 1) /* mandatory in the case of success */);
1163 1188
1164 std::vector<std::string> failedSopClassUid, failedSopInstanceUid; 1189 std::vector<std::string> failedSopClassUid, failedSopInstanceUid;
1190 std::vector<StorageCommitmentFailureReason> failureReasons;
1165 1191
1166 if (report.EventTypeID == 2 /* failures exist */) 1192 if (report.EventTypeID == 2 /* failures exist */)
1167 { 1193 {
1168 ReadSopSequence(failedSopClassUid, failedSopInstanceUid, 1194 ReadSopSequence(failedSopClassUid, failedSopInstanceUid, &failureReasons,
1169 *dataset, DCM_FailedSOPSequence, true); 1195 *dataset, DCM_FailedSOPSequence, true);
1170 } 1196 }
1171 1197
1172 LOG(INFO) << "Incoming storage commitment report, with transaction UID: " << transactionUid; 1198 LOG(INFO) << "Incoming storage commitment report, with transaction UID: " << transactionUid;
1173 1199
1198 std::auto_ptr<IStorageCommitmentRequestHandler> handler 1224 std::auto_ptr<IStorageCommitmentRequestHandler> handler
1199 (server_.GetStorageCommitmentRequestHandlerFactory(). 1225 (server_.GetStorageCommitmentRequestHandlerFactory().
1200 ConstructStorageCommitmentRequestHandler()); 1226 ConstructStorageCommitmentRequestHandler());
1201 1227
1202 handler->HandleReport(transactionUid, successSopClassUid, successSopInstanceUid, 1228 handler->HandleReport(transactionUid, successSopClassUid, successSopInstanceUid,
1203 failedSopClassUid, failedSopInstanceUid, 1229 failedSopClassUid, failedSopInstanceUid, failureReasons,
1204 remoteIp_, remoteAet_, calledAet_); 1230 remoteIp_, remoteAet_, calledAet_);
1205 1231
1206 dimseStatus = 0; // Success 1232 dimseStatus = 0; // Success
1207 } 1233 }
1208 catch (OrthancException& e) 1234 catch (OrthancException& e)