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_server > create_server (const network::server_config &config, const tls_config &tls_cfg={})
 Create a DICOM server using network_system.
 
static Result< session_ptr > connect (const connection_config &config)
 Connect to a remote DICOM peer.
 
static Result< session_ptr > connect (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)
 Configure TLS settings.
 
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_adapter & operator= (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.

Example:
// Create a DICOM server
config.ae_title = "MY_SCP";
config.port = 11112;
auto server = network_adapter::create_server(config);
if (server) {
server->start();
}
// Connect to a remote peer
connection_config conn_config{"192.168.1.100", 104};
conn_config.timeout = std::chrono::seconds{10};
auto result = network_adapter::connect(conn_config);
if (result.is_ok()) {
auto& session = result.value();
// Use session for DICOM communication
}
static std::unique_ptr< network::dicom_server > create_server(const network::server_config &config, const tls_config &tls_cfg={})
Create a DICOM server using network_system.
static Result< session_ptr > connect(const connection_config &config)
Connect to a remote DICOM peer.
Configuration for client connections.
std::chrono::milliseconds timeout
Connection timeout.
Configuration for DICOM server.
uint16_t port
Port to listen on (default: 11112, standard alternate DICOM port)
std::string ae_title
Application Entity Title for this server (16 chars max)

Definition at line 223 of file network_adapter.h.

Member Typedef Documentation

◆ connection_callback

Connection callback type.

Definition at line 233 of file network_adapter.h.

◆ disconnection_callback

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

Disconnection callback type.

Definition at line 236 of file network_adapter.h.

◆ error_callback

using kcenon::pacs::integration::network_adapter::error_callback = std::function<void(session_ptr, std::error_code)>

Error callback type.

Definition at line 239 of file network_adapter.h.

◆ session_ptr

Session pointer type.

Definition at line 230 of file network_adapter.h.

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

Configure TLS settings.

Validates and prepares TLS configuration for use with secure connections. This should be called before creating servers or connecting to peers with TLS enabled.

Parameters
configTLS configuration to validate and apply
Returns
Result indicating success or validation error
Example:
tls.enabled = true;
tls.cert_path = "/path/to/server.crt";
tls.key_path = "/path/to/server.key";
tls.ca_path = "/path/to/ca.crt";
auto result = network_adapter::configure_tls(tls);
if (result.is_err()) {
std::cerr << "TLS config error: " << result.error() << '\n';
}
static Result< std::monostate > configure_tls(const tls_config &config)
Configure TLS settings.
Configuration for TLS/SSL secure transport.

Definition at line 158 of file network_adapter.cpp.

158 {
159 if (!config.enabled) {
160 return Result<std::monostate>(std::monostate{});
161 }
162
163 // Validate certificate path
164 if (!std::filesystem::exists(config.cert_path)) {
166 "TLS configuration error: certificate file not found: " +
167 config.cert_path.string()));
168 }
169
170 // Validate key path
171 if (!std::filesystem::exists(config.key_path)) {
173 "TLS configuration error: key file not found: " +
174 config.key_path.string()));
175 }
176
177 // Validate CA path if specified
178 if (!config.ca_path.empty() && !std::filesystem::exists(config.ca_path)) {
180 "TLS configuration error: CA certificate file not found: " +
181 config.ca_path.string()));
182 }
183
184 // TLS version validation
185 if (config.min_version != tls_config::tls_version::v1_2 &&
186 config.min_version != tls_config::tls_version::v1_3) {
188 "TLS configuration error: unsupported TLS version"));
189 }
190
191 return Result<std::monostate>(std::monostate{});
192}
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

Connect to a remote DICOM peer.

Establishes a TCP connection to the specified host and port, optionally using TLS for secure transport.

Parameters
configConnection configuration
Returns
Result containing session on success, or error message
Example:
connection_config config{"192.168.1.100", 104};
config.timeout = std::chrono::seconds{5};
auto result = network_adapter::connect(config);
if (result.is_ok()) {
auto session = std::move(result.value());
// Send A-ASSOCIATE-RQ...
}

Definition at line 54 of file network_adapter.cpp.

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

References kcenon::pacs::integration::tls_config::ca_path, kcenon::pacs::integration::tls_config::enabled, kcenon::pacs::compat::factory_result(), 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 145 of file network_adapter.cpp.

147 {
148 connection_config config{host, port};
149 config.timeout = timeout;
150 return connect(config);
151}
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

Definition at line 28 of file network_adapter.cpp.

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

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 217 of file network_adapter.cpp.

218 {
219 if (!session) {
220 return nullptr;
221 }
222 return std::make_shared<dicom_session>(std::move(session));
223}

◆ 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

Definition at line 199 of file network_adapter.cpp.

200 {
201 if (!session) {
202 return nullptr;
203 }
204 return std::make_shared<dicom_session>(std::move(session));
205}

◆ 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 208 of file network_adapter.cpp.

209 {
210 if (!session) {
211 return nullptr;
212 }
213 return std::make_shared<dicom_session>(std::move(session));
214}

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