Solstice client.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

294 lines
7.3 KiB

use std::io;
use crypto::md5::Md5;
use crypto::digest::Digest;
use super::constants::*;
use super::super::packet::{MutPacket, WriteToPacket};
/*================*
* SERVER REQUEST *
*================*/
#[derive(Debug)]
pub enum ServerRequest {
CannotConnectRequest(CannotConnectRequest),
ConnectToPeerRequest(ConnectToPeerRequest),
FileSearchRequest(FileSearchRequest),
LoginRequest(LoginRequest),
PeerAddressRequest(PeerAddressRequest),
RoomJoinRequest(RoomJoinRequest),
RoomLeaveRequest(RoomLeaveRequest),
RoomListRequest,
RoomMessageRequest(RoomMessageRequest),
SetListenPortRequest(SetListenPortRequest),
UserStatusRequest(UserStatusRequest),
}
impl WriteToPacket for ServerRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
match *self {
ServerRequest::CannotConnectRequest(ref request) => {
try!(packet.write_value(&CODE_CANNOT_CONNECT));
try!(packet.write_value(request));
}
ServerRequest::ConnectToPeerRequest(ref request) => {
try!(packet.write_value(&CODE_CONNECT_TO_PEER));
try!(packet.write_value(request));
}
ServerRequest::FileSearchRequest(ref request) => {
try!(packet.write_value(&CODE_FILE_SEARCH));
try!(packet.write_value(request));
}
ServerRequest::LoginRequest(ref request) => {
try!(packet.write_value(&CODE_LOGIN));
try!(packet.write_value(request));
}
ServerRequest::PeerAddressRequest(ref request) => {
try!(packet.write_value(&CODE_PEER_ADDRESS));
try!(packet.write_value(request));
}
ServerRequest::RoomJoinRequest(ref request) => {
try!(packet.write_value(&CODE_ROOM_JOIN));
try!(packet.write_value(request));
}
ServerRequest::RoomLeaveRequest(ref request) => {
try!(packet.write_value(&CODE_ROOM_LEAVE));
try!(packet.write_value(request));
}
ServerRequest::RoomListRequest => {
try!(packet.write_value(&CODE_ROOM_LIST));
}
ServerRequest::RoomMessageRequest(ref request) => {
try!(packet.write_value(&CODE_ROOM_MESSAGE));
try!(packet.write_value(request));
}
ServerRequest::SetListenPortRequest(ref request) => {
try!(packet.write_value(&CODE_SET_LISTEN_PORT));
try!(packet.write_value(request));
}
ServerRequest::UserStatusRequest(ref request) => {
try!(packet.write_value(&CODE_USER_STATUS));
try!(packet.write_value(request));
}
}
Ok(())
}
}
fn md5_str(string: &str) -> String {
let mut hasher = Md5::new();
hasher.input_str(string);
hasher.result_str()
}
/*================*
* CANNOT CONNECT *
*================*/
#[derive(Debug)]
pub struct CannotConnectRequest {
pub token: u32,
pub user_name: String,
}
impl WriteToPacket for CannotConnectRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.token));
try!(packet.write_value(&self.user_name));
Ok(())
}
}
/*=================*
* CONNECT TO PEER *
*=================*/
#[derive(Debug)]
pub struct ConnectToPeerRequest {
pub token: u32,
pub user_name: String,
pub connection_type: String,
}
impl WriteToPacket for ConnectToPeerRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.token));
try!(packet.write_value(&self.user_name));
try!(packet.write_value(&self.connection_type));
Ok(())
}
}
/*=============*
* FILE SEARCH *
*=============*/
#[derive(Debug)]
pub struct FileSearchRequest {
pub ticket: u32,
pub query: String,
}
impl WriteToPacket for FileSearchRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.ticket));
try!(packet.write_value(&self.query));
Ok(())
}
}
/*=======*
* LOGIN *
*=======*/
#[derive(Debug)]
pub struct LoginRequest {
username: String,
password: String,
major: u32,
minor: u32,
}
impl LoginRequest {
pub fn new(
username: &str,
password: &str,
major: u32,
minor: u32,
) -> Result<Self, &'static str> {
if password.len() > 0 {
Ok(LoginRequest {
username: username.to_string(),
password: password.to_string(),
major: major,
minor: minor,
})
} else {
Err("Empty password")
}
}
}
impl WriteToPacket for LoginRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
let userpass = String::new() + &self.username + &self.password;
let userpass_md5 = md5_str(&userpass);
try!(packet.write_value(&self.username));
try!(packet.write_value(&self.password));
try!(packet.write_value(&self.major));
try!(packet.write_value(&userpass_md5));
try!(packet.write_value(&self.minor));
Ok(())
}
}
/*==============*
* PEER ADDRESS *
*==============*/
#[derive(Debug)]
pub struct PeerAddressRequest {
pub username: String,
}
impl WriteToPacket for PeerAddressRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.username));
Ok(())
}
}
/*===========*
* ROOM JOIN *
*===========*/
#[derive(Debug)]
pub struct RoomJoinRequest {
pub room_name: String,
}
impl WriteToPacket for RoomJoinRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.room_name));
Ok(())
}
}
/*============*
* ROOM LEAVE *
*============*/
#[derive(Debug)]
pub struct RoomLeaveRequest {
pub room_name: String,
}
impl WriteToPacket for RoomLeaveRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.room_name));
Ok(())
}
}
/*==============*
* ROOM MESSAGE *
*==============*/
#[derive(Debug)]
pub struct RoomMessageRequest {
pub room_name: String,
pub message: String,
}
impl WriteToPacket for RoomMessageRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.room_name));
try!(packet.write_value(&self.message));
Ok(())
}
}
/*=================*
* SET LISTEN PORT *
*=================*/
#[derive(Debug)]
pub struct SetListenPortRequest {
pub port: u16,
}
impl WriteToPacket for SetListenPortRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.port));
Ok(())
}
}
/*=============*
* USER STATUS *
*=============*/
#[derive(Debug)]
pub struct UserStatusRequest {
pub user_name: String,
}
impl WriteToPacket for UserStatusRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
try!(packet.write_value(&self.user_name));
Ok(())
}
}