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

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

#include <imaging_document_source.h>

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

Public Member Functions

 imaging_document_source ()=default
 
 imaging_document_source (const imaging_document_source_config &config)
 
kos_creation_result create_kos_document (const std::string &study_instance_uid, const std::vector< kos_instance_reference > &references, const std::optional< core::dicom_dataset > &patient_demographics=std::nullopt) const
 Create a KOS document from a set of DICOM instance references.
 
xds_document_entry build_document_entry (const core::dicom_dataset &kos_dataset) const
 Build XDS document entry metadata from a KOS dataset.
 
xds_submission_set build_submission_set (const std::string &patient_id) const
 Build XDS submission set metadata.
 
publication_result publish_document (const core::dicom_dataset &kos_dataset, const xds_document_entry &entry, bool is_imaging=true) const
 Publish a KOS document to the XDS registry/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.
 
const imaging_document_source_config & config () const noexcept
 Get current configuration.
 
void set_config (const imaging_document_source_config &config)
 Set configuration.
 

Private Member Functions

std::string generate_uid () const
 Generate a new UID for KOS instances.
 
void build_evidence_sequence (core::dicom_dataset &kos_dataset, const std::vector< kos_instance_reference > &references) const
 Build the Current Requested Procedure Evidence Sequence.
 

Private Attributes

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

Detailed Description

IHE XDS-I.b Imaging Document Source Actor.

Creates KOS (Key Object Selection) documents from DICOM studies and provides the interface for publishing them to an XDS Document Registry/Repository via the ITI-41 transaction.

Workflow

  1. When a study is received/completed, call create_kos_document()
  2. Optionally customize the document metadata
  3. Call publish_document() to submit to the XDS registry
Example:
config.registry_url = "https://xds-registry.example.com/services/iti41";
config.source_oid = "1.2.3.4.5.6.7.8.9";
// Create KOS from study instances
auto kos_result = source.create_kos_document(
"1.2.840.10008.1.2.3.4", // Study Instance UID
instances, // Instance references
patient_dataset // Patient demographics
);
// Build submission and publish
auto pub_result = source.publish_document(
kos_result.kos_dataset.value(),
document_entry
);
const imaging_document_source_config & config() const noexcept
Get current configuration.
Configuration for the Imaging Document Source actor.
std::string source_oid
Source system OID (used as sourceId in submissions)
std::string registry_url
XDS Registry/Repository endpoint URL.

Definition at line 264 of file imaging_document_source.h.

Constructor & Destructor Documentation

◆ imaging_document_source() [1/2]

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

◆ imaging_document_source() [2/2]

kcenon::pacs::services::xds::imaging_document_source::imaging_document_source ( const imaging_document_source_config & config)
explicit

Definition at line 92 of file imaging_document_source.cpp.

Member Function Documentation

◆ build_document_entry()

xds_document_entry kcenon::pacs::services::xds::imaging_document_source::build_document_entry ( const core::dicom_dataset & kos_dataset) const
nodiscard

Build XDS document entry metadata from a KOS dataset.

Extracts patient and study metadata from the KOS dataset and populates an xds_document_entry structure suitable for registry submission.

Parameters
kos_datasetThe KOS dataset to extract metadata from
Returns
Populated document entry metadata

Definition at line 186 of file imaging_document_source.cpp.

