1use der_parser::Oid;
2use rusty_copp::CoppError;
3use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum AcseError {
7 #[error("ACSE Protocol Error - {}", .0)]
8 ProtocolError(String),
9
10 #[error("ACSE over COSP Protocol Stack Error - {}", .0)]
11 ProtocolStackError(#[from] CoppError),
12
13 #[error("ACSE IO Error: {:?}", .0)]
14 IoError(#[from] std::io::Error),
15
16 #[error("ACSE Error: {}", .0)]
17 InternalError(String),
18}
19
20#[derive(Clone, PartialEq, Debug)]
23pub struct AcseRequestInformation {
24 pub application_context_name: Oid<'static>,
25
26 pub called_ap_title: Option<ApTitle>,
27 pub called_ae_qualifier: Option<AeQualifier>,
28 pub called_ap_invocation_identifier: Option<Vec<u8>>, pub called_ae_invocation_identifier: Option<Vec<u8>>, pub calling_ap_title: Option<ApTitle>,
32 pub calling_ae_qualifier: Option<AeQualifier>,
33 pub calling_ap_invocation_identifier: Option<Vec<u8>>, pub calling_ae_invocation_identifier: Option<Vec<u8>>, pub implementation_information: Option<String>,
37}
38
39impl Default for AcseRequestInformation {
40 fn default() -> Self {
41 Self {
42 application_context_name: Oid::from(&[1, 2, 3, 4, 5]).expect("Failed to generate constant OID. This is a bug.").to_owned(),
43 called_ap_title: Default::default(),
44 called_ae_qualifier: Default::default(),
45 called_ap_invocation_identifier: Default::default(),
46 called_ae_invocation_identifier: Default::default(),
47 calling_ap_title: Default::default(),
48 calling_ae_qualifier: Default::default(),
49 calling_ap_invocation_identifier: Default::default(),
50 calling_ae_invocation_identifier: Default::default(),
51 implementation_information: Default::default(),
52 }
53 }
54}
55
56#[derive(Clone, PartialEq, Debug)]
57pub struct AcseResponseInformation {
58 pub application_context_name: Oid<'static>,
59
60 pub associate_result: AssociateResult,
61 pub associate_source_diagnostic: AssociateSourceDiagnostic,
62
63 pub responding_ap_title: Option<ApTitle>,
64 pub responding_ae_qualifier: Option<AeQualifier>,
65 pub responding_ap_invocation_identifier: Option<Vec<u8>>, pub responding_ae_invocation_identifier: Option<Vec<u8>>, pub implementation_information: Option<String>,
69}
70
71#[derive(Clone, PartialEq, Debug)]
72pub enum AssociateResult {
73 Accepted,
74 RejectedPermanent,
75 RejectedTransient,
76 Unknown(Vec<u8>),
77}
78
79#[derive(Clone, PartialEq, Debug)]
80pub enum AssociateSourceDiagnostic {
81 User(AssociateSourceDiagnosticUserCategory),
82 Provider(AssociateSourceDiagnosticProviderCategory),
83 Unknown(Vec<u8>), }
85
86#[derive(Clone, PartialEq, Debug)]
87pub enum AssociateSourceDiagnosticUserCategory {
88 Null,
89 NoReasonGiven,
90 ApplicationContextNameNotSupported,
91 CallingApTitleNotRecognized,
92 CallingApInvocationIdentifierNotRecognized,
93 CallingAeQualifierNotRecognized,
94 CallingAeInvocationIdentifierNotRecognized,
95 CalledApTitleNotRecognized,
96 CalledApInvocationIdentifierNotRecognized,
97 CalledAeQualifierNotRecognized,
98 CalledAeInvocationIdentifierNotRecognized,
99 AuthenticationMechanismNameNotRecognized,
100 AuthenticationMechanismNameRequired,
101 AuthenticationFailure,
102 AuthenticationRequired,
103 Unknown(Vec<u8>), }
105
106#[derive(Clone, PartialEq, Debug)]
107pub enum AssociateSourceDiagnosticProviderCategory {
108 Null,
109 NoReasonGiven,
110 NoCommonAcseVersion,
111 Unknown(Vec<u8>), }
113
114#[derive(Clone, PartialEq, Debug)]
115pub enum ApTitle {
116 Form2(Oid<'static>),
118}
119
120#[derive(Clone, PartialEq, Debug)]
121pub enum AeQualifier {
122 Form2(Vec<u8>), }
125
126#[derive(Debug, PartialEq, Eq)]
127pub enum AcseRecvResult {
128 Closed,
129 Data(Vec<u8>),
130}
131
132pub trait OsiSingleValueAcseInitiator: Send {
133 fn initiate(self, abstract_syntax_name: Oid<'static>, user_data: Vec<u8>) -> impl std::future::Future<Output = Result<(impl OsiSingleValueAcseConnection, AcseResponseInformation, Vec<u8>), AcseError>> + Send;
134}
135
136pub trait OsiSingleValueAcseListener: Send {
137 fn responder(self) -> impl std::future::Future<Output = Result<(impl OsiSingleValueAcseResponder, Vec<u8>), AcseError>> + Send;
138}
139
140pub trait OsiSingleValueAcseResponder: Send {
141 fn accept(self, user_data: Vec<u8>) -> impl std::future::Future<Output = Result<impl OsiSingleValueAcseConnection, AcseError>> + Send;
142}
143
144pub trait OsiSingleValueAcseConnection: Send {
145 fn split(self) -> impl std::future::Future<Output = Result<(impl OsiSingleValueAcseReader, impl OsiSingleValueAcseWriter), AcseError>> + Send;
146}
147
148pub trait OsiSingleValueAcseReader: Send {
149 fn recv(&mut self) -> impl std::future::Future<Output = Result<AcseRecvResult, AcseError>> + Send;
150}
151
152pub trait OsiSingleValueAcseWriter: Send {
153 fn send(&mut self, data: Vec<u8>) -> impl std::future::Future<Output = Result<(), AcseError>> + Send;
154 fn continue_send(&mut self) -> impl std::future::Future<Output = Result<(), AcseError>> + Send;
155}