PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::services::storage_commitment_scu Class Reference

Storage Commitment Push Model SCU. More...

#include <storage_commitment_scu.h>

Collaboration diagram for kcenon::pacs::services::storage_commitment_scu:
Collaboration graph

Public Types

using commitment_callback
 Callback type for commitment results.
 

Public Member Functions

 storage_commitment_scu (std::shared_ptr< di::ILogger > logger=nullptr)
 
 ~storage_commitment_scu ()=default
 
void set_commitment_callback (commitment_callback cb)
 Set callback for commitment result notifications.
 
network::Result< std::monostate > request_commitment (network::association &assoc, uint8_t context_id, const std::string &transaction_uid, const std::vector< sop_reference > &references)
 Send N-ACTION request to commit stored instances.
 
network::Result< commitment_resulthandle_event_report (const network::dimse::dimse_message &event_rq)
 Handle an N-EVENT-REPORT-RQ received from the SCP.
 
size_t requests_sent () const noexcept
 
size_t event_reports_received () const noexcept
 
void reset_statistics () noexcept
 

Static Private Member Functions

static core::dicom_dataset build_action_dataset (const std::string &transaction_uid, const std::vector< sop_reference > &references)
 
static commitment_result parse_event_report_dataset (const core::dicom_dataset &dataset)
 

Private Attributes

std::shared_ptr< di::ILoggerlogger_
 
commitment_callback callback_
 
std::atomic< size_t > requests_sent_ {0}
 
std::atomic< size_t > event_reports_received_ {0}
 

Detailed Description

Storage Commitment Push Model SCU.

Sends N-ACTION requests to an SCP to request storage commitment for specified SOP Instances, and handles N-EVENT-REPORT responses with per-instance verification results.

Usage

// Set callback for commitment results
scu.set_commitment_callback([](const auto& uid, const auto& result) {
// Handle commitment result
});
// Request commitment
auto result = scu.request_commitment(assoc, transaction_uid, references);
void set_commitment_callback(commitment_callback cb)
Set callback for commitment result notifications.
network::Result< std::monostate > request_commitment(network::association &assoc, uint8_t context_id, const std::string &transaction_uid, const std::vector< sop_reference > &references)
Send N-ACTION request to commit stored instances.
std::string_view uid

Definition at line 57 of file storage_commitment_scu.h.

Member Typedef Documentation

◆ commitment_callback

Initial value:
std::function<void(
const std::string& transaction_uid,
const commitment_result& result)>

Callback type for commitment results.

Invoked when an N-EVENT-REPORT is received with the commitment result.

Definition at line 73 of file storage_commitment_scu.h.

Constructor & Destructor Documentation

◆ storage_commitment_scu()

kcenon::pacs::services::storage_commitment_scu::storage_commitment_scu ( std::shared_ptr< di::ILogger > logger = nullptr)
explicit

Definition at line 23 of file storage_commitment_scu.cpp.

25 : logger_(logger ? std::move(logger) : di::null_logger()) {}
std::shared_ptr< ILogger > null_logger()
Get a shared null logger instance.
Definition ilogger.h:271

◆ ~storage_commitment_scu()

kcenon::pacs::services::storage_commitment_scu::~storage_commitment_scu ( )
default

Member Function Documentation

◆ build_action_dataset()

core::dicom_dataset kcenon::pacs::services::storage_commitment_scu::build_action_dataset ( const std::string & transaction_uid,
const std::vector< sop_reference > & references )
staticnodiscardprivate

Definition at line 134 of file storage_commitment_scu.cpp.

136 {
137
138 core::dicom_dataset ds;
139
140 // Transaction UID (0008,1195)
142 transaction_uid);
143
144 // Referenced SOP Sequence (0008,1199)
145 auto& seq = ds.get_or_create_sequence(core::tags::referenced_sop_sequence);
146
147 for (const auto& ref : references) {
148 core::dicom_dataset item;
150 encoding::vr_type::UI, ref.sop_class_uid);
152 encoding::vr_type::UI, ref.sop_instance_uid);
153 seq.push_back(std::move(item));
154 }
155
156 return ds;
157}
constexpr dicom_tag referenced_sop_sequence
Referenced SOP Sequence — instances in commitment request/success (PS3.4 J.3)
constexpr dicom_tag referenced_sop_class_uid
Referenced SOP Class UID (in Sequence)
constexpr dicom_tag referenced_sop_instance_uid
Referenced SOP Instance UID (in Sequence)
constexpr dicom_tag item
Item.
constexpr dicom_tag transaction_uid
Transaction UID — identifies a Storage Commitment transaction (PS3.4 J.3)
@ UI
Unique Identifier (64 chars max)

References kcenon::pacs::core::dicom_dataset::get_or_create_sequence(), kcenon::pacs::core::tags::referenced_sop_class_uid, kcenon::pacs::core::tags::referenced_sop_instance_uid, kcenon::pacs::core::tags::referenced_sop_sequence, kcenon::pacs::core::dicom_dataset::set_string(), kcenon::pacs::core::tags::transaction_uid, and kcenon::pacs::encoding::UI.

