From 606bd191b86a162787d2f4dce90da9307766eb85 Mon Sep 17 00:00:00 2001 From: Jake Probst Date: Sat, 24 Aug 2019 14:18:07 -0700 Subject: [PATCH] split packet to sendpacket and recvpacket in serverstate --- src/common/client.rs | 25 ++++++++++++++++--------- src/common/serverstate.rs | 19 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/common/client.rs b/src/common/client.rs index a813586..51c2874 100644 --- a/src/common/client.rs +++ b/src/common/client.rs @@ -1,7 +1,7 @@ use libpso::crypto::{PSOCipher, NullCipher}; use libpso::{PSOPacket, PacketParseError}; -use crate::common::serverstate::{ServerState, ServerPacket, OnConnect}; +use crate::common::serverstate::{ServerState, SendServerPacket, RecvServerPacket, OnConnect}; use crate::common::network::{recv_packet, PacketNetworkError}; use std::net; @@ -9,17 +9,24 @@ use std::io::Write; use mio::tcp::TcpStream; use mio::{Poll, Events, Token, Ready, PollOpt}; -pub struct Client { +pub struct Client { running: bool, socket: mio::tcp::TcpStream, cipher_in: Box, cipher_out: Box, - state: Box>, + state: Box>, send_buffer: Vec, } -impl Client { - pub fn new(socket: mio::tcp::TcpStream, state: Box>) -> Client { +impl Client where + S: SendServerPacket + std::fmt::Debug, + R: RecvServerPacket + std::fmt::Debug, + E: std::fmt::Debug, +{ + pub fn new(socket: mio::tcp::TcpStream, + state: Box>) + -> Client + { let mut client = Client { running: true, socket: socket, @@ -31,7 +38,7 @@ impl Client { for task in client.state.on_connect() { match task { - OnConnect::Packet(pkt) => client.send(&*pkt), + OnConnect::Packet(pkt) => client.send(pkt), OnConnect::Cipher((cipher_in, cipher_out)) => { client.cipher_in = cipher_in; client.cipher_out = cipher_out; @@ -60,7 +67,7 @@ impl Client { } // TODO: this may need to pad to 8 bytes for bb cipher - fn send(&mut self, pkt: &dyn PSOPacket) { + fn send(&mut self, pkt: S) { println!("[send] {:?}", pkt); let buf = pkt.as_bytes(); let mut cbuf = self.cipher_out.encrypt(&buf).unwrap(); @@ -85,7 +92,7 @@ impl Client { loop { let pkt = recv_packet(&mut self.socket, &mut *self.cipher_in) .and_then(|pkt| { - P::from_bytes(&pkt) + R::from_bytes(&pkt) .map_err(|err| err.into()) }); @@ -94,7 +101,7 @@ impl Client { println!("[recv] {:?}", pkt); let response = self.state.handle(&pkt); for r in response { - self.send(&*r); + self.send(r); } }, Err(err) => { diff --git a/src/common/serverstate.rs b/src/common/serverstate.rs index f93c295..2b02b3b 100644 --- a/src/common/serverstate.rs +++ b/src/common/serverstate.rs @@ -1,21 +1,26 @@ -use libpso::{PSOPacket, PacketParseError}; +use libpso::PacketParseError; use libpso::crypto::PSOCipher; -pub enum OnConnect { - Packet(Box), +pub enum OnConnect { + Packet(S), Cipher((Box, Box)), } -pub trait ServerPacket: Sized { +pub trait RecvServerPacket: Sized { fn from_bytes(data: &Vec) -> Result; } +pub trait SendServerPacket: Sized { + fn as_bytes(&self) -> Vec; +} + pub trait ServerState { - type Packet: ServerPacket; + type SendPacket: SendServerPacket; + type RecvPacket: RecvServerPacket; type PacketError; - fn on_connect(&mut self) -> Vec; - fn handle(&mut self, pkt: &Self::Packet) -> Box>>; + fn on_connect(&mut self) -> Vec>; + fn handle(&mut self, pkt: &Self::RecvPacket) -> Box>; }