From d2194a76758c47fc91766a9b4f3bb5f56cea3e67 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Tue, 15 Mar 2016 15:04:50 +0100 Subject: [PATCH] Initial support of controller JoinRoomRequest. --- src/client.rs | 9 +++++++++ src/control/request.rs | 1 + src/proto/server/constants.rs | 1 + src/proto/server/request.rs | 20 +++++++++++++++++++ src/proto/server/response.rs | 37 ++++++++++++++++++++++++++++++++++- 5 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/client.rs b/src/client.rs index 77ddbbe..5619a35 100644 --- a/src/client.rs +++ b/src/client.rs @@ -104,6 +104,9 @@ impl Client { control::Request::RoomListRequest => self.handle_room_list_request(), + control::Request::JoinRoomRequest(room_name) => + self.handle_join_room_request(room_name), + /* _ =>{ error!("Unhandled control request: {:?}", request); @@ -112,6 +115,12 @@ impl Client { } } + fn handle_join_room_request(&mut self, room_name: String) { + let request = JoinRoomRequest { room_name: room_name }; + self.proto_tx.send(Request::ServerRequest( + ServerRequest::JoinRoomRequest(request))); + } + fn handle_login_status_request(&mut self) { let username = config::USERNAME.to_string(); diff --git a/src/control/request.rs b/src/control/request.rs index 885a175..c12ed84 100644 --- a/src/control/request.rs +++ b/src/control/request.rs @@ -1,5 +1,6 @@ #[derive(Debug, RustcDecodable, RustcEncodable)] pub enum Request { + JoinRoomRequest(String), LoginStatusRequest, RoomListRequest, } diff --git a/src/proto/server/constants.rs b/src/proto/server/constants.rs index fbcd57b..60ada70 100644 --- a/src/proto/server/constants.rs +++ b/src/proto/server/constants.rs @@ -1,6 +1,7 @@ pub const CODE_LOGIN: u32 = 1; pub const CODE_SET_LISTEN_PORT: u32 = 2; pub const CODE_PEER_ADDRESS: u32 = 3; +pub const CODE_JOIN_ROOM: u32 = 14; pub const CODE_CONNECT_TO_PEER: u32 = 18; pub const CODE_ROOM_LIST: u32 = 64; pub const CODE_PRIVILEGED_USERS: u32 = 69; diff --git a/src/proto/server/request.rs b/src/proto/server/request.rs index 989b2a3..1cf25be 100644 --- a/src/proto/server/request.rs +++ b/src/proto/server/request.rs @@ -16,6 +16,7 @@ trait WriteToPacket { #[derive(Debug)] pub enum ServerRequest { + JoinRoomRequest(JoinRoomRequest), LoginRequest(LoginRequest), PeerAddressRequest(PeerAddressRequest), RoomListRequest(RoomListRequest), @@ -25,6 +26,9 @@ pub enum ServerRequest { impl ServerRequest { pub fn to_packet(&self) -> io::Result { let (mut packet, request): (Packet, &WriteToPacket) = match *self { + ServerRequest::JoinRoomRequest(ref request) => + (Packet::new(CODE_JOIN_ROOM), request), + ServerRequest::LoginRequest(ref request) => (Packet::new(CODE_LOGIN), request), @@ -48,6 +52,22 @@ fn md5_str(string: &str) -> String { hasher.result_str() } +/*===========* + * JOIN ROOM * + *===========*/ + +#[derive(Debug)] +pub struct JoinRoomRequest { + pub room_name: String +} + +impl WriteToPacket for JoinRoomRequest { + fn write_to_packet(&self, packet: &mut Packet) -> io::Result<()> { + try!(packet.write_str(&self.room_name)); + Ok(()) + } +} + /*=======* * LOGIN * *=======*/ diff --git a/src/proto/server/response.rs b/src/proto/server/response.rs index 66f4542..6e4b8dd 100644 --- a/src/proto/server/response.rs +++ b/src/proto/server/response.rs @@ -10,8 +10,9 @@ use super::super::packet::Packet; #[derive(Debug)] pub enum ServerResponse { - LoginResponse(LoginResponse), ConnectToPeerResponse(ConnectToPeerResponse), + JoinRoomResponse(JoinRoomResponse), + LoginResponse(LoginResponse), PeerAddressResponse(PeerAddressResponse), PrivilegedUsersResponse(PrivilegedUsersResponse), RoomListResponse(RoomListResponse), @@ -33,6 +34,11 @@ impl ServerResponse { try!(ConnectToPeerResponse::from_packet(&mut packet)) ), + CODE_JOIN_ROOM => + ServerResponse::JoinRoomResponse( + try!(JoinRoomResponse::from_packet(&mut packet)) + ), + CODE_LOGIN => ServerResponse::LoginResponse( try!(LoginResponse::from_packet(&mut packet)) @@ -115,6 +121,35 @@ impl ConnectToPeerResponse { } } +/*===========* + * JOIN ROOM * + *===========*/ + +#[derive(Debug)] +pub struct JoinRoomResponse { + room_name: String, + user_names: Vec, + user_statuses: Vec, +} + +impl JoinRoomResponse { + pub fn from_packet(packet: &mut Packet) -> io::Result { + let room_name = try!(packet.read_str()); + + let mut user_names = Vec::new(); + try!(packet.read_array(&mut user_names, Packet::read_str)); + + let mut user_statuses = Vec::new(); + try!(packet.read_array(&mut user_statuses, Packet::read_uint)); + + Ok(JoinRoomResponse { + room_name: room_name, + user_names: user_names, + user_statuses: user_statuses, + }) + } +} + /*=======* * LOGIN * *=======*/