📄 sitemanager.cpp
字号:
// 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 + -