Browse Source

Change WriteToPacket signature to use &self.

wip
Titouan Rigoudy 9 years ago
parent
commit
82b4f36da0
4 changed files with 60 additions and 57 deletions
  1. +29
    -26
      src/proto/packet.rs
  2. +27
    -27
      src/proto/server/request.rs
  3. +1
    -1
      src/proto/stream.rs
  4. +3
    -3
      src/user.rs

+ 29
- 26
src/proto/packet.rs View File

@ -81,7 +81,7 @@ impl MutPacket {
} }
/// Provides the main way to write data into a binary packet. /// Provides the main way to write data into a binary packet.
pub fn write_value<T>(&mut self, val: T) -> io::Result<()>
pub fn write_value<T>(&mut self, val: &T) -> io::Result<()>
where T: WriteToPacket where T: WriteToPacket
{ {
val.write_to_packet(self) val.write_to_packet(self)
@ -192,24 +192,21 @@ pub trait ReadFromPacket: Sized {
/// 32-bit integers are serialized in 4 bytes, little-endian. /// 32-bit integers are serialized in 4 bytes, little-endian.
impl ReadFromPacket for u32 { impl ReadFromPacket for u32 {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
packet.read_u32::<LittleEndian>().map_err(PacketReadError::from)
Ok(try!(packet.read_u32::<LittleEndian>()))
} }
} }
/// For convenience, usize's are deserialized as u32's then casted. /// For convenience, usize's are deserialized as u32's then casted.
impl ReadFromPacket for usize { impl ReadFromPacket for usize {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let n: u32 = try!(packet.read_value());
Ok(n as usize)
Ok(try!(u32::read_from_packet(packet)) as usize)
} }
} }
/// Booleans are serialized as single bytes, containing either 0 or 1. /// Booleans are serialized as single bytes, containing either 0 or 1.
impl ReadFromPacket for bool { impl ReadFromPacket for bool {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let mut buffer = vec![0];
try!(packet.read(&mut buffer));
match buffer[0] {
match try!(packet.read_u8()) {
0 => Ok(false), 0 => Ok(false),
1 => Ok(true), 1 => Ok(true),
n => Err(PacketReadError::InvalidBoolError(n)) n => Err(PacketReadError::InvalidBoolError(n))
@ -220,7 +217,7 @@ impl ReadFromPacket for bool {
/// 16-bit integers are serialized as 32-bit integers. /// 16-bit integers are serialized as 32-bit integers.
impl ReadFromPacket for u16 { impl ReadFromPacket for u16 {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let n: u32 = try!(packet.read_value());
let n = try!(u32::read_from_packet(packet));
if n > MAX_PORT { if n > MAX_PORT {
return Err(PacketReadError::InvalidU16Error(n)) return Err(PacketReadError::InvalidU16Error(n))
} }
@ -231,7 +228,7 @@ impl ReadFromPacket for u16 {
/// IPv4 addresses are serialized directly as 32-bit integers. /// IPv4 addresses are serialized directly as 32-bit integers.
impl ReadFromPacket for net::Ipv4Addr { impl ReadFromPacket for net::Ipv4Addr {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let ip: u32 = try!(packet.read_value());
let ip = try!(u32::read_from_packet(packet));
Ok(net::Ipv4Addr::from(ip)) Ok(net::Ipv4Addr::from(ip))
} }
} }
@ -240,9 +237,11 @@ impl ReadFromPacket for net::Ipv4Addr {
/// characters. /// characters.
impl ReadFromPacket for String { impl ReadFromPacket for String {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let len = try!(packet.read_value());
let len = try!(usize::read_from_packet(packet));
let mut buffer = vec![0; len]; let mut buffer = vec![0; len];
try!(packet.read(&mut buffer));
try!(packet.read_exact(&mut buffer));
match ISO_8859_1.decode(&buffer, DecoderTrap::Strict) { match ISO_8859_1.decode(&buffer, DecoderTrap::Strict) {
Ok(string) => Ok(string), Ok(string) => Ok(string),
Err(_) => Err(PacketReadError::InvalidStringError(buffer)) Err(_) => Err(PacketReadError::InvalidStringError(buffer))
@ -253,11 +252,13 @@ impl ReadFromPacket for String {
/// Vectors are serialized as length-prefixed arrays of values. /// Vectors are serialized as length-prefixed arrays of values.
impl<T: ReadFromPacket> ReadFromPacket for Vec<T> { impl<T: ReadFromPacket> ReadFromPacket for Vec<T> {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let len: usize = try!(packet.read_value());
let len = try!(usize::read_from_packet(packet));
let mut vec = Vec::new(); let mut vec = Vec::new();
for _ in 0..len { for _ in 0..len {
vec.push(try!(packet.read_value()));
vec.push(try!(T::read_from_packet(packet)));
} }
Ok(vec) Ok(vec)
} }
} }
@ -269,35 +270,36 @@ impl<T: ReadFromPacket> ReadFromPacket for Vec<T> {
/// This trait is implemented by types that can be serialized to a binary /// This trait is implemented by types that can be serialized to a binary
/// MutPacket. /// MutPacket.
pub trait WriteToPacket { pub trait WriteToPacket {
fn write_to_packet(self, &mut MutPacket) -> io::Result<()>;
fn write_to_packet(&self, &mut MutPacket) -> io::Result<()>;
} }
/// 32-bit integers are serialized in 4 bytes, little-endian. /// 32-bit integers are serialized in 4 bytes, little-endian.
impl WriteToPacket for u32 { impl WriteToPacket for u32 {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
packet.write_u32::<LittleEndian>(self)
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
packet.write_u32::<LittleEndian>(*self)
} }
} }
/// Booleans are serialized as single bytes, containing either 0 or 1. /// Booleans are serialized as single bytes, containing either 0 or 1.
impl WriteToPacket for bool { impl WriteToPacket for bool {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write(&[self as u8]));
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_u8(*self as u8));
Ok(()) Ok(())
} }
} }
/// 16-bit integers are serialized as 32-bit integers. /// 16-bit integers are serialized as 32-bit integers.
impl WriteToPacket for u16 { impl WriteToPacket for u16 {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
(self as u32).write_to_packet(packet)
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
(*self as u32).write_to_packet(packet)
} }
} }
/// Strings are serialized as a length-prefixed array of ISO-8859-1 encoded /// Strings are serialized as a length-prefixed array of ISO-8859-1 encoded
/// characters. /// characters.
impl<'a> WriteToPacket for &'a str {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
impl WriteToPacket for str {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
// Encode the string.
let bytes = match ISO_8859_1.encode(self, EncoderTrap::Strict) { let bytes = match ISO_8859_1.encode(self, EncoderTrap::Strict) {
Ok(bytes) => bytes, Ok(bytes) => bytes,
Err(_) => { Err(_) => {
@ -305,15 +307,16 @@ impl<'a> WriteToPacket for &'a str {
return Err(io::Error::new(io::ErrorKind::Other, copy)) return Err(io::Error::new(io::ErrorKind::Other, copy))
} }
}; };
try!(packet.write_value(bytes.len() as u32));
// Then write the bytes to the packet.
try!((bytes.len() as u32).write_to_packet(packet));
try!(packet.write(&bytes)); try!(packet.write(&bytes));
Ok(()) Ok(())
} }
} }
/// Deref coercion does not happen for trait methods apparently. /// Deref coercion does not happen for trait methods apparently.
impl<'a> WriteToPacket for &'a String {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
packet.write_value::<&'a str>(self)
impl WriteToPacket for String {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
(self as &str).write_to_packet(packet)
} }
} }

