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

📄 tcpconnectpage.cpp

📁 VC网络程序设计实例导航配套代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
	TcpConnectPage.cpp
	Luca Piergentili, 14/07/99
	lpiergentili@yahoo.com
	http://www.geocities.com/lpiergentili/
*/
#include "env.h"
#include "pragma.h"
#include "strcpyn.h"
#include <limits.h>
#include "window.h"
#include "CAsyncSock.h"
#include "CPropertyPageDialog.h"
#include "TcpScanVersion.h"
#include "TcpScanConfig.h"
#include "TcpConnectPage.h"
#include "TcpMessages.h"
#include "resource.h"

//static void AFXAPI DDV_ValidateIP(CDataExchange*,int,CString&);
//static void AFXAPI DDV_ValidatePortNumber(CDataExchange*,int,unsigned int&);

IMPLEMENT_DYNCREATE(CConnectPage,CPropertyPageDialog)

BEGIN_MESSAGE_MAP(CConnectPage,CPropertyPageDialog)
	ON_CBN_KILLFOCUS(IDC_COMBO_HOST,OnKillFocusComboHost)
	ON_CBN_KILLFOCUS(IDC_COMBO_PORT,OnKillFocusComboPort)
	ON_MESSAGE(WM_ASYNCCONNECT,OnConnect)
	ON_MESSAGE(WM_ASYNCREAD,OnRead)
	ON_MESSAGE(WM_ASYNCWRITE,OnWrite)
	ON_MESSAGE(WM_ASYNCCLOSE,OnClose)
END_MESSAGE_MAP()

/*
	DoDataExchange()
*/
void CConnectPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);

	DDX_Control(pDX,IDC_COMBO_HOST,m_wndComboHost);
	DDX_Control(pDX,IDC_COMBO_PORT,m_wndComboPort);
	DDX_Text(pDX,IDC_EDIT_SEND,m_strHostSend);
	DDX_Text(pDX,IDC_EDIT_RECV,m_strHostRecv);

	// effettua i controlli solo se deve effettivamente validare i dati
	// (click su IDOK/IDCANCEL e non il semplice spostamento da una pagina all'altra)
	if(pDX->m_bSaveAndValidate && !KillPage())
	{
		;
	}
}

/*
	CConnectPage()
*/
CConnectPage::CConnectPage() : CPropertyPageDialog(IDD_PAGE_CONNECT)
{
	m_pConnectButtonText = "&Connect";
	m_pSendButtonText    = "&Send";
	m_pCancelButtonText  = "&Cancel";
	SetPropertyPageOkButton(m_pConnectButtonText);

	m_nMaxHostAddr       = 0;
	m_nMaxPortNumber     = 0;
	m_pConfig            = NULL;
	m_pAsyncSocket       = new CAsyncSock(this);

	m_strConnectHostAddr = DEFAULT_HOST;
	m_nConnectHostPort   = 0;
	m_strHostSend        = "";
	m_strHostRecv        = "";
}

/*
	~CConnectPage()
*/
CConnectPage::~CConnectPage()
{
	if(m_pAsyncSocket)
		delete m_pAsyncSocket,m_pAsyncSocket = NULL;
}

