options.cpp

来自「一个支持FTP,SFTP的客户端程序」· C++ 代码 · 共 1,863 行 · 第 1/5 页

CPP
1,863
字号

	//Store Transfer page
	SetOption(OPTION_PRESERVEDOWNLOADFILETIME, m_OptionsTransferPage.m_bPreserveTime);
	int value=_ttoi(m_OptionsTransferPage.m_MaxPrimarySize);
	if (value<0)
		value=1024;
	SetOption(OPTION_TRANSFERPRIMARYMAXSIZE, value);
	value=_ttoi(m_OptionsTransferPage.m_MaxConnCount);
	if (value<0 || value>10)
		value=2;
	SetOption(OPTION_TRANSFERAPICOUNT, value);
	SetOption(OPTION_TRANSFERUSEMULTIPLE, m_OptionsTransferPage.m_bUseMultiple);
	SetOption(OPTION_FILEEXISTSACTION, m_OptionsTransferPage.m_nFileExistsAction);
	SetOption(OPTION_VMSALLREVISIONS, m_OptionsTransferPage.m_vmsall);

	//Store View/Edit page
	COptions::SetOption(OPTION_VIEWEDITDEFAULT, m_OptionsViewEditPage.m_Default);
	COptions::SetOption(OPTION_VIEWEDITCUSTOM, m_OptionsViewEditPage.m_Custom2);

	//Store ident settings
	SetOption(OPTION_IDENT, m_OptionsIdentPage.m_bIdent);
	SetOption(OPTION_IDENTCONNECT, m_OptionsIdentPage.m_bIdentConnect);
	SetOption(OPTION_IDENTSAMEIP, m_OptionsIdentPage.m_bSameIP);
	SetOption(OPTION_IDENTUSER, m_OptionsIdentPage.m_UserID);
	SetOption(OPTION_IDENTSYSTEM, m_OptionsIdentPage.m_System);

	//Store language page
	ProcessLanguagePage();

	//Store Speed Limit page
	SetOption(OPTION_SPEEDLIMIT_DOWNLOAD_TYPE, m_OptionsSpeedLimitPage.m_DownloadSpeedLimitType);
	SetOption(OPTION_SPEEDLIMIT_DOWNLOAD_VALUE, m_OptionsSpeedLimitPage.m_DownloadValue);

	SetOption(OPTION_SPEEDLIMIT_UPLOAD_TYPE, m_OptionsSpeedLimitPage.m_UploadSpeedLimitType);
	SetOption(OPTION_SPEEDLIMIT_UPLOAD_VALUE, m_OptionsSpeedLimitPage.m_UploadValue);

	m_Sync.Lock();
	m_OptionsSpeedLimitPage.Copy( m_OptionsSpeedLimitPage.m_DownloadSpeedLimits, m_DownloadSpeedLimits);
	m_OptionsSpeedLimitPage.Copy( m_OptionsSpeedLimitPage.m_UploadSpeedLimits, m_UploadSpeedLimits);
	m_Sync.Unlock();

	SetOption(OPTION_SPEEDLIMIT_DOWNLOAD_RULES, GetSpeedLimitsString( m_DownloadSpeedLimits));
	SetOption(OPTION_SPEEDLIMIT_UPLOAD_RULES, GetSpeedLimitsString( m_UploadSpeedLimits));

	//Store SSH Page
	SetOption(OPTION_SSHUSECOMPRESSION, m_OptionsSshPage.m_nCompression);
	SetOption(OPTION_SSHPROTOCOL, m_OptionsSshPage.m_nProtocol);

	//Store pane layout page
	SetOption(OPTION_LOCALTREEVIEWLOCATION, m_OptionsPaneLayoutPage.m_nLocalTreePos);
	SetOption(OPTION_REMOTETREEVIEWLOCATION, m_OptionsPaneLayoutPage.m_nRemoteTreePos);
	SetOption(OPTION_PANELAYOUT_SWITCHLAYOUT, m_OptionsPaneLayoutPage.m_bSwitchLayout);

	//Store message log page
	SetOption(OPTION_DEBUGLOGTOFILE, m_OptionsLoggingPage.m_bLogToFile);
	SetOption(OPTION_DEBUGLOGFILE, m_OptionsLoggingPage.m_LogFile);
	SetOption(OPTION_MESSAGELOG_USECUSTOMFONT, m_OptionsLoggingPage.m_bUseCustomFont);
	SetOption(OPTION_MESSAGELOG_FONTNAME, m_OptionsLoggingPage.m_FontName);
	SetOption(OPTION_MESSAGELOG_FONTSIZE, m_OptionsLoggingPage.m_nFontSize);
	SetOption(OPTION_LOGTIMESTAMPS, m_OptionsLoggingPage.m_timestamps);

	//Store transfer compression page
	SetOption(OPTION_MODEZ_USE, m_OptionsTransferCompressionPage.m_useCompression);
	SetOption(OPTION_MODEZ_LEVEL, _ttoi(m_OptionsTransferCompressionPage.m_level));

	return TRUE;
}

