diff --git a/src/proto/server/response.rs b/src/proto/server/response.rs index bf939ee..6953ecb 100644 --- a/src/proto/server/response.rs +++ b/src/proto/server/response.rs @@ -14,6 +14,7 @@ const MAX_PORT: u32 = (1 << 16) - 1; pub enum ServerResponse { LoginResponse(LoginResponse), ConnectToPeerResponse(ConnectToPeerResponse), + PeerAddressResponse(PeerAddressResponse), PrivilegedUsersResponse(PrivilegedUsersResponse), RoomListResponse(RoomListResponse), WishlistIntervalResponse(WishlistIntervalResponse), @@ -39,6 +40,11 @@ impl ServerResponse { try!(LoginResponse::from_packet(&mut packet)) ), + CODE_PEER_ADDRESS => + ServerResponse::PeerAddressResponse( + try!(PeerAddressResponse::from_packet(&mut packet)) + ), + CODE_PRIVILEGED_USERS => ServerResponse::PrivilegedUsersResponse( try!(PrivilegedUsersResponse::from_packet(&mut packet)) @@ -192,6 +198,34 @@ impl ParentSpeedRatioResponse { } } +/*==============* + * PEER ADDRESS * + *==============*/ + +#[derive(Debug)] +pub struct PeerAddressResponse { + username: String, + ip: net::Ipv4Addr, + port: u16, +} + +impl PeerAddressResponse { + fn from_packet(packet: &mut Packet) -> io::Result { + let username = try!(packet.read_str()); + let ip = net::Ipv4Addr::from(try!(packet.read_uint())); + let port = try!(packet.read_uint()); + if port > MAX_PORT { + return Err( + io::Error::new(io::ErrorKind::Other, "Invalid port number")); + } + Ok(PeerAddressResponse { + username: username, + ip: ip, + port: port as u16, + }) + } +} + /*==================* * PRIVILEGED USERS * *==================*/