diff --git a/src/client.rs b/src/client.rs index 65b1dd4..e28b253 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,6 +1,9 @@ use crate::{ error::{Result, SoulseekRs}, - peer::{ConnectionType, DefaultPeer, DownloadPeer, NewPeer, Peer}, + peer::{ + listen::Listen, ConnectionType, DefaultPeer, DownloadPeer, NewPeer, + Peer, + }, server::{PeerAddress, Server, ServerOperation}, types::{Download, FileSearchResult}, utils::{md5, thread_pool::ThreadPool}, @@ -46,6 +49,12 @@ pub struct ClientContext { pub download_tokens: HashMap, thread_pool: ThreadPool, } +impl Default for ClientContext { + fn default() -> Self { + Self::new() + } +} + impl ClientContext { pub fn new() -> Self { Self { @@ -105,9 +114,9 @@ impl Client { server.get_address().get_port() ); - // thread::spawn(move || { - // Listen::start(2234, client_sender.clone()); - // }); + thread::spawn(move || { + Listen::start(2234, client_sender.clone()); + }); let mut unlocked_context = self.context.lock().unwrap(); unlocked_context.server_sender = Some(server.get_sender().clone()); @@ -242,14 +251,15 @@ impl Client { client_context.clone(), own_username.clone(), None, - ) + ); } ClientOperation::SearchResult(file_search) => { + trace!("[client] SearchResult {:?}", file_search); client_context .lock() .unwrap() .search_results - .push(file_search); + .push(file_search.clone()); } ClientOperation::PeerDisconnected(username) => { let mut context = client_context.lock().unwrap(); @@ -283,8 +293,10 @@ impl Client { false, own_username, ); - let filename: Option<&str> = - download.filename.split('\\').last(); + let filename: Option<&str> = download + .filename + .split('\\') + .next_back(); match filename { Some(filename) => { match download_peer.download_file( @@ -454,7 +466,7 @@ impl Client { let connect_result = match stream { Some(s) => default_peer.connect_with_socket(s), - None => default_peer.connect() + _ => default_peer.connect() }; match connect_result { diff --git a/src/main.rs b/src/main.rs index 3059ddb..b4b3ef9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,7 @@ fn main() { client.connect(); match client.login() { Ok(_) => { - match client.search("michel test file", Duration::from_secs(1)) { + match client.search("michel test file", Duration::from_secs(4)) { Ok(results) => { if let Some(result) = results.iter().find(|r| !r.files.is_empty()) diff --git a/src/message/peer/place_in_queue_response.rs b/src/message/peer/place_in_queue_response.rs index ed8cb8b..08ac7cf 100644 --- a/src/message/peer/place_in_queue_response.rs +++ b/src/message/peer/place_in_queue_response.rs @@ -13,7 +13,7 @@ impl MessageHandler for PlaceInQueueResponse { fn handle(&self, message: &mut Message, sender: Sender) { let filename = message.read_string(); - let place = message.read_int32() as u32; + let place = message.read_int32(); sender .send(PeerOperation::PlaceInQueueResponse { filename, place }) diff --git a/src/peer/default_peer.rs b/src/peer/default_peer.rs index eaeab09..c95d798 100644 --- a/src/peer/default_peer.rs +++ b/src/peer/default_peer.rs @@ -8,11 +8,12 @@ use crate::message::server::MessageFactory; use crate::message::{Handlers, Message, MessageReader, MessageType}; use crate::types::{Download, FileSearchResult, Transfer}; +use core::result::Result::Ok; use std::sync::mpsc; use std::sync::mpsc::{Receiver, Sender}; use std::thread::{self, JoinHandle}; -use crate::client::{self, ClientOperation}; +use crate::client::ClientOperation; use crate::peer::Peer; use crate::{debug, error, trace, warn}; use std::io::{self, Write}; @@ -161,7 +162,7 @@ impl DefaultPeer { let mut buffered_reader = MessageReader::new(); loop { match buffered_reader.read_from_socket(&mut read_stream) { - Ok(_) => {} + Ok(()) => {} Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { continue } @@ -213,7 +214,7 @@ impl DefaultPeer { should_terminate = true; break; } - Ok(None) => break, + Ok(_) => break, } } if should_terminate { diff --git a/src/peer/download_peer.rs b/src/peer/download_peer.rs index 9a83cdf..23ab520 100644 --- a/src/peer/download_peer.rs +++ b/src/peer/download_peer.rs @@ -63,7 +63,7 @@ impl FileManager { fn extract_filename_from_path(full_path: &str) -> String { // Split on both forward slashes and backslashes to handle Windows and Unix paths - full_path.split(['/', '\\']).last().unwrap_or(full_path).to_string() + full_path.split(['/', '\\']).next_back().unwrap_or(full_path).to_string() } fn create_download_path_from_filename( diff --git a/src/peer/listen.rs b/src/peer/listen.rs index 663e8eb..8c22ffe 100644 --- a/src/peer/listen.rs +++ b/src/peer/listen.rs @@ -4,8 +4,7 @@ use std::{io, net::TcpListener}; use crate::client::ClientOperation; use crate::message::MessageReader; -use crate::peer::NewPeer; -use crate::{debug, error, info, trace, warn}; +use crate::{debug, error, info, trace, warn, FileSearchResult}; pub struct Listen {} @@ -15,12 +14,11 @@ impl Listen { let listener = TcpListener::bind(format!("0.0.0.0:{port}")).unwrap(); for stream in listener.incoming() { let mut read_stream = stream.unwrap(); - let mut stop = false; let mut buffered_reader = MessageReader::new(); - while !stop { + loop { match buffered_reader.read_from_socket(&mut read_stream) { - Ok(_) => {} + Ok(()) => {} Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { continue } @@ -48,23 +46,38 @@ impl Listen { match message_code { 0 => { - let token = message.read_string(); - debug!("[listener] received Pierce Firewall, token: {}", token); + // let token = message.read_string(); + // debug!("[listener] received Pierce Firewall, token: {}", token); } 1 => { - let tcp_stream = - read_stream.try_clone().unwrap(); - let new_peer = NewPeer::new_from_message( - &mut message, - tcp_stream, - ); - - trace!("[listener] Handling peer init message: {:?}",new_peer); + // handle handover to default_peer with socket in the future + // let tcp_stream = + // read_stream.try_clone().unwrap(); + // + // let username = message.read_string(); + // let connection_type = + // message.read_string().parse().unwrap(); + // let token = message.read_int32(); + } + 9 => { + trace!("[listener] Handling file search response: 9",); + message.set_pointer(8); + let file_search = + match FileSearchResult::new_from_message( + &mut message, + ) { + Ok(result) => result, + Err(e) => { + trace!("[listener] malformed filesearch_result: {:?}, message: {:?}", e, message); + return; + } + }; client_sender - .send(ClientOperation::NewPeer(new_peer)) + .send(ClientOperation::SearchResult( + file_search, + )) .unwrap(); - stop = true; - debug!("[listener] stop"); + break; } _ => { debug!( diff --git a/src/utils/zlib.rs b/src/utils/zlib.rs index 8b52421..599889b 100644 --- a/src/utils/zlib.rs +++ b/src/utils/zlib.rs @@ -72,7 +72,7 @@ pub fn deflate(input: &[u8]) -> Result> { return Err(SoulseekRs::CompressionError("invalid CINFO".to_string())); } let flg = r.read_byte()?; - if ((cmf as u32) * 256 + (flg as u32)) % 31 != 0 { + if !((cmf as u32) * 256 + (flg as u32)).is_multiple_of(31) { return Err(SoulseekRs::CompressionError( "CMF+FLG checksum failed".to_string(), ));