diff --git a/ipc/rpc/src/interface.rs b/ipc/rpc/src/interface.rs index c99cd3e35..8d67deca3 100644 --- a/ipc/rpc/src/interface.rs +++ b/ipc/rpc/src/interface.rs @@ -16,31 +16,43 @@ //! IPC RPC interface +use std::io::{Read, Write}; +use std::marker::Sync; +use std::sync::atomic::*; + pub trait IpcInterface { /// reads the message from io, dispatches the call and returns result - fn dispatch(&self, r: &mut R) -> Vec where R: ::std::io::Read; + fn dispatch(&self, r: &mut R) -> Vec where R: Read; } -pub fn invoke(method_num: u16, params: &Option>, w: &mut W) where W: ::std::io::Write { +/// serializes method invocation (method_num and parameters) to the stream specified by `w` +pub fn invoke(method_num: u16, params: &Option>, w: &mut W) where W: Write { + // creating buffer to contain all message let buf_len = match *params { None => 2, Some(ref val) => val.len() + 2 }; let mut buf = vec![0u8; buf_len]; + + // writing method_num as u16 buf[1] = (method_num & 255) as u8; buf[0] = (method_num >> 8) as u8; + + // serializing parameters only if provided with any if params.is_some() { buf[2..buf_len].clone_from_slice(params.as_ref().unwrap()); } if w.write(&buf).unwrap() != buf_len { + // if write was inconsistent panic!("failed to write to socket"); } } -pub trait IpcSocket: ::std::io::Read + ::std::io::Write { - fn ready(&self) -> ::std::sync::atomic::AtomicBool; +/// IpcSocket +pub trait IpcSocket: Read + Write + Sync { + fn ready(&self) -> AtomicBool; } impl IpcSocket for ::devtools::TestSocket { - fn ready(&self) -> ::std::sync::atomic::AtomicBool { - ::std::sync::atomic::AtomicBool::new(true) + fn ready(&self) -> AtomicBool { + AtomicBool::new(true) } }