187 {
188
189 xds_document_entry entry;
190
191 entry.entry_uuid = "urn:uuid:" + generate_uid();
192 entry.unique_id = kos_dataset.get_string(tags::sop_instance_uid);
193 entry.patient_id = kos_dataset.get_string(tags::patient_id);
194 entry.source_patient_id = entry.patient_id;
195
196 entry.class_code = "IMG";
197 entry.class_code_scheme = "1.3.6.1.4.1.19376.3.840.1.1.4";
198 entry.class_code_display = "Imaging Procedure";
199
200 entry.type_code = "KOS";
201 entry.type_code_scheme = "1.2.840.10008.2.16.4";
202 entry.type_code_display = "Key Object Selection";
203
204 entry.format_code = std::string(sop_classes::key_object_selection_document_storage_uid);
205 entry.format_code_scheme = "1.2.840.10008.2.6.1";
206
207 entry.creation_time = current_datetime();
208 entry.service_start_time = entry.creation_time;
209 entry.service_stop_time = entry.creation_time;
210
211 entry.facility_type_code = config_.facility_type_code;
212 entry.facility_type_code_scheme = config_.facility_type_code_scheme;
213 entry.practice_setting_code = config_.practice_setting_code;
214 entry.practice_setting_code_scheme = config_.practice_setting_code_scheme;
215
216 // Extract author from patient demographics if available
217 auto ref_physician = kos_dataset.get_string(tags::referring_physician_name);
218 if (!ref_physician.empty()) {
219 entry.author_person = ref_physician;
220 }
221
222 entry.title = "Key Object Selection Document";
223
224 return entry;
225}
auto get_string(dicom_tag tag, std::string_view default_value="") const -> std::string
Get the string value of an element.
std::string generate_uid() const
Generate a new UID for KOS instances.
constexpr dicom_tag referring_physician_name
Referring Physician's Name.
constexpr dicom_tag patient_id
Patient ID.
constexpr dicom_tag sop_instance_uid
SOP Instance UID.
constexpr std::string_view key_object_selection_document_storage_uid
Key Object Selection Document Storage SOP Class UID.
Definition sr_storage.h:112
std::string practice_setting_code
Default practice setting code.

References kcenon::pacs::services::xds::xds_document_entry::author_person, kcenon::pacs::services::xds::xds_document_entry::class_code, kcenon::pacs::services::xds::xds_document_entry::class_code_display, kcenon::pacs::services::xds::xds_document_entry::class_code_scheme, config_, kcenon::pacs::services::xds::xds_document_entry::creation_time, kcenon::pacs::services::xds::xds_document_entry::entry_uuid, kcenon::pacs::services::xds::imaging_document_source_config::facility_type_code, kcenon::pacs::services::xds::xds_document_entry::facility_type_code, kcenon::pacs::services::xds::imaging_document_source_config::facility_type_code_scheme, kcenon::pacs::services::xds::xds_document_entry::facility_type_code_scheme, kcenon::pacs::services::xds::xds_document_entry::format_code, kcenon::pacs::services::xds::xds_document_entry::format_code_scheme, generate_uid(), kcenon::pacs::core::dicom_dataset::get_string(), kcenon::pacs::services::sop_classes::key_object_selection_document_storage_uid, kcenon::pacs::core::tags::patient_id, kcenon::pacs::services::xds::xds_document_entry::patient_id, kcenon::pacs::services::xds::imaging_document_source_config::practice_setting_code, kcenon::pacs::services::xds::xds_document_entry::practice_setting_code, kcenon::pacs::services::xds::imaging_document_source_config::practice_setting_code_scheme, kcenon::pacs::services::xds::xds_document_entry::practice_setting_code_scheme, kcenon::pacs::core::tags::referring_physician_name, kcenon::pacs::services::xds::xds_document_entry::service_start_time, kcenon::pacs::services::xds::xds_document_entry::service_stop_time, kcenon::pacs::core::tags::sop_instance_uid, kcenon::pacs::services::xds::xds_document_entry::source_patient_id, kcenon::pacs::services::xds::xds_document_entry::title, kcenon::pacs::services::xds::xds_document_entry::type_code, kcenon::pacs::services::xds::xds_document_entry::type_code_display, kcenon::pacs::services::xds::xds_document_entry::type_code_scheme, and kcenon::pacs::services::xds::xds_document_entry::unique_id.

Here is the call graph for this function:

◆ build_evidence_sequence()

void kcenon::pacs::services::xds::imaging_document_source::build_evidence_sequence ( core::dicom_dataset & kos_dataset,
const std::vector< kos_instance_reference > & references ) const
private

Build the Current Requested Procedure Evidence Sequence.

Definition at line 353 of file imaging_document_source.cpp.

