options.cpp

来自「一个FTP下载的源代码。代码质量非常高」· C++ 代码 · 共 1,782 行 · 第 1/4 页

CPP
1,782
字号
									_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
								};

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( ((CFileZillaApp *)AfxGetApp())->m_appPath + _T("FileZilla.xml") );
	}
	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( ((CFileZillaApp *)AfxGetApp())->m_appPath + _T("FileZilla.xml") );
	}
	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 = "mit.edu;";
		else if (nOptionID==OPTION_IDENTSYSTEM)
			res = _T("UNIX");
	}
	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;

					val = _ttoi(str);
					error = 0;
				}
			}
			RegCloseKey(key);
		}
		
		if (error)
		{
			memset(buffer,0,100);
			if (RegOpenKey(HKEY_LOCAL_MACHINE, _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;
						
						val = _ttoi(str);
						error = 0;
					}
				}
				RegCloseKey(key);
			}
		}
		delete [] buffer;
	}	
	switch (nOptionID)
	{
		case OPTION_KEEPALIVE:
			if (error)
				val=1;
			break;
		case OPTION_INTERVALLOW:
			if (val>500)
				val=15;
			else if (val<15)
				val=15;
			break;
		case OPTION_INTERVALHIGH:
			if (val>500)
				val=30;
			else if (val<15)
				val=30;
			break;			
		case OPTION_TIMEOUTLENGTH:
			if (val<30)
				val=30;
			else if (val>999)
				val=30;
			break;
		case OPTION_NUMRETRIES:
			if (val<0 || error)
				val=5;
			else if (val>999)
				val=5;
			break;
		case OPTION_RETRYDELAY:
			if (val<0 || error)
				val=5;
			else if (val>999)
				val=5;
			break;
		case OPTION_DEFAULTFOLDERTYPE:
			if (val!=1)
				val=0;
			break;
		case OPTION_TRANSFERMODE:
			if (val<0 || val>2)
				val=0;
			break;
		case OPTION_PORTRANGELOW:
			if (val<1 || val>65535)
				val=1;
			break;
		case OPTION_PORTRANGEHIGH:
			if (val<1 || val>65535)
				val=65535;
			break;
		case OPTION_MAXCACHETIME:
			if (val<=0)
				val=60*30;
			break;
		case OPTION_LOCALFILESIZEFORMAT:
			if (error || val<0 || val >3)
				val=0;
			break;
		case OPTION_REMOTEFILESIZEFORMAT:
			if (error || val<0 || val >3)
				val=1;
			break;
		case OPTION_USECACHE:
			if (error)
				val=1;
			break;
		case OPTION_TRANSFERPRIMARYMAXSIZE:
			if (error || val < 0 || val > 999999)
				val=1024;
			break;
		case OPTION_TRANSFERAPICOUNT:
			if (error || val < 1 || val > 10)
				val=2;
			break;
		case OPTION_TRANSFERUSEMULTIPLE:
			if (error)
				val=1;
			break;
		case OPTION_FILEEXISTSACTION:
			if (val<0 || val>5)
				val=0;
			break;
		case OPTION_SPEEDLIMIT_DOWNLOAD_VALUE:
		case OPTION_SPEEDLIMIT_UPLOAD_VALUE:
			if (error || val<=0)
				val=10;
			break;
		case OPTION_SHOWLOCALSTATUSBAR:
		case OPTION_SHOWREMOTESTATUSBAR:
			if (error)
				val = 1;
			break;
		case OPTION_HIDEREMOTECOLUMNS:
			if (error)
				val = 0x20;
			break;
		case OPTION_SSHUSECOMPRESSION:
		case OPTION_SSHPROTOCOL:
			if (val < 0 || val > 2)
				val = 0;
			break;
		case OPTION_MINIMIZETOTRAY:
			if (val < 0 || val > 2)
				val = 0;
			break;
		case OPTION_LOCAL_DOUBLECLICK_ACTION:
		case OPTION_REMOTE_DOUBLECLICK_ACTION:
			if (val < 0 || val > 2)
				val = 0;
			break;
		case OPTION_LOCALTREEVIEWLOCATION:
		case OPTION_REMOTETREEVIEWLOCATION:
			if (val < 0 || val > 1)
				val = 0;
			break;
		case OPTION_USEREGISTRY:
			if (error || val < 0 || val > 2)
				val = -1;
			break;
	}
	if (!m_OptionsCache[nOptionID-1].bCached)
	{
		m_OptionsCache[nOptionID-1].bCached = TRUE;
		m_OptionsCache[nOptionID-1].createtime = CTime::GetCurrentTime();
		m_OptionsCache[nOptionID-1].value = val;
		m_OptionsCache[nOptionID-1].nType = 1;
	}

	return val;
}

void COptions::OnOK() 
{
	if (!UpdateData(true))
		return;
	if (!GetCurPage()->UpdateData(TRUE))
		return;
	for (std::list<CSAPrefsSubDlg *>::iterator iter = m_PageList.begin(); iter != m_PageList.end(); iter++)

⌨️ 快捷键说明

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