www.pudn.com > 完整的FTP客户端ftpwanderersrc.zip > ConnectDlg.cpp


/****************************************************************/ 
/*																*/ 
/*  ConnectDlg.cpp												*/ 
/*																*/ 
/*  Implementation of the CConnectDlg class.					*/ 
/*																*/ 
/*  Programmed by Pablo van der Meer							*/ 
/*  Copyright Pablo Software Solutions 2002						*/ 
/*	http://www.pablovandermeer.nl								*/ 
/*																*/ 
/*  Last updated: 15 may 2002									*/ 
/*																*/ 
/****************************************************************/ 
 
 
#include "stdafx.h" 
#include "ftpwanderer.h" 
#include "ConnectDlg.h" 
#include "WizardPages.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
CConnectDlg::CConnectDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CConnectDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CConnectDlg) 
	m_strAddress = _T(""); 
	m_bAnonymous = FALSE; 
	m_nRetries = 3; 
	m_strDescription = _T(""); 
	m_strLocalPath = _T(""); 
	m_strLogin = _T(""); 
	m_strName = _T(""); 
	m_strPassword = _T(""); 
	m_nPort = 21; 
	m_strRemotePath = _T(""); 
	m_nRetryDelay = 10; 
	m_bUsePASVMode = FALSE; 
	//}}AFX_DATA_INIT 
 
	GetAppDir(m_strFilename); 
	m_strFilename += "sites.dat"; 
 
	m_bModified = FALSE; 
} 
 
 
void CConnectDlg::DoDataExchange(CDataExchange* pDX) 
{	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CConnectDlg) 
	DDX_Control(pDX, IDC_PROFILE_NAME, m_wndInfobarCtrl); 
	DDX_Control(pDX, IDC_SITES, m_listSites); 
	DDX_Text(pDX, IDC_ADDRESS, m_strAddress); 
	DDX_Check(pDX, IDC_ANONYMOUS, m_bAnonymous); 
	DDX_Text(pDX, IDC_RETRIES, m_nRetries); 
	DDX_Text(pDX, IDC_DESCRIPTION, m_strDescription); 
	DDX_Text(pDX, IDC_LOCALPATH, m_strLocalPath); 
	DDX_Text(pDX, IDC_LOGIN, m_strLogin); 
	DDX_Text(pDX, IDC_NAME, m_strName); 
	DDX_Text(pDX, IDC_PASSWORD, m_strPassword); 
	DDX_Text(pDX, IDC_PORT, m_nPort); 
	DDX_Text(pDX, IDC_REMOTEPATH, m_strRemotePath); 
	DDX_Text(pDX, IDC_RETRYDELAY, m_nRetryDelay); 
	DDX_Check(pDX, IDC_USE_PASVMODE, m_bUsePASVMode); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CConnectDlg, CDialog) 
	//{{AFX_MSG_MAP(CConnectDlg) 
	ON_BN_CLICKED(IDC_SAVE, OnSave) 
	ON_BN_CLICKED(IDC_ADD, OnAdd) 
	ON_LBN_SELCHANGE(IDC_SITES, OnSelchangeSites) 
	ON_BN_CLICKED(IDC_REMOVE, OnRemove) 
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse) 
	ON_LBN_DBLCLK(IDC_SITES, OnDblclkSites) 
	ON_BN_CLICKED(IDC_ANONYMOUS, OnAnonymous) 
	ON_EN_CHANGE(IDC_NAME, OnChangeName) 
	ON_BN_CLICKED(IDC_WIZARD, OnWizard) 
	ON_EN_CHANGE(IDC_LOCALPATH, OnSomethingChanged) 
	ON_EN_CHANGE(IDC_DESCRIPTION, OnSomethingChanged) 
	ON_EN_CHANGE(IDC_RETRIES, OnSomethingChanged) 
	ON_EN_CHANGE(IDC_ADDRESS, OnSomethingChanged) 
	ON_EN_CHANGE(IDC_PASSWORD, OnSomethingChanged) 
	ON_EN_CHANGE(IDC_PORT, OnSomethingChanged) 
	ON_EN_CHANGE(IDC_REMOTEPATH, OnSomethingChanged) 
	ON_EN_CHANGE(IDC_RETRYDELAY, OnSomethingChanged) 
	ON_BN_CLICKED(IDC_USE_PASVMODE, OnSomethingChanged) 
	ON_EN_CHANGE(IDC_LOGIN, OnChangeLogin) 
	//}}AFX_MSG_MAP 
	ON_UPDATE_COMMAND_UI(IDC_SAVE, OnUpdateSave) 
	ON_UPDATE_COMMAND_UI(IDC_REMOVE, OnUpdateRemove) 
	ON_UPDATE_COMMAND_UI(IDOK, OnUpdateConnect) 
