options.cpp
来自「一个支持FTP,SFTP的客户端程序」· C++ 代码 · 共 1,863 行 · 第 1/5 页
CPP
1,863 行
if (line=="")
continue;
CString ext;
int spos=line.Find(_T(" "));
int qpos=line.Find(_T("\""));
if (spos==-1)
continue;
if (spos<qpos || qpos==-1)
{
ext=line.Left(spos);
ext.Replace( _T(";"), _T("; "));
line=line.Mid(spos);
line.TrimLeft( _T(" ") );
line.Replace( _T(";"), _T("; "));
if (line=="")
continue;
m_OptionsViewEditPage.m_Custom2+=ext + _T(";") + line + _T(";");
continue;
}
else if (qpos!=0)
continue;
line=line.Mid(1);
qpos=line.Find( _T("\"") );
if (qpos==-1)
continue;
ext=line.Left(qpos);
ext.TrimLeft( _T(" ") );
ext.TrimRight( _T(" ") );
ext.Replace( _T(";"), _T("; "));
line=line.Mid(qpos+1);
line.TrimLeft( _T(" ") );
line.Replace( _T(";"), _T("; "));
if (line=="")
continue;
m_OptionsViewEditPage.m_Custom2+=ext + _T(";") + line + _T(";");
continue;
}
}
m_OptionsViewEditPage.m_Custom2.TrimRight( _T(";") );
if(m_OptionsIdentPage.m_bIdent)
{
if(m_OptionsIdentPage.m_UserID.IsEmpty())
{
ShowPage(&m_OptionsIdentPage);
m_OptionsIdentPage.m_cUserID.SetFocus();
AfxMessageBox(IDS_OPTIONS_IDENTUSERID, MB_ICONEXCLAMATION);
return;
}
if(m_OptionsIdentPage.m_System.IsEmpty())
{
ShowPage(&m_OptionsIdentPage);
m_OptionsIdentPage.m_cSystem.SetFocus();
AfxMessageBox(IDS_OPTIONS_IDENTSYSTEM, MB_ICONEXCLAMATION);
return;
}
}
CSAPrefsDialog::OnOK();
}
void COptions::InitLanguagePage()
{
m_OptionsLanguagePage.m_LanguageStringList.insert("English");
CFileFind find;
if (find.FindFile(((CFileZillaApp *)AfxGetApp())->m_appPath+"\\*.dll"))
{
BOOL bFind=TRUE;
while(bFind)
{
bFind=find.FindNextFile();
CString fn=find.GetFileName();
DWORD tmp=0;
LPTSTR str=new TCHAR[fn.GetLength()+1];
_tcscpy(str,fn);
DWORD len=GetFileVersionInfoSize(str,&tmp);
LPVOID pBlock=new char[len];
if (GetFileVersionInfo(str,0,len,pBlock))
{
LPVOID ptr=0;
UINT ptrlen;
TCHAR SubBlock[50];
// Structure used to store enumerated languages and code pages.
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
UINT cbTranslate;
// Read the list of languages and code pages.
if (VerQueryValue(pBlock,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate))
{
// Read the file description for each language and code page.
_stprintf( SubBlock,
_T("\\StringFileInfo\\%04x%04x\\ProductName"),
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
// Retrieve file description for language and code page "0".
if (VerQueryValue(pBlock,
SubBlock,
&ptr,
&ptrlen))
{
LPTSTR pname=(LPTSTR)ptr;
CString productname=pname;
if ( productname==_T("FileZilla Language DLL") )
{
_stprintf( SubBlock,
_T("\\StringFileInfo\\%04x%04x\\Comments"),
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
if (VerQueryValue(pBlock,
SubBlock,
&ptr,
&ptrlen))
{
LPTSTR comment=(LPTSTR)ptr;
if (m_OptionsLanguagePage.m_LanguageStringList.find(comment)==m_OptionsLanguagePage.m_LanguageStringList.end())
m_OptionsLanguagePage.m_LanguageStringList.insert(comment);
}
}
}
}
}
delete [] str;
delete [] pBlock;
}
}
}
void COptions::ProcessLanguagePage()
{
unsigned __int64 version=0;
CString lang=GetOption(OPTION_LANGUAGE);
if (lang=="")
lang="English";
if (lang==m_OptionsLanguagePage.m_selLang)
return; // No language selected, don't change current one
if (m_OptionsLanguagePage.m_selLang==_T(""))
return;
if (m_OptionsLanguagePage.m_selLang==_T("English"))
{
//Set the new language
SetOption(OPTION_LANGUAGE,"English");
if (((CFileZillaApp *)AfxGetApp())->m_bLangSet)
FreeLibrary(AfxGetResourceHandle());
((CFileZillaApp *)AfxGetApp())->m_bLangSet = FALSE;
AfxSetResourceHandle(AfxGetInstanceHandle());
return;
}
CFileFind find;
if (find.FindFile(((CFileZillaApp *)AfxGetApp())->m_appPath+"\\*.dll"))
{
BOOL bFind=TRUE;
while(bFind)
{
bFind=find.FindNextFile();
CString fn=find.GetFileName();
DWORD tmp=0;
LPTSTR str=new TCHAR[fn.GetLength()+1];
_tcscpy(str,fn);
DWORD len=GetFileVersionInfoSize(str,&tmp);
LPVOID pBlock=new char[len];
if (GetFileVersionInfo(str,0,len,pBlock))
{
LPVOID ptr=0;
UINT ptrlen;
TCHAR SubBlock[50];
// Structure used to store enumerated languages and code pages.
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
UINT cbTranslate;
// Read the list of languages and code pages.
if (VerQueryValue(pBlock,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate))
{
// Read the file description for each language and code page.
_stprintf( SubBlock,
_T("\\StringFileInfo\\%04x%04x\\ProductName"),
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
// Retrieve file description for language and code page "0".
if (VerQueryValue(pBlock,
SubBlock,
&ptr,
&ptrlen))
{
LPTSTR pname=(LPTSTR)ptr;
CString productname=pname;
if ( productname==("FileZilla Language DLL") )
{
_stprintf( SubBlock,
_T("\\StringFileInfo\\%04x%04x\\Comments"),
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
if (VerQueryValue(pBlock,
SubBlock,
&ptr,
&ptrlen))
{
LPTSTR comment=(LPTSTR)ptr;
CString Comment=comment;
if (Comment.Find(m_OptionsLanguagePage.m_selLang) != -1)
{
if (VerQueryValue(pBlock, _T("\\"), &ptr, &ptrlen))
{
VS_FIXEDFILEINFO *fi=(VS_FIXEDFILEINFO*)ptr;
unsigned __int64 curver=(((__int64)fi->dwFileVersionMS)<<32)+fi->dwFileVersionLS;
if (curver>version)
{
version=curver;
if (version>=MINVALIDDLLVERSION)
{
//Set the new language
SetOption(OPTION_LANGUAGE,m_OptionsLanguagePage.m_selLang);
m_OptionsLanguagePage.m_LanguageStringList.insert(comment);
if (((CFileZillaApp *)AfxGetApp())->m_bLangSet)
FreeLibrary(AfxGetResourceHandle());
((CFileZillaApp *)AfxGetApp())->m_bLangSet=TRUE;
HINSTANCE dll=LoadLibrary(fn);
if (dll)
AfxSetResourceHandle(dll);
}
}
}
}
}
}
}
}
}
delete [] str;
delete [] pBlock;
}
}
if (!version)
return;
if (version<MINVALIDDLLVERSION)
AfxMessageBox(IDS_ERRORMSG_LANGUAGEDLLVERSIONINVALID);
else if (version<MINDLLVERSION)
AfxMessageBox(IDS_STATUSMSG_LANGUAGEVERSIONDIFFERENT);
}
CSAPrefsSubDlg* COptions::GetCurPage()
{
int iPage=m_iCurPage;
// show the new one
if ((iPage >= 0) && (iPage < static_cast<int>(m_pages.size())))
{
pageStruct *pPS = (pageStruct *)m_pages[iPage];
ASSERT(pPS);
if (pPS)
{
ASSERT(pPS->pDlg);
if (pPS->pDlg)
{
return pPS->pDlg;
}
}
}
return NULL;
}
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(GetXmlFileName(), status))
return;
else if (status.m_attribute&FILE_ATTRIBUTE_DIRECTORY)
return;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?