xCommonLib/protocol/
protocol_dxc.rs

1use 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    //
20    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    //
29    pub fn msg_body(&self) -> &'a [u8] {
30        //
31        let skip_bytes = DXCProtocolHeader::skip_from_bytes(self.msg_buffer);
32        //
33        &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        //
67        let mut os = protobuf::CodedOutputStream::bytes(new_message.as_mut_slice());
68        header.serial_with_tag_and_len(&mut os);
69        //
70        drop(os);
71        unsafe {
72          // 写入消息
73          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        //
86        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        //
96        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            // 写入消息
115            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}