Make Messenger transport private
This commit is contained in:
parent
f81f55485b
commit
d020caa477
|
@ -65,7 +65,7 @@ pub type ServerMessenger<T> = Messenger<T, MagpieServerMsg, MagpieClientMsg>;
|
|||
|
||||
/// Bidirectional, transport-agnostic Magpie IO wrapper struct.
|
||||
pub struct Messenger<T, I, O> {
|
||||
pub transport: T,
|
||||
transport: T,
|
||||
expected_len: Option<usize>,
|
||||
received_buf: VecDeque<u8>,
|
||||
received_queue: VecDeque<I>,
|
||||
|
@ -156,4 +156,9 @@ impl<T: Read + Write, I: DeserializeOwned, O: Serialize> Messenger<T, I, O> {
|
|||
pub fn recv(&mut self) -> Option<I> {
|
||||
self.received_queue.pop_back()
|
||||
}
|
||||
|
||||
/// Destroys this messenger and returns the inner transport.
|
||||
pub fn into_transport(self) -> T {
|
||||
self.transport
|
||||
}
|
||||
}
|
||||
|
|
|
@ -88,24 +88,6 @@ pub struct Client {
|
|||
id_to_window: HashMap<u32, usize>,
|
||||
}
|
||||
|
||||
impl Drop for Client {
|
||||
fn drop(&mut self) {
|
||||
println!("Client #{} disconnected", self.token.0);
|
||||
|
||||
let mut data = self.data.write();
|
||||
let _ = data
|
||||
.poll
|
||||
.registry()
|
||||
.deregister(&mut self.messenger.transport);
|
||||
|
||||
for (_id, window) in self.id_to_window.drain() {
|
||||
let msg = WindowMessage::CloseWindow { id: window };
|
||||
let _ = self.window_sender.send_event(msg);
|
||||
data.window_to_client_panel.remove(&window);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Client {
|
||||
pub fn on_readable(&mut self) -> std::io::Result<bool> {
|
||||
if let Err(err) = self.messenger.flush_recv() {
|
||||
|
@ -149,6 +131,20 @@ impl Client {
|
|||
|
||||
Ok(self.messenger.is_closed())
|
||||
}
|
||||
|
||||
pub fn disconnect(mut self) {
|
||||
println!("Client #{} disconnected", self.token.0);
|
||||
|
||||
let mut transport = self.messenger.into_transport();
|
||||
let mut data = self.data.write();
|
||||
let _ = data.poll.registry().deregister(&mut transport);
|
||||
|
||||
for (_id, window) in self.id_to_window.drain() {
|
||||
let msg = WindowMessage::CloseWindow { id: window };
|
||||
let _ = self.window_sender.send_event(msg);
|
||||
data.window_to_client_panel.remove(&window);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Ipc {
|
||||
|
@ -282,7 +278,7 @@ impl Ipc {
|
|||
} else if let Some(client) = self.clients.get_mut(event.token().0) {
|
||||
let disconnected = client.on_readable()?;
|
||||
if disconnected {
|
||||
self.clients.remove(event.token().0);
|
||||
self.clients.remove(event.token().0).disconnect();
|
||||
}
|
||||
} else {
|
||||
eprintln!("Unrecognized event token: {:?}", event);
|
||||
|
|
Loading…
Reference in New Issue