feat: browse another user's shared files
Add Client::browse_user (sends GetShareFileList, code 4, connecting first if needed via the same queue-and-flush path as search replies) and take_browse_result. A new SharedFileListResponseHandler parses the peer's code-5 reply into SharedDirectory entries, forwarded as ClientOperation::BrowseResult and stored per user. Verified end to end: a second real client browses a sharer and receives its file listing.
This commit is contained in:
@@ -17,7 +17,8 @@ pub use peer_init::PeerInit;
|
||||
pub use place_in_queue_response::PlaceInQueueResponse;
|
||||
pub use queue_upload::QueueUploadHandler;
|
||||
pub use shared_file_list::{
|
||||
SharedDirectory, build_shared_file_list, parse_shared_file_list,
|
||||
SharedDirectory, SharedFileListResponseHandler, build_shared_file_list,
|
||||
parse_shared_file_list,
|
||||
};
|
||||
pub use transfer_request::TransferRequest;
|
||||
pub use transfer_response::TransferResponse;
|
||||
|
||||
@@ -2,8 +2,10 @@
|
||||
//! sent in reply to `GetShareFileList` (code 4). The payload is zlib-compressed
|
||||
//! and groups files by their virtual directory.
|
||||
|
||||
use crate::message::Message;
|
||||
use crate::message::{Message, MessageHandler};
|
||||
use crate::peer::PeerMessage;
|
||||
use crate::utils::zlib::{compress_stored, deflate};
|
||||
use std::sync::mpsc::Sender;
|
||||
|
||||
/// One shared directory and the files directly in it (basename + size).
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
@@ -12,6 +14,18 @@ pub struct SharedDirectory {
|
||||
pub files: Vec<(String, u64)>,
|
||||
}
|
||||
|
||||
/// Receives a peer's `SharedFileListResponse` (peer code 5) when browsing them.
|
||||
pub struct SharedFileListResponseHandler;
|
||||
impl MessageHandler<PeerMessage> for SharedFileListResponseHandler {
|
||||
fn get_code(&self) -> u8 {
|
||||
5
|
||||
}
|
||||
fn handle(&self, message: &mut Message, sender: Sender<PeerMessage>) {
|
||||
let directories = parse_shared_file_list(message);
|
||||
let _ = sender.send(PeerMessage::ShareListReceived(directories));
|
||||
}
|
||||
}
|
||||
|
||||
/// Build a `SharedFileListResponse` (peer code 5) from the directory listing.
|
||||
#[must_use]
|
||||
pub fn build_shared_file_list(dirs: &[SharedDirectory]) -> Message {
|
||||
|
||||
@@ -122,6 +122,12 @@ impl MessageFactory {
|
||||
.clone()
|
||||
}
|
||||
|
||||
/// Ask a peer for their shared-file listing (peer code 4, no body).
|
||||
#[must_use]
|
||||
pub fn build_get_share_file_list() -> Message {
|
||||
Message::new().write_int32(4).clone()
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn build_queue_upload_message(filename: &str) -> Message {
|
||||
Message::new()
|
||||
|
||||
Reference in New Issue
Block a user