20#ifndef PACS_SERVICES_QUERY_SCU_HPP
21#define PACS_SERVICES_QUERY_SCU_HPP
61 default:
return "Unknown";
305 explicit query_scu(std::shared_ptr<di::ILogger> logger =
nullptr);
314 std::shared_ptr<di::ILogger> logger =
nullptr);
419 uint16_t message_id);
469 network::association& assoc,
470 const core::dicom_dataset& query_keys,
471 uint16_t message_id);
DICOM Association management per PS3.8.
std::string_view get_sop_class_uid() const noexcept
Get SOP Class UID based on current configuration.
query_scu_config config_
Configuration.
network::Result< size_t > find_streaming(network::association &assoc, const core::dicom_dataset &query_keys, query_streaming_callback callback)
Perform a streaming C-FIND query for large result sets.
std::shared_ptr< di::ILogger > logger_
Logger instance for service logging.
void set_config(const query_scu_config &config)
Update the SCU configuration.
std::atomic< size_t > queries_performed_
Statistics: number of queries performed.
std::atomic< size_t > total_matches_
Statistics: total number of matches received.
network::Result< query_result > find_patients(network::association &assoc, const patient_query_keys &keys)
Query for patients.
network::Result< query_result > find_instances(network::association &assoc, const instance_query_keys &keys)
Query for instances within a series.
size_t queries_performed() const noexcept
Get the number of queries performed since construction.
network::Result< query_result > find_studies(network::association &assoc, const study_query_keys &keys)
Query for studies.
void reset_statistics() noexcept
Reset statistics counters to zero.
network::Result< std::monostate > cancel(network::association &assoc, uint16_t message_id)
Send a C-CANCEL request to stop an ongoing query.
std::atomic< uint16_t > message_id_counter_
Message ID counter.
uint16_t next_message_id() noexcept
Get the next message ID for DIMSE operations.
const query_scu_config & config() const noexcept
Get the current configuration.
network::Result< query_result > find_impl(network::association &assoc, const core::dicom_dataset &query_keys, uint16_t message_id)
Internal query implementation.
query_scu & operator=(query_scu &&)=delete
core::dicom_dataset build_query_dataset(const patient_query_keys &keys) const
Build query dataset from patient keys.
query_scu(query_scu &&)=delete
network::Result< query_result > find_series(network::association &assoc, const series_query_keys &keys)
Query for series within a study.
size_t total_matches() const noexcept
Get the total number of matches received since construction.
query_scu(const query_scu &)=delete
query_scu & operator=(const query_scu &)=delete
network::Result< query_result > find(network::association &assoc, const core::dicom_dataset &query_keys)
Perform a C-FIND query with raw dataset.
DICOM Dataset - ordered collection of Data Elements.
DIMSE message encoding and decoding.
Logger interface for dependency injection.
std::function< bool(const core::dicom_dataset &)> query_streaming_callback
Callback type for streaming query results.
constexpr std::string_view study_root_find_sop_class_uid
Study Root Query/Retrieve Information Model - FIND.
constexpr std::string_view get_find_sop_class_uid(query_model model) noexcept
Get the FIND SOP Class UID for a query model.
constexpr std::string_view patient_root_find_sop_class_uid
Patient Root Query/Retrieve Information Model - FIND.
auto to_string(mpps_status status) -> std::string_view
Convert mpps_status to DICOM string representation.
query_level
DICOM Query/Retrieve level enumeration.
@ study
Study level - query study information.
query_model
DICOM Query/Retrieve Information Model.
@ study_root
Study Root Query/Retrieve Information Model.
@ patient_root
Patient Root Query/Retrieve Information Model.
DICOM Query SCP service (C-FIND handler)
Query keys for IMAGE (Instance) level queries.
std::string sop_instance_uid
SOP Instance UID (0008,0018)
std::string series_uid
Series Instance UID (0020,000E) - Required.
std::string instance_number
Instance Number (0020,0013)
Query keys for PATIENT level queries.
std::string birth_date
Patient's Birth Date (0010,0030)
std::string sex
Patient's Sex (0010,0040)
std::string patient_id
Patient ID (0010,0020)
std::string patient_name
Patient's Name (0010,0010)
Result of a C-FIND query operation.
bool is_cancelled() const noexcept
Check if the query was cancelled.
std::chrono::milliseconds elapsed
Query execution time.
size_t total_pending
Number of pending responses received (may differ from matches.size() if max_results was enforced)
uint16_t status
Final DIMSE status code (0x0000 = success)
bool is_success() const noexcept
Check if the query was successful.
std::vector< core::dicom_dataset > matches
Matching datasets returned by the SCP.
Configuration for Query SCU service.
std::chrono::milliseconds timeout
Timeout for receiving query responses (milliseconds)
query_model model
Query information model (Patient Root or Study Root)
bool cancel_on_max
Send C-CANCEL when max_results is reached.
size_t max_results
Maximum number of results to return (0 = unlimited)
query_level level
Query level (Patient, Study, Series, or Image)
Query keys for SERIES level queries.
std::string series_number
Series Number (0020,0011)
std::string series_uid
Series Instance UID (0020,000E)
std::string study_uid
Study Instance UID (0020,000D) - Required.
std::string modality
Modality (0008,0060)
Query keys for STUDY level queries.
std::string accession_number
Accession Number (0008,0050)
std::string study_uid
Study Instance UID (0020,000D)
std::string study_description
Study Description (0008,1030)
std::string modality
Modalities in Study (0008,0061)
std::string patient_id
Patient ID (0010,0020) - for filtering.
std::string study_date
Study Date (0008,0020) - YYYYMMDD or range.