/*
	OnInitDialog()

	Inizializzazione del dialogo.
	Rimappa la funzione base per impostare l'host e la porta (in base al meccanismo di controllo 
	effettuato tramite UpdateData(), DDX, DDV e OnKillPage() deve impostare i valori a mano).
*/
BOOL CConnectPage::OnInitDialog(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnInitDialog();

	// numero max di host per il combo
	m_nMaxHostAddr = m_pConfig->GetNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_MAX_HOSTENTRY_KEY);

	// carica il nome dell'host presente nella configurazione (se non e' stato specificato nessun nome imposta su quello di default)
	char* pHost = (char*)m_pConfig->GetString(TCPSCAN_CONNECT_KEY,TCPSCAN_HOST_KEY);
	if(strcmp(pHost,"")==0)
		pHost = LOCAL_HOST;

	m_strConnectHostAddr.Format("%s",pHost);

	// imposta il testo del combo per l'host, aggiungendolo come primo elemento
	m_wndComboHost.SetWindowText(m_strConnectHostAddr);
	UpdateData(FALSE);
	m_wndComboHost.AddString(m_strConnectHostAddr);

	// inserisce nel combo gli eventuali host presenti
	char* p;
	char szKey[REGKEY_MAX_KEY_NAME+1];
	for(int i = 0; i < m_nMaxHostAddr; i++)
	{
		_snprintf(szKey,sizeof(szKey)-1,"%s%d",TCPSCAN_HOSTADDR_KEY,i);
		if(strcmp((p = (char*)m_pConfig->GetString(TCPSCAN_CONNECT_KEY,szKey)),"")!=0)
		{
			if(m_wndComboHost.FindStringExact(-1,p)==CB_ERR)
				m_wndComboHost.AddString(p);
		}
		else
			break;
	}
	m_wndComboHost.SetCurSel(0);

	// numero max di porte per il combo
	m_nMaxPortNumber = m_pConfig->GetNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_MAX_PORTENTRY_KEY);

	// carica il numero della porta presente nella configurazione (se non e' stato specificato nessun nome imposta su quello di default)
	UINT nPortNumber = m_pConfig->GetNumber(TCPSCAN_CONNECT_KEY,TCPSCAN_PORT_KEY);
	if(nPortNumber==(UINT)-1)
		nPortNumber = 0;
	m_nConnectHostPort = nPortNumber;

	// imposta il testo del combo per la porta, aggiungendola come primo elemento
	char szPort[10];
	_snprintf(szPort,sizeof(szPort)-1,"%u",m_nConnectHostPort);
	m_wndComboPort.SetWindowText(szPort);
	UpdateData(FALSE);
	m_wndComboPort.AddString(szPort);

	// inserisce nel combo le eventuali porte presenti
	for(i = 0; i < m_nMaxPortNumber; i++)
	{
		_snprintf(szKey,sizeof(szKey)-1,"%s%d",TCPSCAN_PORTNUMBER_KEY,i);
		if((nPortNumber = m_pConfig->GetNumber(TCPSCAN_CONNECT_KEY,szKey))!=(UINT)-1)
		{
			_snprintf(szPort,sizeof(szPort)-1,"%u",nPortNumber);
			if(m_wndComboPort.FindStringExact(-1,szPort)==CB_ERR)
				m_wndComboPort.AddString(szPort);
		}
		else
			break;
	}
	m_wndComboPort.SetCurSel(0);

	// imposta il default per il campo numerico (per i campi stringa non serve)
	// (non puo' chiamare UpdateData() ma deve impostare a mano, vedi sopra)
	CWnd* pCWnd;
	if((pCWnd = GetDlgItem(IDC_EDIT_HOSTPORT))!=NULL)
		pCWnd->SetWindowText("0");
	
	return(FALSE);
}

/*
	OnSetActive()

	Attivazione della pagina.
	Rimappa la funzione base per cambiare il testo del bottone IDOK dello sheet.
*/
BOOL CConnectPage::OnSetActive(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnSetActive();
	
	// modifica il testo del bottone IDOK dello sheet
	SetPropertySheetOkButton(GetPropertyPageOkButton());

	if(LookForBusyPages(IDD_PAGE_CONNECT))
		DisablePropertySheetOkButton();

	if(LookForPageBusy(IDD_PAGE_CONNECT))
		EnablePropertySheetOkButton();

	return(TRUE);
}

/*
	OnKillActive()

	Disattivazione della pagina.
*/
BOOL CConnectPage::OnKillActive(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnKillActive();

	return(TRUE);
}

/*
	OnKillSheet()

	Chiusura del dialogo.
*/
void CConnectPage::OnKillSheet(void)
{
	::SendMessage(this->m_hWnd,WM_ASYNCCONNECT,WM_CLOSE,WM_CLOSE);

	if(IsWindow(this->m_hWnd))
	{
		// la configurazione viene salvata nelle OnKillFocus...()
		;
	}
}

