⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sitemanager.cpp

📁 一个支持FTP,SFTP的客户端程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					startsWith(str, _T("Default local dir: ")) ||
					startsWith(str, _T("Default local folder: ")))
					pSite->LocalDir = str;
				else if (startsWith(str, _T("Remote Dir: ")) ||
					startsWith(str, _T("Default remote dir: ")) ||
					startsWith(str, _T("Default remote folder: ")))
					pSite->RemoteDir = str;
				else if (startsWith(str, _T("Firewall Bypass: ")))
					pSite->bFirewallBypass = _ttoi(str);
				else if (startsWith(str, _T("Dont Save Pass: ")))
					pSite->bPassDontSave = _ttoi(str);
				else if (startsWith(str, _T("Server Type: ")))
					pSite->nServerType = _ttoi(str);
				else if (startsWith(str, _T("Comments: ")))
					pSite->Comments = str;
				else if (startsWith(str, _T("LogonType: ")))
					pSite->nLogonType = _ttoi(str);
				else if (str == _T("Uses passive mode"))
					pSite->nPasv = 1;
				else if (startsWith(str, _T("Protocol Type: ")))
				{
					if (str == _T("ftps"))
						pSite->nServerType = 1;
					else if (str == _T("ftps2"))
						pSite->nServerType = 2;
					else if (str == _T("ftps3"))
						pSite->nServerType = 4;
					else if (str == _T("sftp"))
						pSite->nServerType = 3;
				}
			} while (ar.ReadString(str));
			if (pSite->bPassDontSave)
				pSite->Pass = "";
			if (pSite->name == _T(""))
				pSite->name = pSite->Host;
			if (pSite->nLogonType == -1)
				if (pSite->User != _T("anonymous") && pSite->User != _T(""))
					pSite->nLogonType = 1;
				else
					pSite->nLogonType = 0;

			if (pSite->nLogonType == 1 && pSite->User == _T(""))
			{
				delete pSite;
				AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE, MB_ICONSTOP);
				return;
			}
			if (!pSite->nPort || pSite->Host=="")
			{
				delete pSite;
				AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE, MB_ICONSTOP);
				return;
			}
			HTREEITEM hParent=m_cTree.GetRootItem();
			folder.TrimRight( _T("\\") );
			folder.TrimLeft( _T("\\") );
			folder.Replace( _T("\\\\"), _T("\\"));
			while (folder!="")
			{
				CString segment;
				int pos=folder.Find( _T("\\") );
				if (pos==-1)
				{
					segment=folder;
					folder="";
				}
				else
				{
					segment=folder.Left(pos);
					folder=folder.Mid(pos+1);
				}
				HTREEITEM hItem=m_cTree.GetChildItem(hParent);
				while (hItem)
				{
					if (!m_cTree.GetItemText(hItem).CompareNoCase(segment))
						break;
					hItem=m_cTree.GetNextSiblingItem(hItem);
				}
				if (!hItem)
				{
					hItem=m_cTree.InsertItem(segment, hParent, TVI_SORT);
					pSite->name = segment;
					pSite->NodeType = FOLDER;
					m_cTree.SetItemData(hItem, DWORD(pSite));
				}
				if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS) || m_cTree.GetRootItem()==hParent)
					m_cTree.Expand(hParent, TVE_EXPAND);
				hParent=hItem;
			}

			CString newname = pSite->name;
			HTREEITEM child=m_cTree.GetChildItem(hParent);
			int i=2;
			while (child)
			{
				CString name2=newname;
				name2.MakeLower();
				CString childstr=m_cTree.GetItemText(child);
				childstr.MakeLower();
				if (childstr==name2)
				{
					child=m_cTree.GetChildItem(hParent);
					newname.Format(_T("%s (%d)"), pSite->name, i);
					i++;
					continue;
				}
				child=m_cTree.GetNextSiblingItem(child);
			}
			HTREEITEM item=m_cTree.InsertItem(newname, 2, 2, hParent, TVI_SORT);
			pSite->name = newname;
			pSite->NodeType=SITE;
			m_cTree.SetItemData(item, (DWORD)pSite);
			if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
				m_cTree.Expand(hParent, TVE_EXPAND);
		}
		else
		{ //URL list
			t_SiteManagerItem *pSite=new t_SiteManagerItem;
			pSite->nPort=0;
			pSite->bFirewallBypass=0;
			pSite->bPassDontSave=0;

			pos=str.Find('/');
			if (pos!=-1)
			{
				pSite->RemoteDir=str.Mid(pos+1);
				str=str.Left(pos);
				if (str=="")
				{
					delete pSite;
					AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE,MB_ICONSTOP);
					return;
				}
			}
			pos=str.ReverseFind('@');
			if (pos!=-1)
			{
				CString tmp=str.Left(pos);
				int pos2=tmp.ReverseFind(':');
				if (pos2==-1)
				{
					delete pSite;
					AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE,MB_ICONSTOP);
					return;
				}
				str=str.Mid(pos+1);
				pSite->User=tmp.Left(pos2);
				pSite->Pass=tmp.Mid(pos2+1);
			}
			pos=str.ReverseFind(':');
			if (pos!=-1)
			{
				pSite->nPort=_ttoi(str.Mid(pos+1));
				str=str.Left(pos);

			}

			if (!pSite->nPort)
			{
				pSite->nPort=21;
			}
			if (pSite->User=="")
				pSite->nLogonType=0;
			else
				pSite->nLogonType=1;
			pSite->Host=str;
			pSite->name = str;
			HTREEITEM hParent=m_cTree.GetRootItem();
			CString newname = pSite->name;
			HTREEITEM child=m_cTree.GetChildItem(hParent);
			int i=2;
			while (child)
			{
				CString name2=newname;
				name2.MakeLower();
				CString childstr=m_cTree.GetItemText(child);
				childstr.MakeLower();
				if (childstr==name2)
				{
					child=m_cTree.GetChildItem(hParent);
					newname.Format(_T("%s (%d)"), pSite->name, i);
					i++;
					continue;
				}
				child=m_cTree.GetNextSiblingItem(child);
			}
			HTREEITEM item=m_cTree.InsertItem(newname, 2, 2, hParent, TVI_SORT);
			pSite->name=newname;
			pSite->NodeType=SITE;
			m_cTree.SetItemData(item, (DWORD)pSite);
			if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
				m_cTree.Expand(hParent, TVE_EXPAND);
		}
	}
	m_cTree.Expand(m_cTree.GetRootItem(), TVE_EXPAND);
	CString msg;
	msg.Format(IDS_STATUSMSG_FILEIMPORTED,filename);
	AfxMessageBox(msg, MB_ICONINFORMATION);
}

