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