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

📄 sitemanager.cpp

📁 一个支持FTP,SFTP的客户端程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			}
		}
		else
		{
			if (m_KeysToDelete.empty())
				break;
			CString str=current+"\\"+pMarkup->GetChildAttrib( _T("Name") );
			str.TrimLeft( _T("\\") );

			for (std::list<CString>::iterator iter=m_KeysToDelete.begin(); iter!=m_KeysToDelete.end(); iter++)
				if (*iter==str)
				{
					VERIFY(pMarkup->RemoveChildElem());
					m_KeysToDelete.erase(iter);
					break;
				}
			if (m_KeysToDelete.empty())
				break;

			res=pMarkup->FindChildElem();
			while (!res && current!="")
			{
				int pos=current.ReverseFind('\\');
				if (pos==-1)
					current="";
				else
					current=current.Left(pos);
				pMarkup->OutOfElem();
				res=pMarkup->FindChildElem();
			}
		}

	}
	VERIFY(pMarkup->RestorePos( _T("PREDELETE") ));

	HTREEITEM item=m_cTree.GetChildItem(TVI_ROOT);
	CString path="";
	//Save the sites, old items will be overwritten.
	while(item)
	{
		t_SiteManagerItem *pSite=0;
		if (m_cTree.ItemHasChildren(item))
		{
			item=m_cTree.GetChildItem(item);
			pSite = reinterpret_cast<t_SiteManagerItem *>(m_cTree.GetItemData(item));

			ASSERT(pSite);

			//Find a entry in the XML file with the same name
			BOOL res=pMarkup->FindChildElem();
			while (res)
			{
				if (!pMarkup->GetChildAttrib( _T("Name") ).CollateNoCase(m_cTree.GetItemText(item)))
					break;
				res=pMarkup->FindChildElem();
			}
			if (!res)
			{
				pMarkup->AddChildElem((pSite->NodeType == SITE) ? _T("Site") : _T("Folder") );
				pMarkup->AddChildAttrib(_T("Name"), m_cTree.GetItemText(item));
			}
			else
			{
				CString name=(pSite->NodeType == SITE) ? _T("Site") : _T("Folder");
				if (pMarkup->GetTagName()!=name)
				{
					pMarkup->RemoveChildElem();
					pMarkup->AddChildElem((pSite->NodeType == SITE) ? _T("Site") : _T("Folder") );
					pMarkup->AddChildAttrib(_T("Name"), m_cTree.GetItemText(item));
				}
			}
			if (pSite->NodeType == SITE)
			{
				SaveSingleSiteXML(pMarkup, pSite);
				pMarkup->SetChildAttrib( _T("DefaultSite"), (item==m_DefaultSite) ? _T("1") : _T("0") );
			}

			pMarkup->IntoElem();

			if (path!="")
				path+="/"+m_cTree.GetItemText(item);
			else
				path=m_cTree.GetItemText(item);
			continue;
		}

		HTREEITEM parent=m_cTree.GetParentItem(item);
		pSite = reinterpret_cast<t_SiteManagerItem *>(m_cTree.GetItemData(item));
		if (pSite)
			delete pSite;
		m_cTree.DeleteItem(item);
		item=parent;
		int pos=path.ReverseFind('/');
		if (pos!=-1)
			path=path.Left(pos);
		else
			path="";
		pMarkup->OutOfElem();
		pMarkup->ResetChildPos();
	}
}

void CSiteManager::OnCancel()
{
	m_cTree.SetRedraw(FALSE);
	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;
	}
	m_cTree.SetRedraw(TRUE);
	CDialog::OnCancel();
}

void CSiteManager::OnRadio()
{
	UpdateData(TRUE);
	if (!m_Logontype)
	{
		m_User="anonymous";
		m_Pass=COptions::GetOption(OPTION_ANONPWD);
	}
	else
	{
		HTREEITEM item=m_cTree.GetSelectedItem();
		ASSERT(item);
		t_SiteManagerItem *site=(t_SiteManagerItem*)m_cTree.GetItemData(item);
		ASSERT(site);
		m_User=site->User;
		if (!m_bPassDontSave)
			m_Pass=site->Pass;
		else
			m_Pass="";
	}
	UpdateData(FALSE);
	SetCtrlState();
}

void CSiteManager::OnExit()
{
	m_cTree.SetRedraw(FALSE);
	if (CheckValid())
	{
		SaveData();
		CDialog::OnCancel();
		OnClose();
	}
	m_cTree.SetRedraw(TRUE);
}

