Feature: Add file-transfer speed dialog with multi-language support
Add a novice-friendly "File Transfer Speed" dialog under the Advanced menu that controls file-transfer speed in both directions without touching SimplePlugins. Speed is passed through InitFileUpload's existing chunkSizeKb/sendDurationMs arguments, so the precompiled library stays untouched. Seven presets run from ~0.3 MB/s up to a new 10 MB/s tier plus an unlimited tier; the chosen value is stored in [transfer] ChunkKb/DurationMs. Upload reads THIS_CFG at the master's InitFileUpload (2015RemoteDlg.cpp:2225) and takes effect on restart. Download is pushed to the client over a new CMD_FILE_SPEED (252) command, sent from OnOnlineFileManager and OnOnlineDesktopManager before each session opens, and read by all four client InitFileUpload call sites via GetTransferSpeed so the process-global refcount cannot latch a stale speed. All Chinese strings go through LangManager, with en_US/zh_TW/de_DE entries added for the tier names, format strings and hint text. Co-Authored-By: deepseek-v4-pro
This commit is contained in:
1 parent
9eed43bc8d
commit
76decec0fe
14 files changed
+424
-11
No files matched your search
Binary file not shown.
@@ -46,6 +46,7 @@
|
||||
#include "common/commands.h"
|
||||
#include "QualityLevelsDlg.h"
|
||||
#include "CPreviewLevelsDlg.h"
|
||||
#include "CFileSpeedDlg.h"
|
||||
#include "McpServer.h"
|
||||
#include "McpSettingsDlg.h"
|
||||
#include "common/md5.h"
|
||||
@@ -1018,6 +1019,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx)
|
||||
ON_COMMAND(ID_MENU_NOTIFY_SETTINGS, &CMy2015RemoteDlg::OnMenuNotifySettings)
|
||||
ON_COMMAND(ID_TOOL_QUALITY_LEVELS, &CMy2015RemoteDlg::OnQualityLevels)
|
||||
ON_COMMAND(ID_TOOL_PREVIEW_LEVELS, &CMy2015RemoteDlg::OnPreviewLevels)
|
||||
ON_COMMAND(ID_TOOL_FILE_SPEED, &CMy2015RemoteDlg::OnFileTransferSpeed)
|
||||
ON_COMMAND(ID_EXECUTE_TESTRUN, &CMy2015RemoteDlg::OnExecuteTestrun)
|
||||
ON_COMMAND(ID_EXECUTE_GHOST, &CMy2015RemoteDlg::OnExecuteGhost)
|
||||
ON_COMMAND(ID_MASTER_TRAIL, &CMy2015RemoteDlg::OnMasterTrail)
|
||||
@@ -2220,7 +2222,9 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
||||
}
|
||||
|
||||
UPDATE_SPLASH(18, "正在初始化文件上传模块...");
|
||||
int ret = InitFileUpload({}, {}, GetHMAC(), 64, 50, Logf, GetUpperHash());
|
||||
int chunkKb = 64, durMs = 50;
|
||||
GetTransferSpeed(THIS_CFG, chunkKb, durMs);
|
||||
int ret = InitFileUpload({}, {}, GetHMAC(), chunkKb, durMs, Logf, GetUpperHash());
|
||||
g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, AfxGetInstanceHandle(), 0);
|
||||
|
||||
UPDATE_SPLASH(20, "正在加载IP数据库...");
|
||||
@@ -4720,6 +4724,9 @@ 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();
|
||||
@@ -4729,6 +4736,9 @@ VOID CMy2015RemoteDlg::OnOnlineDesktopManager()
|
||||
|
||||
VOID CMy2015RemoteDlg::OnOnlineFileManager()
|
||||
{
|
||||
// 先下发文件传输速度档位,再发 COMMAND_LIST_DRIVE 开文件管理:保证被控端
|
||||
// CFileManager 构造时读到的 [transfer] 配置已是最新值。
|
||||
SendFileSpeedCommand();
|
||||
BYTE bToken = COMMAND_LIST_DRIVE;
|
||||
SendSelectedCommand(&bToken, sizeof(BYTE));
|
||||
}
|
||||
@@ -9280,6 +9290,38 @@ void CMy2015RemoteDlg::OnPreviewLevels()
|
||||
}
|
||||
}
|
||||
|
||||
// ===== 文件传输速度配置([transfer] 节) =====
|
||||
// 档位表权威来源见 CFileSpeedDlg.h 的 kFileSpeedTiers。存 ChunkKb/DurationMs 两个 int
|
||||
// 而非档位索引,自解释且直接对应 InitFileUpload 入参,不易错位。
|
||||
|
||||
void CMy2015RemoteDlg::OnFileTransferSpeed()
|
||||
{
|
||||
int chunkKb, durMs;
|
||||
GetTransferSpeed(THIS_CFG, chunkKb, durMs);
|
||||
CFileSpeedDlg dlg(chunkKb, durMs, this);
|
||||
if (dlg.DoModal() == IDOK) {
|
||||
THIS_CFG.SetInt("transfer", "ChunkKb", dlg.GetChunkKb());
|
||||
THIS_CFG.SetInt("transfer", "DurationMs", dlg.GetDurMs());
|
||||
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"渲染的,尺寸不再可信 —— 一律清空。
|
||||
|
||||
@@ -347,6 +347,12 @@ public:
|
||||
void SavePreviewProfilesToCfg() const; // m_PreviewProfiles 落盘到 THIS_CFG
|
||||
const PreviewProfile& GetPreviewProfileCfg(int level) const; // 供 ChooseScreenPreviewParams 用
|
||||
void OnPreviewLevels(); // 高级→屏幕预览质量等级
|
||||
|
||||
// ===== 文件传输速度配置([transfer] 节,ChunkKb / DurationMs) =====
|
||||
// 主控端 UI 偏好,持久化走 THIS_CFG。上传方向读 THIS_CFG(重启主控端生效);
|
||||
// 下载方向经 CMD_FILE_SPEED 下发到被控端(下次打开文件管理/远程桌面会话生效)。
|
||||
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);
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
// CFileSpeedDlg.h
|
||||
// 文件传输速度调节对话框:拖动滑块选档位,实时显示预估速度。
|
||||
// 纯主控端 UI 偏好,持久化由 CMy2015RemoteDlg::OnFileTransferSpeed() 负责。
|
||||
// 仅在 2015RemoteDlg.cpp 中 include 一次(头文件内联实现 + 消息映射,勿多处包含)。
|
||||
#pragma once
|
||||
|
||||
#include "LangManager.h"
|
||||
#include <afxcmn.h>
|
||||
|
||||
// 档位表(权威来源:docs/FileTransferSpeed_Design.md §3)。
|
||||
// chunkKb * 1024 / durationMs 即理论字节/秒;durationMs==0 表示不人为限速。
|
||||
struct FileSpeedTier { int chunkKb; int durMs; const TCHAR* name; };
|
||||
|
||||
static const FileSpeedTier kFileSpeedTiers[] = {
|
||||
{ 64, 200, _T("最慢") }, // ≈0.31 MB/s
|
||||
{ 64, 100, _T("慢") }, // ≈0.63 MB/s
|
||||
{ 64, 50, _T("默认") }, // ≈1.25 MB/s
|
||||
{ 128, 50, _T("快") }, // ≈2.5 MB/s
|
||||
{ 256, 50, _T("更快") }, // ≈5 MB/s
|
||||
{ 512, 50, _T("很快") }, // ≈10 MB/s
|
||||
{ 1024, 0, _T("不限速") }, // 网络上限
|
||||
};
|
||||
#define FILE_SPEED_TIER_COUNT 7
|
||||
#define FILE_SPEED_DEFAULT_TIER 2 // 默认档位
|
||||
|
||||
class CFileSpeedDlg : public CDialog
|
||||
{
|
||||
public:
|
||||
enum { IDD = IDD_FILE_SPEED };
|
||||
|
||||
CFileSpeedDlg(int chunkKb, int durMs, CWnd* pParent = NULL)
|
||||
: CDialog(CFileSpeedDlg::IDD, pParent), m_chunkKb(chunkKb), m_durMs(durMs)
|
||||
{
|
||||
}
|
||||
|
||||
int GetChunkKb() const { return m_chunkKb; }
|
||||
int GetDurMs() const { return m_durMs; }
|
||||
|
||||
protected:
|
||||
int m_chunkKb;
|
||||
int m_durMs;
|
||||
|
||||
static int TierIndexFor(int chunkKb, int durMs)
|
||||
{
|
||||
for (int i = 0; i < FILE_SPEED_TIER_COUNT; i++)
|
||||
if (kFileSpeedTiers[i].chunkKb == chunkKb && kFileSpeedTiers[i].durMs == durMs)
|
||||
return i;
|
||||
return FILE_SPEED_DEFAULT_TIER; // 未知值回落默认
|
||||
}
|
||||
|
||||
static void FormatSpeed(int idx, CString& out)
|
||||
{
|
||||
const FileSpeedTier& t = kFileSpeedTiers[idx];
|
||||
// 档位名与格式串经 _TR/_LF 走多语言表(LangManager),语言文件以中文原文为 key。
|
||||
if (t.durMs <= 0) {
|
||||
out.FormatL(_T("%s · 不受限速(受网络带宽约束)"), _LF(t.name));
|
||||
return;
|
||||
}
|
||||
double mbps = (double)t.chunkKb * 1024.0 / (t.durMs / 1000.0) / (1024.0 * 1024.0);
|
||||
out.FormatL(_T("%s · 约 %.2f MB/s"), _LF(t.name), mbps);
|
||||
}
|
||||
|
||||
int GetSliderPos()
|
||||
{
|
||||
int pos = (int)SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_GETPOS, 0, 0);
|
||||
if (pos < 0) pos = 0;
|
||||
if (pos >= FILE_SPEED_TIER_COUNT) pos = FILE_SPEED_TIER_COUNT - 1;
|
||||
return pos;
|
||||
}
|
||||
|
||||
void UpdateLabel()
|
||||
{
|
||||
CString s;
|
||||
FormatSpeed(GetSliderPos(), s);
|
||||
SetDlgItemText(IDC_FSPEED_LABEL, s);
|
||||
}
|
||||
|
||||
virtual BOOL OnInitDialog() override
|
||||
{
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETRANGE, TRUE,
|
||||
MAKELONG(0, FILE_SPEED_TIER_COUNT - 1));
|
||||
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPAGESIZE, 0, 1);
|
||||
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETTICFREQ, 0, 1);
|
||||
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPOS, TRUE, TierIndexFor(m_chunkKb, m_durMs));
|
||||
|
||||
UpdateLabel();
|
||||
TranslateDialog(this);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
virtual void OnOK() override
|
||||
{
|
||||
int idx = GetSliderPos();
|
||||
m_chunkKb = kFileSpeedTiers[idx].chunkKb;
|
||||
m_durMs = kFileSpeedTiers[idx].durMs;
|
||||
CDialog::OnOK();
|
||||
}
|
||||
|
||||
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
||||
{
|
||||
(void)nSBCode; (void)nPos; (void)pScrollBar;
|
||||
UpdateLabel(); // 拖动过程中实时刷新预估速度
|
||||
}
|
||||
|
||||
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam) override
|
||||
{
|
||||
if (LOWORD(wParam) == IDC_FSPEED_RESET && HIWORD(wParam) == BN_CLICKED) {
|
||||
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPOS, TRUE, FILE_SPEED_DEFAULT_TIER);
|
||||
UpdateLabel();
|
||||
return TRUE;
|
||||
}
|
||||
return CDialog::OnCommand(wParam, lParam);
|
||||
}
|
||||
|
||||
DECLARE_MESSAGE_MAP()
|
||||
};
|
||||
|
||||
BEGIN_MESSAGE_MAP(CFileSpeedDlg, CDialog)
|
||||
ON_WM_HSCROLL()
|
||||
END_MESSAGE_MAP()
|
||||
@@ -2049,3 +2049,20 @@ Minimal
|
||||
JPEG质量=JPEG Qualitaet
|
||||
最大宽度为期望编码宽度;JPEG 质量 1~100=Max. Breite ist die Ziel-Codierbreite; JPEG Qualitaet 1~100
|
||||
预览质量等级已保存,下次发送预览时生效。=Vorschau-Qualitaetsstufen gespeichert. Wirksam bei der naechsten Vorschau.
|
||||
|
||||
; ============================================
|
||||
; File Transfer Speed Dialog (文件传输速度)
|
||||
; ============================================
|
||||
文件传输速度(&F)...=&Dateiuebertragungsgeschwindigkeit...
|
||||
文件传输速度=Dateiuebertragungsgeschwindigkeit
|
||||
拖动滑块设置文件传输速度:=Schieberegler ziehen, um die Uebertragungsgeschwindigkeit festzulegen:
|
||||
最慢=Langsamste
|
||||
慢=Langsam
|
||||
默认=Standard
|
||||
快=Schnell
|
||||
更快=Schneller
|
||||
很快=Sehr schnell
|
||||
不限速=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.
|
||||
@@ -2050,3 +2050,20 @@ Minimal
|
||||
JPEG质量=JPEG Quality
|
||||
最大宽度为期望编码宽度;JPEG 质量 1~100=Max width is the target encode width; JPEG quality 1~100
|
||||
预览质量等级已保存,下次发送预览时生效。=Preview quality levels saved. They take effect the next time a preview is sent.
|
||||
|
||||
; ============================================
|
||||
; File Transfer Speed Dialog (文件传输速度)
|
||||
; ============================================
|
||||
文件传输速度(&F)...=&File Transfer Speed...
|
||||
文件传输速度=File Transfer Speed
|
||||
拖动滑块设置文件传输速度:=Drag the slider to set the transfer speed:
|
||||
最慢=Slowest
|
||||
慢=Slow
|
||||
默认=Default
|
||||
快=Fast
|
||||
更快=Faster
|
||||
很快=Very Fast
|
||||
不限速=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.
|
||||
@@ -2041,3 +2041,20 @@ Minimal
|
||||
JPEG质量=JPEG品質
|
||||
最大宽度为期望编码宽度;JPEG 质量 1~100=最大寬度為期望編碼寬度;JPEG 品質 1~100
|
||||
预览质量等级已保存,下次发送预览时生效。=預覽品質等級已儲存,下次傳送預覽時生效。
|
||||
|
||||
; ============================================
|
||||
; File Transfer Speed Dialog (文件传输速度)
|
||||
; ============================================
|
||||
文件传输速度(&F)...=檔案傳輸速度(&F)...
|
||||
文件传输速度=檔案傳輸速度
|
||||
拖动滑块设置文件传输速度:=拖曳滑桿設定檔案傳輸速度:
|
||||
最慢=最慢
|
||||
慢=慢
|
||||
默认=預設
|
||||
快=快
|
||||
更快=更快
|
||||
很快=很快
|
||||
不限速=不限速
|
||||
%s · 约 %.2f MB/s=%s · 約 %.2f MB/s
|
||||
%s · 不受限速(受网络带宽约束)=%s · 不限速(受網路頻寬限制)
|
||||
文件传输速度已保存。上传速度重启主控端后生效;下载速度下次打开文件管理或远程桌面后生效。=檔案傳輸速度已儲存。上傳速度重啟主控端後生效;下載速度下次開啟檔案管理或遠端桌面後生效。
|
||||
@@ -1056,13 +1056,20 @@
|
||||
#define IDC_STATIC_SHARE_DAYS 2588
|
||||
#define IDC_EDIT_SHARE_DAYS 2589
|
||||
|
||||
// 文件传输速度调节对话框
|
||||
#define IDD_FILE_SPEED 403
|
||||
#define ID_TOOL_FILE_SPEED 33085
|
||||
#define IDC_FSPEED_SLIDER 2590
|
||||
#define IDC_FSPEED_LABEL 2591
|
||||
#define IDC_FSPEED_RESET 2592
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 403
|
||||
#define _APS_NEXT_COMMAND_VALUE 33085
|
||||
#define _APS_NEXT_CONTROL_VALUE 2590
|
||||
#define _APS_NEXT_RESOURCE_VALUE 404
|
||||
#define _APS_NEXT_COMMAND_VALUE 33086
|
||||
#define _APS_NEXT_CONTROL_VALUE 2593
|
||||
#define _APS_NEXT_SYMED_VALUE 105
|
||||
#endif
|
||||
#endif
|
||||
Reference in new issue
Block a user