Browse Source

Add RoomLeaveResponse/Request, unhandled as yet.

wip
Titouan Rigoudy 9 years ago
parent
commit
65c437a022
5 changed files with 99 additions and 47 deletions
  1. +1
    -0
      TODO.md
  2. +28
    -21
      src/client.rs
  3. +1
    -0
      src/proto/server/constants.rs
  4. +40
    -20
      src/proto/server/request.rs
  5. +29
    -6
      src/proto/server/response.rs

+ 1
- 0
TODO.md View File

@ -1,5 +1,6 @@
Things to do:
-------------
- Handle RoomLeaveRequest/Response.
- Print out surplus bytes in hex to make analyzing them easier
- Handle client connections

+ 28
- 21
src/client.rs View File

@ -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);


+ 1
- 0
src/proto/server/constants.rs View File

@ -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;


+ 40
- 20
src/proto/server/request.rs View File

@ -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<Packet> {
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 *
*==============*/


+ 29
- 6
src/proto/server/response.rs View File

@ -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<Self> {
Ok(RoomLeaveResponse {
room_name: try!(packet.read_str()),
})
}
}
/*===========*
* ROOM LIST *
*===========*/


Loading…
Cancel
Save