From 79f523be48db1d3e5e5b811592bb77e12ccdac18 Mon Sep 17 00:00:00 2001 From: TIBERGHIEN corentin Date: Sun, 25 Jan 2026 00:55:57 +0100 Subject: [PATCH] wip bigfix --- client-gui/src/gui_app.rs | 16 ++- client-network/src/datum_parsing.rs | 145 ++++++++++++------------ client-network/src/message_handling.rs | 6 +- client-network/src/messages_channels.rs | 3 +- 4 files changed, 91 insertions(+), 79 deletions(-) diff --git a/client-gui/src/gui_app.rs b/client-gui/src/gui_app.rs index 3e380aa..5e606fe 100644 --- a/client-gui/src/gui_app.rs +++ b/client-gui/src/gui_app.rs @@ -262,6 +262,7 @@ impl eframe::App for P2PClientApp { if let Some(addr) = &self.active_peer { if let Some(roottree) = self.loaded_fs.get(addr) { if let Some(root) = roottree.data.get(&hash) { + self.current_downloading_file_map.root = hash; self.root_downloading_file = name; let _ = self .current_downloading_file_map @@ -299,11 +300,12 @@ impl eframe::App for P2PClientApp { } _ => {} } + println!("remaining chunks size: {}", self.remaining_chunks.len()); if self.remaining_chunks.is_empty() { - /*let file = OpenOptions::new() - .append(true) - .create(true) - .open(self.root_downloading_file.clone()); + let file = OpenOptions::new().append(true).create(true).open( + "./Download/".to_string() + + &remove_null_bytes(&self.root_downloading_file.clone()), + ); if let Some(current) = self .current_downloading_file_map @@ -322,8 +324,10 @@ impl eframe::App for P2PClientApp { eprintln!("error creaation file: {}", e); } } - }*/ - println!("bigfile téléchargé"); + } else { + eprintln!("error root absent"); + } + println!("bigfile téléchargé {}", self.root_downloading_file); } } NetworkEvent::Success(msg, peer_username) => { diff --git a/client-network/src/datum_parsing.rs b/client-network/src/datum_parsing.rs index 13aca63..d3f03e1 100644 --- a/client-network/src/datum_parsing.rs +++ b/client-network/src/datum_parsing.rs @@ -14,81 +14,86 @@ pub fn parse_received_datum( let value = &recevied_datum[32..recevied_datum.len()]; let value_slice = value.to_vec(); println!("valueslice: {:?}, {}", value_slice, value_slice.len()); - let datum_type = value_slice[0]; - match datum_type { - CHUNK => Some(( - hash_name, - MerkleNode::Chunk(crate::ChunkNode { data: value_slice }), - )), - DIRECTORY => { - let mut dir_entries = Vec::new(); - let mut offset = 1 as usize; - 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(&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"), - content_hash: hash, - }); - } - - let current = DirectoryNode::new(dir_entries); - match current { - Ok(current_node) => Some((hash_name, MerkleNode::Directory(current_node))), - Err(e) => { - println!("{}", e); - None - } - } - } - BIG => { - let mut bigdir_entries: Vec = Vec::new(); - let mut offset = 1 as usize; - 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 - bigdir_entries.push(hash.try_into().expect("incorrect size")); - } - - println!("its a BIG bro"); - Some(( + let digest = Sha256::digest(&value); + if digest.to_vec() != hash_name.to_vec() { + None + } else { + let datum_type = value_slice[0]; + match datum_type { + CHUNK => Some(( hash_name, - MerkleNode::Big(crate::BigNode { - children_hashes: bigdir_entries, - }), - )) - } - BIGDIRECTORY => { - let mut bigdir_entries: Vec = Vec::new(); - let mut offset = 1 as usize; - 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]; + MerkleNode::Chunk(crate::ChunkNode { data: value_slice }), + )), + DIRECTORY => { + let mut dir_entries = Vec::new(); + let mut offset = 1 as usize; + 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(&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 - bigdir_entries.push(hash.try_into().expect("incorrect size")); - } + // envoyer un datum request + dir_entries.push(DirectoryEntry { + filename: name.try_into().expect("incorrect size"), + content_hash: hash, + }); + } - let current = BigDirectoryNode::new(bigdir_entries); - match current { - Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))), - Err(e) => { - println!("{}", e); - None + let current = DirectoryNode::new(dir_entries); + match current { + Ok(current_node) => Some((hash_name, MerkleNode::Directory(current_node))), + Err(e) => { + println!("{}", e); + None + } } } + BIG => { + let mut bigdir_entries: Vec = Vec::new(); + let mut offset = 1 as usize; + 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 + bigdir_entries.push(hash.try_into().expect("incorrect size")); + } + + println!("its a BIG bro"); + Some(( + hash_name, + MerkleNode::Big(crate::BigNode { + children_hashes: bigdir_entries, + }), + )) + } + BIGDIRECTORY => { + let mut bigdir_entries: Vec = Vec::new(); + let mut offset = 1 as usize; + 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 + bigdir_entries.push(hash.try_into().expect("incorrect size")); + } + + let current = BigDirectoryNode::new(bigdir_entries); + match current { + Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))), + Err(e) => { + println!("{}", e); + None + } + } + } + _ => None, } - _ => None, } } diff --git a/client-network/src/message_handling.rs b/client-network/src/message_handling.rs index 96a41db..74f0a6e 100644 --- a/client-network/src/message_handling.rs +++ b/client-network/src/message_handling.rs @@ -468,7 +468,6 @@ pub fn parse_message( } } EventType::DatumRequestBig => { - let _ = &guard.remove_entry(&id); println!("message {} retiré de la liste", id); let received_length = u16::from_be_bytes( received_message[TYPE..LENGTH] @@ -481,6 +480,7 @@ pub fn parse_message( parse_received_datum(received_datum.to_vec(), received_length as usize); match parsed_node { Some(tuple) => { + let _ = &guard.remove_entry(&id); let _ = cmd_tx.send(NetworkEvent::DataReceived( tuple.0, tuple.1, @@ -488,7 +488,9 @@ pub fn parse_message( )); println!("datareceived event sent"); } - None => {} + None => { + println!("message corrompu, nouvelle tentative"); + } } } _ => {} diff --git a/client-network/src/messages_channels.rs b/client-network/src/messages_channels.rs index 9dd6285..33f4649 100644 --- a/client-network/src/messages_channels.rs +++ b/client-network/src/messages_channels.rs @@ -234,7 +234,8 @@ pub fn start_retry_thread( ); let base: u64 = 2; - let backoff = base.saturating_pow(attempt as u32); // 2^1 == 2 seconds + // let backoff = base.saturating_pow(attempt as u32); // 2^1 == 2 seconds + let backoff = 1; let newretry = RetryMessage { next_try: SystemTime::now() .duration_since(UNIX_EPOCH)