355 {
356
357 // Group references by study -> series -> instances
358 struct series_group {
359 std::string series_uid;
360 std::vector<std::pair<std::string, std::string>> instances; // sop_class, sop_instance
361 };
362
363 std::unordered_map<std::string, std::vector<series_group>> study_map;
364
365 for (const auto& ref : references) {
366 auto& series_list = study_map[ref.study_instance_uid];
367
368 auto it = std::find_if(series_list.begin(), series_list.end(),
369 [&](const series_group& sg) {
370 return sg.series_uid == ref.series_instance_uid;
371 });
372
373 if (it != series_list.end()) {
374 it->instances.emplace_back(ref.sop_class_uid, ref.sop_instance_uid);
375 } else {
376 series_group sg;
377 sg.series_uid = ref.series_instance_uid;
378 sg.instances.emplace_back(ref.sop_class_uid, ref.sop_instance_uid);
379 series_list.push_back(std::move(sg));
380 }
381 }
382
383 // Build the sequence structure
384 std::vector<dicom_dataset> study_items;
385 for (const auto& [study_uid, series_list] : study_map) {
386 dicom_dataset study_item;
387 study_item.set_string(tags::study_instance_uid, vr_type::UI, study_uid);
388
389 std::vector<dicom_dataset> series_items;
390 for (const auto& sg : series_list) {
391 dicom_dataset series_item;
392 series_item.set_string(tags::series_instance_uid, vr_type::UI, sg.series_uid);
393
394 std::vector<dicom_dataset> sop_items;
395 for (const auto& [sop_class, sop_instance] : sg.instances) {
396 dicom_dataset sop_item;
397 sop_item.set_string(kos_tags::referenced_sop_class_uid, vr_type::UI, sop_class);
398 sop_item.set_string(kos_tags::referenced_sop_instance_uid, vr_type::UI, sop_instance);
399 sop_items.push_back(std::move(sop_item));
400 }
401 insert_sequence(series_item, kos_tags::referenced_sop_sequence, std::move(sop_items));
402 series_items.push_back(std::move(series_item));
403 }
404 insert_sequence(study_item, kos_tags::referenced_series_sequence, std::move(series_items));
405 study_items.push_back(std::move(study_item));
406 }
407
408 insert_sequence(kos_dataset,
410 std::move(study_items));
411}
constexpr dicom_tag study_instance_uid
Study Instance UID.
constexpr dicom_tag series_instance_uid
Series Instance UID.
constexpr dicom_tag current_requested_procedure_evidence_sequence

References kcenon::pacs::services::xds::kos_tags::current_requested_procedure_evidence_sequence, kcenon::pacs::services::xds::kos_tags::referenced_series_sequence, kcenon::pacs::services::xds::kos_tags::referenced_sop_class_uid, kcenon::pacs::services::xds::kos_tags::referenced_sop_instance_uid, kcenon::pacs::services::xds::kos_tags::referenced_sop_sequence, kcenon::pacs::core::tags::series_instance_uid, kcenon::pacs::core::dicom_dataset::set_string(), and kcenon::pacs::core::tags::study_instance_uid.

Referenced by create_kos_document().

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

◆ build_submission_set()

xds_submission_set kcenon::pacs::services::xds::imaging_document_source::build_submission_set ( const std::string & patient_id) const
nodiscard

Build XDS submission set metadata.

Creates a submission set entry for ITI-41 Provide and Register Document Set-b transaction.

Parameters
patient_idPatient ID for the submission
Returns
Populated submission set metadata

Definition at line 227 of file imaging_document_source.cpp.

228 {
229
230 xds_submission_set set;
231
232 set.unique_id = generate_uid();
233 set.source_id = config_.source_oid;
234 set.patient_id = patient_id;
235 set.content_type_code = "IMG";
236 set.content_type_code_scheme = "1.3.6.1.4.1.19376.3.840.1.1.4";
237 set.content_type_code_display = "Imaging Procedure";
238 set.submission_time = current_datetime();
239
240 return set;
241}

References config_, kcenon::pacs::services::xds::xds_submission_set::content_type_code, kcenon::pacs::services::xds::xds_submission_set::content_type_code_display, kcenon::pacs::services::xds::xds_submission_set::content_type_code_scheme, generate_uid(), kcenon::pacs::services::xds::xds_submission_set::patient_id, kcenon::pacs::services::xds::xds_submission_set::source_id, kcenon::pacs::services::xds::imaging_document_source_config::source_oid, kcenon::pacs::services::xds::xds_submission_set::submission_time, and kcenon::pacs::services::xds::xds_submission_set::unique_id.

Here is the call graph for this function:

◆ config()

const imaging_document_source_config & kcenon::pacs::services::xds::imaging_document_source::config ( ) const
nodiscardnoexcept

Get current configuration.

Returns
Reference to configuration

Definition at line 331 of file imaging_document_source.cpp.

331 {
332 return config_;
333}

References config_.

Referenced by set_config().

