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

📄 sitemanager.cpp

📁 一个FTP下载的源代码。代码质量非常高
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	ASSERT(m_cTree.GetItemData(parent) && ((t_SiteManagerItem *)m_cTree.GetItemData(parent))->NodeType==FOLDER);
	
	CString name;
	name.Format(IDS_SITEMANAGER_NEWFTPSITE);

	HTREEITEM child=m_cTree.GetChildItem(parent);
	int i=2;
	while (child)
	{
		CString name2=name;
		name2.MakeLower();
		CString childstr=m_cTree.GetItemText(child);
		childstr.MakeLower();
		if (childstr==name2)			
		{
			child=m_cTree.GetChildItem(parent);
			name.Format(IDS_SITEMANAGER_NEWFTPSITEWITHNUM,i);
			i++;
			continue;
		}
		child=m_cTree.GetNextItem(child,TVGN_NEXT);
	}
	
	HTREEITEM item=m_cTree.InsertItem(name,2,2,parent,TVI_SORT);
	m_cTree.Expand(parent, TVE_EXPAND);
	t_SiteManagerItem *site=new t_SiteManagerItem;
	site->nPort=21;
	site->nLogonType=0;
	site->bFirewallBypass=FALSE;
	site->bPassDontSave=FALSE;
	site->nServerType=0;
	site->name=name;
	site->NodeType=SITE;
	m_cTree.SetItemData(item,(DWORD)site);

	// Re-sort with folders first if that option is selected.  This must come AFTER the SetItemData command above.
	if (COptions::GetOptionVal(OPTION_SORTSITEMANAGERFOLDERSFIRST))
	{
		TVSORTCB pMy_Sort;
		pMy_Sort.hParent = parent;
		pMy_Sort.lpfnCompare = SortFoldersFirst;
		pMy_Sort.lParam = (LPARAM) &m_cTree;
		m_cTree.SortChildrenCB(&pMy_Sort);
	}

	m_cTree.SelectItem(item);
	DisplaySite(site);
	m_cTree.EditLabel(item);	
}

/*
 * CheckValid()
 *
 * Returns:
 *   TRUE  - if Currently selected tree item is a folder or a site with complete data.
 *   FALSE - if Currently selected tree item is a site without complete data.
 */
BOOL CSiteManager::CheckValid()
{
	HTREEITEM olditem=m_cTree.GetSelectedItem();
	UpdateData(true);
	if (!olditem)
		return TRUE;
	t_SiteManagerItem *data=(t_SiteManagerItem *)m_cTree.GetItemData(olditem);
	ASSERT(data);
	if (!data)
		return FALSE;
	if (data->NodeType == FOLDER)
		return TRUE;
	else if (data->NodeType == SITE)
	{
		CString str;
		CString str2;
		
		if (m_Host=="")
		{
			m_cTree.SelectItem(olditem);
			AfxMessageBox(IDS_ERRORMSG_HOSTNEEDED,MB_ICONEXCLAMATION);
			m_HostCtrl.SetFocus();
			return FALSE;
		}

		if (m_Port=="")
		{
			m_cTree.SelectItem(olditem);
			AfxMessageBox(IDS_ERRORMSG_PORTNEEDED,MB_ICONEXCLAMATION);
			m_PortCtrl.SetFocus();
			return FALSE;
		}
		else if (!_ttoi(m_Port))
		{
			m_cTree.SelectItem(olditem);
			AfxMessageBox(IDS_ERRORMSG_PORTNEEDED,MB_ICONEXCLAMATION);
			m_PortCtrl.SetFocus();
			return FALSE;
		}

		if (m_Logontype==-1)
		{
			m_cTree.SelectItem(olditem);
			AfxMessageBox(IDS_ERRORMSG_SITEMANAGERNEEDLOGONTYPE,MB_ICONEXCLAMATION);
			m_LogontypeCtrl.SetFocus();
			return FALSE;
		}
		else if (m_Logontype==1)
		{
			if (m_User=="")
			{
				m_cTree.SelectItem(olditem);
				AfxMessageBox(IDS_ERRORMSG_SITEMANAGERNEEDUSER,MB_ICONEXCLAMATION);
				m_UserCtrl.SetFocus();
				return FALSE;
			}
	
		/*	if (m_Pass=="")
			{
				m_cTree.SelectItem(olditem);
				AfxMessageBox(IDS_ERRORMSG_SITEMANAGERNEEDPASS,MB_ICONEXCLAMATION);
				m_PassCtrl.SetFocus();
				return FALSE;
			}	*/
		}
		if (m_cServerType.GetCurSel()==CB_ERR)
			m_cServerType.SetCurSel(0);
		UpdateData(FALSE);
			
		t_SiteManagerItem *site=(t_SiteManagerItem*)m_cTree.GetItemData(olditem);
		ASSERT(site);
		site->Host=m_Host;
		site->nPort=_ttoi(m_Port);
		site->nLogonType=m_Logontype;
		if (m_Logontype)
		{
			site->User=m_User;
			site->Pass=m_Pass;
		}
		site->bFirewallBypass=m_bFwBypass;
		site->bPassDontSave=m_bPassDontSave;
		if (m_bPassDontSave) 
			site->Pass=""; //Ensure that the pass doesn't get saved
		site->nServerType=m_cServerType.GetCurSel();
		CWnd *pComments = GetDlgItem(IDC_SITEMANAGER_COMMENTS);
		if (pComments)
			pComments->GetWindowText(site->Comments);

		if (!m_nDefault)
			m_DefaultSite=olditem;		
	}
	return TRUE;	
}

