PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
events.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
17#pragma once
18
19#include <chrono>
20#include <cstdint>
21#include <optional>
22#include <string>
23
25
26// ============================================================================
27// Association Events
28// ============================================================================
29
36 std::string calling_ae;
37 std::string called_ae;
38 std::string remote_host;
39 uint16_t remote_port;
40 uint32_t max_pdu_size;
41 std::chrono::steady_clock::time_point timestamp;
42
43 association_established_event(std::string calling,
44 std::string called,
45 std::string host,
46 uint16_t port,
47 uint32_t pdu_size)
48 : calling_ae(std::move(calling)),
49 called_ae(std::move(called)),
50 remote_host(std::move(host)),
51 remote_port(port),
52 max_pdu_size(pdu_size),
53 timestamp(std::chrono::steady_clock::now()) {}
54};
55
60 std::string calling_ae;
61 std::string called_ae;
62 std::chrono::milliseconds duration;
64 std::chrono::steady_clock::time_point timestamp;
65
66 association_released_event(std::string calling,
67 std::string called,
68 std::chrono::milliseconds dur,
69 uint32_t ops)
70 : calling_ae(std::move(calling)),
71 called_ae(std::move(called)),
72 duration(dur),
74 timestamp(std::chrono::steady_clock::now()) {}
75};
76
81 std::string calling_ae;
82 std::string called_ae;
83 std::string reason;
84 uint8_t source; // 0 = unknown, 1 = service-user, 2 = service-provider
85 uint8_t reason_code;
86 std::chrono::steady_clock::time_point timestamp;
87
88 association_aborted_event(std::string calling,
89 std::string called,
90 std::string abort_reason,
91 uint8_t src = 0,
92 uint8_t code = 0)
93 : calling_ae(std::move(calling)),
94 called_ae(std::move(called)),
95 reason(std::move(abort_reason)),
96 source(src),
98 timestamp(std::chrono::steady_clock::now()) {}
99};
100
101// ============================================================================
102// Storage Events (C-STORE)
103// ============================================================================
104
109 std::string patient_id;
112 std::string sop_instance_uid;
113 std::string sop_class_uid;
114 std::string calling_ae;
116 std::chrono::steady_clock::time_point timestamp;
117
119 std::string study_uid,
120 std::string series_uid,
121 std::string sop_uid,
122 std::string sop_class,
123 std::string calling,
124 size_t bytes)
125 : patient_id(std::move(patient)),
126 study_instance_uid(std::move(study_uid)),
127 series_instance_uid(std::move(series_uid)),
128 sop_instance_uid(std::move(sop_uid)),
129 sop_class_uid(std::move(sop_class)),
130 calling_ae(std::move(calling)),
131 bytes_received(bytes),
132 timestamp(std::chrono::steady_clock::now()) {}
133};
134
139 std::string patient_id;
140 std::string sop_instance_uid;
141 std::string calling_ae;
143 std::string error_message;
144 std::chrono::steady_clock::time_point timestamp;
145
147 std::string sop_uid,
148 std::string calling,
149 int code,
150 std::string message)
151 : patient_id(std::move(patient)),
152 sop_instance_uid(std::move(sop_uid)),
153 calling_ae(std::move(calling)),
155 error_message(std::move(message)),
156 timestamp(std::chrono::steady_clock::now()) {}
157};
158
159// ============================================================================
160// Query Events (C-FIND)
161// ============================================================================
162
166enum class query_level {
167 patient,
168 study,
169 series,
170 image
171};
172
176[[nodiscard]] inline auto query_level_to_string(query_level level) -> std::string {
177 switch (level) {
178 case query_level::patient: return "PATIENT";
179 case query_level::study: return "STUDY";
180 case query_level::series: return "SERIES";
181 case query_level::image: return "IMAGE";
182 default: return "UNKNOWN";
183 }
184}
185
191 std::string calling_ae;
194 std::chrono::steady_clock::time_point timestamp;
195
197 std::string calling,
198 size_t results,
199 uint64_t exec_time)
200 : level(lvl),
201 calling_ae(std::move(calling)),
202 result_count(results),
203 execution_time_ms(exec_time),
204 timestamp(std::chrono::steady_clock::now()) {}
205};
206
211 std::string calling_ae;
213 std::string error_message;
214 std::chrono::steady_clock::time_point timestamp;
215
216 query_failed_event(std::string calling,
217 int code,
218 std::string message)
219 : calling_ae(std::move(calling)),
221 error_message(std::move(message)),
222 timestamp(std::chrono::steady_clock::now()) {}
223};
224
225// ============================================================================
226// Retrieve Events (C-MOVE / C-GET)
227// ============================================================================
228
233 c_move,
234 c_get
235};
236
240[[nodiscard]] inline auto retrieve_operation_to_string(retrieve_operation op) -> std::string {
241 return op == retrieve_operation::c_move ? "C-MOVE" : "C-GET";
242}
243
249 std::string calling_ae;
250 std::string destination_ae; // Only for C-MOVE
253 std::chrono::steady_clock::time_point timestamp;
254
256 std::string calling,
257 std::string destination,
258 std::string study_uid,
259 uint16_t total)
260 : operation(op),
261 calling_ae(std::move(calling)),
262 destination_ae(std::move(destination)),
263 study_instance_uid(std::move(study_uid)),
264 total_instances(total),
265 timestamp(std::chrono::steady_clock::now()) {}
266};
267
273 std::string calling_ae;
274 std::string destination_ae;
278 uint64_t duration_ms;
279 std::chrono::steady_clock::time_point timestamp;
280
282 std::string calling,
283 std::string destination,
284 uint16_t sent,
285 uint16_t failed,
286 uint16_t warning,
287 uint64_t duration)
288 : operation(op),
289 calling_ae(std::move(calling)),
290 destination_ae(std::move(destination)),
291 instances_sent(sent),
292 instances_failed(failed),
293 instances_warning(warning),
294 duration_ms(duration),
295 timestamp(std::chrono::steady_clock::now()) {}
296};
297
298} // namespace kcenon::pacs::events
299
auto query_level_to_string(query_level level) -> std::string
Convert query level to string.
Definition events.h:176
query_level
Query level enumeration.
Definition events.h:166
auto retrieve_operation_to_string(retrieve_operation op) -> std::string
Convert retrieve operation to string.
Definition events.h:240
retrieve_operation
Retrieve operation type.
Definition events.h:232
std::string_view code
Event published when a DICOM association is aborted.
Definition events.h:80
association_aborted_event(std::string calling, std::string called, std::string abort_reason, uint8_t src=0, uint8_t code=0)
Definition events.h:88
std::chrono::steady_clock::time_point timestamp
Definition events.h:86
Event published when a DICOM association is successfully established.
Definition events.h:35
std::chrono::steady_clock::time_point timestamp
Definition events.h:41
association_established_event(std::string calling, std::string called, std::string host, uint16_t port, uint32_t pdu_size)
Definition events.h:43
Event published when a DICOM association is gracefully released.
Definition events.h:59
association_released_event(std::string calling, std::string called, std::chrono::milliseconds dur, uint32_t ops)
Definition events.h:66
std::chrono::steady_clock::time_point timestamp
Definition events.h:64
Event published when an image is successfully received via C-STORE.
Definition events.h:108
std::chrono::steady_clock::time_point timestamp
Definition events.h:116
image_received_event(std::string patient, std::string study_uid, std::string series_uid, std::string sop_uid, std::string sop_class, std::string calling, size_t bytes)
Definition events.h:118
Event published when a C-FIND query is executed.
Definition events.h:189
std::chrono::steady_clock::time_point timestamp
Definition events.h:194
query_executed_event(query_level lvl, std::string calling, size_t results, uint64_t exec_time)
Definition events.h:196
Event published when a C-FIND query fails.
Definition events.h:210
query_failed_event(std::string calling, int code, std::string message)
Definition events.h:216
std::chrono::steady_clock::time_point timestamp
Definition events.h:214
Event published when a retrieve operation completes.
Definition events.h:271
retrieve_completed_event(retrieve_operation op, std::string calling, std::string destination, uint16_t sent, uint16_t failed, uint16_t warning, uint64_t duration)
Definition events.h:281
std::chrono::steady_clock::time_point timestamp
Definition events.h:279
Event published when a retrieve operation (C-MOVE/C-GET) starts.
Definition events.h:247
std::chrono::steady_clock::time_point timestamp
Definition events.h:253
retrieve_started_event(retrieve_operation op, std::string calling, std::string destination, std::string study_uid, uint16_t total)
Definition events.h:255
Event published when a C-STORE operation fails.
Definition events.h:138
storage_failed_event(std::string patient, std::string sop_uid, std::string calling, int code, std::string message)
Definition events.h:146
std::chrono::steady_clock::time_point timestamp
Definition events.h:144