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

📄 sitemanager.cpp

📁 一个支持FTP,SFTP的客户端程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// FileZilla - a Windows ftp client

// Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>

// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

// SiteManager.cpp: Implementierungsdatei
//

#include "stdafx.h"
#include "filezilla.h"
#include "SiteManager.h"
#include "entersomething.h"
#include "SiteManagerAdvancedDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CMenuTree::~CMenuTree()
{
	for (std::list<t_SiteManagerItem *>::iterator iter=m_Sites.begin(); iter!=m_Sites.end(); iter++)
		delete *iter;
}

bool NewItem_Menu( LPVOID lpData, LPCTSTR lpszName, LPVOID lpParent, t_SiteManagerItem *site, bool isDefault, LPVOID lpDefault)
{
	CMenuTree *mt = ( CMenuTree *)lpData;

	AppendMenu( ( HMENU)lpParent, MF_STRING, mt->m_CurrentItem, lpszName);

	if (!site)
		EnableMenuItem( (HMENU)lpParent, mt->m_CurrentItem, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);

	if (isDefault)
		SetMenuDefaultItem( ( HMENU)lpParent, mt->m_CurrentItem, FALSE);

	mt->m_CurrentItem++;

	mt->m_Sites.push_back(site);

	return true;
}

bool NewFolder_Menu( LPVOID lpData, LPCTSTR lpszName, LPVOID &lpParent)
{
	HMENU hMenu = CreatePopupMenu();
	AppendMenu( ( HMENU)lpParent, MF_STRING | MF_POPUP, ( UINT)hMenu, lpszName);
	lpParent = ( LPVOID)hMenu;

	return true;
}

bool After_Menu( LPVOID lpData, LPCTSTR lpszName, LPVOID lpItem)
{
	if (!GetMenuItemCount(( HMENU)lpItem))
	{
		CString name;
		name.LoadString(IDS_TOOLBAR_SITEDROPDOWN_EMPTYFOLDER);
		NewItem_Menu(lpData, name, lpItem, 0, 0, 0);
	}
	return true;
}

bool CSiteManager::NewItem_Tree(LPVOID lpData, LPCTSTR lpszName, LPVOID lpParent, t_SiteManagerItem *site, bool isDefault, LPVOID lpDefault)
{
	HTREEITEM item = ((CTreeCtrl *)lpData)->InsertItem(lpszName, 2, 2, (HTREEITEM)lpParent, TVI_SORT);
	((CTreeCtrl *)lpData)->SetItemData(item, (DWORD)site);
	if ( isDefault)
		*((HTREEITEM *)lpDefault) = item;

	return true;
}

bool CSiteManager::NewFolder_Tree( LPVOID lpData, LPCTSTR lpszName, LPVOID &lpParent)
{
	lpParent = ((CTreeCtrl *)lpData)->InsertItem(lpszName, (HTREEITEM)lpParent, TVI_SORT);
	t_SiteManagerItem *pFolder = new t_SiteManagerItem;
	pFolder->name = lpszName;
	pFolder->NodeType = FOLDER;
	((CTreeCtrl *)lpData)->SetItemData((HTREEITEM)lpParent, (DWORD)pFolder);
	return true;
}

bool CSiteManager::After_Tree(LPVOID lpData, LPCTSTR lpszName, LPVOID lpItem)
{
	CTreeCtrl* pTreeCtrl = (CTreeCtrl*)lpData;

	if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
		pTreeCtrl->Expand((HTREEITEM)lpItem, TVE_EXPAND);

	if (COptions::GetOptionVal(OPTION_SORTSITEMANAGERFOLDERSFIRST))
	{
		TVSORTCB pMy_Sort;
		pMy_Sort.hParent = (HTREEITEM)lpItem;
		pMy_Sort.lpfnCompare = CSiteManager::SortFoldersFirst;
		pMy_Sort.lParam = (LPARAM) pTreeCtrl;
		pTreeCtrl->SortChildrenCB(&pMy_Sort);
	}
	return true;
}

