opcua_core/messages/
request.rs1use 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 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 pub fn request_header(&self) -> &RequestHeader {
41 match self {
42 $( Self::$name(value) => &value.request_header, )*
43 }
44 }
45
46 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}