use std::io::{ErrorKind, self};
use mio::{net::TcpListener, Poll, Token, Interest, event::Event};
use crate::tcp::Tcp;
use super::hub::Hub;
const LISTENER: Token = Token(0);
pub struct Gate {
listener:TcpListener,
pub hub:Hub
}
impl Gate {
pub fn new(addr:&str,p:&Poll) -> io::Result<Gate> {
let mut listener = Tcp::bind(addr)?;
p.registry().register(&mut listener, LISTENER, Interest::READABLE)?;
Ok(Gate{ listener, hub:Hub::new(0) })
}
pub fn process(&mut self, event:&Event,p:&Poll) {
match event.token() {
LISTENER => { self.on_listener_event(event,p); }
_ => { self.hub.process(event); }
}
}
fn on_listener_event(&mut self,event:&Event,p:&Poll) {
if event.is_error() {
return ;
}
loop {
match self.listener.accept() {
Ok((socket, _)) => {
self.hub.new_line(socket, p);
}
Err(err) if err.kind() == ErrorKind::WouldBlock => { break; }
_ => {
panic!();
}
}
}
}
}