BOOL COptions::OnInitDialog()
{
	CSAPrefsDialog::OnInitDialog();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zur點kgeben
}

typedef struct
{
	TCHAR name[30];
	int nType;
} t_Option;

static t_Option options[OPTIONS_NUM]={ _T("Logontype"),					1,	_T("Pasv"),								1,
									_T("FWHost"),						0,	_T("FWPort"),							1,
									_T("FWUser"),						0,	_T("FWPass"),							0,
									_T("Timeout Length"),				1,	_T("Use Keep Alive"),					1,
									_T("Interval Low"),					1,	_T("Interval High"),					1,
									_T("Num Retries"),					1,	_T("Retry Delay"),						1,
									_T("Last Server Host"),				0,	_T("Last Server Port"),					1,
									_T("Last Server User"),				0,	_T("Last Server Pass"),					0,
									_T("Proxy Type"),					1,	_T("Proxy Host"),						0,
									_T("Proxy Port"),					1,	_T("Proxy User"),						0,
									_T("Proxy Pass"),					0,	_T("Proxy Use Logon"),					1,
									_T("Last Server Path"),				0,	_T("Last Server Firewall Bypass"),		1,
									_T("Language"),						0,	_T("Default Folder Type"),				1,
									_T("Default Folder"),				0,	_T("Transfer Mode"),					1,
									_T("ASCII files"),					0,	_T("No view labels"),					1,
									_T("No toolbar"),					1,	_T("No Quickconnbar"),					1,
									_T("No Statusbar"),					1,	_T("No Messagelog"),					1,
									_T("No Treeview"),					1,	_T("No Queue"),							1,
									_T("Remember View settings"),		1,	_T("Local List View Style"),			1,
									_T("Hide Local Columns"),			1,	_T("Remote List View Style"),			1,
									_T("Hide Remote Columns"),			1,	_T("Sitemanager on startup"),			1,
									_T("Use GSS"),						1,	_T("GSS enabled servers"),				0,
									_T("Last Server dont save pass"),	1,	_T("Remember Window Size"),				1,
									_T("Last Window Size"),				0,	_T("Debug Trace"),						1,
									_T("Debug Show Listing"),			1,	_T("Debug Log To File"),				1,
									_T("Debug Log File"),				0,	_T("Limit Port Range"),					1,
									_T("Port Range Low"),				1,	_T("Port Range High"),					1,
									_T("Remember Local View"),			1,	_T("Remember Remote View"),				1,
									_T("Last Splitter Pos"),			0,	_T("Use directory cache"),				1,
									_T("Max Dir Cache Time"),			1,	_T("Last Server Type"),					1,
									_T("Minimize to Tray"),				1,	_T("Show Remote Treeview"),				1,
									_T("Remember Local column widths"),	1,	_T("Remember Remote column widths"),	1,
									_T("Local column widths"),			0,	_T("Remote column widths"),				0,
									_T("Local Filesize format"),		1,	_T("Remote Filesize format"),			1,
									_T("Last server name"),				0,	_T("Preserve DL file time"),			1,
									_T("Run in Secure Mode"),			0,	_T("Default View Edit Prog"),			0,
									_T("Custom View Edit Progs"),		0,	_T("Always Show Hidden Files"),			1,
									_T("Primary TransferMax Size"),		1,	_T("Enable debug menu"),				1,
									_T("Transfer Api Count"),			1,	_T("Use Registry"),						1,
									_T("Use multiple connections"),		1,	_T("Use Ident server"),					1,
									_T("Ident when connecting only"),	1,	_T("Ident reply same IP"),				1,
									_T("Ident OS"),						0,	_T("Ident UserID"),						0,
									_T("File exists Action"),			1,	_T("SpeedLimit Download Type"),			1,
									_T("SpeedLimit Upload Type"),		1,	_T("SpeedLimit Download Value"),		1,
									_T("SpeedLimit Upload Value"),		1,	_T("SpeedLimit Download Rules"),		0,
									_T("SpeedLimit Upload Rules"),		0,	_T("SiteManager Folders First"),		1,
									_T("No Expand SiteManager Folders"),1,	_T("Show Local Statusbar"),				1,
									_T("Show Remote Statusbar"),		1,	_T("Local column sort direction"),		1,
									_T("Remote column sort direction"),	1,	_T("SSH Use Compression"),				1,
									_T("SSH Force Protocol"),			1,	_T("Transfer IP"),						0,
									_T("Local doubleclick action"),		1,	_T("Remote doubleclick action"),		1,
									_T("Local treeview location"),		1,	_T("Remote treeview location"),			1,
									_T("Last Server transfer mode"),	1,  _T("Use custom messaglog font"),		1,
									_T("Messagelog font name"),			0,	_T("Messagelog font size"),				1,
									_T("Switch view locations"),		1,	_T("Use MODE Z "),						1,
									_T("MODE Z level"),					1,	_T("Transfer IP v6"),					0,
									_T("Enable IPv6"),					1,	_T("Log Timestamps"),					1,
									_T("VMS display all revisions"),	1,	_T("Last Server UTF8"),					1,
									_T("Last Server account"),			0
								};

