下载非内核

This commit is contained in:
zhongluofeng
2026-07-22 18:26:26 +08:00
parent 1e31ee8da9
commit f7d3c13f35
24 changed files with 2609 additions and 2532 deletions
+82
View File
@@ -0,0 +1,82 @@
use serde::{Deserialize, Serialize};
use std::fs;
use std::path::PathBuf;
use std::sync::atomic::{AtomicU64, Ordering};
use super::task::{DownloadTask, DownloaderSettings};
/// 引擎持久化状态(序列化到 engine_state.json
#[derive(Serialize, Deserialize)]
pub struct EngineState {
/// 所有任务(active + queued + paused + complete + error
#[serde(default)]
pub tasks: Vec<DownloadTask>,
/// 下载设置
#[serde(default)]
pub settings: DownloaderSettings,
/// 自增 ID 计数器(不序列化为 hex,存原始数字)
#[serde(default)]
pub next_id: u64,
}
impl Default for EngineState {
fn default() -> Self {
Self {
tasks: Vec::new(),
settings: DownloaderSettings::default(),
next_id: 1,
}
}
}
/// 存储管理器:负责加载/保存引擎状态到 JSON 文件
pub struct Storage {
state_path: PathBuf,
/// ID 计数器(内存中维护,与 EngineState.next_id 同步)
pub id_counter: AtomicU64,
}
impl Storage {
pub fn new(data_dir: PathBuf) -> Self {
let state_path = data_dir.join("engine_state.json");
let existing = Self::load_raw(&state_path);
let next_id = existing.as_ref().map(|s| s.next_id).unwrap_or(1);
Self {
state_path,
id_counter: AtomicU64::new(next_id),
}
}
/// 生成下一个任务 ID(16 位 hex 字符串)
pub fn next_task_id(&self) -> String {
let id = self.id_counter.fetch_add(1, Ordering::SeqCst);
format!("{:016x}", id)
}
/// 从磁盘加载状态
fn load_raw(path: &PathBuf) -> Option<EngineState> {
let raw = fs::read_to_string(path).ok()?;
serde_json::from_str::<EngineState>(&raw).ok()
}
/// 加载完整状态(若文件不存在返回默认值)
pub fn load(&self) -> EngineState {
Self::load_raw(&self.state_path).unwrap_or_default()
}
/// 保存状态到磁盘
pub fn save(&self, mut state: EngineState) {
// 同步 ID 计数器
state.next_id = self.id_counter.load(Ordering::SeqCst);
match serde_json::to_string_pretty(&state) {
Ok(json) => {
if let Err(e) = fs::write(&self.state_path, json) {
eprintln!("[download_engine] 保存状态失败: {}", e);
}
}
Err(e) => {
eprintln!("[download_engine] 序列化状态失败: {}", e);
}
}
}
}