void CSiteManager::OnKillfocusHost()
{
	UpdateData(TRUE);
	t_SiteManagerItem *data=(t_SiteManagerItem *)m_cTree.GetItemData(m_cTree.GetSelectedItem());

	int pos=m_Host.Find(':');
	if (pos!=-1)
	{
		int pos2=m_Host.Find('/');
		if (pos2!=-1 && pos2==(pos+1))
		{
			int pos3=m_Host.Find('/',pos2+1);
			if (pos3!=-1 && pos3==(pos2+1))
			{
				if (pos==3)
				{
					CString tmp=m_Host.Left(pos+3);
					tmp.MakeLower();
					if (tmp!="ftp://")
					{
						return;
					}
					else
					{
						m_Host=m_Host.Right(m_Host.GetLength()-pos-3);
					}
				}
				else if (pos==4)
				{
					CString tmp=m_Host.Left(pos+3);
					tmp.MakeLower();
					if (tmp=="ftps://")
					{
						m_cServerType.SetCurSel(1);
						m_Host=m_Host.Right(m_Host.GetLength()-pos-3);
					}
					else if (tmp=="sftp://")
					{
						m_cServerType.SetCurSel(3);
						m_Host=m_Host.Right(m_Host.GetLength()-pos-3);
					}
					else
						return;
				}
			}
		}
	}
	pos=m_Host.Find('/');
	if (pos!=-1)
	{
		if (m_Host.GetLength()>(pos+1) && m_Host[pos+1]==' ')
			data->RemoteDir=m_Host.Right(m_Host.GetLength()-pos);
		else
			data->RemoteDir=m_Host.Right(m_Host.GetLength()-pos-1);

		CServerPath path(data->RemoteDir);
		data->RemoteDir = path.GetPath();

		m_Host=m_Host.Left(pos);
		if (m_Host=="")
		{
			return;
		}


	}
	pos=m_Host.ReverseFind('@');
	if (pos!=-1)
	{
		CString tmp=m_Host.Left(pos);
		int pos2=tmp.Find(':');
		if (pos2==-1)
		{
			return;
		}
		m_Host=m_Host.Right(m_Host.GetLength()-pos-1);
		m_User=tmp.Left(pos2);
		m_Pass=tmp.Right(tmp.GetLength()-pos2-1);
		m_Logontype=1;
		SetCtrlState();
	}
	int pos2 = m_Host.ReverseFind(']');
	pos = m_Host.ReverseFind(':');
	if (pos > pos2)
	{
		m_Port = m_Host.Right(m_Host.GetLength()-pos-1);
		m_Host = m_Host.Left(pos);
	}
	UpdateData(FALSE);
}

void CSiteManager::OnSitemanagerSaveexit()
{
	OnExit();
}

BOOL ReadString(CArchive &ar,CString &str)
{
	if (!ar.ReadString(str))
		return FALSE;
	int pos=str.Find( _T(": ") );
	if (pos==-1)
		return FALSE;
	str=str.Mid(pos+2);

	return TRUE;
}

void CSiteManager::OnSitemanagerFileImport()
{
	if (!CheckValid())
		return;
	CString str;
	str.LoadString(IDS_SITEMANAGER_XMLFILES);
	CFileDialog dlg(TRUE, _T("xml"), _T("FTP Sites"), OFN_FILEMUSTEXIST, str);
	if (dlg.DoModal()==IDOK)
	{
		Import(dlg.GetPathName());
	}
}

void CSiteManager::OnSitemanagerFileExportAsurllist()
{
	if (!CheckValid())
		return;

	USES_CONVERSION;

	CString str;
	str.LoadString(IDS_SITEMANAGER_TEXTFILES);
	CFileDialog dlg(FALSE, _T("txt"), _T("FTP Sites"), OFN_OVERWRITEPROMPT, str);
	if (dlg.DoModal()==IDOK)
	{
		CFile file;
		if (!file.Open(dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite))
		{
			AfxMessageBox(IDS_ERRORMSG_CANTCREATEFILE,MB_ICONSTOP);
			return;
		}
		HTREEITEM item=m_cTree.GetRootItem();
		while (item)
		{
			while(m_cTree.ItemHasChildren(item))
				item=m_cTree.GetChildItem(item);
			t_SiteManagerItem *site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
			ASSERT(site);
			if (site->NodeType == SITE)
			{
				CString url, tmp;
				if (site->nLogonType)
				{
					url = site->User + ":" + site->Pass + "@";
				}
				url+=site->Host;
				tmp.Format(_T("%d"), site->nPort);
				if (tmp!="21")
					url+=":"+tmp;
				if (site->RemoteDir != "")
					url += "/" + site->RemoteDir;
				url += "\r\n";
				LPCSTR lpszAscii = T2CA(url);
				file.Write(lpszAscii, strlen(lpszAscii));
			}
			HTREEITEM item2 = m_cTree.GetNextSiblingItem(item);
			while (!item2)
			{
				item = m_cTree.GetParentItem(item);
				item2 = m_cTree.GetNextSiblingItem(item);
				if (!item)
					break;
			}
			item=item2;
		}
		file.Close();
	}
}

