From 4d2437906effd9f6ebe3e84cad3a29d216f29931 Mon Sep 17 00:00:00 2001 From: arkpar Date: Wed, 13 Jan 2016 23:13:57 +0100 Subject: [PATCH] Io channel --- src/io/mod.rs | 1 + src/io/service.rs | 18 ++++++++++++++++++ src/network/host.rs | 14 +++----------- src/network/mod.rs | 1 + src/network/service.rs | 5 +++++ 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/io/mod.rs b/src/io/mod.rs index 86581b2c3..23a8509cc 100644 --- a/src/io/mod.rs +++ b/src/io/mod.rs @@ -70,6 +70,7 @@ pub type TimerToken = service::TimerToken; pub type StreamToken = service::StreamToken; pub type IoContext<'s, M> = service::IoContext<'s, M>; pub type IoService = service::IoService; +pub type IoChannel = service::IoChannel; //pub const USER_TOKEN_START: usize = service::USER_TOKEN; // TODO: ICE in rustc 1.7.0-nightly (49c382779 2016-01-12) #[cfg(test)] diff --git a/src/io/service.rs b/src/io/service.rs index f3fe9c020..b8f300670 100644 --- a/src/io/service.rs +++ b/src/io/service.rs @@ -146,6 +146,19 @@ impl Handler for IoManager where Message: Send + 'static { } } +/// Allows sending messages into the event loop. All the IO handlers will get the message +/// in the `message` callback. +pub struct IoChannel where Message: Send { + channel: Sender> +} + +impl IoChannel where Message: Send { + pub fn send(&mut self, message: Message) -> Result<(), IoError> { + try!(self.channel.send(IoMessage::UserMessage(message))); + Ok(()) + } +} + /// General IO Service. Starts an event loop and dispatches IO requests. /// 'Message' is a notification message type pub struct IoService where Message: Send + 'static { @@ -180,6 +193,11 @@ impl IoService where Message: Send + 'static { try!(self.host_channel.send(IoMessage::UserMessage(message))); Ok(()) } + + /// Create a new message channel + pub fn channel(&mut self) -> IoChannel { + IoChannel { channel: self.host_channel.clone() } + } } impl Drop for IoService where Message: Send { diff --git a/src/network/host.rs b/src/network/host.rs index a807804c6..4362f0d53 100644 --- a/src/network/host.rs +++ b/src/network/host.rs @@ -76,10 +76,7 @@ pub enum NetworkIoMessage where Message: Send { data: Vec, }, /// User message - User { - protocol: ProtocolId, - message: Message, - }, + User(Message), } /// Local (temporary) peer session ID. @@ -609,14 +606,9 @@ impl IoHandler> for Host where Messa } } }, - &mut NetworkIoMessage::User { - ref protocol, - ref message - } => { + &mut NetworkIoMessage::User(ref message) => { for (p, h) in self.handlers.iter_mut() { - if p != protocol { - h.message(&mut NetworkContext::new(io, p, None, &mut self.connections, &mut self.timers), &message); - } + h.message(&mut NetworkContext::new(io, p, None, &mut self.connections, &mut self.timers), &message); } } } diff --git a/src/network/mod.rs b/src/network/mod.rs index 7bc7ee71c..a47e88927 100644 --- a/src/network/mod.rs +++ b/src/network/mod.rs @@ -61,6 +61,7 @@ pub type PacketId = host::PacketId; pub type NetworkContext<'s,'io, Message> = host::NetworkContext<'s, 'io, Message>; pub type NetworkService = service::NetworkService; pub type NetworkIoMessage = host::NetworkIoMessage; +pub use network::host::NetworkIoMessage::User as UserMessage; pub type NetworkError = error::NetworkError; use io::*; diff --git a/src/network/service.rs b/src/network/service.rs index be70e2ee1..401c74634 100644 --- a/src/network/service.rs +++ b/src/network/service.rs @@ -40,5 +40,10 @@ impl NetworkService where Message: Send + 'static { })); Ok(()) } + + pub fn io(&mut self) -> &mut IoService> { + &mut self.io_service + } + }