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

📄 sitemanager.cpp

📁 一个支持FTP,SFTP的客户端程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		site->NodeType = SITE;

		m_cTree.SetItemData(item,(DWORD)site);
		m_cTree.SelectItem(item);
		DisplaySite(site);
		m_cTree.SetFocus();
		m_cTree.EditLabel(item);

		m_bAddServer = FALSE;
	}

	m_hcArrow = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
	m_hcNo = AfxGetApp()->LoadStandardCursor(IDC_NO);

	if (m_FileToImport!="")
		Import(m_FileToImport);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zur點kgeben
}

void CSiteManager::OnNew()
{
	if (!CheckValid())
		return;
	HTREEITEM parent=m_cTree.GetSelectedItem();
	if (!parent)
		parent=m_cTree.GetRootItem();
	ASSERT(m_cTree.GetItemData(parent));
	if (((t_SiteManagerItem *)m_cTree.GetItemData(parent))->NodeType==SITE)
		parent=m_cTree.GetParentItem(parent);

	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)
		{
			if (m_User=="")
			{
				m_cTree.SelectItem(olditem);
				AfxMessageBox(IDS_ERRORMSG_SITEMANAGERNEEDUSER,MB_ICONEXCLAMATION);
				m_UserCtrl.SetFocus();
				return FALSE;
			}
			if (m_Logontype == 2 && m_Account == _T(""))
			{
				m_cTree.SelectItem(olditem);
				AfxMessageBox(_T("Please enter an account"), MB_ICONEXCLAMATION);
				m_AccountCtrl.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->Account = m_Account;
		}
		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(HKEY hRootKey, CString Name)
{
	t_SiteManagerItem *site = new t_SiteManagerItem;
	site->Host = GetKey(hRootKey, Name, "Host");
	site->nPort = _ttoi(GetKey(hRootKey, Name, "Port"));
	site->User = GetKey(hRootKey, Name, "User");
	site->Account = GetKey(hRootKey, Name, "Account");
	site->Pass = CCrypt::decrypt(GetKey(hRootKey, Name, "Pass"));
	site->nLogonType = _ttoi(GetKey(hRootKey, Name, "Logontype"))-1;
	site->RemoteDir = GetKey(hRootKey, Name, "Remote Dir");
	site->LocalDir = GetKey(hRootKey, Name, "Local Dir");
	site->bFirewallBypass = _ttoi(GetKey(hRootKey, Name, "FW Bypass"));
	site->bPassDontSave = _ttoi(GetKey(hRootKey, Name, "Dont Save Pass"));
	site->nServerType = _ttoi(GetKey(hRootKey, Name, "Server Type"));
	site->nPasv = _ttoi(GetKey(hRootKey, Name, "Pasv Mode"));
	site->nTimeZoneOffset = _ttoi(GetKey(hRootKey, Name, "Time Zone Offset"));
	if (site->nTimeZoneOffset < -24 || site->nTimeZoneOffset > 24)
		site->nTimeZoneOffset = 0;
	site->nTimeZoneOffset2 = _ttoi(GetKey(hRootKey, Name, "Time Zone Offset Minutes"));
	if (site->nTimeZoneOffset2 < -59 || site->nTimeZoneOffset2 > 59)
		site->nTimeZoneOffset2 = 0;
	site->nUTF8 = _ttoi(GetKey(hRootKey, Name, "UTF8"));
	if (site->nUTF8 < 0 || site->nUTF8 > 2)
		site->nUTF8 = 0;
	site->Comments = GetKey(hRootKey, 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->Account = pMarkup->GetChildAttrib( _T("Account") );
	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->nUTF8 = _ttoi(pMarkup->GetChildAttrib(_T("UTF8")));
	if (site->nUTF8 < 0 || site->nUTF8 > 2)
		site->nUTF8 = 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_AccountCtrl.EnableWindow(TRUE);
		m_PassCtrl.EnableWindow(TRUE);
		m_LogontypeCtrl.EnableWindow(TRUE);
		m_LogontypeCtrl2.EnableWindow(TRUE);
		m_LogontypeCtrl3.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_AccountCtrl.SetReadOnly(m_Logontype != 2);
		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_AccountCtrl.EnableWindow(FALSE);
		m_PassCtrl.EnableWindow(FALSE);
		m_LogontypeCtrl.EnableWindow(FALSE);
		m_LogontypeCtrl2.EnableWindow(FALSE);
		m_LogontypeCtrl3.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();

⌨️ 快捷键说明

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