void CSiteManager::OnSitemanagerFileExportWithalldetails()
{
	USES_CONVERSION;

	if (!CheckValid())
		return;
	CString str;
	str.LoadString(IDS_SITEMANAGER_XMLFILES);
	CFileDialog dlg(FALSE, _T("xml"), _T("FTP Sites"), OFN_OVERWRITEPROMPT, str);
	if (dlg.DoModal()==IDOK)
	{
		CMarkupSTL markup;
		markup.AddElem( _T("FileZilla") );
		markup.AddChildElem( _T("Sites") );
		markup.IntoElem();

		HTREEITEM item=m_cTree.GetRootItem();
		while (item)
		{
			while(m_cTree.ItemHasChildren(item))
			{
				if (item!=m_cTree.GetRootItem())
				{
					markup.AddChildElem( _T("Folder") );
					markup.AddChildAttrib( _T("Name"), m_cTree.GetItemText(item));
					markup.IntoElem();
				}
				item=m_cTree.GetChildItem(item);
			}
			t_SiteManagerItem *site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
			ASSERT(site);
			if (site->NodeType == SITE)
			{
				markup.AddChildElem( _T("Site") );
				markup.AddChildAttrib(_T("Name"), m_cTree.GetItemText(item));
				SaveSingleSiteXML(&markup, site);
			}
			else
			{
				markup.AddChildElem(  _T("Folder") );
				markup.AddChildAttrib( _T("Name"), m_cTree.GetItemText(item));
			}

			HTREEITEM item2=m_cTree.GetNextSiblingItem(item);
			while (!item2)
			{
				markup.OutOfElem();
				item=m_cTree.GetParentItem(item);
				item2=m_cTree.GetNextSiblingItem(item);
				if (!item)
					break;
			}
			item=item2;
		}
		if (!markup.Save(dlg.GetPathName()))
			AfxMessageBox(IDS_ERRORMSG_CANTCREATEFILE,MB_ICONSTOP);
	}
}

static bool startsWith(CString &str, CString start)
{
	bool res = str.Left(start.GetLength()) == start;
	if (res)
		str = str.Mid(start.GetLength());

	return res;
}

void CSiteManager::Import(CString filename)
{
	//First try to read it as XML file
	CMarkupSTL markup;
	if (markup.Load(filename))
	{
		if (markup.FindChildElem( _T("Sites") ))
		{
			markup.IntoElem();
			HTREEITEM item=m_cTree.GetRootItem();
			ImportXML(&markup, item);
			m_cTree.Expand(m_cTree.GetRootItem(), TVE_EXPAND);
			CString msg;
			msg.Format(IDS_STATUSMSG_FILEIMPORTED, filename);
			AfxMessageBox(msg,MB_ICONINFORMATION);
		}
		else
			AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE, MB_ICONSTOP);
		return;
	}
	CFile file;
	if (!file.Open(filename,CFile::modeRead|CFile::shareDenyWrite))
	{
		AfxMessageBox(IDS_ERRORMSG_CANTOPENFILE,MB_ICONSTOP);
		return;
	}
	CArchive ar(&file,CArchive::load );
	CString str;

	while (ar.ReadString(str))
	{
		if (str=="")
			continue;
		int pos;

		if ((pos=str.Find( _T(": ") ))!=-1)
		{ //Server list with details
			t_SiteManagerItem *pSite = new t_SiteManagerItem;
			pSite->nServerType = 0;
			pSite->nPort = 21;
			pSite->nLogonType = -1;
			CString folder;

			do
			{
				if (str=="")
					break;
				if (startsWith(str, _T("Name: ")) ||
					startsWith(str, _T("Site Label:")))
					pSite->name = str;
				else if (startsWith(str, _T("Folder: ")))
					folder = str;
				else if (startsWith(str, _T("Host: ")) ||
					startsWith(str, _T("HostName: ")))
					pSite->Host = str;
				else if (startsWith(str, _T("Port: ")))
					pSite->nPort = _ttoi(str);
				else if (startsWith(str, _T("User: ")) ||
					startsWith(str, _T("User Name: ")) ||
					startsWith(str, _T("Username: ")))
					pSite->User = str;
				else if (startsWith(str, _T("Pass: ")) ||
					startsWith(str, _T("Password: ")))
					pSite->Pass = str;
				else if (startsWith(str, _T("Local Dir: ")) ||

⌨️ 快捷键说明

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