diff --git a/apps/magpie/src/protocol.rs b/apps/magpie/src/protocol.rs index 84f3e5b..4aed53c 100644 --- a/apps/magpie/src/protocol.rs +++ b/apps/magpie/src/protocol.rs @@ -65,7 +65,7 @@ pub type ServerMessenger = Messenger; /// Bidirectional, transport-agnostic Magpie IO wrapper struct. pub struct Messenger { - pub transport: T, + transport: T, expected_len: Option, received_buf: VecDeque, received_queue: VecDeque, @@ -156,4 +156,9 @@ impl Messenger { pub fn recv(&mut self) -> Option { self.received_queue.pop_back() } + + /// Destroys this messenger and returns the inner transport. + pub fn into_transport(self) -> T { + self.transport + } } diff --git a/apps/magpie/src/service/ipc.rs b/apps/magpie/src/service/ipc.rs index e8b5cea..a59bd3c 100644 --- a/apps/magpie/src/service/ipc.rs +++ b/apps/magpie/src/service/ipc.rs @@ -88,24 +88,6 @@ pub struct Client { id_to_window: HashMap, } -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 { 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);