PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::ihe::xds::document_consumer::impl Class Reference
Collaboration diagram for kcenon::pacs::ihe::xds::document_consumer::impl:
Collaboration graph

Public Member Functions

 impl (http_options opts, signing_material signing)
 
void set_audit_sink (std::shared_ptr< kcenon::pacs::security::xds_audit_sink > sink)
 
kcenon::common::Result< document_response > retrieve (const std::string &document_unique_id, const std::string &repository_unique_id)
 

Private Member Functions

void audit (const std::string &document_unique_id, const std::string &repository_unique_id, const kcenon::common::Result< document_response > &r)
 

Private Attributes

http_options opts_
 
signing_material signing_
 
std::shared_ptr< kcenon::pacs::security::xds_audit_sink > audit_sink_
 

Detailed Description

Definition at line 44 of file document_consumer.cpp.

Constructor & Destructor Documentation

◆ impl()

kcenon::pacs::ihe::xds::document_consumer::impl::impl ( http_options opts,
signing_material signing )
inline

Definition at line 46 of file document_consumer.cpp.

47 : opts_(std::move(opts)), signing_(std::move(signing)) {}

Member Function Documentation

◆ audit()

void kcenon::pacs::ihe::xds::document_consumer::impl::audit ( const std::string & document_unique_id,
const std::string & repository_unique_id,
const kcenon::common::Result< document_response > & r )
inlineprivate

Definition at line 132 of file document_consumer.cpp.

134 {
135 if (!audit_sink_) return;
136 kcenon::pacs::security::xds_iti43_event e;
137 e.source_endpoint = opts_.endpoint;
138 e.document_unique_id = document_unique_id;
139 e.repository_unique_id = repository_unique_id;
140 if (r.is_ok()) {
142 } else {
143 e.outcome =
145 e.failure_description = r.error().message;
146 }
147 audit_sink_->on_iti43_retrieve(e);
148 }
std::shared_ptr< kcenon::pacs::security::xds_audit_sink > audit_sink_

References audit_sink_, kcenon::pacs::ihe::xds::http_options::endpoint, opts_, kcenon::pacs::security::serious_failure, and kcenon::pacs::security::success.

Referenced by retrieve().

Here is the caller graph for this function:

◆ retrieve()

kcenon::common::Result< document_response > kcenon::pacs::ihe::xds::document_consumer::impl::retrieve ( const std::string & document_unique_id,
const std::string & repository_unique_id )
inline

Definition at line 54 of file document_consumer.cpp.

