//----------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: A D V D L G . C P P // // Contents: PVC advanced property pages message handler implementation // // Notes: // // Author: tongl 1 Mar, 1998 // //----------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "auniobj.h" #include "atmutil.h" #include "aunidlg.h" //#include "atmcommon.h" #include "ncatlui.h" #include "ncstl.h" #include "ncui.h" const int MAX_FIELD_LENGTH = 3; const DWORD c_dwUserSpecProtocol = 16; const WCHAR c_szUserSpecProtocol[] = L"16"; const DWORD c_dwUserSpecHighLayer = 1; const WCHAR c_szUserSpecHighLayer[] = L"1"; const DWORD c_dwFieldHigh = 255; const DWORD c_dwFieldLow = 0; enum Location { LOCAL, DEST }; void InitBroadbandInfo(HWND hDlg); void SetBroadbandInfo(HWND hDlg, CPvcInfo * pPvcInfo, Location location); void SetProtocolInfo(HWND hDlg, int nIDDlgItemCombo, int nIDDlgItemEdit, DWORD dwProtocol, DWORD dwUserSpecValue); void SetHighLayerInfo(HWND hDlg, DWORD dwHighLayerInfoType, tstring & strHighLayerInfo); void GetBroadbandInfo(HWND hDlg, CPvcInfo * pPvcInfo, Location location); void GetProtocolInfo(HWND hDlg, int nIDDlgItemCombo, int nIDDlgItemEdit, DWORD * pdwProtocol, DWORD * pdwUserSpecValue); void GetHighLayerInfo(HWND hDlg, DWORD * pdwHighLayerInfoType, tstring * pstrHighLayerInfo); void OnLayer2EdtChange(HWND hDlg); void OnLayer2SelChange(HWND hDlg); void OnLayer3EdtChange(HWND hDlg); void OnLayer3SelChange(HWND hDlg); void OnHighLayerEdtChange(HWND hDlg); void OnHighLayerSelChange(HWND hDlg); void GetNumFromString(PWSTR pszBuf, DWORD * dwNum); BOOL InvalidBroadbandInfo(HWND hDlg); BOOL IsValidCmbSelection(HWND hDlg, int nIDDlgItemCombo); BOOL IsValidDwordField(HWND hDlg, int nIDDlgItemEdit); BOOL IsValidBinaryField(HWND hDlg, int nIDDlgItemEdit, int nMaxBytes); // // CPvcLocalPage // // Constructors/Destructors CPvcLocalPage::CPvcLocalPage(CPVCMainDialog * pParentDlg, CPvcInfo * pPvcInfo, const DWORD * adwHelpIDs) { Assert(pPvcInfo); Assert(pParentDlg); m_pParentDlg = pParentDlg; m_pPvcInfo = pPvcInfo; m_adwHelpIDs = adwHelpIDs; } CPvcLocalPage::~CPvcLocalPage() { } // Command handlers LRESULT CPvcLocalPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Add strings to the combo boxes InitBroadbandInfo(m_hWnd); // Now set the value based on what's in our data structure SetBroadbandInfo(m_hWnd, m_pPvcInfo, LOCAL); return 0; } LRESULT CPvcLocalPage::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; } LRESULT CPvcLocalPage::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { LPHELPINFO lphi = reinterpret_cast(lParam); Assert(lphi); if (HELPINFO_WINDOW == lphi->iContextType) { ShowContextHelp(static_cast(lphi->hItemHandle), HELP_WM_HELP, m_adwHelpIDs); } return 0; } // notify handlers for the property page LRESULT CPvcLocalPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { m_pParentDlg->m_fPropShtOk = TRUE; GetBroadbandInfo(m_hWnd, m_pPvcInfo, LOCAL); // did any field change ? if ((m_pPvcInfo->m_dwLocalLayer2Protocol != m_pPvcInfo->m_dwOldLocalLayer2Protocol) || (m_pPvcInfo->m_dwLocalUserSpecLayer2 != m_pPvcInfo->m_dwOldLocalUserSpecLayer2) || (m_pPvcInfo->m_dwLocalLayer3Protocol != m_pPvcInfo->m_dwOldLocalLayer3Protocol) || (m_pPvcInfo->m_dwLocalUserSpecLayer3 != m_pPvcInfo->m_dwOldLocalUserSpecLayer3) || (m_pPvcInfo->m_dwLocalLayer3IPI != m_pPvcInfo->m_dwOldLocalLayer3IPI) || (m_pPvcInfo->m_strLocalSnapId != m_pPvcInfo->m_strOldLocalSnapId) || (m_pPvcInfo->m_dwLocalHighLayerInfoType != m_pPvcInfo->m_dwOldLocalHighLayerInfoType) || (m_pPvcInfo->m_strLocalHighLayerInfo != m_pPvcInfo->m_strOldLocalHighLayerInfo) ) { m_pParentDlg->m_fPropShtModified = TRUE; } return 0; } LRESULT CPvcLocalPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { // check that all values are valid BOOL err = InvalidBroadbandInfo(m_hWnd); ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, err); return err; } LRESULT CPvcLocalPage::OnActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; } LRESULT CPvcLocalPage::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; } LRESULT CPvcLocalPage::OnLayer2(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case CBN_EDITCHANGE: OnLayer2EdtChange(m_hWnd); break; case CBN_SELCHANGE: OnLayer2SelChange(m_hWnd); break; default: break; } return 0; } LRESULT CPvcLocalPage::OnLayer3(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case CBN_EDITCHANGE: OnLayer3EdtChange(m_hWnd); break; case CBN_SELCHANGE: OnLayer3SelChange(m_hWnd); break; default: break; } return 0; } LRESULT CPvcLocalPage::OnHighLayer(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case CBN_EDITCHANGE: OnHighLayerEdtChange(m_hWnd); break; case CBN_SELCHANGE: OnHighLayerSelChange(m_hWnd); break; default: break; } return 0; } // // CPvcDestPage // // Constructors/Destructors CPvcDestPage::CPvcDestPage(CPVCMainDialog * pParentDlg, CPvcInfo * pPvcInfo, const DWORD * adwHelpIDs) { Assert(pPvcInfo); Assert(pParentDlg); m_pParentDlg = pParentDlg; m_pPvcInfo = pPvcInfo; m_adwHelpIDs = adwHelpIDs; } CPvcDestPage::~CPvcDestPage() { } // Command handlers LRESULT CPvcDestPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Add strings to the combo boxes InitBroadbandInfo(m_hWnd); // Now set the value based on what's in our data structure SetBroadbandInfo(m_hWnd, m_pPvcInfo, DEST); return 0; } LRESULT CPvcDestPage::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; } LRESULT CPvcDestPage::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { LPHELPINFO lphi = reinterpret_cast(lParam); Assert(lphi); if (HELPINFO_WINDOW == lphi->iContextType) { ShowContextHelp(static_cast(lphi->hItemHandle), HELP_WM_HELP, m_adwHelpIDs); } return 0; } // notify handlers for the property page LRESULT CPvcDestPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { m_pParentDlg->m_fPropShtOk = TRUE; GetBroadbandInfo(m_hWnd, m_pPvcInfo, DEST); // did any field change ? if ((m_pPvcInfo->m_dwDestnLayer2Protocol != m_pPvcInfo->m_dwOldDestnLayer2Protocol) || (m_pPvcInfo->m_dwDestnUserSpecLayer2 != m_pPvcInfo->m_dwOldDestnUserSpecLayer2) || (m_pPvcInfo->m_dwDestnLayer3Protocol != m_pPvcInfo->m_dwOldDestnLayer3Protocol) || (m_pPvcInfo->m_dwDestnUserSpecLayer3 != m_pPvcInfo->m_dwOldDestnUserSpecLayer3) || (m_pPvcInfo->m_dwDestnLayer3IPI != m_pPvcInfo->m_dwOldDestnLayer3IPI) || (m_pPvcInfo->m_strDestnSnapId != m_pPvcInfo->m_strOldDestnSnapId) || (m_pPvcInfo->m_dwDestnHighLayerInfoType != m_pPvcInfo->m_dwOldDestnHighLayerInfoType) || (m_pPvcInfo->m_strDestnHighLayerInfo != m_pPvcInfo->m_strOldDestnHighLayerInfo) ) { m_pParentDlg->m_fPropShtModified = TRUE; } return 0; } LRESULT CPvcDestPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { // check that all values are valid BOOL err = InvalidBroadbandInfo(m_hWnd); ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, err); return err; } LRESULT CPvcDestPage::OnActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; } LRESULT CPvcDestPage::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; } // Control notification handlers LRESULT CPvcDestPage::OnLayer2(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case CBN_EDITCHANGE: OnLayer2EdtChange(m_hWnd); break; case CBN_SELCHANGE: OnLayer2SelChange(m_hWnd); break; default: break; } return 0; } LRESULT CPvcDestPage::OnLayer3(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case CBN_EDITCHANGE: OnLayer3EdtChange(m_hWnd); break; case CBN_SELCHANGE: OnLayer3SelChange(m_hWnd); break; default: break; } return 0; } LRESULT CPvcDestPage::OnHighLayer(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case CBN_EDITCHANGE: OnHighLayerEdtChange(m_hWnd); break; case CBN_SELCHANGE: OnHighLayerSelChange(m_hWnd); break; default: break; } return 0; } //+--------------------------------------------------------------------------- // // Member: AtmEditSubclassProc // // Purpose: Subclass proc for hex number edit controls. The // subclassing forces only correct input // // Author: [from scottbri 28-Apr-1997] // STDAPI AtmEditSubclassProc( HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam ) { WNDPROC pAtmEditProc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA); if ((wMsg == WM_CHAR) && !(((WCHAR)wParam >= L'0' && (WCHAR)wParam <= L'9') || ((WCHAR)wParam >= L'a' && (WCHAR)wParam <= L'f') || ((WCHAR)wParam >= L'A' && (WCHAR)wParam <= L'F') || ((WCHAR)wParam == VK_BACK))) { MessageBeep(MB_ICONEXCLAMATION); return 0L; } return CallWindowProc( pAtmEditProc, hwnd, wMsg, wParam, lParam ); } // // Common utility functions shared by both local and destination dialogs // void InitBroadbandInfo(HWND hDlg) { HWND hwndTmp; // layer2 protocol: IDC_CMB_PVC_Layer2 static const int nrgLayer2Ids[] = { IDS_PVC_Any, IDS_PVC_Absent, IDS_PVC_Layer2_1, IDS_PVC_Layer2_2, IDS_PVC_Layer2_6, IDS_PVC_Layer2_7, IDS_PVC_Layer2_8, IDS_PVC_Layer2_9, IDS_PVC_Layer2_10, IDS_PVC_Layer2_11, IDS_PVC_Layer2_12, IDS_PVC_Layer2_13, IDS_PVC_Layer2_14, IDS_PVC_Layer2_16, IDS_PVC_Layer2_17 }; InitComboWithStringArray(hDlg, IDC_CMB_PVC_Layer2, celems(nrgLayer2Ids), nrgLayer2Ids); // layer3 protocol: IDC_CMB_PVC_Layer3 static const int nrgLayer3Ids[] = { IDS_PVC_Any, IDS_PVC_Absent, IDS_PVC_Layer3_6, IDS_PVC_Layer3_7, IDS_PVC_Layer3_8, IDS_PVC_Layer3_9, IDS_PVC_Layer3_10, IDS_PVC_Layer3_11, IDS_PVC_Layer3_16 }; InitComboWithStringArray(hDlg, IDC_CMB_PVC_Layer3, celems(nrgLayer3Ids), nrgLayer3Ids); // high layer type: IDC_CMB_PVC_High_Type static const int nrgHighLayerIds[] = { IDS_PVC_Any, IDS_PVC_Absent, IDS_PVC_HighLayer_0, IDS_PVC_HighLayer_1, IDS_PVC_HighLayer_3 }; InitComboWithStringArray(hDlg, IDC_CMB_PVC_High_Type, celems(nrgHighLayerIds), nrgHighLayerIds); // set length limits for edit boxes ::SendDlgItemMessage(hDlg, IDC_EDT_PVC_User_Layer2, EM_SETLIMITTEXT, MAX_FIELD_LENGTH, 0); ::SendDlgItemMessage(hDlg, IDC_EDT_PVC_User_Layer3, EM_SETLIMITTEXT, MAX_FIELD_LENGTH, 0); ::SendDlgItemMessage(hDlg, IDC_EDT_PVC_Layer3_IPI, EM_SETLIMITTEXT, MAX_FIELD_LENGTH, 0); hwndTmp = GetDlgItem(hDlg, IDC_EDT_PVC_SNAP_ID); // Subclass the edit control to allow only hex digits ::SetWindowLongPtr(hwndTmp, GWLP_USERDATA, ::GetWindowLongPtr(hwndTmp, GWLP_WNDPROC)); ::SetWindowLongPtr(hwndTmp, GWLP_WNDPROC, (LONG_PTR)AtmEditSubclassProc); ::SendDlgItemMessage(hDlg, IDC_EDT_PVC_SNAP_ID, EM_SETLIMITTEXT, c_nSnapIdMaxBytes*2, 0); ::SendDlgItemMessage(hDlg, IDC_CMB_PVC_High_Value, EM_SETLIMITTEXT, c_nHighLayerInfoMaxBytes*2, 0); } void SetBroadbandInfo(HWND hDlg, CPvcInfo * pPvcInfo, Location location) { // layer2 protocol and user specified value DWORD dwLayer2Protocol; DWORD dwUserSpecLayer2; if (location == LOCAL) { dwLayer2Protocol = pPvcInfo->m_dwLocalLayer2Protocol; dwUserSpecLayer2 = pPvcInfo->m_dwLocalUserSpecLayer2; } else { dwLayer2Protocol = pPvcInfo->m_dwDestnLayer2Protocol; dwUserSpecLayer2 = pPvcInfo->m_dwDestnUserSpecLayer2; } SetProtocolInfo(hDlg, IDC_CMB_PVC_Layer2, IDC_EDT_PVC_User_Layer2, dwLayer2Protocol, dwUserSpecLayer2); // layer3 protocol and user specified value DWORD dwLayer3Protocol; DWORD dwUserSpecLayer3; if (location == LOCAL) { dwLayer3Protocol = pPvcInfo->m_dwLocalLayer3Protocol; dwUserSpecLayer3 = pPvcInfo->m_dwLocalUserSpecLayer3; } else { dwLayer3Protocol = pPvcInfo->m_dwDestnLayer3Protocol; dwUserSpecLayer3 = pPvcInfo->m_dwDestnUserSpecLayer3; } SetProtocolInfo(hDlg, IDC_CMB_PVC_Layer3, IDC_EDT_PVC_User_Layer3, dwLayer3Protocol, dwUserSpecLayer3); // Layer3 IPI DWORD dwLayer3IPI; if (location == LOCAL) { dwLayer3IPI = pPvcInfo->m_dwLocalLayer3IPI; } else { dwLayer3IPI = pPvcInfo->m_dwDestnLayer3IPI; } SetDwordEdtField(hDlg, dwLayer3IPI, IDC_EDT_PVC_Layer3_IPI); // Snap ID if (location == LOCAL) { SetDlgItemText(hDlg,IDC_EDT_PVC_SNAP_ID, pPvcInfo->m_strLocalSnapId.c_str()); } else { SetDlgItemText(hDlg,IDC_EDT_PVC_SNAP_ID, pPvcInfo->m_strDestnSnapId.c_str()); } // High layer DWORD dwHighLayerInfoType; tstring strHighLayerInfo; if (location == LOCAL) { dwHighLayerInfoType = pPvcInfo->m_dwLocalHighLayerInfoType; strHighLayerInfo = pPvcInfo->m_strLocalHighLayerInfo; } else { dwHighLayerInfoType = pPvcInfo->m_dwDestnHighLayerInfoType; strHighLayerInfo = pPvcInfo->m_strDestnHighLayerInfo; } SetHighLayerInfo(hDlg, dwHighLayerInfoType, strHighLayerInfo); } void SetProtocolInfo(HWND hDlg, int nIDDlgItemCombo, int nIDDlgItemEdit, DWORD dwProtocol, DWORD dwUserSpecValue) { if ( FIELD_ANY == dwProtocol) { SendDlgItemMessage(hDlg, nIDDlgItemCombo, CB_SETCURSEL, (LPARAM)(0), 0); } else if ( FIELD_ABSENT == dwProtocol) { SendDlgItemMessage(hDlg, nIDDlgItemCombo, CB_SETCURSEL, (LPARAM)(1), 0); } else if (FIELD_UNSET != dwProtocol) { WCHAR szBuf[MAX_FIELD_LENGTH+1]; wsprintfW(szBuf, c_szItoa, dwProtocol); tstring strBuf = szBuf; // attached the separator '-' strBuf+= c_chSeparator; // see if the value is one of the pre-defined protocol int nIdx = SendDlgItemMessage(hDlg, nIDDlgItemCombo, CB_FINDSTRING, -1, (LPARAM)strBuf.c_str()); if (CB_ERR == nIdx) // not one of the pre-defined protocols { SetDlgItemText(hDlg, nIDDlgItemCombo, szBuf); } else { SendDlgItemMessage(hDlg, nIDDlgItemCombo, CB_SETCURSEL, nIdx, 0L); } } if (dwProtocol == c_dwUserSpecProtocol) { SetDwordEdtField(hDlg, dwUserSpecValue, nIDDlgItemEdit); } else { ::EnableWindow(::GetDlgItem(hDlg,nIDDlgItemEdit), FALSE); } } void SetHighLayerInfo(HWND hDlg, DWORD dwHighLayerInfoType, tstring & strHighLayerInfo) { if ( FIELD_ANY == dwHighLayerInfoType) { SendDlgItemMessage(hDlg, IDC_CMB_PVC_High_Type, CB_SETCURSEL, (LPARAM)(0), 0); } else if ( FIELD_ABSENT == dwHighLayerInfoType) { SendDlgItemMessage(hDlg, IDC_CMB_PVC_High_Type, CB_SETCURSEL, (LPARAM)(1), 0); } else if ( FIELD_UNSET != dwHighLayerInfoType) { WCHAR szBuf[MAX_FIELD_LENGTH+1]; wsprintfW(szBuf, c_szItoa, dwHighLayerInfoType); tstring strBuf = szBuf; // attached the separator '-' strBuf+= c_chSeparator; // see if the value is one of the pre-defined protocol int nIdx = SendDlgItemMessage(hDlg, IDC_CMB_PVC_High_Type, CB_FINDSTRING, -1, (LPARAM)strBuf.c_str()); if (CB_ERR == nIdx) // not one of the pre-defined protocols { SetDlgItemText(hDlg, IDC_CMB_PVC_High_Type, szBuf); } else { SendDlgItemMessage(hDlg, IDC_CMB_PVC_High_Type, CB_SETCURSEL, nIdx, 0L); } } if (dwHighLayerInfoType == c_dwUserSpecHighLayer) { HWND hwndTmp; hwndTmp = GetDlgItem(hDlg, IDC_CMB_PVC_High_Value); // Subclass the edit control to allow only hex digits ::SetWindowLongPtr(hwndTmp, GWLP_USERDATA, ::GetWindowLongPtr(hwndTmp, GWLP_WNDPROC)); ::SetWindowLongPtr(hwndTmp, GWLP_WNDPROC, (LONG_PTR)AtmEditSubclassProc); SetDlgItemText(hDlg, IDC_CMB_PVC_High_Value, strHighLayerInfo.c_str()); } else { ::EnableWindow(::GetDlgItem(hDlg,IDC_CMB_PVC_High_Value), FALSE); ::EnableWindow(::GetDlgItem(hDlg,IDC_TXT_PVC_Value), FALSE); } } void GetBroadbandInfo(HWND hDlg, CPvcInfo * pPvcInfo, Location location) { // layer2 protocol and user specified value DWORD * pdwLayer2Protocol; DWORD * pdwUserSpecLayer2; if (location == LOCAL) { pdwLayer2Protocol = &(pPvcInfo->m_dwLocalLayer2Protocol); pdwUserSpecLayer2 = &(pPvcInfo->m_dwLocalUserSpecLayer2); } else { pdwLayer2Protocol = &(pPvcInfo->m_dwDestnLayer2Protocol); pdwUserSpecLayer2 = &(pPvcInfo->m_dwDestnUserSpecLayer2); } GetProtocolInfo(hDlg, IDC_CMB_PVC_Layer2, IDC_EDT_PVC_User_Layer2, pdwLayer2Protocol, pdwUserSpecLayer2); // layer3 protocol and user specified value DWORD * pdwLayer3Protocol; DWORD * pdwUserSpecLayer3; if (location == LOCAL) { pdwLayer3Protocol = &(pPvcInfo->m_dwLocalLayer3Protocol); pdwUserSpecLayer3 = &(pPvcInfo->m_dwLocalUserSpecLayer3); } else { pdwLayer3Protocol = &(pPvcInfo->m_dwDestnLayer3Protocol); pdwUserSpecLayer3 = &(pPvcInfo->m_dwDestnUserSpecLayer3); } GetProtocolInfo(hDlg, IDC_CMB_PVC_Layer3, IDC_EDT_PVC_User_Layer3, pdwLayer3Protocol, pdwUserSpecLayer3); // Layer3 IPI DWORD * pdwLayer3IPI; if (location == LOCAL) { pdwLayer3IPI = &(pPvcInfo->m_dwLocalLayer3IPI); } else { pdwLayer3IPI = &(pPvcInfo->m_dwDestnLayer3IPI); } GetDwordEdtField(hDlg, pdwLayer3IPI, IDC_EDT_PVC_Layer3_IPI); // Snap ID WCHAR szSnapId[MAX_PATH]; GetDlgItemText(hDlg, IDC_EDT_PVC_SNAP_ID, szSnapId, celems(szSnapId)); if (location == LOCAL) { pPvcInfo->m_strLocalSnapId = szSnapId; } else { pPvcInfo->m_strDestnSnapId = szSnapId; } // High layer DWORD * pdwHighLayerInfoType; tstring * pstrHighLayerInfo; if (location == LOCAL) { pdwHighLayerInfoType = &(pPvcInfo->m_dwLocalHighLayerInfoType); pstrHighLayerInfo = &(pPvcInfo->m_strLocalHighLayerInfo); } else { pdwHighLayerInfoType = &(pPvcInfo->m_dwDestnHighLayerInfoType); pstrHighLayerInfo = &(pPvcInfo->m_strDestnHighLayerInfo); } GetHighLayerInfo(hDlg, pdwHighLayerInfoType, pstrHighLayerInfo); } void GetProtocolInfo(HWND hDlg, int nIDDlgItemCombo, int nIDDlgItemEdit, DWORD * pdwProtocol, DWORD * pdwUserSpecValue) { WCHAR szBuf[MAX_PATH]; int nlen = GetDlgItemText(hDlg, nIDDlgItemCombo, szBuf, MAX_PATH); if (nlen==0) { // empty protocol2 field *pdwProtocol = FIELD_UNSET; *pdwUserSpecValue = FIELD_UNSET; } else { int nIdx = SendDlgItemMessage(hDlg, nIDDlgItemCombo, CB_FINDSTRINGEXACT, -1, (LPARAM)(PCWSTR)szBuf); if (0 == nIdx) { *pdwProtocol = FIELD_ANY; *pdwUserSpecValue = 0; } else if (1 == nIdx) { *pdwProtocol = FIELD_ABSENT; *pdwUserSpecValue = 0; } else { GetNumFromString(szBuf, pdwProtocol); *pdwUserSpecValue = 0; if (*pdwProtocol == c_dwUserSpecProtocol) { GetDwordEdtField(hDlg, pdwUserSpecValue, nIDDlgItemEdit); } } } } void GetHighLayerInfo(HWND hDlg, DWORD * pdwHighLayerInfoType, tstring * pstrHighLayerInfo) { WCHAR szBuf[MAX_PATH]; *pstrHighLayerInfo = c_szEmpty; int nlen = GetDlgItemText(hDlg, IDC_CMB_PVC_High_Type, szBuf, MAX_PATH); if (nlen==0) { // empty field *pdwHighLayerInfoType = FIELD_UNSET; } else { int nIdx = SendDlgItemMessage(hDlg, IDC_CMB_PVC_High_Type, CB_FINDSTRINGEXACT, -1, (LPARAM)(PCWSTR)szBuf); if (0 == nIdx) { *pdwHighLayerInfoType = FIELD_ANY; } else if (1 == nIdx) { *pdwHighLayerInfoType = FIELD_ABSENT; } else { GetNumFromString(szBuf, pdwHighLayerInfoType); if (*pdwHighLayerInfoType == c_dwUserSpecHighLayer) { WCHAR szHighLayerInfo[MAX_PATH]; GetDlgItemText(hDlg, IDC_CMB_PVC_High_Value, szHighLayerInfo, celems(szHighLayerInfo)); *pstrHighLayerInfo = szHighLayerInfo; } } } } void OnLayer2EdtChange(HWND hDlg) { // get the current value in the control, // and see if we should enable or disable the edit box for user specified value WCHAR szBuf[MAX_PATH]; GetDlgItemText(hDlg, IDC_CMB_PVC_Layer2, szBuf, MAX_PATH); if (!(*szBuf)) { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer2), FALSE); } else { // the string has to be equal to the specific number if (0 == wcscmp(szBuf, c_szUserSpecProtocol)) { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer2), TRUE); } else { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer2), FALSE); } } } void OnLayer2SelChange(HWND hDlg) { // get the index of the new selection int idx = SendDlgItemMessage(hDlg, IDC_CMB_PVC_Layer2, CB_GETCURSEL, (LPARAM)(0), 0); if (idx != CB_ERR) { // get the string of the current selection WCHAR szBuf[MAX_PATH]; int len = SendDlgItemMessage(hDlg, IDC_CMB_PVC_Layer2, CB_GETLBTEXT, (LPARAM)(idx), (WPARAM)(PCWSTR)szBuf); if ((len != CB_ERR) && (len>0)) { DWORD dwNum; GetNumFromString(szBuf, &dwNum); if (dwNum == c_dwUserSpecProtocol) { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer2), TRUE); } else { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer2), FALSE); } } } } void OnLayer3EdtChange(HWND hDlg) { // get the current value in the control, // and see if we should enable or disable the edit box for user specified value WCHAR szBuf[MAX_PATH]; GetDlgItemText(hDlg, IDC_CMB_PVC_Layer3, szBuf, MAX_PATH); if (!(*szBuf)) { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer3), FALSE); } else { // the string has to be equal to the specific number if (0 == wcscmp(szBuf, c_szUserSpecProtocol)) { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer3), TRUE); } else { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer3), FALSE); } } } void OnLayer3SelChange(HWND hDlg) { // get the index of the new selection int idx = SendDlgItemMessage(hDlg, IDC_CMB_PVC_Layer3, CB_GETCURSEL, (LPARAM)(0), 0); if (idx != CB_ERR) { // get the string of the current selection WCHAR szBuf[MAX_PATH]; int len = SendDlgItemMessage(hDlg, IDC_CMB_PVC_Layer3, CB_GETLBTEXT, (LPARAM)(idx), (WPARAM)(PCWSTR)szBuf); if ((len != CB_ERR) && (len>0)) { DWORD dwNum; GetNumFromString(szBuf, &dwNum); if (dwNum == c_dwUserSpecProtocol) { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer3), TRUE); } else { ::EnableWindow(::GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer3), FALSE); } } } } void OnHighLayerEdtChange(HWND hDlg) { // get the current value in the control, // and see if we should enable or disable the edit box for user specified value WCHAR szBuf[MAX_PATH]; GetDlgItemText(hDlg, IDC_CMB_PVC_High_Type, szBuf, MAX_PATH); if (!(*szBuf)) { ::EnableWindow(::GetDlgItem(hDlg, IDC_CMB_PVC_High_Value), FALSE); ::EnableWindow(::GetDlgItem(hDlg, IDC_TXT_PVC_Value), FALSE); } else { // the string has to be equal to the specific number if (0 == wcscmp(szBuf, c_szUserSpecHighLayer)) { ::EnableWindow(::GetDlgItem(hDlg,IDC_CMB_PVC_High_Value), TRUE); ::EnableWindow(::GetDlgItem(hDlg, IDC_TXT_PVC_Value), TRUE); } else { ::EnableWindow(::GetDlgItem(hDlg,IDC_CMB_PVC_High_Value), FALSE); ::EnableWindow(::GetDlgItem(hDlg, IDC_TXT_PVC_Value), FALSE); } } } void OnHighLayerSelChange(HWND hDlg) { // get the index of the new selection int idx = SendDlgItemMessage(hDlg, IDC_CMB_PVC_High_Type, CB_GETCURSEL, (LPARAM)(0), 0); if (idx != CB_ERR) { // get the string of the current selection WCHAR szBuf[MAX_PATH]; int len = SendDlgItemMessage(hDlg, IDC_CMB_PVC_High_Type, CB_GETLBTEXT, (LPARAM)(idx), (WPARAM)(PCWSTR)szBuf); if ((len != CB_ERR) && (len>0)) { DWORD dwNum; GetNumFromString(szBuf, &dwNum); if (dwNum == c_dwUserSpecHighLayer) { HWND hwndTmp; hwndTmp = GetDlgItem(hDlg, IDC_CMB_PVC_High_Value); // Subclass the edit control to allow only hex digits ::SetWindowLongPtr(hwndTmp, GWLP_USERDATA, ::GetWindowLongPtr(hwndTmp, GWLP_WNDPROC)); ::SetWindowLongPtr(hwndTmp, GWLP_WNDPROC, (LONG_PTR)AtmEditSubclassProc); ::EnableWindow(::GetDlgItem(hDlg,IDC_CMB_PVC_High_Value), TRUE); ::EnableWindow(::GetDlgItem(hDlg, IDC_TXT_PVC_Value), TRUE); } else { ::EnableWindow(::GetDlgItem(hDlg,IDC_CMB_PVC_High_Value), FALSE); ::EnableWindow(::GetDlgItem(hDlg, IDC_TXT_PVC_Value), FALSE); } } } } void GetNumFromString(PWSTR pszBuf, DWORD * pdwNum) { *pdwNum=0; WCHAR * pch; pch = pszBuf; while ((*pch >= L'0') && (*pch <= L'9')) { *pdwNum = (*pdwNum*10) + (*pch - L'0'); pch++; } } BOOL InvalidBroadbandInfo(HWND hDlg) { BOOL err = FALSE; // layer2 protocol & value if (!IsValidCmbSelection(hDlg, IDC_CMB_PVC_Layer2)) { NcMsgBox(hDlg, IDS_MSFT_UNI_TEXT, IDS_INVALID_Layer2_Protocol, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hDlg, IDC_CMB_PVC_Layer2)); err = TRUE; } else if ((!err) && (IsWindowEnabled(GetDlgItem(hDlg, IDC_EDT_PVC_User_Layer2)))) { if (!IsValidDwordField(hDlg, IDC_EDT_PVC_User_Layer2)) { NcMsgBox(hDlg, IDS_MSFT_UNI_TEXT, IDS_INVALID_Layer2_UserSpec, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hDlg, IDC_EDT_PVC_User_Layer2)); err = TRUE; } } // layer3 protocol & value if (!err) { if (!IsValidCmbSelection(hDlg, IDC_CMB_PVC_Layer3)) { NcMsgBox(hDlg, IDS_MSFT_UNI_TEXT, IDS_INVALID_Layer3_Protocol, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hDlg,IDC_CMB_PVC_Layer3)); err = TRUE; } else if ((!err) && (IsWindowEnabled(GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer3)))) { if (!IsValidDwordField(hDlg, IDC_EDT_PVC_User_Layer2)) { NcMsgBox(hDlg, IDS_MSFT_UNI_TEXT, IDS_INVALID_Layer3_UserSpec, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hDlg,IDC_EDT_PVC_User_Layer3)); err = TRUE; } } } //Layer3 IPI if (!err) { if (!IsValidDwordField(hDlg, IDC_EDT_PVC_Layer3_IPI)) { NcMsgBox(hDlg, IDS_MSFT_UNI_TEXT, IDS_INVALID_Layer3_IPI, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hDlg,IDC_EDT_PVC_Layer3_IPI)); err = TRUE; } } // SnapId if (!IsValidBinaryField(hDlg, IDC_EDT_PVC_SNAP_ID, c_nSnapIdMaxBytes)) { NcMsgBox(hDlg, IDS_MSFT_UNI_TEXT, IDS_INVALID_SnapId, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hDlg, IDC_EDT_PVC_SNAP_ID)); err = TRUE; } // High layer info if (!err) { if (!IsValidCmbSelection(hDlg, IDC_CMB_PVC_High_Type)) { NcMsgBox(hDlg, IDS_MSFT_UNI_TEXT, IDS_INVALID_Highlayer_Type, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hDlg,IDC_CMB_PVC_High_Type)); err = TRUE; } else if ((!err) && (IsWindowEnabled(GetDlgItem(hDlg,IDC_CMB_PVC_High_Value)))) { if (!IsValidBinaryField(hDlg, IDC_CMB_PVC_High_Value, c_nHighLayerInfoMaxBytes)) { NcMsgBox(hDlg, IDS_MSFT_UNI_TEXT, IDS_INVALID_HighLayerValue, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hDlg,IDC_CMB_PVC_High_Value)); err = TRUE; } } } return err; } BOOL IsValidCmbSelection(HWND hDlg, int nIDDlgItemCombo) { BOOL ret = TRUE; WCHAR szBuf[MAX_PATH]; int nlen = GetDlgItemText(hDlg, nIDDlgItemCombo, szBuf, MAX_PATH); if (nlen > 0) // empty string is ok { int nIdx = SendDlgItemMessage(hDlg, nIDDlgItemCombo, CB_FINDSTRINGEXACT, -1, (LPARAM)(PCWSTR)szBuf); if (nIdx == CB_ERR) // any string in the selection is ok { DWORD dwProtocol; GetNumFromString(szBuf, &dwProtocol); #pragma warning(push) #pragma warning(disable:4296) if ((dwProtocol > c_dwFieldHigh) || (dwProtocol < c_dwFieldLow)) { ret = FALSE; } #pragma warning(pop) } } return ret; } BOOL IsValidDwordField(HWND hDlg, int nIDDlgItemEdit) { BOOL ret = TRUE; DWORD dwValue; GetDwordEdtField(hDlg, &dwValue, nIDDlgItemEdit); if (FIELD_UNSET != dwValue) // empty field is ok { #pragma warning(push) #pragma warning(disable:4296) if ((dwValue > c_dwFieldHigh) || (dwValue < c_dwFieldLow)) { ret = FALSE; } #pragma warning(pop) } return ret; } BOOL IsValidBinaryField(HWND hDlg, int nIDDlgItemEdit, int nMaxBytes) { BOOL ret = TRUE; WCHAR szBuff[MAX_PATH]; GetDlgItemText(hDlg, nIDDlgItemEdit, szBuff, celems(szBuff)); //length int nlen = wcslen(szBuff); if (nlen % 2) // must be even number of hex digits { ret = FALSE; } else { if ((szBuff[0] == L'0') && ((szBuff[1] == L'x') || (szBuff[1] == L'X'))) { nlen -= 2; } if (nlen > nMaxBytes*2) { ret = FALSE; } } if (ret) { int i=0; nlen = wcslen(szBuff); if ((szBuff[0] == L'0') && ((szBuff[1] == L'x') || (szBuff[1] == L'X'))) { i = 2; } while (i= L'0') && (szBuff[i] <= L'9')) || ((szBuff[i] >= L'a') && (szBuff[i] <= L'f')) || ((szBuff[i] >= L'A') && (szBuff[i] <= L'F'))) { i++; } else { ret = FALSE; break; } } } return ret; }