PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::services::xds::imaging_document_consumer Class Reference

IHE XDS-I.b Imaging Document Consumer Actor. More...

#include <imaging_document_consumer.h>

Collaboration diagram for kcenon::pacs::services::xds::imaging_document_consumer:
Collaboration graph

Public Member Functions

 imaging_document_consumer ()=default
 
 imaging_document_consumer (const imaging_document_consumer_config &config)
 
registry_query_result query_registry (const registry_query_params &params) const
 Query the XDS registry for imaging documents.
 
document_retrieval_result retrieve_document (const document_reference &doc_ref, bool is_imaging=true) const
 Retrieve a specific document from the XDS repository.
 
void set_audit_handler (std::shared_ptr< kcenon::pacs::security::atna_service_auditor > auditor)
 Install an ATNA audit handler for XDS-I.b transactions.
 
document_retrieval_result extract_references (const core::dicom_dataset &kos_dataset) const
 Extract image references from a KOS dataset.
 
std::string build_wado_rs_url (const std::string &study_uid, const std::string &series_uid, const std::string &instance_uid) const
 Build a WADO-RS URL for retrieving a specific instance.
 
const imaging_document_consumer_config & config () const noexcept
 Get current configuration.
 
void set_config (const imaging_document_consumer_config &config)
 Set configuration.
 

Private Attributes

imaging_document_consumer_config config_
 
std::shared_ptr< kcenon::pacs::security::atna_service_auditor > auditor_
 

Detailed Description

IHE XDS-I.b Imaging Document Consumer Actor.

Queries XDS Document Registries for imaging documents (KOS) and provides the interface for retrieving referenced images via WADO-RS or DICOM C-MOVE.

Workflow

  1. Query the registry for imaging documents using query_registry()
  2. Retrieve specific KOS documents using retrieve_document()
  3. Extract image references from the KOS document
  4. Retrieve images via WADO-RS using build_wado_rs_url()
Example:
config.registry_url = "https://xds-registry.example.com/services/iti18";
config.wado_rs_url = "https://pacs.example.com/wado-rs";
// Query for patient's imaging documents
params.patient_id = "12345^^^&1.2.3&ISO";
auto query_result = consumer.query_registry(params);
if (query_result.success) {
for (const auto& doc : query_result.documents) {
auto retrieval = consumer.retrieve_document(doc);
// Process retrieved KOS document
}
}
const imaging_document_consumer_config & config() const noexcept
Get current configuration.
Result of a C-FIND query operation.
Definition query_scu.h:91
Configuration for the Imaging Document Consumer actor.
std::string wado_rs_url
WADO-RS base URL for image retrieval (alternative to C-MOVE)
std::string registry_url
XDS Registry endpoint URL for queries (ITI-18)
Query parameters for XDS registry stored query (ITI-18)

Definition at line 208 of file imaging_document_consumer.h.

Constructor & Destructor Documentation

◆ imaging_document_consumer() [1/2]

kcenon::pacs::services::xds::imaging_document_consumer::imaging_document_consumer ( )
default

◆ imaging_document_consumer() [2/2]

kcenon::pacs::services::xds::imaging_document_consumer::imaging_document_consumer ( const imaging_document_consumer_config & config)
explicit

Definition at line 38 of file imaging_document_consumer.cpp.

Member Function Documentation

◆ build_wado_rs_url()

std::string kcenon::pacs::services::xds::imaging_document_consumer::build_wado_rs_url ( const std::string & study_uid,
const std::string & series_uid,
const std::string & instance_uid ) const
nodiscard

Build a WADO-RS URL for retrieving a specific instance.

Constructs a WADO-RS retrieve URL based on the configured WADO-RS base URL and the instance identifiers.

Parameters
study_uidStudy Instance UID
series_uidSeries Instance UID
instance_uidSOP Instance UID
Returns
The WADO-RS retrieve URL

Definition at line 175 of file imaging_document_consumer.cpp.

178 {
179
180 std::ostringstream url;
181 url << config_.wado_rs_url;
182
183 // Ensure base URL doesn't end with '/'
184 if (!config_.wado_rs_url.empty() && config_.wado_rs_url.back() == '/') {
185 // Remove the trailing '/' already added
186 } else {
187 url << '/';
188 }
189
190 url << "studies/" << study_uid
191 << "/series/" << series_uid
192 << "/instances/" << instance_uid;
193
194 return url.str();
195}

References config_, and kcenon::pacs::services::xds::imaging_document_consumer_config::wado_rs_url.

◆ config()

const imaging_document_consumer_config & kcenon::pacs::services::xds::imaging_document_consumer::config ( ) const
nodiscardnoexcept

