simple_stream/frame/
simple.rs1use std::mem;
26
27use super::{Frame, FrameBuilder};
28
29bitflags! {
30 #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
31 struct FrameGuard: u8 {
32 const START = 0b0000_0001;
33 const END = 0b0001_0111;
34 }
35}
36
37#[derive(Clone, Debug)]
38pub struct SimpleFrame {
39 start_guard: FrameGuard,
40 payload_len: u16,
41 payload: Vec<u8>,
42 end_guard: FrameGuard,
43}
44
45#[derive(Clone, Copy, Debug)]
46pub struct SimpleFrameBuilder;
47
48impl FrameBuilder for SimpleFrameBuilder {
49 fn from_bytes(buf: &mut Vec<u8>) -> Option<Box<dyn Frame>> {
50 if buf.len() < 5 {
51 return None;
52 }
53
54 let mut frame: SimpleFrame = Default::default();
55
56 match FrameGuard::from_bits(buf[0]) {
58 Some(start_guard) => {
59 trace!("Start guard found");
60 frame.start_guard = start_guard;
61 }
62 None => {
63 error!(
64 "First byte was not expected start byte. Buffer corrupted?: {:#b}",
65 buf[0]
66 );
67 }
68 }
69
70 let mask = 0xFFFFu16;
72 let mut payload_len = ((buf[1] as u16) << 8) & mask;
73 payload_len |= buf[2] as u16;
74 frame.payload_len = payload_len;
75
76 let payload_len = payload_len as usize;
77 if buf.len() - 4 < payload_len {
78 return None;
79 }
80
81 trace!("Payload length: {}", payload_len);
82
83 frame.payload.extend_from_slice(&buf[3..(payload_len + 3)]);
85
86 match FrameGuard::from_bits(buf[payload_len + 3]) {
88 Some(end_guard) => {
89 trace!("End guard found");
90 frame.end_guard = end_guard;
91 }
92 None => {
93 error!(
94 "Last byte was not expected end byte. Buffer corrupted? {:#b}",
95 buf[payload_len + 3]
96 );
97 return None;
98 }
99 }
100
101 let mut remainder = Vec::<u8>::with_capacity(buf.len() - frame.len_as_vec());
103 remainder.extend_from_slice(&buf[frame.len_as_vec()..buf.len()]);
104 mem::swap(buf, &mut remainder);
105
106 return Some(Box::new(frame));
107 }
108}
109
110impl SimpleFrame {
111 pub fn new(buf: &[u8]) -> Self {
113 SimpleFrame {
114 start_guard: FrameGuard::START,
115 payload_len: buf.len() as u16,
116 payload: buf.to_vec(),
117 end_guard: FrameGuard::END,
118 }
119 }
120}
121
122impl Frame for SimpleFrame {
123 fn payload(&self) -> Vec<u8> {
124 self.payload.clone()
125 }
126
127 fn to_bytes(&self) -> Vec<u8> {
128 let mut buf = Vec::<u8>::with_capacity(self.len_as_vec());
129 buf.push(self.start_guard.bits());
130 buf.push((self.payload_len >> 8) as u8);
131 buf.push(self.payload_len as u8);
132 buf.extend_from_slice(&self.payload[..]);
133 buf.push(self.end_guard.bits());
134
135 buf
136 }
137
138 fn len_as_vec(&self) -> usize {
139 (self.payload_len + 4) as usize
140 }
141
142 fn as_mut_raw_erased(&self) -> *mut () {
143 let dup = Box::new(self.clone());
144 return Box::into_raw(dup) as *mut _ as *mut ();
145 }
146}
147
148impl Default for SimpleFrame {
149 fn default() -> SimpleFrame {
150 SimpleFrame {
151 start_guard: FrameGuard::START,
152 payload_len: 0u16,
153 payload: Vec::<u8>::new(),
154 end_guard: FrameGuard::END,
155 }
156 }
157}