Browse Source

Set 80-char line width.

wip
Titouan Rigoudy 5 years ago
parent
commit
83620698fd
21 changed files with 709 additions and 230 deletions
  1. +1
    -0
      rustfmt.toml
  2. +109
    -41
      src/client.rs
  3. +12
    -4
      src/control/ws.rs
  4. +26
    -12
      src/dispatcher.rs
  5. +2
    -1
      src/executor.rs
  6. +5
    -1
      src/handlers/login_handler.rs
  7. +5
    -1
      src/handlers/set_privileged_users_handler.rs
  8. +10
    -5
      src/main.rs
  9. +15
    -5
      src/proto/codec.rs
  10. +20
    -6
      src/proto/handler.rs
  11. +2
    -2
      src/proto/mod.rs
  12. +14
    -5
      src/proto/packet.rs
  13. +20
    -7
      src/proto/peer/message.rs
  14. +81
    -24
      src/proto/server/request.rs
  15. +218
    -66
      src/proto/server/response.rs
  16. +2
    -1
      src/proto/stream.rs
  17. +5
    -3
      src/proto/testing.rs
  18. +24
    -6
      src/proto/user.rs
  19. +89
    -25
      src/proto/value_codec.rs
  20. +43
    -13
      src/room.rs
  21. +6
    -2
      src/user.rs

+ 1
- 0
rustfmt.toml View File

@ -0,0 +1 @@
max_width = 80

+ 109
- 41
src/client.rs View File