Get current configuration.

Returns
Reference to configuration

Definition at line 198 of file imaging_document_consumer.cpp.

198 {
199 return config_;
200}

References config_.

Referenced by set_config().

Here is the caller graph for this function:

◆ extract_references()

document_retrieval_result kcenon::pacs::services::xds::imaging_document_consumer::extract_references ( const core::dicom_dataset & kos_dataset) const
nodiscard

Extract image references from a KOS dataset.

Parses a KOS (Key Object Selection) document and extracts the referenced SOP Instance UIDs, organized by study and series.

Parameters
kos_datasetThe KOS dataset to parse
Returns
Retrieval result with extracted references

Definition at line 111 of file imaging_document_consumer.cpp.

112 {
113
114 document_retrieval_result result;
115 result.success = true;
116
117 // Parse Current Requested Procedure Evidence Sequence (0040,A375)
118 const auto* evidence_elem = kos_dataset.get(
120
121 if (!evidence_elem || !evidence_elem->is_sequence()) {
122 result.error_message = "KOS document does not contain evidence sequence";
123 result.success = false;
124 return result;
125 }
126
127 for (const auto& study_item : evidence_elem->sequence_items()) {
128 // Extract Study Instance UID
129 auto study_uid = study_item.get_string(tags::study_instance_uid);
130 if (!study_uid.empty()) {
131 if (std::find(result.referenced_study_uids.begin(),
132 result.referenced_study_uids.end(),
133 study_uid) == result.referenced_study_uids.end()) {
134 result.referenced_study_uids.push_back(study_uid);
135 }
136 }
137
138 // Parse Referenced Series Sequence
139 const auto* series_elem = study_item.get(
141 if (!series_elem || !series_elem->is_sequence()) {
142 continue;
143 }
144
145 for (const auto& series_item : series_elem->sequence_items()) {
146 auto series_uid = series_item.get_string(tags::series_instance_uid);
147 if (!series_uid.empty()) {
148 if (std::find(result.referenced_series_uids.begin(),
149 result.referenced_series_uids.end(),
150 series_uid) == result.referenced_series_uids.end()) {
151 result.referenced_series_uids.push_back(series_uid);
152 }
153 }
154
155 // Parse Referenced SOP Sequence
156 const auto* sop_elem = series_item.get(
158 if (!sop_elem || !sop_elem->is_sequence()) {
159 continue;
160 }
161
162 for (const auto& sop_item : sop_elem->sequence_items()) {
163 auto instance_uid = sop_item.get_string(
165 if (!instance_uid.empty()) {
166 result.referenced_instance_uids.push_back(instance_uid);
167 }
168 }
169 }
170 }
171
172 return result;
173}
auto get(dicom_tag tag) noexcept -> dicom_element *
Get a pointer to the element with the given tag.
constexpr dicom_tag study_instance_uid
Study Instance UID.
constexpr dicom_tag series_instance_uid
Series Instance UID.

References kcenon::pacs::services::xds::consumer_tags::current_requested_procedure_evidence_sequence, kcenon::pacs::services::xds::document_retrieval_result::error_message, kcenon::pacs::core::dicom_dataset::get(), kcenon::pacs::services::xds::document_retrieval_result::referenced_instance_uids, kcenon::pacs::services::xds::consumer_tags::referenced_series_sequence, kcenon::pacs::services::xds::document_retrieval_result::referenced_series_uids, kcenon::pacs::services::xds::consumer_tags::referenced_sop_instance_uid, kcenon::pacs::services::xds::consumer_tags::referenced_sop_sequence, kcenon::pacs::services::xds::document_retrieval_result::referenced_study_uids, kcenon::pacs::core::tags::series_instance_uid, kcenon::pacs::core::tags::study_instance_uid, and kcenon::pacs::services::xds::document_retrieval_result::success.

Here is the call graph for this function:

◆ query_registry()

registry_query_result kcenon::pacs::services::xds::imaging_document_consumer::query_registry ( const registry_query_params & params) const
nodiscard

Query the XDS registry for imaging documents.

Performs an ITI-18 (Registry Stored Query) to find imaging documents matching the specified criteria.

Parameters
paramsQuery parameters
Returns
Query result with document references

Definition at line 42 of file imaging_document_consumer.cpp.

43 {
44
45 registry_query_result result;
46
47 if (config_.registry_url.empty()) {
48 result.error_message = "XDS registry URL not configured";
49 return result;
50 }
51
52 // NOTE: Actual SOAP request to the XDS registry (ITI-18)
53 // would be implemented here using the network layer.
54 // The ITI-18 transaction uses SOAP/XML encoding with
55 // the AdhocQueryRequest/AdhocQueryResponse pattern.
56 result.success = true;
57
58 return result;
59}

References config_, kcenon::pacs::services::xds::registry_query_result::error_message, kcenon::pacs::services::xds::imaging_document_consumer_config::registry_url, and kcenon::pacs::services::xds::registry_query_result::success.

◆ retrieve_document()

document_retrieval_result kcenon::pacs::services::xds::imaging_document_consumer::retrieve_document ( const document_reference & doc_ref,
bool is_imaging = true ) const
nodiscard

Retrieve a specific document from the XDS repository.

Performs an ITI-43 (Retrieve Document Set) or RAD-69 (Retrieve Imaging Document Set) transaction to fetch a KOS document identified by the document reference. When an ATNA audit handler is installed, an Import audit event is emitted for both success and failure paths.

Parameters
doc_refThe document reference from a registry query
is_imagingtrue for RAD-69 (Retrieve Imaging Document Set), false for ITI-43 (Retrieve Document Set). Controls the transaction code recorded in the ATNA audit.
Returns
Retrieval result with the KOS dataset

Definition at line 61 of file imaging_document_consumer.cpp.

63 {
64
65 document_retrieval_result result;
66
67 const auto transaction =
68 is_imaging
71
72 if (config_.repository_url.empty()) {
73 result.error_message = "XDS repository URL not configured";
74 if (auditor_) {
76 transaction,
77 doc_ref.repository_unique_id, // remote source
78 config_.repository_url, // local destination (empty)
79 doc_ref.unique_id, // document/study identifier
80 doc_ref.patient_id,
81 {doc_ref.unique_id}, // SOP-level reference
82 false);
83 }
84 return result;
85 }
86
87 // NOTE: Actual SOAP/MTOM request to the XDS repository (ITI-43 / RAD-69)
88 // would be implemented here. The response contains the KOS
89 // document as an MTOM attachment.
90 result.success = true;
91
92 if (auditor_) {
94 transaction,
95 doc_ref.repository_unique_id,
97 doc_ref.unique_id,
98 doc_ref.patient_id,
99 {doc_ref.unique_id},
100 true);
101 }
102
103 return result;
104}
virtual void audit_xds_retrieve(xds_consumer_transaction transaction, const std::string &source_ae, const std::string &dest_ae, const std::string &study_uid, const std::string &patient_id, const std::vector< std::string > &sop_instance_uids, bool success)
Audit an XDS-I.b Retrieve Document Set transaction.
std::shared_ptr< kcenon::pacs::security::atna_service_auditor > auditor_
std::string repository_url
XDS Repository endpoint URL for document retrieval (ITI-43)

References kcenon::pacs::security::atna_service_auditor::audit_xds_retrieve(), auditor_, config_, kcenon::pacs::services::xds::document_retrieval_result::error_message, kcenon::pacs::security::atna_service_auditor::iti_43, kcenon::pacs::services::xds::document_reference::patient_id, kcenon::pacs::security::atna_service_auditor::rad_69, kcenon::pacs::services::xds::document_reference::repository_unique_id, kcenon::pacs::services::xds::imaging_document_consumer_config::repository_url, kcenon::pacs::services::xds::document_retrieval_result::success, and kcenon::pacs::services::xds::document_reference::unique_id.

Here is the call graph for this function:

◆ set_audit_handler()

void kcenon::pacs::services::xds::imaging_document_consumer::set_audit_handler ( std::shared_ptr< kcenon::pacs::security::atna_service_auditor > auditor)

Install an ATNA audit handler for XDS-I.b transactions.

When set, an audit event is emitted for each retrieve_document() call (ITI-43 or RAD-69) on both success and failure paths. Passing nullptr disables auditing for this consumer.

Parameters
auditorShared pointer to an ATNA service auditor

Definition at line 106 of file imaging_document_consumer.cpp.

107 {
108 auditor_ = std::move(auditor);
109}

References auditor_.

◆ set_config()

void kcenon::pacs::services::xds::imaging_document_consumer::set_config ( const imaging_document_consumer_config & config)

Set configuration.

Parameters
configNew configuration

Definition at line 202 of file imaging_document_consumer.cpp.

203 {
204 config_ = config;
205}

References config(), and config_.

Here is the call graph for this function:

Member Data Documentation

◆ auditor_

std::shared_ptr<kcenon::pacs::security::atna_service_auditor> kcenon::pacs::services::xds::imaging_document_consumer::auditor_
private

Definition at line 298 of file imaging_document_consumer.h.

Referenced by retrieve_document(), and set_audit_handler().

◆ config_

imaging_document_consumer_config kcenon::pacs::services::xds::imaging_document_consumer::config_
private

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