pub mod consts;
#[cfg(all(feature = "client_base"))]
pub mod client;
#[cfg(feature = "server")]
pub mod server;
use tokio::net::
{
TcpStream,
tcp::OwnedWriteHalf,
};
use wincode::{ SchemaRead, SchemaWrite };
use crate::
{
consts::Streams,
crypto::RexPacketStream,
network::
{
self,
EncryptionMode,
SequencedPacket,
},
};
#[derive(SchemaWrite, SchemaRead, Clone)]
pub enum ScreenPacketCode
{
Video { data: Vec<u8> }, Audio { data: Vec<u8> }, }
#[derive(SchemaWrite, SchemaRead, Clone)]
pub struct ScreenPacket {
pub code: ScreenPacketCode, pub seq: usize, }
impl SequencedPacket for ScreenPacket
{
fn seq(&self) -> usize { self.seq }
fn set_seq(&mut self, seq: usize) { self.seq = seq; }
}
pub fn cap_socket_buffers(stream: &TcpStream) {
let socket = socket2::SockRef::from(stream);
socket.set_send_buffer_size(consts::SOCKET_BUFFER).ok();
socket.set_recv_buffer_size(consts::SOCKET_BUFFER).ok();
}
pub async fn send_frame (
write_stream: &mut OwnedWriteHalf,
code: ScreenPacketCode,
rex_stream: &mut RexPacketStream,
seq: Option<&mut usize>, )
{
network::send_tcp
(
write_stream,
ScreenPacket
{
code,
seq: 0,
},
EncryptionMode::Stream(rex_stream),
seq,
).await;
}
pub async fn receive_frame
(
streams: &mut Streams<'_>,
rex_stream: &mut RexPacketStream,
seq: &mut usize ) -> Option<ScreenPacketCode>
{
let read = network::read_tcp
(
streams,
EncryptionMode::Stream(rex_stream),
#[cfg(feature = "server")] true,
).await?;
match wincode::deserialize::<ScreenPacket>(&read.data)
{
Ok(packet) =>
{
if packet.seq > *seq || *seq == 0 {
*seq = packet.seq;
} else { return None; }
Some(packet.code)
},
_ => { None } }
}