56 {
57 auto do_audit =
59 audit(document_unique_id, repository_unique_id, r);
60 return r;
61 };
62
63 if (document_unique_id.empty()) {
64 return do_audit(kcenon::common::make_error<document_response>(
65 static_cast<int>(
67 "retrieve: document_unique_id is empty",
68 std::string(error_source)));
69 }
70 if (repository_unique_id.empty()) {
71 return do_audit(kcenon::common::make_error<document_response>(
72 static_cast<int>(
74 "retrieve: repository_unique_id is empty",
75 std::string(error_source)));
76 }
77
78 retrieve_request req;
79 req.document_unique_id = document_unique_id;
80 req.repository_unique_id = repository_unique_id;
81
82 auto env_result = detail::build_iti43_envelope(req);
83 if (env_result.is_err()) {
84 return do_audit(kcenon::common::make_error<document_response>(
85 env_result.error()));
86 }
87 auto env = env_result.value();
88
89 auto sign_result = detail::sign_envelope(
92 if (sign_result.is_err()) {
93 return do_audit(kcenon::common::make_error<document_response>(
94 sign_result.error()));
95 }
96
97 // Per-call copy: the ITI-43 SOAP action is specific to this
98 // transaction and must not mutate the shared opts_ member, so
99 // other transaction types - if this Consumer later grows more
100 // retrieve variants - cannot pick up a stale action from a
101 // previous call. This also preserves whatever the caller set.
102 http_options call_opts = opts_;
103 call_opts.soap_action = kIti43SoapAction;
104
105 auto http_result =
106 detail::http_post(call_opts, kSoapContentType, env.xml);
107 if (http_result.is_err()) {
108 return do_audit(kcenon::common::make_error<document_response>(
109 http_result.error()));
110 }
111 auto response = http_result.value();
112
113 auto parsed =
114 detail::parse_mtom_response(response.content_type, response.body);
115 if (parsed.is_err()) {
116 return do_audit(kcenon::common::make_error<document_response>(
117 parsed.error()));
118 }
119 auto mtom = parsed.value();
120
121 auto verify = detail::verify_envelope_integrity(mtom.root_xml);
122 if (verify.is_err()) {
123 return do_audit(kcenon::common::make_error<document_response>(
124 verify.error()));
125 }
126
127 return do_audit(detail::parse_retrieve_response(
128 mtom.root_xml, mtom.parts, req));
129 }
void audit(const std::string &document_unique_id, const std::string &repository_unique_id, const kcenon::common::Result< document_response > &r)
kcenon::common::Result< document_response > parse_retrieve_response(const std::string &root_xml, const std::vector< mtom_part > &parts, const retrieve_request &req)
Parse a RetrieveDocumentSetResponse envelope and resolve the attachment that matches req.
kcenon::common::Result< built_envelope > build_iti43_envelope(const retrieve_request &req)
Build a SOAP envelope for ITI-43 from a retrieve_request.
kcenon::common::Result< http_response > http_post(const http_options &opts, const std::string &content_type, const std::string &body)
POST body to opts.endpoint with the given Content-Type.
kcenon::common::Result< bool > sign_envelope(built_envelope &env, std::string_view cert_pem, std::string_view key_pem, std::string_view key_password)
Sign the body + timestamp of env in place.
kcenon::common::Result< parsed_mtom > parse_mtom_response(const std::string &content_type_header, const std::string &body)
Parse a multipart/related MTOM response body.
kcenon::common::Result< bool > verify_envelope_integrity(std::string_view signed_xml)
Verify the structural integrity of a previously signed envelope against the certificate embedded in i...
constexpr std::string_view error_source
Short identifier used as the "source" field of make_error.
Definition errors.h:95

References audit(), kcenon::pacs::ihe::xds::detail::build_iti43_envelope(), kcenon::pacs::ihe::xds::signing_material::certificate_pem, kcenon::pacs::ihe::xds::consumer_retrieve_missing_document_id, kcenon::pacs::ihe::xds::consumer_retrieve_missing_repository_id, kcenon::pacs::ihe::xds::retrieve_request::document_unique_id, kcenon::pacs::ihe::xds::error_source, kcenon::pacs::ihe::xds::detail::http_post(), opts_, kcenon::pacs::ihe::xds::detail::parse_mtom_response(), kcenon::pacs::ihe::xds::detail::parse_retrieve_response(), kcenon::pacs::ihe::xds::signing_material::private_key_password, kcenon::pacs::ihe::xds::signing_material::private_key_pem, kcenon::pacs::ihe::xds::retrieve_request::repository_unique_id, kcenon::pacs::ihe::xds::detail::sign_envelope(), signing_, kcenon::pacs::ihe::xds::http_options::soap_action, and kcenon::pacs::ihe::xds::detail::verify_envelope_integrity().

Here is the call graph for this function:

◆ set_audit_sink()

void kcenon::pacs::ihe::xds::document_consumer::impl::set_audit_sink ( std::shared_ptr< kcenon::pacs::security::xds_audit_sink > sink)
inline

Definition at line 49 of file document_consumer.cpp.

50 {
51 audit_sink_ = std::move(sink);
52 }

References audit_sink_.

Referenced by kcenon::pacs::ihe::xds::document_consumer::set_audit_sink().

Here is the caller graph for this function:

Member Data Documentation

◆ audit_sink_

std::shared_ptr<kcenon::pacs::security::xds_audit_sink> kcenon::pacs::ihe::xds::document_consumer::impl::audit_sink_
private

Definition at line 152 of file document_consumer.cpp.

Referenced by audit(), and set_audit_sink().

◆ opts_

http_options kcenon::pacs::ihe::xds::document_consumer::impl::opts_
private

Definition at line 150 of file document_consumer.cpp.

Referenced by audit(), and retrieve().

◆ signing_

signing_material kcenon::pacs::ihe::xds::document_consumer::impl::signing_
private

Definition at line 151 of file document_consumer.cpp.

Referenced by retrieve().


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