/*
	OnOk()
*/
void CConnectPage::OnOk(void)
{
	EnterPageBusyState(IDD_PAGE_CONNECT);

	int nWSAError = 0;
	static char szWSAString[128];
	strcpy(szWSAString,"0");
	::PostMessage(this->m_hWnd,WM_ASYNCCONNECT,nWSAError,MAKELPARAM(LOWORD(szWSAString),HIWORD(szWSAString)));
}

/*
	OnCancel()
*/
void CConnectPage::OnCancel(void)
{
	::PostMessage(this->m_hWnd,WM_ASYNCCONNECT,WM_CANCEL,WM_CANCEL);

	LeavePageBusyState(IDD_PAGE_CONNECT);
}

/*
	OnKillFocusComboHost()

	Aggiorna il valore utilizzato come host per la connessione e la configurazione.
*/
void CConnectPage::OnKillFocusComboHost(void)
{
	// ricava il testo del combo aggiornando di conseguenza il nome dell'host e la configurazione
	char szComboEntry[HOSTNAME_SIZE+1];
	m_wndComboHost.GetWindowText(szComboEntry,sizeof(szComboEntry));

	// controlla se e' stato cambiato il testo del combo
	if(strcmp(szComboEntry,LPCSTR(m_strConnectHostAddr))!=0)
	{
		// aggiorna il nome dell'host di default
		m_strConnectHostAddr.Format("%s",szComboEntry);

		// aggiorna il nome dell'host di default nella configurazione
		m_pConfig->UpdateString(TCPSCAN_CONNECT_KEY,TCPSCAN_HOST_KEY,szComboEntry);

		// cerca il testo del combo nella configurazione, se non lo trova deve inserirlo nel
		// nel combo e nella configurazione
		char* p;
		char szKey[REGKEY_MAX_KEY_NAME+1];
		BOOL bFound = FALSE;

		for(int i = 0; i < m_nMaxHostAddr; i++)
		{
			_snprintf(szKey,sizeof(szKey)-1,"%s%d",TCPSCAN_HOSTADDR_KEY,i);
			if(strcmp((p = (char*)m_pConfig->GetString(TCPSCAN_CONNECT_KEY,szKey)),"")!=0)
			{
				if(strcmp(szComboEntry,p)==0)
				{
					bFound = TRUE;
					break;
				}
			}
			else
				break;
		}

		// non trovato, lo inserisce nel combo se gia' non esiste
		if(!bFound)
		{
			if(i==m_nMaxHostAddr)
				m_wndComboHost.DeleteString(0);

			if(m_wndComboHost.FindStringExact(-1,szComboEntry)==CB_ERR)
				m_wndComboHost.AddString(szComboEntry);
		}

		// aggiorna le entrate della configurazione con quanto presente nel combo (elimina e reinserisce)
		for(i = 0; i < m_nMaxHostAddr; i++)
		{
			_snprintf(szKey,sizeof(szKey)-1,"%s%d",TCPSCAN_HOSTADDR_KEY,i);
			if(strcmp(m_pConfig->GetString(TCPSCAN_CONNECT_KEY,szKey),"")!=0)
				m_pConfig->Delete(TCPSCAN_CONNECT_KEY,szKey);
		}
		m_pConfig->Save();

		for(i = 0; i < m_nMaxHostAddr; i++)
		{
			if(m_wndComboHost.GetLBText(i,szComboEntry)!=CB_ERR)
			{
				_snprintf(szKey,sizeof(szKey)-1,"%s%d",TCPSCAN_HOSTADDR_KEY,i);
				m_pConfig->Insert(TCPSCAN_CONNECT_KEY,szKey,szComboEntry);
			}
		}
		m_pConfig->Save();
	}
}

/*
	OnKillFocusComboPort()

⌨️ 快捷键说明

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