diff --git a/Windows/CS/Framework4.0/Updater/src/main.rs b/Windows/CS/Framework4.0/Updater/src/main.rs index 0099474..6c3798c 100644 --- a/Windows/CS/Framework4.0/Updater/src/main.rs +++ b/Windows/CS/Framework4.0/Updater/src/main.rs @@ -151,81 +151,6 @@ fn has_updater_new_exe() -> bool { updater_new_path.exists() } -/// 发送获取 Updater.exe 版本的请求 -fn request_updater_version(sender: &cube_lib::websocket::MessageSender, device_number: &str, debug: bool) { - let msg_str = format!( - r#"{{"Type":"GetFileVer","Data":{{"DeviceNumber":"{}","file_list":["Updater.exe"]}}}}"#, - device_number - ); - if debug { - let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); - println!("{} [版本] 请求 Updater.exe 版本: {}", ts, msg_str); - } - sender.send(msg_str); -} - -/// 检查并下载 Updater.exe -/// 当 BootLoader 下载完成后调用此函数 -/// 返回 true 表示需要继续等待下载,false 表示流程结束 -fn check_and_download_updater(sender: &cube_lib::websocket::MessageSender, device_number: &str, debug: bool) -> bool { - let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); - - // 获取服务端 Updater.exe 版本号 - let server_version = SERVER_UPDATER_VERSION.lock().unwrap().clone(); - - if let Some(sv) = server_version { - let local_version = get_local_file_version("Updater.exe"); - - if debug { - println!("{} [版本] Updater.exe: 服务端={}, 本地={}", ts, sv, local_version); - } - - // 比较版本:需要下载的条件 - let need_update = local_version == "0.0.0" || version_less_than(&local_version, &sv); - - if need_update { - // 需要下载 Updater.exe - let tmp_size = get_tmp_file_size("Updater.exe"); - if tmp_size > 0 { - if debug { - println!("{} [续传] Updater.exe 发现未完成下载,请求 hash 校验...", ts); - } - request_file_md5(sender, "Updater.exe", tmp_size, debug); - } else { - if debug { - println!("{} [升级] Updater.exe 需要更新,开始下载...", ts); - } - request_download(sender, "Updater.exe", 0, debug); - } - true // 需要继续等待下载 - } else { - // 版本已是最新,检查是否有 Updater.new.exe - if debug { - println!("{} [版本] Updater.exe 版本已是最新,无需下载", ts); - } - - // 删除可能存在的旧 Updater.new.exe - if has_updater_new_exe() { - let updater_new_path = get_updater_data_dir().join("Updater.new.exe"); - let _ = fs::remove_file(&updater_new_path); - if debug { - println!("{} [清理] 删除旧的 Updater.new.exe", ts); - } - } - - // 返回 false 表示 Updater 不需要更新,调用者负责输出日志并退出 - false - } - } else { - // 没有收到服务端 Updater 版本 → 重新请求 Updater 版本 - if debug { - println!("{} [警告] 未收到 Updater.exe 版本信息,重新请求...", ts); - } - request_updater_version(sender, device_number, debug); - true // 需要继续等待版本响应 - } -} - /// 安排启动 BootLoader.exe(延迟执行,等待所有下载完成) /// 通过 shutdown_tx 发送断连信号,通知主循环优雅退出 fn schedule_bootloader_launch( @@ -712,6 +637,7 @@ async fn run_updater(debug_mode: bool) -> bool { } // 第二步:再遍历处理每个文件 + let mut download_initiated = false; for (filename, server_ver) in file_versions { let server_version = server_ver.as_str().unwrap_or("0.0.0"); let local_version = get_local_file_version(filename); @@ -734,6 +660,7 @@ async fn run_updater(debug_mode: bool) -> bool { } request_file_md5(&sender, filename, tmp_size, debug_msg); *UPDATE_PERFORMED.lock().unwrap() = true; + download_initiated = true; } else { // 无临时文件,从头下载 if debug_msg { @@ -742,6 +669,7 @@ async fn run_updater(debug_mode: bool) -> bool { } request_download(&sender, filename, 0, debug_msg); *UPDATE_PERFORMED.lock().unwrap() = true; + download_initiated = true; } } else { // 不需要更新 @@ -770,30 +698,18 @@ async fn run_updater(debug_mode: bool) -> bool { let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); println!("{} [升级] BootLoader.exe 版本已是最新", ts); } - // BootLoader 无需下载,检查 Updater - if !check_and_download_updater(&sender, &device_number, debug_msg) { - // Updater 也不需要更新 → 检查是否有正在下载的临时文件 - let tmp_size = get_tmp_file_size("Updater.exe"); - if tmp_size > 0 { - // 有正在下载的 Updater.tmp,等待下载完成 - if debug_msg { - let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); - println!("{} [升级] 发现未完成下载,等待 Updater.exe 下载完成...", ts); - } - // 请求 hash 校验,继续等待 - request_file_md5(&sender, "Updater.exe", tmp_size, debug_msg); - } else { - // 真的不需要更新,也没有临时文件 → 标记检查完成 - *UPDATE_CHECK_DONE.lock().unwrap() = true; - if debug_msg { - let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); - println!("{} [升级] 所有文件已是最新版本,等待下次检查...", ts); - } - } - } } } } + + // 循环结束后:没有发起下载 → 全部已是最新 + if !download_initiated { + *UPDATE_CHECK_DONE.lock().unwrap() = true; + if debug_msg { + let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); + println!("{} [升级] 所有文件已是最新版本,等待下次检查...", ts); + } + } } }