void COptions::SetOption(int nOptionID,int value)
{
	ASSERT(options[nOptionID-1].nType==1);

	Init();
	CSingleLock lock(&m_Sync, TRUE);

	m_OptionsCache[nOptionID-1].bCached=TRUE;
	m_OptionsCache[nOptionID-1].createtime=CTime::GetCurrentTime();
	m_OptionsCache[nOptionID-1].value=value;
	m_OptionsCache[nOptionID-1].nType=1;

	if (m_bUseXML)
	{
		m_markup.ResetPos();
		if (!m_markup.FindChildElem( _T("Settings") ))
			m_markup.AddChildElem( _T("Settings") );

		CString valuestr;
		valuestr.Format( _T("%d"), value);
		m_markup.IntoElem();
		BOOL res=m_markup.FindChildElem();
		while (res)
		{
			CString name=m_markup.GetChildAttrib( _T("name"));
			if (!_tcscmp(name, options[nOptionID-1].name))
			{
				m_markup.SetChildAttrib(_T("name"), options[nOptionID-1].name);
				m_markup.SetChildAttrib(_T("type"), _T("numeric"));
				m_markup.SetChildData(valuestr);
				break;
			}
			res=m_markup.FindChildElem();
		}
		if (!res)
		{
			m_markup.InsertChildElem( _T("Item"), valuestr );
			m_markup.SetChildAttrib(_T("name"), options[nOptionID-1].name);
			m_markup.SetChildAttrib(_T("type"), _T("numeric"));
		}
		m_markup.Save(GetXmlFileName());
	}
	else
	{
		unsigned char tmp[4];
		memcpy(tmp,&value,4);
		HKEY key;
		if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\FileZilla"), 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &key, NULL)==ERROR_SUCCESS)
		{
			RegSetValueEx(key, options[nOptionID-1].name, 0, REG_DWORD, tmp, 4);
			RegCloseKey(key);
		}
	}
}

void COptions::SetOption(int nOptionID, CString value)
{
	ASSERT(!options[nOptionID-1].nType);

	Init();
	CSingleLock lock(&m_Sync, TRUE);

	m_OptionsCache[nOptionID-1].bCached=TRUE;
	m_OptionsCache[nOptionID-1].createtime=CTime::GetCurrentTime();
	m_OptionsCache[nOptionID-1].str=value;
	m_OptionsCache[nOptionID-1].nType=0;

	if (m_bUseXML)
	{
		m_markup.ResetPos();
		if (!m_markup.FindChildElem( _T("Settings") ))
			m_markup.AddChildElem( _T("Settings") );

		CString str;
		m_markup.IntoElem();
		str=m_markup.GetTagName();
		BOOL res=m_markup.FindChildElem();
		while (res)
		{
			CString name=m_markup.GetChildAttrib( _T("name"));
			if (!_tcscmp(name, options[nOptionID-1].name))
			{
				m_markup.SetChildAttrib(_T("name"), options[nOptionID-1].name);
				m_markup.SetChildAttrib(_T("type"), _T("string"));
				m_markup.SetChildData(value);
				break;
			}
			res=m_markup.FindChildElem();
		}
		if (!res)
		{
			m_markup.InsertChildElem( _T("Item"), value );
			m_markup.SetChildAttrib(_T("name"), options[nOptionID-1].name);
			m_markup.SetChildAttrib(_T("type"), _T("string"));
		}
		m_markup.Save(GetXmlFileName());
	}
	else
	{
		LPTSTR tmp=new TCHAR[value.GetLength()+1];
		LPCTSTR str=value;
		_tcscpy(tmp,str);
		HKEY key;
		if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\FileZilla"), 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &key, NULL)==ERROR_SUCCESS)
		{
			RegSetValueEx(key, options[nOptionID-1].name, 0, REG_SZ, (unsigned char *)tmp, (_tcslen(tmp)+1)*sizeof(TCHAR) );
			RegCloseKey(key);
		}
		delete [] tmp;
	}
}

