Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1355 lines
31 KiB

/*==========================================================================
*
* Copyright (C) 1998-2000 Microsoft Corporation. All Rights Reserved.
*
* File: ComPortUI.cpp
* Content: Serial service provider UI functions
*
*
* History:
* Date By Reason
* ==== == ======
* 03/24/99 jtk Created
***************************************************************************/
#include "dnmdmi.h"
//**********************************************************************
// Constant definitions
//**********************************************************************
//
// default size of temp strings used to add stuff to dialog
//
#define DEFAULT_DIALOG_STRING_SIZE 100
#define DEFAULT_DEVICE_SELECTION_INDEX 0
#define DEFAULT_BAUD_RATE_SELECTION_INDEX 11
#define DEFAULT_STOP_BITS_SELECTION_INDEX 0
#define DEFAULT_PARITY_SELECTION_INDEX 0
#define DEFAULT_FLOW_CONTROL_SELECTION_INDEX 0
//
// expected return from comport dialog
//
static const INT_PTR g_iExpectedComPortDialogReturn = 0x12345678;
//**********************************************************************
// Macro definitions
//**********************************************************************
//**********************************************************************
// Structure definitions
//**********************************************************************
//**********************************************************************
// Variable definitions
//**********************************************************************
//**********************************************************************
// Function prototypes
//**********************************************************************
static INT_PTR CALLBACK SettingsDialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
static HRESULT SetDialogDevice( const HWND hDlg, const CModemEndpoint *const pComEndpoint );
static HRESULT SetDialogBaudRate( const HWND hDlg, const CModemEndpoint *const pComEndpoint );
static HRESULT SetDialogStopBits( const HWND hDlg, const CModemEndpoint *const pComEndpoint );
static HRESULT SetDialogParity( const HWND hDlg, const CModemEndpoint *const pComEndpoint );
static HRESULT SetDialogFlowControl( const HWND hDlg, const CModemEndpoint *const pComEndpoint );
static HRESULT GetDialogData( const HWND hDlg, CModemEndpoint *const pComEndpoint );
//**********************************************************************
// Function definitions
//**********************************************************************
//**********************************************************************
// ------------------------------
// DisplayComPortDialog - dialog for comport settings
//
// Entry: Pointer to CModemEndpoint
//
// Exit: Nothing
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "DisplayComPortSettingsDialog"
void DisplayComPortSettingsDialog( void *const pContext )
{
INT_PTR iDlgReturn;
CModemEndpoint *pComEndpoint;
DNASSERT( pContext != NULL );
//
// intialize
//
pComEndpoint = static_cast<CModemEndpoint*>( pContext );
DBG_CASSERT( sizeof( pComEndpoint ) == sizeof( LPARAM ) );
SetLastError( ERROR_SUCCESS );
iDlgReturn = DialogBoxParam( g_hModemDLLInstance, // handle of module for resources
MAKEINTRESOURCE( IDD_SERIAL_SETTINGS ), // resource for dialog
NULL, // parent (none)
SettingsDialogProc, // dialog message proc
reinterpret_cast<LPARAM>( pComEndpoint ) // startup parameter
);
if ( iDlgReturn != g_iExpectedComPortDialogReturn )
{
DWORD dwError;
dwError = GetLastError();
DPFX(DPFPREP, 0, "Failed to start comport settings dialog!" );
DisplayErrorCode( 0, dwError );
pComEndpoint->SettingsDialogComplete( DPNERR_OUTOFMEMORY );
}
return;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// StopComPortSettingsDialog - stop dialog dialog for serial settings
//
// Entry: Handle of dialog
//
// Exit: Nothing
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "StopComPortSettingsDialog"
void StopComPortSettingsDialog( const HWND hDlg )
{
DNASSERT( hDlg != NULL );
if ( PostMessage( hDlg, WM_COMMAND, MAKEWPARAM( IDCANCEL, NULL ), NULL ) == 0 )
{
DWORD dwError;
dwError = GetLastError();
DPFX(DPFPREP, 0, "Failed to stop dialog!" );
DisplayErrorCode( 0, dwError );
DNASSERT( FALSE );
}
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// SettingsDialogProc - dialog proc serial settings
//
// Entry: Window handle
// Message
// Message LPARAM
// Message WPARAM
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "SettingsDialogProc"
static INT_PTR CALLBACK SettingsDialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
HRESULT hr;
CModemEndpoint *pComEndpoint;
//
// initialize
//
hr = DPN_OK;
pComEndpoint = NULL;
//
// note the active comport pointer
//
DBG_CASSERT( sizeof( pComEndpoint ) == sizeof( ULONG_PTR ) );
pComEndpoint = reinterpret_cast<CModemEndpoint*>( GetWindowLongPtr( hDlg, GWLP_USERDATA ) );
switch ( uMsg )
{
// initialize dialog
case WM_INITDIALOG:
{
//
// since this is the first dialog message, the default code to set
// pComEndpoint didn't get valid data so we need to update the pointer
//
DBG_CASSERT( sizeof( pComEndpoint ) == sizeof( lParam ) );
pComEndpoint = reinterpret_cast<CModemEndpoint*>( lParam );
pComEndpoint->SetActiveDialogHandle( hDlg );
//
// SetWindowLong() returns NULL in case of error. It's possible that
// the old value from SetWindowLong() was really NULL in which case it's not
// an error. To be safe, clear any residual error code before calling
// SetWindowLong().
//
SetLastError( 0 );
if ( SetWindowLongPtr( hDlg, GWLP_USERDATA, lParam ) == NULL )
{
DWORD dwError;
dwError = GetLastError();
if ( dwError != ERROR_SUCCESS )
{
DPFX(DPFPREP, 0, "Problem setting user data for window!" );
DisplayErrorCode( 0, dwError );
hr = DPNERR_GENERIC;
goto Failure;
}
}
//
// set dialog parameters
//
hr = SetDialogDevice( hDlg, pComEndpoint );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Problem setting device in WM_INITDIALOG!" );
DisplayDNError( 0, hr );
goto Failure;
}
hr = SetDialogBaudRate( hDlg, pComEndpoint );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Problem setting baud rate in WM_INITDIALOG!" );
DisplayDNError( 0, hr );
goto Failure;
}
hr = SetDialogStopBits( hDlg, pComEndpoint );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Problem setting stop bits in WM_INITDIALOG!" );
DisplayDNError( 0, hr );
goto Failure;
}
hr = SetDialogParity( hDlg, pComEndpoint );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Problem setting parity in WM_INITDIALOG!" );
DisplayDNError( 0, hr );
goto Failure;
}
hr = SetDialogFlowControl( hDlg, pComEndpoint );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Problem setting flow control in WM_INITDIALOG!" );
DisplayDNError( 0, hr );
goto Failure;
}
return TRUE;
break;
}
// a control did something
case WM_COMMAND:
{
// what was the control?
switch ( LOWORD( wParam ) )
{
case IDOK:
{
hr = GetDialogData( hDlg, pComEndpoint );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Problem getting UI data!" );
DisplayDNError( 0, hr );
goto Failure;
}
// pass any error code on to 'DialogComplete'
pComEndpoint->SettingsDialogComplete( hr );
EndDialog( hDlg, g_iExpectedComPortDialogReturn );
break;
}
case IDCANCEL:
{
pComEndpoint->SettingsDialogComplete( DPNERR_USERCANCEL );
EndDialog( hDlg, g_iExpectedComPortDialogReturn );
break;
}
default:
{
break;
}
}
break;
}
// window is closing
case WM_CLOSE:
{
break;
}
}
Exit:
return FALSE;
Failure:
DNASSERT( pComEndpoint != NULL );
DNASSERT( hr != DPN_OK );
pComEndpoint->SettingsDialogComplete( hr );
EndDialog( hDlg, g_iExpectedComPortDialogReturn );
goto Exit;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// SetDialogDevice - set serial device field
//
// Entry: Window handle
// Pointer to ComEndpoint
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "SetDialogDevice"
static HRESULT SetDialogDevice( const HWND hDlg, const CModemEndpoint *const pComEndpoint )
{
HRESULT hr;
UINT_PTR uIndex;
BOOL fPortAvailable[ MAX_DATA_PORTS ];
DWORD dwPortCount;
TCHAR TempBuffer[ DEFAULT_DIALOG_STRING_SIZE ];
BOOL fSelectionSet;
HWND hSerialDeviceComboBox;
//
// initialize
//
hr = DPN_OK;
fSelectionSet = FALSE;
hSerialDeviceComboBox = GetDlgItem( hDlg, IDC_COMBO_SERIAL_DEVICE );
if ( hSerialDeviceComboBox == NULL )
{
DWORD dwError;
hr = DPNERR_GENERIC;
dwError = GetLastError();
DPFX(DPFPREP, 0, "Problem getting handle of serial device combo box!" );
DisplayErrorCode( 0, dwError );
goto Failure;
}
//
// get list of available com ports
//
hr = GenerateAvailableComPortList( fPortAvailable, ( LENGTHOF( fPortAvailable ) - 1 ), &dwPortCount );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Problem generating vaild port list!" );
DisplayDNError( 0, hr );
goto Failure;
}
//
// add all strings to dialog
//
uIndex = LENGTHOF( fPortAvailable );
while ( uIndex > 0 )
{
LRESULT lSendReturn;
uIndex--;
//
// only output all adapters on incoming settings
//
if ( fPortAvailable[ uIndex ] != FALSE )
{
DNASSERT( uIndex != 0 ); // ALL_ADAPTERS is not valid!
ComDeviceIDToString( TempBuffer, uIndex );
DBG_CASSERT( sizeof( &TempBuffer[ 0 ] ) == sizeof( LPARAM ) );
lSendReturn = SendMessage( hSerialDeviceComboBox, CB_INSERTSTRING, 0, reinterpret_cast<LPARAM>( TempBuffer ) );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem adding serial device to combo box!" );
goto Failure;
break;
}
case CB_ERRSPACE:
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Out of memory when ading serial device to combo box!" );
goto Failure;
break;
}
//
// we added the string OK, set the associated device id and check
// to see if this is the current value to set selection
//
default:
{
LRESULT lTempReturn;
lTempReturn = SendMessage ( hSerialDeviceComboBox, CB_SETITEMDATA, lSendReturn, uIndex );
if ( lTempReturn == CB_ERR )
{
DWORD dwError;
hr = DPNERR_OUTOFMEMORY;
dwError = GetLastError();
DPFX(DPFPREP, 0, "Problem setting device info!" );
DisplayErrorCode( 0, dwError );
goto Failure;
}
if ( pComEndpoint->GetDeviceID() == uIndex )
{
lTempReturn = SendMessage( hSerialDeviceComboBox, CB_SETCURSEL, lSendReturn, 0 );
switch ( lTempReturn )
{
case CB_ERR:
{
DWORD dwError;
hr = DPNERR_GENERIC;
dwError = GetLastError();
DPFX(DPFPREP, 0, "Problem setting default serial device selection!" );
DisplayErrorCode( 0, dwError );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
fSelectionSet = TRUE;
break;
}
}
}
break;
}
}
}
}
//
// was a selection set? If not, set default
//
if ( fSelectionSet == FALSE )
{
LRESULT lSendReturn;
DPFX(DPFPREP, 8, "Serial device not set, using default!" );
lSendReturn = SendMessage( hSerialDeviceComboBox, CB_SETCURSEL, DEFAULT_DEVICE_SELECTION_INDEX, 0 );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Cannot set default serial device selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
break;
}
}
}
Exit:
return hr;
Failure:
goto Exit;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// SetDialogBaudRate - set serial baud rate fields
//
// Entry: Window handle
// Pointer to com port
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "SetDialogBaudRate"
static HRESULT SetDialogBaudRate( const HWND hDlg, const CModemEndpoint *const pComEndpoint )
{
HRESULT hr;
UINT_PTR uIndex;
BOOL fSelectionSet;
HWND hBaudRateComboBox;
//
// initialize
//
hr = DPN_OK;
uIndex = g_dwBaudRateCount;
fSelectionSet = FALSE;
hBaudRateComboBox = GetDlgItem( hDlg, IDC_COMBO_SERIAL_BAUDRATE );
if ( hBaudRateComboBox == NULL )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem getting handle of serial baud rate combo box!" );
DisplayErrorCode( 0, GetLastError() );
goto Failure;
}
//
// add all strings to dialog
//
while ( uIndex > 0 )
{
LRESULT lSendReturn;
uIndex--;
DBG_CASSERT( sizeof( g_BaudRate[ uIndex ].pASCIIKey ) == sizeof( LPARAM ) );
lSendReturn = SendMessage( hBaudRateComboBox, CB_INSERTSTRING, 0, reinterpret_cast<LPARAM>( g_BaudRate[ uIndex ].szLocalizedKey ) );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem adding baud rate to combo box!" );
goto Failure;
break;
}
case CB_ERRSPACE:
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Out of memory adding baud rate to combo box!" );
goto Failure;
break;
}
default:
{
LRESULT lTempReturn;
//
// we added the string OK, attemt to set the item data and
// check to see if this is the current value
//
lTempReturn = SendMessage( hBaudRateComboBox, CB_SETITEMDATA, lSendReturn, g_BaudRate[ uIndex ].dwEnumValue );
if ( lTempReturn == CB_ERR )
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Failed to set baud rate item data!" );
goto Failure;
}
if ( pComEndpoint->GetBaudRate() == g_BaudRate[ uIndex ].dwEnumValue )
{
// set current selection to this item
lTempReturn = SendMessage( hBaudRateComboBox, CB_SETCURSEL, lSendReturn, 0 );
switch ( lTempReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem setting default serial baud rate selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
fSelectionSet = TRUE;
break;
}
}
}
break;
}
}
}
//
// was a selection set? If not, set default
//
if ( fSelectionSet == FALSE )
{
LRESULT lSendReturn;
DPFX(DPFPREP, 8, "Serial baud rate not set, using default!" );
lSendReturn = SendMessage( hBaudRateComboBox, CB_SETCURSEL, DEFAULT_BAUD_RATE_SELECTION_INDEX, 0 );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Cannot set default serial baud rate selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
break;
}
}
}
Exit:
return hr;
Failure:
goto Exit;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// SetDialogStopBits - set serial stop bits fields
//
// Entry: Window handle
// Pointer to ComEndpoint
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "SetDialogStopBits"
static HRESULT SetDialogStopBits( const HWND hDlg, const CModemEndpoint *const pComEndpoint )
{
HRESULT hr;
UINT_PTR uIndex;
BOOL fSelectionSet;
HWND hStopBitsComboBox;
//
// initialize
//
hr = DPN_OK;
uIndex = g_dwStopBitsCount;
fSelectionSet = FALSE;
hStopBitsComboBox = GetDlgItem( hDlg, IDC_COMBO_SERIAL_STOPBITS );
if ( hStopBitsComboBox == NULL )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem getting handle of serial stop bits combo box!" );
DisplayErrorCode( 0, GetLastError() );
goto Failure;
}
//
// add all strings to dialog
//
while ( uIndex > 0 )
{
LRESULT lSendReturn;
uIndex--;
DBG_CASSERT( sizeof( g_StopBits[ uIndex ].pASCIIKey ) == sizeof( LPARAM ) );
lSendReturn = SendMessage( hStopBitsComboBox, CB_INSERTSTRING, 0, reinterpret_cast<LPARAM>( g_StopBits[ uIndex ].szLocalizedKey ) );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem adding stop bits to combo box!" );
goto Failure;
break;
}
case CB_ERRSPACE:
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Out of memory adding stop bits to combo box!" );
goto Failure;
break;
}
default:
{
LRESULT lTempReturn;
//
// we added the string OK attempt to set the associated data and
// check to see if this is the current value
//
lTempReturn = SendMessage( hStopBitsComboBox, CB_SETITEMDATA, lSendReturn, g_StopBits[ uIndex ].dwEnumValue);
if ( lTempReturn == CB_ERR )
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Failed to set associated data for stop bits!" );
goto Failure;
}
if ( pComEndpoint->GetStopBits() == g_StopBits[ uIndex ].dwEnumValue )
{
// set current selection to this item
lTempReturn = SendMessage( hStopBitsComboBox, CB_SETCURSEL, lSendReturn, 0 );
switch ( lTempReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem setting default serial stop bits selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
fSelectionSet = TRUE;
break;
}
}
}
break;
}
}
}
//
// was a selection set? If not, set default
//
if ( fSelectionSet == FALSE )
{
LRESULT lSendReturn;
DPFX(DPFPREP, 8, "Serial stop bits not set, using default!" );
lSendReturn = SendMessage( hStopBitsComboBox, CB_SETCURSEL, DEFAULT_STOP_BITS_SELECTION_INDEX, 0 );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Cannot set default serial stop bits selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
break;
}
}
}
Exit:
return hr;
Failure:
goto Exit;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// SetDialogParity - set serial parity fields
//
// Entry: Window handle
// Pointer to ComEndpoint
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "SetDialogParity"
static HRESULT SetDialogParity( const HWND hDlg, const CModemEndpoint *const pComEndpoint )
{
HRESULT hr;
UINT_PTR uIndex;
BOOL fSelectionSet;
HWND hParityComboBox;
//
// initialize
//
hr = DPN_OK;
uIndex = g_dwParityCount;
fSelectionSet = FALSE;
hParityComboBox = GetDlgItem( hDlg, IDC_COMBO_SERIAL_PARITY );
if ( hParityComboBox == NULL )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem getting handle of serial parity combo box!" );
DisplayErrorCode( 0, GetLastError() );
goto Failure;
}
//
// add all strings to dialog
//
while ( uIndex > 0 )
{
LRESULT lSendReturn;
uIndex--;
DBG_CASSERT( sizeof( g_Parity[ uIndex ].pASCIIKey ) == sizeof( LPARAM ) );
lSendReturn = SendMessage( hParityComboBox, CB_INSERTSTRING, 0, reinterpret_cast<LPARAM>( g_Parity[ uIndex ].szLocalizedKey ) );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem adding parity to combo box!" );
goto Failure;
break;
}
case CB_ERRSPACE:
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Out of memory adding parity to combo box!" );
goto Failure;
break;
}
default:
{
LRESULT lTempReturn;
//
// we added the string OK, attempt to set the associated data and
// check to see if this is the current value
//
lTempReturn = SendMessage( hParityComboBox, CB_SETITEMDATA, lSendReturn, g_Parity[ uIndex ].dwEnumValue );
if ( lTempReturn == CB_ERR )
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Failed to set associated data for parity." );
goto Failure;
}
if ( pComEndpoint->GetParity() == g_Parity[ uIndex ].dwEnumValue )
{
//
// set current selection to this item
//
lTempReturn = SendMessage( hParityComboBox, CB_SETCURSEL, lSendReturn, 0 );
switch ( lTempReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem setting default serial parity selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
fSelectionSet = TRUE;
break;
}
}
}
break;
}
}
}
//
// was a selection set? If not, set default
//
if ( fSelectionSet == FALSE )
{
LRESULT lSendReturn;
DPFX(DPFPREP, 8, "Serial parity not set, using default!" );
lSendReturn = SendMessage( hParityComboBox, CB_SETCURSEL, DEFAULT_PARITY_SELECTION_INDEX, 0 );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Cannot set default serial parity selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
break;
}
}
}
Exit:
return hr;
Failure:
goto Exit;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// SetDialogFlowControl - set serial flow control
//
// Entry: Window handle
// Pointer to ComEndpoint
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "SetDialogFlowControl"
static HRESULT SetDialogFlowControl( const HWND hDlg, const CModemEndpoint *const pComEndpoint )
{
HRESULT hr;
UINT_PTR uIndex;
BOOL fSelectionSet;
HWND hFlowControlComboBox;
//
// initialize
//
hr = DPN_OK;
uIndex = g_dwFlowControlCount;
fSelectionSet = FALSE;
hFlowControlComboBox = GetDlgItem( hDlg, IDC_COMBO_SERIAL_FLOWCONTROL );
if ( hFlowControlComboBox == NULL )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem getting handle of serial flow control combo box!" );
DisplayErrorCode( 0, GetLastError() );
goto Failure;
}
//
// add all strings to dialog
//
while ( uIndex > 0 )
{
LRESULT lSendReturn;
uIndex--;
DBG_CASSERT( sizeof( g_FlowControl[ uIndex ].pASCIIKey ) == sizeof( LPARAM ) );
lSendReturn = SendMessage( hFlowControlComboBox, CB_INSERTSTRING, 0, reinterpret_cast<LPARAM>( g_FlowControl[ uIndex ].szLocalizedKey ) );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem adding flow control to combo box!" );
goto Failure;
break;
}
case CB_ERRSPACE:
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Out of memory adding flow control to combo box!" );
goto Failure;
break;
}
default:
{
LRESULT lTempReturn;
//
// we added the string OK, attempt to set the associated data and
// check to see if this is the current value
//
lTempReturn = SendMessage( hFlowControlComboBox, CB_SETITEMDATA, lSendReturn, g_FlowControl[ uIndex ].dwEnumValue );
if ( lTempReturn == CB_ERR )
{
hr = DPNERR_OUTOFMEMORY;
DPFX(DPFPREP, 0, "Failed to set associated data for flow control!" );
goto Failure;
}
if ( pComEndpoint->GetFlowControl() == static_cast<SP_FLOW_CONTROL>( g_FlowControl[ uIndex ].dwEnumValue ) )
{
// set current selection to this item
lTempReturn = SendMessage( hFlowControlComboBox, CB_SETCURSEL, lSendReturn, 0 );
switch ( lTempReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Problem setting default flow control selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
fSelectionSet = TRUE;
break;
}
}
}
break;
}
}
}
//
// was a selection set? If not, set default
//
if ( fSelectionSet == FALSE )
{
LRESULT lSendReturn;
DPFX(DPFPREP, 8, "Serial flow control not set, using default!" );
lSendReturn = SendMessage( hFlowControlComboBox, CB_SETCURSEL, DEFAULT_FLOW_CONTROL_SELECTION_INDEX, 0 );
switch ( lSendReturn )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Cannot set default serial flow control selection!" );
DisplayErrorCode( 0, GetLastError() );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
break;
}
}
}
Exit:
return hr;
Failure:
goto Exit;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// GetDialogData - set ComEndpoint data from serial dialog
//
// Entry: Window handle
// Pointer to ComEndpoint
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "GetDialogData"
static HRESULT GetDialogData( const HWND hDlg, CModemEndpoint *const pComEndpoint )
{
HRESULT hr;
LRESULT lSelection;
//
// initialize
//
hr = DPN_OK;
//
// get comm device
//
lSelection = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_DEVICE ), CB_GETCURSEL, 0, 0 );
switch ( lSelection )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to determine serial device selection!" );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
LRESULT lItemData;
HRESULT hTempResult;
lItemData = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_DEVICE ), CB_GETITEMDATA, lSelection, 0 );
if ( lItemData == CB_ERR )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to get associated device data!" );
DNASSERT( FALSE );
goto Failure;
}
DNASSERT( hr == DPN_OK );
DNASSERT( lItemData != 0 );
DNASSERT( lItemData <= UINT32_MAX );
hTempResult = pComEndpoint->SetDeviceID( static_cast<DWORD>( lItemData ) );
DNASSERT( hTempResult == DPN_OK );
break;
}
}
//
// get baud rate
//
lSelection = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_BAUDRATE ), CB_GETCURSEL, 0, 0 );
switch ( lSelection )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to determine serial baud rate selection!" );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
LRESULT lItemData;
HRESULT hTempResult;
DNASSERT( hr == DPN_OK );
lItemData = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_BAUDRATE ), CB_GETITEMDATA, lSelection, 0 );
if ( lItemData == CB_ERR )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to get associated baudrate data!" );
DNASSERT( FALSE );
goto Failure;
}
DNASSERT( lItemData <= UINT32_MAX );
hTempResult = pComEndpoint->SetBaudRate( static_cast<DWORD>( lItemData ) );
DNASSERT( hTempResult == DPN_OK );
break;
}
}
//
// get stop bits
//
lSelection = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_STOPBITS ), CB_GETCURSEL, 0, 0 );
switch ( lSelection )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to determine serial stop bits selection!" );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
LRESULT lItemData;
HRESULT hTempResult;
lItemData = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_STOPBITS ), CB_GETITEMDATA, lSelection, 0 );
if ( lItemData == CB_ERR )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to get associated stop bits data!" );
goto Failure;
}
DNASSERT( hr == DPN_OK );
DNASSERT( lItemData <= UINT32_MAX );
hTempResult = pComEndpoint->SetStopBits( static_cast<DWORD>( lItemData ) );
DNASSERT( hTempResult == DPN_OK );
break;
}
}
//
// get parity
//
lSelection = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_PARITY ), CB_GETCURSEL, 0, 0 );
switch ( lSelection )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to determine serial parity selection!" );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
LRESULT lItemData;
HRESULT hTempResult;
lItemData = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_PARITY ), CB_GETITEMDATA, lSelection, 0 );
if ( lItemData == CB_ERR )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to get associated parity data!" );
goto Failure;
}
DNASSERT( hr == DPN_OK );
DNASSERT( lItemData <= UINT32_MAX );
hTempResult = pComEndpoint->SetParity( static_cast<DWORD>( lItemData ) );
DNASSERT( hTempResult == DPN_OK );
break;
}
}
//
// get flow control
//
lSelection = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_FLOWCONTROL ), CB_GETCURSEL, 0, 0 );
switch ( lSelection )
{
case CB_ERR:
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to determine serial flow control selection!" );
DNASSERT( FALSE );
goto Failure;
break;
}
default:
{
LRESULT lItemData;
HRESULT hTempResult;
lItemData = SendMessage( GetDlgItem( hDlg, IDC_COMBO_SERIAL_FLOWCONTROL ), CB_GETITEMDATA, lSelection, 0 );
if ( lItemData == CB_ERR )
{
hr = DPNERR_GENERIC;
DPFX(DPFPREP, 0, "Failed to get associated flow control data!" );
goto Failure;
}
DNASSERT( hr == DPN_OK );
hTempResult = pComEndpoint->SetFlowControl( static_cast<SP_FLOW_CONTROL>( lItemData ) );
DNASSERT( hTempResult == DPN_OK );
break;
}
}
Exit:
return hr;
Failure:
goto Exit;
}
//**********************************************************************