use std::collections::VecDeque;
use std::io;
use crate::net::DatagramSend;
#[derive(Default)]
pub struct IoBuffer {
pub incoming: Vec<u8>,
pub outgoing: VecDeque<DatagramSend>,
}
impl IoBuffer {
pub(crate) fn set_incoming(&mut self, buf: &[u8]) {
self.incoming.extend_from_slice(buf);
assert!(
self.incoming.len() < 30_000,
"Incoming DTLS data is not being consumed"
);
}
pub(crate) fn pop_outgoing(&mut self) -> Option<DatagramSend> {
self.outgoing.pop_front()
}
}
impl io::Read for IoBuffer {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let n = self.incoming.len();
if n == 0 {
return Err(io::Error::new(io::ErrorKind::WouldBlock, "WouldBlock"));
}
let max = buf.len().min(n);
buf[..max].copy_from_slice(&self.incoming[..max]);
if max == self.incoming.len() {
self.incoming.truncate(0);
} else {
self.incoming.drain(..max);
}
Ok(n)
}
}
impl io::Write for IoBuffer {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let dsend = buf.to_vec().into();
self.outgoing.push_back(dsend);
Ok(buf.len())
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}