void CSiteManager::ImportXML(CMarkupSTL *pMarkup, HTREEITEM &parent)
{
	while (pMarkup->FindChildElem())
	{
		if (pMarkup->GetChildTagName()==_T("Folder") )
		{
			CString name=pMarkup->GetChildAttrib( _T("Name") );
			HTREEITEM child=m_cTree.GetChildItem(parent);
			int i=2;
			//Iterate parent's children, looking for one that has the same name as the one we are importing.
			while (child)
			{
				CString name2=name;
				name2.MakeLower();
				CString childstr=m_cTree.GetItemText(child);
				childstr.MakeLower();
				if (childstr==name2)
					break;
				child=m_cTree.GetNextSiblingItem(child);
			}
			HTREEITEM hItem;
			if (!child) //We didn't find one, insert one
			{
				hItem=m_cTree.InsertItem(name, parent, TVI_SORT);
				t_SiteManagerItem *pFolder=new t_SiteManagerItem;
				pFolder->name = name;
				pFolder->NodeType = FOLDER;
				m_cTree.SetItemData(hItem, (DWORD)pFolder);
			}
			else //We found one, so we will update it
				hItem=child;
			pMarkup->IntoElem();
			ImportXML(pMarkup, hItem);
			pMarkup->OutOfElem();

			if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
				m_cTree.Expand(hItem, TVE_EXPAND);
		}
		else if (pMarkup->GetChildTagName()==_T("Site") )
		{
			t_SiteManagerItem *site=GetDataXML(pMarkup);
			if (site)
			{
				CString name=pMarkup->GetChildAttrib( _T("Name") );
				CString newname=name;
				HTREEITEM child=m_cTree.GetChildItem(parent);
				int i=2;
				while (child)
				{
					CString name2=newname;
					name2.MakeLower();
					CString childstr=m_cTree.GetItemText(child);
					childstr.MakeLower();
					if (childstr==name2)
					{
						child=m_cTree.GetChildItem(parent);
						newname.Format(_T("%s (%d)"), name, i);
						i++;
						continue;
					}
					child=m_cTree.GetNextSiblingItem(child);
				}
				HTREEITEM item=m_cTree.InsertItem(newname, 2, 2, parent, TVI_SORT);
				site->name = newname;
				site->NodeType = SITE;
				m_cTree.SetItemData(item, (DWORD)site);
				if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
					m_cTree.Expand(item, TVE_EXPAND);
				if (_ttoi(pMarkup->GetChildAttrib( _T("DefaultSite") )))
					m_DefaultSite=item;
			}
		}
	}
}

