//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: I S D N P A G E . C P P // // Contents: Contains the isdn page for enumerated net class devices // // Notes: // // Author: BillBe 9 Sep 1997 // //--------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "isdnpage.h" #include "isdnshts.h" #include "ncreg.h" #include "ncsetup.h" #include "ncui.h" CIsdnPage::CIsdnPage() : m_fDirty(FALSE), m_hkeyDriver(NULL), m_hdi(NULL), m_pdeid(NULL), m_pisdnci(NULL) { } CIsdnPage::~CIsdnPage() { if (m_pisdnci) { // Free the structure. This was allocated by // HrReadIsdnPropertiesInfo. // FreeIsdnPropertiesInfo(m_pisdnci); } RegSafeCloseKey(m_hkeyDriver); } //+-------------------------------------------------------------------------- // // Member: CIsdnPage::CreatePage // // Purpose: Creates the Isdn page only if there the device is an isdn // adapter // // Arguments: // hdi [in] SetupApi HDEVINFO for device // pdeid [in] SetupApi PSP_DEVINFO_DATA for device // // Returns: HPROPSHEETPAGE // // Author: billbe 9 Sep 1997 // // Notes: // HPROPSHEETPAGE CIsdnPage::CreatePage(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid) { Assert(INVALID_HANDLE_VALUE != hdi); Assert(hdi); Assert(pdeid); HPROPSHEETPAGE hpsp = NULL; // Open the device's instance key HRESULT hr = HrSetupDiOpenDevRegKey(hdi, pdeid, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_ALL_ACCESS, &m_hkeyDriver); // If the key was opened and this adapter is ISDN if (SUCCEEDED(hr) && FShowIsdnPages(m_hkeyDriver)) { // read the adapter's properties from the registry hr = HrReadIsdnPropertiesInfo(m_hkeyDriver, hdi, pdeid, &m_pisdnci); if (SUCCEEDED(hr)) { m_hdi = hdi; m_pdeid = pdeid; hpsp = CPropSheetPage::CreatePage(IDP_ISDN_SWITCH_TYPE, 0); } } return hpsp; } //+-------------------------------------------------------------------------- // // Member: CIsdnPage::OnInitDialog // // Purpose: Handler for the WM_INITDIALOG window message. Initializes // the dialog window. // // Author: BillBe 09 Sep 1997 // // Notes: // // LRESULT CIsdnPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Populate the switch types from the multi-sz that we read PopulateIsdnSwitchTypes(m_hWnd, IDC_CMB_SwitchType, m_pisdnci); SetSwitchType(m_hWnd, IDC_CMB_SwitchType, m_pisdnci->dwCurSwitchType); //Enable or disable the Configure button depending on the switch type selected. EnableDisableConfigure(); // Note the current selections // m_pisdnci->nOldBChannel = (INT)SendDlgItemMessage(IDC_LBX_Variant, LB_GETCURSEL, 0, 0); m_pisdnci->nOldDChannel = (INT)SendDlgItemMessage(IDC_LBX_Line, LB_GETCURSEL, 0, 0); return 0; } LRESULT CIsdnPage::OnSwitchType(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (wNotifyCode == CBN_SELCHANGE) { m_fDirty = TRUE; SetChangedFlag(); //Enable or disable the Configure button depending on the switch type selected. EnableDisableConfigure(); } return 0; } //+-------------------------------------------------------------------------- // // Member: CIsdnPage::OnApply // // Purpose: Handler for the PSN_APPLY message // // Author: BillBe 10 Sep 1997 // // Notes: // // LRESULT CIsdnPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { // only do something if data has changed. if (m_fDirty) { // Update the switch type m_pisdnci->dwCurSwitchType = DwGetSwitchType(m_hWnd, m_pisdnci, IDC_CMB_SwitchType); // Write the parameters back out into the registry. (void) HrWriteIsdnPropertiesInfo(m_hkeyDriver, m_pisdnci); // Notify the UI that its display might need updating // SP_DEVINSTALL_PARAMS deip; // Try to get the current params (void) HrSetupDiGetDeviceInstallParams(m_hdi, m_pdeid, &deip); deip.FlagsEx |= DI_FLAGSEX_PROPCHANGE_PENDING; // Try to set the new params. If it fails, it is not // catastrophic so we ignore return values (void) HrSetupDiSetDeviceInstallParams(m_hdi, m_pdeid, &deip); // Changes have been applied so clear our dirty flag m_fDirty = FALSE; } return 0; } LRESULT CIsdnPage::OnConfigure(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { DWORD dwSwitchType; dwSwitchType = DwGetSwitchType(m_hWnd, m_pisdnci, IDC_CMB_SwitchType); switch (dwSwitchType) { case ISDN_SWITCH_ATT: case ISDN_SWITCH_NI1: case ISDN_SWITCH_NI2: case ISDN_SWITCH_NTI: if (m_pisdnci->fIsPri) { // PRI adapters use the EAZ page instead DoEazDlg(); } else { DoSpidsDlg(); } break; case ISDN_SWITCH_INS64: DoJapanDlg(); break; case ISDN_SWITCH_1TR6: case ISDN_SWITCH_AUTO: DoEazDlg(); break; case ISDN_SWITCH_VN3: case ISDN_SWITCH_DSS1: case ISDN_SWITCH_AUS: case ISDN_SWITCH_BEL: case ISDN_SWITCH_VN4: case ISDN_SWITCH_SWE: case ISDN_SWITCH_ITA: case ISDN_SWITCH_TWN: DoMsnDlg(); break; default: AssertSz(FALSE, "Where do we go from here.. now that all of our " "children are growin' up?"); break; } return 0; } VOID CIsdnPage::DoSpidsDlg() { CSpidsDlg dlg(m_pisdnci); INT_PTR nRet; m_pisdnci->idd = dlg.IDD; nRet = dlg.DoModal(m_hWnd); if (nRet) { m_fDirty = TRUE; SetChangedFlag(); } } VOID CIsdnPage::DoJapanDlg() { CJapanDlg dlg(m_pisdnci); INT_PTR nRet; m_pisdnci->idd = dlg.IDD; nRet = dlg.DoModal(m_hWnd); if (nRet) { m_fDirty = TRUE; SetChangedFlag(); } } VOID CIsdnPage::DoEazDlg() { CEazDlg dlg(m_pisdnci); INT_PTR nRet; m_pisdnci->idd = dlg.IDD; nRet = dlg.DoModal(m_hWnd); if (nRet) { m_fDirty = TRUE; SetChangedFlag(); } } VOID CIsdnPage::DoMsnDlg() { CMsnDlg dlg(m_pisdnci); INT_PTR nRet; m_pisdnci->idd = dlg.IDD; nRet = dlg.DoModal(m_hWnd); if (nRet) { m_fDirty = TRUE; SetChangedFlag(); } } static const CONTEXTIDMAP c_adwContextIdMap[] = { { IDC_LBX_Line, 2003230, 2003230 }, { IDC_LBX_Variant, 2003240, 2003240 }, { IDC_EDT_PhoneNumber, 2003250, 2003255 }, { IDC_EDT_SPID, 2003265, 2003260 }, { IDC_EDT_MSN, 2003270, 2003270 }, { IDC_PSB_ADD, 2003280, 2003280 }, { IDC_LBX_MSN, 2003290, 2003290 }, { IDC_PSB_REMOVE, 2003300, 2003300 }, { IDC_CMB_SwitchType, 2003310, 2003310 }, { IDC_PSB_Configure, 2003320, 2003320 }, { 0, 0, 0 }, // end marker }; LRESULT CIsdnPage::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { OnHelpGeneric(m_hWnd, (LPHELPINFO)lParam, c_adwContextIdMap, m_pisdnci->idd == IDD_ISDN_JAPAN, c_szIsdnHelpFile); return TRUE; } LRESULT CIsdnPage::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { HELPINFO hi; HMENU h = CreatePopupMenu(); POINT pScreen; TCHAR szWhat[MAX_PATH]; if (h == NULL) { return FALSE; } LoadString(_Module.GetResourceInstance(), IDS_ISDN_WHATS_THIS, szWhat, MAX_PATH); InsertMenu(h, -1, MF_BYPOSITION, 777, szWhat); pScreen.x = ((int)(short)LOWORD(lParam)); pScreen.y = ((int)(short)HIWORD(lParam)); int n; switch(n = TrackPopupMenu(h, TPM_NONOTIFY | TPM_RETURNCMD, pScreen.x, pScreen.y, 0, m_hWnd, NULL)) { case 777: hi.iContextType = HELPINFO_WINDOW; hi.iCtrlId = ::GetWindowLong((HWND)wParam, GWL_ID); OnHelpGeneric(m_hWnd, &hi, c_adwContextIdMap, m_pisdnci->idd == IDD_ISDN_JAPAN, c_szIsdnHelpFile); break; } DestroyMenu(h); return TRUE; } VOID CIsdnPage::EnableDisableConfigure () { DWORD dwSwitchType; HWND hwndConfigure; dwSwitchType = DwGetSwitchType(m_hWnd, m_pisdnci, IDC_CMB_SwitchType); hwndConfigure = ::GetDlgItem(m_hWnd, IDC_PSB_Configure); Assert(hwndConfigure); if (hwndConfigure) { switch (dwSwitchType) { case ISDN_SWITCH_ATT: case ISDN_SWITCH_NI1: case ISDN_SWITCH_NI2: case ISDN_SWITCH_NTI: case ISDN_SWITCH_AUTO: if (m_pisdnci->fIsPri) { ::EnableWindow(hwndConfigure, FALSE); } else { ::EnableWindow(hwndConfigure, TRUE); } break; default: ::EnableWindow(hwndConfigure, TRUE); } } return; } //+--------------------------------------------------------------------------- // // Function: HrGetIsdnPage // // Purpose: Creates the Isdn page for enumerated net devices. // This function is called by the NetPropPageProvider fcn. // // Arguments: // hdi [in] See SetupApi for info // pdeid [in] See SetupApi for for info // phpsp [out] Pointer to the handle to the isdn property page // // Returns: // // Author: billbe 9 Sep 1997 // // Notes: // HRESULT HrGetIsdnPage(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid, HPROPSHEETPAGE* phpsp) { Assert(hdi); Assert(pdeid); Assert(phpsp); HRESULT hr; HPROPSHEETPAGE hpsp; CIsdnPage* pisdn = new CIsdnPage(); if (pisdn == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } // create the isdn page hpsp = pisdn->CreatePage(hdi, pdeid); // if successful, set the out param if (hpsp) { *phpsp = hpsp; hr = S_OK; } else { // Either there is no isdn page to display or there // was an error. hr = E_FAIL; *phpsp = NULL; delete pisdn; } TraceErrorOptional("HrGetIsdnPage", hr, E_FAIL == hr); return (hr); } LRESULT CSpidsDlg::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { OnIsdnInfoPageTransition(m_hWnd, m_pisdnci); EndDialog(TRUE); return 0; } LRESULT CSpidsDlg::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { EndDialog(FALSE); return 0; } LRESULT CSpidsDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Populate the channels from the array of B-Channels stored in our // config info for the first D-Channel // PopulateIsdnChannels(m_hWnd, IDC_EDT_SPID, IDC_EDT_PhoneNumber, IDC_LBX_Line, IDC_LBX_Variant, m_pisdnci); ::SetFocus(GetDlgItem(IDC_EDT_PhoneNumber)); // Note the current selections // m_pisdnci->nOldBChannel = (INT)SendDlgItemMessage(IDC_LBX_Variant, LB_GETCURSEL, 0, 0); m_pisdnci->nOldDChannel = (INT)SendDlgItemMessage(IDC_LBX_Line, LB_GETCURSEL, 0, 0); SendDlgItemMessage(IDC_EDT_SPID, EM_LIMITTEXT, c_cchMaxSpid, 0); SendDlgItemMessage(IDC_EDT_PhoneNumber, EM_LIMITTEXT, c_cchMaxOther, 0); return FALSE; } LRESULT CSpidsDlg::OnSelChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (wNotifyCode == LBN_SELCHANGE) { OnIsdnInfoPageSelChange(m_hWnd, m_pisdnci); } return 0; } LRESULT CSpidsDlg::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { OnHelpGeneric(m_hWnd, (LPHELPINFO)lParam, c_adwContextIdMap, m_pisdnci->idd == IDD_ISDN_JAPAN, c_szIsdnHelpFile); return TRUE; } // // CEazDlg Implementation // LRESULT CEazDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Populate the channels from the array of B-Channels stored in our // config info for the first D-Channel // PopulateIsdnChannels(m_hWnd, IDC_EDT_SPID, IDC_EDT_PhoneNumber, IDC_LBX_Line, IDC_LBX_Variant, m_pisdnci); ::SetFocus(GetDlgItem(IDC_EDT_PhoneNumber)); // Note the current selections // m_pisdnci->nOldBChannel = (INT)SendDlgItemMessage(IDC_LBX_Variant, LB_GETCURSEL, 0, 0); m_pisdnci->nOldDChannel = (INT)SendDlgItemMessage(IDC_LBX_Line, LB_GETCURSEL, 0, 0); SendDlgItemMessage(IDC_EDT_PhoneNumber, EM_LIMITTEXT, c_cchMaxOther, 0); return FALSE; } LRESULT CEazDlg::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { OnIsdnInfoPageTransition(m_hWnd, m_pisdnci); EndDialog(TRUE); return 0; } LRESULT CEazDlg::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { EndDialog(FALSE); return 0; } LRESULT CEazDlg::OnSelChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (wNotifyCode == LBN_SELCHANGE) { OnIsdnInfoPageSelChange(m_hWnd, m_pisdnci); } return 0; } LRESULT CEazDlg::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { OnHelpGeneric(m_hWnd, (LPHELPINFO)lParam, c_adwContextIdMap, m_pisdnci->idd == IDD_ISDN_JAPAN, c_szIsdnHelpFile); return TRUE; } // // CMsnDlg Implementation // LRESULT CMsnDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { OnMsnPageInitDialog(m_hWnd, m_pisdnci); // Note the current selections // m_pisdnci->nOldDChannel = (INT)SendDlgItemMessage(IDC_LBX_Line, LB_GETCURSEL, 0, 0); SendDlgItemMessage(IDC_EDT_MSN, EM_LIMITTEXT, c_cchMaxOther, 0); return FALSE; } LRESULT CMsnDlg::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { INT iCurSel; iCurSel = (INT)SendDlgItemMessage(IDC_LBX_Line, LB_GETCURSEL, 0, 0); if (iCurSel != LB_ERR) { GetDataFromListBox(iCurSel, m_hWnd, m_pisdnci); } EndDialog(TRUE); return 0; } LRESULT CMsnDlg::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { EndDialog(FALSE); return 0; } LRESULT CMsnDlg::OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { OnMsnPageAdd(m_hWnd, m_pisdnci); return 0; } LRESULT CMsnDlg::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { OnMsnPageRemove(m_hWnd, m_pisdnci); return 0; } LRESULT CMsnDlg::OnChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { OnMsnPageEditSelChange(m_hWnd, m_pisdnci); return 0; } LRESULT CMsnDlg::OnSelChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (wNotifyCode == LBN_SELCHANGE) { OnMsnPageSelChange(m_hWnd, m_pisdnci); } return 0; } LRESULT CMsnDlg::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { OnHelpGeneric(m_hWnd, (LPHELPINFO)lParam, c_adwContextIdMap, m_pisdnci->idd == IDD_ISDN_JAPAN, c_szIsdnHelpFile); return TRUE; } // // CJapanDlg Implementation // LRESULT CJapanDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Populate the channels from the array of B-Channels stored in our // config info for the first D-Channel // PopulateIsdnChannels(m_hWnd, IDC_EDT_SPID, IDC_EDT_PhoneNumber, IDC_LBX_Line, IDC_LBX_Variant, m_pisdnci); ::SetFocus(GetDlgItem(IDC_EDT_PhoneNumber)); // Note the current selections // m_pisdnci->nOldBChannel = (INT)SendDlgItemMessage(IDC_LBX_Variant, LB_GETCURSEL, 0, 0); m_pisdnci->nOldDChannel = (INT)SendDlgItemMessage(IDC_LBX_Line, LB_GETCURSEL, 0, 0); SendDlgItemMessage(IDC_EDT_PhoneNumber, EM_LIMITTEXT, c_cchMaxOther, 0); SendDlgItemMessage(IDC_EDT_SPID, EM_LIMITTEXT, c_cchMaxOther, 0); return FALSE; } LRESULT CJapanDlg::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { OnIsdnInfoPageTransition(m_hWnd, m_pisdnci); EndDialog(TRUE); return 0; } LRESULT CJapanDlg::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { EndDialog(FALSE); return 0; } LRESULT CJapanDlg::OnSelChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (wNotifyCode == LBN_SELCHANGE) { OnIsdnInfoPageSelChange(m_hWnd, m_pisdnci); } return 0; } LRESULT CJapanDlg::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { OnHelpGeneric(m_hWnd, (LPHELPINFO)lParam, c_adwContextIdMap, m_pisdnci->idd == IDD_ISDN_JAPAN, c_szIsdnHelpFile); return TRUE; }