+ 27
- 27
src/proto/server/request.rs View File

@ -22,45 +22,45 @@ pub enum ServerRequest {
UserStatusRequest(UserStatusRequest), UserStatusRequest(UserStatusRequest),
} }
impl<'a> WriteToPacket for &'a ServerRequest {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
impl WriteToPacket for ServerRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
match *self { match *self {
ServerRequest::LoginRequest(ref request) => { ServerRequest::LoginRequest(ref request) => {
try!(packet.write_value(CODE_LOGIN));
try!(packet.write_value(&CODE_LOGIN));
try!(packet.write_value(request)); try!(packet.write_value(request));
}, },
ServerRequest::PeerAddressRequest(ref request) => { ServerRequest::PeerAddressRequest(ref request) => {
try!(packet.write_value(CODE_PEER_ADDRESS));
try!(packet.write_value(&CODE_PEER_ADDRESS));
try!(packet.write_value(request)); try!(packet.write_value(request));
}, },
ServerRequest::RoomJoinRequest(ref request) => { ServerRequest::RoomJoinRequest(ref request) => {
try!(packet.write_value(CODE_ROOM_JOIN));
try!(packet.write_value(&CODE_ROOM_JOIN));
try!(packet.write_value(request)); try!(packet.write_value(request));
}, },
ServerRequest::RoomLeaveRequest(ref request) => { ServerRequest::RoomLeaveRequest(ref request) => {
try!(packet.write_value(CODE_ROOM_LEAVE));
try!(packet.write_value(&CODE_ROOM_LEAVE));
try!(packet.write_value(request)); try!(packet.write_value(request));
}, },
ServerRequest::RoomListRequest => { ServerRequest::RoomListRequest => {
try!(packet.write_value(CODE_ROOM_LIST));
try!(packet.write_value(&CODE_ROOM_LIST));
}, },
ServerRequest::RoomMessageRequest(ref request) => { ServerRequest::RoomMessageRequest(ref request) => {
try!(packet.write_value(CODE_ROOM_MESSAGE));
try!(packet.write_value(&CODE_ROOM_MESSAGE));
try!(packet.write_value(request)); try!(packet.write_value(request));
}, },
ServerRequest::SetListenPortRequest(ref request) => { ServerRequest::SetListenPortRequest(ref request) => {
try!(packet.write_value(CODE_SET_LISTEN_PORT));
try!(packet.write_value(&CODE_SET_LISTEN_PORT));
try!(packet.write_value(request)); try!(packet.write_value(request));
}, },
ServerRequest::UserStatusRequest(ref request) => { ServerRequest::UserStatusRequest(ref request) => {
try!(packet.write_value(CODE_USER_STATUS));
try!(packet.write_value(&CODE_USER_STATUS));
try!(packet.write_value(request)); try!(packet.write_value(request));
} }
} }
@ -102,16 +102,16 @@ impl LoginRequest {
} }
} }
impl<'a> WriteToPacket for &'a LoginRequest {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
impl WriteToPacket for LoginRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
let userpass = String::new() + &self.username + &self.password; let userpass = String::new() + &self.username + &self.password;
let userpass_md5 = md5_str(&userpass); let userpass_md5 = md5_str(&userpass);
try!(packet.write_value(&self.username)); try!(packet.write_value(&self.username));
try!(packet.write_value(&self.password)); try!(packet.write_value(&self.password));
try!(packet.write_value(self.major));
try!(packet.write_value(&self.major));
try!(packet.write_value(&userpass_md5)); try!(packet.write_value(&userpass_md5));
try!(packet.write_value(self.minor));
try!(packet.write_value(&self.minor));
Ok(()) Ok(())
} }
@ -126,8 +126,8 @@ pub struct PeerAddressRequest {
pub username: String, pub username: String,
} }
impl<'a> WriteToPacket for &'a PeerAddressRequest {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
impl WriteToPacket for PeerAddressRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.username)); try!(packet.write_value(&self.username));
Ok(()) Ok(())
} }
@ -142,8 +142,8 @@ pub struct RoomJoinRequest {
pub room_name: String pub room_name: String
} }
impl<'a> WriteToPacket for &'a RoomJoinRequest {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
impl WriteToPacket for RoomJoinRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.room_name)); try!(packet.write_value(&self.room_name));
Ok(()) Ok(())
} }
@ -158,8 +158,8 @@ pub struct RoomLeaveRequest {
pub room_name: String pub room_name: String
} }
impl<'a> WriteToPacket for &'a RoomLeaveRequest {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
impl WriteToPacket for RoomLeaveRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.room_name)); try!(packet.write_value(&self.room_name));
Ok(()) Ok(())
} }
@ -175,8 +175,8 @@ pub struct RoomMessageRequest {
pub message: String, pub message: String,
} }
impl<'a> WriteToPacket for &'a RoomMessageRequest {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
impl WriteToPacket for RoomMessageRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.room_name)); try!(packet.write_value(&self.room_name));
try!(packet.write_value(&self.message)); try!(packet.write_value(&self.message));
Ok(()) Ok(())
@ -192,9 +192,9 @@ pub struct SetListenPortRequest {
pub port: u16, pub port: u16,
} }
impl<'a> WriteToPacket for &'a SetListenPortRequest {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(self.port));
impl WriteToPacket for SetListenPortRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.port));
Ok(()) Ok(())
} }
} }
@ -208,8 +208,8 @@ pub struct UserStatusRequest {
pub user_name: String, pub user_name: String,
} }
impl<'a> WriteToPacket for &'a UserStatusRequest {
fn write_to_packet(self, packet: &mut MutPacket) -> io::Result<()> {
impl WriteToPacket for UserStatusRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.user_name)); try!(packet.write_value(&self.user_name));
Ok(()) Ok(())
} }