/////////////////////////////////////////////////////////////////////////////
// Dialogfeld CSiteManager


CSiteManager::CSiteManager(CWnd* pParent /*=NULL*/)
	: CDialog(CSiteManager::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSiteManager)
	m_Logontype = -1;
	m_Host = _T("");
	m_Pass = _T("");
	m_Port = _T("");
	m_User = _T("");
	m_bFwBypass = FALSE;
	m_nDefault = -1;
	m_bPassDontSave = FALSE;
	//}}AFX_DATA_INIT
	m_bAddServer=FALSE;
	m_nServerType = -1;
	m_pDragImage=0;
	m_hDragItem=0;
	m_nDragScrollTimerID=0;
	m_hDropItem=0;
}


void CSiteManager::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSiteManager)
	DDX_Control(pDX, IDC_SERVERTYPE, m_cServerType);
	DDX_Control(pDX, IDC_SITEMANAGERTREE, m_cTree);
	DDX_Control(pDX, IDC_PASSDONTSAVE, m_cPassDontSave);
	DDX_Control(pDX, IDC_DEFAULT, m_cDefault);
	DDX_Control(pDX, IDC_FWBYPASS, m_FwBypassCtrl);
	DDX_Control(pDX, IDOK, m_ConnectCtrl);
	DDX_Control(pDX, IDC_USER, m_UserCtrl);
	DDX_Control(pDX, IDC_USER2, m_AccountCtrl);
	DDX_Control(pDX, IDC_RADIO1, m_LogontypeCtrl);
	DDX_Control(pDX, IDC_RADIO2, m_LogontypeCtrl2);
	DDX_Control(pDX, IDC_RADIO3, m_LogontypeCtrl3);
	DDX_Control(pDX, IDC_PORT, m_PortCtrl);
	DDX_Control(pDX, IDC_PASS, m_PassCtrl);
	DDX_Control(pDX, IDC_DELETE, m_DeleteCtrl);
	DDX_Control(pDX, IDC_HOST, m_HostCtrl);
	DDX_Radio(pDX, IDC_RADIO1, m_Logontype);
	DDX_Text(pDX, IDC_HOST, m_Host);
	DDX_Text(pDX, IDC_PASS, m_Pass);
	DDX_Text(pDX, IDC_PORT, m_Port);
	DDX_Text(pDX, IDC_USER, m_User);
	DDX_Text(pDX, IDC_USER2, m_Account);
	DDX_Check(pDX, IDC_FWBYPASS, m_bFwBypass);
	DDX_Radio(pDX, IDC_DEFAULT, m_nDefault);
	DDX_Check(pDX, IDC_PASSDONTSAVE, m_bPassDontSave);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSiteManager, CDialog)
	//{{AFX_MSG_MAP(CSiteManager)
	ON_BN_CLICKED(IDC_NEW, OnNew)
	ON_BN_CLICKED(IDC_DELETE, OnDelete)
	ON_BN_CLICKED(IDC_RADIO1, OnRadio)
	ON_BN_CLICKED(IDC_RADIO2, OnRadio)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio)
	ON_BN_CLICKED(IDC_EXIT, OnExit)
	ON_EN_KILLFOCUS(IDC_HOST, OnKillfocusHost)
	ON_COMMAND(ID_SITEMANAGER_SAVEEXIT, OnSitemanagerSaveexit)
	ON_COMMAND(ID_SITEMANAGER_FILE_IMPORT, OnSitemanagerFileImport)
	ON_COMMAND(ID_SITEMANAGER_FILE_EXPORT_ASURLLIST, OnSitemanagerFileExportAsurllist)
	ON_COMMAND(ID_SITEMANAGER_FILE_EXPORT_WITHALLDETAILS, OnSitemanagerFileExportWithalldetails)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_PASSDONTSAVE, OnPassdontsave)
	ON_NOTIFY(TVN_SELCHANGING, IDC_SITEMANAGERTREE, OnSelchangingSitemanagertree)
	ON_NOTIFY(TVN_SELCHANGED, IDC_SITEMANAGERTREE, OnSelchangedSitemanagertree)
	ON_NOTIFY(TVN_ITEMEXPANDED, IDC_SITEMANAGERTREE, OnItemexpandedSitemanagertree)
	ON_NOTIFY(NM_DBLCLK, IDC_SITEMANAGERTREE, OnDblclkSitemanagertree)
	ON_NOTIFY(TVN_ENDLABELEDIT, IDC_SITEMANAGERTREE, OnEndlabeleditSitemanagertree)
	ON_BN_CLICKED(IDC_SITEMANAGER_NEWFOLDER, OnSitemanagerNewfolder)
	ON_NOTIFY(TVN_BEGINDRAG, IDC_SITEMANAGERTREE, OnBegindragSitemanagertree)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_TIMER()
	ON_CBN_SELCHANGE(IDC_SERVERTYPE, OnSelchangeServertype)
	ON_BN_CLICKED(IDC_SITEMANAGER_ADVANCED, OnSitemanagerAdvanced)
	ON_BN_CLICKED(IDC_SITEMANAGER_COPY, OnSitemanagerCopy)
	ON_BN_CLICKED(IDC_SITEMANAGER_RENAME, OnSitemanagerRename)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen f黵 Nachrichten CSiteManager

