use std::mem;
use std::default::Default;
use super::{Frame, FrameBuilder};
bitflags! {
flags FrameGuard: u8 {
const START = 0b0000_0001,
const END = 0b0001_0111
}
}
#[derive(Clone)]
pub struct SimpleFrame {
start_guard: FrameGuard,
payload_len: u16,
payload: Vec<u8>,
end_guard: FrameGuard
}
#[derive(Clone)]
pub struct SimpleFrameBuilder;
impl FrameBuilder for SimpleFrameBuilder {
fn from_bytes(buf: &mut Vec<u8>) -> Option<Box<Frame>> {
if buf.len() < 5 {
return None;
}
let mut frame: SimpleFrame = Default::default();
match FrameGuard::from_bits(buf[0]) {
Some(start_guard) => {
frame.start_guard = start_guard;
}
None => {
error!("First byte was not expected start byte. Buffer corrupted?: {}", buf[0]);
}
}
let mask = 0xFFFFu16;
let mut payload_len = ((buf[1] as u16) << 8) & mask;
payload_len |= buf[2] as u16;
frame.payload_len = payload_len;
let payload_len = payload_len as usize;
if buf.len() - 4 < payload_len {
return None;
}
frame.payload.extend_from_slice(&buf[3..(payload_len + 3)]);
match FrameGuard::from_bits(buf[payload_len + 3]) {
Some(end_guard) => {
frame.end_guard = end_guard;
}
None => {
error!("Last byte was not expected end byte. Buffer corrupted? {}",
buf[payload_len + 3]);
return None;
}
}
let mut remainder = Vec::<u8>::with_capacity(buf.len() - frame.len_as_vec());
remainder.extend_from_slice(&buf[frame.len_as_vec()..buf.len()]);
mem::swap(buf, &mut remainder);
return Some(Box::new(frame));
}
}
impl SimpleFrame {
pub fn new(buf: &[u8]) -> Self {
SimpleFrame {
start_guard: START,
payload_len: buf.len() as u16,
payload: buf.to_vec(),
end_guard: END
}
}
}
impl Frame for SimpleFrame {
fn payload(&self) -> Vec<u8> {
self.payload.clone()
}
fn to_bytes(&self) -> Vec<u8> {
let mut buf = Vec::<u8>::with_capacity(self.len_as_vec());
buf.push(self.start_guard.bits());
buf.push((self.payload_len >> 8) as u8);
buf.push(self.payload_len as u8);
buf.extend_from_slice(&self.payload[..]);
buf.push(self.end_guard.bits());
buf
}
fn len_as_vec(&self) -> usize {
(self.payload_len + 4) as usize
}
fn as_mut_raw_erased(&self) -> *mut () {
let dup = Box::new(self.clone());
return Box::into_raw(dup) as *mut _ as *mut ();
}
}
impl Default for SimpleFrame {
fn default() -> SimpleFrame {
SimpleFrame {
start_guard: START,
payload_len: 0u16,
payload: Vec::<u8>::new(),
end_guard: END
}
}
}