file system and file donload
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
use client_network::{
|
||||
ChunkNode, MerkleNode, MerkleTree, NetworkCommand, NetworkEvent, NodeHash, filename_to_string,
|
||||
node_hash_to_hex_string,
|
||||
ChunkNode, MerkleNode, MerkleTree, NetworkCommand, NetworkEvent, NodeHash,
|
||||
big_or_chunk_to_file, filename_to_string, generate_base_tree, node_hash_to_hex_string,
|
||||
remove_null_bytes,
|
||||
};
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
use egui::{
|
||||
@@ -8,7 +9,9 @@ use egui::{
|
||||
Popup, ScrollArea, SidePanel, TextStyle, TopBottomPanel, Ui, ViewportCommand,
|
||||
debug_text::print,
|
||||
};
|
||||
use std::{collections::HashMap, fmt::format};
|
||||
use std::{collections::HashMap, fmt::format, io::Seek};
|
||||
|
||||
use std::fs::{File, OpenOptions, create_dir};
|
||||
|
||||
enum ServerStatus {
|
||||
Loading,
|
||||
@@ -35,6 +38,7 @@ pub struct P2PClientApp {
|
||||
|
||||
// Key: Parent Directory Hash (String), Value: List of children FileNode
|
||||
loaded_fs: HashMap<String, MerkleTree>,
|
||||
shared_tree: MerkleTree,
|
||||
|
||||
// Current peer tree displayed
|
||||
active_peer: Option<String>,
|
||||
@@ -73,6 +77,7 @@ impl P2PClientApp {
|
||||
error_message: None,
|
||||
connect_name_input: "bob".to_string(),
|
||||
active_server: "".to_string(),
|
||||
shared_tree: generate_base_tree(),
|
||||
}
|
||||
}
|
||||
pub fn show_error(&mut self, msg: impl Into<String>) {
|
||||
@@ -116,6 +121,30 @@ impl eframe::App for P2PClientApp {
|
||||
self.known_peers.push((addr, true));
|
||||
}
|
||||
}
|
||||
NetworkEvent::RootRequest(addr) => {
|
||||
let root = self.shared_tree.root;
|
||||
let _ = self
|
||||
.network_cmd_tx
|
||||
.send(NetworkCommand::SendRootReply(root.to_vec(), addr));
|
||||
}
|
||||
NetworkEvent::DatumRequest(node_hash, addr) => {
|
||||
let hash: NodeHash = node_hash.try_into().expect("incorrect size");
|
||||
let asked_datum = self.shared_tree.data.get(&hash);
|
||||
match asked_datum {
|
||||
Some(datum_found) => {
|
||||
let _ = self.network_cmd_tx.send(NetworkCommand::SendDatum(
|
||||
datum_found.clone(),
|
||||
node_hash,
|
||||
addr,
|
||||
));
|
||||
}
|
||||
None => {
|
||||
let _ = self
|
||||
.network_cmd_tx
|
||||
.send(NetworkCommand::SendNoDatum(node_hash.to_vec(), addr));
|
||||
}
|
||||
}
|
||||
}
|
||||
NetworkEvent::PeerListUpdated(peers) => {
|
||||
//todo!();
|
||||
|
||||
@@ -501,11 +530,30 @@ impl P2PClientApp {
|
||||
.on_hover_text("Click to request file chunks...")
|
||||
.clicked()
|
||||
{
|
||||
todo!();
|
||||
match create_dir("../Download/") {
|
||||
Ok(_) => println!("Directory created successfully!"),
|
||||
Err(e) => println!("Failed to create directory: {}", e),
|
||||
}
|
||||
|
||||
let new_name = format!("./Download/{}", name);
|
||||
|
||||
let sani = remove_null_bytes(&new_name);
|
||||
|
||||
println!("sani:{}", sani);
|
||||
|
||||
let mut file = OpenOptions::new()
|
||||
.append(true)
|
||||
.create(true)
|
||||
.open(sani)
|
||||
.unwrap();
|
||||
|
||||
big_or_chunk_to_file(tree, &MerkleNode::Chunk(node.clone()), &mut file);
|
||||
|
||||
// if let Some(peer_id) = active_peer_id.clone() {
|
||||
// let _ = self.network_cmd_tx.send(NetworkCommand::RequestChunk(peer_id, entry_hash.clone()));
|
||||
// // self.status_message = format!("Requested file chunks for: {}...", &entry_hash[..8]);
|
||||
// }
|
||||
// todo!();
|
||||
}
|
||||
}
|
||||
MerkleNode::Directory(node) => {
|
||||
@@ -525,14 +573,26 @@ impl P2PClientApp {
|
||||
});
|
||||
}
|
||||
MerkleNode::Big(node) => {
|
||||
CollapsingHeader::new(format!("📄 (B) {}", name))
|
||||
.default_open(false)
|
||||
.enabled(true)
|
||||
.show(ui, |ui| {
|
||||
for child in &node.children_hashes {
|
||||
self.draw_file_node(ui, child.clone(), tree, depth + 1, None);
|
||||
}
|
||||
});
|
||||
/*CollapsingHeader::new(format!("📄 (B) {}", name))
|
||||
.default_open(false)
|
||||
.enabled(true)
|
||||
.show(ui, |ui| {
|
||||
for child in &node.children_hashes {
|
||||
self.draw_file_node(ui, child.clone(), tree, depth + 1, None);
|
||||
}
|
||||
});*/
|
||||
if ui
|
||||
.selectable_label(false, format!("📄 (B) {}", name))
|
||||
.on_hover_text("Click to request file chunks...")
|
||||
.clicked()
|
||||
{
|
||||
/*self.network_cmd_tx.send(NetworkCommand::GetChildren(node.children_hashes, ))*/
|
||||
todo!();
|
||||
// if let Some(peer_id) = active_peer_id.clone() {
|
||||
// let _ = self.network_cmd_tx.send(NetworkCommand::RequestChunk(peer_id, entry_hash.clone()));
|
||||
// // self.status_message = format!("Requested file chunks for: {}...", &entry_hash[..8]);
|
||||
// }
|
||||
}
|
||||
}
|
||||
MerkleNode::BigDirectory(node) => {
|
||||
CollapsingHeader::new(format!("📁 (BD) {}", name))
|
||||
|
||||
Reference in New Issue
Block a user