bool CSiteManager::ConnectSitePrepare(t_SiteManagerItem *site)
{
	if (site && site->NodeType == SITE)
	{
		BOOL bUseGSS=FALSE;
		if (COptions::GetOptionVal(OPTION_USEGSS) && site->bPassDontSave)
		{
			USES_CONVERSION;

			CString GssServers=COptions::GetOption(OPTION_GSSSERVERS);
			LPCSTR lpszAsciiHost=T2CA(site->Host);
			hostent *fullname=gethostbyname(lpszAsciiHost);
			CString host;
			if (fullname)
				host=fullname->h_name;
			else
				host=site->Host;
			host.MakeLower();
			int i;
			while ((i=GssServers.Find( _T(";") ))!=-1)
			{
				if (("."+GssServers.Left(i))==host.Right(GssServers.Left(i).GetLength()+1) || GssServers.Left(i)==host)
				{
					bUseGSS=TRUE;
					break;
				}
				GssServers=GssServers.Mid(i+1);
			}
		}
		if (!bUseGSS)
		{
			if (site->nLogonType && ( site->bPassDontSave || _ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE))) )
			{
				CEnterSomething dlg(IDS_INPUTDIALOGTITLE_INPUTPASSWORD,IDS_INPUTDIALOGTEXT_INPUTPASSWORD,'*');
				if (dlg.DoModal()!=IDOK)
					return false;
				site->Pass = dlg.m_String;
			}
		}
		return true;
	}

	return false;
}

