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
123 lines
4.1 KiB
C++
123 lines
4.1 KiB
C++
// 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()
|