t_SiteManagerItem *CSiteManager::GetData(CString Name)
{
	t_SiteManagerItem *site = new t_SiteManagerItem;
	site->Host = GetKey(Name, "Host");
	site->nPort = _ttoi(GetKey(Name, "Port"));
	site->User = GetKey(Name, "User");
	site->Pass = CCrypt::decrypt(GetKey(Name, "Pass"));
	site->nLogonType = _ttoi(GetKey(Name, "Logontype"))-1;
	site->RemoteDir = GetKey(Name, "Remote Dir");
	site->LocalDir = GetKey(Name, "Local Dir");
	site->bFirewallBypass = _ttoi(GetKey(Name, "FW Bypass"));
	site->bPassDontSave = _ttoi(GetKey(Name, "Dont Save Pass"));
	site->nServerType = _ttoi(GetKey(Name, "Server Type"));
	site->nPasv = _ttoi(GetKey(Name, "Pasv Mode"));
	site->nTimeZoneOffset = _ttoi(GetKey(Name, "Time Zone Offset"));
	if (site->nTimeZoneOffset < -24 || site->nTimeZoneOffset > 24)
		site->nTimeZoneOffset = 0;
	site->nTimeZoneOffset2 = _ttoi(GetKey(Name, "Time Zone Offset Minutes"));
	if (site->nTimeZoneOffset2 < -59 || site->nTimeZoneOffset2 > 59)
		site->nTimeZoneOffset2 = 0;
	site->Comments = GetKey(Name, "Comments");
	site->name = Name;
	if (site->Host=="" || !site->nPort || site->nLogonType==-1)
	{
		delete site;
		return 0;
	}
	return site;
}

t_SiteManagerItem *CSiteManager::GetDataXML(CMarkupSTL *pMarkup)
{
	t_SiteManagerItem *site = new t_SiteManagerItem;
	site->Host = pMarkup->GetChildAttrib( _T("Host") );
	site->nPort = _ttoi(pMarkup->GetChildAttrib( _T("Port") ));
	site->User = pMarkup->GetChildAttrib( _T("User") );
	site->Pass = CCrypt::decrypt(pMarkup->GetChildAttrib( _T("Pass") ));
	site->nLogonType = _ttoi(pMarkup->GetChildAttrib( _T("Logontype") ));
	site->RemoteDir = pMarkup->GetChildAttrib( _T("RemoteDir") );
	site->LocalDir = pMarkup->GetChildAttrib( _T("LocalDir") );
	site->bFirewallBypass = _ttoi(pMarkup->GetChildAttrib( _T("FWBypass") ));
	site->bPassDontSave = _ttoi(pMarkup->GetChildAttrib( _T("DontSavePass") ));
	site->nServerType = _ttoi(pMarkup->GetChildAttrib( _T("ServerType") ));
	site->name = pMarkup->GetChildAttrib( _T("Name") );
	site->nPasv = _ttoi(pMarkup->GetChildAttrib(_T("PasvMode")));
	site->nTimeZoneOffset = _ttoi(pMarkup->GetChildAttrib(_T("TimeZoneOffset")));
	if (site->nTimeZoneOffset < -24 || site->nTimeZoneOffset > 24)
		site->nTimeZoneOffset = 0;
	site->nTimeZoneOffset2 = _ttoi(pMarkup->GetChildAttrib(_T("TimeZoneOffsetMinutes")));
	if (site->nTimeZoneOffset2 < -59 || site->nTimeZoneOffset2 > 59)
		site->nTimeZoneOffset2 = 0;
	site->Comments = pMarkup->GetChildAttrib(_T("Comments"));
	if (site->Host=="" || !site->nPort || site->nLogonType==-1)
	{
		delete site;
		return 0;
	}
	return site;
}

