PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
storage_commitment_scp.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
20#ifndef PACS_SERVICES_STORAGE_COMMITMENT_SCP_HPP
21#define PACS_SERVICES_STORAGE_COMMITMENT_SCP_HPP
22
23#include "scp_service.h"
25
27
28#include <atomic>
29#include <memory>
30#include <string>
31
32namespace kcenon::pacs::services {
33
59class storage_commitment_scp final : public scp_service {
60public:
68 std::shared_ptr<storage::storage_interface> storage,
69 std::shared_ptr<di::ILogger> logger = nullptr);
70
71 ~storage_commitment_scp() override = default;
72
73 // =========================================================================
74 // scp_service Interface
75 // =========================================================================
76
77 [[nodiscard]] std::vector<std::string> supported_sop_classes() const override;
78
81 uint8_t context_id,
82 const network::dimse::dimse_message& request) override;
83
84 [[nodiscard]] std::string_view service_name() const noexcept override;
85
86 // =========================================================================
87 // Statistics
88 // =========================================================================
89
90 [[nodiscard]] size_t actions_processed() const noexcept;
91 [[nodiscard]] size_t instances_committed() const noexcept;
92 [[nodiscard]] size_t instances_failed() const noexcept;
93 void reset_statistics() noexcept;
94
95private:
96 // =========================================================================
97 // N-ACTION Handler
98 // =========================================================================
99
100 [[nodiscard]] network::Result<std::monostate> handle_n_action(
101 network::association& assoc,
102 uint8_t context_id,
103 const network::dimse::dimse_message& request);
104
105 // =========================================================================
106 // Instance Verification
107 // =========================================================================
108
110 const std::string& transaction_uid,
111 const std::vector<sop_reference>& references);
112
113 // =========================================================================
114 // N-EVENT-REPORT Sender
115 // =========================================================================
116
117 [[nodiscard]] network::Result<std::monostate> send_event_report(
118 network::association& assoc,
119 uint8_t context_id,
120 const commitment_result& result);
121
122 // =========================================================================
123 // Response Helpers
124 // =========================================================================
125
126 [[nodiscard]] network::Result<std::monostate> send_n_action_response(
127 network::association& assoc,
128 uint8_t context_id,
129 uint16_t message_id,
130 network::dimse::status_code status);
131
132 // =========================================================================
133 // Dataset Parsing Helpers
134 // =========================================================================
135
136 [[nodiscard]] static std::vector<sop_reference> parse_referenced_sop_sequence(
137 const core::dicom_dataset& dataset);
138
139 [[nodiscard]] static core::dicom_dataset build_event_report_dataset(
140 const commitment_result& result);
141
142 // =========================================================================
143 // Member Variables
144 // =========================================================================
145
146 std::shared_ptr<storage::storage_interface> storage_;
147
148 std::atomic<size_t> actions_processed_{0};
149 std::atomic<size_t> instances_committed_{0};
150 std::atomic<size_t> instances_failed_{0};
151};
152
153} // namespace kcenon::pacs::services
154
155#endif // PACS_SERVICES_STORAGE_COMMITMENT_SCP_HPP
const std::shared_ptr< di::ILogger > & logger() const noexcept
Get the current logger instance.
Definition scp_service.h:93
network::Result< std::monostate > handle_message(network::association &assoc, uint8_t context_id, const network::dimse::dimse_message &request) override
Handle an incoming DIMSE message.
storage_commitment_scp(std::shared_ptr< storage::storage_interface > storage, std::shared_ptr< di::ILogger > logger=nullptr)
Construct Storage Commitment SCP with storage backend.
commitment_result verify_instances(const std::string &transaction_uid, const std::vector< sop_reference > &references)
network::Result< std::monostate > handle_n_action(network::association &assoc, uint8_t context_id, const network::dimse::dimse_message &request)
static std::vector< sop_reference > parse_referenced_sop_sequence(const core::dicom_dataset &dataset)
std::shared_ptr< storage::storage_interface > storage_
network::Result< std::monostate > send_n_action_response(network::association &assoc, uint8_t context_id, uint16_t message_id, network::dimse::status_code status)
static core::dicom_dataset build_event_report_dataset(const commitment_result &result)
std::string_view service_name() const noexcept override
Get the service name for logging/debugging.
std::vector< std::string > supported_sop_classes() const override
Get the list of SOP Class UIDs supported by this service.
network::Result< std::monostate > send_event_report(network::association &assoc, uint8_t context_id, const commitment_result &result)
Base class for DICOM SCP (Service Class Provider) services.
Data types for DICOM Storage Commitment Push Model Service.
Abstract storage interface for DICOM persistent storage backends.
Result of a Storage Commitment verification.
Reference to a SOP Instance in a commitment request.