Referenced by request_commitment().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ event_reports_received()

size_t kcenon::pacs::services::storage_commitment_scu::event_reports_received ( ) const
nodiscardnoexcept

Definition at line 121 of file storage_commitment_scu.cpp.

121 {
122 return event_reports_received_.load();
123}

References event_reports_received_.

◆ handle_event_report()

network::Result< commitment_result > kcenon::pacs::services::storage_commitment_scu::handle_event_report ( const network::dimse::dimse_message & event_rq)
nodiscard

Handle an N-EVENT-REPORT-RQ received from the SCP.

Parses the event dataset to extract per-instance commitment status and invokes the registered callback.

Parameters
event_rqThe N-EVENT-REPORT-RQ message
Returns
The parsed commitment result

Definition at line 78 of file storage_commitment_scu.cpp.

79 {
80
81 using namespace network::dimse;
82
83 // Verify command is N-EVENT-REPORT-RQ
84 if (event_rq.command() != command_field::n_event_report_rq) {
87 "Expected N-EVENT-REPORT-RQ, got: " +
88 std::string(to_string(event_rq.command())));
89 }
90
91 // Verify dataset is present
92 if (!event_rq.has_dataset()) {
95 "N-EVENT-REPORT-RQ has no dataset");
96 }
97
98 const auto& dataset = event_rq.dataset().value().get();
99
100 // Parse the event report dataset
101 auto result = parse_event_report_dataset(dataset);
102
104
105 // Invoke callback if registered
106 if (callback_) {
107 callback_(result.transaction_uid, result);
108 }
109
110 return kcenon::pacs::Result<commitment_result>::ok(std::move(result));
111}
static commitment_result parse_event_report_dataset(const core::dicom_dataset &dataset)
constexpr int storage_commitment_unexpected_command
Definition result.h:180
constexpr int storage_commitment_missing_sequence
Definition result.h:183
auto to_string(mpps_status status) -> std::string_view
Convert mpps_status to DICOM string representation.
Definition mpps_scp.h:60
Result< T > pacs_error(int code, const std::string &message, const std::string &details="")
Create a PACS error result with module context.
Definition result.h:234

References callback_, kcenon::pacs::network::dimse::dimse_message::command(), kcenon::pacs::network::dimse::dimse_message::dataset(), event_reports_received_, kcenon::pacs::network::dimse::dimse_message::has_dataset(), kcenon::pacs::pacs_error(), parse_event_report_dataset(), kcenon::pacs::error_codes::storage_commitment_missing_sequence, kcenon::pacs::error_codes::storage_commitment_unexpected_command, and kcenon::pacs::services::to_string().

Here is the call graph for this function:

◆ parse_event_report_dataset()

commitment_result kcenon::pacs::services::storage_commitment_scu::parse_event_report_dataset ( const core::dicom_dataset & dataset)
staticnodiscardprivate

Definition at line 159 of file storage_commitment_scu.cpp.

