use super::RW;
use super::evented::{Evented, EventedImpl, MioAdapter};
use std::io;
use std::net::SocketAddr;
use mio_orig;
use std;
pub use mio_orig::tcp::Shutdown;
pub type TcpListener = MioAdapter<mio_orig::tcp::TcpListener>;
impl TcpListener {
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.shared().io_ref().local_addr()
}
pub fn take_socket_error(&self) -> io::Result<()> {
self.shared().io_ref().take_socket_error()
}
pub fn try_clone(&self) -> io::Result<TcpListener> {
self.shared().io_ref().try_clone().map(MioAdapter::new)
}
}
impl TcpListener {
pub fn bind(addr: &SocketAddr) -> io::Result<Self> {
mio_orig::tcp::TcpListener::bind(addr).map(MioAdapter::new)
}
pub fn from_listener(listener: std::net::TcpListener, addr: &SocketAddr) -> io::Result<Self> {
mio_orig::tcp::TcpListener::from_listener(listener, addr).map(MioAdapter::new)
}
}
pub type TcpStream = MioAdapter<mio_orig::tcp::TcpStream>;
impl TcpStream {
pub fn connect(addr: &SocketAddr) -> io::Result<Self> {
let stream = mio_orig::tcp::TcpStream::connect(addr).map(|t| {
let stream = MioAdapter::new(t);
stream.block_on(RW::write());
stream
});
if let Ok(ref stream) = stream {
if let Err(err) = stream.shared().io_ref().take_socket_error() {
return Err(err);
}
}
stream
}
pub fn connect_stream(stream: std::net::TcpStream, addr: &SocketAddr) -> io::Result<Self> {
let stream = mio_orig::tcp::TcpStream::connect_stream(stream, addr).map(|t| {
let stream = MioAdapter::new(t);
stream.block_on(RW::write());
stream
});
if let Ok(ref stream) = stream {
if let Err(err) = stream.shared().io_ref().take_socket_error() {
return Err(err);
}
}
stream
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.shared().io_ref().local_addr()
}
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
self.shared().io_ref().peer_addr()
}
pub fn shutdown(&self, how: mio_orig::tcp::Shutdown) -> io::Result<()> {
self.shared().io_ref().shutdown(how)
}
pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> {
self.shared().io_ref().set_nodelay(nodelay)
}
pub fn set_keepalive(&self, seconds: Option<u32>) -> io::Result<()> {
self.shared().io_ref().set_keepalive(seconds)
}
pub fn take_socket_error(&self) -> io::Result<()> {
self.shared().io_ref().take_socket_error()
}
pub fn try_clone(&self) -> io::Result<TcpStream> {
self.shared().io_ref().try_clone().map(MioAdapter::new)
}
}