pub mod consts;
#[cfg(all(feature = "client_base"))]
pub mod client;
#[cfg(feature = "server")]
pub mod server;
use std::net::TcpStream;
use wincode::{ SchemaRead, SchemaWrite };
use why2::stream::RexStream;
use crate::
{
consts::Streams,
network::
{
self,
EncryptionMode,
SequencedPacket,
},
};
#[derive(SchemaWrite, SchemaRead, Clone, Default)]
pub struct ScreenPacket {
pub frame: Option<Vec<u8>>, pub audio: Option<Vec<u8>>, 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 send_frame (
stream: &mut TcpStream,
packet: ScreenPacket,
rex_stream: &mut RexStream,
seq: Option<&mut usize>, )
{
network::send_tcp
(
stream,
packet,
EncryptionMode::Stream(rex_stream),
seq,
);
}
pub fn receive_frame
(
streams: &mut Streams,
rex_stream: &mut RexStream,
seq: &mut usize ) -> Option<ScreenPacket>
{
let read = network::read_tcp
(
streams,
EncryptionMode::Stream(rex_stream),
#[cfg(feature = "server")] true,
)?;
match wincode::deserialize::<ScreenPacket>(&read.data)
{
Ok(packet) =>
{
if packet.seq > *seq || *seq == 0 {
*seq = packet.seq;
} else { return None; }
Some(packet)
},
_ => { None } }
}