|
|
// 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" ); } }
|