160 {
161
162 commitment_result result;
163
164 // Extract Transaction UID (0008,1195)
165 result.transaction_uid = dataset.get_string(core::tags::transaction_uid);
166 result.timestamp = std::chrono::system_clock::now();
167
168 // Parse Referenced SOP Sequence (0008,1199) — successful instances
169 if (const auto* success_seq =
170 dataset.get_sequence(core::tags::referenced_sop_sequence)) {
171 for (const auto& item : *success_seq) {
172 sop_reference ref;
173 ref.sop_class_uid = item.get_string(
175 ref.sop_instance_uid = item.get_string(
177 if (!ref.sop_class_uid.empty() && !ref.sop_instance_uid.empty()) {
178 result.success_references.push_back(std::move(ref));
179 }
180 }
181 }
182
183 // Parse Failed SOP Sequence (0008,1198) — failed instances
184 if (const auto* failed_seq =
185 dataset.get_sequence(core::tags::failed_sop_sequence)) {
186 for (const auto& item : *failed_seq) {
187 sop_reference ref;
188 ref.sop_class_uid = item.get_string(
190 ref.sop_instance_uid = item.get_string(
192
194 auto reason_val = item.get_numeric<uint16_t>(
196 if (reason_val.has_value()) {
197 reason = static_cast<commitment_failure_reason>(
198 reason_val.value());
199 }
200
201 if (!ref.sop_class_uid.empty() && !ref.sop_instance_uid.empty()) {
202 result.failed_references.emplace_back(std::move(ref), reason);
203 }
204 }
205 }
206
207 return result;
208}
constexpr dicom_tag failed_sop_sequence
Failed SOP Sequence — instances that failed commitment (PS3.4 J.3)
constexpr dicom_tag failure_reason
Failure Reason — reason code for commitment failure (PS3.4 Table J.3-2)
commitment_failure_reason
Failure reason codes for Storage Commitment.
@ processing_failure
General processing failure.

References kcenon::pacs::services::commitment_result::failed_references, kcenon::pacs::core::tags::failed_sop_sequence, kcenon::pacs::core::tags::failure_reason, kcenon::pacs::core::dicom_dataset::get_sequence(), kcenon::pacs::core::dicom_dataset::get_string(), kcenon::pacs::services::processing_failure, kcenon::pacs::core::tags::referenced_sop_class_uid, kcenon::pacs::core::tags::referenced_sop_instance_uid, kcenon::pacs::core::tags::referenced_sop_sequence, kcenon::pacs::services::sop_reference::sop_class_uid, kcenon::pacs::services::sop_reference::sop_instance_uid, kcenon::pacs::services::commitment_result::success_references, kcenon::pacs::services::commitment_result::timestamp, kcenon::pacs::core::tags::transaction_uid, and kcenon::pacs::services::commitment_result::transaction_uid.

Referenced by handle_event_report().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ request_commitment()

network::Result< std::monostate > kcenon::pacs::services::storage_commitment_scu::request_commitment ( network::association & assoc,
uint8_t context_id,
const std::string & transaction_uid,
const std::vector< sop_reference > & references )
nodiscard

Send N-ACTION request to commit stored instances.

Builds and sends an N-ACTION-RQ with the specified Transaction UID and Referenced SOP Sequence to the connected SCP.

Parameters
assocThe established association with the SCP
context_idThe presentation context ID for Storage Commitment
transaction_uidUnique identifier for this commitment request
referencesSOP Instance references to commit
Returns
Success or error

Definition at line 39 of file storage_commitment_scu.cpp.

43 {
44
45 using namespace network::dimse;
46
47 if (transaction_uid.empty() || references.empty()) {
50 "Transaction UID and references must not be empty");
51 }
52
53 // Build N-ACTION-RQ
54 auto action_rq = make_n_action_rq(
55 1, // message_id
59
60 // Build and attach action dataset
61 auto action_dataset = build_action_dataset(transaction_uid, references);
62 action_rq.set_dataset(std::move(action_dataset));
63
64 // Send N-ACTION-RQ
65 auto send_result = assoc.send_dimse(context_id, action_rq);
66 if (send_result.is_err()) {
67 return send_result;
68 }
69
71 return kcenon::pacs::ok();
72}
static core::dicom_dataset build_action_dataset(const std::string &transaction_uid, const std::vector< sop_reference > &references)
constexpr int storage_commitment_missing_transaction_uid
Definition result.h:182
constexpr std::string_view storage_commitment_push_model_sop_instance_uid
Storage Commitment Push Model SOP Instance UID (Well-Known)
constexpr std::string_view storage_commitment_push_model_sop_class_uid
Storage Commitment Push Model SOP Class UID (PS3.4 Table J.3-1)
constexpr uint16_t storage_commitment_action_type_request
N-ACTION: Request Storage Commitment (Action Type ID = 1)
VoidResult pacs_void_error(int code, const std::string &message, const std::string &details="")
Create a PACS void error result.
Definition result.h:249

References build_action_dataset(), kcenon::pacs::pacs_void_error(), requests_sent_, kcenon::pacs::network::association::send_dimse(), kcenon::pacs::services::storage_commitment_action_type_request, kcenon::pacs::error_codes::storage_commitment_missing_transaction_uid, kcenon::pacs::services::storage_commitment_push_model_sop_class_uid, and kcenon::pacs::services::storage_commitment_push_model_sop_instance_uid.

Here is the call graph for this function:

◆ requests_sent()

size_t kcenon::pacs::services::storage_commitment_scu::requests_sent ( ) const
nodiscardnoexcept

Definition at line 117 of file storage_commitment_scu.cpp.

117 {
118 return requests_sent_.load();
119}

References requests_sent_.

◆ reset_statistics()

void kcenon::pacs::services::storage_commitment_scu::reset_statistics ( )
noexcept

Definition at line 125 of file storage_commitment_scu.cpp.

125 {
126 requests_sent_ = 0;
128}

References event_reports_received_, and requests_sent_.

◆ set_commitment_callback()

void kcenon::pacs::services::storage_commitment_scu::set_commitment_callback ( commitment_callback cb)

Set callback for commitment result notifications.

Parameters
cbThe callback function

Definition at line 31 of file storage_commitment_scu.cpp.

31 {
32 callback_ = std::move(cb);
33}

References callback_.

Member Data Documentation

◆ callback_

commitment_callback kcenon::pacs::services::storage_commitment_scu::callback_
private

Definition at line 146 of file storage_commitment_scu.h.

Referenced by handle_event_report(), and set_commitment_callback().

◆ event_reports_received_

std::atomic<size_t> kcenon::pacs::services::storage_commitment_scu::event_reports_received_ {0}
private

Definition at line 149 of file storage_commitment_scu.h.

149{0};

Referenced by event_reports_received(), handle_event_report(), and reset_statistics().

◆ logger_

std::shared_ptr<di::ILogger> kcenon::pacs::services::storage_commitment_scu::logger_
private

Definition at line 145 of file storage_commitment_scu.h.

◆ requests_sent_

std::atomic<size_t> kcenon::pacs::services::storage_commitment_scu::requests_sent_ {0}
private

Definition at line 148 of file storage_commitment_scu.h.

148{0};

Referenced by request_commitment(), requests_sent(), and reset_statistics().


The documentation for this class was generated from the following files: