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

Adapter for integrating network_system for DICOM protocol. More...

#include <network_adapter.h>

Collaboration diagram for kcenon::pacs::integration::network_adapter:
Collaboration graph

Public Types

using session_ptr = std::shared_ptr<dicom_session>
 Session pointer type.
 
using connection_callback = std::function<void(session_ptr)>
 Connection callback type.
 
using disconnection_callback = std::function<void(const std::string&)>
 Disconnection callback type.
 
using error_callback = std::function<void(session_ptr, std::error_code)>
 Error callback type.
 

Static Public Member Functions

static std::unique_ptr< network::dicom_servercreate_server (const network::server_config &config, const tls_config &tls_cfg={})
 Create a DICOM server using network_system.
 
static Result< session_ptrconnect (const connection_config &config)
 
static Result< session_ptrconnect (const std::string &host, uint16_t port, std::chrono::milliseconds timeout=std::chrono::seconds{30})
 Connect to a remote DICOM peer (simplified overload)
 
static Result< std::monostate > configure_tls (const tls_config &config)
 
static session_ptr wrap_session (std::shared_ptr< network_system::session::messaging_session > session)
 Wrap a network_system session for DICOM communication.
 
static session_ptr wrap_session (std::shared_ptr< network_system::session::secure_session > session)
 Wrap a secure network_system session for DICOM communication.
 
static session_ptr wrap_session (std::shared_ptr< kcenon::network::interfaces::i_session > session)
 Wrap a public i_session interface for DICOM communication.
 

Private Member Functions

 network_adapter ()=delete
 
 ~network_adapter ()=delete
 
 network_adapter (const network_adapter &)=delete
 
network_adapteroperator= (const network_adapter &)=delete
 

Detailed Description

Adapter for integrating network_system for DICOM protocol.

This class provides a PACS-specific interface to network_system's TCP server and client functionality. Key features include:

  • Server Creation: Create DICOM servers using network_system's messaging_server
  • Client Connection: Connect to remote DICOM peers with timeout support
  • TLS Support: Optional TLS 1.2/1.3 for DICOM secure transport
  • Session Management: Wrap network sessions for DICOM PDU handling

Thread Safety: All public methods are thread-safe and can be called from any thread.

Definition at line 223 of file network_adapter.h.

Member Typedef Documentation

◆ connection_callback

◆ disconnection_callback

using kcenon::pacs::integration::network_adapter::disconnection_callback = std::function<void(const std::string&)>

◆ error_callback

◆ session_ptr

Constructor & Destructor Documentation

◆ network_adapter() [1/2]

kcenon::pacs::integration::network_adapter::network_adapter ( )
privatedelete

◆ ~network_adapter()

kcenon::pacs::integration::network_adapter::~network_adapter ( )
privatedelete

◆ network_adapter() [2/2]

kcenon::pacs::integration::network_adapter::network_adapter ( const network_adapter & )
privatedelete

Member Function Documentation

◆ configure_tls()

Result< std::monostate > kcenon::pacs::integration::network_adapter::configure_tls ( const tls_config & config)
staticnodiscard
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/network_adapter.h.

Definition at line 163 of file network_adapter.cpp.

163 {
164 if (!config.enabled) {
165 return Result<std::monostate>(std::monostate{});
166 }
167
168 // Validate certificate path
169 if (!std::filesystem::exists(config.cert_path)) {
171 "TLS configuration error: certificate file not found: " +
172 config.cert_path.string()));
173 }
174
175 // Validate key path
176 if (!std::filesystem::exists(config.key_path)) {
178 "TLS configuration error: key file not found: " +
179 config.key_path.string()));
180 }
181
182 // Validate CA path if specified
183 if (!config.ca_path.empty() && !std::filesystem::exists(config.ca_path)) {
185 "TLS configuration error: CA certificate file not found: " +
186 config.ca_path.string()));
187 }
188
189 // TLS version validation
190 if (config.min_version != tls_config::tls_version::v1_2 &&
191 config.min_version != tls_config::tls_version::v1_3) {
193 "TLS configuration error: unsupported TLS version"));
194 }
195
196 return Result<std::monostate>(std::monostate{});
197}
kcenon::common::Result< T > Result
Result type alias for PACS operations.
Definition result.h:30
kcenon::common::error_info error_info
Error information type.
Definition result.h:40

References kcenon::pacs::integration::tls_config::ca_path, kcenon::pacs::integration::tls_config::cert_path, kcenon::pacs::integration::tls_config::enabled, kcenon::pacs::integration::tls_config::key_path, kcenon::pacs::integration::tls_config::min_version, kcenon::pacs::integration::tls_config::v1_2, and kcenon::pacs::integration::tls_config::v1_3.

◆ connect() [1/2]

Result< network_adapter::session_ptr > kcenon::pacs::integration::network_adapter::connect ( const connection_config & config)
staticnodiscard
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/network_adapter.h.

Definition at line 53 of file network_adapter.cpp.

53 {
54 // Validate configuration
55 if (config.host.empty()) {
56 return Result<session_ptr>(error_info("Connection failed: empty host"));
57 }
58
59 if (config.port == 0) {
60 return Result<session_ptr>(error_info("Connection failed: invalid port"));
61 }
62
63 // Validate TLS configuration if enabled
64 if (config.tls.enabled && !config.tls.is_valid()) {
65 return Result<session_ptr>(error_info("Connection failed: invalid TLS configuration"));
66 }
67
68 try {
69 // Create TCP client via tcp_facade
70 kcenon::network::facade::tcp_facade facade;
71 kcenon::network::facade::tcp_facade::client_config client_cfg;
72 client_cfg.host = config.host;
73 client_cfg.port = config.port;
74 client_cfg.client_id = "pacs_client";
75 client_cfg.timeout = config.timeout;
76 client_cfg.use_ssl = config.tls.enabled;
77 if (config.tls.enabled && !config.tls.ca_path.empty()) {
78 client_cfg.ca_cert_path = config.tls.ca_path.string();
79 }
80 client_cfg.verify_certificate = config.tls.verify_peer;
81
82 // Handle both old API (returns shared_ptr) and new API (returns Result<shared_ptr>)
83 auto client = [](auto raw) -> std::shared_ptr<kcenon::network::interfaces::i_protocol_client> {
84 if constexpr (requires { raw.is_err(); raw.value(); }) {
85 return raw.is_err() ? nullptr : std::move(raw.value());
86 } else {
87 return std::move(raw);
88 }
89 }(facade.create_client(client_cfg));
90 if (!client) {
91 return Result<session_ptr>(error_info("Connection failed: could not create client"));
92 }
93
94 // Set up promise/future for synchronous connection
95 std::promise<std::error_code> connect_promise;
96 auto connect_future = connect_promise.get_future();
97
98 // Use deprecated callbacks for synchronous connect pattern
99 // (observer pattern would be preferred for long-lived clients)
100#if defined(__clang__) || defined(__GNUC__)
101#pragma GCC diagnostic push
102#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
103#endif
104 client->set_connected_callback([&connect_promise]() {
105 connect_promise.set_value(std::error_code{});
106 });
107
108 client->set_error_callback([&connect_promise](std::error_code ec) {
109 try {
110 connect_promise.set_value(ec);
111 } catch (const std::future_error&) {
112 // Promise already satisfied
113 }
114 });
115#if defined(__clang__) || defined(__GNUC__)
116#pragma GCC diagnostic pop
117#endif
118
119 // Start connection
120 auto start_result = client->start(config.host, config.port);
121 if (start_result.is_err()) {
122 return Result<session_ptr>(error_info("Connection failed: unable to start client"));
123 }
124
125 // Wait for connection with timeout
126 auto status = connect_future.wait_for(config.timeout);
127 if (status == std::future_status::timeout) {
128 (void)client->stop();
129 return Result<session_ptr>(error_info("Connection failed: timeout"));
130 }
131
132 // Check connection result
133 auto ec = connect_future.get();
134 if (ec) {
135 (void)client->stop();
136 return Result<session_ptr>(error_info("Connection failed: " + ec.message()));
137 }
138
139 // Connection successful but client-based session wrapping
140 // is not yet fully implemented for the public API
141 return Result<session_ptr>(error_info("Connection not yet fully implemented"));
142
143 } catch (const std::exception& e) {
144 return Result<session_ptr>(
145 error_info(std::string("Connection failed: ") + e.what()));
146 }
147}
constexpr dicom_tag status
Status.

