options.cpp

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

CPP
1,863
字号

	if (!status.m_size)
	{
		m_bUseXML = TRUE;
		m_markup.AddElem( _T("FileZilla") );
		return;
	}

	if (m_markup.Load(GetXmlFileName()))
	{
		if (m_markup.FindElem( _T("FileZilla") ))
		{
			if (!m_markup.FindChildElem( _T("Settings") ))
				m_markup.AddChildElem( _T("Settings") );

			CString str;
			m_markup.IntoElem();
			str=m_markup.GetTagName();
			while (m_markup.FindChildElem())
			{
				CString value=m_markup.GetChildData();
				CString name=m_markup.GetChildAttrib( _T("name") );
				CString type=m_markup.GetChildAttrib( _T("type") );
				for (int i=0;i<OPTIONS_NUM;i++)
				{
					if (!_tcscmp(name, options[i].name))
					{
						if (m_OptionsCache[i].bCached)
							::AfxTrace( _T("Item '%s' is already in cache, ignoring item\n"), name);
						else
						{
							m_OptionsCache[i].bCached=TRUE;
							if (type=="numeric")
							{
								m_OptionsCache[i].nType=1;
								m_OptionsCache[i].value=_ttoi(value);
							}
							else
							{
								if (type!="string")
									::AfxTrace( _T("Unknown option type '%s' for item '%s', assuming string\n"), type, name);
								m_OptionsCache[i].nType=0;
								m_OptionsCache[i].str=value;
							}
						}
						break;
					}
				}
			}
			m_bUseXML = TRUE;
			return;
		}
	}
	AfxMessageBox(IDS_ERRORMSG_SETTINGS_XMLFILE_INVALID);
}

BOOL COptions::LockXML(CMarkupSTL **pXml)
{
	Init();
	ASSERT(pXml);

	m_Sync.Lock();
	if (!m_bUseXML)
	{
		m_Sync.Unlock();
		return FALSE;
	}

	*pXml=&m_markup;
	return TRUE;
}

void COptions::UnlockXML()
{
	ASSERT (m_bUseXML);
	m_markup.Save(GetXmlFileName());
	m_Sync.Unlock();
}

void COptions::Import()
{
	Init();
	CSingleLock lock(&m_Sync, TRUE);

	CFileDialog dlg(TRUE, _T(".xml"), _T("FileZilla settings"), OFN_FILEMUSTEXIST, _T("XML files (*.xml)|*.xml||") );
	if (dlg.DoModal()==IDOK)
	{
		if (m_markup.Load( dlg.GetPathName() ))
		{
			if (m_markup.FindElem( _T("FileZilla") ))
			{
				if (!m_markup.FindChildElem( _T("Settings") ))
					m_markup.AddChildElem( _T("Settings") );

				CString str;
				m_markup.IntoElem();
				str=m_markup.GetTagName();
				while (m_markup.FindChildElem())
				{
					CString value=m_markup.GetChildData();
					CString name=m_markup.GetChildAttrib( _T("name") );
					CString type=m_markup.GetChildAttrib( _T("type") );
					for (int i=0;i<OPTIONS_NUM;i++)
					{
						if (!_tcscmp(name, options[i].name))
						{
							if (type=="numeric")
								SetOption(i+1, _ttoi(value));
							else
							{
								if (type!="string")
									::AfxTrace( _T("Unknown option type '%s' for item '%s', assuming string\n"), type, name);
								SetOption(i+1, value);
							}
							break;
						}
					}
				}
				AfxMessageBox(IDS_OPTIONS_IMPORTOK, MB_ICONINFORMATION);
				return;
			}
		}
		CString str;
		str.Format(IDS_OPTIONS_IMPORTFAILURE, dlg.GetPathName());
		AfxMessageBox(str, MB_ICONEXCLAMATION);
	}
}

bool COptions::InitUDRules()
{
	FillSpeedLimitsListFromString(m_DownloadSpeedLimits, GetOption( OPTION_SPEEDLIMIT_DOWNLOAD_RULES));
	FillSpeedLimitsListFromString(m_UploadSpeedLimits, GetOption( OPTION_SPEEDLIMIT_UPLOAD_RULES));

	return true;
}

