split packet to sendpacket and recvpacket in serverstate
This commit is contained in:
		
							parent
							
								
									2fb97cc2b6
								
							
						
					
					
						commit
						606bd191b8
					
				| @ -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<P, E> { | ||||
| pub struct Client<S, R, E> { | ||||
|     running: bool, | ||||
|     socket: mio::tcp::TcpStream, | ||||
|     cipher_in: 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>, | ||||
| } | ||||
| 
 | ||||
| impl<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> { | ||||
|     pub fn new(socket: mio::tcp::TcpStream, state: Box<dyn ServerState<Packet = P, PacketError = E>>) -> Client<P, E> { | ||||
| impl<S, R, E> Client<S, R, E> where | ||||
|     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 { | ||||
|             running: true, | ||||
|             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() { | ||||
|             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<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> { | ||||
|     } | ||||
| 
 | ||||
|     // 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<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> { | ||||
|                         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<P: ServerPacket + std::fmt::Debug, E: std::fmt::Debug> Client<P, E> { | ||||
|                                     println!("[recv] {:?}", pkt); | ||||
|                                     let response = self.state.handle(&pkt); | ||||
|                                     for r in response { | ||||
|                                         self.send(&*r); | ||||
|                                         self.send(r); | ||||
|                                     } | ||||
|                                 }, | ||||
|                                 Err(err) => { | ||||
|  | ||||
| @ -1,21 +1,26 @@ | ||||
| use libpso::{PSOPacket, PacketParseError}; | ||||
| use libpso::PacketParseError; | ||||
| use libpso::crypto::PSOCipher; | ||||
| 
 | ||||
| 
 | ||||
| pub enum OnConnect { | ||||
|     Packet(Box<dyn PSOPacket>), | ||||
| pub enum OnConnect<S: SendServerPacket> { | ||||
|     Packet(S), | ||||
|     Cipher((Box<dyn PSOCipher>, Box<dyn PSOCipher>)), | ||||
| } | ||||
| 
 | ||||
| pub trait ServerPacket: Sized { | ||||
| pub trait RecvServerPacket: Sized { | ||||
|     fn from_bytes(data: &Vec<u8>) -> Result<Self, PacketParseError>; | ||||
| } | ||||
| 
 | ||||
| pub trait ServerState { | ||||
|     type Packet: ServerPacket; | ||||
|     type PacketError; | ||||
|     
 | ||||
|     fn on_connect(&mut self) -> Vec<OnConnect>; | ||||
|     fn handle(&mut self, pkt: &Self::Packet) -> Box<dyn Iterator<Item = Box<dyn PSOPacket>>>; | ||||
| pub trait SendServerPacket: Sized { | ||||
|     fn as_bytes(&self) -> Vec<u8>; | ||||
| } | ||||
| 
 | ||||
| pub trait ServerState { | ||||
|     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>>; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user