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