diff --git a/ReadMe.md b/ReadMe.md index eca5b7e..021b75f 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -390,7 +390,7 @@ nohup ./server_linux_amd64 --port 6543 --http-port 9001 > yama.log 2>&1 & - **主机管理**:迁移 CMachineManager(进程 / 窗口 / 网络 / 软件 / IE 历史 / 收藏夹 / 服务 / 任务 / hosts 枚举 + 进程注入),COMMAND_MACHINE_MANAGE 162 - **授权失败触发器**:新增 TRIGGER_AUTH_FAILED 触发类型(与主机上线触发独立),授权失败时下发插件 DLL,受 ShouldLogAuth 去重约束 - **iPhone 远程音频**:WebAudio + 自托管 opus-decoder WASM 解码,修复 iOS 无 MSE 静音 -- **画质与传输控制**:远程桌面 / 屏幕预览质量等级菜单(各 6 档可配置)+ 文件传输速度对话框(7 档 + 无限档,CMD_FILE_SPEED 252) +- **画质与传输控制**:远程桌面 / 屏幕预览质量等级菜单(各 6 档可配置)+ 文件传输速度对话框(7 档 + 无限档,经 MasterSettings 下发) - **Shine/HELL 协议选择**:分享 / 传输主机时可选协议,尾随冒号字段透传,旧客户端兼容 - **Go Web UI 子路径部署**:YAMA_WEB_BASE_PATH 挂载整个 Web UI 到 URL 前缀 - **国际化**:德语(de_DE)第 4 种语言、语言切换工具栏按钮、剩余字符串翻译补齐;远程桌面剪贴板按钮(全屏可达) diff --git a/ReadMe_EN.md b/ReadMe_EN.md index 621eeb8..eccdbd0 100644 --- a/ReadMe_EN.md +++ b/ReadMe_EN.md @@ -390,7 +390,7 @@ Valid : 2026-02-01 to 2028-02-01 - **Machine management**: CMachineManager migrated (process / window / network / software / IE history / favorites / service / task / hosts enumeration plus process injection), COMMAND_MACHINE_MANAGE 162 - **Auth-failed trigger**: new TRIGGER_AUTH_FAILED type (independent of the host-online trigger) pushes plugin DLLs on authorization failure, gated by ShouldLogAuth dedup - **iPhone remote audio**: Web Audio API + self-hosted opus-decoder WASM decoding fixes silent audio on iOS without MSE -- **Quality & transfer controls**: configurable remote-desktop / screen-preview quality-level menus (six presets each) plus a file-transfer speed dialog (seven presets + unlimited, CMD_FILE_SPEED 252) +- **Quality & transfer controls**: configurable remote-desktop / screen-preview quality-level menus (six presets each) plus a file-transfer speed dialog (seven presets + unlimited, delivered via MasterSettings) - **Shine/HELL protocol selection**: choose the protocol when sharing / transferring a host, passed as a trailing colon field, backward compatible - **Go web UI subpath deployment**: YAMA_WEB_BASE_PATH mounts the whole web UI under a URL prefix - **i18n**: German (de_DE) as the fourth language, a language-switch toolbar button, remaining string translations; remote-desktop clipboard buttons (reachable in fullscreen) diff --git a/ReadMe_TW.md b/ReadMe_TW.md index 31cb60a..b1483ca 100644 --- a/ReadMe_TW.md +++ b/ReadMe_TW.md @@ -390,7 +390,7 @@ nohup ./server_linux_amd64 --port 6543 --http-port 9001 > yama.log 2>&1 & - **主機管理**:遷移 CMachineManager(處理程序 / 視窗 / 網路 / 軟體 / IE 歷史 / 收藏夾 / 服務 / 排程工作 / hosts 列舉 + 處理程序注入),COMMAND_MACHINE_MANAGE 162 - **授權失敗觸發器**:新增 TRIGGER_AUTH_FAILED 觸發類型(與主機上線觸發獨立),授權失敗時下發外掛程式 DLL,受 ShouldLogAuth 去重約束 - **iPhone 遠端音訊**:WebAudio + 自託管 opus-decoder WASM 解碼,修復 iOS 無 MSE 靜音 -- **品質與傳輸控制**:遠端桌面 / 螢幕預覽品質等級選單(各 6 檔可設定)+ 檔案傳輸速度對話框(7 檔 + 無限檔,CMD_FILE_SPEED 252) +- **品質與傳輸控制**:遠端桌面 / 螢幕預覽品質等級選單(各 6 檔可設定)+ 檔案傳輸速度對話框(7 檔 + 無限檔,經 MasterSettings 下發) - **Shine/HELL 協定選擇**:分享 / 傳輸主機時可選協定,尾隨冒號欄位透傳,舊用戶端相容 - **Go Web UI 子路徑部署**:YAMA_WEB_BASE_PATH 掛載整個 Web UI 到 URL 前綴 - **國際化**:德語(de_DE)第 4 種語言、語言切換工具列按鈕、剩餘字串翻譯補齊;遠端桌面剪貼簿按鈕(全螢幕可達) diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index f8a25d7..bbc4b40 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -1113,6 +1113,13 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) mgr->EnableOfflineRecord(TRUE); } Logger::getInstance().usingLog(m_settings.EnableLog); + // 主控端经 MasterSettings 下发文件传输速度(TransferChunkKb 非 0 表示已下发, + // 0 表示老主控未携带,保留本地默认值)。写入 [transfer] 节,供各 InitFileUpload + // 调用点经 GetTransferSpeed 读取。 + if (m_settings.TransferChunkKb) { + m_cfg->SetInt("transfer", "ChunkKb", m_settings.TransferChunkKb); + m_cfg->SetInt("transfer", "DurationMs", m_settings.TransferDurationMs); + } } if (IsAuthKernel() && (m_settings.FeedbackUrl[0] || m_settings.HelpUrl[0] || m_settings.RequestAuthUrl[0] || m_settings.GetPluginUrl[0])) { diff --git a/common/commands.h b/common/commands.h index 376c3b5..8ccce70 100644 --- a/common/commands.h +++ b/common/commands.h @@ -1213,7 +1213,9 @@ typedef struct MasterSettings { char GetPluginUrl[80]; // Since 2026-04-08 char Authorized; // Since 2026-05-15 char IsTrail; // Since 2026-05-15 - char Reserved[106]; // Since 2025-11-27 + uint16_t TransferChunkKb; // Since 2026-10-07 文件传输速度 chunkKb(随登录配置下发) + uint16_t TransferDurationMs; // Since 2026-10-07 文件传输速度 durationMs(0=不限速) + char Reserved[102]; // Since 2025-11-27 } MasterSettings; #pragma pack(pop) diff --git a/docs/FileTransferSpeed_Design.md b/docs/FileTransferSpeed_Design.md index 0ca33d8..da68904 100644 --- a/docs/FileTransferSpeed_Design.md +++ b/docs/FileTransferSpeed_Design.md @@ -67,7 +67,7 @@ static int send_duration = 50; // 默认 50ms | 方向 | 发送方 | `InitFileUpload` 调用点 | 生效方式 | |---|---|---|---| | 上传(主控端 → 被控端) | 主控端 | `server/2015Remote/2015RemoteDlg.cpp:2223`(启动一次) | 读 `THIS_CFG`,重启主控端生效 | -| 下载(被控端 → 主控端) | 被控端 | `client/FileManager.cpp:40`(CFileManager 构造,每会话一次) | 读客户端配置,下次打开文件管理会话生效 | +| 下载(被控端 → 主控端) | 被控端 | `client/FileManager.cpp:40`(CFileManager 构造,每会话一次) | 读客户端配置(`MasterSettings` 登录下发写入),下次打开文件管理会话生效 | ### 4.1 上传方向(主控端本地,无协议改动) @@ -79,17 +79,22 @@ int durMs = THIS_CFG.GetInt("transfer", "DurationMs", 50); InitFileUpload({}, {}, GetHMAC(), chunkKb, durMs, Logf, GetUpperHash()); ``` -### 4.2 下载方向(需下发到被控端) +### 4.2 下载方向(随 `MasterSettings` 登录下发到被控端) -新增命令 `CMD_FILE_SPEED`,照 `CMD_QUALITY_LEVEL(78)` 的“服务端下发 → 客户端持久化 → 本地生效”套路: +下载速度**不再用独立命令下发**,而是折叠进 `MasterSettings` 结构体,随**客户端每次登录成功**第一时间下发(主连接建立即 `SendMasterSettings`),客户端持久化到 `[transfer]` 节后本地生效: -1. **`common/commands.h`**:新增 `CMD_FILE_SPEED = 252`(命令号单字节,252 < 255 安全)。 -2. **命令格式**:`[cmd:1][chunkKb:uint16 LE][durationMs:uint16 LE]`,共 5 字节。 - - 传原始 `chunkKb`/`durationMs` 而非档位索引,**避免客户端复制映射表**,映射表只存在于主控端对话框。 -3. **主控端下发**:在 `OnOnlineFileManager()`(`server/2015Remote/2015RemoteDlg.cpp:4737`,发 `COMMAND_LIST_DRIVE` 开文件管理会话)发 `COMMAND_LIST_DRIVE` **之前**,先经主连接把当前档位 `CMD_FILE_SPEED`(5 字节)发给被控端;`OnOnlineDesktopManager()`(`2015RemoteDlg.cpp:4723`,发 `COMMAND_SCREEN_SPY`)同理也发一次,覆盖“先开远程桌面再开文件管理”的引用计数时序。两处都在 `SendFileSpeedCommand()`(`:9310`)统一读取并下发。 -4. **被控端接收**:在客户端主连接分发 `client/KernelManager.cpp:814` 的 `switch`(`COMMAND_LIST_DRIVE` 所在,`case` 加在 `1280` 附近)加 `case CMD_FILE_SPEED`,把两数写入 `iniFile cfg(CLIENT_PATH)` 的 `[transfer]` 节。 -5. **被控端调用点读配置**:`client/FileManager.cpp:40`(CFileManager 构造)改为读 `cfg.GetInt("transfer","ChunkKb",64)` / `DurationMs`,替换硬编码 `64, 50`。CFileManager 每会话重建(构造 Init、析构 Uninit),故下次打开文件管理即生效。 +1. **`common/commands.h`**:在 `MasterSettings` 结构体 `Reserved` 之前新增两个字段(`sizeof` 仍为 1000,`Signature` 偏移不变,向下兼容老客户端): + ```c + uint16_t TransferChunkKb; // 文件传输速度 chunkKb(随登录配置下发) + uint16_t TransferDurationMs; // 文件传输速度 durationMs(0=不限速) + ``` +2. **主控端登录即下发**:`OnInitDialog()` 读 `THIS_CFG` 的 `[transfer]`(`GetTransferSpeed`,默认 64/50),填入 `m_settings.TransferChunkKb/TransferDurationMs`。登录链路本就把 `m_settings` 经 `SendMasterSettings` 下发给每个新连接客户端,**无需任何额外命令**。 +3. **主控端改速即时广播**:`OnFileTransferSpeed()` 保存后同步更新 `m_settings` 两个字段并 `SendMasterSettings(nullptr, m_settings)`,在线客户端即时收到新速度;新连接主机也自动获取。 +4. **被控端接收**:客户端 `CMD_MASTERSETTING` 处理器(`client/KernelManager.cpp:1116` 附近)中,`TransferChunkKb` 非 0(老主控未携带时为 0,保留本地默认值)则把两数写入 `iniFile(CLIENT_PATH)` 的 `[transfer]` 节。 +5. **被控端调用点读配置**:`client/FileManager.cpp:40`(CFileManager 构造)等 4 个 `InitFileUpload` 调用点均读 `cfg.GetInt("transfer", ...)`,替换硬编码 `64, 50`。CFileManager 每会话重建(构造 Init、析构 Uninit),故下次打开文件管理即生效。 +> **为何不用独立命令**:v1.4.0 曾用独立 `CMD_FILE_SPEED(252)` 在 `OnOnlineFileManager()`/`OnOnlineDesktopManager()` 发 `COMMAND_LIST_DRIVE`/`COMMAND_SCREEN_SPY` **之前**追加下发。主控端 IOCP 对两次背靠背 `Send2Client` 会合并为两次整包 `WSASend`(`OutCompressedBuffer` 累积),导致客户端收到重复的 `[FILE_SPEED][SCREEN_SPY]` 命令流——这正是“点击远程桌面弹出两个对话框”的根因(commit 76decec)。改为随 `MasterSettings` 登录下发后,下载方向不再有任何背靠背发送。 +> **向后兼容**:`CMD_FILE_SPEED = 252` 命令号与客户端 `case CMD_FILE_SPEED` 处理器仍保留,供老主控(仍按旧机制下发)与新客户端互通;新主控不再发送该命令。 > **关键**:库用进程级引用计数,速度只在**首次** `InitFileUpload` 时设定(`g_threadCount > 1` 时提前返回,不重设)。客户端共 4 个 `InitFileUpload` 调用点(`FileManager.cpp:40`、`ScreenManager.cpp:109`、`ScreenManager.cpp:873`、`KernelManager.cpp:1399`),谁先初始化谁锁定速度。故**这 4 处必须全部改为读同一配置**,否则下载速度会被先初始化的管理器(如远程桌面会话)锁成旧值。 --- @@ -97,7 +102,7 @@ InitFileUpload({}, {}, GetHMAC(), chunkKb, durMs, Logf, GetUpperHash()); ## 5. 配置存储 - 主控端:`THIS_CFG`(ini)`[transfer]` 节 `ChunkKb` / `DurationMs`(int)。 -- 被控端:`iniFile(CLIENT_PATH)` 的 `[transfer]` 节 `ChunkKb` / `DurationMs`(int),由 `CMD_FILE_SPEED` 写入。 +- 被控端:`iniFile(CLIENT_PATH)` 的 `[transfer]` 节 `ChunkKb` / `DurationMs`(int),由 `MasterSettings` 登录下发写入。 存 `ChunkKb`/`DurationMs` 两个 int 而非档位索引:自解释、直接对应 `InitFileUpload` 入参、不易错位。 @@ -111,9 +116,9 @@ InitFileUpload({}, {}, GetHMAC(), chunkKb, durMs, Logf, GetUpperHash()); | `server/2015Remote/2015Remote.rc` | 「高级」菜单加一项;新增对话框资源(滑块+预估标签+按钮)。**文件为 UTF-16LE 编码,须按 Unicode 读写** | | `server/2015Remote/CFileSpeedDlg.h` | 新建:档位表 + `OnHScroll` 实时预估 + 恢复默认(照 `CPreviewLevelsDlg.h` 内联实现) | | `server/2015Remote/2015RemoteDlg.h` | 加 `OnFileTransferSpeed()` 声明 | -| `server/2015Remote/2015RemoteDlg.cpp` | 消息映射 `ON_COMMAND(ID_TOOL_FILE_SPEED, ...)`;`2223` 读配置(上传);`OnFileTransferSpeed()` 弹出对话框并写回 THIS_CFG;`OnOnlineFileManager()`/`OnOnlineDesktopManager()` 发 `CMD_FILE_SPEED` | -| `common/commands.h` | 加 `CMD_FILE_SPEED = 252` | -| `client/KernelManager.cpp` | `case CMD_FILE_SPEED` 写客户端配置(主连接 switch,`814`) | +| `server/2015Remote/2015RemoteDlg.cpp` | 消息映射 `ON_COMMAND(ID_TOOL_FILE_SPEED, ...)`;`2223` 读配置(上传);`OnInitDialog()` 把 `[transfer]` 速度填入 `m_settings`;`OnFileTransferSpeed()` 保存后更新 `m_settings` 并经 `SendMasterSettings(nullptr, ...)` 广播 | +| `common/commands.h` | `MasterSettings` 新增 `TransferChunkKb`/`TransferDurationMs`(`sizeof` 不变,`CMD_FILE_SPEED=252` 保留向后兼容) | +| `client/KernelManager.cpp` | `CMD_MASTERSETTING` 处理器写 `[transfer]`(`TransferChunkKb` 非 0 才写) | | `client/FileManager.cpp`、`client/ScreenManager.cpp`、`client/KernelManager.cpp` | 4 个 `InitFileUpload` 调用点读配置替换硬编码 `64, 50`(引用计数要求全部一致) | | `server/2015Remote/lang/en_US.ini`、`zh_TW.ini`、`de_DE.ini` | 追加「文件传输速度」相关 13 条中文原文→译文(GBK 编码,`RCDATA "lang\*.ini"` 由 rc.exe 嵌入) | @@ -122,8 +127,8 @@ InitFileUpload({}, {}, GetHMAC(), chunkKb, durMs, Logf, GetUpperHash()); ## 7. 生效时机与提示文案 - 上传速度:重启主控端生效。 -- 下载速度:下次打开该主机的文件管理会话生效。 -- 对话框保存后弹提示:`文件传输速度已保存。上传速度重启主控端后生效;下载速度下次打开文件管理或远程桌面后生效。` +- 下载速度:已推送到在线客户端即时生效;新连接的主机自动获取。 +- 对话框保存后弹提示:`文件传输速度已保存。上传速度重启主控端后生效;下载速度已推送到在线客户端,新连接的主机也会自动获取。` --- @@ -131,16 +136,16 @@ InitFileUpload({}, {}, GetHMAC(), chunkKb, durMs, Logf, GetUpperHash()); 1. **`Sleep` 精度**:Windows 计时器粒度约 15.6ms,`durationMs` 过小则失真(见 §3)。 2. **实际速度 < 预估**:预估为纯 `chunk/delay` 理论值,未计入 `f()` 网络发送耗时;对话框文案用“约/大概”表述。 -3. **命令号冲突**:`CMD_FILE_SPEED=252` 需确认 `commands.h` 无重号;252 < 255(单字节 `uint8_t cmd` 上限)。 +3. **结构体字段布局**:`TransferChunkKb`/`TransferDurationMs` 加在 `Reserved` 之前(`sizeof(MasterSettings)` 仍为 1000,`Signature` 偏移不变),保证与 Go 侧/老客户端二进制兼容;`TransferChunkKb == 0` 作为“未下发”哨兵(老主控未填充 → 客户端保留本地默认值)。 4. **`.rc` 编码**:`2015Remote.rc` 为 UTF-16LE(带 BOM),编辑必须按 Unicode 处理,避免破坏资源脚本。 -5. **跨平台**:Linux/macOS 客户端下载路径暂不改(`CMD_FILE_SPEED` 会被老/其他平台客户端静默忽略,向后兼容)。 +5. **跨平台**:Linux/macOS 客户端下载路径暂不改;`MasterSettings` 新增字段位于原 `Reserved` 区(老/其他平台客户端不识别即忽略),向后兼容。 6. **多语言 key 精确匹配**:语言文件为 GBK 编码、key 不 trim(`CIniParser` 保留原始空格);译文 key 必须与源码逐字一致——源码为 UTF-8、经 `/execution-charset:.936` 编译为 GBK,`·`(U+00B7)、全角括号()等需一致,否则查不到翻译。 --- ## 9. 实施顺序 -1. `common/commands.h` 加命令号 → `resource.h` 加 ID → `.rc` 加菜单项与对话框资源。 +1. `common/commands.h` 扩 `MasterSettings` → `resource.h` 加 ID → `.rc` 加菜单项与对话框资源。 2. 新建 `CFileSpeedDlg.h` → `2015RemoteDlg` 接线(上传方向,可先验证)。 -3. 主控端下发 `CMD_FILE_SPEED` → 客户端接收持久化 → 客户端调用点读配置(下载方向)。 +3. 主控端经 `MasterSettings` 下发速度 → 客户端 `CMD_MASTERSETTING` 持久化 → 客户端调用点读配置(下载方向)。 4. 编译验证(MSBuild 须传 `-p:SolutionDir`,见项目记忆)。 diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 013e4ea..f88aa76 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -2425,6 +2425,12 @@ BOOL CMy2015RemoteDlg::OnInitDialog() strcpy(m_settings.GetPluginUrl, THIS_CFG.GetStr("settings", "GetPluginUrl", BRAND_URL_GET_PLUGIN).c_str()); m_settings.Authorized = !pwd.empty() && !THIS_CFG.GetStr("settings", "PwdHmac").empty(); m_settings.IsTrail = IsTrail(pwd); + { + int chunkKb, durMs; + GetTransferSpeed(THIS_CFG, chunkKb, durMs); + m_settings.TransferChunkKb = (uint16_t)chunkKb; + m_settings.TransferDurationMs = (uint16_t)durMs; + } m_bEnableFileV2 = THIS_CFG.GetInt("settings", "EnableFileV2", 0) != 0; // 缩略图配置:从 [thumbnail] 节读取(独立于 MasterSettings,纯主控端 UI 偏好)。 @@ -4770,9 +4776,6 @@ VOID CMy2015RemoteDlg::OnOnlineDesktopManager() { if (!ShouldRemoteControl()) return; - // 先下发当前文件传输速度档位,再开远程桌面:避免被控端 ScreenManager 先初始化 - // 文件上传模块(进程级引用计数)把速度锁成旧值。 - SendFileSpeedCommand(); int n = THIS_CFG.GetInt("settings", "DXGI"); BOOL all = THIS_CFG.GetInt("settings", "MultiScreen", TRUE); CString algo = THIS_CFG.GetStr("settings", "ScreenCompress", ALGORITHM_NULL).c_str(); @@ -4782,9 +4785,6 @@ VOID CMy2015RemoteDlg::OnOnlineDesktopManager() VOID CMy2015RemoteDlg::OnOnlineFileManager() { - // 先下发文件传输速度档位,再发 COMMAND_LIST_DRIVE 开文件管理:保证被控端 - // CFileManager 构造时读到的 [transfer] 配置已是最新值。 - SendFileSpeedCommand(); BYTE bToken = COMMAND_LIST_DRIVE; SendSelectedCommand(&bToken, sizeof(BYTE)); } @@ -9363,26 +9363,14 @@ void CMy2015RemoteDlg::OnFileTransferSpeed() if (dlg.DoModal() == IDOK) { THIS_CFG.SetInt("transfer", "ChunkKb", dlg.GetChunkKb()); THIS_CFG.SetInt("transfer", "DurationMs", dlg.GetDurMs()); - MessageBoxL("文件传输速度已保存。上传速度重启主控端后生效;下载速度下次打开文件管理或远程桌面后生效。", + m_settings.TransferChunkKb = (uint16_t)dlg.GetChunkKb(); + m_settings.TransferDurationMs = (uint16_t)dlg.GetDurMs(); + SendMasterSettings(nullptr, m_settings); // 下载速度随 MasterSettings 推送给在线客户端 + MessageBoxL("文件传输速度已保存。上传速度重启主控端后生效;下载速度已推送到在线客户端,新连接的主机也会自动获取。", "提示", MB_ICONINFORMATION); } } -void CMy2015RemoteDlg::SendFileSpeedCommand() -{ - int chunkKb, durMs; - GetTransferSpeed(THIS_CFG, chunkKb, durMs); - - // [cmd:1][chunkKb:uint16 LE][durationMs:uint16 LE] - BYTE buf[5]; - buf[0] = CMD_FILE_SPEED; - buf[1] = (BYTE)(chunkKb & 0xFF); - buf[2] = (BYTE)((chunkKb >> 8) & 0xFF); - buf[3] = (BYTE)(durMs & 0xFF); - buf[4] = (BYTE)((durMs >> 8) & 0xFF); - SendSelectedCommand(buf, sizeof(buf)); -} - void CMy2015RemoteDlg::ApplyThumbnailSettings() { // 任何已缓存的 HBITMAP 都是按"旧 ThumbWidth"渲染的,尺寸不再可信 —— 一律清空。 diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 99ff8f0..037c440 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -351,9 +351,8 @@ public: // ===== 文件传输速度配置([transfer] 节,ChunkKb / DurationMs) ===== // 主控端 UI 偏好,持久化走 THIS_CFG。上传方向读 THIS_CFG(重启主控端生效); - // 下载方向经 CMD_FILE_SPEED 下发到被控端(下次打开文件管理/远程桌面会话生效)。 + // 下载方向随 MasterSettings 下发(新连接登录即收到,改档后立即推送给在线客户端)。 void OnFileTransferSpeed(); // 高级→文件传输速度 - void SendFileSpeedCommand(); // 把当前档位经主连接下发给被控端 void SendThumbnailRequest(class context* ctx);// 发一次缩略图请求 void CacheThumbnail(uint64_t clientID, const BYTE* jpeg, size_t bytes); void ClearThumbnailCacheEntry(uint64_t clientID); diff --git a/server/2015Remote/lang/de_DE.ini b/server/2015Remote/lang/de_DE.ini index 7a7c6e5..1d27867 100644 --- a/server/2015Remote/lang/de_DE.ini +++ b/server/2015Remote/lang/de_DE.ini @@ -2067,4 +2067,4 @@ JPEG ²»ÏÞËÙ=Unbegrenzt %s ¡¤ Լ %.2f MB/s=%s ¡¤ ca. %.2f MB/s %s ¡¤ ²»ÊÜÏÞË٣¨ÊÜÍøÂç´ø¿íԼÊø£©=%s ¡¤ Unbegrenzt (durch Netzwerkbandbreite begrenzt) -Îļþ´«ÊäËٶÈÒѱ£´档Éϴ«ËٶÈÖØÆôÖ÷¿ض˺óÉúЧ£»ÏÂÔØËٶÈÏ´δò¿ªÎļþ¹ÜÀí»òԶ³Ì×ÀÃæºóÉúЧ¡£=Uebertragungsgeschwindigkeit gespeichert. Upload-Geschwindigkeit wird nach Neustart des Masters wirksam; Download-Geschwindigkeit beim naechsten Oeffnen des Dateimanagers oder des Remotedesktops. +Îļþ´«ÊäËٶÈÒѱ£´档Éϴ«ËٶÈÖØÆôÖ÷¿ض˺óÉúЧ£»ÏÂÔØËٶÈÒÑÍÆË͵½ÔÚÏ߿ͻ§¶ˣ¬ÐÂÁ¬½ӵÄÖ÷»úҲ»á×Զ¯»ñȡ¡£=Uebertragungsgeschwindigkeit gespeichert. Upload-Geschwindigkeit wird nach Neustart des Masters wirksam; Download-Geschwindigkeit wurde an Online-Clients gesendet, neu verbundene Hosts erhalten sie automatisch. diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index ad3fa21..2ed38eb 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -2068,7 +2068,7 @@ JPEG ²»ÏÞËÙ=Unlimited %s ¡¤ Լ %.2f MB/s=%s ¡¤ about %.2f MB/s %s ¡¤ ²»ÊÜÏÞË٣¨ÊÜÍøÂç´ø¿íԼÊø£©=%s ¡¤ Unlimited (limited by network bandwidth) -Îļþ´«ÊäËٶÈÒѱ£´档Éϴ«ËٶÈÖØÆôÖ÷¿ض˺óÉúЧ£»ÏÂÔØËٶÈÏ´δò¿ªÎļþ¹ÜÀí»òԶ³Ì×ÀÃæºóÉúЧ¡£=Transfer speed saved. Upload speed takes effect after restarting the master; download speed takes effect the next time you open File Manager or Remote Desktop. +Îļþ´«ÊäËٶÈÒѱ£´档Éϴ«ËٶÈÖØÆôÖ÷¿ض˺óÉúЧ£»ÏÂÔØËٶÈÒÑÍÆË͵½ÔÚÏ߿ͻ§¶ˣ¬ÐÂÁ¬½ӵÄÖ÷»úҲ»á×Զ¯»ñȡ¡£=Transfer speed saved. Upload speed takes effect after restarting the master; download speed has been pushed to online clients, and newly connected hosts will get it automatically. Á¬½ӹÜÀí=Connections %s - Á¬½ӹÜÀí=%s - Connections diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index 984b7cf..c2cccff 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -2059,7 +2059,7 @@ JPEG ²»ÏÞËÙ=²»ÏÞËÙ %s ¡¤ Լ %.2f MB/s=%s ¡¤ ¼s %.2f MB/s %s ¡¤ ²»ÊÜÏÞË٣¨ÊÜÍøÂç´ø¿íԼÊø£©=%s ¡¤ ²»ÏÞË٣¨ÊܾW·îlŒ’ÏÞÖƣ© -Îļþ´«ÊäËٶÈÒѱ£´档Éϴ«ËٶÈÖØÆôÖ÷¿ض˺óÉúЧ£»ÏÂÔØËٶÈÏ´δò¿ªÎļþ¹ÜÀí»òԶ³Ì×ÀÃæºóÉúЧ¡£=™n°¸‚÷ݔËٶÈÒу¦´档Éς÷ËٶÈÖ؆¢Ö÷¿ضËááÉúЧ£»ÏÂÝdËٶÈÏ´Îé_†¢™n°¸¹ÜÀí»òßh¶Ë×ÀÃæááÉúЧ¡£ +Îļþ´«ÊäËٶÈÒѱ£´档Éϴ«ËٶÈÖØÆôÖ÷¿ض˺óÉúЧ£»ÏÂÔØËٶÈÒÑÍÆË͵½ÔÚÏ߿ͻ§¶ˣ¬ÐÂÁ¬½ӵÄÖ÷»úҲ»á×Զ¯»ñȡ¡£=™n°¸‚÷ݔËٶÈÒу¦´档Éς÷ËٶÈÖ؆¢Ö÷¿ضËááÉúЧ£»ÏÂÝdËٶÈÒÑÍÆË͵½¾€ÉÏÓÑô¶ˣ¬ÐÂßB¾€µÄÖ÷™CҲ•þ×ԄÓȡµá£ Á¬½ӹÜÀí=ßB¾€¹ÜÀí %s - Á¬½ӹÜÀí=%s - ßB¾€¹ÜÀí