options.cpp
来自「一个FTP下载的源代码。代码质量非常高」· C++ 代码 · 共 1,782 行 · 第 1/4 页
CPP
1,782 行
}
bool COptions::AddPage(CSAPrefsSubDlg &page, UINT nCaptionID, CSAPrefsSubDlg *pDlgParent /*= NULL*/)
{
CString str;
str.LoadString(nCaptionID);
m_PageList.push_back(&page);
return CSAPrefsDialog::AddPage(page, str, pDlgParent);
}
void COptions::Export()
{
Init();
CSingleLock lock(&m_Sync, TRUE);
CFileDialog dlg(FALSE, _T(".xml"), _T("FileZilla settings"), OFN_OVERWRITEPROMPT, _T("XML files (*.xml)|*.xml||") );
if (dlg.DoModal()==IDOK)
{
CMarkupSTL markup;
markup.AddElem( _T("FileZilla") );
markup.AddChildElem( _T("Settings") );
markup.IntoElem();
for (int i=0;i<OPTIONS_NUM; i++)
{
if (!options[i].nType)
{
CString value=GetOption(i+1);
markup.AddChildElem(_T("Item"), value);
markup.AddChildAttrib(_T("name"), options[i].name);
markup.AddChildAttrib(_T("type"), _T("string") );
}
else if (options[i].nType==1)
{
CString value;
value.Format(_T("%d"), GetOptionVal(i+1));
markup.AddChildElem(_T("Item"), value);
markup.AddChildAttrib(_T("name"), options[i].name);
markup.AddChildAttrib(_T("type"), _T("numeric") );
}
}
if (!markup.Save(dlg.GetPathName()))
{
AfxMessageBox(IDS_ERRORMSG_CANTCREATEFILE, MB_ICONEXCLAMATION);
return;
}
else
AfxMessageBox(IDS_OPTIONS_EXPORTOK, MB_ICONINFORMATION);
}
}
void COptions::OnPhelp()
{
CString help=AfxGetApp()->m_pszHelpFilePath;
help+="::/configuration.htm";
HINSTANCE hDLL=LoadLibrary( _T("hhctrl.ocx") );
if (hDLL)
{
#ifdef UNICODE
HWND (WINAPI* pHtmlHelp)(HWND hwndCaller, LPCWSTR pszFile, UINT uCommand, DWORD_PTR dwData)=(HWND (WINAPI*)(HWND hwndCaller, LPCWSTR pszFile, UINT uCommand, DWORD_PTR dwData))GetProcAddress(hDLL,"HtmlHelpW");
#else
HWND (WINAPI* pHtmlHelp)(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData)=(HWND (WINAPI*)(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData))GetProcAddress(hDLL,"HtmlHelpA");
#endif
if (pHtmlHelp)
pHtmlHelp(m_hWnd, help,HH_DISPLAY_TOC,0);
}
}
void COptions::Init()
{
CSingleLock lock(&m_Sync, TRUE);
if (m_bInitialized)
return;
m_bInitialized=TRUE;
for (int i=0; i<OPTIONS_NUM; i++)
m_OptionsCache[i].bCached = FALSE;
if (GetOptionVal(OPTION_USEREGISTRY) == 2)
return;
CFileStatus status;
if (!CFile::GetStatus( ((CFileZillaApp *)AfxGetApp())->m_appPath + _T("FileZilla.xml"), status) )
return;
else if (status.m_attribute&FILE_ATTRIBUTE_DIRECTORY)
return;
if (!status.m_size)
{
m_bUseXML = TRUE;
m_markup.AddElem( _T("FileZilla") );
return;
}
if (m_markup.Load( ((CFileZillaApp *)AfxGetApp())->m_appPath + _T("FileZilla.xml")) )
{
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( ((CFileZillaApp *)AfxGetApp())->m_appPath + _T("FileZilla.xml") );
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( ((CFileZillaApp *)AfxGetApp())->m_appPath + _T("FileZilla.xml"), 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( ((CFileZillaApp *)AfxGetApp())->m_appPath + _T("FileZilla.xml"));
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;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?