188325f54SHarlanC use { 28e71d710SHarlan super::{ 38e71d710SHarlan bytes_errors::{BytesReadError, BytesReadErrorValue}, 48e71d710SHarlan bytesio::TNetIO, 58e71d710SHarlan }, 688325f54SHarlanC byteorder::{ByteOrder, ReadBytesExt}, 788325f54SHarlanC bytes::{BufMut, BytesMut}, 88e71d710SHarlan std::{io::Cursor, sync::Arc}, 98e71d710SHarlan tokio::sync::Mutex, 1088325f54SHarlanC }; 1188325f54SHarlanC 1288325f54SHarlanC pub struct BytesReader { 1388325f54SHarlanC buffer: BytesMut, 1488325f54SHarlanC } 1588325f54SHarlanC impl BytesReader { new(input: BytesMut) -> Self1688325f54SHarlanC pub fn new(input: BytesMut) -> Self { 1788325f54SHarlanC Self { buffer: input } 1888325f54SHarlanC } 1988325f54SHarlanC extend_from_slice(&mut self, extend: &[u8])2088325f54SHarlanC pub fn extend_from_slice(&mut self, extend: &[u8]) { 2188325f54SHarlanC let remaining_mut = self.buffer.remaining_mut(); 2288325f54SHarlanC let extend_length = extend.len(); 2388325f54SHarlanC 2488325f54SHarlanC if extend_length > remaining_mut { 2588325f54SHarlanC let additional = extend_length - remaining_mut; 2688325f54SHarlanC self.buffer.reserve(additional); 2788325f54SHarlanC } 2888325f54SHarlanC 2988325f54SHarlanC self.buffer.extend_from_slice(extend) 3088325f54SHarlanC } 3188325f54SHarlanC read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError>3288325f54SHarlanC pub fn read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> { 3388325f54SHarlanC if self.buffer.len() < bytes_num { 3488325f54SHarlanC return Err(BytesReadError { 3588325f54SHarlanC value: BytesReadErrorValue::NotEnoughBytes, 3688325f54SHarlanC }); 3788325f54SHarlanC } 3888325f54SHarlanC Ok(self.buffer.split_to(bytes_num)) 3988325f54SHarlanC } 4088325f54SHarlanC advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError>4188325f54SHarlanC pub fn advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> { 4288325f54SHarlanC if self.buffer.len() < bytes_num { 4388325f54SHarlanC return Err(BytesReadError { 4488325f54SHarlanC value: BytesReadErrorValue::NotEnoughBytes, 4588325f54SHarlanC }); 4688325f54SHarlanC } 4788325f54SHarlanC 4888325f54SHarlanC //here maybe optimised 4988325f54SHarlanC Ok(self.buffer.clone().split_to(bytes_num)) 5088325f54SHarlanC } 5188325f54SHarlanC read_bytes_cursor( &mut self, bytes_num: usize, ) -> Result<Cursor<BytesMut>, BytesReadError>5288325f54SHarlanC pub fn read_bytes_cursor( 5388325f54SHarlanC &mut self, 5488325f54SHarlanC bytes_num: usize, 5588325f54SHarlanC ) -> Result<Cursor<BytesMut>, BytesReadError> { 5688325f54SHarlanC let tmp_bytes = self.read_bytes(bytes_num)?; 5788325f54SHarlanC let tmp_cursor = Cursor::new(tmp_bytes); 5888325f54SHarlanC Ok(tmp_cursor) 5988325f54SHarlanC } 6088325f54SHarlanC advance_bytes_cursor( &mut self, bytes_num: usize, ) -> Result<Cursor<BytesMut>, BytesReadError>6188325f54SHarlanC pub fn advance_bytes_cursor( 6288325f54SHarlanC &mut self, 6388325f54SHarlanC bytes_num: usize, 6488325f54SHarlanC ) -> Result<Cursor<BytesMut>, BytesReadError> { 6588325f54SHarlanC let tmp_bytes = self.advance_bytes(bytes_num)?; 6688325f54SHarlanC let tmp_cursor = Cursor::new(tmp_bytes); 6788325f54SHarlanC Ok(tmp_cursor) 6888325f54SHarlanC } 6988325f54SHarlanC read_u8(&mut self) -> Result<u8, BytesReadError>7088325f54SHarlanC pub fn read_u8(&mut self) -> Result<u8, BytesReadError> { 7188325f54SHarlanC let mut cursor = self.read_bytes_cursor(1)?; 7288325f54SHarlanC 7388325f54SHarlanC Ok(cursor.read_u8()?) 7488325f54SHarlanC } 7588325f54SHarlanC advance_u8(&mut self) -> Result<u8, BytesReadError>7688325f54SHarlanC pub fn advance_u8(&mut self) -> Result<u8, BytesReadError> { 7788325f54SHarlanC let mut cursor = self.advance_bytes_cursor(1)?; 7888325f54SHarlanC Ok(cursor.read_u8()?) 7988325f54SHarlanC } 8088325f54SHarlanC read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError>8188325f54SHarlanC pub fn read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError> { 8288325f54SHarlanC let mut cursor = self.read_bytes_cursor(2)?; 8388325f54SHarlanC let val = cursor.read_u16::<T>()?; 8488325f54SHarlanC Ok(val) 8588325f54SHarlanC } 8688325f54SHarlanC read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>8788325f54SHarlanC pub fn read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> { 8888325f54SHarlanC let mut cursor = self.read_bytes_cursor(3)?; 8988325f54SHarlanC let val = cursor.read_u24::<T>()?; 9088325f54SHarlanC Ok(val) 9188325f54SHarlanC } 9288325f54SHarlanC advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>9388325f54SHarlanC pub fn advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> { 9488325f54SHarlanC let mut cursor = self.advance_bytes_cursor(3)?; 9588325f54SHarlanC Ok(cursor.read_u24::<T>()?) 9688325f54SHarlanC } 9788325f54SHarlanC read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>9888325f54SHarlanC pub fn read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> { 9988325f54SHarlanC let mut cursor = self.read_bytes_cursor(4)?; 10088325f54SHarlanC let val = cursor.read_u32::<T>()?; 10188325f54SHarlanC 10288325f54SHarlanC Ok(val) 10388325f54SHarlanC } 10488325f54SHarlanC read_u48<T: ByteOrder>(&mut self) -> Result<u64, BytesReadError>105*06c50324SHarlan pub fn read_u48<T: ByteOrder>(&mut self) -> Result<u64, BytesReadError> { 106*06c50324SHarlan let mut cursor = self.read_bytes_cursor(6)?; 107*06c50324SHarlan let val = cursor.read_u48::<T>()?; 108*06c50324SHarlan 109*06c50324SHarlan Ok(val) 110*06c50324SHarlan } 111*06c50324SHarlan read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError>11288325f54SHarlanC pub fn read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError> { 11388325f54SHarlanC let mut cursor = self.read_bytes_cursor(8)?; 11488325f54SHarlanC let val = cursor.read_f64::<T>()?; 11588325f54SHarlanC 11688325f54SHarlanC Ok(val) 11788325f54SHarlanC } 11888325f54SHarlanC read_u64<T: ByteOrder>(&mut self) -> Result<u64, BytesReadError>1198e71d710SHarlan pub fn read_u64<T: ByteOrder>(&mut self) -> Result<u64, BytesReadError> { 1208e71d710SHarlan let mut cursor = self.read_bytes_cursor(8)?; 1218e71d710SHarlan let val = cursor.read_u64::<T>()?; 1228e71d710SHarlan 1238e71d710SHarlan Ok(val) 1248e71d710SHarlan } 1258e71d710SHarlan get(&self, index: usize) -> Result<u8, BytesReadError>126c4a586d9SHarlan pub fn get(&self, index: usize) -> Result<u8, BytesReadError> { 127a4440553SHarlanC if index >= self.len() { 128a4440553SHarlanC return Err(BytesReadError { 129a4440553SHarlanC value: BytesReadErrorValue::IndexOutofRange, 130a4440553SHarlanC }); 131a4440553SHarlanC } 132a4440553SHarlanC 13385c0af6aSLuca Barbato Ok(*self.buffer.get(index).unwrap()) 134a4440553SHarlanC } 135a4440553SHarlanC len(&self) -> usize136c4a586d9SHarlan pub fn len(&self) -> usize { 13785c0af6aSLuca Barbato self.buffer.len() 13888325f54SHarlanC } 13988325f54SHarlanC is_empty(&self) -> bool140c4a586d9SHarlan pub fn is_empty(&self) -> bool { 141c4a586d9SHarlan self.len() == 0 142c4a586d9SHarlan } 143c4a586d9SHarlan extract_remaining_bytes(&mut self) -> BytesMut14488325f54SHarlanC pub fn extract_remaining_bytes(&mut self) -> BytesMut { 14585c0af6aSLuca Barbato self.buffer.split_to(self.buffer.len()) 14688325f54SHarlanC } get_remaining_bytes(&self) -> BytesMut147c4a586d9SHarlan pub fn get_remaining_bytes(&self) -> BytesMut { 14885c0af6aSLuca Barbato self.buffer.clone() 14988325f54SHarlanC } 15088325f54SHarlanC } 1518e71d710SHarlan pub struct AsyncBytesReader<T1: TNetIO> { 1528e71d710SHarlan pub bytes_reader: BytesReader, 1538e71d710SHarlan pub io: Arc<Mutex<T1>>, 1548e71d710SHarlan } 1558e71d710SHarlan 1568e71d710SHarlan impl<T1> AsyncBytesReader<T1> 1578e71d710SHarlan where 1588e71d710SHarlan T1: TNetIO, 1598e71d710SHarlan { new(io: Arc<Mutex<T1>>) -> Self1608e71d710SHarlan pub fn new(io: Arc<Mutex<T1>>) -> Self { 1618e71d710SHarlan Self { 1628e71d710SHarlan bytes_reader: BytesReader::new(BytesMut::default()), 1638e71d710SHarlan io, 1648e71d710SHarlan } 1658e71d710SHarlan } 1668e71d710SHarlan read(&mut self) -> Result<(), BytesReadError>1678e71d710SHarlan pub async fn read(&mut self) -> Result<(), BytesReadError> { 1688e71d710SHarlan let data = self.io.lock().await.read().await?; 1698e71d710SHarlan self.bytes_reader.extend_from_slice(&data[..]); 1708e71d710SHarlan Ok(()) 1718e71d710SHarlan } 1728e71d710SHarlan check(&mut self, bytes_num: usize) -> Result<(), BytesReadError>1738e71d710SHarlan async fn check(&mut self, bytes_num: usize) -> Result<(), BytesReadError> { 1748e71d710SHarlan while self.bytes_reader.len() < bytes_num { 1758e71d710SHarlan self.read().await?; 1768e71d710SHarlan } 1778e71d710SHarlan 1788e71d710SHarlan Ok(()) 1798e71d710SHarlan } 1808e71d710SHarlan read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError>1818e71d710SHarlan pub async fn read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> { 1828e71d710SHarlan self.check(bytes_num).await?; 1838e71d710SHarlan self.bytes_reader.read_bytes(bytes_num) 1848e71d710SHarlan } 1858e71d710SHarlan advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError>1868e71d710SHarlan pub async fn advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> { 1878e71d710SHarlan self.check(bytes_num).await?; 1888e71d710SHarlan self.bytes_reader.advance_bytes(bytes_num) 1898e71d710SHarlan } 1908e71d710SHarlan read_bytes_cursor( &mut self, bytes_num: usize, ) -> Result<Cursor<BytesMut>, BytesReadError>1918e71d710SHarlan pub async fn read_bytes_cursor( 1928e71d710SHarlan &mut self, 1938e71d710SHarlan bytes_num: usize, 1948e71d710SHarlan ) -> Result<Cursor<BytesMut>, BytesReadError> { 1958e71d710SHarlan self.check(bytes_num).await?; 1968e71d710SHarlan self.bytes_reader.read_bytes_cursor(bytes_num) 1978e71d710SHarlan } 1988e71d710SHarlan advance_bytes_cursor( &mut self, bytes_num: usize, ) -> Result<Cursor<BytesMut>, BytesReadError>1998e71d710SHarlan pub async fn advance_bytes_cursor( 2008e71d710SHarlan &mut self, 2018e71d710SHarlan bytes_num: usize, 2028e71d710SHarlan ) -> Result<Cursor<BytesMut>, BytesReadError> { 2038e71d710SHarlan self.check(bytes_num).await?; 2048e71d710SHarlan self.bytes_reader.advance_bytes_cursor(bytes_num) 2058e71d710SHarlan } 2068e71d710SHarlan read_u8(&mut self) -> Result<u8, BytesReadError>2078e71d710SHarlan pub async fn read_u8(&mut self) -> Result<u8, BytesReadError> { 2088e71d710SHarlan self.check(1).await?; 2098e71d710SHarlan self.bytes_reader.read_u8() 2108e71d710SHarlan } 2118e71d710SHarlan advance_u8(&mut self) -> Result<u8, BytesReadError>2128e71d710SHarlan pub async fn advance_u8(&mut self) -> Result<u8, BytesReadError> { 2138e71d710SHarlan self.check(1).await?; 2148e71d710SHarlan self.bytes_reader.advance_u8() 2158e71d710SHarlan } 2168e71d710SHarlan read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError>2178e71d710SHarlan pub async fn read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError> { 2188e71d710SHarlan self.check(2).await?; 2198e71d710SHarlan self.bytes_reader.read_u16::<T>() 2208e71d710SHarlan } 2218e71d710SHarlan read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>2228e71d710SHarlan pub async fn read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> { 2238e71d710SHarlan self.check(3).await?; 2248e71d710SHarlan self.bytes_reader.read_u24::<T>() 2258e71d710SHarlan } 2268e71d710SHarlan advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>2278e71d710SHarlan pub async fn advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> { 2288e71d710SHarlan self.check(3).await?; 2298e71d710SHarlan self.bytes_reader.advance_u24::<T>() 2308e71d710SHarlan } 2318e71d710SHarlan read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>2328e71d710SHarlan pub async fn read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> { 2338e71d710SHarlan self.check(4).await?; 2348e71d710SHarlan self.bytes_reader.read_u32::<T>() 2358e71d710SHarlan } 2368e71d710SHarlan read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError>2378e71d710SHarlan pub async fn read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError> { 2388e71d710SHarlan self.check(8).await?; 2398e71d710SHarlan self.bytes_reader.read_f64::<T>() 2408e71d710SHarlan } 2418e71d710SHarlan } 24288325f54SHarlanC 24388325f54SHarlanC #[cfg(test)] 24488325f54SHarlanC mod tests { 24588325f54SHarlanC 24688325f54SHarlanC use super::BytesReader; 24788325f54SHarlanC use bytes::BytesMut; 24888325f54SHarlanC use std::cell::RefCell; 24988325f54SHarlanC use std::rc::Rc; 25088325f54SHarlanC 25188325f54SHarlanC #[test] test_rc_refcell()25288325f54SHarlanC fn test_rc_refcell() { 25388325f54SHarlanC let reader = Rc::new(RefCell::new(BytesReader::new(BytesMut::new()))); 25488325f54SHarlanC let xs: [u8; 3] = [1, 2, 3]; 25588325f54SHarlanC reader.borrow_mut().extend_from_slice(&xs[..]); 25688325f54SHarlanC 25788325f54SHarlanC let mut rv = reader.borrow_mut().read_u8().unwrap(); 25888325f54SHarlanC assert_eq!(rv, 1, "Incorrect value"); 25988325f54SHarlanC 26088325f54SHarlanC rv = reader.borrow_mut().read_u8().unwrap(); 26188325f54SHarlanC assert_eq!(rv, 2, "Incorrect value"); 26288325f54SHarlanC 26388325f54SHarlanC rv = reader.borrow_mut().read_u8().unwrap(); 26488325f54SHarlanC assert_eq!(rv, 3, "Incorrect value"); 26588325f54SHarlanC } 26688325f54SHarlanC 26788325f54SHarlanC struct RefStruct { 26888325f54SHarlanC pub reader: Rc<RefCell<BytesReader>>, 26988325f54SHarlanC } 27088325f54SHarlanC 27188325f54SHarlanC impl RefStruct { new(reader: Rc<RefCell<BytesReader>>) -> Self27288325f54SHarlanC pub fn new(reader: Rc<RefCell<BytesReader>>) -> Self { 27385c0af6aSLuca Barbato Self { reader } 27488325f54SHarlanC } 27588325f54SHarlanC 27688325f54SHarlanC // pub fn read_u8(&mut self) -> u8 { 27788325f54SHarlanC // return self.reader.borrow_mut().read_u8().unwrap(); 27888325f54SHarlanC // } 27988325f54SHarlanC extend_from_slice(&mut self, data: &[u8])28088325f54SHarlanC pub fn extend_from_slice(&mut self, data: &[u8]) { 28188325f54SHarlanC self.reader.borrow_mut().extend_from_slice(data); 28288325f54SHarlanC } 28388325f54SHarlanC } 28488325f54SHarlanC 28588325f54SHarlanC #[test] test_struct_rc_refcell()28688325f54SHarlanC fn test_struct_rc_refcell() { 28788325f54SHarlanC let reader = Rc::new(RefCell::new(BytesReader::new(BytesMut::new()))); 28888325f54SHarlanC 28988325f54SHarlanC let mut ref_struct = RefStruct::new(reader); 29088325f54SHarlanC 29188325f54SHarlanC let xs: [u8; 3] = [1, 2, 3]; 29288325f54SHarlanC ref_struct.extend_from_slice(&xs); 29388325f54SHarlanC 29488325f54SHarlanC let mut reader = ref_struct.reader.borrow_mut(); 29588325f54SHarlanC 29688325f54SHarlanC let mut rv = reader.read_u8().unwrap(); 29788325f54SHarlanC assert_eq!(rv, 1, "Incorrect value"); 29888325f54SHarlanC 29988325f54SHarlanC rv = reader.read_u8().unwrap(); 30088325f54SHarlanC assert_eq!(rv, 2, "Incorrect value"); 30188325f54SHarlanC 30288325f54SHarlanC rv = reader.read_u8().unwrap(); 30388325f54SHarlanC assert_eq!(rv, 3, "Incorrect value"); 30488325f54SHarlanC } 30588325f54SHarlanC } 306