From 65c437a022abc83d4ef2c7b0fd803e14b54a5926 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Tue, 12 Apr 2016 16:46:42 +0200 Subject: [PATCH] Add RoomLeaveResponse/Request, unhandled as yet. --- TODO.md | 1 + src/client.rs | 49 ++++++++++++++++------------ src/proto/server/constants.rs | 1 + src/proto/server/request.rs | 60 +++++++++++++++++++++++------------ src/proto/server/response.rs | 35 ++++++++++++++++---- 5 files changed, 99 insertions(+), 47 deletions(-) diff --git a/TODO.md b/TODO.md index 638ddb4..b6729f6 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,6 @@ Things to do: ------------- + - Handle RoomLeaveRequest/Response. - Print out surplus bytes in hex to make analyzing them easier - Handle client connections diff --git a/src/client.rs b/src/client.rs index 2ada100..659f34c 100644 --- a/src/client.rs +++ b/src/client.rs @@ -126,12 +126,12 @@ impl Client { self.controller_connected = false; }, - control::Request::RoomJoinRequest(room_name) => - self.handle_room_join_request(room_name), - control::Request::LoginStatusRequest => self.handle_login_status_request(), + control::Request::RoomJoinRequest(room_name) => + self.handle_room_join_request(room_name), + control::Request::RoomListRequest => self.handle_room_list_request(), @@ -242,6 +242,9 @@ impl Client { ServerResponse::RoomJoinResponse(response) => self.handle_room_join_response(response), + ServerResponse::RoomLeaveResponse(response) => + self.handle_room_leave_response(response), + ServerResponse::RoomListResponse(response) => self.handle_room_list_response(response), @@ -258,24 +261,6 @@ impl Client { } } - fn handle_room_join_response(&mut self, mut response: RoomJoinResponse) { - // Join the room and store the received information. - self.rooms.join( - &response.room_name, response.owner, response.operators, - &response.users); - - // Then update the user structs based on the info we just got. - for (name, user) in response.users.drain(..) { - self.users.insert(name, user); - } - - let control_response = control::RoomJoinResponse { - room_name: response.room_name - }; - self.control_send(control::Response::RoomJoinResponse( - control_response)); - } - fn handle_login_response(&mut self, login: LoginResponse) { if let LoginStatus::Pending = self.login_status { match login { @@ -314,6 +299,28 @@ impl Client { self.users.set_all_privileged(response.users); } + fn handle_room_join_response(&mut self, mut response: RoomJoinResponse) { + // Join the room and store the received information. + self.rooms.join( + &response.room_name, response.owner, response.operators, + &response.users); + + // Then update the user structs based on the info we just got. + for (name, user) in response.users.drain(..) { + self.users.insert(name, user); + } + + let control_response = control::RoomJoinResponse { + room_name: response.room_name + }; + self.control_send(control::Response::RoomJoinResponse( + control_response)); + } + + fn handle_room_leave_response(&mut self, response: RoomLeaveResponse) { + // TODO handle it. + } + fn handle_room_list_response(&mut self, response: RoomListResponse) { // Update the room map in memory. self.rooms.set_room_list(response); diff --git a/src/proto/server/constants.rs b/src/proto/server/constants.rs index adc106f..a64534c 100644 --- a/src/proto/server/constants.rs +++ b/src/proto/server/constants.rs @@ -3,6 +3,7 @@ pub const CODE_SET_LISTEN_PORT: u32 = 2; pub const CODE_PEER_ADDRESS: u32 = 3; pub const CODE_ROOM_MESSAGE: u32 = 13; pub const CODE_ROOM_JOIN: u32 = 14; +pub const CODE_ROOM_LEAVE: u32 = 15; pub const CODE_USER_JOINED_ROOM: u32 = 16; pub const CODE_CONNECT_TO_PEER: u32 = 18; pub const CODE_ROOM_LIST: u32 = 64; diff --git a/src/proto/server/request.rs b/src/proto/server/request.rs index 2f34b19..af07394 100644 --- a/src/proto/server/request.rs +++ b/src/proto/server/request.rs @@ -16,9 +16,10 @@ trait WriteToPacket { #[derive(Debug)] pub enum ServerRequest { - RoomJoinRequest(RoomJoinRequest), LoginRequest(LoginRequest), PeerAddressRequest(PeerAddressRequest), + RoomJoinRequest(RoomJoinRequest), + RoomLeaveRequest(RoomLeaveRequest), RoomListRequest, RoomMessageRequest(RoomMessageRequest), SetListenPortRequest(SetListenPortRequest), @@ -27,15 +28,18 @@ pub enum ServerRequest { impl ServerRequest { pub fn to_packet(&self) -> io::Result { let (mut packet, request): (Packet, &WriteToPacket) = match *self { - ServerRequest::RoomJoinRequest(ref request) => - (Packet::new(CODE_ROOM_JOIN), request), - ServerRequest::LoginRequest(ref request) => (Packet::new(CODE_LOGIN), request), ServerRequest::PeerAddressRequest(ref request) => (Packet::new(CODE_PEER_ADDRESS), request), + ServerRequest::RoomJoinRequest(ref request) => + (Packet::new(CODE_ROOM_JOIN), request), + + ServerRequest::RoomLeaveRequest(ref request) => + (Packet::new(CODE_ROOM_LEAVE), request), + ServerRequest::RoomListRequest => return Ok(Packet::new(CODE_ROOM_LIST)), @@ -56,22 +60,6 @@ fn md5_str(string: &str) -> String { hasher.result_str() } -/*===========* - * JOIN ROOM * - *===========*/ - -#[derive(Debug)] -pub struct RoomJoinRequest { - pub room_name: String -} - -impl WriteToPacket for RoomJoinRequest { - fn write_to_packet(&self, packet: &mut Packet) -> io::Result<()> { - try!(packet.write_str(&self.room_name)); - Ok(()) - } -} - /*=======* * LOGIN * *=======*/ @@ -139,6 +127,38 @@ impl WriteToPacket for PeerAddressRequest { } } +/*===========* + * ROOM JOIN * + *===========*/ + +#[derive(Debug)] +pub struct RoomJoinRequest { + pub room_name: String +} + +impl WriteToPacket for RoomJoinRequest { + fn write_to_packet(&self, packet: &mut Packet) -> io::Result<()> { + try!(packet.write_str(&self.room_name)); + Ok(()) + } +} + +/*============* + * ROOM LEAVE * + *============*/ + +#[derive(Debug)] +pub struct RoomLeaveRequest { + pub room_name: String +} + +impl WriteToPacket for RoomLeaveRequest { + fn write_to_packet(&self, packet: &mut Packet) -> io::Result<()> { + try!(packet.write_str(&self.room_name)); + Ok(()) + } +} + /*==============* * ROOM MESSAGE * *==============*/ diff --git a/src/proto/server/response.rs b/src/proto/server/response.rs index 6d9c475..ed34d01 100644 --- a/src/proto/server/response.rs +++ b/src/proto/server/response.rs @@ -21,10 +21,11 @@ pub trait FromPacket: Sized { #[derive(Debug)] pub enum ServerResponse { ConnectToPeerResponse(ConnectToPeerResponse), - RoomJoinResponse(RoomJoinResponse), LoginResponse(LoginResponse), PeerAddressResponse(PeerAddressResponse), PrivilegedUsersResponse(PrivilegedUsersResponse), + RoomJoinResponse(RoomJoinResponse), + RoomLeaveResponse(RoomLeaveResponse), RoomListResponse(RoomListResponse), RoomMessageResponse(RoomMessageResponse), UserJoinedRoomResponse(UserJoinedRoomResponse), @@ -46,11 +47,6 @@ impl FromPacket for ServerResponse { try!(ConnectToPeerResponse::from_packet(packet)) ), - CODE_ROOM_JOIN => - ServerResponse::RoomJoinResponse( - try!(RoomJoinResponse::from_packet(packet)) - ), - CODE_LOGIN => ServerResponse::LoginResponse( try!(LoginResponse::from_packet(packet)) @@ -66,6 +62,16 @@ impl FromPacket for ServerResponse { try!(PrivilegedUsersResponse::from_packet(packet)) ), + CODE_ROOM_JOIN => + ServerResponse::RoomJoinResponse( + try!(RoomJoinResponse::from_packet(packet)) + ), + + CODE_ROOM_LEAVE => + ServerResponse::RoomLeaveResponse( + try!(RoomLeaveResponse::from_packet(packet)) + ), + CODE_ROOM_LIST => ServerResponse::RoomListResponse( try!(RoomListResponse::from_packet(packet)) @@ -375,6 +381,23 @@ impl RoomJoinResponse { } } +/*============* + * ROOM LEAVE * + *============*/ + +#[derive(Debug)] +pub struct RoomLeaveResponse { + pub room_name: String, +} + +impl FromPacket for RoomLeaveResponse { + fn from_packet(packet: &mut Packet) -> result::Result { + Ok(RoomLeaveResponse { + room_name: try!(packet.read_str()), + }) + } +} + /*===========* * ROOM LIST * *===========*/