xCommonLib/protocol/
protocol_dxc.rs1use tracing::info;
2
3use crate::{
4 protocol::protocol_v1::ProtocolV1Reader,
5 serial::request_message::RequestMessage, service::sys_service_api::DXCProtocolHeader,
6};
7
8use super::protocol_v2::ProtocolV2Reader;
9
10
11pub struct ProtocolDXCReader<'a> {
12 msg_buffer: &'a [u8],
13}
14
15impl<'a> ProtocolDXCReader<'a> {
16 pub fn new(msg_buffer: &'a [u8]) -> ProtocolDXCReader<'a> {
17 ProtocolDXCReader { msg_buffer }
18 }
19 pub fn header(&self) -> DXCProtocolHeader {
21 let header_slice = self.msg_buffer;
22 let mut header = DXCProtocolHeader::default();
23
24 header.parse_from_bytes_return_num(header_slice).unwrap();
25
26 header
27 }
28 pub fn msg_body(&self) -> &'a [u8] {
30 let skip_bytes = DXCProtocolHeader::skip_from_bytes(self.msg_buffer);
32 &self.msg_buffer[(skip_bytes as usize) as usize..]
34 }
35
36}
37
38pub struct ProtocolDXC;
39
40impl ProtocolDXC {
41
42 pub fn from_v1(channel_id: i64, message: &[u8]) -> Vec<u8> {
43 let reader = ProtocolV1Reader::new(message);
44 let mut header = DXCProtocolHeader::default();
45 header.sender_key = reader.sender();
46 header.receive_key = reader.receiver();
47
48 header.channel_id = channel_id;
49 let xid = reader.xid();
50 header.request_id = xid.request_id;
51 header.conn_id = xid.conn_id;
52 header.timeout = reader.timeout();
53 header.msg_type = reader.msg_type().unwrap() as i32;
54
55 let msg_body = reader.msg_body();
56 let header_size = header.compute_size_with_tag_and_len();
57
58
59 let new_msg_len = header_size as usize + msg_body.len();
60
61 let mut new_message = Vec::with_capacity(new_msg_len);
62
63 unsafe {
64 new_message.set_len(new_msg_len);
65 }
66 let mut os = protobuf::CodedOutputStream::bytes(new_message.as_mut_slice());
68 header.serial_with_tag_and_len(&mut os);
69 drop(os);
71 unsafe {
72 let dst_ptr = new_message.as_mut_ptr().offset(header_size as isize);
74 std::ptr::copy_nonoverlapping(msg_body.as_ptr(), dst_ptr, msg_body.len());
75 }
76 new_message
77
78 }
79
80 pub fn from_v2(channel_id: i64, from_addr:String, message: &[u8]) -> Vec<u8> {
81
82 let reader = ProtocolV2Reader::new(message);
83
84 let mut header = DXCProtocolHeader::default();
85 header.sender_key = reader.sender();
87 header.receive_key = reader.receiver();
88 header.channel_id = channel_id;
89 let xid = reader.xid();
90 header.request_id = xid.request_id;
91 header.conn_id = xid.conn_id;
92 header.timeout = reader.timeout();
93 header.msg_type = reader.msg_type().unwrap() as i32;
94 header.from_address = from_addr;
95 let msg_body = reader.msg_body_without_vrs();
97 let header_size = header.compute_size_with_tag_and_len();
98
99 let new_msg_len = header_size as usize + msg_body.len();
100
101 let mut new_message = Vec::with_capacity(new_msg_len);
102
103 unsafe {
104 new_message.set_len(new_msg_len);
105 }
106
107
108 let mut os = protobuf::CodedOutputStream::bytes(new_message.as_mut_slice());
109
110 header.serial_with_tag_and_len(&mut os);
111
112 drop(os);
113 unsafe {
114 let dst_ptr = new_message.as_mut_ptr().offset(header_size as isize);
116 std::ptr::copy_nonoverlapping(msg_body.as_ptr(), dst_ptr, msg_body.len());
117 }
118 new_message
119 }
120}