datum parsing
This commit is contained in:
@@ -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"),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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 => {}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
project.pdf
BIN
project.pdf
Binary file not shown.
Reference in New Issue
Block a user