END_MESSAGE_MAP() 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnInitDialog										*/ 
/* Description   : Initialize dialog								*/ 
/*																	*/ 
/********************************************************************/ 
BOOL CConnectDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// center in parent 
	CenterWindow(); 
 
	// get site data 
	Serialize(FALSE);	 
 
	// fill sites list 
	for (int i=0; i < m_SitesArray.GetSize(); i++) 
	{ 
		int nIndex = m_listSites.AddString(m_SitesArray[i].m_strName); 
		m_listSites.SetItemData(nIndex, i); 
	} 
	int nIndex = AfxGetApp()->GetProfileInt("Settings", "LastSelectedSite", 0); 
	m_listSites.SetCurSel(nIndex); 
	OnSelchangeSites(); 
 
	return TRUE; 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : Serialize										*/ 
/* Description   : Call this function to store/load the site data	*/ 
/*																	*/ 
/********************************************************************/ 
BOOL CConnectDlg::Serialize(BOOL bStoring) 
{ 
	static const TCHAR* lpszSignature = _T("Pablo Software Solutions - StoreObject"); 
 
	CFile file; 
 
	if (file.Open(m_strFilename, bStoring ? CFile::modeWrite|CFile::modeCreate : CFile::modeRead)) 
	{ 
		TRY 
		{ 
			CString str;  
			CArchive ar(&file, bStoring ? CArchive::store : CArchive::load); 
			 
			if (bStoring) 
			{ 
				// save signature 
				ar << CString(lpszSignature); 
 
				// Save the changed site details 
				for (int i=0; i < m_SitesArray.GetSize(); i++) 
				{ 
					m_SitesArray[i].Serialize(ar); 
				} 
 
				ar.Flush(); 
				m_bModified = FALSE; 
//				UpdateDialogControls(this, FALSE);	 
			} 
			else 
			{ 
				// load signature 
				ar >> str; 
				// if this the file we are looking for ? 
				if (str.Compare(lpszSignature) == 0) 
				{ 
					int nCount=0; 
 
					while(!ar.IsBufferEmpty()) 
					{ 
						CFtpSite ftpSite; 
 
						// get site data 
						ftpSite.Serialize(ar); 
						 
						// add site to array 
						m_SitesArray.Add(ftpSite); 
					} 
				} 
			} 
			ar.Close(); 
			file.Close(); 
		} 
		CATCH_ALL(e) 
		{ 
			// catch all exceptions that might happen ... 
			return FALSE; 
		} 
		END_CATCH_ALL 
	} 
	return TRUE; 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnAdd											*/ 
/* Description   : Add the entered site to the list					*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnAdd()  
{ 
	// check stuff ... 
	if (!ValidateData()) 
		return; 
 
	for (int i=0; iSetWindowText(""); 
			GetDlgItem(IDC_NAME)->SetFocus(); 
			return; 
		} 
	} 
 
	CFtpSite ftpSite; 
 
	int nIndex = m_listSites.AddString(m_strName); 
	int nItem = m_SitesArray.Add(ftpSite); 
	 
	m_listSites.SetItemData(nIndex, nItem); 
	m_listSites.SetCurSel(nIndex);	 
 
	m_SitesArray[nItem].m_bUsePASVMode = m_bUsePASVMode; 
	m_SitesArray[nItem].m_nRetries = m_nRetries; 
	m_SitesArray[nItem].m_nPort = m_nPort; 
	m_SitesArray[nItem].m_nRetryDelay = m_nRetryDelay; 
	m_SitesArray[nItem].m_strAddress = m_strAddress; 
	m_SitesArray[nItem].m_strDescription = m_strDescription; 
	m_SitesArray[nItem].m_strLocalPath = m_strLocalPath; 
	m_SitesArray[nItem].m_strLogin = m_strLogin; 
	m_SitesArray[nItem].m_strName = m_strName; 
	m_SitesArray[nItem].m_strPassword = m_strPassword; 
	m_SitesArray[nItem].m_strRemotePath = m_strRemotePath; 
	 
//	UpdateDialogControls(this, FALSE);	 
	Serialize(TRUE); 
	UpdateDialogControls(this, FALSE);	 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnSave											*/ 
/* Description   : Save entered data								*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnSave()  
{ 
	// check stuff ... 
	if (!ValidateData()) 
		return; 
 
	int nIndex = m_listSites.GetCurSel(); 
	if (nIndex != LB_ERR) 
	{ 
		int nItem = m_listSites.GetItemData(nIndex); 
		m_SitesArray[nItem].m_bUsePASVMode = m_bUsePASVMode; 
		m_SitesArray[nItem].m_nRetries = m_nRetries; 
		m_SitesArray[nItem].m_nPort = m_nPort; 
		m_SitesArray[nItem].m_nRetryDelay = m_nRetryDelay; 
		m_SitesArray[nItem].m_strAddress = m_strAddress; 
		m_SitesArray[nItem].m_strDescription = m_strDescription; 
		m_SitesArray[nItem].m_strLocalPath = m_strLocalPath; 
		m_SitesArray[nItem].m_strLogin = m_strLogin; 
		m_SitesArray[nItem].m_strName = m_strName; 
		m_SitesArray[nItem].m_strPassword = m_strPassword; 
		m_SitesArray[nItem].m_strRemotePath = m_strRemotePath; 
		m_listSites.DeleteString(nIndex); 
		nIndex = m_listSites.AddString(m_strName); 
 
		m_listSites.SetItemData(nIndex, nItem); 
		m_listSites.SetCurSel(nIndex);	 
		Serialize(TRUE);	 
		UpdateDialogControls(this, FALSE);	 
	} 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnRemove											*/ 
/* Description   : Remove selected entry from the list				*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnRemove()  
{ 
	int nIndex = m_listSites.GetCurSel(); 
	if (nIndex == LB_ERR) 
		return; 
 
	int nItem = m_listSites.GetItemData(nIndex); 
	// remove site from listbox 
	m_listSites.DeleteString(nIndex); 
	// remove site from array 
	m_SitesArray.RemoveAt(nItem); 
 
	// update item data values 
	for (int i=0; i nIndex) 
			m_listSites.SetItemData(i, nItemData-1); 
	} 
	Serialize(TRUE); 
	UpdateDialogControls(this, FALSE);	 
 
	m_listSites.SetCurSel(0); 
	OnSelchangeSites(); 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnUpdateConnect									*/ 
/* Description   : Enable/Disable Connect-button					*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnUpdateConnect(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(((CEdit*)GetDlgItem(IDC_ADDRESS))->GetWindowTextLength()); 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnUpdateSave										*/ 
/* Description   : Enable/Disable Save-button						*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnUpdateSave(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_bModified && m_listSites.GetCurSel() != LB_ERR);	 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnUpdateRemove									*/ 
/* Description   : Enable/Disable Remove-button						*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnUpdateRemove(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_listSites.GetCurSel() != LB_ERR);	 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnSelchangeSites									*/ 
/* Description   : Get data from selected site						*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnSelchangeSites()  
{ 
	int nIndex = m_listSites.GetCurSel(); 
	if (nIndex != LB_ERR) 
	{ 
		int nItem = m_listSites.GetItemData(nIndex); 
		m_bUsePASVMode = m_SitesArray[nItem].m_bUsePASVMode; 
		m_nRetries = m_SitesArray[nItem].m_nRetries; 
		m_nPort = m_SitesArray[nItem].m_nPort; 
		m_nRetryDelay = m_SitesArray[nItem].m_nRetryDelay; 
		m_strAddress = m_SitesArray[nItem].m_strAddress; 
		m_strDescription = m_SitesArray[nItem].m_strDescription; 
		m_strLocalPath = m_SitesArray[nItem].m_strLocalPath ; 
		m_strLogin = m_SitesArray[nItem].m_strLogin; 
		m_bAnonymous = (m_strLogin.CompareNoCase("anonymous") == 0); 
		if (!m_bAnonymous) 
		{ 
			GetDlgItem(IDC_PASSWORD)->ModifyStyle(NULL, ES_PASSWORD); 
			((CEdit *)GetDlgItem(IDC_PASSWORD))->SetPasswordChar('*'); 
		} 
		else 
		{ 
			GetDlgItem(IDC_PASSWORD)->ModifyStyle(ES_PASSWORD, NULL); 
			((CEdit *)GetDlgItem(IDC_PASSWORD))->SetPasswordChar(0); 
		} 
		m_strName = m_SitesArray[nItem].m_strName; 
		m_wndInfobarCtrl.SetText(m_strName); 
		m_strPassword = m_SitesArray[nItem].m_strPassword; 
		m_strRemotePath = m_SitesArray[nItem].m_strRemotePath; 
		UpdateData(FALSE); 
		UpdateDialogControls(this, FALSE);	 
		AfxGetApp()->WriteProfileInt("Settings", "LastSelectedSite", nIndex); 
	} 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : ValidateData										*/ 
/* Description   : Validate the data that has been entered.			*/ 
/*																	*/ 
/********************************************************************/ 
BOOL CConnectDlg::ValidateData() 
{ 
	UpdateData(); 
 
	if (m_strName.IsEmpty()) 
	{ 
		GetDlgItem(IDC_NAME)->SetFocus(); 
		return FALSE; 
	} 
	return TRUE; 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnBrowse											*/ 
/* Description   : Browse for local folder							*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnBrowse()  
{ 
	CString strDir = BrowseForFolder(m_hWnd, "Select a directory:", BIF_RETURNONLYFSDIRS); 
	if (!strDir.IsEmpty()) 
	{ 
		GetDlgItem(IDC_LOCALPATH)->SetWindowText(strDir); 
	} 
} 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnSomethingChanged								*/ 
/* Description   : Something has changed...							*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnSomethingChanged()  
{ 
	m_bModified = TRUE;	 
	UpdateDialogControls(this, FALSE);	 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnDblclkSites									*/ 
/* Description   : Item in the list has been double-clicked.		*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnDblclkSites()  
{ 
	OnOK(); 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnAnonymous										*/ 
/* Description   : Item in the list has been double-clicked.		*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnAnonymous()  
{ 
	UpdateData(); 
	if (m_bAnonymous) 
	{ 
		m_strLogin = "anonymous"; 
		m_strPassword = AfxGetApp()->GetProfileString("Settings", "EmailAddress", ""); 
		GetDlgItem(IDC_PASSWORD)->ModifyStyle(ES_PASSWORD, NULL); 
		((CEdit *)GetDlgItem(IDC_PASSWORD))->SetPasswordChar(0); 
		((CEdit *)GetDlgItem(IDC_PASSWORD))->Invalidate(); 
		((CEdit *)GetDlgItem(IDC_PASSWORD))->UpdateWindow(); 
	} 
	else 
	{ 
		// get old value 
		int nIndex = m_listSites.GetCurSel(); 
		if (nIndex != LB_ERR) 
		{ 
			int nItem = m_listSites.GetItemData(nIndex); 
			m_strLogin = m_SitesArray[nItem].m_strLogin; 
			m_strPassword = m_SitesArray[nItem].m_strPassword; 
			GetDlgItem(IDC_PASSWORD)->ModifyStyle(NULL, ES_PASSWORD); 
			((CEdit *)GetDlgItem(IDC_PASSWORD))->SetPasswordChar('*'); 
			((CEdit *)GetDlgItem(IDC_PASSWORD))->Invalidate(); 
			((CEdit *)GetDlgItem(IDC_PASSWORD))->UpdateWindow(); 
		} 
	} 
	UpdateData(FALSE); 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnChangeName										*/ 
/* Description   : Profile name has been changed.					*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnChangeName()  
{ 
	OnSomethingChanged(); 
	 
	CString strName; 
	GetDlgItemText(IDC_NAME, strName); 
	m_wndInfobarCtrl.SetText(strName); 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : AddSite											*/ 
/* Description   : Add site without launching the dialog.			*/ 
/*																	*/ 
/********************************************************************/ 
BOOL CConnectDlg::AddSite(CFtpSite &pFtpSite) 
{ 
	Serialize(FALSE); 
 
	int nItem = -1; 
 
	for (int i=0; i < m_SitesArray.GetSize(); i++) 
	{ 
		if (m_SitesArray[i].m_strName.CompareNoCase(pFtpSite.m_strName) == 0) 
		{ 
			nItem = i; 
			// update old settings 
			m_SitesArray[nItem].m_bUsePASVMode = pFtpSite.m_bUsePASVMode; 
			m_SitesArray[nItem].m_nRetries = pFtpSite.m_nRetries; 
			m_SitesArray[nItem].m_nPort = pFtpSite.m_nPort; 
			m_SitesArray[nItem].m_nRetryDelay = pFtpSite.m_nRetryDelay; 
			m_SitesArray[nItem].m_strAddress = pFtpSite.m_strAddress; 
			m_SitesArray[nItem].m_strDescription = pFtpSite.m_strDescription; 
			m_SitesArray[nItem].m_strLocalPath = pFtpSite.m_strLocalPath; 
			m_SitesArray[nItem].m_strLogin = pFtpSite.m_strLogin; 
			m_SitesArray[nItem].m_strName = pFtpSite.m_strName; 
			m_SitesArray[nItem].m_strPassword = pFtpSite.m_strPassword; 
			m_SitesArray[nItem].m_strRemotePath = pFtpSite.m_strRemotePath; 
			break; 
		} 
	} 
 
	if (nItem == -1) 
	{ 
		nItem = m_SitesArray.Add(pFtpSite); 
	} 
	 
	Serialize(TRUE); 
 
	return TRUE; 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnWizard											*/ 
/* Description   : Show wizard to add new site.						*/ 
/*																	*/ 
/********************************************************************/ 
void CConnectDlg::OnWizard()  
{ 
	CBitmap bmpHeader, bmpWatermark; 
 
	VERIFY(bmpHeader.LoadBitmap(IDB_BANNER)); 
	VERIFY(bmpWatermark.LoadBitmap(IDB_WATERMARK)); 
	 
	// show windows 2000-like wizard 
	CWizardSheet wizSheet("Connection Wizard", this, 0, bmpWatermark, NULL, bmpHeader); 
	wizSheet.m_psh.hInstance = ::GetModuleHandle(NULL); 
	if (wizSheet.DoModal() == ID_WIZFINISH) 
	{ 
		CFtpSite ftpSite; 
 
		int nIndex = m_listSites.AddString(wizSheet.m_Page1.m_strProfileName); 
		int nItem = m_SitesArray.Add(ftpSite); 
		 
		m_listSites.SetItemData(nIndex, nItem); 
		m_listSites.SetCurSel(nIndex);	 
 
		m_SitesArray[nItem].m_bUsePASVMode = AfxGetApp()->GetProfileInt("Settings", "DefaultUsePASVMode", 0);; 
		m_SitesArray[nItem].m_nRetries = AfxGetApp()->GetProfileInt("Settings", "DefaultRetries", 3); 
		m_SitesArray[nItem].m_nPort = 21; 
		m_SitesArray[nItem].m_nRetryDelay = AfxGetApp()->GetProfileInt("Settings", "DefaultRetryDelay", 10); 
		m_SitesArray[nItem].m_strAddress = wizSheet.m_Page2.m_strHostAddress; 
		m_SitesArray[nItem].m_strDescription = ""; 
		m_SitesArray[nItem].m_strLocalPath = wizSheet.m_Page4.m_strLocalFolder; 
		m_SitesArray[nItem].m_strLogin = wizSheet.m_Page3.m_strUserName; 
		m_SitesArray[nItem].m_strName = wizSheet.m_Page1.m_strProfileName; 
		m_SitesArray[nItem].m_strPassword = wizSheet.m_Page3.m_strPassword; 
		m_SitesArray[nItem].m_strRemotePath = ""; 
		 
		Serialize(TRUE); 
 
		// select new site 
		m_listSites.SetCurSel(nIndex); 
		OnSelchangeSites(); 
 
		// connect to the site 
		if (wizSheet.m_PageFinish.m_bConnectNow) 
		{ 
			OnOK(); 
		} 
	}	 
} 
 
void CConnectDlg::OnChangeLogin()  
{ 
	m_bModified = TRUE;	 
	UpdateDialogControls(this, FALSE);	 
	 
	CString strText; 
 
	GetDlgItemText(IDC_LOGIN, strText); 
 
	if (strText.CompareNoCase("anonymous") != 0) 
	{ 
		GetDlgItem(IDC_PASSWORD)->ModifyStyle(NULL, ES_PASSWORD); 
		((CEdit *)GetDlgItem(IDC_PASSWORD))->SetPasswordChar('*'); 
		((CEdit *)GetDlgItem(IDC_PASSWORD))->Invalidate(); 
		((CEdit *)GetDlgItem(IDC_PASSWORD))->UpdateWindow(); 
		CheckDlgButton(IDC_ANONYMOUS, BST_UNCHECKED); 
	} 
}