datum parsing

This commit is contained in:
TIBERGHIEN corentin
2026-01-22 03:19:43 +01:00
parent fb2c3310af
commit 26fa7a833f
5 changed files with 96 additions and 92 deletions

View File

@@ -6,6 +6,7 @@ use crossbeam_channel::{Receiver, Sender};
use egui::{ use egui::{
Align, Align2, Button, CentralPanel, CollapsingHeader, Context, Id, LayerId, Layout, Order, Align, Align2, Button, CentralPanel, CollapsingHeader, Context, Id, LayerId, Layout, Order,
Popup, ScrollArea, SidePanel, TextStyle, TopBottomPanel, Ui, ViewportCommand, Popup, ScrollArea, SidePanel, TextStyle, TopBottomPanel, Ui, ViewportCommand,
debug_text::print,
}; };
use std::{collections::HashMap, fmt::format}; use std::{collections::HashMap, fmt::format};
@@ -120,8 +121,36 @@ impl eframe::App for P2PClientApp {
self.known_peers = peers; 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) => { NetworkEvent::FileTreeRootReceived(peer_id, root_hash) => {
// todo!(); // todo!();
@@ -133,8 +162,10 @@ impl eframe::App for P2PClientApp {
);*/ );*/
if let Ok(chunknode) = ChunkNode::new(Vec::new()) { if let Ok(chunknode) = ChunkNode::new(Vec::new()) {
let mut data_map: HashMap<NodeHash, MerkleNode> = HashMap::new(); let data_map: HashMap<NodeHash, MerkleNode> = HashMap::new();
data_map.insert(root_hash, MerkleNode::Chunk(chunknode)); //data_map.insert(root_hash, MerkleNode::Chunk(chunknode));
println!("len root: {}", data_map.len());
println!("node hash: {:?}", root_hash.to_vec());
let tree = MerkleTree { let tree = MerkleTree {
data: data_map, data: data_map,
root: root_hash, 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) { if let Some(current) = tree.data.get(&to_draw) {
let name = { let name = {
if filename.is_some() { if filename.is_some() {
filename_to_string(filename.unwrap()) String::from_utf8(filename.unwrap().to_vec()).expect("err")
} else { } else {
node_hash_to_hex_string(&to_draw) node_hash_to_hex_string(&to_draw)
} }
}; };
match current { match current {
MerkleNode::Chunk(node) => { MerkleNode::Chunk(node) => {
if ui if ui
@@ -544,13 +519,7 @@ impl P2PClientApp {
entry.content_hash, entry.content_hash,
tree, tree,
depth + 1, depth + 1,
Some( Some(entry.filename.try_into().expect("incorrect size")),
entry
.filename
.as_slice()
.try_into()
.expect("incorrect size"),
),
); );
} }
}); });

View File

@@ -11,9 +11,9 @@ pub fn parse_received_datum(
datum_length: usize, datum_length: usize,
) -> Option<([u8; 32], MerkleNode)> { ) -> Option<([u8; 32], MerkleNode)> {
let hash_name: [u8; 32] = recevied_datum[..32].try_into().expect("error"); let hash_name: [u8; 32] = recevied_datum[..32].try_into().expect("error");
let sigstart = datum_length - 64; let value = &recevied_datum[32..datum_length];
let value = &recevied_datum[32..sigstart];
let value_slice = value.to_vec(); let value_slice = value.to_vec();
println!("valueslice: {:?}, {}", value_slice, value_slice.len());
let datum_type = value_slice[0]; let datum_type = value_slice[0];
match datum_type { match datum_type {
CHUNK => Some(( CHUNK => Some((
@@ -21,14 +21,17 @@ pub fn parse_received_datum(
MerkleNode::Chunk(crate::ChunkNode { data: value_slice }), MerkleNode::Chunk(crate::ChunkNode { data: value_slice }),
)), )),
DIRECTORY => { DIRECTORY => {
let nb_entries = value_slice[1];
let mut dir_entries = Vec::new(); let mut dir_entries = Vec::new();
let mut offset = 1 as usize; let mut offset = 1 as usize;
for i in 0..nb_entries { for i in 0..((value_slice.len() - 1) / 64) as u8 {
offset = (offset as u8 + 64 * i) as usize; offset = (1 + 64 * i as usize) as usize;
let name = &recevied_datum[offset..offset + 32]; println!("offset:{}, i:{}", offset, i);
let name = &value_slice[offset..offset + 32];
let mut hash = [0u8; 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 // envoyer un datum request
dir_entries.push(DirectoryEntry { dir_entries.push(DirectoryEntry {
filename: name.try_into().expect("incorrect size"), filename: name.try_into().expect("incorrect size"),
@@ -62,19 +65,18 @@ pub fn parse_received_datum(
);*/ );*/
} }
BIGDIRECTORY => { BIGDIRECTORY => {
let nb_entries = value_slice[1]; let mut bigdir_entries: Vec<NodeHash> = Vec::new();
let mut dir_entries = Vec::new();
let mut offset = 1 as usize; let mut offset = 1 as usize;
for i in 0..nb_entries { for i in 0..((value_slice.len() - 1) / 32) as u8 {
offset = (offset as u8 + 64 * i) as usize; offset = (1 + 32 * i as usize) as usize;
let name = &recevied_datum[offset..offset + 32]; println!("offset:{}, i:{}", offset, i);
let mut hash = [0u8; 32]; let hash = &value_slice[offset..offset + 32];
hash.copy_from_slice(&recevied_datum[offset + 32..offset + 64]);
// envoyer un datum request // 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 { match current {
Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))), Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))),
Err(e) => { Err(e) => {

View File

@@ -16,7 +16,8 @@ use crate::{
message_handling::EventType, message_handling::EventType,
messages_channels::{MultipleSenders, start_receving_thread, start_retry_thread}, messages_channels::{MultipleSenders, start_receving_thread, start_retry_thread},
messages_structure::{ messages_structure::{
NATTRAVERSALREQUEST, NATTRAVERSALREQUEST2, PING, ROOTREQUEST, construct_message, DATUMREQUEST, NATTRAVERSALREQUEST, NATTRAVERSALREQUEST2, PING, ROOTREQUEST,
construct_message,
}, },
peers_refresh::HandshakeHistory, peers_refresh::HandshakeHistory,
registration::{parse_addresses, perform_handshake, register_with_the_server}, registration::{parse_addresses, perform_handshake, register_with_the_server},
@@ -147,7 +148,7 @@ pub enum NetworkCommand {
Disconnect(), Disconnect(),
ResetServerPeer(), ResetServerPeer(),
Discover(String, String, String), Discover(String, String, String),
GetChildren(String, String), GetChildren([u8; 32], String),
// ... // ...
} }
@@ -159,7 +160,7 @@ pub enum NetworkEvent {
Error(String), Error(String),
PeerConnected(String), PeerConnected(String),
PeerListUpdated(Vec<(String, bool)>), PeerListUpdated(Vec<(String, bool)>),
FileTreeReceived([u8; 32], MerkleNode), // peer_id, content FileTreeReceived([u8; 32], MerkleNode, String), // peer_id, content
DataReceived(String, MerkleNode), DataReceived(String, MerkleNode),
FileTreeRootReceived(String, NodeHash), FileTreeRootReceived(String, NodeHash),
HandshakeFailed(), HandshakeFailed(),
@@ -289,8 +290,37 @@ pub fn start_p2p_executor(
println!("no shared data"); println!("no shared data");
} }
} }
NetworkCommand::GetChildren(username, hash) => { NetworkCommand::GetChildren(hash, ip) => {
// envoie un datum request au peer 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(_, _) => { NetworkCommand::RequestDirectoryContent(_, _) => {
println!("[Network] RequestDirectoryContent() called"); println!("[Network] RequestDirectoryContent() called");

View File

@@ -420,8 +420,11 @@ pub fn parse_message(
parse_received_datum(received_datum.to_vec(), received_length as usize); parse_received_datum(received_datum.to_vec(), received_length as usize);
match parsed_node { match parsed_node {
Some(tuple) => { Some(tuple) => {
let _ = let _ = cmd_tx.send(NetworkEvent::FileTreeReceived(
cmd_tx.send(NetworkEvent::FileTreeReceived(tuple.0, tuple.1)); tuple.0,
tuple.1,
ip.to_string(),
));
} }
None => {} None => {}
} }

Binary file not shown.