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 + -
显示快捷键?