diff options
Diffstat (limited to 'src/protocol/primitive/bufferinfo.rs')
| -rw-r--r-- | src/protocol/primitive/bufferinfo.rs | 74 |
1 files changed, 74 insertions, 0 deletions
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<Vec<u8>, Error> { + let mut values: Vec<u8> = 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<i16> 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!(), + } + } +} |
