Browse Source

Refactor RoomListResponse parsing.

wip
Titouan Rigoudy 9 years ago
parent
commit
4955bb1840
1 changed files with 42 additions and 25 deletions
  1. +42
    -25
      src/proto/server.rs

+ 42
- 25
src/proto/server.rs View File

@ -183,40 +183,46 @@ pub struct RoomListResponse {
pub rooms: Vec<(String, u32)>,
pub owned_private_rooms: Vec<(String, u32)>,
pub other_private_rooms: Vec<(String, u32)>,
pub operated_private_room_names: Vec<String>,
}
impl RoomListResponse {
fn from_packet(packet: &mut Packet) -> io::Result<Self> {
let rooms = try!(Self::read_rooms(packet));
let mut response = RoomListResponse {
rooms: Vec::new(),
owned_private_rooms: Vec::new(),
other_private_rooms: Vec::new(),
operated_private_room_names: Vec::new(),
};
let (owned_private_rooms, other_private_rooms) =
match Self::read_rooms(packet) {
try!(Self::read_rooms(packet, &mut response.rooms));
Err(e) => {
warn!("Error while parsing RoomListResponse: {}", e);
(Vec::new(), Vec::new())
},
if let Err(e) =
Self::read_rooms(packet, &mut response.owned_private_rooms) {
warn!("Error parsing owned_private_rooms: {}", e);
return Ok(response);
}
Ok(owned_private_rooms) => match Self::read_rooms(packet) {
Err(e) => {
warn!("Error while parsing RoomListResponse: {}", e);
(owned_private_rooms, Vec::new())
},
if let Err(e) =
Self::read_rooms(packet, &mut response.other_private_rooms) {
warn!("Error parsing other_private_rooms: {}", e);
return Ok(response);
}
Ok(other_private_rooms) =>
(owned_private_rooms, other_private_rooms)
},
};
if let Err(e) =
Self::read_room_names(packet,
&mut response.operated_private_room_names)
{
warn!("Error parsing operated_private_rooms: {}", e);
}
Ok(RoomListResponse {
rooms: rooms,
owned_private_rooms: owned_private_rooms,
other_private_rooms: other_private_rooms,
})
Ok(response)
}
fn read_rooms(packet: &mut Packet) -> io::Result<Vec<(String, u32)>> {
let mut rooms = Vec::new();
fn read_rooms(packet: &mut Packet, rooms: &mut Vec<(String, u32)>)
-> io::Result<()>
{
let original_rooms_len = rooms.len();
let num_rooms = try!(packet.read_uint()) as usize;
for _ in 0..num_rooms {
@ -227,7 +233,7 @@ impl RoomListResponse {
let num_user_counts = try!(packet.read_uint()) as usize;
for i in 0..num_user_counts {
let user_count = try!(packet.read_uint());
rooms[i].1 = user_count;
rooms[original_rooms_len+i].1 = user_count;
}
if num_rooms != num_user_counts {
@ -235,7 +241,18 @@ impl RoomListResponse {
num_rooms, num_user_counts);
}
Ok(rooms)
Ok(())
}
fn read_room_names(packet: &mut Packet, room_names: &mut Vec<String>)
-> io::Result<()>
{
let num_rooms = try!(packet.read_uint()) as usize;
for _ in 0..num_rooms {
let room_name = try!(packet.read_str());
room_names.push(room_name);
}
Ok(())
}
}


Loading…
Cancel
Save