1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
#![cfg(windows)] extern crate tokio_core; extern crate mio_named_pipes; extern crate futures; use std::ffi::OsStr; use std::fmt; use std::io::{self, Read, Write}; use std::os::windows::io::*; use futures::Async; use tokio_core::io::Io; use tokio_core::reactor::{PollEvented, Handle}; pub struct NamedPipe { io: PollEvented<mio_named_pipes::NamedPipe>, } impl NamedPipe { pub fn new<P: AsRef<OsStr>>(p: P, handle: &Handle) -> io::Result<NamedPipe> { NamedPipe::_new(p.as_ref(), handle) } fn _new(p: &OsStr, handle: &Handle) -> io::Result<NamedPipe> { let inner = try!(mio_named_pipes::NamedPipe::new(p)); NamedPipe::from_pipe(inner, handle) } pub fn from_pipe(pipe: mio_named_pipes::NamedPipe, handle: &Handle) -> io::Result<NamedPipe> { Ok(NamedPipe { io: try!(PollEvented::new(pipe, handle)), }) } pub fn connect(&self) -> io::Result<()> { self.io.get_ref().connect() } pub fn disconnect(&self) -> io::Result<()> { self.io.get_ref().disconnect() } pub fn poll_read(&self) -> Async<()> { self.io.poll_read() } pub fn poll_write(&self) -> Async<()> { self.io.poll_write() } } impl Read for NamedPipe { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.io.read(buf) } } impl Write for NamedPipe { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.io.write(buf) } fn flush(&mut self) -> io::Result<()> { self.io.flush() } } impl Io for NamedPipe { fn poll_read(&mut self) -> Async<()> { <NamedPipe>::poll_read(self) } fn poll_write(&mut self) -> Async<()> { <NamedPipe>::poll_write(self) } } impl<'a> Read for &'a NamedPipe { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { (&self.io).read(buf) } } impl<'a> Write for &'a NamedPipe { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { (&self.io).write(buf) } fn flush(&mut self) -> io::Result<()> { (&self.io).flush() } } impl<'a> Io for &'a NamedPipe { fn poll_read(&mut self) -> Async<()> { <NamedPipe>::poll_read(self) } fn poll_write(&mut self) -> Async<()> { <NamedPipe>::poll_write(self) } } impl fmt::Debug for NamedPipe { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.io.get_ref().fmt(f) } } impl AsRawHandle for NamedPipe { fn as_raw_handle(&self) -> RawHandle { self.io.get_ref().as_raw_handle() } }