ableos/ableos/src/relib/network/socket.rs

103 lines
2.4 KiB
Rust

use alloc::vec;
use alloc::vec::Vec;
pub type Stream = Vec<u8>;
pub struct SocketID {
pub id: usize,
}
impl Socket for SocketID {
fn peek(&mut self) -> SocketReturns {
SOCKETS.lock()[self.id].peek()
}
fn read(&mut self, length: usize) -> SocketReturns {
SOCKETS.lock()[self.id].read(length)
}
fn write(&mut self, stream: Stream) -> SocketReturns {
SOCKETS.lock()[self.id].write(stream)
}
}
pub type SocketState = Vec<SimpleSock>;
lazy_static::lazy_static! {
pub static ref SOCKETS: spin::Mutex<SocketState> = spin::Mutex::new(vec![]);
}
pub trait Socket {
fn peek(&mut self) -> SocketReturns;
/// Reads from the socket and removes read bytes from the socket
fn read(&mut self, length: usize) -> SocketReturns;
fn write(&mut self, stream: Stream) -> SocketReturns;
fn close(&mut self) {}
}
#[derive(Debug)]
pub enum SocketReturns {
ReadOk(Stream),
ReadIndexOutOfBounds,
WriteOk,
}
impl SocketReturns {
pub fn unwrap(self) -> Stream {
match self {
SocketReturns::ReadOk(stream) => stream,
SocketReturns::ReadIndexOutOfBounds => panic!("Read Index Out Of Bounds"),
SocketReturns::WriteOk => vec![1],
}
}
}
pub struct SimpleSock {
stream: Vec<u8>,
}
impl SimpleSock {
pub fn new() -> SocketID {
let sock = SimpleSock { stream: vec![] };
let mut sock_lock = SOCKETS.lock();
sock_lock.push(sock);
SocketID {
id: sock_lock.len() - 1,
}
}
pub fn regrab_sock(id: usize) -> SocketID {
SocketID { id }
}
}
impl Socket for SimpleSock {
fn peek(&mut self) -> SocketReturns {
let mut return_vec = vec![];
for x in &self.stream {
return_vec.push(x.clone());
}
SocketReturns::ReadOk(return_vec)
}
fn read(&mut self, length: usize) -> SocketReturns {
let mut return_vec = vec![];
if length > self.stream.len() {
SocketReturns::ReadIndexOutOfBounds
} else {
for _ in 0..length {
return_vec.push(self.stream[0]);
self.stream.remove(0);
}
SocketReturns::ReadOk(return_vec)
}
}
fn write(&mut self, stream: Stream) -> SocketReturns {
for byte in stream {
self.stream.push(byte);
}
SocketReturns::WriteOk
}
fn close(&mut self) {}
}