|
|
//-----------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: P V C D L G . C P P
//
// Contents: PVC main dialog message handler implementation
//
// Notes:
//
// Author: tongl 23 Feb, 1998
//
//-----------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "auniobj.h"
#include "atmutil.h"
#include "aunidlg.h"
#include "atmcommon.h"
#include "pvcdata.h"
#include "ncatlui.h"
#include "ncstl.h"
#include "ncui.h"
#include "atmhelp.h"
CPVCMainDialog::CPVCMainDialog( CUniPage * pUniPage, CPvcInfo * pPvcInfo, const DWORD* adwHelpIDs) { Assert(pUniPage); Assert(pPvcInfo);
m_pParentDlg = pUniPage; m_pPvcInfo = pPvcInfo; m_adwHelpIDs = adwHelpIDs;
m_fDialogModified = FALSE;
m_fPropShtOk = FALSE; m_fPropShtModified = FALSE;
m_pQosPage = NULL; m_pLocalPage = NULL; m_pDestPage = NULL; }
CPVCMainDialog::~CPVCMainDialog() { if (m_pQosPage != NULL) { delete (m_pQosPage); }
if (m_pLocalPage != NULL) { delete (m_pLocalPage); }
if (m_pDestPage != NULL) { delete (m_pDestPage); } }
LRESULT CPVCMainDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { m_CurType = m_pPvcInfo->m_dwPVCType;
InitInfo(); SetInfo(); return 0; }
LRESULT CPVCMainDialog::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; }
LRESULT CPVCMainDialog::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam); Assert(lphi);
if (HELPINFO_WINDOW == lphi->iContextType) { ShowContextHelp(static_cast<HWND>(lphi->hItemHandle), HELP_WM_HELP, m_adwHelpIDs); }
return 0; }
LRESULT CPVCMainDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { // load the info from the controls to memory structure
UpdateInfo();
// make sure vpi, vci are in their range
if (m_pPvcInfo->m_dwVpi > MAX_VPI) { // we pop up a message box and set focus to the vpi edit box
NcMsgBox(m_hWnd, IDS_MSFT_UNI_TEXT, IDS_INVALID_VPI, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
::SetFocus(GetDlgItem(IDC_EDT_PVC_VPI)); return 0; }
if ((m_pPvcInfo->m_dwVci<MIN_VCI) || (m_pPvcInfo->m_dwVci>MAX_VCI)) { // we pop up a message box and set focus to the vpi edit box
NcMsgBox(m_hWnd, IDS_MSFT_UNI_TEXT, IDS_INVALID_VCI, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
::SetFocus(GetDlgItem(IDC_EDT_PVC_VCI)); return 0; }
// make sure calling and called atm addresses are correct in format
int i, nId;
if (m_pPvcInfo->m_strCallingAddr != c_szEmpty) { if (!FIsValidAtmAddress((PWSTR)m_pPvcInfo->m_strCallingAddr.c_str(), &i, &nId)) { // we pop up a message box and set focus to the calling address edit box
NcMsgBox(m_hWnd, IDS_MSFT_UNI_TEXT, IDS_INVALID_Calling_Address, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
::SetFocus(GetDlgItem(IDC_EDT_PVC_AnswerAddr)); return 0; } }
if (m_pPvcInfo->m_strCalledAddr != c_szEmpty) { if (!FIsValidAtmAddress((PWSTR)m_pPvcInfo->m_strCalledAddr.c_str(), &i, &nId)) { // we pop up a message box and set focus to the calling address edit box
NcMsgBox(m_hWnd, IDS_MSFT_UNI_TEXT, IDS_INVALID_Called_Address, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
::SetFocus(GetDlgItem(IDC_EDT_PVC_CallAddr)); return 0; } }
// set the modified bit
if (!m_fDialogModified) { if ((m_pPvcInfo->m_dwVpi != m_pPvcInfo->m_dwOldVpi) || (m_pPvcInfo->m_dwVci != m_pPvcInfo->m_dwOldVci) || (m_pPvcInfo->m_dwAAL != m_pPvcInfo->m_dwOldAAL) || (m_pPvcInfo->m_strCallingAddr != m_pPvcInfo->m_strCallingAddr) || (m_pPvcInfo->m_strCalledAddr != m_pPvcInfo->m_strOldCalledAddr) ) { m_fDialogModified = TRUE; } }
EndDialog(IDOK); return 0; }
LRESULT CPVCMainDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { EndDialog(IDCANCEL); return 0; }
LRESULT CPVCMainDialog::OnType(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { // $REVIEW(tongl 2/27/98): confirmed this behaviour with ArvindM
// When type changes, we reset all the type related defaults
// to match the new type ...
// get the new selection
int idx = (int)SendDlgItemMessage(IDC_CMB_PVC_Type, CB_GETCURSEL, (LPARAM)(0), 0); if (idx != CB_ERR) { if (idx != m_CurType-1) // type has changed
{ UpdateInfo(); m_CurType = (PVCType)(idx+1); m_pPvcInfo->SetTypeDefaults(m_CurType);
// update the UI
SetInfo(); } } return 0; }
LRESULT CPVCMainDialog::OnSpecifyCallAddr(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { if (IsDlgButtonChecked(IDC_CHK_PVC_CallAddr)) { // enable the calling address control
::EnableWindow(GetDlgItem(IDC_EDT_PVC_CallAddr), TRUE); } else { // disable the control
::EnableWindow(GetDlgItem(IDC_EDT_PVC_CallAddr), FALSE); }
return 0; }
LRESULT CPVCMainDialog::OnSpecifyAnswerAddr(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { if (IsDlgButtonChecked(IDC_CHK_PVC_AnswerAddr)) { // enable the calling address control
::EnableWindow(GetDlgItem(IDC_EDT_PVC_AnswerAddr), TRUE); } else { // disable the control
::EnableWindow(GetDlgItem(IDC_EDT_PVC_AnswerAddr), FALSE); }
return 0; }
LRESULT CPVCMainDialog::OnAdvanced(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch (wNotifyCode) { case BN_CLICKED: case BN_DOUBLECLICKED:
// Make a copy of the current PVC info and pass to the
// advanced property sheet pages
// get what's in the main UI to in memory structure
UpdateInfo();
CPvcInfo * pPvcInfoDlg = new CPvcInfo(m_pPvcInfo->m_strPvcId.c_str());
if (pPvcInfoDlg) { *pPvcInfoDlg = *m_pPvcInfo;
// Bring up the advanced PVC property sheet
HRESULT hr = HrDoPvcPropertySheet(pPvcInfoDlg); if (S_OK == hr) { if (m_fPropShtOk && m_fPropShtModified) { // Something changed, so mark the page as modified
m_fDialogModified = TRUE;
// Reset values
m_fPropShtOk = FALSE; m_fPropShtModified = FALSE;
// Update second memory info structure
*m_pPvcInfo = *pPvcInfoDlg; } }
delete pPvcInfoDlg; } break; }
return 0; }
HRESULT CPVCMainDialog::HrDoPvcPropertySheet(CPvcInfo * pPvcInfoDlg) { Assert(pPvcInfoDlg); HRESULT hr = S_OK;
HPROPSHEETPAGE *ahpsp = NULL; int cPages = 0;
// Create property pages
hr = HrSetupPropPages(pPvcInfoDlg, &ahpsp, &cPages); if (SUCCEEDED(hr)) { // Show the property sheet
PROPSHEETHEADER psh = {0};
psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_NOAPPLYNOW; psh.hwndParent = ::GetActiveWindow(); psh.hInstance = _Module.GetModuleInstance(); psh.pszIcon = NULL; psh.pszCaption = (PWSTR)SzLoadIds(IDS_ADV_PVC_HEADER); psh.nPages = cPages; psh.phpage = ahpsp;
INT_PTR iRet = PropertySheet(&psh); if (-1 == iRet) { hr = HrFromLastWin32Error(); }
CoTaskMemFree(ahpsp); }
TraceError("CPVCMainDialog::DoPropertySheet", hr); return hr; }
HRESULT CPVCMainDialog::HrSetupPropPages( CPvcInfo * pPvcInfoDlg, HPROPSHEETPAGE ** pahpsp, INT * pcPages) { HRESULT hr = S_OK;
*pahpsp = NULL; *pcPages = 0;
int cPages = 0; HPROPSHEETPAGE *ahpsp = NULL;
delete (m_pQosPage); m_pQosPage = NULL;
delete (m_pLocalPage); m_pLocalPage = NULL;
delete (m_pDestPage); m_pDestPage = NULL;
// Set up the property pages
m_pQosPage = new CPvcQosPage(this, pPvcInfoDlg, g_aHelpIDs_IDD_PVC_Traffic); if (!m_pQosPage) { return E_OUTOFMEMORY; }
cPages = 1;
if (m_pPvcInfo->m_dwPVCType == PVC_CUSTOM) { m_pLocalPage = new CPvcLocalPage(this, pPvcInfoDlg, g_aHelpIDs_IDD_PVC_Local); if (!m_pLocalPage) { return E_OUTOFMEMORY; }
m_pDestPage = new CPvcDestPage(this, pPvcInfoDlg, g_aHelpIDs_IDD_PVC_Dest); if (!m_pDestPage) { return E_OUTOFMEMORY; }
cPages = 3; }
// Allocate a buffer large enough to hold the handles to all of our
// property pages.
ahpsp = (HPROPSHEETPAGE *)CoTaskMemAlloc(sizeof(HPROPSHEETPAGE)* cPages); if (!ahpsp) { return E_OUTOFMEMORY; }
cPages =0;
ahpsp[cPages++] = m_pQosPage->CreatePage(IDD_PVC_Traffic, 0);
if (m_pPvcInfo->m_dwPVCType == PVC_CUSTOM) { ahpsp[cPages++] = m_pLocalPage->CreatePage(IDD_PVC_Local, 0); ahpsp[cPages++] = m_pDestPage->CreatePage(IDD_PVC_Dest, 0); }
*pahpsp = ahpsp; *pcPages = cPages;
return hr; }
void CPVCMainDialog::InitInfo() { // set limits & selections to the controls
// PVC name
::SendMessage(GetDlgItem(IDC_EDT_PVC_Name), EM_SETLIMITTEXT, MAX_PATH, 0);
// VPI
// length limit
::SendMessage(GetDlgItem(IDC_EDT_PVC_VPI), EM_SETLIMITTEXT, MAX_VPI_LENGTH, 0);
// VCI
// length limit
::SendMessage(GetDlgItem(IDC_EDT_PVC_VCI), EM_SETLIMITTEXT, MAX_VCI_LENGTH, 0);
// AAL TYpe
// $REVIEW(tongl 2/24/98): per ArvindM, only AAL5 is supported in NT5
SendDlgItemMessage(IDC_CMB_PVC_AAL, CB_ADDSTRING, 0, (LPARAM)((PWSTR) SzLoadIds(IDS_PVC_AAL5)));
// PVC_TYPE
SendDlgItemMessage(IDC_CMB_PVC_Type, CB_ADDSTRING, 0, (LPARAM)((PWSTR) SzLoadIds(IDS_PVC_ATMARP)));
SendDlgItemMessage(IDC_CMB_PVC_Type, CB_ADDSTRING, 0, (LPARAM)((PWSTR) SzLoadIds(IDS_PVC_PPP_ATM_CLIENT)));
SendDlgItemMessage(IDC_CMB_PVC_Type, CB_ADDSTRING, 0, (LPARAM)((PWSTR) SzLoadIds(IDS_PVC_PPP_ATM_SERVER)));
SendDlgItemMessage(IDC_CMB_PVC_Type, CB_ADDSTRING, 0, (LPARAM)((PWSTR) SzLoadIds(IDS_PVC_CUSTOM))); }
void CPVCMainDialog::SetInfo() { // Name
SetDlgItemText(IDC_EDT_PVC_Name, m_pPvcInfo->m_strName.c_str());
// VPI
WCHAR szVpi[MAX_VPI_LENGTH+1]; wsprintfW(szVpi, c_szItoa, m_pPvcInfo->m_dwVpi); SetDlgItemText(IDC_EDT_PVC_VPI, szVpi);
// VCI
if (FIELD_UNSET != m_pPvcInfo->m_dwVci) { WCHAR szVci[MAX_VCI_LENGTH+1]; wsprintfW(szVci, c_szItoa, m_pPvcInfo->m_dwVci); SetDlgItemText(IDC_EDT_PVC_VCI, szVci); }
// AAL TYpe
SendDlgItemMessage(IDC_CMB_PVC_AAL, CB_SETCURSEL, (LPARAM)(0), 0);
// PVC_TYPE
SendDlgItemMessage(IDC_CMB_PVC_Type, CB_SETCURSEL, (LPARAM)(m_pPvcInfo->m_dwPVCType-1), 0);
// calling addresses
BOOL fAddrSpecified = (m_pPvcInfo->m_strCalledAddr != c_szEmpty);
::EnableWindow(GetDlgItem(IDC_CHK_PVC_CallAddr), TRUE); CheckDlgButton(IDC_CHK_PVC_CallAddr, fAddrSpecified);
::EnableWindow(GetDlgItem(IDC_EDT_PVC_CallAddr), fAddrSpecified);
if (fAddrSpecified) { SetDlgItemText(IDC_EDT_PVC_CallAddr, m_pPvcInfo->m_strCalledAddr.c_str()); }
// answering address
fAddrSpecified = (m_pPvcInfo->m_strCallingAddr != c_szEmpty);
::EnableWindow(GetDlgItem(IDC_CHK_PVC_AnswerAddr), TRUE); CheckDlgButton(IDC_CHK_PVC_AnswerAddr, fAddrSpecified);
::EnableWindow(GetDlgItem(IDC_EDT_PVC_AnswerAddr), fAddrSpecified);
if (fAddrSpecified) { SetDlgItemText(IDC_EDT_PVC_AnswerAddr, m_pPvcInfo->m_strCallingAddr.c_str()); }
// disable the calling address\answer address controls if the type is ATMARP
// Bug #179335
if (m_pPvcInfo->m_dwPVCType == PVC_ATMARP) { // disable all controls on this doalog
static const int nrgIdc[] = {IDC_CHK_PVC_CallAddr, IDC_EDT_PVC_CallAddr, IDC_CHK_PVC_AnswerAddr, IDC_EDT_PVC_AnswerAddr};
EnableOrDisableDialogControls(m_hWnd, celems(nrgIdc), nrgIdc, FALSE); } }
// Update the in memory structure with what's in the dialog
void CPVCMainDialog::UpdateInfo() { WCHAR szBuf[MAX_PATH];
// Name
GetDlgItemText(IDC_EDT_PVC_Name, szBuf, MAX_PATH); m_pPvcInfo->m_strName = szBuf;
// VPI
GetDlgItemText(IDC_EDT_PVC_VPI, szBuf, MAX_VPI_LENGTH+1); m_pPvcInfo->m_dwVpi = _wtoi(szBuf);
// VCI
GetDlgItemText(IDC_EDT_PVC_VCI, szBuf, MAX_VCI_LENGTH+1); if (*szBuf ==0) // empty string
{ m_pPvcInfo->m_dwVci = FIELD_UNSET; } else { m_pPvcInfo->m_dwVci = _wtoi(szBuf); }
// current selection
int idx = (int)SendDlgItemMessage(IDC_CMB_PVC_Type, CB_GETCURSEL, (LPARAM)(0), 0); if (idx != CB_ERR) { m_pPvcInfo->m_dwPVCType = (PVCType)(idx+1); }
// calling addresses
if (!IsDlgButtonChecked(IDC_CHK_PVC_CallAddr)) { m_pPvcInfo->m_strCalledAddr = c_szEmpty; } else { GetDlgItemText(IDC_EDT_PVC_CallAddr, szBuf, MAX_ATM_ADDRESS_LENGTH+1); m_pPvcInfo->m_strCalledAddr = szBuf; }
// answering address
if (!IsDlgButtonChecked(IDC_CHK_PVC_AnswerAddr)) { m_pPvcInfo->m_strCallingAddr = c_szEmpty; } else { GetDlgItemText(IDC_EDT_PVC_AnswerAddr, szBuf, MAX_ATM_ADDRESS_LENGTH+1); m_pPvcInfo->m_strCallingAddr = szBuf; } }
|