PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
print_scu.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
19#ifndef PACS_SERVICES_PRINT_SCU_HPP
20#define PACS_SERVICES_PRINT_SCU_HPP
21
22#include "print_scp.h"
23
28
29#include <atomic>
30#include <chrono>
31#include <memory>
32#include <string>
33#include <vector>
34
35namespace kcenon::pacs::services {
36
37// =============================================================================
38// Print SCU Data Structures
39// =============================================================================
40
49 std::string sop_instance_uid;
50
52 uint16_t status{0};
53
55 std::string error_comment;
56
58 std::chrono::milliseconds elapsed{0};
59
62
64 [[nodiscard]] bool is_success() const noexcept {
65 return status == 0x0000;
66 }
67
69 [[nodiscard]] bool is_warning() const noexcept {
70 return (status & 0xF000) == 0xB000;
71 }
72
74 [[nodiscard]] bool is_error() const noexcept {
75 return !is_success() && !is_warning();
76 }
77};
78
84 std::string sop_instance_uid;
85
87 uint32_t number_of_copies{1};
88
90 std::string print_priority{"MED"};
91
93 std::string medium_type{"BLUE FILM"};
94
96 std::string film_destination{"MAGAZINE"};
97
99 std::string film_session_label;
100};
101
107 std::string image_display_format{"STANDARD\\1,1"};
108
110 std::string film_orientation{"PORTRAIT"};
111
113 std::string film_size_id{"8INX10IN"};
114
117
119 std::string film_session_uid;
120};
121
132
138 std::chrono::milliseconds timeout{30000};
139
142};
143
144// =============================================================================
145// Print SCU Class
146// =============================================================================
147
232public:
233 // =========================================================================
234 // Construction
235 // =========================================================================
236
242 explicit print_scu(std::shared_ptr<di::ILogger> logger = nullptr);
243
250 explicit print_scu(const print_scu_config& config,
251 std::shared_ptr<di::ILogger> logger = nullptr);
252
253 ~print_scu() = default;
254
255 // Non-copyable, non-movable (due to atomic members)
256 print_scu(const print_scu&) = delete;
257 print_scu& operator=(const print_scu&) = delete;
258 print_scu(print_scu&&) = delete;
260
261 // =========================================================================
262 // Film Session Operations
263 // =========================================================================
264
274 const print_session_data& data);
275
287 std::string_view session_uid);
288
289 // =========================================================================
290 // Film Box Operations
291 // =========================================================================
292
305 const print_film_box_data& data);
306
318 std::string_view film_box_uid);
319
329 std::string_view film_box_uid);
330
331 // =========================================================================
332 // Image Box Operations
333 // =========================================================================
334
349 std::string_view image_box_uid,
350 const print_image_data& data,
351 bool use_color = false);
352
353 // =========================================================================
354 // Printer Status
355 // =========================================================================
356
367 network::association& assoc);
368
369 // =========================================================================
370 // Statistics
371 // =========================================================================
372
373 [[nodiscard]] size_t sessions_created() const noexcept;
374 [[nodiscard]] size_t film_boxes_created() const noexcept;
375 [[nodiscard]] size_t images_set() const noexcept;
376 [[nodiscard]] size_t prints_executed() const noexcept;
377 [[nodiscard]] size_t printer_queries() const noexcept;
378 void reset_statistics() noexcept;
379
380private:
381 // =========================================================================
382 // Private Implementation
383 // =========================================================================
384
390 [[nodiscard]] std::optional<uint8_t> find_print_context(
391 network::association& assoc,
392 std::string_view sop_class_uid) const;
393
397 [[nodiscard]] std::string generate_uid() const;
398
402 [[nodiscard]] uint16_t next_message_id() noexcept;
403
404 // =========================================================================
405 // Private Members
406 // =========================================================================
407
409 std::shared_ptr<di::ILogger> logger_;
410
413
415 std::atomic<uint16_t> message_id_counter_{1};
416
418 std::atomic<size_t> sessions_created_{0};
419 std::atomic<size_t> film_boxes_created_{0};
420 std::atomic<size_t> images_set_{0};
421 std::atomic<size_t> prints_executed_{0};
422 std::atomic<size_t> printer_queries_{0};
423};
424
425} // namespace kcenon::pacs::services
426
427#endif // PACS_SERVICES_PRINT_SCU_HPP
DICOM Association management per PS3.8.
print_scu(std::shared_ptr< di::ILogger > logger=nullptr)
Construct Print SCU with default configuration.
size_t film_boxes_created() const noexcept
network::Result< print_result > create_film_session(network::association &assoc, const print_session_data &data)
Create a new Film Session (N-CREATE)
network::Result< print_result > print_film_box(network::association &assoc, std::string_view film_box_uid)
Print a Film Box (N-ACTION)
network::Result< print_result > create_film_box(network::association &assoc, const print_film_box_data &data)
Create a new Film Box (N-CREATE)
print_scu & operator=(print_scu &&)=delete
size_t prints_executed() const noexcept
std::atomic< size_t > sessions_created_
Statistics.
Definition print_scu.h:418
size_t sessions_created() const noexcept
network::Result< print_result > delete_film_box(network::association &assoc, std::string_view film_box_uid)
Delete a Film Box (N-DELETE)
network::Result< print_result > delete_film_session(network::association &assoc, std::string_view session_uid)
Delete a Film Session (N-DELETE)
std::optional< uint8_t > find_print_context(network::association &assoc, std::string_view sop_class_uid) const
Find an accepted presentation context for a print SOP class.
print_scu & operator=(const print_scu &)=delete
network::Result< print_result > query_printer_status(network::association &assoc)
Query printer status (N-GET)
size_t printer_queries() const noexcept
std::atomic< uint16_t > message_id_counter_
Message ID counter.
Definition print_scu.h:415
std::atomic< size_t > printer_queries_
Definition print_scu.h:422
std::string generate_uid() const
Generate a unique SOP Instance UID.
print_scu_config config_
Configuration.
Definition print_scu.h:412
network::Result< print_result > set_image_box(network::association &assoc, std::string_view image_box_uid, const print_image_data &data, bool use_color=false)
Set Image Box pixel data (N-SET)
print_scu(print_scu &&)=delete
std::shared_ptr< di::ILogger > logger_
Logger instance.
Definition print_scu.h:409
size_t images_set() const noexcept
std::atomic< size_t > film_boxes_created_
Definition print_scu.h:419
std::atomic< size_t > prints_executed_
Definition print_scu.h:421
print_scu(const print_scu &)=delete
uint16_t next_message_id() noexcept
Get the next message ID for DIMSE operations.
std::atomic< size_t > images_set_
Definition print_scu.h:420
DICOM Dataset - ordered collection of Data Elements.
DIMSE message encoding and decoding.
Logger interface for dependency injection.
DICOM Print Management SCP service (PS3.4 Annex H)
Data for creating a Film Box via N-CREATE.
Definition print_scu.h:105
std::string magnification_type
Magnification type (REPLICATE, BILINEAR, CUBIC, NONE)
Definition print_scu.h:116
std::string film_orientation
Film orientation (PORTRAIT, LANDSCAPE)
Definition print_scu.h:110
std::string film_size_id
Film size ID (8INX10IN, 14INX17IN, etc.)
Definition print_scu.h:113
std::string image_display_format
Image display format (e.g., "STANDARD\\1,1")
Definition print_scu.h:107
std::string film_session_uid
Parent film session SOP Instance UID.
Definition print_scu.h:119
Data for setting an Image Box via N-SET.
Definition print_scu.h:125
core::dicom_dataset pixel_data
Pixel data to set on the image box.
Definition print_scu.h:127
uint16_t image_position
Image position within the film box (1-based)
Definition print_scu.h:130
Result of a Print DIMSE-N operation.
Definition print_scu.h:47
core::dicom_dataset response_data
Response dataset (e.g., printer status, referenced image box UIDs)
Definition print_scu.h:61
std::chrono::milliseconds elapsed
Time taken for the operation.
Definition print_scu.h:58
bool is_error() const noexcept
Check if this was an error status.
Definition print_scu.h:74
bool is_warning() const noexcept
Check if this was a warning status.
Definition print_scu.h:69
std::string error_comment
Error comment from the SCP (if any)
Definition print_scu.h:55
uint16_t status
DIMSE status code (0x0000 = success)
Definition print_scu.h:52
std::string sop_instance_uid
SOP Instance UID (session, film box, image box, or printer)
Definition print_scu.h:49
bool is_success() const noexcept
Check if the operation was successful.
Definition print_scu.h:64
Configuration for Print SCU service.
Definition print_scu.h:136
bool auto_generate_uid
Auto-generate SOP Instance UIDs if not provided.
Definition print_scu.h:141
std::chrono::milliseconds timeout
Timeout for receiving DIMSE response.
Definition print_scu.h:138
Data for creating a Film Session via N-CREATE.
Definition print_scu.h:82
std::string medium_type
Medium type (PAPER, CLEAR FILM, BLUE FILM)
Definition print_scu.h:93
std::string film_session_label
Film session label.
Definition print_scu.h:99
std::string film_destination
Film destination (MAGAZINE, PROCESSOR)
Definition print_scu.h:96
std::string sop_instance_uid
SOP Instance UID (generated if empty)
Definition print_scu.h:84
uint32_t number_of_copies
Number of copies to print.
Definition print_scu.h:87
std::string print_priority
Print priority (HIGH, MED, LOW)
Definition print_scu.h:90