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
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;
|
|
}
|
|
//**********************************************************************
|
|
|