265 std::string
send_file(
const std::string& peer_id,
const std::string& file_path,
266 const std::string& remote_filename =
"");
286 std::string
send_directory(
const std::string& peer_id,
const std::string& directory_path,
287 const std::string& remote_directory_name =
"",
bool recursive =
true);
296 std::string
request_file(
const std::string& peer_id,
const std::string& remote_file_path,
297 const std::string& local_path);
307 std::string
request_directory(
const std::string& peer_id,
const std::string& remote_directory_path,
308 const std::string& local_directory_path,
bool recursive =
true);
440 mutable std::mutex transfers_mutex_;
441 std::unordered_map<std::string, std::shared_ptr<FileTransferProgress>> active_transfers_;
442 std::unordered_map<std::string, std::shared_ptr<FileTransferProgress>> completed_transfers_;
445 mutable std::mutex pending_mutex_;
446 struct PendingFileTransfer {
450 struct PendingDirectoryTransfer {
454 std::unordered_map<std::string, PendingFileTransfer> pending_transfers_;
455 std::unordered_map<std::string, PendingDirectoryTransfer> pending_directory_transfers_;
458 mutable std::mutex directory_transfers_mutex_;
459 std::unordered_map<std::string, DirectoryMetadata> active_directory_transfers_;
462 mutable std::mutex chunks_mutex_;
463 std::unordered_map<std::string, std::queue<FileChunk>> outgoing_chunks_;
464 std::unordered_map<std::string, std::unordered_map<uint64_t, FileChunk>> received_chunks_;
467 struct PendingChunk {
468 std::string transfer_id;
469 uint64_t chunk_index;
470 uint64_t total_chunks;
472 uint64_t file_offset;
473 std::string checksum;
474 std::chrono::steady_clock::time_point created_at;
476 std::unordered_map<std::string, PendingChunk> pending_chunks_;
479 std::vector<std::thread> worker_threads_;
480 std::atomic<bool> running_;
481 std::condition_variable work_condition_;
482 std::mutex work_mutex_;
483 std::queue<std::string> work_queue_;
486 std::condition_variable cleanup_condition_;
487 std::mutex cleanup_mutex_;
490 std::condition_variable throttle_condition_;
491 std::mutex throttle_mutex_;
502 mutable std::mutex stats_mutex_;
503 uint64_t total_bytes_sent_;
504 uint64_t total_bytes_received_;
505 uint64_t total_files_sent_;
506 uint64_t total_files_received_;
507 std::chrono::steady_clock::time_point start_time_;
512 void worker_thread_loop();
513 void cleanup_thread_loop();
514 void process_transfer(
const std::string& transfer_id);
517 std::string generate_transfer_id()
const;
518 void start_file_send(
const std::string& transfer_id);
519 void start_file_receive(
const std::string& transfer_id);
520 void start_directory_send(
const std::string& transfer_id);
521 void start_directory_receive(
const std::string& transfer_id);
522 void handle_chunk_received(
const FileChunk& chunk);
523 void handle_chunk_ack(
const std::string& transfer_id, uint64_t chunk_index,
bool success);
526 bool create_temp_file(
const std::string& transfer_id, uint64_t file_size);
527 bool finalize_received_file(
const std::string& transfer_id,
const std::string& final_path);
530 bool verify_chunk_checksum(
const FileChunk& chunk);
531 std::string calculate_chunk_checksum(
const std::vector<uint8_t>& data);
534 void handle_transfer_request(
const std::string& peer_id,
const nlohmann::json& message);
535 void handle_transfer_response(
const std::string& peer_id,
const nlohmann::json& message);
536 void handle_chunk_metadata_message(
const std::string& peer_id,
const nlohmann::json& message);
537 void handle_chunk_binary_message(
const std::string& peer_id,
const std::vector<uint8_t>& binary_data);
538 void handle_chunk_ack_message(
const std::string& peer_id,
const nlohmann::json& message);
539 void handle_transfer_control(
const std::string& peer_id,
const nlohmann::json& message);
540 void handle_file_request(
const std::string& peer_id,
const nlohmann::json& message);
541 void handle_directory_request(
const std::string& peer_id,
const nlohmann::json& message);
544 nlohmann::json create_transfer_request_message(
const FileMetadata& metadata,
const std::string& transfer_id);
545 nlohmann::json create_transfer_response_message(
const std::string& transfer_id,
bool accepted,
const std::string& reason =
"");
546 std::vector<uint8_t> create_chunk_binary_message(
const FileChunk& chunk);
547 nlohmann::json create_chunk_metadata_message(
const FileChunk& chunk);
548 nlohmann::json create_chunk_ack_message(
const std::string& transfer_id, uint64_t chunk_index,
bool success,
const std::string& error =
"");
549 nlohmann::json create_control_message(
const std::string& transfer_id,
const std::string& action,
const nlohmann::json& data = nlohmann::json::object());
552 void update_transfer_progress(
const std::string& transfer_id, uint64_t bytes_delta = 0);
553 void complete_transfer(
const std::string& transfer_id,
bool success,
const std::string& error_message =
"");
554 void move_to_completed(
const std::string& transfer_id);
557 static bool ensure_directory_exists(
const std::string& directory_path);
558 static std::string get_temp_file_path(
const std::string& transfer_id,
const std::string& temp_dir);
559 static std::string extract_filename(
const std::string& file_path);
560 static std::string get_mime_type(
const std::string& file_path);
563 bool parse_chunk_binary_header(
const std::vector<uint8_t>& binary_data, FileChunk& chunk);