// Copyright (c) 1995, Microsoft Corporation, all rights reserved // // devcfg.c // Remote Access Common Dialog APIs // Device configuration dialogs // // 10/20/95 Steve Cobb #include "rasdlgp.h" #include "mcx.h" //---------------------------------------------------------------------------- // Help maps //---------------------------------------------------------------------------- static DWORD g_adwIcHelp[] = { CID_IC_ST_LineType, HID_IC_LB_LineType, CID_IC_LB_LineType, HID_IC_LB_LineType, CID_IC_CB_Fallback, HID_IC_CB_Fallback, CID_IC_GB_DownLevel, HID_IC_CB_DownLevel, CID_IC_CB_DownLevel, HID_IC_CB_DownLevel, CID_IC_CB_Compression, HID_IC_CB_Compression, CID_IC_ST_Channels, HID_IC_EB_Channels, CID_IC_EB_Channels, HID_IC_EB_Channels, 0, 0 }; static DWORD g_adwMcHelp[] = { CID_MC_I_Modem, HID_MC_I_Modem, CID_MC_EB_ModemValue, HID_MC_EB_ModemValue, CID_MC_ST_MaxBps, HID_MC_LB_MaxBps, CID_MC_LB_MaxBps, HID_MC_LB_MaxBps, CID_MC_GB_Features, HID_MC_GB_Features, CID_MC_CB_FlowControl, HID_MC_CB_FlowControl, CID_MC_CB_ErrorControl, HID_MC_CB_ErrorControl, CID_MC_CB_Compression, HID_MC_CB_Compression, CID_MC_CB_Terminal, HID_MC_CB_Terminal, CID_MC_CB_EnableSpeaker, HID_MC_CB_EnableSpeaker, CID_MC_ST_ModemProtocol, HID_MC_LB_ModemProtocol, CID_MC_LB_ModemProtocol, HID_MC_LB_ModemProtocol, 0, 0 }; static DWORD g_adwXsHelp[] = { CID_XS_ST_Explain, HID_XS_ST_Explain, CID_XS_ST_Networks, HID_XS_LB_Networks, CID_XS_LB_Networks, HID_XS_LB_Networks, CID_XS_ST_Address, HID_XS_EB_Address, CID_XS_EB_Address, HID_XS_EB_Address, CID_XS_GB_Optional, HID_XS_GB_Optional, CID_XS_ST_UserData, HID_XS_EB_UserData, CID_XS_EB_UserData, HID_XS_EB_UserData, CID_XS_ST_Facilities, HID_XS_EB_Facilities, CID_XS_EB_Facilities, HID_XS_EB_Facilities, 0, 0 }; //---------------------------------------------------------------------------- // Local datatypes //---------------------------------------------------------------------------- // ISDN Configuration dialog argument block. // typedef struct _ICARGS { BOOL fShowProprietary; PBLINK* pLink; } ICARGS; // ISDN Configuration dialog context block. // typedef struct _ICINFO { // Stub API arguments including shortcut to link associated with the // entry. // ICARGS* pArgs; // Handle of this dialog and some of it's controls. // HWND hwndDlg; HWND hwndLbLineType; HWND hwndCbFallback; HWND hwndCbProprietary; HWND hwndCbCompression; HWND hwndStChannels; HWND hwndEbChannels; HWND hwndUdChannels; } ICINFO; typedef struct _MC_INIT_INFO { PBLINK* pLink; BOOL fRouter; } MC_INIT_INFO; // Modem Configuration dialog context block. // typedef struct _MCINFO { // Stub API arguments. Shortcut to link associated with the entry. // PBLINK* pLink; // Handle of this dialog and some of it's controls. // HWND hwndDlg; HWND hwndEbModemValue; HWND hwndLbBps; HWND hwndCbHwFlow; HWND hwndCbEc; HWND hwndCbEcc; HWND hwndCbTerminal; HWND hwndCbEnableSpeaker; HWND hwndLbModemProtocols; // Script utilities context. // SUINFO suinfo; BOOL fSuInfoInitialized; BOOL fRouter; } MCINFO; // X.25 Logon Settings dialog argument block. // typedef struct _XSARGS { BOOL fLocalPad; PBENTRY* pEntry; } XSARGS; // X.25 Logon Settings dialog context block. // typedef struct _XSINFO { // Caller's arguments to the dialog. // XSARGS* pArgs; // Handle of this dialog and some of it's controls. // HWND hwndDlg; HWND hwndLbNetworks; HWND hwndEbAddress; HWND hwndEbUserData; HWND hwndEbFacilities; } XSINFO; //---------------------------------------------------------------------------- // Local prototypes (alphabetically) //---------------------------------------------------------------------------- BOOL IcCommand( IN HWND hwnd, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); INT_PTR CALLBACK IcDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL IcInit( IN HWND hwndDlg, IN ICARGS* pArgs ); VOID IcTerm( IN HWND hwndDlg ); BOOL IsdnConfigureDlg( IN HWND hwndOwner, IN PBLINK* pLink, IN BOOL fShowProprietary ); BOOL ModemConfigureDlg( IN HWND hwndOwner, IN PBLINK* pLink, IN BOOL fRouter); INT_PTR CALLBACK McDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL McCommand( IN HWND hwnd, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); BOOL McInit( IN HWND hwndDlg, IN MC_INIT_INFO* pInitInfo ); VOID McTerm( IN HWND hwndDlg ); BOOL XsCommand( IN XSINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); INT_PTR CALLBACK XsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); VOID XsFillPadsList( IN XSINFO* pInfo ); BOOL XsInit( IN HWND hwndDlg, IN XSARGS* pArgs ); BOOL XsSave( IN XSINFO* pInfo ); VOID XsTerm( IN HWND hwndDlg ); //---------------------------------------------------------------------------- // Device configuration dialog //---------------------------------------------------------------------------- BOOL DeviceConfigureDlg( IN HWND hwndOwner, IN PBLINK* pLink, IN PBENTRY* pEntry, IN BOOL fSingleLink, IN BOOL fRouter) // Popup a dialog to edit the device 'PLink'. 'HwndOwner' is the owner of // the dialog. 'PEntry' is the phonebook entry containing the X.25 // settings or NULL if X.25 settings should not be displayed for PAD and // X.25 devices. 'FSingleLink' is true if 'pLink' is a single link // entry's link and false if multi-link. // // Returns true if user pressed OK and succeeded, false if user pressed // Cancel or encountered an error. // { DWORD dwErr; PBDEVICETYPE pbdt; pbdt = pLink->pbport.pbdevicetype; if (!pEntry && (pbdt == PBDT_Pad || pbdt == PBDT_X25)) { pbdt = PBDT_None; } // pmay: 245860 // // We need to allow the editing of null modems too. // if ( pLink->pbport.dwFlags & PBP_F_NullModem ) { pbdt = PBDT_Modem; } switch (pbdt) { case PBDT_Isdn: { return IsdnConfigureDlg( hwndOwner, pLink, fSingleLink ); } case PBDT_Modem: { return ModemConfigureDlg( hwndOwner, pLink, fRouter ); } case PBDT_Pad: { return X25LogonSettingsDlg( hwndOwner, TRUE, pEntry ); } case PBDT_X25: { return X25LogonSettingsDlg( hwndOwner, FALSE, pEntry ); } default: { MsgDlg( hwndOwner, SID_NoConfigure, NULL ); return FALSE; } } } //---------------------------------------------------------------------------- // ISDN configuration dialog // Listed alphabetically following stub API and dialog proc //---------------------------------------------------------------------------- BOOL IsdnConfigureDlg( IN HWND hwndOwner, IN PBLINK* pLink, IN BOOL fShowProprietary ) // Popup the ISDN device configuration dialog. 'HwndOwner' is the owner // of the dialog. 'PLink' is the link to edit. 'FShowProprietary' // indicates the old proprietary Digiboard options should be shown. // // Returns true if user pressed OK and succeeded, false if user pressed // Cancel or encountered an error. // { INT_PTR nStatus; ICARGS args; TRACE( "IsdnConfigureDlg" ); args.fShowProprietary = fShowProprietary; args.pLink = pLink; nStatus = (BOOL )DialogBoxParam( g_hinstDll, (fShowProprietary) ? MAKEINTRESOURCE( DID_IC_IsdnConfigure ) : MAKEINTRESOURCE( DID_IC_IsdnConfigureMlink ), hwndOwner, IcDlgProc, (LPARAM )&args ); if (nStatus == -1) { ErrorDlg( hwndOwner, SID_OP_LoadDlg, ERROR_UNKNOWN, NULL ); nStatus = FALSE; } return (BOOL )nStatus; } INT_PTR CALLBACK IcDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) // DialogProc callback for the ISDN Configure dialog. Parameters and // return value are as described for standard windows 'DialogProc's. // { #if 0 TRACE4( "IcDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD )hwnd, (DWORD )unMsg, (DWORD )wparam, (DWORD )lparam ); #endif switch (unMsg) { case WM_INITDIALOG: { return IcInit( hwnd, (ICARGS* )lparam ); } case WM_HELP: case WM_CONTEXTMENU: { ContextHelp( g_adwIcHelp, hwnd, unMsg, wparam, lparam ); break; } case WM_COMMAND: { return IcCommand( hwnd, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } case WM_DESTROY: { IcTerm( hwnd ); break; } } return FALSE; } BOOL IcCommand( IN HWND hwnd, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) // Called on WM_COMMAND. 'Hwnd' is the dialog window. 'WNotification' is // the notification code of the command. 'wId' is the control/menu // identifier of the command. 'HwndCtrl' is the control window handle of // the command. // // Returns true if processed message, false otherwise. // { DWORD dwErr; TRACE3( "IcCommand(n=%d,i=%d,c=$%x)", (DWORD )wNotification, (DWORD )wId, (ULONG_PTR )hwndCtrl ); switch (wId) { case CID_IC_CB_DownLevel: { if (wNotification == BN_CLICKED) { BOOL fCheck; ICINFO* pInfo; pInfo = (ICINFO* )GetWindowLongPtr( hwnd, DWLP_USER ); ASSERT( pInfo ); if (pInfo->pArgs->fShowProprietary) { fCheck = Button_GetCheck( pInfo->hwndCbProprietary ); EnableWindow( pInfo->hwndCbCompression, fCheck ); EnableWindow( pInfo->hwndStChannels, fCheck ); EnableWindow( pInfo->hwndEbChannels, fCheck ); EnableWindow( pInfo->hwndUdChannels, fCheck ); } } return TRUE; } case IDOK: { ICINFO* pInfo; INT iSel; TRACE( "OK pressed" ); pInfo = (ICINFO* )GetWindowLongPtr( hwnd, DWLP_USER ); ASSERT( pInfo ); iSel = ComboBox_GetCurSel( pInfo->hwndLbLineType ); if (iSel >= 0) { pInfo->pArgs->pLink->lLineType = iSel; } pInfo->pArgs->pLink->fFallback = Button_GetCheck( pInfo->hwndCbFallback ); pInfo->pArgs->pLink->fProprietaryIsdn = Button_GetCheck( pInfo->hwndCbProprietary ); if (pInfo->pArgs->fShowProprietary) { BOOL f; UINT unValue; pInfo->pArgs->pLink->fCompression = Button_GetCheck( pInfo->hwndCbCompression ); unValue = GetDlgItemInt( pInfo->hwndDlg, CID_IC_EB_Channels, &f, FALSE ); if (f && unValue >= 1 && unValue <= 999999999) { pInfo->pArgs->pLink->lChannels = unValue; } } EndDialog( pInfo->hwndDlg, TRUE ); return TRUE; } case IDCANCEL: { TRACE( "Cancel pressed" ); EndDialog( hwnd, FALSE ); return TRUE; } } return FALSE; } BOOL IcInit( IN HWND hwndDlg, IN ICARGS* pArgs ) // Called on WM_INITDIALOG. 'hwndDlg' is the handle of the owning window. // 'PArgs' is the caller's stub API arguments. // // Return false if focus was set, true otherwise, i.e. as defined for // WM_INITDIALOG. // { DWORD dwErr; ICINFO* pInfo; TRACE( "IcInit" ); // Allocate the dialog context block. Initialize minimally for proper // cleanup, then attach to the dialog window. // { pInfo = Malloc( sizeof(*pInfo) ); if (!pInfo) { ErrorDlg( hwndDlg, SID_OP_LoadDlg, ERROR_NOT_ENOUGH_MEMORY, NULL ); EndDialog( hwndDlg, FALSE ); return TRUE; } ZeroMemory( pInfo, sizeof(*pInfo) ); pInfo->pArgs = pArgs; pInfo->hwndDlg = hwndDlg; SetWindowLongPtr( hwndDlg, DWLP_USER, (ULONG_PTR )pInfo ); TRACE( "Context set" ); } pInfo->hwndLbLineType = GetDlgItem( hwndDlg, CID_IC_LB_LineType ); ASSERT( pInfo->hwndLbLineType ); pInfo->hwndCbFallback = GetDlgItem( hwndDlg, CID_IC_CB_Fallback ); ASSERT( pInfo->hwndCbFallback ); if (pArgs->fShowProprietary) { pInfo->hwndCbProprietary = GetDlgItem( hwndDlg, CID_IC_CB_DownLevel ); ASSERT( pInfo->hwndCbProprietary ); pInfo->hwndCbCompression = GetDlgItem( hwndDlg, CID_IC_CB_Compression ); ASSERT( pInfo->hwndCbCompression ); pInfo->hwndStChannels = GetDlgItem( hwndDlg, CID_IC_ST_Channels ); ASSERT( pInfo->hwndStChannels ); pInfo->hwndEbChannels = GetDlgItem( hwndDlg, CID_IC_EB_Channels ); ASSERT( pInfo->hwndEbChannels ); } // Initialize fields. // ComboBox_AddItemFromId( g_hinstDll, pInfo->hwndLbLineType, SID_IsdnLineType0, NULL ); ComboBox_AddItemFromId( g_hinstDll, pInfo->hwndLbLineType, SID_IsdnLineType1, NULL ); ComboBox_AddItemFromId( g_hinstDll, pInfo->hwndLbLineType, SID_IsdnLineType2, NULL ); ComboBox_SetCurSel( pInfo->hwndLbLineType, pArgs->pLink->lLineType ); Button_SetCheck( pInfo->hwndCbFallback, pArgs->pLink->fFallback ); if (pArgs->fShowProprietary) { // Send click to triggle window enable update. // Button_SetCheck( pInfo->hwndCbProprietary, !pArgs->pLink->fProprietaryIsdn ); SendMessage( pInfo->hwndCbProprietary, BM_CLICK, 0, 0 ); Button_SetCheck( pInfo->hwndCbCompression, pArgs->pLink->fCompression ); pInfo->hwndUdChannels = CreateUpDownControl( WS_CHILD + WS_VISIBLE + WS_BORDER + UDS_SETBUDDYINT + UDS_ALIGNRIGHT + UDS_NOTHOUSANDS + UDS_ARROWKEYS, 0, 0, 0, 0, hwndDlg, 100, g_hinstDll, pInfo->hwndEbChannels, UD_MAXVAL, 1, 0 ); ASSERT( pInfo->hwndUdChannels ); Edit_LimitText( pInfo->hwndEbChannels, 9 ); SetDlgItemInt( hwndDlg, CID_IC_EB_Channels, pArgs->pLink->lChannels, FALSE ); } // Position the dialog centered on the owner window. // CenterWindow( hwndDlg, GetParent( hwndDlg ) ); // Add context help button to title bar. // AddContextHelpButton( hwndDlg ); return TRUE; } VOID IcTerm( IN HWND hwndDlg ) // Dialog termination. Releases the context block. 'HwndDlg' is the // handle of a dialog. // { ICINFO* pInfo; TRACE( "IcTerm" ); pInfo = (ICINFO* )GetWindowLongPtr( hwndDlg, DWLP_USER ); if (pInfo) { Free( pInfo ); TRACE( "Context freed" ); } } //---------------------------------------------------------------------------- // Modem configuration dialog // Listed alphabetically following stub API and dialog proc //---------------------------------------------------------------------------- BOOL ModemConfigureDlg( IN HWND hwndOwner, IN PBLINK* pLink, IN BOOL fRouter) // Popup the modem configuration dialog. 'HwndOwner' is the owner of the // dialog. 'PLink' is the link to edit. // // Returns true if user pressed OK and succeeded, false if user pressed // Cancel or encountered an error. // { INT_PTR nStatus; MC_INIT_INFO InitInfo; TRACE( "ModemConfigureDlg" ); ZeroMemory(&InitInfo, sizeof(InitInfo)); InitInfo.pLink = pLink; InitInfo.fRouter = fRouter; nStatus = (BOOL )DialogBoxParam( g_hinstDll, MAKEINTRESOURCE( DID_MC_ModemConfigure ), hwndOwner, McDlgProc, (LPARAM ) &InitInfo ); if (nStatus == -1) { ErrorDlg( hwndOwner, SID_OP_LoadDlg, ERROR_UNKNOWN, NULL ); nStatus = FALSE; } return (BOOL )nStatus; } INT_PTR CALLBACK McDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) // DialogProc callback for the Modem Settings dialog. Parameters and // return value are as described for standard windows 'DialogProc's. // { #if 0 TRACE4( "McDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD )hwnd, (DWORD )unMsg, (DWORD )wparam, (DWORD )lparam ); #endif switch (unMsg) { case WM_INITDIALOG: { return McInit( hwnd, (MC_INIT_INFO* )lparam ); } case WM_HELP: case WM_CONTEXTMENU: { ContextHelp( g_adwMcHelp, hwnd, unMsg, wparam, lparam ); break; } case WM_COMMAND: { return McCommand( hwnd, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } case WM_DESTROY: { McTerm( hwnd ); break; } } return FALSE; } BOOL McCommand( IN HWND hwnd, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) // Called on WM_COMMAND. 'Hwnd' is the dialog window. 'WNotification' is // the notification code of the command. 'wId' is the control/menu // identifier of the command. 'HwndCtrl' is the control window handle of // the command. // // Returns true if processed message, false otherwise. // { DWORD dwErr; TRACE3( "McCommand(n=%d,i=%d,c=$%x)", (DWORD )wNotification, (DWORD )wId, (ULONG_PTR )hwndCtrl ); switch (wId) { case CID_MC_CB_FlowControl: { if (wNotification == BN_CLICKED) { MCINFO* pInfo = (MCINFO* )GetWindowLongPtr( hwnd, DWLP_USER ); ASSERT( pInfo ); if (!Button_GetCheck( pInfo->hwndCbHwFlow )) { Button_SetCheck( pInfo->hwndCbEc, FALSE ); Button_SetCheck( pInfo->hwndCbEcc, FALSE ); } return TRUE; } break; } case CID_MC_CB_ErrorControl: { if (wNotification == BN_CLICKED) { MCINFO* pInfo = (MCINFO* )GetWindowLongPtr( hwnd, DWLP_USER ); ASSERT( pInfo ); if (Button_GetCheck( pInfo->hwndCbEc )) { Button_SetCheck( pInfo->hwndCbHwFlow, TRUE ); } else { Button_SetCheck( pInfo->hwndCbEcc, FALSE ); } return TRUE; } break; } case CID_MC_CB_Compression: { if (wNotification == BN_CLICKED) { MCINFO* pInfo = (MCINFO* )GetWindowLongPtr( hwnd, DWLP_USER ); ASSERT( pInfo ); if (Button_GetCheck( pInfo->hwndCbEcc )) { Button_SetCheck( pInfo->hwndCbHwFlow, TRUE ); Button_SetCheck( pInfo->hwndCbEc, TRUE ); } return TRUE; } break; } case IDOK: { MCINFO* pInfo; PBLINK* pLink; BOOL fScriptBefore = FALSE; TRACE( "OK pressed" ); pInfo = (MCINFO* )GetWindowLongPtr( hwnd, DWLP_USER ); ASSERT( pInfo ); pLink = pInfo->pLink; pLink->dwBps = (DWORD)ComboBox_GetItemData( pInfo->hwndLbBps, (INT)ComboBox_GetCurSel( pInfo->hwndLbBps ) ); pLink->fHwFlow = Button_GetCheck( pInfo->hwndCbHwFlow ); pLink->fEc = Button_GetCheck( pInfo->hwndCbEc ); pLink->fEcc = Button_GetCheck( pInfo->hwndCbEcc ); pLink->fSpeaker = Button_GetCheck( pInfo->hwndCbEnableSpeaker ); // pmay: 228565 // Find the selected modem protocol // if (IsWindowEnabled( pInfo->hwndLbModemProtocols )) { DTLNODE* pNode; INT iSel; iSel = ComboBox_GetCurSel( pInfo->hwndLbModemProtocols ); pNode = (DTLNODE*) ComboBox_GetItemDataPtr(pInfo->hwndLbModemProtocols, iSel); if ( pNode ) { pLink->dwModemProtocol = (DWORD) DtlGetNodeId( pNode ); } } Free0( pLink->pbport.pszScriptBefore ); // Whistler bug: 308135 Dialup Scripting: Pre-Dial scripts can be // selected but are not executed // SuGetInfo( &pInfo->suinfo, &fScriptBefore, &pLink->pbport.fScriptBeforeTerminal, NULL ); EndDialog( pInfo->hwndDlg, TRUE ); return TRUE; } case IDCANCEL: { TRACE( "Cancel pressed" ); EndDialog( hwnd, FALSE ); return TRUE; } } return FALSE; } BOOL McInit( IN HWND hwndDlg, IN MC_INIT_INFO* pInitInfo ) // Called on WM_INITDIALOG. 'hwndDlg' is the handle of the owning window. // 'PLink' is the link information to be edited. // // Return false if focus was set, true otherwise, i.e. as defined for // WM_INITDIALOG. // { DWORD dwErr, dwFlags = 0; MCINFO* pInfo; PBLINK* pLink = pInitInfo->pLink; TRACE( "McInit" ); // Allocate the dialog context block. Initialize minimally for proper // cleanup, then attach to the dialog window. // { pInfo = Malloc( sizeof(*pInfo) ); if (!pInfo) { ErrorDlg( hwndDlg, SID_OP_LoadDlg, ERROR_NOT_ENOUGH_MEMORY, NULL ); EndDialog( hwndDlg, FALSE ); return TRUE; } ZeroMemory( pInfo, sizeof(*pInfo) ); pInfo->pLink = pInitInfo->pLink; pInfo->fRouter = pInitInfo->fRouter; pInfo->hwndDlg = hwndDlg; SetWindowLongPtr( hwndDlg, DWLP_USER, (ULONG_PTR )pInfo ); TRACE( "Context set" ); } pInfo->hwndEbModemValue = GetDlgItem( hwndDlg, CID_MC_EB_ModemValue ); ASSERT( pInfo->hwndEbModemValue ); pInfo->hwndLbBps = GetDlgItem( hwndDlg, CID_MC_LB_MaxBps ); ASSERT( pInfo->hwndLbBps ); pInfo->hwndCbHwFlow = GetDlgItem( hwndDlg, CID_MC_CB_FlowControl ); ASSERT( pInfo->hwndCbHwFlow ); pInfo->hwndCbEc = GetDlgItem( hwndDlg, CID_MC_CB_ErrorControl ); ASSERT( pInfo->hwndCbEc ); pInfo->hwndCbEcc = GetDlgItem( hwndDlg, CID_MC_CB_Compression ); ASSERT( pInfo->hwndCbEcc ); pInfo->hwndCbTerminal = GetDlgItem( hwndDlg, CID_MC_CB_Terminal ); ASSERT( pInfo->hwndCbTerminal ); pInfo->hwndCbEnableSpeaker = GetDlgItem( hwndDlg, CID_MC_CB_EnableSpeaker ); ASSERT( pInfo->hwndCbEnableSpeaker ); pInfo->hwndLbModemProtocols = GetDlgItem( hwndDlg, CID_MC_LB_ModemProtocol ); ASSERT( pInfo->hwndLbModemProtocols ); Button_SetCheck( pInfo->hwndCbHwFlow, pLink->fHwFlow ); Button_SetCheck( pInfo->hwndCbEc, pLink->fEc ); Button_SetCheck( pInfo->hwndCbEcc, pLink->fEcc ); Button_SetCheck( pInfo->hwndCbEnableSpeaker, pLink->fSpeaker ); // Fill in the modem name. // { TCHAR* psz; psz = DisplayPszFromDeviceAndPort( pLink->pbport.pszDevice, pLink->pbport.pszPort ); if (psz) { SetWindowText( pInfo->hwndEbModemValue, psz ); Free( psz ); } } // Fill in the BPS list. // { TCHAR szBps[ MAXLTOTLEN + 1 ]; DWORD* pdwBps; INT i; //Add 230400 for whistler bug 307879 // static DWORD adwBps[] = { 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 0 }; for (pdwBps = adwBps; *pdwBps; ++pdwBps) { LToT( *pdwBps, szBps, 10 ); i = ComboBox_AddString( pInfo->hwndLbBps, szBps ); ComboBox_SetItemData( pInfo->hwndLbBps, i, *pdwBps ); if (*pdwBps == pLink->dwBps) { ComboBox_SetCurSel( pInfo->hwndLbBps, i ); } } if (ComboBox_GetCurSel( pInfo->hwndLbBps ) < 0) { // Entry lists an unknown BPS rate. Add it to the end of the // list. // TRACE( "Irregular BPS" ); LToT( pLink->dwBps, szBps, 10 ); i = ComboBox_AddString( pInfo->hwndLbBps, szBps ); ComboBox_SetItemData( pInfo->hwndLbBps, i, pLink->dwBps ); ComboBox_SetCurSel( pInfo->hwndLbBps, i ); } } // Fill in the modem protocol list // { PBPORT* pPort = &(pLink->pbport); DTLNODE* pNode; WCHAR pszBuffer[64]; INT iItemSel = 0, iItem = 0; DbgPrint("pListProtocols=0x%x\n", pPort->pListProtocols); // Only fill in the modem protocol information // if it was supplied by the link // if ((pPort->pListProtocols) && (DtlGetNodes (pPort->pListProtocols)) ) { for (pNode = DtlGetFirstNode( pPort->pListProtocols ); pNode; pNode = DtlGetNextNode( pNode )) { iItem = ComboBox_AddItem( pInfo->hwndLbModemProtocols, (PWCHAR) DtlGetData(pNode), (VOID*) pNode); if (DtlGetNodeId(pNode) == (LONG_PTR)pLink->dwModemProtocol) { iItemSel = iItem; } } ComboBox_SetCurSelNotify( pInfo->hwndLbModemProtocols, iItemSel); } // Otherwise, disable the protocol selector // else { EnableWindow( pInfo->hwndLbModemProtocols, FALSE ); } } // Set up the before-dial scripting controls. // // Whistler bug 181371 re-enabled pre-dial scripting from Win2K // // Whistler bug: 308135 Dialup Scripting: Pre-Dial scripts can be selected // but are not executed // // We QFE'd re-enabling this for SP2. According to the Unimodem guys this // has never worked and isn't supported. I had test verify that even with // the SP2 fix on 2195, although the UI is re-enabled, the scripts fail. // dwFlags |= SU_F_DisableScripting; SuInit( &pInfo->suinfo, NULL, pInfo->hwndCbTerminal, NULL, NULL, NULL, dwFlags); pInfo->fSuInfoInitialized = TRUE; SuSetInfo( &pInfo->suinfo, FALSE, pLink->pbport.fScriptBeforeTerminal, NULL ); // Position the dialog centered on the owner window. // CenterWindow( hwndDlg, GetParent( hwndDlg ) ); // Add context help button to title bar. // AddContextHelpButton( hwndDlg ); // Set focust to Bps since the default focus in the not very useful device // name. // SetFocus( pInfo->hwndLbBps ); return FALSE; } VOID McTerm( IN HWND hwndDlg ) // Dialog termination. Releases the context block. 'HwndDlg' is the // handle of a dialog. // { MCINFO* pInfo; TRACE( "McTerm" ); pInfo = (MCINFO* )GetWindowLongPtr( hwndDlg, DWLP_USER ); if (pInfo) { if (pInfo->fSuInfoInitialized) { SuFree( &pInfo->suinfo ); } Free( pInfo ); TRACE( "Context freed" ); } } //---------------------------------------------------------------------------- // X.25 Logon Settings dialog routines // Listed alphabetically following entrypoint and dialog proc //---------------------------------------------------------------------------- BOOL X25LogonSettingsDlg( IN HWND hwndOwner, IN BOOL fLocalPad, IN OUT PBENTRY* pEntry ) // Popup a dialog to set X.25 logon settings for phonebook entry 'pEntry'. // 'HwndOwner' is the owning window. 'FLocalPad' is set when the selected // device is a local X.25 PAD device. // // Returns true if user pressed OK and succeeded or false on Cancel or // error. // { INT_PTR nStatus; XSARGS args; TRACE( "X25LogonSettingsDlg" ); args.fLocalPad = fLocalPad; args.pEntry = pEntry; nStatus = DialogBoxParam( g_hinstDll, MAKEINTRESOURCE( DID_XS_X25Settings ), hwndOwner, XsDlgProc, (LPARAM )&args ); if (nStatus == -1) { ErrorDlg( hwndOwner, SID_OP_LoadDlg, ERROR_UNKNOWN, NULL ); nStatus = FALSE; } return (BOOL )nStatus; } INT_PTR CALLBACK XsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) // DialogProc callback for the X.25 Logon Settings dialog. Parameters and // return value are as described for standard windows 'DialogProc's. // { #if 0 TRACE4( "XsDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD )hwnd, (DWORD )unMsg, (DWORD )wparam, (DWORD )lparam ); #endif switch (unMsg) { case WM_INITDIALOG: { return XsInit( hwnd, (XSARGS* )lparam ); } case WM_HELP: case WM_CONTEXTMENU: { ContextHelp( g_adwXsHelp, hwnd, unMsg, wparam, lparam ); break; } case WM_COMMAND: { XSINFO* pInfo = (XSINFO* )GetWindowLongPtr( hwnd, DWLP_USER ); ASSERT( pInfo ); return XsCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } case WM_DESTROY: { XsTerm( hwnd ); break; } } return FALSE; } BOOL XsCommand( IN XSINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) // Called on WM_COMMAND. 'PInfo' is the dialog context. 'WNotification' // is the notification code of the command. 'wId' is the control/menu // identifier of the command. 'HwndCtrl' is the control window handle of // the command. // // Returns true if processed message, false otherwise. // { TRACE3( "XsCommand(n=%d,i=%d,c=$%x)", (DWORD )wNotification, (DWORD )wId, (ULONG_PTR )hwndCtrl ); switch (wId) { case IDOK: { EndDialog( pInfo->hwndDlg, XsSave( pInfo ) ); return TRUE; } case IDCANCEL: { TRACE( "Cancel pressed" ); EndDialog( pInfo->hwndDlg, FALSE ); return TRUE; } } return FALSE; } VOID XsFillPadsList( IN XSINFO* pInfo ) // Fill PADs list and selects the PAD from user's entry. 'PInfo' is the // dialog context. // { DWORD dwErr; DTLNODE* pNode; PBENTRY* pEntry; INT nIndex; TRACE( "XsFillPadsList" ); // Add the "(none)" item. // ComboBox_AddItemFromId( g_hinstDll, pInfo->hwndLbNetworks, SID_NoneSelected, NULL ); ComboBox_SetCurSel( pInfo->hwndLbNetworks, 0 ); if (!pInfo->pArgs->fLocalPad) { DTLLIST* pListPads; dwErr = LoadPadsList( &pListPads ); if (dwErr != 0) { ErrorDlg( pInfo->hwndDlg, SID_OP_LoadX25Info, dwErr, NULL ); return; } pEntry = pInfo->pArgs->pEntry; for (pNode = DtlGetFirstNode( pListPads ); pNode; pNode = DtlGetNextNode( pNode )) { TCHAR* psz; psz = (TCHAR* )DtlGetData( pNode ); nIndex = ComboBox_AddString( pInfo->hwndLbNetworks, psz ); if (pEntry->pszX25Network && lstrcmp( psz, pEntry->pszX25Network ) == 0) { ComboBox_SetCurSel( pInfo->hwndLbNetworks, nIndex ); } } DtlDestroyList( pListPads, DestroyPszNode ); if (pEntry->pszX25Network && ComboBox_GetCurSel( pInfo->hwndLbNetworks ) == 0) { // The PAD from the phonebook entry is not in the PAD list. Add // it and select it. // nIndex = ComboBox_AddString( pInfo->hwndLbNetworks, pEntry->pszX25Network ); ComboBox_SetCurSel( pInfo->hwndLbNetworks, nIndex ); } } ComboBox_AutoSizeDroppedWidth( pInfo->hwndLbNetworks ); } BOOL XsInit( IN HWND hwndDlg, IN XSARGS* pArgs ) // Called on WM_INITDIALOG. 'HwndDlg' is the handle of the phonebook // dialog window. 'PArgs' is caller's arguments as passed to the stub // API. // // Return false if focus was set, true otherwise, i.e. as defined for // WM_INITDIALOG. // { DWORD dwErr; XSINFO* pInfo; PBENTRY* pEntry; TRACE( "XsInit" ); // Allocate the dialog context block. Initialize minimally for proper // cleanup, then attach to the dialog window. // { pInfo = Malloc( sizeof(*pInfo) ); if (!pInfo) { ErrorDlg( hwndDlg, SID_OP_LoadDlg, ERROR_NOT_ENOUGH_MEMORY, NULL ); EndDialog( hwndDlg, FALSE ); return TRUE; } ZeroMemory( pInfo, sizeof(*pInfo) ); pInfo->pArgs = pArgs; pInfo->hwndDlg = hwndDlg; SetWindowLongPtr( hwndDlg, DWLP_USER, (ULONG_PTR )pInfo ); TRACE( "Context set" ); } pInfo->hwndLbNetworks = GetDlgItem( hwndDlg, CID_XS_LB_Networks ); ASSERT( pInfo->hwndLbNetworks ); pInfo->hwndEbAddress = GetDlgItem( hwndDlg, CID_XS_EB_Address ); ASSERT( pInfo->hwndEbAddress ); pInfo->hwndEbUserData = GetDlgItem( hwndDlg, CID_XS_EB_UserData ); ASSERT( pInfo->hwndEbUserData ); pInfo->hwndEbFacilities = GetDlgItem( hwndDlg, CID_XS_EB_Facilities ); ASSERT( pInfo->hwndEbFacilities ); XsFillPadsList( pInfo ); pEntry = pArgs->pEntry; Edit_LimitText( pInfo->hwndEbAddress, RAS_MaxX25Address ); if (pEntry->pszX25Address) { SetWindowText( pInfo->hwndEbAddress, pEntry->pszX25Address ); } Edit_LimitText( pInfo->hwndEbUserData, RAS_MaxUserData ); if (pEntry->pszX25UserData) { SetWindowText( pInfo->hwndEbUserData, pEntry->pszX25UserData ); } Edit_LimitText( pInfo->hwndEbFacilities, RAS_MaxFacilities ); if (pEntry->pszX25Facilities) { SetWindowText( pInfo->hwndEbFacilities, pEntry->pszX25Facilities ); } // Center dialog on the owner window. // CenterWindow( hwndDlg, GetParent( hwndDlg ) ); // Add context help button to title bar. // AddContextHelpButton( hwndDlg ); if (pArgs->fLocalPad) { // No point in setting focus to "X.25 Network" on local PAD, so set to // X.25 Address field instead. // SetFocus( pInfo->hwndEbAddress ); Edit_SetSel( pInfo->hwndEbAddress, 0, -1 ); return FALSE; } return TRUE; } BOOL XsSave( IN XSINFO* pInfo ) // Load the contents of the dialog into caller's stub API output argument. // 'PInfo' is the dialog context. // // Returns true if succesful, false otherwise. // { INT iPadSelection; PBENTRY* pEntry; TRACE( "XsSave" ); pEntry = pInfo->pArgs->pEntry; iPadSelection = ComboBox_GetCurSel( pInfo->hwndLbNetworks ); Free0( pEntry->pszX25Network ); if (iPadSelection > 0) { pEntry->pszX25Network = GetText( pInfo->hwndLbNetworks ); } else { pEntry->pszX25Network = NULL; } Free0( pEntry->pszX25Address ); pEntry->pszX25Address = GetText( pInfo->hwndEbAddress ); Free0( pEntry->pszX25UserData ); pEntry->pszX25UserData = GetText( pInfo->hwndEbUserData ); Free0( pEntry->pszX25Facilities ); pEntry->pszX25Facilities = GetText( pInfo->hwndEbFacilities ); pEntry->fDirty = TRUE; if (!pEntry->pszX25Address || !pEntry->pszX25UserData || !pEntry->pszX25Facilities) { Free0( pEntry->pszX25Address ); Free0( pEntry->pszX25UserData ); ErrorDlg( pInfo->hwndDlg, SID_OP_RetrievingData, ERROR_NOT_ENOUGH_MEMORY, NULL ); return FALSE; } return TRUE; } VOID XsTerm( IN HWND hwndDlg ) // Dialog termination. Releases the context block. 'HwndDlg' is the // handle of a dialog. // { XSINFO* pInfo; TRACE( "XsTerm" ); pInfo = (XSINFO* )GetWindowLongPtr( hwndDlg, DWLP_USER ); if (pInfo) { Free( pInfo ); TRACE( "Context freed" ); } }