CString COptions::GetOption(int nOptionID)
{
	ASSERT(!options[nOptionID-1].nType);

	Init();
	CSingleLock lock(&m_Sync, TRUE);

	CString res = "";
	if (m_OptionsCache[nOptionID-1].bCached)
	{
		ASSERT(!m_OptionsCache[nOptionID-1].nType);
		CTimeSpan span=CTime::GetCurrentTime()-m_OptionsCache[nOptionID-1].createtime;
		if (span.GetTotalSeconds()<120 || m_bUseXML)
			res=m_OptionsCache[nOptionID-1].str;
		else
			m_OptionsCache[nOptionID-1].bCached=FALSE;
	}
	if (!m_OptionsCache[nOptionID-1].bCached)
	{
		HKEY key;
		unsigned long tmp=2000;
		unsigned char *buffer=new unsigned char[2000];
		BOOL exists = FALSE;

		if (RegOpenKey(HKEY_CURRENT_USER, _T("Software\\FileZilla"), &key)==ERROR_SUCCESS)
		{
			memset(buffer, 0, 2000);

			if (RegQueryValueEx(key, options[nOptionID-1].name, NULL, NULL, buffer, &tmp)==ERROR_SUCCESS)
			{
				exists=TRUE;
				res=(LPTSTR)buffer;
			}
			RegCloseKey(key);
		}

		if (!exists || (!_ttoi(res) && nOptionID==OPTION_RUNINSECUREMODE))
		{
			memset(buffer, 0, 2000);
			if (RegOpenKey(HKEY_LOCAL_MACHINE, _T("Software\\FileZilla") ,&key)==ERROR_SUCCESS)
			{
				if (RegQueryValueEx(key, options[nOptionID-1].name, NULL, NULL, buffer, &tmp)==ERROR_SUCCESS)
					res = buffer;
				RegCloseKey(key);
			}
		}
		delete [] buffer;
	}
	if (res == "")
	{
		if (nOptionID == OPTION_ASCIIFILES)
			res = "ASP;BAT;C;CFM;CGI;CONF;CPP;CSS;DHTML;DIZ;H;HPP;HTM;HTML;INC;JS;MAK;NFO;PAS;PATCH;PHP;PHTML;PINERC;PL;QMAIL;SH;SHTML;SQL;TCL;TPL;TXT;VBS;";
		else if (nOptionID == OPTION_GSSSERVERS)
			res = _T("mit.edu;");
		else if (nOptionID == OPTION_IDENTSYSTEM)
			res = _T("UNIX");
		else if (nOptionID == OPTION_ANONPWD)
			res = _T("anon@");
	}
	if (!m_OptionsCache[nOptionID-1].bCached)
	{
		m_OptionsCache[nOptionID-1].bCached=TRUE;
		m_OptionsCache[nOptionID-1].createtime=CTime::GetCurrentTime();
		m_OptionsCache[nOptionID-1].str=res;
		m_OptionsCache[nOptionID-1].nType=0;
	}
	return res;
}

int COptions::GetOptionVal(int nOptionID)
{
	ASSERT(options[nOptionID-1].nType==1);

	Init();
	CSingleLock lock(&m_Sync, TRUE);

	int val=0;
	if (m_OptionsCache[nOptionID-1].bCached)
	{
		ASSERT(m_OptionsCache[nOptionID-1].nType==1);
		CTimeSpan span=CTime::GetCurrentTime()-m_OptionsCache[nOptionID-1].createtime;
		if (span.GetTotalSeconds()<120 || m_bUseXML)
			return m_OptionsCache[nOptionID-1].value;
		else
			m_OptionsCache[nOptionID-1].bCached=FALSE;
	}
	int error=1;
	if (!m_OptionsCache[nOptionID-1].bCached)
	{
		error=1;
		HKEY key;
		unsigned char *buffer = new unsigned char[200];
		unsigned long tmp=100;

		if (RegOpenKey(HKEY_CURRENT_USER, _T("Software\\FileZilla") ,&key)==ERROR_SUCCESS)
		{
			DWORD type;
			if (RegQueryValueEx(key, options[nOptionID-1].name, NULL, &type, buffer, &tmp)==ERROR_SUCCESS)
			{
				if (type == REG_DWORD)
				{
					if (tmp<=4)
					{
						memcpy(&val,buffer,tmp);
						error=0;
					}
				}
				else
				{
					int i;
					LPTSTR str = (LPTSTR)buffer;
					for (i = 0; i < 100; i++)
					{
						if (!str[i])
							break;
					}
					if (i == 100)
						str[99] = 0;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?