simple_stream/frame/
simple.rs

1// Copyright 2015 Nathan Sizemore <nathanrsizemore@gmail.com>
2//
3// This Source Code Form is subject to the terms of the
4// Mozilla Public License, v. 2.0. If a copy of the MPL was not
5// distributed with this file, You can obtain one at
6// http://mozilla.org/MPL/2.0/.
7
8//! ## SimleFrame
9//!
10//! ```ignore
11//! 0                   1                   2                   3
12//! 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
13//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
14//! | Frame Start   |  Payload Len                  |  Payload  |
15//! +-----------------------------------------------------------+
16//! |           Payload Data Continued          |   Frame End   |
17//! +-----------------------------------------------------------+
18//!
19//! Start Guard:    8 bits (0x01)
20//! Payload Len:    16 bits
21//! Payload Data:   Payload Len bytes
22//! End Guard:      8 bits (0x17)
23//! ```
24
25use 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        // Starting frame guard
57        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        // Payload length
71        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        // Payload data
84        frame.payload.extend_from_slice(&buf[3..(payload_len + 3)]);
85
86        // Ending frame guard
87        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        // Remove frame from buffer
102        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    /// Creates a new `SimpleFrame`
112    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}