rust/lib-hedgewars-engine/src/ipc/channel.rs
author S.D.
Tue, 27 Sep 2022 14:59:03 +0300
changeset 15878 fc3cb23fd26f
parent 15265 07e909ba4203
permissions -rw-r--r--
Allow to see rooms of incompatible versions in the lobby For the new clients the room version is shown in a separate column. There is also a hack for previous versions clients: the room vesion specifier is prepended to the room names for rooms of incompatible versions, and the server shows 'incompatible version' error if the client tries to join them.

use hedgewars_engine_messages::{messages::*, parser::extract_message};
use netbuf::*;
use std::io::*;

pub struct Channel {
    in_buffer: Buf,
    out_buffer: Buf,
}

impl Channel {
    pub fn new() -> Self {
        Self {
            in_buffer: Buf::new(),
            out_buffer: Buf::new(),
        }
    }

    pub fn send_message(&mut self, message: &EngineMessage) {
        self.out_buffer.write(&message.to_bytes()).unwrap();
    }

    pub fn iter(&mut self) -> IPCMessagesIterator {
        IPCMessagesIterator::new(self)
    }
}

impl Write for Channel {
    fn write(&mut self, buf: &[u8]) -> Result<usize> {
        self.in_buffer.write(buf)
    }

    fn flush(&mut self) -> Result<()> {
        self.in_buffer.flush()
    }
}

impl Read for Channel {
    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
        let read_bytes = self.out_buffer.as_ref().read(buf)?;

        self.out_buffer.consume(read_bytes);

        Ok(read_bytes)
    }
}

pub struct IPCMessagesIterator<'a> {
    ipc: &'a mut Channel,
}

impl<'a> IPCMessagesIterator<'a> {
    pub fn new(ipc: &'a mut Channel) -> Self {
        Self { ipc }
    }
}

impl<'a> Iterator for IPCMessagesIterator<'a> {
    type Item = EngineMessage;

    fn next(&mut self) -> Option<Self::Item> {
        let (consumed, message) = extract_message(&self.ipc.in_buffer[..])?;

        self.ipc.in_buffer.consume(consumed);

        Some(message)
    }
}