Browse Source

Remove mio dependency, old proto code.

wip
Titouan Rigoudy 4 years ago
parent
commit
c3cc5a26cb
13 changed files with 20 additions and 1145 deletions
  1. +0
    -2
      Cargo.lock
  2. +0
    -1
      client/Cargo.toml
  3. +17
    -51
      client/src/client.rs
  4. +3
    -16
      client/src/main.rs
  5. +0
    -1
      proto/Cargo.toml
  6. +0
    -5
      proto/src/core/constants.rs
  7. +0
    -1
      proto/src/core/mod.rs
  8. +0
    -29
      proto/src/core/user.rs
  9. +0
    -393
      proto/src/handler.rs
  10. +0
    -6
      proto/src/lib.rs
  11. +0
    -71
      proto/src/peer/message.rs
  12. +0
    -143
      proto/src/server/request.rs
  13. +0
    -426
      proto/src/server/response.rs

+ 0
- 2
Cargo.lock View File

@ -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",


+ 0
- 1
client/Cargo.toml View File

@ -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"


+ 17
- 51
client/src/client.rs View File

@ -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<solstice_proto::Request>,
proto_rx: crossbeam_channel::Receiver<solstice_proto::Response>,
proto_tx: crossbeam_channel::Sender<server::ServerRequest>,
proto_rx: crossbeam_channel::Receiver<server::ServerResponse>,
login_status: LoginStatus,
@ -63,8 +56,8 @@ impl Client {
/// through `control_rx`.
#[allow(deprecated)]
pub fn new(
proto_tx: mio::deprecated::Sender<solstice_proto::Request>,
proto_rx: crossbeam_channel::Receiver<solstice_proto::Response>,
proto_tx: crossbeam_channel::Sender<server::ServerRequest>,
proto_rx: crossbeam_channel::Receiver<server::ServerResponse>,
) -> 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) => {


+ 3
- 16
client/src/main.rs View File

@ -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();
}


+ 0
- 1
proto/Cargo.toml View File

@ -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"] }


+ 0
- 5
proto/src/core/constants.rs View File

@ -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;

+ 0
- 1
proto/src/core/mod.rs View File

@ -1,4 +1,3 @@
pub mod constants;
// TODO: Remove `pub` qualifier, depend on re-exports.
pub mod frame;
mod prefix;


+ 0
- 29
proto/src/core/user.rs View File

@ -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<Self, PacketReadError> {
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,


+ 0
- 393
proto/src/handler.rs View File

@ -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<Response>);
impl SendPacket for ServerResponseSender {
type Value = ServerResponse;
type Error = crossbeam_channel::SendError<Response>;
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<Response>,
peer_id: usize,
}
impl SendPacket for PeerResponseSender {
type Value = peer::Message;
type Error = crossbeam_channel::SendError<Response>;
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<ServerResponseSender>,
peer_streams: slab::Slab<Stream<PeerResponseSender>, usize>,
listener: mio::tcp::TcpListener,
client_tx: crossbeam_channel::Sender<Response>,
}
fn listener_bind<U>(addr_spec: U) -> io::Result<mio::tcp::TcpListener>
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<Response>,
event_loop: &mut mio::deprecated::EventLoop<Self>,
) -> io::Result<Self> {
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<Self>,
) -> 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<Self>,
) {
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<Self>,
) {
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<Self>,
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<Self>,
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<Request>;
pub struct Agent {
#[allow(deprecated)]
event_loop: mio::deprecated::EventLoop<Handler>,
handler: Handler,
}
impl Agent {
pub fn new(
client_tx: crossbeam_channel::Sender<Response>,
) -> io::Result<Self> {
// 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)
}
}

+ 0
- 6
proto/src/lib.rs View File

@ -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::*;

+ 0
- 71
proto/src/peer/message.rs View File

@ -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<Self, PacketReadError> {
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<Self, ValueDecodeError> {
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<Self, PacketReadError> {
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,


+ 0
- 143
proto/src/server/request.rs View File

@ -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<UserStatusRequest> 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,


+ 0
- 426
proto/src/server/response.rs View File

@ -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<Self, PacketReadError> {
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<ConnectToPeerResponse> for ServerResponse {
}
}
impl ReadFromPacket for ConnectToPeerResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<FileSearchResponse> for ServerResponse {
}
}
impl ReadFromPacket for FileSearchResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<LoginResponse> for ServerResponse {
}
}
impl ReadFromPacket for LoginResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let ok = packet.read_value()?;
if ok {
let motd = packet.read_value()?;
let ip = packet.read_value()?;
match packet.read_value::<bool>() {
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<ParentMinSpeedResponse> for ServerResponse {
}
}
impl ReadFromPacket for ParentMinSpeedResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let value = packet.read_value()?;
Ok(ParentMinSpeedResponse { value })
}
}
impl ValueEncode for ParentMinSpeedResponse {
fn encode_to(
&self,
@ -562,13 +418,6 @@ impl From<ParentSpeedRatioResponse> for ServerResponse {
}
}
impl ReadFromPacket for ParentSpeedRatioResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let value = packet.read_value()?;
Ok(ParentSpeedRatioResponse { value })
}
}
impl ValueEncode for ParentSpeedRatioResponse {
fn encode_to(
&self,
@ -602,20 +451,6 @@ impl From<PeerAddressResponse> for ServerResponse {
}
}
impl ReadFromPacket for PeerAddressResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<PrivilegedUsersResponse> for ServerResponse {
}
}
impl ReadFromPacket for PrivilegedUsersResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let users = packet.read_value()?;
Ok(PrivilegedUsersResponse { users })
}
}
impl ValueEncode for PrivilegedUsersResponse {
fn encode_to(
&self,
@ -696,100 +524,6 @@ impl From<RoomJoinResponse> for ServerResponse {
}
}
impl ReadFromPacket for RoomJoinResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<RoomLeaveResponse> for ServerResponse {
}
}
impl ReadFromPacket for RoomLeaveResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
Ok(RoomLeaveResponse {
room_name: packet.read_value()?,
})
}
}
impl ValueEncode for RoomLeaveResponse {
fn encode_to(
&self,
@ -1016,49 +742,7 @@ impl From<RoomListResponse> for ServerResponse {
}
}
impl ReadFromPacket for RoomListResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<Vec<(String, u32)>, 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<String>,
mut user_counts: Vec<u32>,
@ -1163,19 +847,6 @@ impl From<RoomMessageResponse> for ServerResponse {
}
}
impl ReadFromPacket for RoomMessageResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<RoomTickersResponse> for ServerResponse {
}
}
impl ReadFromPacket for RoomTickersResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<RoomUserJoinedResponse> for ServerResponse {
}
}
impl ReadFromPacket for RoomUserJoinedResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<RoomUserLeftResponse> for ServerResponse {
}
}
impl ReadFromPacket for RoomUserLeftResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<UserInfoResponse> for ServerResponse {
}
}
impl ReadFromPacket for UserInfoResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<UserStatusResponse> for ServerResponse {
}
}
impl ReadFromPacket for UserStatusResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
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<WishlistIntervalResponse> for ServerResponse {
}
}
impl ReadFromPacket for WishlistIntervalResponse {
fn read_from_packet(packet: &mut Packet) -> Result<Self, PacketReadError> {
let seconds = packet.read_value()?;
Ok(WishlistIntervalResponse { seconds })
}
}
impl ValueEncode for WishlistIntervalResponse {
fn encode_to(
&self,


Loading…
Cancel
Save