void COptions::FillSpeedLimitsListFromString(SPEEDLIMITSLIST &list, CString str)
{
	list.clear();

	while ( str.GetLength() > 0)
	{
		int i = str.Find( '|');
		CString parse;

		if ( i < 0)
		{
			parse = str;
			str.Empty();
		}
		else
		{
			parse = str.Left( i);
			str = str.Mid( i + 1);
		}

		CSpeedLimit *sl = CSpeedLimit::ParseSpeedLimit( parse);

		if ( sl)
			list.push_back(sl);
	}
}

CString COptions::GetSpeedLimitsString(SPEEDLIMITSLIST &list)
{
	CString str;

	CSingleLock lock(&m_Sync, TRUE);

	for (unsigned int i = 0; i < list.size(); i++)
		str += (( i > 0) ? _T("|") : _T("")) + list[i]->GetSpeedLimitString();

	return str;
}

void COptions::ClearStaticOptions()
{
	unsigned int i;
	for (i = 0; i < m_DownloadSpeedLimits.size(); i++)
		delete m_DownloadSpeedLimits[i];

	m_DownloadSpeedLimits.clear();

	for (i = 0; i < m_UploadSpeedLimits.size(); i++)
		delete m_UploadSpeedLimits[i];

	m_UploadSpeedLimits.clear();
}

BOOL COptions::CheckUseXML()
{
	CSingleLock lock(&m_Sync, TRUE);

	Init();

	if (m_bUseXML)
		return TRUE;

	if (GetOptionVal(OPTION_USEREGISTRY) <= 0)
	{
		CFileStatus status;
		BOOL res = CFile::GetStatus(GetXmlFileName(), status);
		if (!res || !status.m_size)
		{
			if (!GetOptionVal(OPTION_USEREGISTRY) ||
				AfxMessageBox(IDS_QUESTION_OPTIONS_FIRSTSTART, MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2)==IDNO)
			{
				m_markup.AddElem( _T("FileZilla") );
				m_markup.Save(GetXmlFileName());
				m_bUseXML = TRUE;
				return TRUE;
			}
			else
			{
				SetOption(OPTION_USEREGISTRY, 1);
				return FALSE;
			}
		}
		else
			return TRUE;
	}
	else
		return FALSE;
}

void COptions::GetKey(HKEY key, CString keyname, CString &value)
{
	unsigned char *buffer=new unsigned char[1000];

	unsigned long tmp=1000;
	if (RegQueryValueEx(key, keyname, NULL, NULL, buffer, &tmp)!=ERROR_SUCCESS)
		value="";
	else
		value=(LPTSTR)buffer;
	delete [] buffer;
	return;
}

void COptions::GetKey(HKEY key, CString keyname, int &value)
{
	__int64 val2;
	GetKey(key, keyname, val2);
	value=static_cast<int>(val2);
}

void COptions::GetKey(HKEY key, CString keyname, __int64 &value)
{
	unsigned char *buffer=new unsigned char[1000];

	unsigned long tmp=1000;
	if (RegQueryValueEx(key,keyname,NULL,NULL,buffer,&tmp)!=ERROR_SUCCESS)
		value=0;
	else
	{
		if (_tcslen((LPTSTR)buffer)>20)
			value=0;
		else
			value=_ttoi64((LPTSTR)buffer);
	}
	delete [] buffer;
	return;
}

void COptions::SetKey(HKEY key, CString keyname, LPCTSTR value)
{
	RegSetValueEx(key,keyname,0,REG_SZ, (unsigned char *)value, (_tcslen(value)+1)*sizeof(TCHAR) );
}

void COptions::SetKey(HKEY key, CString keyname, __int64 value)
{
	TCHAR tmp[100];
	_stprintf(tmp, _T("%I64d"), value);
	RegSetValueEx(key, keyname, 0, REG_SZ, (unsigned char *)tmp, (_tcslen(tmp)+1)*sizeof(TCHAR) );
}

