datum parsing
This commit is contained in:
@@ -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<NodeHash, MerkleNode> = HashMap::new();
|
||||
data_map.insert(root_hash, MerkleNode::Chunk(chunknode));
|
||||
let data_map: HashMap<NodeHash, MerkleNode> = 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")),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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 => {}
|
||||
}
|
||||
|
||||
BIN
project.pdf
BIN
project.pdf
Binary file not shown.
Reference in New Issue
Block a user