int CSiteManager::AddAndShow(t_server &server)
{
	m_addserver=server;
	m_bAddServer=TRUE;
	return DoModal();
}

int CSiteManager::ImportAndShow(CString FileToImport)
{
	m_FileToImport=FileToImport;
	return DoModal();
}

void CSiteManager::OnClose()
{
	HTREEITEM item=m_cTree.GetChildItem(TVI_ROOT);
	while(item)
	{
		if (m_cTree.ItemHasChildren(item))
		{
			item=m_cTree.GetChildItem(item);
			continue;
		}
		t_SiteManagerItem *site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
		if (site)
			delete site;
		HTREEITEM parent=m_cTree.GetParentItem(item);
		m_cTree.DeleteItem(item);
		item=parent;
	}
	CDialog::OnClose();
}

void CSiteManager::SaveSingleSite(CString name, t_SiteManagerItem *site)
{
	name.TrimLeft( _T("\\") );
	SetKey(name,"Host",site->Host);
	CString str;
	str.Format(_T("%d"), site->nPort);
	SetKey(name,"Port",str);
	SetKey(name,"User",site->User);
	SetKey(name, "Account", site->Account);
	SetKey(name,"Remote Dir",site->RemoteDir);
	SetKey(name,"Local Dir",site->LocalDir);
	if (_ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE)) || site->bPassDontSave)
		SetKey(name, _T("Pass"), _T(""));
	else
		SetKey(name, "Pass", CCrypt::encrypt(site->Pass));
	str.Format(_T("%d"), site->nLogonType+1);
	SetKey(name,"Logontype",str);
	str=site->bFirewallBypass?"1":"0";
	SetKey(name,"FW Bypass",str);
	str=site->bPassDontSave?"1":"0";
	SetKey(name,"Dont Save Pass",str);
	str.Format(_T("%d"), site->nServerType);
	SetKey(name,"Server Type",str);
	str.Format(_T("%d"), site->nPasv);
	SetKey(name, "Pasv Mode", str);
	str.Format(_T("%d"), site->nTimeZoneOffset);
	SetKey(name, "Time Zone Offset", str);
	str.Format(_T("%d"), site->nTimeZoneOffset2);
	SetKey(name, "Time Zone Offset Minutes", str);
	SetKey(name, "Comments", site->Comments);
	str.Format(_T("%d"), site->nUTF8);
	SetKey(name, "UTF8", str);
}

void CSiteManager::SaveSingleSiteXML(CMarkupSTL *pMarkup, t_SiteManagerItem *site)
{
	pMarkup->AddChildAttrib( _T("Host"), site->Host);
	pMarkup->AddChildAttrib( _T("Port"), site->nPort);
	pMarkup->AddChildAttrib( _T("User"), site->User);
	pMarkup->AddChildAttrib( _T("Account"), site->Account);
	pMarkup->AddChildAttrib( _T("RemoteDir"), site->RemoteDir);
	pMarkup->AddChildAttrib( _T("LocalDir"), site->LocalDir);
	if (_ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE)) || site->bPassDontSave)
		pMarkup->AddChildAttrib( _T("Pass"), _T(""));
	else
		pMarkup->AddChildAttrib( _T("Pass"), CCrypt::encrypt(site->Pass));
	pMarkup->AddChildAttrib( _T("Logontype"), site->nLogonType);
	pMarkup->AddChildAttrib( _T("FWBypass"), site->bFirewallBypass);
	pMarkup->AddChildAttrib( _T("DontSavePass"), site->bPassDontSave);
	pMarkup->AddChildAttrib( _T("ServerType"), site->nServerType);
	pMarkup->AddChildAttrib( _T("PasvMode"), site->nPasv);
	pMarkup->AddChildAttrib( _T("TimeZoneOffset"), site->nTimeZoneOffset);
	pMarkup->AddChildAttrib( _T("TimeZoneOffsetMinutes"), site->nTimeZoneOffset2);
	pMarkup->AddChildAttrib( _T("Comments"), site->Comments);
	pMarkup->AddChildAttrib( _T("UTF8"), site->nUTF8);
}

