From c546e2ef6c69bb1c6a86093f3cc7b2dab20d6ac4 Mon Sep 17 00:00:00 2001 From: Max Audron Date: Sat, 25 Apr 2020 19:35:29 +0200 Subject: finish parsing of primitive types --- src/protocol/primitive/bufferinfo.rs | 74 ++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/protocol/primitive/bufferinfo.rs (limited to 'src/protocol/primitive/bufferinfo.rs') diff --git a/src/protocol/primitive/bufferinfo.rs b/src/protocol/primitive/bufferinfo.rs new file mode 100644 index 0000000..4c69286 --- /dev/null +++ b/src/protocol/primitive/bufferinfo.rs @@ -0,0 +1,74 @@ +use std::vec::Vec; + +use failure::Error; + +use crate::protocol::primitive::deserialize::{Deserialize, DeserializeUTF8}; +use crate::protocol::primitive::serialize::{Serialize, SerializeUTF8}; +use crate::protocol::primitive::String; + +extern crate bytes; + +#[derive(Clone, Debug, std::cmp::PartialEq)] +pub struct BufferInfo { + pub id: i32, // a unique, sequential id for the buffer + pub network_id: i32, // NetworkId of the network the buffer belongs to + pub buffer_type: BufferType, + pub name: String, // BufferName as displayed to the user +} + +impl Serialize for BufferInfo { + fn serialize(&self) -> Result, Error> { + let mut values: Vec = Vec::new(); + + values.append(&mut i32::serialize(&self.id)?); + values.append(&mut i32::serialize(&self.network_id)?); + values.append(&mut i16::serialize(&(self.buffer_type as i16))?); + values.append(&mut vec![0, 0, 0, 0]); + values.append(&mut String::serialize_utf8(&self.name)?); + + Ok(values) + } +} + +impl Deserialize for BufferInfo { + fn parse(b: &[u8]) -> Result<(usize, Self), Error> { + let (_, id) = i32::parse(&b[0..4])?; + let (_, network_id) = i32::parse(&b[4..8])?; + let (_, buffer_type) = i16::parse(&b[8..10])?; + + // There are 4 additional undocumted Bytes in the BufferInfo + // so we start at byte 14 + let (size, name) = String::parse_utf8(&b[14..])?; + + return Ok(( + 14 + size, + Self { + id, + network_id, + buffer_type: BufferType::from(buffer_type), + name, + }, + )); + } +} + +#[repr(i16)] +#[derive(Copy, Clone, Debug, std::cmp::PartialEq)] +pub enum BufferType { + Status = 0x01, + Channel = 0x02, + Query = 0x04, + Group = 0x08, +} + +impl From for BufferType { + fn from(value: i16) -> Self { + match value { + 0x01 => return Self::Status, + 0x02 => return Self::Channel, + 0x04 => return Self::Query, + 0x08 => return Self::Group, + _ => unimplemented!(), + } + } +} -- cgit v1.2.3