split packet to sendpacket and recvpacket in serverstate

This commit is contained in:
Jake Probst 2019-08-24 14:18:07 -07:00
parent 2fb97cc2b6
commit 606bd191b8
2 changed files with 31 additions and 19 deletions

View File

@ -1,7 +1,7 @@
use libpso::crypto::{PSOCipher, NullCipher}; use libpso::crypto::{PSOCipher, NullCipher};
use libpso::{PSOPacket, PacketParseError}; 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 crate::common::network::{recv_packet, PacketNetworkError};
use std::net; use std::net;
@ -9,17 +9,24 @@ use std::io::Write;
use mio::tcp::TcpStream; use mio::tcp::TcpStream;
use mio::{Poll, Events, Token, Ready, PollOpt}; use mio::{Poll, Events, Token, Ready, PollOpt};
pub struct Client<P, E> { pub struct Client<S, R, E> {
running: bool, running: bool,
socket: mio::tcp::TcpStream, socket: mio::tcp::TcpStream,
cipher_in: Box<dyn PSOCipher>, cipher_in: Box<dyn PSOCipher>,
cipher_out: Box<dyn PSOCipher>, cipher_out: Box<dyn PSOCipher>,
state: Box<dyn ServerState<Packet = P, PacketError = E>>, state: Box<dyn ServerState<SendPacket = S, RecvPacket = R, PacketError = E>>,
send_buffer: Vec<u8>, send_buffer: Vec<u8>,
} }
impl<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> { impl<S, R, E> Client<S, R, E> where
pub fn new(socket: mio::tcp::TcpStream, state: Box<dyn ServerState<Packet = P, PacketError = E>>) -> Client<P, E> { S: SendServerPacket + std::fmt::Debug,
R: RecvServerPacket + std::fmt::Debug,
E: std::fmt::Debug,
{
pub fn new(socket: mio::tcp::TcpStream,
state: Box<dyn ServerState<SendPacket = S, RecvPacket = R, PacketError = E>>)
-> Client<S, R, E>
{
let mut client = Client { let mut client = Client {
running: true, running: true,
socket: socket, socket: socket,
@ -31,7 +38,7 @@ impl<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> {
for task in client.state.on_connect() { for task in client.state.on_connect() {
match task { match task {
OnConnect::Packet(pkt) => client.send(&*pkt), OnConnect::Packet(pkt) => client.send(pkt),
OnConnect::Cipher((cipher_in, cipher_out)) => { OnConnect::Cipher((cipher_in, cipher_out)) => {
client.cipher_in = cipher_in; client.cipher_in = cipher_in;
client.cipher_out = cipher_out; client.cipher_out = cipher_out;
@ -60,7 +67,7 @@ impl<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> {
} }
// TODO: this may need to pad to 8 bytes for bb cipher // 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); println!("[send] {:?}", pkt);
let buf = pkt.as_bytes(); let buf = pkt.as_bytes();
let mut cbuf = self.cipher_out.encrypt(&buf).unwrap(); let mut cbuf = self.cipher_out.encrypt(&buf).unwrap();
@ -85,7 +92,7 @@ impl<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> {
loop { loop {
let pkt = recv_packet(&mut self.socket, &mut *self.cipher_in) let pkt = recv_packet(&mut self.socket, &mut *self.cipher_in)
.and_then(|pkt| { .and_then(|pkt| {
P::from_bytes(&pkt) R::from_bytes(&pkt)
.map_err(|err| err.into()) .map_err(|err| err.into())
}); });
@ -94,7 +101,7 @@ impl<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> {
println!("[recv] {:?}", pkt); println!("[recv] {:?}", pkt);
let response = self.state.handle(&pkt); let response = self.state.handle(&pkt);
for r in response { for r in response {
self.send(&*r); self.send(r);
} }
}, },
Err(err) => { Err(err) => {

View File

@ -1,21 +1,26 @@
use libpso::{PSOPacket, PacketParseError}; use libpso::PacketParseError;
use libpso::crypto::PSOCipher; use libpso::crypto::PSOCipher;
pub enum OnConnect { pub enum OnConnect<S: SendServerPacket> {
Packet(Box<dyn PSOPacket>), Packet(S),
Cipher((Box<dyn PSOCipher>, Box<dyn PSOCipher>)), Cipher((Box<dyn PSOCipher>, Box<dyn PSOCipher>)),
} }
pub trait ServerPacket: Sized { pub trait RecvServerPacket: Sized {
fn from_bytes(data: &Vec<u8>) -> Result<Self, PacketParseError>; fn from_bytes(data: &Vec<u8>) -> Result<Self, PacketParseError>;
} }
pub trait ServerState { pub trait SendServerPacket: Sized {
type Packet: ServerPacket; fn as_bytes(&self) -> Vec<u8>;
type PacketError; }
fn on_connect(&mut self) -> Vec<OnConnect>; pub trait ServerState {
fn handle(&mut self, pkt: &Self::Packet) -> Box<dyn Iterator<Item = Box<dyn PSOPacket>>>; type SendPacket: SendServerPacket;
type RecvPacket: RecvServerPacket;
type PacketError;
fn on_connect(&mut self) -> Vec<OnConnect<Self::SendPacket>>;
fn handle(&mut self, pkt: &Self::RecvPacket) -> Box<dyn Iterator<Item = Self::SendPacket>>;
} }