void CSiteManager::SetCtrlState()
{
	bool bItemIsSite = false;
	HTREEITEM item=m_cTree.GetSelectedItem();
	t_SiteManagerItem *data=0;
	if (item)
		data=(t_SiteManagerItem*)m_cTree.GetItemData(item);

	if(data)
		if(data->NodeType == SITE)
			bItemIsSite = true;

	if (bItemIsSite)
	{
		m_DeleteCtrl.EnableWindow(TRUE);
		m_HostCtrl.EnableWindow(TRUE);
		m_PortCtrl.EnableWindow(TRUE);
		m_UserCtrl.EnableWindow(TRUE);
		m_PassCtrl.EnableWindow(TRUE);
		m_LogontypeCtrl.EnableWindow(TRUE);
		m_LogontypeCtrl2.EnableWindow(TRUE);
		m_ConnectCtrl.EnableWindow(TRUE);
		m_FwBypassCtrl.EnableWindow(TRUE);
		m_UserCtrl.SetReadOnly(m_Logontype?FALSE:TRUE);
		m_PassCtrl.SetReadOnly(m_Logontype?FALSE:TRUE);	
		m_PassCtrl.EnableWindow((!m_bPassDontSave || !m_Logontype) && !_ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE)));			
		m_cDefault.EnableWindow(TRUE);
		m_cPassDontSave.EnableWindow((m_Logontype && !_ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE)))?TRUE:FALSE);
		m_cServerType.EnableWindow(TRUE);
		GetDlgItem(IDC_SITEMANAGER_ADVANCED)->EnableWindow(TRUE);
		GetDlgItem(IDC_SITEMANAGER_COPY)->EnableWindow(TRUE);
		GetDlgItem(IDC_SITEMANAGER_RENAME)->EnableWindow(TRUE);
		GetDlgItem(IDC_SITEMANAGER_COMMENTS)->EnableWindow(TRUE);
	}
	else
	{
		if (item && m_cTree.GetParentItem(item))
		{
			m_DeleteCtrl.EnableWindow(TRUE);
			GetDlgItem(IDC_SITEMANAGER_RENAME)->EnableWindow(TRUE);
		}
		else
		{
			m_DeleteCtrl.EnableWindow(FALSE);
			GetDlgItem(IDC_SITEMANAGER_RENAME)->EnableWindow(FALSE);
		
		}
		m_HostCtrl.EnableWindow(FALSE);
		m_PortCtrl.EnableWindow(FALSE);
		m_UserCtrl.EnableWindow(FALSE);
		m_PassCtrl.EnableWindow(FALSE);
		m_LogontypeCtrl.EnableWindow(FALSE);
		m_LogontypeCtrl2.EnableWindow(FALSE);
		m_ConnectCtrl.EnableWindow(FALSE);
		m_FwBypassCtrl.EnableWindow(FALSE);
		m_cDefault.EnableWindow(FALSE);
		m_cPassDontSave.EnableWindow(FALSE);
		m_cServerType.EnableWindow(FALSE);
		GetDlgItem(IDC_SITEMANAGER_ADVANCED)->EnableWindow(FALSE);
		GetDlgItem(IDC_SITEMANAGER_COPY)->EnableWindow(FALSE);
		GetDlgItem(IDC_SITEMANAGER_COMMENTS)->EnableWindow(FALSE);
		UpdateData(false);
	}
}

