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

@@ -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<NodeHash> = 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) => {

View File

@@ -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");

View File

@@ -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 => {}
}