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