gameServer2/src/protocol/mod.rs
author Wuzzy <Wuzzy2@mail.ru>
Fri, 03 Nov 2017 05:46:36 +0100
changeset 12822 f062a31fc8f2
parent 12136 e25a82ce2374
child 13416 cdf69667593b
permissions -rw-r--r--
Fix lastGameType not being updated if game type was demo or save (fixes a crash) Previously, if you first played a normal game, then a demo, the “play again” button would appear, but clicking it would only crash HW. This fix will remove this button after a demo or save, because the frontend doesn't know how to restart demos or saves yet.

use netbuf;
use std::io::Read;
use std::io::Result;
use nom::IResult;

pub mod messages;
mod parser;

pub struct ProtocolDecoder {
    buf: netbuf::Buf,
    consumed: usize,
}

impl ProtocolDecoder {
    pub fn new() -> ProtocolDecoder {
        ProtocolDecoder {
            buf: netbuf::Buf::new(),
            consumed: 0,
        }
    }

    pub fn read_from<R: Read>(&mut self, stream: &mut R) -> Result<usize> {
        self.buf.read_from(stream)
    }

    pub fn extract_messages(&mut self) -> Vec<messages::HWProtocolMessage> {
        let parse_result = parser::extract_messages(&self.buf[..]);
        match parse_result {
            IResult::Done(tail, msgs) => {
                self.consumed = self.buf.len() - self.consumed - tail.len();
                msgs
            },
            IResult::Incomplete(_) => unreachable!(),
            IResult::Error(_) => unreachable!(),
        }
    }

    pub fn sweep(&mut self) {
        self.buf.consume(self.consumed);
        self.consumed = 0;
    }
}