Skip to main content

opcua_core/messages/
request.rs

1use crate::comms::message_chunk::MessageChunkType;
2
3use super::{Message, MessageType};
4use opcua_types::*;
5use std::io::{Read, Write};
6
7macro_rules! request_enum {
8    ($($name:ident: $value:ident; $enc:ident),*,) => {
9        #[derive(Debug, PartialEq, Clone)]
10        /// Enum of all possible _request_ service messages.
11        pub enum RequestMessage {
12            $(
13                #[doc = stringify!($name)]
14                $name(Box<$value>),
15            )*
16        }
17        $(
18            impl From<$value> for RequestMessage {
19                fn from(value: $value) -> Self {
20                    Self::$name(Box::new(value))
21                }
22            }
23        )*
24        impl BinaryEncodable for RequestMessage {
25            fn byte_len(&self, ctx: &opcua_types::Context<'_>) -> usize {
26                match self {
27                    $( Self::$name(value) => value.byte_len(ctx), )*
28                }
29            }
30
31            fn encode<S: Write + ?Sized>(&self, stream: &mut S, ctx: &opcua_types::Context<'_>) -> EncodingResult<()> {
32                match self {
33                    $( Self::$name(value) => value.encode(stream, ctx), )*
34                }
35            }
36        }
37
38        impl RequestMessage {
39            /// Get the request header.
40            pub fn request_header(&self) -> &RequestHeader {
41                match self {
42                    $( Self::$name(value) => &value.request_header, )*
43                }
44            }
45
46            /// Get the name of the request variant, for debugging and logging.
47            pub fn type_name(&self) -> &'static str {
48                match self {
49                    $( Self::$name(_) => stringify!($name), )*
50                }
51            }
52        }
53
54        impl Message for RequestMessage {
55            fn request_handle(&self) -> u32 {
56                self.request_header().request_handle
57            }
58
59            fn decode_by_object_id<S: Read>(
60                stream: &mut S,
61                object_id: ObjectId,
62                ctx: &opcua_types::Context<'_>
63            ) -> EncodingResult<Self> {
64                match object_id {
65                    $( ObjectId::$enc => {
66                        Ok($value::decode(stream, ctx)?.into())
67                    }, )*
68                    _ => {
69                        Err(Error::decoding(format!("decoding unsupported for object id {:?}", object_id)))
70                    }
71                }
72            }
73
74            fn type_id(&self) -> NodeId {
75                match self {
76                    $( Self::$name(v) => v.type_id().into(), )*
77                }
78            }
79        }
80    };
81}
82
83impl MessageType for RequestMessage {
84    fn message_type(&self) -> crate::comms::message_chunk::MessageChunkType {
85        match self {
86            Self::OpenSecureChannel(_) => MessageChunkType::OpenSecureChannel,
87            Self::CloseSecureChannel(_) => MessageChunkType::CloseSecureChannel,
88            _ => MessageChunkType::Message,
89        }
90    }
91}
92
93request_enum! {
94    OpenSecureChannel: OpenSecureChannelRequest; OpenSecureChannelRequest_Encoding_DefaultBinary,
95    CloseSecureChannel: CloseSecureChannelRequest; CloseSecureChannelRequest_Encoding_DefaultBinary,
96    GetEndpoints: GetEndpointsRequest; GetEndpointsRequest_Encoding_DefaultBinary,
97    FindServers: FindServersRequest; FindServersRequest_Encoding_DefaultBinary,
98    FindServersOnNetwork: FindServersOnNetworkRequest; FindServersOnNetworkRequest_Encoding_DefaultBinary,
99    RegisterServer: RegisterServerRequest; RegisterServerRequest_Encoding_DefaultBinary,
100    RegisterServer2: RegisterServer2Request; RegisterServer2Request_Encoding_DefaultBinary,
101    CreateSession: CreateSessionRequest; CreateSessionRequest_Encoding_DefaultBinary,
102    CloseSession: CloseSessionRequest; CloseSessionRequest_Encoding_DefaultBinary,
103    Cancel: CancelRequest; CancelRequest_Encoding_DefaultBinary,
104    ActivateSession: ActivateSessionRequest; ActivateSessionRequest_Encoding_DefaultBinary,
105    AddNodes: AddNodesRequest; AddNodesRequest_Encoding_DefaultBinary,
106    AddReferences: AddReferencesRequest; AddReferencesRequest_Encoding_DefaultBinary,
107    DeleteNodes: DeleteNodesRequest; DeleteNodesRequest_Encoding_DefaultBinary,
108    DeleteReferences: DeleteReferencesRequest; DeleteReferencesRequest_Encoding_DefaultBinary,
109    CreateMonitoredItems: CreateMonitoredItemsRequest; CreateMonitoredItemsRequest_Encoding_DefaultBinary,
110    ModifyMonitoredItems: ModifyMonitoredItemsRequest; ModifyMonitoredItemsRequest_Encoding_DefaultBinary,
111    DeleteMonitoredItems: DeleteMonitoredItemsRequest; DeleteMonitoredItemsRequest_Encoding_DefaultBinary,
112    SetMonitoringMode: SetMonitoringModeRequest; SetMonitoringModeRequest_Encoding_DefaultBinary,
113    SetTriggering: SetTriggeringRequest; SetTriggeringRequest_Encoding_DefaultBinary,
114    CreateSubscription: CreateSubscriptionRequest; CreateSubscriptionRequest_Encoding_DefaultBinary,
115    ModifySubscription: ModifySubscriptionRequest; ModifySubscriptionRequest_Encoding_DefaultBinary,
116    DeleteSubscriptions: DeleteSubscriptionsRequest; DeleteSubscriptionsRequest_Encoding_DefaultBinary,
117    TransferSubscriptions: TransferSubscriptionsRequest; TransferSubscriptionsRequest_Encoding_DefaultBinary,
118    SetPublishingMode: SetPublishingModeRequest; SetPublishingModeRequest_Encoding_DefaultBinary,
119    QueryFirst: QueryFirstRequest; QueryFirstRequest_Encoding_DefaultBinary,
120    QueryNext: QueryNextRequest; QueryNextRequest_Encoding_DefaultBinary,
121    Browse: BrowseRequest; BrowseRequest_Encoding_DefaultBinary,
122    BrowseNext: BrowseNextRequest; BrowseNextRequest_Encoding_DefaultBinary,
123    Publish: PublishRequest; PublishRequest_Encoding_DefaultBinary,
124    Republish: RepublishRequest; RepublishRequest_Encoding_DefaultBinary,
125    TranslateBrowsePathsToNodeIds: TranslateBrowsePathsToNodeIdsRequest; TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary,
126    RegisterNodes: RegisterNodesRequest; RegisterNodesRequest_Encoding_DefaultBinary,
127    UnregisterNodes: UnregisterNodesRequest; UnregisterNodesRequest_Encoding_DefaultBinary,
128    Read: ReadRequest; ReadRequest_Encoding_DefaultBinary,
129    HistoryRead: HistoryReadRequest; HistoryReadRequest_Encoding_DefaultBinary,
130    Write: WriteRequest; WriteRequest_Encoding_DefaultBinary,
131    HistoryUpdate: HistoryUpdateRequest; HistoryUpdateRequest_Encoding_DefaultBinary,
132    Call: CallRequest; CallRequest_Encoding_DefaultBinary,
133}