From d4d03e2f6c495858faeb1560754a6f34a62e76d1 Mon Sep 17 00:00:00 2001 From: troido Date: Thu, 24 Jan 2019 18:39:20 +0100 Subject: git repo for rust version of asciifarm --- src/server/streamconnection.rs | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/server/streamconnection.rs (limited to 'src/server/streamconnection.rs') diff --git a/src/server/streamconnection.rs b/src/server/streamconnection.rs new file mode 100644 index 0000000..2bb111a --- /dev/null +++ b/src/server/streamconnection.rs @@ -0,0 +1,68 @@ + + +use std::io; +use std::io::{Read, Write}; +use std::mem::transmute; + + +pub struct StreamConnection { + pub stream: T, + buffer: Vec +} + +impl StreamConnection { + + pub fn new(stream: T) -> StreamConnection { + StreamConnection { + stream, + buffer: Vec::new() + } + } + + pub fn read(&mut self) -> Result<(Vec, bool), io::Error> { + let mut buf = [0; 2048]; + let mut closed = false; + loop { + match self.stream.read(&mut buf) { + Err(e) => { + if e.kind() == io::ErrorKind::WouldBlock { + break; + } else { + return Err(e); + } + } + Ok(0) => { + closed = true; + break; + } + Ok(i) => { + self.buffer.extend_from_slice(&buf[..i]); +// messages.push(String::from_utf8_lossy(&buf[..i]).to_string()); + } + } + } + let mut messages = Vec::new(); + while self.buffer.len() >= 4 { + let mut header: [u8; 4] = [0;4]; + header.copy_from_slice(&self.buffer[..4]); + let mlen: usize = u32::from_be(unsafe { transmute(header) }) as usize; + if self.buffer.len() - 4 < mlen { + break; + } + let rest = self.buffer.split_off(4+mlen); + let message = String::from_utf8_lossy(&self.buffer[4..]).to_string(); + messages.push(message); + self.buffer = rest; + } + return Ok((messages, closed)); + } + + pub fn send(&mut self, text: &str) -> Result<(), io::Error> { + let bytes: &[u8] = text.as_bytes(); + let len: u32 = bytes.len() as u32; + let header: [u8; 4] = unsafe { transmute(len.to_be()) }; + self.stream.write_all(&header)?; + self.stream.write_all(bytes) + } + +} -- cgit