@ -114,7 +114,9 @@ impl Client {
loop { loop {
match self.recv() { match self.recv() {
IncomingMessage::Proto(response) => self.handle_proto_response(response),
IncomingMessage::Proto(response) => {
self.handle_proto_response(response)
}
IncomingMessage::ControlNotification(notif) => { IncomingMessage::ControlNotification(notif) => {
self.handle_control_notification(notif) self.handle_control_notification(notif)
@ -186,7 +188,9 @@ impl Client {
self.control_tx = None; self.control_tx = None;
} }
control::Notification::Request(req) => self.handle_control_request(req),
control::Notification::Request(req) => {
self.handle_control_request(req)
}
} }
} }
@ -196,7 +200,9 @@ impl Client {
fn handle_control_request(&mut self, request: control::Request) { fn handle_control_request(&mut self, request: control::Request) {
match request { match request {
control::Request::LoginStatusRequest => self.handle_login_status_request(),
control::Request::LoginStatusRequest => {
self.handle_login_status_request()
}
control::Request::RoomJoinRequest(room_name) => { control::Request::RoomJoinRequest(room_name) => {
self.handle_room_join_request(room_name) self.handle_room_join_request(room_name)
@ -206,13 +212,17 @@ impl Client {
self.handle_room_leave_request(room_name) self.handle_room_leave_request(room_name)
} }
control::Request::RoomListRequest => self.handle_room_list_request(),
control::Request::RoomListRequest => {
self.handle_room_list_request()
}
control::Request::RoomMessageRequest(request) => { control::Request::RoomMessageRequest(request) => {
self.handle_room_message_request(request) self.handle_room_message_request(request)
} }
control::Request::UserListRequest => self.handle_user_list_request(),
control::Request::UserListRequest => {
self.handle_user_list_request()
}
/* /*
_ =>{ _ =>{
error!("Unhandled control request: {:?}", request); error!("Unhandled control request: {:?}", request);
@ -225,22 +235,30 @@ impl Client {
let username = config::USERNAME.to_string(); let username = config::USERNAME.to_string();
let response = match self.login_status { let response = match self.login_status {
LoginStatus::Todo => control::LoginStatusResponse::Pending { username: username },
LoginStatus::Todo => {
control::LoginStatusResponse::Pending { username: username }
}
LoginStatus::AwaitingResponse => { LoginStatus::AwaitingResponse => {
control::LoginStatusResponse::Pending { username: username } control::LoginStatusResponse::Pending { username: username }
} }
LoginStatus::Success(ref motd) => control::LoginStatusResponse::Success {
username: username,
motd: motd.clone(),
},
LoginStatus::Success(ref motd) => {
control::LoginStatusResponse::Success {
username: username,
motd: motd.clone(),
}
}
LoginStatus::Failure(ref reason) => control::LoginStatusResponse::Failure {
username: username,
reason: reason.clone(),
},
LoginStatus::Failure(ref reason) => {
control::LoginStatusResponse::Failure {
username: username,
reason: reason.clone(),
}
}
}; };
self.send_to_controller(control::Response::LoginStatusResponse(response));
self.send_to_controller(control::Response::LoginStatusResponse(
response,
));
} }
fn handle_room_join_request(&mut self, room_name: String) { fn handle_room_join_request(&mut self, room_name: String) {
@ -284,7 +302,10 @@ impl Client {
self.send_to_server(server::ServerRequest::RoomListRequest); self.send_to_server(server::ServerRequest::RoomListRequest);
} }
fn handle_room_message_request(&mut self, request: control::RoomMessageRequest) {
fn handle_room_message_request(
&mut self,
request: control::RoomMessageRequest,
) {
self.send_to_server(server::ServerRequest::RoomMessageRequest( self.send_to_server(server::ServerRequest::RoomMessageRequest(
server::RoomMessageRequest { server::RoomMessageRequest {
room_name: request.room_name, room_name: request.room_name,
@ -363,11 +384,13 @@ impl Client {
#[allow(deprecated)] #[allow(deprecated)]
self.proto_tx self.proto_tx
.send(proto::Request::ServerRequest( .send(proto::Request::ServerRequest(
server::ServerRequest::ConnectToPeerRequest(server::ConnectToPeerRequest {
token: peer.token,
user_name: peer.user_name.clone(),
connection_type: peer.connection_type.clone(),
}),
server::ServerRequest::ConnectToPeerRequest(
server::ConnectToPeerRequest {
token: peer.token,
user_name: peer.user_name.clone(),
connection_type: peer.connection_type.clone(),
},
),
)) ))
.unwrap(); .unwrap();
} }
@ -382,10 +405,12 @@ impl Client {
#[allow(deprecated)] #[allow(deprecated)]
self.proto_tx self.proto_tx
.send(proto::Request::ServerRequest( .send(proto::Request::ServerRequest(
server::ServerRequest::CannotConnectRequest(server::CannotConnectRequest {
token: peer.token,
user_name: peer.user_name,
}),
server::ServerRequest::CannotConnectRequest(
server::CannotConnectRequest {
token: peer.token,
user_name: peer.user_name,
},
),
)) ))
.unwrap(); .unwrap();
} }
@ -407,7 +432,10 @@ impl Client {
.. ..
}, },
) => { ) => {
error!("Peer connection {} was already open: {:?}", peer_id, peer);
error!(
"Peer connection {} was already open: {:?}",
peer_id, peer
);
return; return;
} }
@ -471,7 +499,9 @@ impl Client {
self.handle_connect_to_peer_response(response) self.handle_connect_to_peer_response(response)
} }
server::ServerResponse::LoginResponse(response) => self.handle_login_response(response),
server::ServerResponse::LoginResponse(response) => {
self.handle_login_response(response)
}
server::ServerResponse::PrivilegedUsersResponse(response) => { server::ServerResponse::PrivilegedUsersResponse(response) => {
self.handle_privileged_users_response(response) self.handle_privileged_users_response(response)
@ -521,7 +551,10 @@ impl Client {
} }
} }
fn handle_connect_to_peer_response(&mut self, response: server::ConnectToPeerResponse) {
fn handle_connect_to_peer_response(
&mut self,
response: server::ConnectToPeerResponse,
) {
let peer = Peer { let peer = Peer {
user_name: response.user_name, user_name: response.user_name,
ip: response.ip, ip: response.ip,
@ -596,11 +629,17 @@ impl Client {
} }
} }
fn handle_privileged_users_response(&mut self, response: server::PrivilegedUsersResponse) {
fn handle_privileged_users_response(
&mut self,
response: server::PrivilegedUsersResponse,
) {
self.users.set_all_privileged(response.users); self.users.set_all_privileged(response.users);
} }
fn handle_room_join_response(&mut self, mut response: server::RoomJoinResponse) {
fn handle_room_join_response(
&mut self,
mut response: server::RoomJoinResponse,
) {
// Join the room and store the received information. // Join the room and store the received information.
let result = self.rooms.join( let result = self.rooms.join(
&response.room_name, &response.room_name,
@ -621,10 +660,15 @@ impl Client {
let control_response = control::RoomJoinResponse { let control_response = control::RoomJoinResponse {
room_name: response.room_name, room_name: response.room_name,
}; };
self.send_to_controller(control::Response::RoomJoinResponse(control_response));
self.send_to_controller(control::Response::RoomJoinResponse(
control_response,
));
} }
fn handle_room_leave_response(&mut self, response: server::RoomLeaveResponse) {
fn handle_room_leave_response(
&mut self,
response: server::RoomLeaveResponse,
) {
if let Err(err) = self.rooms.leave(&response.room_name) { if let Err(err) = self.rooms.leave(&response.room_name) {
error!("RoomLeaveResponse: {}", err); error!("RoomLeaveResponse: {}", err);
} }
@ -636,7 +680,10 @@ impl Client {
)); ));
} }
fn handle_room_list_response(&mut self, response: server::RoomListResponse) {
fn handle_room_list_response(
&mut self,
response: server::RoomListResponse,
) {
// Update the room map in memory. // Update the room map in memory.
self.rooms.set_room_list(response); self.rooms.set_room_list(response);
// Send the updated version to the controller. // Send the updated version to the controller.
@ -646,7 +693,10 @@ impl Client {
)); ));
} }
fn handle_room_message_response(&mut self, response: server::RoomMessageResponse) {
fn handle_room_message_response(
&mut self,
response: server::RoomMessageResponse,
) {
let result = self.rooms.add_message( let result = self.rooms.add_message(
&response.room_name, &response.room_name,
room::Message { room::Message {
@ -668,7 +718,10 @@ impl Client {
)); ));
} }
fn handle_room_tickers_response(&mut self, response: server::RoomTickersResponse) {
fn handle_room_tickers_response(
&mut self,
response: server::RoomTickersResponse,
) {
let result = self let result = self
.rooms .rooms
.set_tickers(&response.room_name, response.tickers); .set_tickers(&response.room_name, response.tickers);
@ -677,7 +730,10 @@ impl Client {
} }
} }
fn handle_room_user_joined_response(&mut self, response: server::RoomUserJoinedResponse) {
fn handle_room_user_joined_response(
&mut self,
response: server::RoomUserJoinedResponse,
) {
let result = self let result = self
.rooms .rooms
.insert_member(&response.room_name, response.user.name.clone()); .insert_member(&response.room_name, response.user.name.clone());
@ -693,7 +749,10 @@ impl Client {
)); ));
} }
fn handle_room_user_left_response(&mut self, response: server::RoomUserLeftResponse) {
fn handle_room_user_left_response(
&mut self,
response: server::RoomUserLeftResponse,
) {
let result = self let result = self
.rooms .rooms
.remove_member(&response.room_name, &response.user_name); .remove_member(&response.room_name, &response.user_name);
@ -709,7 +768,10 @@ impl Client {
)); ));
} }
fn handle_user_info_response(&mut self, response: server::UserInfoResponse) {
fn handle_user_info_response(
&mut self,
response: server::UserInfoResponse,
) {
let c_response = match self.users.get_mut_strict(&response.user_name) { let c_response = match self.users.get_mut_strict(&response.user_name) {
Ok(user) => { Ok(user) => {
user.average_speed = response.average_speed; user.average_speed = response.average_speed;
@ -726,11 +788,17 @@ impl Client {
return; return;
} }
}; };
self.send_to_controller(control::Response::UserInfoResponse(c_response));
self.send_to_controller(control::Response::UserInfoResponse(
c_response,
));
} }
fn handle_user_status_response(&mut self, response: server::UserStatusResponse) {
let result = self.users.set_status(&response.user_name, response.status);
fn handle_user_status_response(
&mut self,
response: server::UserStatusResponse,
) {
let result =
self.users.set_status(&response.user_name, response.status);
if let Err(err) = result { if let Err(err) = result {
error!("UserStatusResponse: {}", err); error!("UserStatusResponse: {}", err);
return; return;


+ 12
- 4
src/control/ws.rs View File

@ -37,8 +37,12 @@ pub enum SendError {
impl fmt::Display for SendError { impl fmt::Display for SendError {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match *self { match *self {
SendError::JSONEncoderError(ref err) => write!(fmt, "JSONEncoderError: {}", err),
SendError::WebSocketError(ref err) => write!(fmt, "WebSocketError: {}", err),
SendError::JSONEncoderError(ref err) => {
write!(fmt, "JSONEncoderError: {}", err)
}
SendError::WebSocketError(ref err) => {
write!(fmt, "WebSocketError: {}", err)
}
} }
} }
} }
@ -141,7 +145,10 @@ impl ws::Handler for Handler {
Ok(control_request) => control_request, Ok(control_request) => control_request,
Err(e) => { Err(e) => {
error!("Received invalid JSON message from controller: {}", e); error!("Received invalid JSON message from controller: {}", e);
return Err(ws::Error::new(ws::ErrorKind::Protocol, "Invalid JSON"));
return Err(ws::Error::new(
ws::ErrorKind::Protocol,
"Invalid JSON",
));
} }
}; };
@ -179,7 +186,8 @@ pub fn listen(client_tx: crossbeam_channel::Sender<Notification>) {
} }
}; };
let listen_result = websocket.listen((config::CONTROL_HOST, config::CONTROL_PORT));
let listen_result =
websocket.listen((config::CONTROL_HOST, config::CONTROL_PORT));
match listen_result { match listen_result {
Ok(_) => (), Ok(_) => (),


+ 26
- 12
src/dispatcher.rs View File

@ -56,12 +56,18 @@ impl Dispatcher {
/// Dispatches the given message by wrapping it with a handler. /// Dispatches the given message by wrapping it with a handler.
pub fn dispatch(&self, message: Message) -> Box<dyn Job> { pub fn dispatch(&self, message: Message) -> Box<dyn Job> {
match message { match message {
Message::ServerResponse(ServerResponse::LoginResponse(response)) => {
Box::new(DispatchedMessage::new(response, LoginHandler::default()))
}
Message::ServerResponse(ServerResponse::PrivilegedUsersResponse(response)) => Box::new(
DispatchedMessage::new(response, SetPrivilegedUsersHandler::default()),
),
Message::ServerResponse(ServerResponse::LoginResponse(
response,
)) => Box::new(DispatchedMessage::new(
response,
LoginHandler::default(),
)),
Message::ServerResponse(
ServerResponse::PrivilegedUsersResponse(response),
) => Box::new(DispatchedMessage::new(
response,
SetPrivilegedUsersHandler::default(),
)),
_ => panic!("Unimplemented"), _ => panic!("Unimplemented"),
} }
} }
@ -76,18 +82,26 @@ mod tests {
#[test] #[test]
fn dispatcher_privileged_users_response() { fn dispatcher_privileged_users_response() {
Dispatcher::new().dispatch(Message::ServerResponse( Dispatcher::new().dispatch(Message::ServerResponse(
server::ServerResponse::PrivilegedUsersResponse(server::PrivilegedUsersResponse {
users: vec!["foo".to_string(), "bar".to_string(), "baz".to_string()],
}),
server::ServerResponse::PrivilegedUsersResponse(
server::PrivilegedUsersResponse {
users: vec![
"foo".to_string(),
"bar".to_string(),
"baz".to_string(),
],
},
),
)); ));
} }
#[test] #[test]
fn dispatcher_login_response() { fn dispatcher_login_response() {
Dispatcher::new().dispatch(Message::ServerResponse( Dispatcher::new().dispatch(Message::ServerResponse(
server::ServerResponse::LoginResponse(server::LoginResponse::LoginFail {
reason: "bleep bloop".to_string(),
}),
server::ServerResponse::LoginResponse(
server::LoginResponse::LoginFail {
reason: "bleep bloop".to_string(),
},
),
)); ));
} }
} }

+ 2
- 1
src/executor.rs View File

@ -136,7 +136,8 @@ mod tests {
let context = executor.join(); let context = executor.join();
let expected_users = vec![(user1.name.clone(), user1), (user2.name.clone(), user2)];
let expected_users =
vec![(user1.name.clone(), user1), (user2.name.clone(), user2)];
let mut users = context.users.lock().get_list(); let mut users = context.users.lock().get_list();
users.sort(); users.sort();


+ 5
- 1
src/handlers/login_handler.rs View File

@ -9,7 +9,11 @@ use crate::proto::server::LoginResponse;
pub struct LoginHandler; pub struct LoginHandler;
impl MessageHandler<LoginResponse> for LoginHandler { impl MessageHandler<LoginResponse> for LoginHandler {
fn run(self, context: &Context, _message: &LoginResponse) -> io::Result<()> {
fn run(
self,
context: &Context,
_message: &LoginResponse,
) -> io::Result<()> {
let lock = context.login.lock(); let lock = context.login.lock();
match *lock { match *lock {


+ 5
- 1
src/handlers/set_privileged_users_handler.rs View File

@ -8,7 +8,11 @@ use crate::proto::server::PrivilegedUsersResponse;
pub struct SetPrivilegedUsersHandler; pub struct SetPrivilegedUsersHandler;
impl MessageHandler<PrivilegedUsersResponse> for SetPrivilegedUsersHandler { impl MessageHandler<PrivilegedUsersResponse> for SetPrivilegedUsersHandler {
fn run(self, context: &Context, message: &PrivilegedUsersResponse) -> io::Result<()> {
fn run(
self,
context: &Context,
message: &PrivilegedUsersResponse,
) -> io::Result<()> {
let users = message.users.clone(); let users = message.users.clone();
context.users.lock().set_all_privileged(users); context.users.lock().set_all_privileged(users);
Ok(()) Ok(())


+ 10
- 5
src/main.rs View File

@ -29,7 +29,8 @@ fn main() {
} }
}; };
let (proto_to_client_tx, proto_to_client_rx) = crossbeam_channel::unbounded();
let (proto_to_client_tx, proto_to_client_rx) =
crossbeam_channel::unbounded();
let mut proto_agent = match proto::Agent::new(proto_to_client_tx) { let mut proto_agent = match proto::Agent::new(proto_to_client_tx) {
Ok(agent) => agent, Ok(agent) => agent,
@ -40,10 +41,14 @@ fn main() {
}; };
let client_to_proto_tx = proto_agent.channel(); let client_to_proto_tx = proto_agent.channel();
let (control_to_client_tx, control_to_client_rx) = crossbeam_channel::unbounded();
let mut client =
client::Client::new(client_to_proto_tx, proto_to_client_rx, control_to_client_rx);
let (control_to_client_tx, control_to_client_rx) =
crossbeam_channel::unbounded();
let mut client = client::Client::new(
client_to_proto_tx,
proto_to_client_rx,
control_to_client_rx,
);
thread::spawn(move || control::listen(control_to_client_tx)); thread::spawn(move || control::listen(control_to_client_tx));
thread::spawn(move || proto_agent.run().unwrap()); thread::spawn(move || proto_agent.run().unwrap());


+ 15
- 5
src/proto/codec.rs View File

@ -12,7 +12,8 @@ use thiserror::Error;
use super::prefix::Prefixer; use super::prefix::Prefixer;
use super::u32::{decode_u32, U32_BYTE_LEN}; use super::u32::{decode_u32, U32_BYTE_LEN};
use super::value_codec::{ use super::value_codec::{
ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError, ValueEncoder,
ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError,
ValueEncoder,
}; };
#[derive(Debug, Error, PartialEq)] #[derive(Debug, Error, PartialEq)]
@ -45,7 +46,11 @@ impl<T: ValueEncode + ?Sized> FrameEncoder<T> {
} }
} }
pub fn encode_to(&mut self, value: &T, buffer: &mut BytesMut) -> Result<(), FrameEncodeError> {
pub fn encode_to(
&mut self,
value: &T,
buffer: &mut BytesMut,
) -> Result<(), FrameEncodeError> {
let mut prefixer = Prefixer::new(buffer); let mut prefixer = Prefixer::new(buffer);
ValueEncoder::new(prefixer.suffix_mut()).encode(value)?; ValueEncoder::new(prefixer.suffix_mut()).encode(value)?;
@ -83,7 +88,10 @@ impl<T: ValueDecode> FrameDecoder<T> {
/// ///
/// Returns an error if the length prefix or the framed value are malformed, /// Returns an error if the length prefix or the framed value are malformed,
/// in which case `bytes` is untouched. /// in which case `bytes` is untouched.
pub fn decode_from(&mut self, bytes: &mut BytesMut) -> Result<Option<T>, ValueDecodeError> {
pub fn decode_from(
&mut self,
bytes: &mut BytesMut,
) -> Result<Option<T>, ValueDecodeError> {
if bytes.len() < U32_BYTE_LEN { if bytes.len() < U32_BYTE_LEN {
return Ok(None); // Not enough bytes yet. return Ok(None); // Not enough bytes yet.
} }
@ -205,7 +213,8 @@ mod tests {
let mut bytes = BytesMut::new(); let mut bytes = BytesMut::new();
bytes.extend_from_slice(&initial_bytes); bytes.extend_from_slice(&initial_bytes);
let value: Option<u32> = FrameDecoder::new().decode_from(&mut bytes).unwrap();
let value: Option<u32> =
FrameDecoder::new().decode_from(&mut bytes).unwrap();
assert_eq!(value, None); assert_eq!(value, None);
assert_eq!(bytes, initial_bytes); // Untouched. assert_eq!(bytes, initial_bytes); // Untouched.
@ -221,7 +230,8 @@ mod tests {
let mut bytes = BytesMut::new(); let mut bytes = BytesMut::new();
bytes.extend_from_slice(&initial_bytes); bytes.extend_from_slice(&initial_bytes);
let value: Option<u32> = FrameDecoder::new().decode_from(&mut bytes).unwrap();
let value: Option<u32> =
FrameDecoder::new().decode_from(&mut bytes).unwrap();
assert_eq!(value, None); assert_eq!(value, None);
assert_eq!(bytes, initial_bytes); // Untouched. assert_eq!(bytes, initial_bytes); // Untouched.


+ 20
- 6
src/proto/handler.rs View File

@ -123,11 +123,13 @@ impl Handler {
) -> io::Result<Self> { ) -> io::Result<Self> {
let host = config::SERVER_HOST; let host = config::SERVER_HOST;
let port = config::SERVER_PORT; let port = config::SERVER_PORT;
let server_stream = Stream::new((host, port), ServerResponseSender(client_tx.clone()))?;
let server_stream =
Stream::new((host, port), ServerResponseSender(client_tx.clone()))?;
info!("Connected to server at {}:{}", host, port); info!("Connected to server at {}:{}", host, port);
let listener = listener_bind((config::LISTEN_HOST, config::LISTEN_PORT))?;
let listener =
listener_bind((config::LISTEN_HOST, config::LISTEN_PORT))?;
info!( info!(
"Listening for connections on {}:{}", "Listening for connections on {}:{}",
config::LISTEN_HOST, config::LISTEN_HOST,
@ -311,10 +313,16 @@ impl mio::deprecated::Handler for Handler {
} }
} }
fn notify(&mut self, event_loop: &mut mio::deprecated::EventLoop<Self>, request: Request) {
fn notify(
&mut self,
event_loop: &mut mio::deprecated::EventLoop<Self>,
request: Request,
) {
match request { match request {
Request::PeerConnect(peer_id, ip, port) => { Request::PeerConnect(peer_id, ip, port) => {
if let Err(err) = self.connect_to_peer(peer_id, ip, port, event_loop) {
if let Err(err) =
self.connect_to_peer(peer_id, ip, port, event_loop)
{
error!( error!(
"Cannot open peer connection {} to {}:{}: {}", "Cannot open peer connection {} to {}:{}: {}",
peer_id, ip, port, err peer_id, ip, port, err
@ -336,7 +344,11 @@ impl mio::deprecated::Handler for Handler {
return; return;
} }
}; };
self.process_peer_intent(intent, mio::Token(peer_id), event_loop);
self.process_peer_intent(
intent,
mio::Token(peer_id),
event_loop,
);
} }
Request::ServerRequest(server_request) => { Request::ServerRequest(server_request) => {
@ -357,7 +369,9 @@ pub struct Agent {
} }
impl Agent { impl Agent {
pub fn new(client_tx: crossbeam_channel::Sender<Response>) -> io::Result<Self> {
pub fn new(
client_tx: crossbeam_channel::Sender<Response>,
) -> io::Result<Self> {
// Create the event loop. // Create the event loop.
#[allow(deprecated)] #[allow(deprecated)]
let mut event_loop = mio::deprecated::EventLoop::new()?; let mut event_loop = mio::deprecated::EventLoop::new()?;


+ 2
- 2
src/proto/mod.rs View File

@ -21,6 +21,6 @@ pub use self::server::{ServerRequest, ServerResponse};
pub use self::stream::*; pub use self::stream::*;
pub use self::user::{User, UserStatus}; pub use self::user::{User, UserStatus};
pub use self::value_codec::{ pub use self::value_codec::{
Decode, ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError,
ValueEncoder,
Decode, ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode,
ValueEncodeError, ValueEncoder,
}; };

+ 14
- 5
src/proto/packet.rs View File

@ -132,15 +132,21 @@ pub enum PacketReadError {
impl fmt::Display for PacketReadError { impl fmt::Display for PacketReadError {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match *self { match *self {
PacketReadError::InvalidBoolError(n) => write!(fmt, "InvalidBoolError: {}", n),
PacketReadError::InvalidU16Error(n) => write!(fmt, "InvalidU16Error: {}", n),
PacketReadError::InvalidBoolError(n) => {
write!(fmt, "InvalidBoolError: {}", n)
}
PacketReadError::InvalidU16Error(n) => {
write!(fmt, "InvalidU16Error: {}", n)
}
PacketReadError::InvalidStringError(ref bytes) => { PacketReadError::InvalidStringError(ref bytes) => {
write!(fmt, "InvalidStringError: {:?}", bytes) write!(fmt, "InvalidStringError: {:?}", bytes)
} }
PacketReadError::InvalidUserStatusError(n) => { PacketReadError::InvalidUserStatusError(n) => {
write!(fmt, "InvalidUserStatusError: {}", n) write!(fmt, "InvalidUserStatusError: {}", n)
} }
PacketReadError::IOError(ref err) => write!(fmt, "IOError: {}", err),
PacketReadError::IOError(ref err) => {
write!(fmt, "IOError: {}", err)
}
} }
} }
} }
@ -151,7 +157,9 @@ impl error::Error for PacketReadError {
PacketReadError::InvalidBoolError(_) => "InvalidBoolError", PacketReadError::InvalidBoolError(_) => "InvalidBoolError",
PacketReadError::InvalidU16Error(_) => "InvalidU16Error", PacketReadError::InvalidU16Error(_) => "InvalidU16Error",
PacketReadError::InvalidStringError(_) => "InvalidStringError", PacketReadError::InvalidStringError(_) => "InvalidStringError",
PacketReadError::InvalidUserStatusError(_) => "InvalidUserStatusError",
PacketReadError::InvalidUserStatusError(_) => {
"InvalidUserStatusError"
}
PacketReadError::IOError(_) => "IOError", PacketReadError::IOError(_) => "IOError",
} }
} }
@ -383,7 +391,8 @@ impl Parser {
// If we have finished reading the length prefix, then // If we have finished reading the length prefix, then
// deserialize it, switch states and try to read the packet // deserialize it, switch states and try to read the packet
// bytes. // bytes.
let message_len = LittleEndian::read_u32(&mut self.buffer) as usize;
let message_len =
LittleEndian::read_u32(&mut self.buffer) as usize;
if message_len > MAX_MESSAGE_SIZE { if message_len > MAX_MESSAGE_SIZE {
unimplemented!(); unimplemented!();
}; };


+ 20
- 7
src/proto/peer/message.rs View File

@ -2,8 +2,9 @@ use std::io;
use crate::proto::peer::constants::*; use crate::proto::peer::constants::*;
use crate::proto::{ use crate::proto::{
MutPacket, Packet, PacketReadError, ReadFromPacket, ValueDecode, ValueDecodeError,
ValueDecoder, ValueEncode, ValueEncodeError, ValueEncoder, WriteToPacket,
MutPacket, Packet, PacketReadError, ReadFromPacket, ValueDecode,
ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError,
ValueEncoder, WriteToPacket,
}; };
/*=========* /*=========*
@ -22,7 +23,9 @@ impl ReadFromPacket for Message {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let code: u32 = packet.read_value()?; let code: u32 = packet.read_value()?;
let message = match code { let message = match code {
CODE_PIERCE_FIREWALL => Message::PierceFirewall(packet.read_value()?),
CODE_PIERCE_FIREWALL => {
Message::PierceFirewall(packet.read_value()?)
}
CODE_PEER_INIT => Message::PeerInit(packet.read_value()?), CODE_PEER_INIT => Message::PeerInit(packet.read_value()?),
@ -42,7 +45,9 @@ impl ReadFromPacket for Message {
} }
impl ValueDecode for Message { impl ValueDecode for Message {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let position = decoder.position(); let position = decoder.position();
let code: u32 = decoder.decode()?; let code: u32 = decoder.decode()?;
let message = match code { let message = match code {
@ -67,7 +72,10 @@ impl ValueDecode for Message {
} }
impl ValueEncode for Message { impl ValueEncode for Message {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
match *self { match *self {
Message::PierceFirewall(token) => { Message::PierceFirewall(token) => {
encoder.encode_u32(CODE_PIERCE_FIREWALL)?; encoder.encode_u32(CODE_PIERCE_FIREWALL)?;
@ -132,7 +140,10 @@ impl WriteToPacket for PeerInit {
} }
impl ValueEncode for PeerInit { impl ValueEncode for PeerInit {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.user_name)?; encoder.encode_string(&self.user_name)?;
encoder.encode_string(&self.connection_type)?; encoder.encode_string(&self.connection_type)?;
encoder.encode_u32(self.token)?; encoder.encode_u32(self.token)?;
@ -141,7 +152,9 @@ impl ValueEncode for PeerInit {
} }
impl ValueDecode for PeerInit { impl ValueDecode for PeerInit {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
let connection_type = decoder.decode()?; let connection_type = decoder.decode()?;
let token = decoder.decode()?; let token = decoder.decode()?;


+ 81
- 24
src/proto/server/request.rs View File

@ -6,7 +6,8 @@ use crypto::md5::Md5;
use crate::proto::packet::{MutPacket, WriteToPacket}; use crate::proto::packet::{MutPacket, WriteToPacket};
use crate::proto::server::constants::*; use crate::proto::server::constants::*;
use crate::proto::{ use crate::proto::{
ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError, ValueEncoder,
ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError,
ValueEncoder,
}; };
/* ------- * /* ------- *
@ -100,7 +101,10 @@ impl WriteToPacket for ServerRequest {
} }
impl ValueEncode for ServerRequest { impl ValueEncode for ServerRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
match *self { match *self {
ServerRequest::CannotConnectRequest(ref request) => { ServerRequest::CannotConnectRequest(ref request) => {
encoder.encode_u32(CODE_CANNOT_CONNECT)?; encoder.encode_u32(CODE_CANNOT_CONNECT)?;
@ -151,7 +155,9 @@ impl ValueEncode for ServerRequest {
} }
impl ValueDecode for ServerRequest { impl ValueDecode for ServerRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let position = decoder.position(); let position = decoder.position();
let code: u32 = decoder.decode()?; let code: u32 = decoder.decode()?;
let request = match code { let request = match code {
@ -227,14 +233,19 @@ impl WriteToPacket for CannotConnectRequest {
} }
impl ValueEncode for CannotConnectRequest { impl ValueEncode for CannotConnectRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(self.token)?; encoder.encode_u32(self.token)?;
encoder.encode_string(&self.user_name) encoder.encode_string(&self.user_name)
} }
} }
impl ValueDecode for CannotConnectRequest { impl ValueDecode for CannotConnectRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let token = decoder.decode()?; let token = decoder.decode()?;
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
Ok(CannotConnectRequest { token, user_name }) Ok(CannotConnectRequest { token, user_name })
@ -262,7 +273,10 @@ impl WriteToPacket for ConnectToPeerRequest {
} }
impl ValueEncode for ConnectToPeerRequest { impl ValueEncode for ConnectToPeerRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(self.token)?; encoder.encode_u32(self.token)?;
encoder.encode_string(&self.user_name)?; encoder.encode_string(&self.user_name)?;
encoder.encode_string(&self.connection_type) encoder.encode_string(&self.connection_type)
@ -270,7 +284,9 @@ impl ValueEncode for ConnectToPeerRequest {
} }
impl ValueDecode for ConnectToPeerRequest { impl ValueDecode for ConnectToPeerRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let token = decoder.decode()?; let token = decoder.decode()?;
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
let connection_type = decoder.decode()?; let connection_type = decoder.decode()?;
@ -301,14 +317,19 @@ impl WriteToPacket for FileSearchRequest {
} }
impl ValueEncode for FileSearchRequest { impl ValueEncode for FileSearchRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(self.ticket)?; encoder.encode_u32(self.ticket)?;
encoder.encode_string(&self.query) encoder.encode_string(&self.query)
} }
} }
impl ValueDecode for FileSearchRequest { impl ValueDecode for FileSearchRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let ticket = decoder.decode()?; let ticket = decoder.decode()?;
let query = decoder.decode()?; let query = decoder.decode()?;
Ok(FileSearchRequest { ticket, query }) Ok(FileSearchRequest { ticket, query })
@ -370,7 +391,10 @@ impl WriteToPacket for LoginRequest {
} }
impl ValueEncode for LoginRequest { impl ValueEncode for LoginRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.username)?; encoder.encode_string(&self.username)?;
encoder.encode_string(&self.password)?; encoder.encode_string(&self.password)?;
encoder.encode_u32(self.major)?; encoder.encode_u32(self.major)?;
@ -380,7 +404,9 @@ impl ValueEncode for LoginRequest {
} }
impl ValueDecode for LoginRequest { impl ValueDecode for LoginRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let username = decoder.decode()?; let username = decoder.decode()?;
let password = decoder.decode()?; let password = decoder.decode()?;
let major = decoder.decode()?; let major = decoder.decode()?;
@ -413,13 +439,18 @@ impl WriteToPacket for PeerAddressRequest {
} }
impl ValueEncode for PeerAddressRequest { impl ValueEncode for PeerAddressRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.username) encoder.encode_string(&self.username)
} }
} }
impl ValueDecode for PeerAddressRequest { impl ValueDecode for PeerAddressRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let username = decoder.decode()?; let username = decoder.decode()?;
Ok(PeerAddressRequest { username: username }) Ok(PeerAddressRequest { username: username })
} }
@ -442,13 +473,18 @@ impl WriteToPacket for RoomJoinRequest {
} }
impl ValueEncode for RoomJoinRequest { impl ValueEncode for RoomJoinRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.room_name) encoder.encode_string(&self.room_name)
} }
} }
impl ValueDecode for RoomJoinRequest { impl ValueDecode for RoomJoinRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
Ok(RoomJoinRequest { Ok(RoomJoinRequest {
room_name: room_name, room_name: room_name,
@ -473,13 +509,18 @@ impl WriteToPacket for RoomLeaveRequest {
} }
impl ValueEncode for RoomLeaveRequest { impl ValueEncode for RoomLeaveRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.room_name) encoder.encode_string(&self.room_name)
} }
} }
impl ValueDecode for RoomLeaveRequest { impl ValueDecode for RoomLeaveRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
Ok(RoomLeaveRequest { Ok(RoomLeaveRequest {
room_name: room_name, room_name: room_name,
@ -506,14 +547,19 @@ impl WriteToPacket for RoomMessageRequest {
} }
impl ValueEncode for RoomMessageRequest { impl ValueEncode for RoomMessageRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.room_name)?; encoder.encode_string(&self.room_name)?;
encoder.encode_string(&self.message) encoder.encode_string(&self.message)
} }
} }
impl ValueDecode for RoomMessageRequest { impl ValueDecode for RoomMessageRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
let message = decoder.decode()?; let message = decoder.decode()?;
Ok(RoomMessageRequest { room_name, message }) Ok(RoomMessageRequest { room_name, message })
@ -537,13 +583,18 @@ impl WriteToPacket for SetListenPortRequest {
} }
impl ValueEncode for SetListenPortRequest { impl ValueEncode for SetListenPortRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode(&self.port) encoder.encode(&self.port)
} }
} }
impl ValueDecode for SetListenPortRequest { impl ValueDecode for SetListenPortRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let port = decoder.decode()?; let port = decoder.decode()?;
Ok(SetListenPortRequest { port: port }) Ok(SetListenPortRequest { port: port })
} }
@ -566,13 +617,18 @@ impl WriteToPacket for UserStatusRequest {
} }
impl ValueEncode for UserStatusRequest { impl ValueEncode for UserStatusRequest {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.user_name) encoder.encode_string(&self.user_name)
} }
} }
impl ValueDecode for UserStatusRequest { impl ValueDecode for UserStatusRequest {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
Ok(UserStatusRequest { Ok(UserStatusRequest {
user_name: user_name, user_name: user_name,
@ -643,7 +699,8 @@ mod tests {
#[test] #[test]
fn new_login_request_has_correct_digest() { fn new_login_request_has_correct_digest() {
let request = LoginRequest::new("alice", "password1234", 1337, 42).unwrap();
let request =
LoginRequest::new("alice", "password1234", 1337, 42).unwrap();
assert!(request.has_correct_digest()); assert!(request.has_correct_digest());
} }


+ 218
- 66
src/proto/server/response.rs View File

@ -3,8 +3,8 @@ use std::net;
use crate::proto::packet::{Packet, PacketReadError, ReadFromPacket}; use crate::proto::packet::{Packet, PacketReadError, ReadFromPacket};
use crate::proto::server::constants::*; use crate::proto::server::constants::*;
use crate::proto::{ use crate::proto::{
User, UserStatus, ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError,
ValueEncoder,
User, UserStatus, ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode,
ValueEncodeError, ValueEncoder,
}; };
/*=================* /*=================*
@ -40,39 +40,67 @@ impl ReadFromPacket for ServerResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> { fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let code: u32 = packet.read_value()?; let code: u32 = packet.read_value()?;
let resp = match code { let resp = match code {
CODE_CONNECT_TO_PEER => ServerResponse::ConnectToPeerResponse(packet.read_value()?),
CODE_CONNECT_TO_PEER => {
ServerResponse::ConnectToPeerResponse(packet.read_value()?)
}
CODE_FILE_SEARCH => ServerResponse::FileSearchResponse(packet.read_value()?),
CODE_FILE_SEARCH => {
ServerResponse::FileSearchResponse(packet.read_value()?)
}
CODE_LOGIN => ServerResponse::LoginResponse(packet.read_value()?), CODE_LOGIN => ServerResponse::LoginResponse(packet.read_value()?),
CODE_PEER_ADDRESS => ServerResponse::PeerAddressResponse(packet.read_value()?),
CODE_PEER_ADDRESS => {
ServerResponse::PeerAddressResponse(packet.read_value()?)
}
CODE_PRIVILEGED_USERS => ServerResponse::PrivilegedUsersResponse(packet.read_value()?),
CODE_PRIVILEGED_USERS => {
ServerResponse::PrivilegedUsersResponse(packet.read_value()?)
}
CODE_ROOM_JOIN => ServerResponse::RoomJoinResponse(packet.read_value()?),
CODE_ROOM_JOIN => {
ServerResponse::RoomJoinResponse(packet.read_value()?)
}
CODE_ROOM_LEAVE => ServerResponse::RoomLeaveResponse(packet.read_value()?),
CODE_ROOM_LEAVE => {
ServerResponse::RoomLeaveResponse(packet.read_value()?)
}
CODE_ROOM_LIST => ServerResponse::RoomListResponse(packet.read_value()?),
CODE_ROOM_LIST => {
ServerResponse::RoomListResponse(packet.read_value()?)
}
CODE_ROOM_MESSAGE => ServerResponse::RoomMessageResponse(packet.read_value()?),
CODE_ROOM_MESSAGE => {
ServerResponse::RoomMessageResponse(packet.read_value()?)
}
CODE_ROOM_TICKERS => ServerResponse::RoomTickersResponse(packet.read_value()?),
CODE_ROOM_TICKERS => {
ServerResponse::RoomTickersResponse(packet.read_value()?)
}
CODE_ROOM_USER_JOINED => ServerResponse::RoomUserJoinedResponse(packet.read_value()?),
CODE_ROOM_USER_JOINED => {
ServerResponse::RoomUserJoinedResponse(packet.read_value()?)
}
CODE_ROOM_USER_LEFT => ServerResponse::RoomUserLeftResponse(packet.read_value()?),
CODE_ROOM_USER_LEFT => {
ServerResponse::RoomUserLeftResponse(packet.read_value()?)
}
CODE_USER_INFO => ServerResponse::UserInfoResponse(packet.read_value()?),
CODE_USER_INFO => {
ServerResponse::UserInfoResponse(packet.read_value()?)
}
CODE_USER_STATUS => ServerResponse::UserStatusResponse(packet.read_value()?),
CODE_USER_STATUS => {
ServerResponse::UserStatusResponse(packet.read_value()?)
}
CODE_WISHLIST_INTERVAL => { CODE_WISHLIST_INTERVAL => {
ServerResponse::WishlistIntervalResponse(packet.read_value()?) ServerResponse::WishlistIntervalResponse(packet.read_value()?)
} }
CODE_PARENT_MIN_SPEED => ServerResponse::ParentMinSpeedResponse(packet.read_value()?),
CODE_PARENT_MIN_SPEED => {
ServerResponse::ParentMinSpeedResponse(packet.read_value()?)
}
CODE_PARENT_SPEED_RATIO => { CODE_PARENT_SPEED_RATIO => {
ServerResponse::ParentSpeedRatioResponse(packet.read_value()?) ServerResponse::ParentSpeedRatioResponse(packet.read_value()?)
@ -92,7 +120,10 @@ impl ReadFromPacket for ServerResponse {
} }
impl ValueEncode for ServerResponse { impl ValueEncode for ServerResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
match *self { match *self {
ServerResponse::ConnectToPeerResponse(ref response) => { ServerResponse::ConnectToPeerResponse(ref response) => {
encoder.encode_u32(CODE_CONNECT_TO_PEER)?; encoder.encode_u32(CODE_CONNECT_TO_PEER)?;
@ -171,7 +202,9 @@ impl ValueEncode for ServerResponse {
} }
impl ValueDecode for ServerResponse { impl ValueDecode for ServerResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let position = decoder.position(); let position = decoder.position();
let code: u32 = decoder.decode()?; let code: u32 = decoder.decode()?;
let response = match code { let response = match code {
@ -290,7 +323,10 @@ impl ReadFromPacket for ConnectToPeerResponse {
} }
impl ValueEncode for ConnectToPeerResponse { impl ValueEncode for ConnectToPeerResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode(&self.user_name)?; encoder.encode(&self.user_name)?;
encoder.encode(&self.connection_type)?; encoder.encode(&self.connection_type)?;
encoder.encode(&self.ip)?; encoder.encode(&self.ip)?;
@ -301,7 +337,9 @@ impl ValueEncode for ConnectToPeerResponse {
} }
impl ValueDecode for ConnectToPeerResponse { impl ValueDecode for ConnectToPeerResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
let connection_type = decoder.decode()?; let connection_type = decoder.decode()?;
let ip = decoder.decode()?; let ip = decoder.decode()?;
@ -346,7 +384,10 @@ impl ReadFromPacket for FileSearchResponse {
} }
impl ValueEncode for FileSearchResponse { impl ValueEncode for FileSearchResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.user_name)?; encoder.encode_string(&self.user_name)?;
encoder.encode_u32(self.ticket)?; encoder.encode_u32(self.ticket)?;
encoder.encode_string(&self.query) encoder.encode_string(&self.query)
@ -354,7 +395,9 @@ impl ValueEncode for FileSearchResponse {
} }
impl ValueDecode for FileSearchResponse { impl ValueDecode for FileSearchResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
let ticket = decoder.decode()?; let ticket = decoder.decode()?;
let query = decoder.decode()?; let query = decoder.decode()?;
@ -409,7 +452,10 @@ impl ReadFromPacket for LoginResponse {
} }
impl ValueEncode for LoginResponse { impl ValueEncode for LoginResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
match *self { match *self {
LoginResponse::LoginOk { LoginResponse::LoginOk {
ref motd, ref motd,
@ -430,7 +476,9 @@ impl ValueEncode for LoginResponse {
} }
impl ValueDecode for LoginResponse { impl ValueDecode for LoginResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let ok: bool = decoder.decode()?; let ok: bool = decoder.decode()?;
if !ok { if !ok {
let reason = decoder.decode()?; let reason = decoder.decode()?;
@ -471,13 +519,18 @@ impl ReadFromPacket for ParentMinSpeedResponse {
} }
impl ValueEncode for ParentMinSpeedResponse { impl ValueEncode for ParentMinSpeedResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(self.value) encoder.encode_u32(self.value)
} }
} }
impl ValueDecode for ParentMinSpeedResponse { impl ValueDecode for ParentMinSpeedResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let value = decoder.decode()?; let value = decoder.decode()?;
Ok(ParentMinSpeedResponse { value }) Ok(ParentMinSpeedResponse { value })
} }
@ -500,13 +553,18 @@ impl ReadFromPacket for ParentSpeedRatioResponse {
} }
impl ValueEncode for ParentSpeedRatioResponse { impl ValueEncode for ParentSpeedRatioResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(self.value) encoder.encode_u32(self.value)
} }
} }
impl ValueDecode for ParentSpeedRatioResponse { impl ValueDecode for ParentSpeedRatioResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let value = decoder.decode()?; let value = decoder.decode()?;
Ok(ParentSpeedRatioResponse { value }) Ok(ParentSpeedRatioResponse { value })
} }
@ -534,7 +592,10 @@ impl ReadFromPacket for PeerAddressResponse {
} }
impl ValueEncode for PeerAddressResponse { impl ValueEncode for PeerAddressResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode(&self.username)?; encoder.encode(&self.username)?;
encoder.encode(&self.ip)?; encoder.encode(&self.ip)?;
encoder.encode_u16(self.port) encoder.encode_u16(self.port)
@ -542,7 +603,9 @@ impl ValueEncode for PeerAddressResponse {
} }
impl ValueDecode for PeerAddressResponse { impl ValueDecode for PeerAddressResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let username = decoder.decode()?; let username = decoder.decode()?;
let ip = decoder.decode()?; let ip = decoder.decode()?;
let port = decoder.decode()?; let port = decoder.decode()?;
@ -567,13 +630,18 @@ impl ReadFromPacket for PrivilegedUsersResponse {
} }
impl ValueEncode for PrivilegedUsersResponse { impl ValueEncode for PrivilegedUsersResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode(&self.users) encoder.encode(&self.users)
} }
} }
impl ValueDecode for PrivilegedUsersResponse { impl ValueDecode for PrivilegedUsersResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let users = decoder.decode()?; let users = decoder.decode()?;
Ok(PrivilegedUsersResponse { users }) Ok(PrivilegedUsersResponse { users })
} }
@ -633,7 +701,10 @@ impl ReadFromPacket for RoomJoinResponse {
} }
impl RoomJoinResponse { impl RoomJoinResponse {
fn read_user_infos(&mut self, packet: &mut Packet) -> Result<(), PacketReadError> {
fn read_user_infos(
&mut self,
packet: &mut Packet,
) -> Result<(), PacketReadError> {
let num_statuses: usize = packet.read_value()?; let num_statuses: usize = packet.read_value()?;
for i in 0..num_statuses { for i in 0..num_statuses {
if let Some(user) = self.users.get_mut(i) { if let Some(user) = self.users.get_mut(i) {
@ -674,7 +745,11 @@ impl RoomJoinResponse {
{ {
warn!( warn!(
"RoomJoinResponse: mismatched vector sizes {}, {}, {}, {}, {}", "RoomJoinResponse: mismatched vector sizes {}, {}, {}, {}, {}",
num_users, num_statuses, num_infos, num_free_slots, num_countries
num_users,
num_statuses,
num_infos,
num_free_slots,
num_countries
); );
} }
@ -727,7 +802,10 @@ fn build_user(
} }
impl ValueEncode for UserInfo { impl ValueEncode for UserInfo {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(self.average_speed)?; encoder.encode_u32(self.average_speed)?;
encoder.encode_u32(self.num_downloads)?; encoder.encode_u32(self.num_downloads)?;
encoder.encode_u32(self.unknown)?; encoder.encode_u32(self.unknown)?;
@ -737,7 +815,9 @@ impl ValueEncode for UserInfo {
} }
impl ValueDecode for UserInfo { impl ValueDecode for UserInfo {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let average_speed = decoder.decode()?; let average_speed = decoder.decode()?;
let num_downloads = decoder.decode()?; let num_downloads = decoder.decode()?;
let unknown = decoder.decode()?; let unknown = decoder.decode()?;
@ -754,7 +834,10 @@ impl ValueDecode for UserInfo {
} }
impl ValueEncode for RoomJoinResponse { impl ValueEncode for RoomJoinResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
let mut user_names = vec![]; let mut user_names = vec![];
let mut user_statuses = vec![]; let mut user_statuses = vec![];
let mut user_infos = vec![]; let mut user_infos = vec![];
@ -801,9 +884,13 @@ fn build_users(
let country_opt = countries.pop(); let country_opt = countries.pop();
match (name_opt, status_opt, info_opt, slots_opt, country_opt) { match (name_opt, status_opt, info_opt, slots_opt, country_opt) {
(Some(name), Some(status), Some(info), Some(slots), Some(country)) => {
users.push(build_user(name, status, info, slots, country))
}
(
Some(name),
Some(status),
Some(info),
Some(slots),
Some(country),
) => users.push(build_user(name, status, info, slots, country)),
_ => break, _ => break,
} }
} }
@ -813,7 +900,9 @@ fn build_users(
} }
impl ValueDecode for RoomJoinResponse { impl ValueDecode for RoomJoinResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
let user_names = decoder.decode()?; let user_names = decoder.decode()?;
let user_statuses = decoder.decode()?; let user_statuses = decoder.decode()?;
@ -863,13 +952,18 @@ impl ReadFromPacket for RoomLeaveResponse {
} }
impl ValueEncode for RoomLeaveResponse { impl ValueEncode for RoomLeaveResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.room_name) encoder.encode_string(&self.room_name)
} }
} }
impl ValueDecode for RoomLeaveResponse { impl ValueDecode for RoomLeaveResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
Ok(RoomLeaveResponse { room_name }) Ok(RoomLeaveResponse { room_name })
} }
@ -903,7 +997,9 @@ impl ReadFromPacket for RoomListResponse {
} }
impl RoomListResponse { impl RoomListResponse {
fn read_rooms(packet: &mut Packet) -> Result<Vec<(String, u32)>, PacketReadError> {
fn read_rooms(
packet: &mut Packet,
) -> Result<Vec<(String, u32)>, PacketReadError> {
let num_rooms: usize = packet.read_value()?; let num_rooms: usize = packet.read_value()?;
let mut rooms = Vec::new(); let mut rooms = Vec::new();
for _ in 0..num_rooms { for _ in 0..num_rooms {
@ -928,7 +1024,10 @@ impl RoomListResponse {
Ok(rooms) Ok(rooms)
} }
fn build_rooms(mut room_names: Vec<String>, mut user_counts: Vec<u32>) -> Vec<(String, u32)> {
fn build_rooms(
mut room_names: Vec<String>,
mut user_counts: Vec<u32>,
) -> Vec<(String, u32)> {
let mut rooms = vec![]; let mut rooms = vec![];
loop { loop {
@ -936,7 +1035,9 @@ impl RoomListResponse {
let user_count_opt = user_counts.pop(); let user_count_opt = user_counts.pop();
match (room_name_opt, user_count_opt) { match (room_name_opt, user_count_opt) {
(Some(room_name), Some(user_count)) => rooms.push((room_name, user_count)),
(Some(room_name), Some(user_count)) => {
rooms.push((room_name, user_count))
}
_ => break, _ => break,
} }
} }
@ -958,7 +1059,9 @@ impl RoomListResponse {
rooms rooms
} }
fn decode_rooms(decoder: &mut ValueDecoder) -> Result<Vec<(String, u32)>, ValueDecodeError> {
fn decode_rooms(
decoder: &mut ValueDecoder,
) -> Result<Vec<(String, u32)>, ValueDecodeError> {
let room_names = decoder.decode()?; let room_names = decoder.decode()?;
let user_counts = decoder.decode()?; let user_counts = decoder.decode()?;
Ok(Self::build_rooms(room_names, user_counts)) Ok(Self::build_rooms(room_names, user_counts))
@ -982,7 +1085,10 @@ impl RoomListResponse {
} }
impl ValueEncode for RoomListResponse { impl ValueEncode for RoomListResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
Self::encode_rooms(&self.rooms, encoder)?; Self::encode_rooms(&self.rooms, encoder)?;
Self::encode_rooms(&self.owned_private_rooms, encoder)?; Self::encode_rooms(&self.owned_private_rooms, encoder)?;
Self::encode_rooms(&self.other_private_rooms, encoder)?; Self::encode_rooms(&self.other_private_rooms, encoder)?;
@ -991,7 +1097,9 @@ impl ValueEncode for RoomListResponse {
} }
impl ValueDecode for RoomListResponse { impl ValueDecode for RoomListResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let rooms = RoomListResponse::decode_rooms(decoder)?; let rooms = RoomListResponse::decode_rooms(decoder)?;
let owned_private_rooms = RoomListResponse::decode_rooms(decoder)?; let owned_private_rooms = RoomListResponse::decode_rooms(decoder)?;
let other_private_rooms = RoomListResponse::decode_rooms(decoder)?; let other_private_rooms = RoomListResponse::decode_rooms(decoder)?;
@ -1030,7 +1138,10 @@ impl ReadFromPacket for RoomMessageResponse {
} }
impl ValueEncode for RoomMessageResponse { impl ValueEncode for RoomMessageResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.room_name)?; encoder.encode_string(&self.room_name)?;
encoder.encode_string(&self.user_name)?; encoder.encode_string(&self.user_name)?;
encoder.encode_string(&self.message) encoder.encode_string(&self.message)
@ -1038,7 +1149,9 @@ impl ValueEncode for RoomMessageResponse {
} }
impl ValueDecode for RoomMessageResponse { impl ValueDecode for RoomMessageResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
let message = decoder.decode()?; let message = decoder.decode()?;
@ -1077,14 +1190,19 @@ impl ReadFromPacket for RoomTickersResponse {
} }
impl ValueEncode for RoomTickersResponse { impl ValueEncode for RoomTickersResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.room_name)?; encoder.encode_string(&self.room_name)?;
encoder.encode(&self.tickers) encoder.encode(&self.tickers)
} }
} }
impl ValueDecode for RoomTickersResponse { impl ValueDecode for RoomTickersResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
let tickers = decoder.decode()?; let tickers = decoder.decode()?;
Ok(RoomTickersResponse { room_name, tickers }) Ok(RoomTickersResponse { room_name, tickers })
@ -1135,7 +1253,10 @@ impl ReadFromPacket for RoomUserJoinedResponse {
} }
impl ValueEncode for RoomUserJoinedResponse { impl ValueEncode for RoomUserJoinedResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.room_name)?; encoder.encode_string(&self.room_name)?;
encoder.encode_string(&self.user.name)?; encoder.encode_string(&self.user.name)?;
self.user.status.encode(encoder)?; self.user.status.encode(encoder)?;
@ -1146,7 +1267,9 @@ impl ValueEncode for RoomUserJoinedResponse {
} }
impl ValueDecode for RoomUserJoinedResponse { impl ValueDecode for RoomUserJoinedResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
let status = decoder.decode()?; let status = decoder.decode()?;
@ -1182,14 +1305,19 @@ impl ReadFromPacket for RoomUserLeftResponse {
} }
impl ValueEncode for RoomUserLeftResponse { impl ValueEncode for RoomUserLeftResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.room_name)?; encoder.encode_string(&self.room_name)?;
encoder.encode_string(&self.user_name) encoder.encode_string(&self.user_name)
} }
} }
impl ValueDecode for RoomUserLeftResponse { impl ValueDecode for RoomUserLeftResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let room_name = decoder.decode()?; let room_name = decoder.decode()?;
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
Ok(RoomUserLeftResponse { Ok(RoomUserLeftResponse {
@ -1230,7 +1358,10 @@ impl ReadFromPacket for UserInfoResponse {
} }
impl ValueEncode for UserInfoResponse { impl ValueEncode for UserInfoResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.user_name)?; encoder.encode_string(&self.user_name)?;
encoder.encode_u32(self.average_speed as u32)?; encoder.encode_u32(self.average_speed as u32)?;
encoder.encode_u32(self.num_downloads as u32)?; encoder.encode_u32(self.num_downloads as u32)?;
@ -1240,7 +1371,9 @@ impl ValueEncode for UserInfoResponse {
} }
impl ValueDecode for UserInfoResponse { impl ValueDecode for UserInfoResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
let average_speed: u32 = decoder.decode()?; let average_speed: u32 = decoder.decode()?;
let num_downloads: u32 = decoder.decode()?; let num_downloads: u32 = decoder.decode()?;
@ -1281,7 +1414,10 @@ impl ReadFromPacket for UserStatusResponse {
} }
impl ValueEncode for UserStatusResponse { impl ValueEncode for UserStatusResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(&self.user_name)?; encoder.encode_string(&self.user_name)?;
self.status.encode(encoder)?; self.status.encode(encoder)?;
encoder.encode_bool(self.is_privileged) encoder.encode_bool(self.is_privileged)
@ -1289,7 +1425,9 @@ impl ValueEncode for UserStatusResponse {
} }
impl ValueDecode for UserStatusResponse { impl ValueDecode for UserStatusResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let user_name = decoder.decode()?; let user_name = decoder.decode()?;
let status = decoder.decode()?; let status = decoder.decode()?;
let is_privileged = decoder.decode()?; let is_privileged = decoder.decode()?;
@ -1318,13 +1456,18 @@ impl ReadFromPacket for WishlistIntervalResponse {
} }
impl ValueEncode for WishlistIntervalResponse { impl ValueEncode for WishlistIntervalResponse {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(self.seconds) encoder.encode_u32(self.seconds)
} }
} }
impl ValueDecode for WishlistIntervalResponse { impl ValueDecode for WishlistIntervalResponse {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let seconds = decoder.decode()?; let seconds = decoder.decode()?;
Ok(WishlistIntervalResponse { seconds }) Ok(WishlistIntervalResponse { seconds })
} }
@ -1492,9 +1635,18 @@ mod tests {
fn roundtrip_room_list() { fn roundtrip_room_list() {
roundtrip(ServerResponse::RoomListResponse(RoomListResponse { roundtrip(ServerResponse::RoomListResponse(RoomListResponse {
rooms: vec![("red".to_string(), 12), ("blue".to_string(), 13)], rooms: vec![("red".to_string(), 12), ("blue".to_string(), 13)],
owned_private_rooms: vec![("green".to_string(), 14), ("purple".to_string(), 15)],
other_private_rooms: vec![("yellow".to_string(), 16), ("orange".to_string(), 17)],
operated_private_room_names: vec!["brown".to_string(), "pink".to_string()],
owned_private_rooms: vec![
("green".to_string(), 14),
("purple".to_string(), 15),
],
other_private_rooms: vec![
("yellow".to_string(), 16),
("orange".to_string(), 17),
],
operated_private_room_names: vec![
"brown".to_string(),
"pink".to_string(),
],
})) }))
} }


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

@ -201,7 +201,8 @@ impl<T: SendPacket> Stream<T> {
// We're always interested in reading more. // We're always interested in reading more.
#[allow(deprecated)] #[allow(deprecated)]
let mut event_set = mio::Ready::readable() | mio::Ready::hup() | mio::Ready::error();
let mut event_set =
mio::Ready::readable() | mio::Ready::hup() | mio::Ready::error();
// If there is still stuff to write in the queue, we're interested in // If there is still stuff to write in the queue, we're interested in
// the socket becoming writable too. // the socket becoming writable too.
if self.queue.len() > 0 { if self.queue.len() > 0 {


+ 5
- 3
src/proto/testing.rs View File

@ -8,14 +8,16 @@ use tokio::net::{TcpListener, TcpStream};
use crate::proto::{Connection, ServerRequest, ServerResponse}; use crate::proto::{Connection, ServerRequest, ServerResponse};
async fn process(stream: TcpStream) -> io::Result<()> { async fn process(stream: TcpStream) -> io::Result<()> {
let mut connection = Connection::<ServerRequest, ServerResponse>::new(stream);
let mut connection =
Connection::<ServerRequest, ServerResponse>::new(stream);
let _request = match connection.read().await? { let _request = match connection.read().await? {
ServerRequest::LoginRequest(request) => request, ServerRequest::LoginRequest(request) => request,
request => { request => {
return Err(io::Error::new( return Err(io::Error::new(
io::ErrorKind::InvalidData,
format!("expected login request, got: {:?}", request)));
io::ErrorKind::InvalidData,
format!("expected login request, got: {:?}", request),
));
} }
}; };


+ 24
- 6
src/proto/user.rs View File

@ -1,8 +1,9 @@
use std::io; use std::io;
use crate::proto::{ use crate::proto::{
MutPacket, Packet, PacketReadError, ReadFromPacket, ValueDecode, ValueDecodeError,
ValueDecoder, ValueEncode, ValueEncodeError, ValueEncoder, WriteToPacket,
MutPacket, Packet, PacketReadError, ReadFromPacket, ValueDecode,
ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError,
ValueEncoder, WriteToPacket,
}; };
const STATUS_OFFLINE: u32 = 1; const STATUS_OFFLINE: u32 = 1;
@ -10,7 +11,17 @@ const STATUS_AWAY: u32 = 2;
const STATUS_ONLINE: u32 = 3; const STATUS_ONLINE: u32 = 3;
/// This enumeration is the list of possible user statuses. /// This enumeration is the list of possible user statuses.
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, RustcDecodable, RustcEncodable)]
#[derive(
Clone,
Copy,
Debug,
Eq,
Ord,
PartialEq,
PartialOrd,
RustcDecodable,
RustcEncodable,
)]
pub enum UserStatus { pub enum UserStatus {
/// The user if offline. /// The user if offline.
Offline, Offline,
@ -45,7 +56,10 @@ impl WriteToPacket for UserStatus {
} }
impl ValueEncode for UserStatus { impl ValueEncode for UserStatus {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
let value = match *self { let value = match *self {
UserStatus::Offline => STATUS_OFFLINE, UserStatus::Offline => STATUS_OFFLINE,
UserStatus::Away => STATUS_AWAY, UserStatus::Away => STATUS_AWAY,
@ -56,7 +70,9 @@ impl ValueEncode for UserStatus {
} }
impl ValueDecode for UserStatus { impl ValueDecode for UserStatus {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let position = decoder.position(); let position = decoder.position();
let value: u32 = decoder.decode()?; let value: u32 = decoder.decode()?;
match value { match value {
@ -73,7 +89,9 @@ impl ValueDecode for UserStatus {
} }
/// This structure contains the last known information about a fellow user. /// This structure contains the last known information about a fellow user.
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, RustcDecodable, RustcEncodable)]
#[derive(
Clone, Debug, Eq, Ord, PartialEq, PartialOrd, RustcDecodable, RustcEncodable,
)]
pub struct User { pub struct User {
/// The name of the user. /// The name of the user.
pub name: String, pub name: String,


+ 89
- 25
src/proto/value_codec.rs View File

@ -95,7 +95,9 @@ pub enum ValueDecodeError {
impl From<ValueDecodeError> for io::Error { impl From<ValueDecodeError> for io::Error {
fn from(error: ValueDecodeError) -> Self { fn from(error: ValueDecodeError) -> Self {
let kind = match &error { let kind = match &error {
&ValueDecodeError::NotEnoughData { .. } => io::ErrorKind::UnexpectedEof,
&ValueDecodeError::NotEnoughData { .. } => {
io::ErrorKind::UnexpectedEof
}
_ => io::ErrorKind::InvalidData, _ => io::ErrorKind::InvalidData,
}; };
let message = format!("{}", &error); let message = format!("{}", &error);
@ -125,7 +127,9 @@ pub struct ValueDecoder<'a> {
/// a `ValueDecoder`. /// a `ValueDecoder`.
pub trait ValueDecode: Sized { pub trait ValueDecode: Sized {
/// Attempts to decode a value of this type with the given decoder. /// Attempts to decode a value of this type with the given decoder.
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError>;
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError>;
} }
impl<'a> ValueDecoder<'a> { impl<'a> ValueDecoder<'a> {
@ -225,11 +229,13 @@ impl<'a> ValueDecoder<'a> {
let position = self.position; let position = self.position;
let bytes = self.consume(length)?; let bytes = self.consume(length)?;
let result = WINDOWS_1252.decode_without_bom_handling_and_without_replacement(bytes);
let result = WINDOWS_1252
.decode_without_bom_handling_and_without_replacement(bytes);
match result { match result {
Some(string) => Ok(string.into_owned()), Some(string) => Ok(string.into_owned()),
None => Err(ValueDecodeError::InvalidString { None => Err(ValueDecodeError::InvalidString {
cause: "malformed sequence in Windows-1252-encoded string".to_string(),
cause: "malformed sequence in Windows-1252-encoded string"
.to_string(),
position: position, position: position,
}), }),
} }
@ -248,38 +254,50 @@ impl<'a> ValueDecoder<'a> {
} }
impl ValueDecode for u32 { impl ValueDecode for u32 {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
decoder.decode_u32() decoder.decode_u32()
} }
} }
impl ValueDecode for u16 { impl ValueDecode for u16 {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
decoder.decode_u16() decoder.decode_u16()
} }
} }
impl ValueDecode for bool { impl ValueDecode for bool {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
decoder.decode_bool() decoder.decode_bool()
} }
} }
impl ValueDecode for net::Ipv4Addr { impl ValueDecode for net::Ipv4Addr {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let ip = decoder.decode_u32()?; let ip = decoder.decode_u32()?;
Ok(net::Ipv4Addr::from(ip)) Ok(net::Ipv4Addr::from(ip))
} }
} }
impl ValueDecode for String { impl ValueDecode for String {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
decoder.decode_string() decoder.decode_string()
} }
} }
impl<T: ValueDecode, U: ValueDecode> ValueDecode for (T, U) { impl<T: ValueDecode, U: ValueDecode> ValueDecode for (T, U) {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let first = decoder.decode()?; let first = decoder.decode()?;
let second = decoder.decode()?; let second = decoder.decode()?;
Ok((first, second)) Ok((first, second))
@ -287,7 +305,9 @@ impl<T: ValueDecode, U: ValueDecode> ValueDecode for (T, U) {
} }
impl<T: ValueDecode> ValueDecode for Vec<T> { impl<T: ValueDecode> ValueDecode for Vec<T> {
fn decode_from(decoder: &mut ValueDecoder) -> Result<Self, ValueDecodeError> {
fn decode_from(
decoder: &mut ValueDecoder,
) -> Result<Self, ValueDecodeError> {
let len = decoder.decode_u32()? as usize; let len = decoder.decode_u32()? as usize;
let mut vec = Vec::with_capacity(len); let mut vec = Vec::with_capacity(len);
for _ in 0..len { for _ in 0..len {
@ -328,7 +348,10 @@ pub struct ValueEncoder<'a> {
pub trait ValueEncode { pub trait ValueEncode {
// TODO: Rename to encode_to(). // TODO: Rename to encode_to().
/// Attempts to encode `self` with the given encoder. /// Attempts to encode `self` with the given encoder.
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError>;
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError>;
} }
impl<'a> ValueEncoder<'a> { impl<'a> ValueEncoder<'a> {
@ -388,31 +411,46 @@ impl<'a> ValueEncoder<'a> {
/// ``` /// ```
/// encoder.encode(&Foo::new(bar))?; /// encoder.encode(&Foo::new(bar))?;
/// ``` /// ```
pub fn encode<T: ValueEncode + ?Sized>(&mut self, val: &T) -> Result<(), ValueEncodeError> {
pub fn encode<T: ValueEncode + ?Sized>(
&mut self,
val: &T,
) -> Result<(), ValueEncodeError> {
val.encode(self) val.encode(self)
} }
} }
impl ValueEncode for u32 { impl ValueEncode for u32 {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(*self) encoder.encode_u32(*self)
} }
} }
impl ValueEncode for u16 { impl ValueEncode for u16 {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u16(*self) encoder.encode_u16(*self)
} }
} }
impl ValueEncode for bool { impl ValueEncode for bool {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_bool(*self) encoder.encode_bool(*self)
} }
} }
impl ValueEncode for net::Ipv4Addr { impl ValueEncode for net::Ipv4Addr {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(u32::from(*self)) encoder.encode_u32(u32::from(*self))
} }
} }
@ -426,32 +464,47 @@ impl ValueEncode for net::Ipv4Addr {
// Value{De,En}code) but it is not really worth the hassle. // Value{De,En}code) but it is not really worth the hassle.
impl ValueEncode for str { impl ValueEncode for str {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(self) encoder.encode_string(self)
} }
} }
impl ValueEncode for String { impl ValueEncode for String {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(self) encoder.encode_string(self)
} }
} }
impl<'a> ValueEncode for &'a String { impl<'a> ValueEncode for &'a String {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_string(*self) encoder.encode_string(*self)
} }
} }
impl<T: ValueEncode, U: ValueEncode> ValueEncode for (T, U) { impl<T: ValueEncode, U: ValueEncode> ValueEncode for (T, U) {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
self.0.encode(encoder)?; self.0.encode(encoder)?;
self.1.encode(encoder) self.1.encode(encoder)
} }
} }
impl<T: ValueEncode> ValueEncode for [T] { impl<T: ValueEncode> ValueEncode for [T] {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
encoder.encode_u32(self.len() as u32)?; encoder.encode_u32(self.len() as u32)?;
for ref item in self { for ref item in self {
item.encode(encoder)?; item.encode(encoder)?;
@ -461,7 +514,10 @@ impl<T: ValueEncode> ValueEncode for [T] {
} }
impl<T: ValueEncode> ValueEncode for Vec<T> { impl<T: ValueEncode> ValueEncode for Vec<T> {
fn encode(&self, encoder: &mut ValueEncoder) -> Result<(), ValueEncodeError> {
fn encode(
&self,
encoder: &mut ValueEncoder,
) -> Result<(), ValueEncodeError> {
let slice: &[T] = &*self; let slice: &[T] = &*self;
slice.encode(encoder) slice.encode(encoder)
} }
@ -480,7 +536,9 @@ pub mod tests {
use bytes::{BufMut, BytesMut}; use bytes::{BufMut, BytesMut};
use super::{ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncoder};
use super::{
ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncoder,
};
// Declared here because assert_eq!(bytes, &[]) fails to infer types. // Declared here because assert_eq!(bytes, &[]) fails to infer types.
const EMPTY_BYTES: &'static [u8] = &[]; const EMPTY_BYTES: &'static [u8] = &[];
@ -864,7 +922,13 @@ pub mod tests {
let mut vec = vec![]; let mut vec = vec![];
let mut expected_bytes = BytesMut::new(); let mut expected_bytes = BytesMut::new();
expected_bytes.extend_from_slice(&[13, U32_ENCODINGS.len() as u8, 0, 0, 0]);
expected_bytes.extend_from_slice(&[
13,
U32_ENCODINGS.len() as u8,
0,
0,
0,
]);
for &(val, ref encoded_bytes) in &U32_ENCODINGS { for &(val, ref encoded_bytes) in &U32_ENCODINGS {
vec.push(val); vec.push(val);


+ 43
- 13
src/room.rs View File

@ -92,13 +92,17 @@ pub enum Error {
impl fmt::Display for Error { impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self { match *self {
Error::RoomNotFound(ref room_name) => write!(f, "room {:?} not found", room_name),
Error::RoomNotFound(ref room_name) => {
write!(f, "room {:?} not found", room_name)
}
Error::MembershipChangeInvalid(old_membership, new_membership) => write!(
f,
"cannot change membership from {:?} to {:?}",
old_membership, new_membership
),
Error::MembershipChangeInvalid(old_membership, new_membership) => {
write!(
f,
"cannot change membership from {:?} to {:?}",
old_membership, new_membership
)
}
} }
} }
} }
@ -172,7 +176,8 @@ impl RoomMap {
/// server response. /// server response.
pub fn set_room_list(&mut self, mut response: server::RoomListResponse) { pub fn set_room_list(&mut self, mut response: server::RoomListResponse) {
// Replace the old mapping with an empty one. // Replace the old mapping with an empty one.
let mut old_map = mem::replace(&mut self.map, collections::HashMap::new());
let mut old_map =
mem::replace(&mut self.map, collections::HashMap::new());
// Add all public rooms. // Add all public rooms.
for (name, user_count) in response.rooms.drain(..) { for (name, user_count) in response.rooms.drain(..) {
@ -181,12 +186,22 @@ impl RoomMap {
// Add all private, owned, rooms. // Add all private, owned, rooms.
for (name, user_count) in response.owned_private_rooms.drain(..) { for (name, user_count) in response.owned_private_rooms.drain(..) {
self.update_one(name, Visibility::PrivateOwned, user_count, &mut old_map);
self.update_one(
name,
Visibility::PrivateOwned,
user_count,
&mut old_map,
);
} }
// Add all private, unowned, rooms. // Add all private, unowned, rooms.
for (name, user_count) in response.other_private_rooms.drain(..) { for (name, user_count) in response.other_private_rooms.drain(..) {
self.update_one(name, Visibility::PrivateOther, user_count, &mut old_map);
self.update_one(
name,
Visibility::PrivateOther,
user_count,
&mut old_map,
);
} }
// Mark all operated rooms as necessary. // Mark all operated rooms as necessary.
@ -303,7 +318,11 @@ impl RoomMap {
} }
/// Saves the given message as the last one in the given room. /// Saves the given message as the last one in the given room.
pub fn add_message(&mut self, room_name: &str, message: Message) -> Result<(), Error> {
pub fn add_message(
&mut self,
room_name: &str,
message: Message,
) -> Result<(), Error> {
let room = self.get_mut_strict(room_name)?; let room = self.get_mut_strict(room_name)?;
room.messages.push(message); room.messages.push(message);
Ok(()) Ok(())
@ -311,7 +330,11 @@ impl RoomMap {
/// Inserts the given user in the given room's set of members. /// Inserts the given user in the given room's set of members.
/// Returns an error if the room is not found. /// Returns an error if the room is not found.
pub fn insert_member(&mut self, room_name: &str, user_name: String) -> Result<(), Error> {
pub fn insert_member(
&mut self,
room_name: &str,
user_name: String,
) -> Result<(), Error> {
let room = self.get_mut_strict(room_name)?; let room = self.get_mut_strict(room_name)?;
room.members.insert(user_name); room.members.insert(user_name);
Ok(()) Ok(())
@ -319,7 +342,11 @@ impl RoomMap {
/// Removes the given user from the given room's set of members. /// Removes the given user from the given room's set of members.
/// Returns an error if the room is not found. /// Returns an error if the room is not found.
pub fn remove_member(&mut self, room_name: &str, user_name: &str) -> Result<(), Error> {
pub fn remove_member(
&mut self,
room_name: &str,
user_name: &str,
) -> Result<(), Error> {
let room = self.get_mut_strict(room_name)?; let room = self.get_mut_strict(room_name)?;
room.members.remove(user_name); room.members.remove(user_name);
Ok(()) Ok(())
@ -355,7 +382,10 @@ mod tests {
fn room_map_get_strict() { fn room_map_get_strict() {
let mut rooms = RoomMap::new(); let mut rooms = RoomMap::new();
rooms.set_room_list(RoomListResponse { rooms.set_room_list(RoomListResponse {
rooms: vec![("room a".to_string(), 42), ("room b".to_string(), 1337)],
rooms: vec![
("room a".to_string(), 42),
("room b".to_string(), 1337),
],
owned_private_rooms: vec![], owned_private_rooms: vec![],
other_private_rooms: vec![], other_private_rooms: vec![],
operated_private_room_names: vec![], operated_private_room_names: vec![],


+ 6
- 2
src/user.rs View File

@ -50,7 +50,10 @@ impl UserMap {
/// Looks up the given user name in the map, returning a mutable reference /// Looks up the given user name in the map, returning a mutable reference
/// to the associated data if found, or an error if not found. /// to the associated data if found, or an error if not found.
pub fn get_mut_strict(&mut self, user_name: &str) -> Result<&mut User, UserNotFoundError> {
pub fn get_mut_strict(
&mut self,
user_name: &str,
) -> Result<&mut User, UserNotFoundError> {
match self.map.get_mut(user_name) { match self.map.get_mut(user_name) {
Some(user) => Ok(user), Some(user) => Ok(user),
None => Err(UserNotFoundError { None => Err(UserNotFoundError {
@ -130,7 +133,8 @@ mod tests {
fn set_get_all_privileged() { fn set_get_all_privileged() {
let mut users = UserMap::new(); let mut users = UserMap::new();
users.set_all_privileged(vec!["bleep".to_string(), "bloop".to_string()]);
users
.set_all_privileged(vec!["bleep".to_string(), "bloop".to_string()]);
let mut privileged = users.get_all_privileged(); let mut privileged = users.get_all_privileged();
privileged.sort(); privileged.sort();


Loading…
Cancel
Save