Here is the caller graph for this function:

◆ create_kos_document()

kos_creation_result kcenon::pacs::services::xds::imaging_document_source::create_kos_document ( const std::string & study_instance_uid,
const std::vector< kos_instance_reference > & references,
const std::optional< core::dicom_dataset > & patient_demographics = std::nullopt ) const
nodiscard

Create a KOS document from a set of DICOM instance references.

Generates a Key Object Selection Document (SOP Class 1.2.840.10008.5.1.4.1.1.88.59) containing references to the specified instances, following TID 2010.

Parameters
study_instance_uidThe Study Instance UID
referencesVector of instance references to include
patient_demographicsOptional patient demographics dataset
Returns
KOS creation result with the generated dataset

Definition at line 96 of file imaging_document_source.cpp.

99 {
100
101 kos_creation_result result;
102
103 if (references.empty()) {
104 result.error_message = "No instance references provided";
105 return result;
106 }
107
109
110 // --- SOP Common Module ---
111 kos.set_string(tags::sop_class_uid, vr_type::UI,
113 result.kos_instance_uid = generate_uid();
114 kos.set_string(tags::sop_instance_uid, vr_type::UI, result.kos_instance_uid);
115
116 // --- Patient Module (Type 2) ---
117 if (patient_demographics) {
118 auto copy_if_present = [&](dicom_tag tag, vr_type vr) {
119 if (patient_demographics->contains(tag)) {
120 kos.set_string(tag, vr, patient_demographics->get_string(tag));
121 } else {
122 kos.set_string(tag, vr, "");
123 }
124 };
125 copy_if_present(tags::patient_name, vr_type::PN);
126 copy_if_present(tags::patient_id, vr_type::LO);
127 copy_if_present(tags::patient_birth_date, vr_type::DA);
128 copy_if_present(tags::patient_sex, vr_type::CS);
129 } else {
130 kos.set_string(tags::patient_name, vr_type::PN, "");
131 kos.set_string(tags::patient_id, vr_type::LO, "");
132 kos.set_string(tags::patient_birth_date, vr_type::DA, "");
133 kos.set_string(tags::patient_sex, vr_type::CS, "");
134 }
135
136 // --- General Study Module ---
137 kos.set_string(tags::study_instance_uid, vr_type::UI, study_instance_uid);
138 kos.set_string(tags::study_date, vr_type::DA, current_date());
139 kos.set_string(tags::study_time, vr_type::TM, current_time());
140 kos.set_string(tags::referring_physician_name, vr_type::PN, "");
141 kos.set_string(tags::study_id, vr_type::SH, "");
142 kos.set_string(tags::accession_number, vr_type::SH, "");
143
144 // --- General Series Module ---
145 kos.set_string(tags::modality, vr_type::CS, "KO");
147 kos.set_string(tags::series_number, vr_type::IS, "1");
148
149 // --- General Equipment Module ---
150 kos.set_string(dicom_tag{0x0008, 0x0070}, vr_type::LO, ""); // Manufacturer
151
152 // --- SR Document General Module ---
153 kos.set_string(tags::instance_number, vr_type::IS, "1");
154 kos.set_string(tags::content_date, vr_type::DA, current_date());
155 kos.set_string(tags::content_time, vr_type::TM, current_time());
156 kos.set_string(kos_tags::completion_flag, vr_type::CS, "COMPLETE");
157 kos.set_string(kos_tags::verification_flag, vr_type::CS, "UNVERIFIED");
158
159 // --- SR Document Content Module ---
160 // Value type: CONTAINER (root)
161 kos.set_string(kos_tags::value_type, vr_type::CS, "CONTAINER");
162
163 // Concept Name Code Sequence: Key Object Selection (113000, DCM)
164 dicom_dataset concept_name;
165 concept_name.set_string(kos_tags::code_value, vr_type::SH, "113000");
166 concept_name.set_string(kos_tags::coding_scheme_designator, vr_type::SH, "DCM");
167 concept_name.set_string(kos_tags::code_meaning, vr_type::LO, "Of Interest");
168 insert_sequence(kos, kos_tags::concept_name_code_sequence, {concept_name});
169
170 // Content Template Sequence: TID 2010
171 dicom_dataset template_item;
172 template_item.set_string(kos_tags::template_identifier, vr_type::CS, "2010");
173 template_item.set_string(kos_tags::mapping_resource, vr_type::CS, "DCMR");
174 insert_sequence(kos, kos_tags::content_template_sequence, {template_item});
175
176 // --- Current Requested Procedure Evidence Sequence ---
177 build_evidence_sequence(kos, references);
178
179 result.success = true;
180 result.reference_count = references.size();
181 result.kos_dataset = std::move(kos);
182
183 return result;
184}
Represents a DICOM Dataset (ordered collection of Data Elements)
void set_string(dicom_tag tag, encoding::vr_type vr, std::string_view value)
Set a string value for the given tag.
void build_evidence_sequence(core::dicom_dataset &kos_dataset, const std::vector< kos_instance_reference > &references) const
Build the Current Requested Procedure Evidence Sequence.
constexpr dicom_tag content_time
Content Time.
constexpr dicom_tag patient_birth_date
Patient's Birth Date.
constexpr dicom_tag accession_number
Accession Number.
constexpr dicom_tag modality
Modality.
constexpr dicom_tag study_time
Study Time.
constexpr dicom_tag patient_sex
Patient's Sex.
constexpr dicom_tag series_number
Series Number.
constexpr dicom_tag content_date
Content Date.
constexpr dicom_tag sop_class_uid
SOP Class UID.
constexpr dicom_tag study_id
Study ID.
constexpr dicom_tag patient_name
Patient's Name.
constexpr dicom_tag study_date
Study Date.
constexpr dicom_tag instance_number
Instance Number.
vr_encoding vr

References kcenon::pacs::core::tags::accession_number, build_evidence_sequence(), kcenon::pacs::services::xds::kos_tags::code_meaning, kcenon::pacs::services::xds::kos_tags::code_value, kcenon::pacs::services::xds::kos_tags::coding_scheme_designator, kcenon::pacs::services::xds::kos_tags::completion_flag, kcenon::pacs::services::xds::kos_tags::concept_name_code_sequence, kcenon::pacs::core::tags::content_date, kcenon::pacs::services::xds::kos_tags::content_template_sequence, kcenon::pacs::core::tags::content_time, kcenon::pacs::services::xds::kos_creation_result::error_message, generate_uid(), kcenon::pacs::core::tags::instance_number, kcenon::pacs::services::sop_classes::key_object_selection_document_storage_uid, kcenon::pacs::services::xds::kos_creation_result::kos_dataset, kcenon::pacs::services::xds::kos_creation_result::kos_instance_uid, kcenon::pacs::services::xds::kos_tags::mapping_resource, kcenon::pacs::core::tags::modality, kcenon::pacs::core::tags::patient_birth_date, kcenon::pacs::core::tags::patient_id, kcenon::pacs::core::tags::patient_name, kcenon::pacs::core::tags::patient_sex, kcenon::pacs::services::xds::kos_creation_result::reference_count, kcenon::pacs::core::tags::referring_physician_name, kcenon::pacs::core::tags::series_instance_uid, kcenon::pacs::core::tags::series_number, kcenon::pacs::core::dicom_dataset::set_string(), kcenon::pacs::core::tags::sop_class_uid, kcenon::pacs::core::tags::sop_instance_uid, kcenon::pacs::core::tags::study_date, kcenon::pacs::core::tags::study_id, kcenon::pacs::core::tags::study_instance_uid, kcenon::pacs::core::tags::study_time, kcenon::pacs::services::xds::kos_creation_result::success, kcenon::pacs::services::xds::kos_tags::template_identifier, kcenon::pacs::services::xds::kos_tags::value_type, kcenon::pacs::services::xds::kos_tags::verification_flag, and vr.

Here is the call graph for this function:

◆ generate_uid()

std::string kcenon::pacs::services::xds::imaging_document_source::generate_uid ( ) const
nodiscardprivate

Generate a new UID for KOS instances.

Definition at line 340 of file imaging_document_source.cpp.

340 {
341 static constexpr const char* uid_root = "1.2.826.0.1.3680043.2.1545.1";
342 static std::mt19937_64 gen{std::random_device{}()};
343 static std::uniform_int_distribution<uint64_t> dist;
344
345 auto now = std::chrono::system_clock::now();
346 auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(
347 now.time_since_epoch()).count();
348
349 return std::string(uid_root) + "." + std::to_string(timestamp) +
350 "." + std::to_string(dist(gen) % 100000);
351}

Referenced by build_document_entry(), build_submission_set(), and create_kos_document().

Here is the caller graph for this function:

◆ publish_document()

publication_result kcenon::pacs::services::xds::imaging_document_source::publish_document ( const core::dicom_dataset & kos_dataset,
const xds_document_entry & entry,
bool is_imaging = true ) const
nodiscard

Publish a KOS document to the XDS registry/repository.

Performs the ITI-41 (Provide and Register Document Set-b) transaction to publish the KOS document and its metadata to the configured XDS registry/repository. When an ATNA audit handler is installed, an Export audit event is emitted for both success and failure paths.

Parameters
kos_datasetThe KOS dataset to publish
entryThe document entry metadata
is_imagingtrue for RAD-68 (Provide and Register Imaging Document Set), false for ITI-41 (Provide and Register Document Set-b). Controls the transaction code recorded in the ATNA audit.
Returns
Publication result

Definition at line 273 of file imaging_document_source.cpp.

276 {
277
278 publication_result result;
279
280 // Build audit fields once; used for both success and failure paths.
281 auto study_uid = kos_dataset.get_string(core::tags::study_instance_uid);
282 auto patient_id = kos_dataset.get_string(core::tags::patient_id);
283 auto sop_instance_uids = collect_sop_instance_uids(kos_dataset);
284 const auto transaction =
285 is_imaging
288
289 if (config_.registry_url.empty()) {
290 result.error_message = "XDS registry URL not configured";
291 if (auditor_) {
293 transaction,
295 config_.registry_url, // empty when unconfigured
296 study_uid,
297 patient_id,
298 sop_instance_uids,
299 false);
300 }
301 return result;
302 }
303
304 // NOTE: Actual HTTP POST to the XDS registry/repository (ITI-41 / RAD-68)
305 // would be implemented here using the network layer.
306 // The ITI-41 / RAD-68 transactions use SOAP/MTOM encoding.
307 // For now, return success to indicate the interface is operational.
308 result.success = true;
309 result.document_entry_uuid = entry.entry_uuid;
310
311 if (auditor_) {
313 transaction,
316 study_uid,
317 patient_id,
318 sop_instance_uids,
319 true);
320 }
321
322 return result;
323}
@ rad_68
RAD-68 Provide and Register Imaging Document Set.
@ iti_41
ITI-41 Provide and Register Document Set-b.
virtual void audit_xds_provide_and_register(xds_source_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 Provide and Register Document Set transaction.
std::shared_ptr< kcenon::pacs::security::atna_service_auditor > auditor_

References kcenon::pacs::security::atna_service_auditor::audit_xds_provide_and_register(), auditor_, config_, kcenon::pacs::services::xds::publication_result::document_entry_uuid, kcenon::pacs::services::xds::xds_document_entry::entry_uuid, kcenon::pacs::services::xds::publication_result::error_message, kcenon::pacs::core::dicom_dataset::get_string(), kcenon::pacs::security::atna_service_auditor::iti_41, kcenon::pacs::core::tags::patient_id, kcenon::pacs::security::atna_service_auditor::rad_68, kcenon::pacs::services::xds::imaging_document_source_config::registry_url, kcenon::pacs::services::xds::imaging_document_source_config::source_oid, kcenon::pacs::core::tags::study_instance_uid, and kcenon::pacs::services::xds::publication_result::success.

Here is the call graph for this function:

◆ set_audit_handler()

void kcenon::pacs::services::xds::imaging_document_source::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 publish_document() call (ITI-41 or RAD-68) on both success and failure paths. Passing nullptr disables auditing for this source.

Parameters
auditorShared pointer to an ATNA service auditor

Definition at line 325 of file imaging_document_source.cpp.

326 {
327 auditor_ = std::move(auditor);
328}

References auditor_.

◆ set_config()

void kcenon::pacs::services::xds::imaging_document_source::set_config ( const imaging_document_source_config & config)

Set configuration.

Parameters
configNew configuration

Definition at line 335 of file imaging_document_source.cpp.

336 {
337 config_ = config;
338}

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_source::auditor_
private

Definition at line 356 of file imaging_document_source.h.

Referenced by publish_document(), and set_audit_handler().

◆ config_

imaging_document_source_config kcenon::pacs::services::xds::imaging_document_source::config_
private

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