macro_rules! same_clsrv {
($nm:ident in $var:expr => $e:expr) => {
match &*$var {
InnerTokio::Server($nm) => $e,
InnerTokio::Client($nm) => $e,
}
};
}
mod ctor;
mod debug;
mod handle;
mod recv_bytes;
mod send;
use {
super::*,
crate::os::windows::{
named_pipe::{
c_wrappers::{self, hget},
PipeMode,
},
winprelude::*,
},
std::{
future::Future,
pin::Pin,
task::{ready, Context, Poll},
},
tokio::net::windows::named_pipe::{
NamedPipeClient as TokioNPClient, NamedPipeServer as TokioNPServer,
},
windows_sys::Win32::System::Pipes,
};
impl<Rm: PipeModeTag, Sm: PipeModeTag> PipeStream<Rm, Sm> {
pub fn split(mut self) -> (RecvPipeStream<Rm>, SendPipeStream<Sm>) {
let (raw_ac, raw_a) = (self.raw.refclone(), self.raw);
(RecvPipeStream { raw: raw_a, flusher: (), _phantom: PhantomData }, SendPipeStream {
raw: raw_ac,
flusher: self.flusher,
_phantom: PhantomData,
})
}
pub fn reunite(rh: RecvPipeStream<Rm>, sh: SendPipeStream<Sm>) -> ReuniteResult<Rm, Sm> {
if !MaybeArc::ptr_eq(&rh.raw, &sh.raw) {
return Err(ReuniteError { rh, sh });
}
let PipeStream { mut raw, flusher, .. } = sh;
drop(rh);
raw.try_make_owned();
Ok(PipeStream { raw, flusher, _phantom: PhantomData })
}
#[inline]
pub fn client_process_id(&self) -> io::Result<u32> {
unsafe { hget(self.as_handle(), Pipes::GetNamedPipeClientProcessId) }
}
#[inline]
pub fn client_session_id(&self) -> io::Result<u32> {
unsafe { hget(self.as_handle(), Pipes::GetNamedPipeClientSessionId) }
}
#[inline]
pub fn server_process_id(&self) -> io::Result<u32> {
unsafe { hget(self.as_handle(), Pipes::GetNamedPipeServerProcessId) }
}
#[inline]
pub fn server_session_id(&self) -> io::Result<u32> {
unsafe { hget(self.as_handle(), Pipes::GetNamedPipeServerSessionId) }
}
#[inline]
pub fn is_server(&self) -> bool { matches!(*self.raw.inner, InnerTokio::Server(..)) }
#[inline]
pub fn is_client(&self) -> bool { !self.is_server() }
}