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:
michel
2026-07-19 18:56:19 +02:00
parent 9e050b59d9
commit f3218475dc
7 changed files with 175 additions and 4 deletions
+16 -1
View File
@@ -3,7 +3,8 @@ use crate::client::ClientOperation;
use crate::dispatcher::MessageDispatcher;
use crate::message::peer::{
FileSearchResponse, GetShareFileList, PeerInit, PlaceInQueueResponse,
QueueUploadHandler, TransferRequest, TransferResponse, UploadFailedHandler,
QueueUploadHandler, SharedDirectory, SharedFileListResponseHandler,
TransferRequest, TransferResponse, UploadFailedHandler,
};
use crate::message::server::MessageFactory;
use crate::message::{Handlers, Message, MessageReader, MessageType};
@@ -40,6 +41,8 @@ pub enum PeerMessage {
IncomingQueueUpload(String),
/// A peer asked to browse our shared files (they sent us code 4).
ShareListRequested,
/// A peer we are browsing sent us their shared-file listing (code 5).
ShareListReceived(Vec<SharedDirectory>),
/// Offer the queued file to that peer: send an upload TransferRequest.
ServeUpload {
token: u32,
@@ -153,6 +156,7 @@ impl PeerActor {
handlers.register_handler(UploadFailedHandler);
handlers.register_handler(PlaceInQueueResponse);
handlers.register_handler(QueueUploadHandler);
handlers.register_handler(SharedFileListResponseHandler);
handlers.register_handler(PeerInit);
self.dispatcher = Some(MessageDispatcher::new(
@@ -358,6 +362,17 @@ impl PeerActor {
error!("[peer_actor] forward ShareListRequested: {}", e);
}
}
PeerMessage::ShareListReceived(directories) => {
let username = self.peer_username();
if let Err(e) =
self.client_channel.send(ClientOperation::BrowseResult {
username,
directories,
})
{
error!("[peer_actor] forward BrowseResult: {}", e);
}
}
PeerMessage::RequestTransfer(download) => {
let message = MessageFactory::build_transfer_request_message(
&download.filename,