# HG changeset patch # User Alain Mazy # Date 1790345251 -7200 # Node ID c5e867a181e9dc4a796ce3add1b03c56c7a0277e # Parent be63ecbe0bca654a3b54f3ee6539ed3afe9fe7c3 fix storage commitment triggered by c-store diff -r be63ecbe0bca -r c5e867a181e9 OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp --- a/OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp Fri Sep 25 16:07:31 2026 +0200 @@ -2395,7 +2395,7 @@ } else { - std::list sopClassUids, sopInstanceUids; + std::vector sopClassUids, sopInstanceUids; if (json.isMember(ORTHANC_RESOURCES)) { @@ -2523,17 +2523,7 @@ // Create a "pending" storage commitment report BEFORE the // actual SCU call in order to avoid race conditions std::unique_ptr request(new StorageCommitmentReports::Report(remoteAet)); - - std::list::const_iterator itInstanceUid = sopInstanceUids.begin(); - std::list::const_iterator itClassUid = sopClassUids.begin(); - - while (itInstanceUid != sopInstanceUids.end() && itClassUid != sopClassUids.end()) - { - request->AddRequestedInstance(*itClassUid, *itInstanceUid); - - ++itInstanceUid; - ++itClassUid; - } + request->AddRequestedInstances(sopClassUids, sopInstanceUids); context.GetStorageCommitmentReports().Store( transactionUid, request.release()); @@ -2543,7 +2533,7 @@ std::vector a(sopClassUids.begin(), sopClassUids.end()); std::vector b(sopInstanceUids.begin(), sopInstanceUids.end()); - DicomAssociation::RequestStorageCommitment(parameters, transactionUid, a, b); + DicomAssociation::RequestStorageCommitment(parameters, transactionUid, sopClassUids, sopInstanceUids); } Json::Value result = Json::objectValue; diff -r be63ecbe0bca -r c5e867a181e9 OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp --- a/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp Fri Sep 25 16:07:31 2026 +0200 @@ -91,13 +91,12 @@ // Create a "pending" storage commitment report BEFORE the // actual SCU call in order to avoid race conditions - context_.GetStorageCommitmentReports().Store( - transactionUid_, new StorageCommitmentReports::Report(remoteAet)); + std::unique_ptr request(new StorageCommitmentReports::Report(remoteAet)); + request->AddRequestedInstances(sopClassUids_, sopInstanceUids_); + + context_.GetStorageCommitmentReports().Store(transactionUid_, request.release()); - std::vector a(sopClassUids_.begin(), sopClassUids_.end()); - std::vector b(sopInstanceUids_.begin(), sopInstanceUids_.end()); - - DicomAssociation::RequestStorageCommitment(parameters_, transactionUid_, a, b); + DicomAssociation::RequestStorageCommitment(parameters_, transactionUid_, sopClassUids_, sopInstanceUids_); } } diff -r be63ecbe0bca -r c5e867a181e9 OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h --- a/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h Fri Sep 25 16:07:31 2026 +0200 @@ -44,8 +44,8 @@ // For storage commitment std::string transactionUid_; - std::list sopInstanceUids_; - std::list sopClassUids_; + std::vector sopInstanceUids_; + std::vector sopClassUids_; void OpenConnection(); diff -r be63ecbe0bca -r c5e867a181e9 OrthancServer/Sources/StorageCommitmentReports.cpp --- a/OrthancServer/Sources/StorageCommitmentReports.cpp Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/StorageCommitmentReports.cpp Fri Sep 25 16:07:31 2026 +0200 @@ -41,15 +41,24 @@ } } - void StorageCommitmentReports::Report::AddRequestedInstance(const std::string& sopClassUid, - const std::string& sopInstanceUid) + void StorageCommitmentReports::Report::AddRequestedInstances(const std::vector& sopClassesUids, + const std::vector& sopInstancesUids) { if (isComplete_) { throw OrthancException(ErrorCode_BadSequenceOfCalls); } - requetsedInstances_[sopInstanceUid] = sopClassUid; + if (sopClassesUids.size() != sopInstancesUids.size()) + { + throw OrthancException(ErrorCode_InternalError, "SOPClassesUIDs & SOPInstancesUIDs size mismatch"); + } + + for (size_t i = 0; i < sopClassesUids.size(); ++i) + { + requetsedInstances_[sopInstancesUids[i]] = sopClassesUids[i]; + } + } @@ -75,7 +84,7 @@ { if (isComplete_) { - throw OrthancException(ErrorCode_BadSequenceOfCalls); + THROW_WITH_FILE_AND_LINE_INFO(ErrorCode_BadSequenceOfCalls); } else { diff -r be63ecbe0bca -r c5e867a181e9 OrthancServer/Sources/StorageCommitmentReports.h --- a/OrthancServer/Sources/StorageCommitmentReports.h Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/StorageCommitmentReports.h Fri Sep 25 16:07:31 2026 +0200 @@ -78,8 +78,8 @@ void MarkAsComplete(); - void AddRequestedInstance(const std::string& sopClassUid, - const std::string& sopInstanceUid); + void AddRequestedInstances(const std::vector& sopClassesUids, + const std::vector& sopInstancesUids); void AddSuccess(const std::string& sopClassUid, const std::string& sopInstanceUid);