void COptions::SaveServer(CMarkupSTL *pXML, const t_server &server)
{
	pXML->AddChildElem( _T("Server") );
	pXML->AddChildAttrib( _T("Host"), server.host);
	pXML->AddChildAttrib( _T("Port"), server.port);
	pXML->AddChildAttrib( _T("User"), server.user);
	pXML->AddChildAttrib( _T("Pass"), CCrypt::encrypt(server.pass));
	pXML->AddChildAttrib( _T("FirewallBypass"), server.fwbypass);
	pXML->AddChildAttrib( _T("DontRememberPass"), server.bDontRememberPass);
	pXML->AddChildAttrib( _T("ServerType"), server.nServerType);
	pXML->AddChildAttrib( _T("Path"), server.path);
	pXML->AddChildAttrib( _T("PasvMode"), server.nPasv);
	pXML->AddChildAttrib( _T("TimeZoneOffset"), server.nTimeZoneOffset);
}

void COptions::SaveServer(HKEY key, const t_server &server)
{
	SetKey(key, "Server.Host", server.host);
	SetKey(key, "Server.Port", server.port);
	SetKey(key, "Server.User", server.user);
	SetKey(key, "Server.Pass", CCrypt::encrypt(server.pass));
	SetKey(key, "Firewall bypass", server.fwbypass);
	SetKey(key, "Dont Remember Pass", server.bDontRememberPass);
	SetKey(key, "Server Type", server.nServerType);
	SetKey(key, "Path", server.path);
	SetKey(key, "Pasv Mode", server.nPasv);
	SetKey(key, "Time Zone Offset", server.nTimeZoneOffset);
}

BOOL COptions::LoadServer(CMarkupSTL *pXML, t_server &server)
{
	if (!pXML->FindChildElem( _T("Server") ))
		return FALSE;

	server.host = pXML->GetChildAttrib( _T("Host") );
	server.port = _ttoi(pXML->GetChildAttrib( _T("Port") ));
	server.user = pXML->GetChildAttrib( _T("User") );
	server.pass = CCrypt::decrypt(pXML->GetChildAttrib( _T("Pass") ));
	server.fwbypass = _ttoi(pXML->GetChildAttrib( _T("FirewallBypass") ));
	server.bDontRememberPass = _ttoi(pXML->GetChildAttrib( _T("DontRememberPass") ));
	server.nServerType = _ttoi(pXML->GetChildAttrib( _T("ServerType") ));
	server.path = pXML->GetChildAttrib( _T("Path") );
	server.nPasv = _ttoi(pXML->GetChildAttrib( _T("PasvMode") ));
	server.nTimeZoneOffset = _ttoi(pXML->GetChildAttrib( _T("TimeZoneOffset") ));

	if (server.nPasv < 0 || server.nPasv > 2)
		server.nPasv = 0;

	if (server.nTimeZoneOffset < -24 || server.nTimeZoneOffset > 24)
		server.nTimeZoneOffset = 0;

	if (server.host=="" || server.port<1 || server.port>65535)
		return FALSE;
	return TRUE;
}

BOOL COptions::LoadServer(HKEY key, t_server &server)
{
	GetKey(key, "Server.Host", server.host);
	GetKey(key, "Server.Port", server.port);
	GetKey(key, "Server.User", server.user);
	CString tmp;
	GetKey(key, "Server.Pass", tmp);
	server.pass = CCrypt::decrypt(tmp);
	GetKey(key, "Firewall bypass", server.fwbypass);
	GetKey(key, "Dont Remember Pass", server.bDontRememberPass);
	GetKey(key, "Server Type", server.nServerType);
	GetKey(key, "Path", server.path);
	GetKey(key, "Pasv Mode", server.nPasv);
	GetKey(key, "Time Zone Offset", server.nTimeZoneOffset);

	if (server.nPasv < 0 || server.nPasv > 2)
		server.nPasv = 0;

	if (server.nTimeZoneOffset < -24 || server.nTimeZoneOffset > 24)
		server.nTimeZoneOffset = 0;

	if (server.host=="" || server.port<1 || server.port>65535)
		return FALSE;
	return TRUE;

}

void COptions::SetConfig(LPCTSTR pConfigFile)
{
	m_sConfigFile = pConfigFile;
}

CString COptions::GetXmlFileName()
{
	if (m_sConfigFile != "")
		return m_sConfigFile;
	else
		return ((CFileZillaApp *)AfxGetApp())->m_appPath + _T("FileZilla.xml");
}

⌨️ 快捷键说明

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