void CSiteManager::OnPassdontsave()
{
	UpdateData(TRUE);
	m_PassCtrl.EnableWindow(!m_bPassDontSave);
	m_Pass="";
	UpdateData(FALSE);
}

//
// Read Sites from the Windows Registry
//
// Parameters:
// substring - registry subkey which contains the set of sites to read.
// parent	 - parent to which the sites and folders found within given
//			   Registry key are children.
//
void CSiteManager::ReadTree(CString substring, const LPVOID &parent, LPVOID lpData, LPVOID lpDefault,
							BUILDSITETREEPROC_NEW_ITEM NewItemProc, BUILDSITETREEPROC_NEW_FOLDER NewFolderProc,
							BUILDSITETREEPROC_AFTER AfterProc)
{
	substring.TrimLeft( _T("\\") );
	substring.TrimRight( _T("\\") );
	HKEY key;
	HKEY hRootKey = HKEY_CURRENT_USER;
	if (RegOpenKey(HKEY_CURRENT_USER,"Software\\FileZilla\\Site Manager\\"+substring,&key) != ERROR_SUCCESS)
	{
		if (RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\FileZilla\\Site Manager\\"+substring,&key) != ERROR_SUCCESS)
			return;
		hRootKey = HKEY_LOCAL_MACHINE;
	}

	TCHAR buffer[1000];
	int index=0;
	unsigned char value[1000];
	DWORD length=1000;
	CString value2=value;
	value[0]=0;
	RegQueryValueEx(key, _T(""), 0, 0, value, &length);
	if (!_tcscmp((LPCTSTR)value, _T("Folder") ) || substring=="")
	{
		CString name;
		if (substring.ReverseFind( '\\' )!=-1)
			name=substring.Mid(substring.ReverseFind( '\\' )+1);
		else
			name=substring;
		LPVOID item = parent;
		if (substring!="")
		{
			if (NewFolderProc)
				NewFolderProc( lpData, name, item);
		}
		length=1000;
		while(RegEnumKeyEx(key, index, buffer, &length, 0, 0, 0, 0)==ERROR_SUCCESS)
		{
			ReadTree(substring+"\\"+buffer, item, lpData, lpDefault, NewItemProc, NewFolderProc, AfterProc);
			index++;
			length=1000;
		}
		if (AfterProc)
			AfterProc(lpData, name, item);
	}
	else
	{
		CString name;
		if (substring.ReverseFind('\\')!=-1)
			name = substring.Mid(substring.ReverseFind('\\')+1);
		else
			name = substring;
		t_SiteManagerItem *site = GetData(hRootKey, substring);
		if (site)
		{
			site->name = name;
			site->NodeType = SITE;
			if (NewItemProc)
				NewItemProc(lpData, name, parent, site, GetKey(hRootKey, substring, "Default Site")=="1", lpDefault);
		}
		index++;
		length = 1000;
	}
	RegCloseKey(key);
}

//
// Read Sites from the XML Markup
//
// Parameters:
// pMarkup - pointer to CMarkup object preset to be pointing to the first item
//           in a set of sites (either a <Sites> or <Folder> tag)
// parent  - parent to which the sites and folders found under the current
//           branch are children.
//
void CSiteManager::ReadTreeXML(CMarkupSTL *pMarkup, const LPVOID &parent, LPVOID lpData, LPVOID lpDefault, BUILDSITETREEPROC_NEW_ITEM NewItemProc,
							BUILDSITETREEPROC_NEW_FOLDER NewFolderProc, BUILDSITETREEPROC_AFTER AfterProc)
{
	while (pMarkup->FindChildElem())
	{
		if (pMarkup->GetChildTagName()==_T("Folder") )
		{
			LPVOID item = parent;
			CString name=pMarkup->GetChildAttrib( _T("Name") );
			if (NewFolderProc)
					NewFolderProc(lpData, name, item);
			pMarkup->IntoElem();
			ReadTreeXML(pMarkup, item, lpData, lpDefault, NewItemProc, NewFolderProc, AfterProc);
			pMarkup->OutOfElem();

⌨️ 快捷键说明

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