References kcenon::pacs::integration::tls_config::ca_path, kcenon::pacs::integration::tls_config::enabled, kcenon::pacs::integration::connection_config::host, kcenon::pacs::integration::tls_config::is_valid(), kcenon::pacs::integration::connection_config::port, kcenon::pacs::integration::connection_config::timeout, kcenon::pacs::integration::connection_config::tls, and kcenon::pacs::integration::tls_config::verify_peer.

Referenced by kcenon::pacs::di::DicomNetworkService::connect(), and connect().

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

◆ connect() [2/2]

Result< network_adapter::session_ptr > kcenon::pacs::integration::network_adapter::connect ( const std::string & host,
uint16_t port,
std::chrono::milliseconds timeout = std::chrono::seconds{30} )
staticnodiscard

Connect to a remote DICOM peer (simplified overload)

Parameters
hostRemote host address
portRemote port
timeoutConnection timeout
Returns
Result containing session on success, or error message

Definition at line 150 of file network_adapter.cpp.

152 {
153 connection_config config{host, port};
154 config.timeout = timeout;
155 return connect(config);
156}
static Result< session_ptr > connect(const connection_config &config)
constexpr int timeout
Lock timeout exceeded.

References connect(), and kcenon::pacs::integration::connection_config::timeout.

Here is the call graph for this function:

◆ create_server()

std::unique_ptr< network::dicom_server > kcenon::pacs::integration::network_adapter::create_server ( const network::server_config & config,
const tls_config & tls_cfg = {} )
staticnodiscard

Create a DICOM server using network_system.

Creates and configures a network_system messaging_server (or secure_messaging_server if TLS is enabled) for DICOM communication.

Parameters
configServer configuration
tls_cfgOptional TLS configuration
Returns
Unique pointer to dicom_server, or nullptr on failure
Note
The returned server is not started; call start() to begin accepting
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/network_adapter.h.

Definition at line 27 of file network_adapter.cpp.

28 {
29 // Validate configuration
30 if (config.ae_title.empty()) {
31 return nullptr;
32 }
33
34 if (config.port == 0) {
35 return nullptr;
36 }
37
38 // Validate TLS configuration if enabled
39 if (tls_cfg.enabled && !tls_cfg.is_valid()) {
40 return nullptr;
41 }
42
43 // Create DICOM server with the provided configuration
44 // The dicom_server internally uses network_system for TCP operations
45 return std::make_unique<network::dicom_server>(config);
46}

References kcenon::pacs::network::server_config::ae_title, kcenon::pacs::integration::tls_config::enabled, kcenon::pacs::integration::tls_config::is_valid(), and kcenon::pacs::network::server_config::port.

Here is the call graph for this function:

◆ operator=()

network_adapter & kcenon::pacs::integration::network_adapter::operator= ( const network_adapter & )
privatedelete

◆ wrap_session() [1/3]

network_adapter::session_ptr kcenon::pacs::integration::network_adapter::wrap_session ( std::shared_ptr< kcenon::network::interfaces::i_session > session)
staticnodiscard

Wrap a public i_session interface for DICOM communication.

Parameters
sessionThe i_session interface to wrap
Returns
Wrapped DICOM session

Definition at line 222 of file network_adapter.cpp.

223 {
224 if (!session) {
225 return nullptr;
226 }
227 return std::make_shared<dicom_session>(std::move(session));
228}

◆ wrap_session() [2/3]

network_adapter::session_ptr kcenon::pacs::integration::network_adapter::wrap_session ( std::shared_ptr< network_system::session::messaging_session > session)
staticnodiscard

Wrap a network_system session for DICOM communication.

Creates a dicom_session wrapper around a network_system messaging_session, enabling PDU-level DICOM communication.

Parameters
sessionThe network_system session to wrap
Returns
Wrapped DICOM session
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/network_adapter.h.

Definition at line 204 of file network_adapter.cpp.

205 {
206 if (!session) {
207 return nullptr;
208 }
209 return std::make_shared<dicom_session>(std::move(session));
210}

◆ wrap_session() [3/3]

network_adapter::session_ptr kcenon::pacs::integration::network_adapter::wrap_session ( std::shared_ptr< network_system::session::secure_session > session)
staticnodiscard

Wrap a secure network_system session for DICOM communication.

Parameters
sessionThe secure network_system session to wrap
Returns
Wrapped DICOM session

Definition at line 213 of file network_adapter.cpp.

214 {
215 if (!session) {
216 return nullptr;
217 }
218 return std::make_shared<dicom_session>(std::move(session));
219}

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