void CSiteManager::OnOK()
{
	HTREEITEM item=m_cTree.GetSelectedItem();
	t_SiteManagerItem *site=0;
	if (item)
		site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
	if (!site || site->NodeType != SITE)
		return;

	if (CheckValid())
	{   //If an item is selected and the current selection is valid,
		//we can save the data and close the dialog
		//And don't forget to ask for the password first!
		t_SiteManagerItem site2 = *(t_SiteManagerItem *)m_cTree.GetItemData(item);
		BOOL bUseGSS=FALSE;
		if (COptions::GetOptionVal(OPTION_USEGSS) && m_bPassDontSave)
		{
			USES_CONVERSION;
				CString GssServers=COptions::GetOption(OPTION_GSSSERVERS);
			LPCSTR lpszAsciiHost=T2CA(m_Host);
			hostent *fullname=gethostbyname(lpszAsciiHost);
			CString host;
			if (fullname)
				host=fullname->h_name;
			else
				host=m_Host;
			host.MakeLower();
			int i;
			while ((i=GssServers.Find( _T(";") ))!=-1)
			{
				if (("."+GssServers.Left(i))==host.Right(GssServers.Left(i).GetLength()+1) || GssServers.Left(i)==host)
				{
					bUseGSS=TRUE;
					break;
				}
				GssServers=GssServers.Mid(i+1);
			}
		}

		if (!bUseGSS)
		{
			if (m_Logontype && (m_bPassDontSave || _ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE))) )
			{
				CEnterSomething dlg(IDS_INPUTDIALOGTITLE_INPUTPASSWORD,IDS_INPUTDIALOGTEXT_INPUTPASSWORD,'*');
				if (dlg.DoModal()!=IDOK)
					return;
				site2.Pass = dlg.m_String;
			}
		}

		SaveData();
		OnClose();
		m_LastSite = site2;
		m_nServerType = m_cServerType.GetCurSel();
		CDialog::OnOK();
	}
}

CString CSiteManager::GetKey(HKEY hRootKey, CString subkey,CString keyname)
{
	HKEY key;
	if (RegOpenKey(hRootKey, "Software\\FileZilla\\Site Manager\\"+subkey,&key)==ERROR_SUCCESS)
	{
		unsigned char *buffer=new unsigned char[100];
		memset(buffer,0,100);

		unsigned long tmp=100;
		if (RegQueryValueEx(key,keyname,NULL,NULL,buffer,&tmp)!=ERROR_SUCCESS)
		{
			RegCloseKey(key);
			delete [] buffer;
			return "";
		}
		else
		{
			RegCloseKey(key);
			CString res=(LPTSTR)buffer;
			delete [] buffer;
			return res;
		}
	}
	return "";
}

void CSiteManager::SetKey(CString subkey,CString keyname,CString value)
{
	subkey.TrimLeft( _T("\\") );
	LPTSTR tmp=new TCHAR[value.GetLength()+1];
	LPCTSTR str=value;
	_tcscpy(tmp,str);
	HKEY key;
	if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\FileZilla\\Site Manager\\" + subkey, 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &key, NULL)==ERROR_SUCCESS)
	{
		RegSetValueEx(key,keyname,0,REG_SZ,(unsigned char *)tmp,(value.GetLength()+1)*sizeof(TCHAR));
		RegCloseKey(key);
	}
	delete [] tmp;
}

