diff --git a/src/proto/server.rs b/src/proto/server.rs index 6c9a53a..26dceb7 100644 --- a/src/proto/server.rs +++ b/src/proto/server.rs @@ -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, } impl RoomListResponse { fn from_packet(packet: &mut Packet) -> io::Result { - 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> { - 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) + -> 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(()) } }