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;
mod send_off;
use super::*;
use crate::os::windows::{
named_pipe::{
c_wrappers::{self, hget},
PipeMode,
},
winprelude::*,
};
use std::{
future::Future,
pin::Pin,
task::{ready, Context, Poll},
};
use tokio::net::windows::named_pipe::{
NamedPipeClient as TokioNPClient, NamedPipeServer as TokioNPServer,
};
use 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()
}
}