BOOL CSiteManager::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetCtrlState();
	m_DefaultSite=0;
	if (!m_ImageList.GetSafeHandle())
		m_ImageList.Create(16,16,ILC_COLOR8|ILC_MASK,0,3);
	if (!m_Bitmap.GetSafeHandle())
	{
		m_Bitmap.Attach(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_SITEMANAGERTREE)));
	}
	m_ImageList.Add(&m_Bitmap,RGB(255,0,255));
	m_cTree.SetImageList(&m_ImageList,TVSIL_NORMAL);
	CString str;
	str.LoadString(IDS_SITEMANAGER_TREEROOT);

	// Insert the parent item into the tree
	HTREEITEM item=m_cTree.InsertItem(str, TVI_ROOT, TVI_SORT);
	t_SiteManagerItem *root_pFolder = new t_SiteManagerItem;
	root_pFolder->name = str;
	root_pFolder->NodeType = FOLDER;
	m_cTree.SetItemData(item, (DWORD)root_pFolder);

	CMarkupSTL *pMarkup;
	if (COptions::LockXML(&pMarkup))
	{
		pMarkup->ResetPos();
		if (pMarkup->FindChildElem( _T("Sites") ))
		{
			pMarkup->IntoElem();
			ReadTreeXML(pMarkup, item, (LPVOID)&m_cTree, (LPVOID)&m_DefaultSite, NewItem_Tree, NewFolder_Tree, After_Tree);
		}
		else
			ReadTree( _T(""), item, (LPVOID)&m_cTree, (LPVOID)&m_DefaultSite, NewItem_Tree, NewFolder_Tree, After_Tree);

		COptions::UnlockXML();
	}
	else
		ReadTree( _T(""), item, (LPVOID)&m_cTree, (LPVOID)&m_DefaultSite, NewItem_Tree, NewFolder_Tree, After_Tree);
	// Sort with folders first.  The list is already sorted alphabetically at this point.
	if (COptions::GetOptionVal(OPTION_SORTSITEMANAGERFOLDERSFIRST))
	{
		TVSORTCB pMy_Sort;
		pMy_Sort.hParent = item;
		pMy_Sort.lpfnCompare = SortFoldersFirst;
		pMy_Sort.lParam = (LPARAM) &m_cTree;
		m_cTree.SortChildrenCB(&pMy_Sort);
	}

	m_cTree.Expand(item, TVE_EXPAND);

	if (!m_DefaultSite)
		m_DefaultSite=item;
	m_cTree.SelectItem(m_DefaultSite);
	t_SiteManagerItem *site=0;
	if (m_DefaultSite)
		site=(t_SiteManagerItem *)m_cTree.GetItemData(m_DefaultSite);
	DisplaySite(site);

	if (m_bAddServer)
	{
		CString str;

		str.Format(IDS_SITEMANAGER_NEWFTPSITE);
		int i=2;
		HTREEITEM parent=m_cTree.GetRootItem();
		HTREEITEM child=m_cTree.GetChildItem(parent);
		while (child)
		{
			CString str2=str;
			str2.MakeLower();
			CString childstr=m_cTree.GetItemText(child);
			childstr.MakeLower();
			if (childstr==str2)
			{
				str.Format(IDS_SITEMANAGER_NEWFTPSITEWITHNUM,i);
				i++;
				child=m_cTree.GetChildItem(parent);
				continue;
			}
			child=m_cTree.GetNextSiblingItem(child);

		}
		HTREEITEM item=m_cTree.InsertItem(str,2,2,parent,TVI_SORT);

		t_SiteManagerItem *site = new t_SiteManagerItem;
		site->name = str;
		site->Host = m_addserver.host;
		site->nPort = m_addserver.port;
		site->bPassDontSave = m_addserver.bDontRememberPass;
		if (m_addserver.user != "anonymous")
		{
			site->User = m_addserver.user;
			site->Pass = m_addserver.pass;
			site->nLogonType = 1;
		}
		else
			site->nLogonType = 0;
		site->nServerType = 0;
		if ( (m_addserver.nServerType&FZ_SERVERTYPE_HIGHMASK) == FZ_SERVERTYPE_FTP)
		{
			if ( (m_addserver.nServerType&FZ_SERVERTYPE_LAYERMASK) == FZ_SERVERTYPE_LAYER_SSL_IMPLICIT)
				site->nServerType = 1;
			else if ( (m_addserver.nServerType&FZ_SERVERTYPE_LAYERMASK) == FZ_SERVERTYPE_LAYER_SSL_EXPLICIT)
				site->nServerType = 2;
			else if ( (m_addserver.nServerType&FZ_SERVERTYPE_SUBMASK) == FZ_SERVERTYPE_SUB_FTP_SFTP)
				site->nServerType = 3;
			else if ((m_addserver.nServerType & FZ_SERVERTYPE_LAYERMASK) == FZ_SERVERTYPE_LAYER_TLS_EXPLICIT)
				site->nServerType = 4;
		}
		else
			ASSERT(FALSE);
		site->RemoteDir = m_addserver.path;
		site->bFirewallBypass = m_addserver.fwbypass;
		site->nTimeZoneOffset = m_addserver.nTimeZoneOffset / 60;
		site->nTimeZoneOffset2 = m_addserver.nTimeZoneOffset % 60;

⌨️ 快捷键说明

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