diff --git a/client-gui/src/gui_app.rs b/client-gui/src/gui_app.rs index 2da5513..09d3797 100644 --- a/client-gui/src/gui_app.rs +++ b/client-gui/src/gui_app.rs @@ -6,6 +6,7 @@ use crossbeam_channel::{Receiver, Sender}; use egui::{ Align, Align2, Button, CentralPanel, CollapsingHeader, Context, Id, LayerId, Layout, Order, Popup, ScrollArea, SidePanel, TextStyle, TopBottomPanel, Ui, ViewportCommand, + debug_text::print, }; use std::{collections::HashMap, fmt::format}; @@ -120,8 +121,36 @@ impl eframe::App for P2PClientApp { self.known_peers = peers; } - NetworkEvent::FileTreeReceived(node_hash, merklenode) => { - //self.status_message = "🔄 File tree updated successfully.".to_string(); + + NetworkEvent::FileTreeReceived(node_hash, merklenode, ip) => { + match &self.active_peer { + Some(active_peer) => { + if let Some(maptree) = self.loaded_fs.get_mut(active_peer) { + maptree.data.insert(node_hash, merklenode.clone()); + match merklenode { + MerkleNode::Directory(d) => { + for entry in d.entries { + let _ = self.network_cmd_tx.send( + NetworkCommand::GetChildren( + entry.content_hash, + ip.clone(), + ), + ); + } + } + MerkleNode::BigDirectory(bigd) => { + for entry in bigd.children_hashes { + let _ = self.network_cmd_tx.send( + NetworkCommand::GetChildren(entry, ip.clone()), + ); + } + } + _ => {} + } + } + } + None => {} + } } NetworkEvent::FileTreeRootReceived(peer_id, root_hash) => { // todo!(); @@ -133,8 +162,10 @@ impl eframe::App for P2PClientApp { );*/ if let Ok(chunknode) = ChunkNode::new(Vec::new()) { - let mut data_map: HashMap = HashMap::new(); - data_map.insert(root_hash, MerkleNode::Chunk(chunknode)); + let data_map: HashMap = HashMap::new(); + //data_map.insert(root_hash, MerkleNode::Chunk(chunknode)); + println!("len root: {}", data_map.len()); + println!("node hash: {:?}", root_hash.to_vec()); let tree = MerkleTree { data: data_map, root: root_hash, @@ -242,64 +273,7 @@ impl eframe::App for P2PClientApp { } _ => {} } - - /* ui.horizontal(|ui| { - ui.label("Server peer name:"); - ui.text_edit_singleline(&mut self.connect_server_name_input); - if ui.button("Connect").clicked() { - let addr = self.connect_address_input.clone(); - let serv_name = self.connect_server_name_input.clone(); - let _ = self - .network_cmd_tx - .send(NetworkCommand::ConnectToServer(addr, serv_name)); - self.server_status = ServerStatus::Loading; - ui.close(); - } - });*/ }); - - // état - - /*if ui.button("Network").clicked() { - self.show_network_popup = true; - }*/ - - /*if self.show_network_popup { - egui::Window::new("Network") - .collapsible(false) - .resizable(false) - .show(ctx, |ui| { - ui.horizontal_wrapped(|ui| { - ui.with_layout( - egui::Layout::right_to_left(egui::Align::TOP), - |ui| { - if ui.button("✕").clicked() { - self.show_network_popup = false; - } - }, - ); - }); - ui.horizontal(|ui| { - ui.label("Server IP:"); - ui.text_edit_singleline(&mut self.connect_address_input); - }); - ui.horizontal(|ui| { - ui.label("Server peer name:"); - ui.text_edit_singleline(&mut self.connect_server_name_input); - if ui.button("Connect").clicked() { - // envoyer commande... - let addr = self.connect_address_input.clone(); - let serv_name = self.connect_server_name_input.clone(); - let _ = self - .network_cmd_tx - .send(NetworkCommand::ConnectToServer(addr, serv_name)); - self.server_status = ServerStatus::Loading; - - self.show_network_popup = false; - } - }); - }); - }*/ }); }); @@ -514,11 +488,12 @@ impl P2PClientApp { if let Some(current) = tree.data.get(&to_draw) { let name = { if filename.is_some() { - filename_to_string(filename.unwrap()) + String::from_utf8(filename.unwrap().to_vec()).expect("err") } else { node_hash_to_hex_string(&to_draw) } }; + match current { MerkleNode::Chunk(node) => { if ui @@ -544,13 +519,7 @@ impl P2PClientApp { entry.content_hash, tree, depth + 1, - Some( - entry - .filename - .as_slice() - .try_into() - .expect("incorrect size"), - ), + Some(entry.filename.try_into().expect("incorrect size")), ); } }); diff --git a/client-network/src/datum_parsing.rs b/client-network/src/datum_parsing.rs index 25503f4..c22b3a6 100644 --- a/client-network/src/datum_parsing.rs +++ b/client-network/src/datum_parsing.rs @@ -11,9 +11,9 @@ pub fn parse_received_datum( datum_length: usize, ) -> Option<([u8; 32], MerkleNode)> { let hash_name: [u8; 32] = recevied_datum[..32].try_into().expect("error"); - let sigstart = datum_length - 64; - let value = &recevied_datum[32..sigstart]; + let value = &recevied_datum[32..datum_length]; let value_slice = value.to_vec(); + println!("valueslice: {:?}, {}", value_slice, value_slice.len()); let datum_type = value_slice[0]; match datum_type { CHUNK => Some(( @@ -21,14 +21,17 @@ pub fn parse_received_datum( MerkleNode::Chunk(crate::ChunkNode { data: value_slice }), )), DIRECTORY => { - let nb_entries = value_slice[1]; let mut dir_entries = Vec::new(); let mut offset = 1 as usize; - for i in 0..nb_entries { - offset = (offset as u8 + 64 * i) as usize; - let name = &recevied_datum[offset..offset + 32]; + for i in 0..((value_slice.len() - 1) / 64) as u8 { + offset = (1 + 64 * i as usize) as usize; + println!("offset:{}, i:{}", offset, i); + let name = &value_slice[offset..offset + 32]; let mut hash = [0u8; 32]; - hash.copy_from_slice(&recevied_datum[offset + 32..offset + 64]); + hash.copy_from_slice(&value_slice[offset + 32..offset + 64]); + let dp_name = String::from_utf8(name.to_vec()).expect("err"); + println!("name:{}", dp_name); + // envoyer un datum request dir_entries.push(DirectoryEntry { filename: name.try_into().expect("incorrect size"), @@ -62,19 +65,18 @@ pub fn parse_received_datum( );*/ } BIGDIRECTORY => { - let nb_entries = value_slice[1]; - let mut dir_entries = Vec::new(); + let mut bigdir_entries: Vec = Vec::new(); let mut offset = 1 as usize; - for i in 0..nb_entries { - offset = (offset as u8 + 64 * i) as usize; - let name = &recevied_datum[offset..offset + 32]; - let mut hash = [0u8; 32]; - hash.copy_from_slice(&recevied_datum[offset + 32..offset + 64]); + for i in 0..((value_slice.len() - 1) / 32) as u8 { + offset = (1 + 32 * i as usize) as usize; + println!("offset:{}, i:{}", offset, i); + let hash = &value_slice[offset..offset + 32]; + // envoyer un datum request - dir_entries.push(hash); + bigdir_entries.push(hash.try_into().expect("incorrect size")); } - let current = BigDirectoryNode::new(dir_entries); + let current = BigDirectoryNode::new(bigdir_entries); match current { Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))), Err(e) => { diff --git a/client-network/src/lib.rs b/client-network/src/lib.rs index 4f9a03d..7aa9b45 100644 --- a/client-network/src/lib.rs +++ b/client-network/src/lib.rs @@ -16,7 +16,8 @@ use crate::{ message_handling::EventType, messages_channels::{MultipleSenders, start_receving_thread, start_retry_thread}, messages_structure::{ - NATTRAVERSALREQUEST, NATTRAVERSALREQUEST2, PING, ROOTREQUEST, construct_message, + DATUMREQUEST, NATTRAVERSALREQUEST, NATTRAVERSALREQUEST2, PING, ROOTREQUEST, + construct_message, }, peers_refresh::HandshakeHistory, registration::{parse_addresses, perform_handshake, register_with_the_server}, @@ -147,7 +148,7 @@ pub enum NetworkCommand { Disconnect(), ResetServerPeer(), Discover(String, String, String), - GetChildren(String, String), + GetChildren([u8; 32], String), // ... } @@ -159,7 +160,7 @@ pub enum NetworkEvent { Error(String), PeerConnected(String), PeerListUpdated(Vec<(String, bool)>), - FileTreeReceived([u8; 32], MerkleNode), // peer_id, content + FileTreeReceived([u8; 32], MerkleNode, String), // peer_id, content DataReceived(String, MerkleNode), FileTreeRootReceived(String, NodeHash), HandshakeFailed(), @@ -289,8 +290,37 @@ pub fn start_p2p_executor( println!("no shared data"); } } - NetworkCommand::GetChildren(username, hash) => { - // envoie un datum request au peer + NetworkCommand::GetChildren(hash, ip) => { + if let Some(sd) = shared_data.as_ref() { + let mut payload = Vec::new(); + payload.extend_from_slice(&hash); + let new_id = generate_id(); + let datumreqest = construct_message( + DATUMREQUEST, + payload, + new_id, + sd.cryptopair_ref(), + ); + match datumreqest { + None => {} + Some(resp_msg) => { + sd.add_message(new_id, EventType::DatumRequest); + println!("msg_sent:{:?}", resp_msg); + sd.senders_ref().add_message_to_retry_queue( + resp_msg.clone(), + ip.clone(), + false, + ); + + sd.senders_ref().send_dispatch( + resp_msg, + ip.clone(), + false, + sd.messages_list(), + ); + } + } + } } NetworkCommand::RequestDirectoryContent(_, _) => { println!("[Network] RequestDirectoryContent() called"); diff --git a/client-network/src/message_handling.rs b/client-network/src/message_handling.rs index f5491b0..4c7a220 100644 --- a/client-network/src/message_handling.rs +++ b/client-network/src/message_handling.rs @@ -420,8 +420,11 @@ pub fn parse_message( parse_received_datum(received_datum.to_vec(), received_length as usize); match parsed_node { Some(tuple) => { - let _ = - cmd_tx.send(NetworkEvent::FileTreeReceived(tuple.0, tuple.1)); + let _ = cmd_tx.send(NetworkEvent::FileTreeReceived( + tuple.0, + tuple.1, + ip.to_string(), + )); } None => {} } diff --git a/project.pdf b/project.pdf index 4b9eea4..ba32a46 100644 Binary files a/project.pdf and b/project.pdf differ