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::*,
OptArc as _,
},
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.into(), 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) }
}
fn select_dir(
&self,
if_srv: impl FnOnce(&Self) -> io::Result<u32>,
if_clt: impl FnOnce(&Self) -> io::Result<u32>,
) -> io::Result<u32> {
if self.is_server() {
if_srv(self)
} else {
if_clt(self)
}
}
pub fn peer_process_id(&self) -> io::Result<u32> {
self.select_dir(Self::client_process_id, Self::server_process_id)
}
pub fn peer_session_id(&self) -> io::Result<u32> {
self.select_dir(Self::client_session_id, Self::server_session_id)
}
#[inline]
pub fn is_server(&self) -> bool { matches!(*self.raw.get().inner, InnerTokio::Server(..)) }
#[inline]
pub fn is_client(&self) -> bool { !self.is_server() }
}