From c3cc5a26cbf0641997ae48be59736f160db87a00 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Thu, 26 Aug 2021 21:10:12 +0200 Subject: [PATCH] Remove mio dependency, old proto code. --- Cargo.lock | 2 - client/Cargo.toml | 1 - client/src/client.rs | 68 ++---- client/src/main.rs | 19 +- proto/Cargo.toml | 1 - proto/src/core/constants.rs | 5 - proto/src/core/mod.rs | 1 - proto/src/core/user.rs | 29 --- proto/src/handler.rs | 393 -------------------------------- proto/src/lib.rs | 6 - proto/src/peer/message.rs | 71 ------ proto/src/server/request.rs | 143 ------------ proto/src/server/response.rs | 426 ----------------------------------- 13 files changed, 20 insertions(+), 1145 deletions(-) delete mode 100644 proto/src/core/constants.rs delete mode 100644 proto/src/handler.rs diff --git a/Cargo.lock b/Cargo.lock index f4976aa..182029d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1263,7 +1263,6 @@ dependencies = [ "env_logger", "futures 0.3.15", "log", - "mio 0.6.23", "parking_lot 0.8.0", "serde", "serde_json", @@ -1291,7 +1290,6 @@ dependencies = [ "env_logger", "futures 0.3.15", "log", - "mio 0.6.23", "parking_lot 0.8.0", "rust-crypto", "serde", diff --git a/client/Cargo.toml b/client/Cargo.toml index 4399350..6462f1b 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -12,7 +12,6 @@ crossbeam-channel = "^0.3" env_logger = "^0.8" futures = "0.3" log = "^0.4" -mio = "^0.6" parking_lot = "^0.8" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/client/src/client.rs b/client/src/client.rs index caf9bbd..9ed4f93 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1,7 +1,6 @@ use std::net; use crossbeam_channel; -use mio; use slab; use solstice_proto; use solstice_proto::config; @@ -13,11 +12,6 @@ use crate::login::LoginStatus; use crate::room; use crate::user; -#[derive(Debug)] -enum IncomingMessage { - Proto(solstice_proto::Response), -} - #[derive(Debug)] enum PeerState { /// We are trying to establish a direct connection. @@ -45,9 +39,8 @@ struct Peer { } pub struct Client { - #[allow(deprecated)] - proto_tx: mio::deprecated::Sender, - proto_rx: crossbeam_channel::Receiver, + proto_tx: crossbeam_channel::Sender, + proto_rx: crossbeam_channel::Receiver, login_status: LoginStatus, @@ -63,8 +56,8 @@ impl Client { /// through `control_rx`. #[allow(deprecated)] pub fn new( - proto_tx: mio::deprecated::Sender, - proto_rx: crossbeam_channel::Receiver, + proto_tx: crossbeam_channel::Sender, + proto_rx: crossbeam_channel::Receiver, ) -> Self { Client { proto_tx: proto_tx, @@ -106,29 +99,18 @@ impl Client { ); loop { - match self.recv() { - IncomingMessage::Proto(response) => { - self.handle_proto_response(response) - } - } + let response = self.proto_rx.recv().expect("receving response"); + self.handle_server_response(response) } } - // Necessary to break out in different function because self cannot be - // borrowed in the select arms due to *macro things*. - fn recv(&mut self) -> IncomingMessage { - IncomingMessage::Proto(self.proto_rx.recv().unwrap()) - } - /// Send a request to the server. fn send_to_server(&self, request: server::ServerRequest) { #[allow(deprecated)] - self - .proto_tx - .send(solstice_proto::Request::ServerRequest(request)) - .unwrap(); + self.proto_tx.send(request).unwrap(); } + /* /// Send a message to a peer. fn send_to_peer(&self, peer_id: usize, message: peer::Message) { #[allow(deprecated)] @@ -137,6 +119,7 @@ impl Client { .send(solstice_proto::Request::PeerMessage(peer_id, message)) .unwrap(); } + */ /// Send a response to the controller client. fn send_to_controller(&mut self, response: control::Response) { @@ -273,26 +256,7 @@ impl Client { * PROTO RESPONSE HANDLING * *=========================*/ - fn handle_proto_response(&mut self, response: solstice_proto::Response) { - match response { - solstice_proto::Response::ServerResponse(server_response) => { - self.handle_server_response(server_response) - } - - solstice_proto::Response::PeerConnectionOpen(peer_id) => { - self.handle_peer_connection_open(peer_id) - } - - solstice_proto::Response::PeerConnectionClosed(peer_id) => { - self.handle_peer_connection_closed(peer_id) - } - - _ => { - warn!("Unhandled proto response: {:?}", response); - } - } - } - + #[allow(dead_code)] fn handle_peer_connection_closed(&mut self, peer_id: usize) { let mut occupied_entry = match self.peers.entry(peer_id) { None | Some(slab::Entry::Vacant(_)) => { @@ -329,7 +293,7 @@ impl Client { #[allow(deprecated)] self .proto_tx - .send(solstice_proto::Request::ServerRequest( + .send(server::ServerRequest::ConnectToPeerRequest( server::ConnectToPeerRequest { token: peer.token, user_name: peer.user_name.clone(), @@ -350,7 +314,7 @@ impl Client { #[allow(deprecated)] self .proto_tx - .send(solstice_proto::Request::ServerRequest( + .send(server::ServerRequest::CannotConnectRequest( server::CannotConnectRequest { token: peer.token, user_name: peer.user_name, @@ -362,8 +326,9 @@ impl Client { } } + #[allow(dead_code)] fn handle_peer_connection_open(&mut self, peer_id: usize) { - let message = match self.peers.get_mut(peer_id) { + let _message = match self.peers.get_mut(peer_id) { None => { error!("Unknown peer connection {} is open", peer_id); return; @@ -427,7 +392,7 @@ impl Client { } }; - self.send_to_peer(peer_id, message); + // self.send_to_peer(peer_id, message); } /*==========================* @@ -511,7 +476,7 @@ impl Client { "Opening peer connection {} to {}:{} to pierce firewall", peer_id, response.ip, response.port ); - #[allow(deprecated)] + /* self .proto_tx .send(solstice_proto::Request::PeerConnect( @@ -520,6 +485,7 @@ impl Client { response.port, )) .unwrap(); + */ } Err(peer) => { diff --git a/client/src/main.rs b/client/src/main.rs index 70d58ff..cd18503 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -2,8 +2,6 @@ #[macro_use] extern crate log; -use std::thread; - use anyhow::Context; use clap::{App, Arg}; use crossbeam_channel; @@ -29,22 +27,11 @@ use dispatcher::Dispatcher; use executor::Executor; fn old_main() { - let (proto_to_client_tx, proto_to_client_rx) = crossbeam_channel::unbounded(); - - let mut proto_agent = match solstice_proto::Agent::new(proto_to_client_tx) { - Ok(agent) => agent, - Err(err) => { - error!("Error initializing protocol agent: {}", err); - return; - } - }; - - let client_to_proto_tx = proto_agent.channel(); + let (request_tx, _request_rx) = crossbeam_channel::bounded(100); + let (_response_tx, response_rx) = crossbeam_channel::bounded(100); - let mut client = client::Client::new(client_to_proto_tx, proto_to_client_rx); + let mut client = client::Client::new(request_tx, response_rx); - // Run ws server. - thread::spawn(move || proto_agent.run().unwrap()); client.run(); } diff --git a/proto/Cargo.toml b/proto/Cargo.toml index 175fb64..da38cf8 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -14,7 +14,6 @@ encoding_rs = "^0.8" env_logger = "^0.8" futures = "^0.3" log = "^0.4" -mio = "^0.6" parking_lot = "^0.8" rust-crypto = "^0.2.34" serde = { version = "1.0", features = ["derive"] } diff --git a/proto/src/core/constants.rs b/proto/src/core/constants.rs deleted file mode 100644 index f213b07..0000000 --- a/proto/src/core/constants.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub const MAX_PACKET_SIZE: usize = 1 << 20; // 1 MiB -pub const U32_SIZE: usize = 4; -pub const MAX_MESSAGE_SIZE: usize = MAX_PACKET_SIZE - U32_SIZE; - -pub const MAX_PORT: u32 = (1 << 16) - 1; diff --git a/proto/src/core/mod.rs b/proto/src/core/mod.rs index e5393b2..e97e3b4 100644 --- a/proto/src/core/mod.rs +++ b/proto/src/core/mod.rs @@ -1,4 +1,3 @@ -pub mod constants; // TODO: Remove `pub` qualifier, depend on re-exports. pub mod frame; mod prefix; diff --git a/proto/src/core/user.rs b/proto/src/core/user.rs index 034156d..498ee2b 100644 --- a/proto/src/core/user.rs +++ b/proto/src/core/user.rs @@ -1,14 +1,9 @@ -use std::io; - use serde::{Deserialize, Serialize}; use crate::core::value::{ ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError, ValueEncoder, }; -use crate::{ - MutPacket, Packet, PacketReadError, ReadFromPacket, WriteToPacket, -}; const STATUS_OFFLINE: u32 = 1; const STATUS_AWAY: u32 = 2; @@ -27,30 +22,6 @@ pub enum UserStatus { Online, } -impl ReadFromPacket for UserStatus { - fn read_from_packet(packet: &mut Packet) -> Result { - let n: u32 = packet.read_value()?; - match n { - STATUS_OFFLINE => Ok(UserStatus::Offline), - STATUS_AWAY => Ok(UserStatus::Away), - STATUS_ONLINE => Ok(UserStatus::Online), - _ => Err(PacketReadError::InvalidUserStatusError(n)), - } - } -} - -impl WriteToPacket for UserStatus { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - let n = match *self { - UserStatus::Offline => STATUS_OFFLINE, - UserStatus::Away => STATUS_AWAY, - UserStatus::Online => STATUS_ONLINE, - }; - packet.write_value(&n)?; - Ok(()) - } -} - impl ValueEncode for UserStatus { fn encode_to( &self, diff --git a/proto/src/handler.rs b/proto/src/handler.rs deleted file mode 100644 index 480c827..0000000 --- a/proto/src/handler.rs +++ /dev/null @@ -1,393 +0,0 @@ -use std::fmt; -use std::io; -use std::net; -use std::net::ToSocketAddrs; - -use crossbeam_channel; -use log::{error, info}; -use mio; -use slab; - -use crate::config; - -use super::peer; -use super::server::{ServerRequest, ServerResponse}; -use super::{Intent, SendPacket, Stream}; - -/*===========* - * CONSTANTS * - *===========*/ - -// There are only ever MAX_PEERS peer tokens, from 0 to MAX_PEERS - 1. -// This way we ensure no overlap and eliminate the need for coordination -// between client and handler that would otherwise be needed. -const SERVER_TOKEN: usize = config::MAX_PEERS; - -const LISTEN_TOKEN: usize = config::MAX_PEERS + 1; - -/*====================* - * REQUEST - RESPONSE * - *====================*/ - -#[derive(Debug)] -pub enum Request { - PeerConnect(usize, net::Ipv4Addr, u16), - PeerMessage(usize, peer::Message), - ServerRequest(ServerRequest), -} - -#[derive(Debug)] -pub enum Response { - PeerConnectionClosed(usize), - PeerConnectionOpen(usize), - PeerMessage(usize, peer::Message), - ServerResponse(ServerResponse), -} - -/*========================* - * SERVER RESPONSE SENDER * - *========================*/ - -pub struct ServerResponseSender(crossbeam_channel::Sender); - -impl SendPacket for ServerResponseSender { - type Value = ServerResponse; - type Error = crossbeam_channel::SendError; - - fn send_packet(&mut self, value: Self::Value) -> Result<(), Self::Error> { - self.0.send(Response::ServerResponse(value)) - } - - fn notify_open(&mut self) -> Result<(), Self::Error> { - Ok(()) - } -} - -/*======================* - * PEER RESPONSE SENDER * - *======================*/ - -pub struct PeerResponseSender { - sender: crossbeam_channel::Sender, - peer_id: usize, -} - -impl SendPacket for PeerResponseSender { - type Value = peer::Message; - type Error = crossbeam_channel::SendError; - - fn send_packet(&mut self, value: Self::Value) -> Result<(), Self::Error> { - self.sender.send(Response::PeerMessage(self.peer_id, value)) - } - - fn notify_open(&mut self) -> Result<(), Self::Error> { - self.sender.send(Response::PeerConnectionOpen(self.peer_id)) - } -} - -/*=========* - * HANDLER * - *=========*/ - -/// This struct handles all the soulseek connections, to the server and to -/// peers. -struct Handler { - server_stream: Stream, - - peer_streams: slab::Slab, usize>, - - listener: mio::tcp::TcpListener, - - client_tx: crossbeam_channel::Sender, -} - -fn listener_bind(addr_spec: U) -> io::Result -where - U: ToSocketAddrs + fmt::Debug, -{ - for socket_addr in addr_spec.to_socket_addrs()? { - if let Ok(listener) = mio::tcp::TcpListener::bind(&socket_addr) { - return Ok(listener); - } - } - Err(io::Error::new( - io::ErrorKind::Other, - format!("Cannot bind to {:?}", addr_spec), - )) -} - -impl Handler { - #[allow(deprecated)] - fn new( - client_tx: crossbeam_channel::Sender, - event_loop: &mut mio::deprecated::EventLoop, - ) -> io::Result { - let host = config::SERVER_HOST; - let port = config::SERVER_PORT; - let server_stream = - Stream::new((host, port), ServerResponseSender(client_tx.clone()))?; - - info!("Connected to server at {}:{}", host, port); - - let listener = listener_bind((config::LISTEN_HOST, config::LISTEN_PORT))?; - info!( - "Listening for connections on {}:{}", - config::LISTEN_HOST, - config::LISTEN_PORT - ); - - event_loop.register( - server_stream.evented(), - mio::Token(SERVER_TOKEN), - mio::Ready::all(), - mio::PollOpt::edge() | mio::PollOpt::oneshot(), - )?; - - event_loop.register( - &listener, - mio::Token(LISTEN_TOKEN), - mio::Ready::all(), - mio::PollOpt::edge() | mio::PollOpt::oneshot(), - )?; - - Ok(Handler { - server_stream: server_stream, - - peer_streams: slab::Slab::new(config::MAX_PEERS), - - listener: listener, - - client_tx: client_tx, - }) - } - - #[allow(deprecated)] - fn connect_to_peer( - &mut self, - peer_id: usize, - ip: net::Ipv4Addr, - port: u16, - event_loop: &mut mio::deprecated::EventLoop, - ) -> Result<(), String> { - let vacant_entry = match self.peer_streams.entry(peer_id) { - None => return Err("id out of range".to_string()), - - Some(slab::Entry::Occupied(_occupied_entry)) => { - return Err("id already taken".to_string()); - } - - Some(slab::Entry::Vacant(vacant_entry)) => vacant_entry, - }; - - info!("Opening peer connection {} to {}:{}", peer_id, ip, port); - - let sender = PeerResponseSender { - sender: self.client_tx.clone(), - peer_id: peer_id, - }; - - let peer_stream = match Stream::new((ip, port), sender) { - Ok(peer_stream) => peer_stream, - - Err(err) => return Err(format!("i/o error: {}", err)), - }; - - event_loop - .register( - peer_stream.evented(), - mio::Token(peer_id), - mio::Ready::all(), - mio::PollOpt::edge() | mio::PollOpt::oneshot(), - ) - .unwrap(); - - vacant_entry.insert(peer_stream); - - Ok(()) - } - - #[allow(deprecated)] - fn process_server_intent( - &mut self, - intent: Intent, - event_loop: &mut mio::deprecated::EventLoop, - ) { - match intent { - Intent::Done => { - error!("Server connection closed"); - // TODO notify client and shut down - } - Intent::Continue(event_set) => { - event_loop - .reregister( - self.server_stream.evented(), - mio::Token(SERVER_TOKEN), - event_set, - mio::PollOpt::edge() | mio::PollOpt::oneshot(), - ) - .unwrap(); - } - } - } - - #[allow(deprecated)] - fn process_peer_intent( - &mut self, - intent: Intent, - token: mio::Token, - event_loop: &mut mio::deprecated::EventLoop, - ) { - match intent { - Intent::Done => { - self.peer_streams.remove(token.0); - self - .client_tx - .send(Response::PeerConnectionClosed(token.0)) - .unwrap(); - } - - Intent::Continue(event_set) => { - if let Some(peer_stream) = self.peer_streams.get_mut(token.0) { - event_loop - .reregister( - peer_stream.evented(), - token, - event_set, - mio::PollOpt::edge() | mio::PollOpt::oneshot(), - ) - .unwrap(); - } - } - } - } -} - -#[allow(deprecated)] -impl mio::deprecated::Handler for Handler { - type Timeout = (); - type Message = Request; - - fn ready( - &mut self, - event_loop: &mut mio::deprecated::EventLoop, - token: mio::Token, - event_set: mio::Ready, - ) { - match token { - mio::Token(LISTEN_TOKEN) => { - if event_set.is_readable() { - // A peer wants to connect to us. - match self.listener.accept() { - Ok((_sock, addr)) => { - // TODO add it to peer streams - info!("Peer connection accepted from {}", addr); - } - - Err(err) => { - error!("Cannot accept peer connection: {}", err); - } - } - } - event_loop - .reregister( - &self.listener, - token, - mio::Ready::all(), - mio::PollOpt::edge() | mio::PollOpt::oneshot(), - ) - .unwrap(); - } - - mio::Token(SERVER_TOKEN) => { - let intent = self.server_stream.on_ready(event_set); - self.process_server_intent(intent, event_loop); - } - - mio::Token(peer_id) => { - let intent = match self.peer_streams.get_mut(peer_id) { - Some(peer_stream) => peer_stream.on_ready(event_set), - - None => unreachable!("Unknown peer {} is ready", peer_id), - }; - self.process_peer_intent(intent, token, event_loop); - } - } - } - - fn notify( - &mut self, - event_loop: &mut mio::deprecated::EventLoop, - request: Request, - ) { - match request { - Request::PeerConnect(peer_id, ip, port) => { - if let Err(err) = self.connect_to_peer(peer_id, ip, port, event_loop) { - error!( - "Cannot open peer connection {} to {}:{}: {}", - peer_id, ip, port, err - ); - self - .client_tx - .send(Response::PeerConnectionClosed(peer_id)) - .unwrap(); - } - } - - Request::PeerMessage(peer_id, message) => { - let intent = match self.peer_streams.get_mut(peer_id) { - Some(peer_stream) => peer_stream.on_notify(&message), - None => { - error!( - "Cannot send peer message {:?}: unknown id {}", - message, peer_id - ); - return; - } - }; - self.process_peer_intent(intent, mio::Token(peer_id), event_loop); - } - - Request::ServerRequest(server_request) => { - let intent = self.server_stream.on_notify(&server_request); - self.process_server_intent(intent, event_loop); - } - } - } -} - -#[allow(deprecated)] -pub type Sender = mio::deprecated::Sender; - -pub struct Agent { - #[allow(deprecated)] - event_loop: mio::deprecated::EventLoop, - handler: Handler, -} - -impl Agent { - pub fn new( - client_tx: crossbeam_channel::Sender, - ) -> io::Result { - // Create the event loop. - #[allow(deprecated)] - let mut event_loop = mio::deprecated::EventLoop::new()?; - // Create the handler for the event loop and register the handler's - // sockets with the event loop. - let handler = Handler::new(client_tx, &mut event_loop)?; - - Ok(Agent { - event_loop: event_loop, - handler: handler, - }) - } - - pub fn channel(&self) -> Sender { - #[allow(deprecated)] - self.event_loop.channel() - } - - pub fn run(&mut self) -> io::Result<()> { - #[allow(deprecated)] - self.event_loop.run(&mut self.handler) - } -} diff --git a/proto/src/lib.rs b/proto/src/lib.rs index f09e9c5..208763d 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -1,13 +1,7 @@ pub mod config; mod core; -mod handler; -mod packet; pub mod peer; pub mod server; -mod stream; pub use self::core::{User, UserStatus}; -pub use self::handler::*; -pub use self::packet::*; pub use self::server::{ServerRequest, ServerResponse}; -pub use self::stream::*; diff --git a/proto/src/peer/message.rs b/proto/src/peer/message.rs index a9444a2..f10fa83 100644 --- a/proto/src/peer/message.rs +++ b/proto/src/peer/message.rs @@ -1,15 +1,8 @@ -use std::io; - -use log::warn; - use crate::core::value::{ ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError, ValueEncoder, }; use crate::peer::constants::*; -use crate::{ - MutPacket, Packet, PacketReadError, ReadFromPacket, WriteToPacket, -}; /*=========* * MESSAGE * @@ -23,29 +16,6 @@ pub enum Message { Unknown(u32), } -impl ReadFromPacket for Message { - fn read_from_packet(packet: &mut Packet) -> Result { - let code: u32 = packet.read_value()?; - let message = match code { - CODE_PIERCE_FIREWALL => Message::PierceFirewall(packet.read_value()?), - - CODE_PEER_INIT => Message::PeerInit(packet.read_value()?), - - code => Message::Unknown(code), - }; - - let bytes_remaining = packet.bytes_remaining(); - if bytes_remaining > 0 { - warn!( - "Peer message with code {} contains {} extra bytes", - code, bytes_remaining - ) - } - - Ok(message) - } -} - impl ValueDecode for Message { fn decode_from(decoder: &mut ValueDecoder) -> Result { let position = decoder.position(); @@ -91,25 +61,6 @@ impl ValueEncode for Message { } } -impl WriteToPacket for Message { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - match *self { - Message::PierceFirewall(ref token) => { - packet.write_value(&CODE_PIERCE_FIREWALL)?; - packet.write_value(token)?; - } - - Message::PeerInit(ref request) => { - packet.write_value(&CODE_PEER_INIT)?; - packet.write_value(request)?; - } - - Message::Unknown(_) => unreachable!(), - } - Ok(()) - } -} - #[derive(Clone, Debug, Eq, PartialEq)] pub struct PeerInit { pub user_name: String, @@ -117,28 +68,6 @@ pub struct PeerInit { pub token: u32, } -impl ReadFromPacket for PeerInit { - fn read_from_packet(packet: &mut Packet) -> Result { - let user_name = packet.read_value()?; - let connection_type = packet.read_value()?; - let token = packet.read_value()?; - Ok(PeerInit { - user_name, - connection_type, - token, - }) - } -} - -impl WriteToPacket for PeerInit { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.user_name)?; - packet.write_value(&self.connection_type)?; - packet.write_value(&self.token)?; - Ok(()) - } -} - impl ValueEncode for PeerInit { fn encode_to( &self, diff --git a/proto/src/server/request.rs b/proto/src/server/request.rs index 5c3d64f..a8cdc07 100644 --- a/proto/src/server/request.rs +++ b/proto/src/server/request.rs @@ -1,10 +1,7 @@ -use std::io; - use crate::core::value::{ ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError, ValueEncoder, }; -use crate::packet::{MutPacket, WriteToPacket}; use crate::server::constants::*; /*================* @@ -86,67 +83,6 @@ impl From for ServerRequest { } } -impl WriteToPacket for ServerRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - match *self { - ServerRequest::CannotConnectRequest(ref request) => { - packet.write_value(&CODE_CANNOT_CONNECT)?; - packet.write_value(request)?; - } - - ServerRequest::ConnectToPeerRequest(ref request) => { - packet.write_value(&CODE_CONNECT_TO_PEER)?; - packet.write_value(request)?; - } - - ServerRequest::FileSearchRequest(ref request) => { - packet.write_value(&CODE_FILE_SEARCH)?; - packet.write_value(request)?; - } - - ServerRequest::LoginRequest(ref request) => { - packet.write_value(&CODE_LOGIN)?; - packet.write_value(request)?; - } - - ServerRequest::PeerAddressRequest(ref request) => { - packet.write_value(&CODE_PEER_ADDRESS)?; - packet.write_value(request)?; - } - - ServerRequest::RoomJoinRequest(ref request) => { - packet.write_value(&CODE_ROOM_JOIN)?; - packet.write_value(request)?; - } - - ServerRequest::RoomLeaveRequest(ref request) => { - packet.write_value(&CODE_ROOM_LEAVE)?; - packet.write_value(request)?; - } - - ServerRequest::RoomListRequest => { - packet.write_value(&CODE_ROOM_LIST)?; - } - - ServerRequest::RoomMessageRequest(ref request) => { - packet.write_value(&CODE_ROOM_MESSAGE)?; - packet.write_value(request)?; - } - - ServerRequest::SetListenPortRequest(ref request) => { - packet.write_value(&CODE_SET_LISTEN_PORT)?; - packet.write_value(request)?; - } - - ServerRequest::UserStatusRequest(ref request) => { - packet.write_value(&CODE_USER_STATUS)?; - packet.write_value(request)?; - } - } - Ok(()) - } -} - impl ValueEncode for ServerRequest { fn encode_to( &self, @@ -269,14 +205,6 @@ pub struct CannotConnectRequest { pub user_name: String, } -impl WriteToPacket for CannotConnectRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.token)?; - packet.write_value(&self.user_name)?; - Ok(()) - } -} - impl ValueEncode for CannotConnectRequest { fn encode_to( &self, @@ -306,15 +234,6 @@ pub struct ConnectToPeerRequest { pub connection_type: String, } -impl WriteToPacket for ConnectToPeerRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.token)?; - packet.write_value(&self.user_name)?; - packet.write_value(&self.connection_type)?; - Ok(()) - } -} - impl ValueEncode for ConnectToPeerRequest { fn encode_to( &self, @@ -349,14 +268,6 @@ pub struct FileSearchRequest { pub query: String, } -impl WriteToPacket for FileSearchRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.ticket)?; - packet.write_value(&self.query)?; - Ok(()) - } -} - impl ValueEncode for FileSearchRequest { fn encode_to( &self, @@ -388,17 +299,6 @@ pub struct LoginRequest { pub minor: u32, } -impl WriteToPacket for LoginRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.user_name)?; - packet.write_value(&self.password)?; - packet.write_value(&self.major)?; - packet.write_value(&self.digest)?; - packet.write_value(&self.minor)?; - Ok(()) - } -} - impl ValueEncode for LoginRequest { fn encode_to( &self, @@ -438,13 +338,6 @@ pub struct PeerAddressRequest { pub user_name: String, } -impl WriteToPacket for PeerAddressRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.user_name)?; - Ok(()) - } -} - impl ValueEncode for PeerAddressRequest { fn encode_to( &self, @@ -470,13 +363,6 @@ pub struct RoomJoinRequest { pub room_name: String, } -impl WriteToPacket for RoomJoinRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.room_name)?; - Ok(()) - } -} - impl ValueEncode for RoomJoinRequest { fn encode_to( &self, @@ -504,13 +390,6 @@ pub struct RoomLeaveRequest { pub room_name: String, } -impl WriteToPacket for RoomLeaveRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.room_name)?; - Ok(()) - } -} - impl ValueEncode for RoomLeaveRequest { fn encode_to( &self, @@ -539,14 +418,6 @@ pub struct RoomMessageRequest { pub message: String, } -impl WriteToPacket for RoomMessageRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.room_name)?; - packet.write_value(&self.message)?; - Ok(()) - } -} - impl ValueEncode for RoomMessageRequest { fn encode_to( &self, @@ -574,13 +445,6 @@ pub struct SetListenPortRequest { pub port: u16, } -impl WriteToPacket for SetListenPortRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.port)?; - Ok(()) - } -} - impl ValueEncode for SetListenPortRequest { fn encode_to( &self, @@ -606,13 +470,6 @@ pub struct UserStatusRequest { pub user_name: String, } -impl WriteToPacket for UserStatusRequest { - fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { - packet.write_value(&self.user_name)?; - Ok(()) - } -} - impl ValueEncode for UserStatusRequest { fn encode_to( &self, diff --git a/proto/src/server/response.rs b/proto/src/server/response.rs index 1d65c99..8d72c69 100644 --- a/proto/src/server/response.rs +++ b/proto/src/server/response.rs @@ -6,7 +6,6 @@ use crate::core::value::{ ValueDecode, ValueDecodeError, ValueDecoder, ValueEncode, ValueEncodeError, ValueEncoder, }; -use crate::packet::{Packet, PacketReadError, ReadFromPacket}; use crate::server::constants::*; use crate::{User, UserStatus}; @@ -39,83 +38,6 @@ pub enum ServerResponse { UnknownResponse(u32), } -impl ReadFromPacket for ServerResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let code: u32 = packet.read_value()?; - let resp = match code { - CODE_CONNECT_TO_PEER => { - ServerResponse::ConnectToPeerResponse(packet.read_value()?) - } - - CODE_FILE_SEARCH => { - ServerResponse::FileSearchResponse(packet.read_value()?) - } - - CODE_LOGIN => ServerResponse::LoginResponse(packet.read_value()?), - - CODE_PEER_ADDRESS => { - ServerResponse::PeerAddressResponse(packet.read_value()?) - } - - CODE_PRIVILEGED_USERS => { - ServerResponse::PrivilegedUsersResponse(packet.read_value()?) - } - - CODE_ROOM_JOIN => ServerResponse::RoomJoinResponse(packet.read_value()?), - - CODE_ROOM_LEAVE => { - ServerResponse::RoomLeaveResponse(packet.read_value()?) - } - - CODE_ROOM_LIST => ServerResponse::RoomListResponse(packet.read_value()?), - - CODE_ROOM_MESSAGE => { - ServerResponse::RoomMessageResponse(packet.read_value()?) - } - - CODE_ROOM_TICKERS => { - ServerResponse::RoomTickersResponse(packet.read_value()?) - } - - CODE_ROOM_USER_JOINED => { - ServerResponse::RoomUserJoinedResponse(packet.read_value()?) - } - - CODE_ROOM_USER_LEFT => { - ServerResponse::RoomUserLeftResponse(packet.read_value()?) - } - - CODE_USER_INFO => ServerResponse::UserInfoResponse(packet.read_value()?), - - CODE_USER_STATUS => { - ServerResponse::UserStatusResponse(packet.read_value()?) - } - - CODE_WISHLIST_INTERVAL => { - ServerResponse::WishlistIntervalResponse(packet.read_value()?) - } - - CODE_PARENT_MIN_SPEED => { - ServerResponse::ParentMinSpeedResponse(packet.read_value()?) - } - - CODE_PARENT_SPEED_RATIO => { - ServerResponse::ParentSpeedRatioResponse(packet.read_value()?) - } - - code => ServerResponse::UnknownResponse(code), - }; - let bytes_remaining = packet.bytes_remaining(); - if bytes_remaining > 0 { - warn!( - "Packet with code {} contains {} extra bytes", - code, bytes_remaining - ) - } - Ok(resp) - } -} - impl ValueEncode for ServerResponse { fn encode_to( &self, @@ -303,26 +225,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for ConnectToPeerResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let user_name = packet.read_value()?; - let connection_type = packet.read_value()?; - let ip = packet.read_value()?; - let port = packet.read_value()?; - let token = packet.read_value()?; - let is_privileged = packet.read_value()?; - - Ok(ConnectToPeerResponse { - user_name, - connection_type, - ip, - port, - token, - is_privileged, - }) - } -} - impl ValueEncode for ConnectToPeerResponse { fn encode_to( &self, @@ -374,20 +276,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for FileSearchResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let user_name = packet.read_value()?; - let ticket = packet.read_value()?; - let query = packet.read_value()?; - - Ok(FileSearchResponse { - user_name, - ticket, - query, - }) - } -} - impl ValueEncode for FileSearchResponse { fn encode_to( &self, @@ -435,31 +323,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for LoginResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let ok = packet.read_value()?; - if ok { - let motd = packet.read_value()?; - let ip = packet.read_value()?; - - match packet.read_value::() { - Ok(value) => debug!("LoginResponse last field: {}", value), - Err(e) => debug!("Error reading LoginResponse field: {:?}", e), - } - - Ok(LoginResponse::LoginOk { - motd, - ip, - password_md5_opt: None, - }) - } else { - Ok(LoginResponse::LoginFail { - reason: packet.read_value()?, - }) - } - } -} - impl ValueEncode for LoginResponse { fn encode_to( &self, @@ -524,13 +387,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for ParentMinSpeedResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let value = packet.read_value()?; - Ok(ParentMinSpeedResponse { value }) - } -} - impl ValueEncode for ParentMinSpeedResponse { fn encode_to( &self, @@ -562,13 +418,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for ParentSpeedRatioResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let value = packet.read_value()?; - Ok(ParentSpeedRatioResponse { value }) - } -} - impl ValueEncode for ParentSpeedRatioResponse { fn encode_to( &self, @@ -602,20 +451,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for PeerAddressResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let user_name = packet.read_value()?; - let ip = packet.read_value()?; - let port = packet.read_value()?; - - Ok(PeerAddressResponse { - user_name, - ip, - port, - }) - } -} - impl ValueEncode for PeerAddressResponse { fn encode_to( &self, @@ -655,13 +490,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for PrivilegedUsersResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let users = packet.read_value()?; - Ok(PrivilegedUsersResponse { users }) - } -} - impl ValueEncode for PrivilegedUsersResponse { fn encode_to( &self, @@ -696,100 +524,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for RoomJoinResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let mut response = RoomJoinResponse { - room_name: packet.read_value()?, - users: Vec::new(), - owner: None, - operators: Vec::new(), - }; - - let num_users: usize = packet.read_value()?; - for _ in 0..num_users { - let name: String = packet.read_value()?; - let user = User { - name, - status: UserStatus::Offline, - average_speed: 0, - num_downloads: 0, - unknown: 0, - num_files: 0, - num_folders: 0, - num_free_slots: 0, - country: String::new(), - }; - response.users.push(user); - } - - response.read_user_infos(packet)?; - - if packet.bytes_remaining() > 0 { - response.owner = Some(packet.read_value()?); - - let num_operators: usize = packet.read_value()?; - for _ in 0..num_operators { - response.operators.push(packet.read_value()?); - } - } - - Ok(response) - } -} - -impl RoomJoinResponse { - fn read_user_infos( - &mut self, - packet: &mut Packet, - ) -> Result<(), PacketReadError> { - let num_statuses: usize = packet.read_value()?; - for i in 0..num_statuses { - if let Some(user) = self.users.get_mut(i) { - user.status = packet.read_value()?; - } - } - - let num_infos: usize = packet.read_value()?; - for i in 0..num_infos { - if let Some(user) = self.users.get_mut(i) { - user.average_speed = packet.read_value()?; - user.num_downloads = packet.read_value()?; - user.unknown = packet.read_value()?; - user.num_files = packet.read_value()?; - user.num_folders = packet.read_value()?; - } - } - - let num_free_slots: usize = packet.read_value()?; - for i in 0..num_free_slots { - if let Some(user) = self.users.get_mut(i) { - user.num_free_slots = packet.read_value()?; - } - } - - let num_countries: usize = packet.read_value()?; - for i in 0..num_countries { - if let Some(user) = self.users.get_mut(i) { - user.country = packet.read_value()?; - } - } - - let num_users = self.users.len(); - if num_users != num_statuses - || num_users != num_infos - || num_users != num_free_slots - || num_users != num_countries - { - warn!( - "RoomJoinResponse: mismatched vector sizes {}, {}, {}, {}, {}", - num_users, num_statuses, num_infos, num_free_slots, num_countries - ); - } - - Ok(()) - } -} - // This struct is defined to enable decoding a vector of such values for // `RoomJoinResponse`, but its data is inlined in the `User` struct. // For details about individual fields, see said `User` struct. @@ -974,14 +708,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for RoomLeaveResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - Ok(RoomLeaveResponse { - room_name: packet.read_value()?, - }) - } -} - impl ValueEncode for RoomLeaveResponse { fn encode_to( &self, @@ -1016,49 +742,7 @@ impl From for ServerResponse { } } -impl ReadFromPacket for RoomListResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let rooms = Self::read_rooms(packet)?; - let owned_private_rooms = Self::read_rooms(packet)?; - let other_private_rooms = Self::read_rooms(packet)?; - let operated_private_room_names = packet.read_value()?; - Ok(RoomListResponse { - rooms, - owned_private_rooms, - other_private_rooms, - operated_private_room_names, - }) - } -} - impl RoomListResponse { - fn read_rooms( - packet: &mut Packet, - ) -> Result, PacketReadError> { - let num_rooms: usize = packet.read_value()?; - let mut rooms = Vec::new(); - for _ in 0..num_rooms { - let room_name = packet.read_value()?; - rooms.push((room_name, 0)); - } - - let num_user_counts: usize = packet.read_value()?; - for i in 0..num_user_counts { - if let Some(&mut (_, ref mut count)) = rooms.get_mut(i) { - *count = packet.read_value()?; - } - } - - if num_rooms != num_user_counts { - warn!( - "Numbers of rooms and user counts do not match: {} != {}", - num_rooms, num_user_counts - ); - } - - Ok(rooms) - } - fn build_rooms( mut room_names: Vec, mut user_counts: Vec, @@ -1163,19 +847,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for RoomMessageResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let room_name = packet.read_value()?; - let user_name = packet.read_value()?; - let message = packet.read_value()?; - Ok(RoomMessageResponse { - room_name, - user_name, - message, - }) - } -} - impl ValueEncode for RoomMessageResponse { fn encode_to( &self, @@ -1216,22 +887,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for RoomTickersResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let room_name = packet.read_value()?; - - let num_tickers: usize = packet.read_value()?; - let mut tickers = Vec::new(); - for _ in 0..num_tickers { - let user_name = packet.read_value()?; - let message = packet.read_value()?; - tickers.push((user_name, message)) - } - - Ok(RoomTickersResponse { room_name, tickers }) - } -} - impl ValueEncode for RoomTickersResponse { fn encode_to( &self, @@ -1266,39 +921,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for RoomUserJoinedResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let room_name = packet.read_value()?; - let user_name = packet.read_value()?; - - let status = packet.read_value()?; - - let average_speed = packet.read_value()?; - let num_downloads = packet.read_value()?; - let unknown = packet.read_value()?; - let num_files = packet.read_value()?; - let num_folders = packet.read_value()?; - let num_free_slots = packet.read_value()?; - - let country = packet.read_value()?; - - Ok(RoomUserJoinedResponse { - room_name, - user: User { - name: user_name, - status, - average_speed, - num_downloads, - unknown, - num_files, - num_folders, - num_free_slots, - country, - }, - }) - } -} - impl ValueEncode for RoomUserJoinedResponse { fn encode_to( &self, @@ -1344,17 +966,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for RoomUserLeftResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let room_name = packet.read_value()?; - let user_name = packet.read_value()?; - Ok(RoomUserLeftResponse { - room_name, - user_name, - }) - } -} - impl ValueEncode for RoomUserLeftResponse { fn encode_to( &self, @@ -1395,23 +1006,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for UserInfoResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let user_name = packet.read_value()?; - let average_speed = packet.read_value()?; - let num_downloads = packet.read_value()?; - let num_files = packet.read_value()?; - let num_folders = packet.read_value()?; - Ok(UserInfoResponse { - user_name, - average_speed, - num_downloads, - num_files, - num_folders, - }) - } -} - impl ValueEncode for UserInfoResponse { fn encode_to( &self, @@ -1459,19 +1053,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for UserStatusResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let user_name = packet.read_value()?; - let status = packet.read_value()?; - let is_privileged = packet.read_value()?; - Ok(UserStatusResponse { - user_name, - status, - is_privileged, - }) - } -} - impl ValueEncode for UserStatusResponse { fn encode_to( &self, @@ -1511,13 +1092,6 @@ impl From for ServerResponse { } } -impl ReadFromPacket for WishlistIntervalResponse { - fn read_from_packet(packet: &mut Packet) -> Result { - let seconds = packet.read_value()?; - Ok(WishlistIntervalResponse { seconds }) - } -} - impl ValueEncode for WishlistIntervalResponse { fn encode_to( &self,