+ 1
- 1
src/proto/stream.rs View File

@ -277,7 +277,7 @@ impl<T, U> Stream<T, U>
} }
/// The stream has been notified. /// The stream has been notified.
pub fn on_notify<V>(&mut self, payload: V) -> Intent
pub fn on_notify<V>(&mut self, payload: &V) -> Intent
where V: WriteToPacket where V: WriteToPacket
{ {
let mut packet = MutPacket::new(); let mut packet = MutPacket::new();


+ 3
- 3
src/user.rs View File

@ -36,14 +36,14 @@ impl proto::ReadFromPacket for Status {
} }
} }
impl<'a> proto::WriteToPacket for &'a Status {
fn write_to_packet(self, packet: &mut proto::MutPacket) -> io::Result<()> {
impl proto::WriteToPacket for Status {
fn write_to_packet(&self, packet: &mut proto::MutPacket) -> io::Result<()> {
let n = match *self { let n = match *self {
Status::Offline => STATUS_OFFLINE, Status::Offline => STATUS_OFFLINE,
Status::Away => STATUS_AWAY, Status::Away => STATUS_AWAY,
Status::Online => STATUS_ONLINE, Status::Online => STATUS_ONLINE,
}; };
try!(packet.write_value(n));
try!(packet.write_value(&n));
Ok(()) Ok(())
} }
} }


Loading…
Cancel
Save