gameServer2/src/protocol/mod.rs
changeset 12136 e25a82ce2374
parent 12133 81df2e1f9ae9
child 13416 cdf69667593b
equal deleted inserted replaced
12135:23ee939ba66a 12136:e25a82ce2374
     1 use netbuf;
     1 use netbuf;
     2 use std::io::Read;
     2 use std::io::Read;
     3 use std::io::Result;
     3 use std::io::Result;
       
     4 use nom::IResult;
     4 
     5 
     5 mod messages;
     6 pub mod messages;
     6 mod parser;
     7 mod parser;
     7 
     8 
     8 pub struct FrameDecoder {
     9 pub struct ProtocolDecoder {
     9     buf: netbuf::Buf,
    10     buf: netbuf::Buf,
       
    11     consumed: usize,
    10 }
    12 }
    11 
    13 
    12 impl FrameDecoder {
    14 impl ProtocolDecoder {
    13     pub fn new() -> FrameDecoder {
    15     pub fn new() -> ProtocolDecoder {
    14         FrameDecoder {
    16         ProtocolDecoder {
    15             buf: netbuf::Buf::new()
    17             buf: netbuf::Buf::new(),
       
    18             consumed: 0,
    16         }
    19         }
    17     }
    20     }
    18 
    21 
    19     pub fn read_from<R: Read>(&mut self, stream: &mut R) -> Result<usize> {
    22     pub fn read_from<R: Read>(&mut self, stream: &mut R) -> Result<usize> {
    20         self.buf.read_from(stream)
    23         self.buf.read_from(stream)
    21     }
    24     }
    22 
    25 
    23     pub fn extract_messages(&mut self) -> &[u8] {
    26     pub fn extract_messages(&mut self) -> Vec<messages::HWProtocolMessage> {
    24         &self.buf[..]
    27         let parse_result = parser::extract_messages(&self.buf[..]);
       
    28         match parse_result {
       
    29             IResult::Done(tail, msgs) => {
       
    30                 self.consumed = self.buf.len() - self.consumed - tail.len();
       
    31                 msgs
       
    32             },
       
    33             IResult::Incomplete(_) => unreachable!(),
       
    34             IResult::Error(_) => unreachable!(),
       
    35         }
       
    36     }
       
    37 
       
    38     pub fn sweep(&mut self) {
       
    39         self.buf.consume(self.consumed);
       
    40         self.consumed = 0;
    25     }
    41     }
    26 }
    42 }