void CSiteManager::OnDelete() 
{
	HTREEITEM item=m_cTree.GetSelectedItem();
	if (!item)
		return;
	if (!m_cTree.GetParentItem(item))
		return;
	HTREEITEM parent=m_cTree.GetParentItem(item);
	CString path;
	while (m_cTree.GetParentItem(item))
	{
		path=m_cTree.GetItemText(item)+"\\"+path;
		item=m_cTree.GetParentItem(item);
	}
	path.TrimRight( _T("\\") );
	m_KeysToDelete.push_back(path);
	
	item=m_cTree.GetSelectedItem();
	while(item!=parent)
	{
		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);
		if (m_DefaultSite==item)
			m_DefaultSite=m_cTree.GetRootItem();
		m_cTree.DeleteItem(item);
		item=parent;		
	}
	m_cTree.SelectItem(parent);
}

void CSiteManager::SaveData()
{
	CMarkupSTL *pMarkup;
	if (COptions::LockXML(&pMarkup))
	{
		SaveDataXML(pMarkup);
		COptions::UnlockXML();
	}
	HTREEITEM item=m_cTree.GetChildItem(TVI_ROOT);
	CString path="";
	//Only delete the old items that have been renamed or removed
	//Don't delete complete sitemanager key so that crashes while saving would not be fatal
	for (std::list<CString>::iterator iter=m_KeysToDelete.begin(); iter!=m_KeysToDelete.end(); iter++)
		RegDeleteKeyEx("Software\\FileZilla\\Site Manager\\"+*iter);
	m_KeysToDelete.clear();
	//Save the sites, old items will be overwritten.
	while(item)
	{
		t_SiteManagerItem *site=0;
		if (m_cTree.ItemHasChildren(item))
		{
			item=m_cTree.GetChildItem(item);
			path+="\\"+m_cTree.GetItemText(item);
			continue;
		}
		site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
		ASSERT(site);
		if (site->NodeType == SITE)
		{
			SetKey(path,"Default Site",(item==m_DefaultSite)?"1":"0");
			SaveSingleSite(path,site);
		}
		else if (path!="")
			SetKey(path,"","Folder");
		delete site;

		HTREEITEM parent=m_cTree.GetParentItem(item);
		m_cTree.DeleteItem(item);
		item=parent;
		int pos=path.ReverseFind('\\');
		if (pos!=-1)
			path=path.Left(pos);
		else
			path="";
	}
}

void CSiteManager::SaveDataXML(CMarkupSTL *pMarkup)
{
	pMarkup->ResetPos();
	if (!pMarkup->FindChildElem( _T("Sites") ))
		pMarkup->AddChildElem( _T("Sites") );

	pMarkup->IntoElem();
	
	//Only delete the old items that have been renamed or removed
	//Don't delete complete sitemanager key so that crashes while saving would not be fatal
	pMarkup->SavePos( _T("PREDELETE") );
	CString current;
	BOOL res=pMarkup->FindChildElem();
	while (res)
	{
		if (pMarkup->GetChildTagName()==_T("Folder"))
		{
			if (current!="")
				current+="\\"+pMarkup->GetChildAttrib( _T("Name") );
			else
				current=pMarkup->GetChildAttrib( _T("Name") );
			
			if (m_KeysToDelete.empty())
				break;
			
			std::list<CString>::iterator iter;
			for (iter=m_KeysToDelete.begin(); iter!=m_KeysToDelete.end(); iter++)
				if (*iter==current)
				{
					VERIFY(pMarkup->RemoveChildElem());
					m_KeysToDelete.erase(iter);
					break;
				}
			if (m_KeysToDelete.empty())
				break;
			
			if (iter==m_KeysToDelete.end())
				pMarkup->IntoElem();
			else
			{
				int pos=current.ReverseFind('\\');
				if (pos==-1)
					current="";
				else
					current=current.Left(pos);
			}
			
			res=pMarkup->FindChildElem();
			while (!res && current!="")
			{
				int pos=current.ReverseFind('\\');
				if (pos==-1)
					current="";
				else
					current=current.Left(pos);
				pMarkup->OutOfElem();
				res=pMarkup->FindChildElem();
			}
		}
		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") );

⌨️ 快捷键说明

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