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.
 
 
 
 
 
 

1163 lines
33 KiB

/*==========================================================================
*
* Copyright (C) 1998-2000 Microsoft Corporation. All Rights Reserved.
*
* File: ComPortData.cpp
* Content: Serial communications port data management class
*
*
* History:
* Date By Reason
* ==== == ======
* 01/20/98 jtk Created
* 04/25/2000 jtk Derived from ComPort class
***************************************************************************/
#include "dnmdmi.h"
//**********************************************************************
// Constant definitions
//**********************************************************************
////
//// number of BITS in a serial BYTE
////
//#define BITS_PER_BYTE 8
//
////
//// maximum size of baud rate string
////
//#define MAX_BAUD_STRING_SIZE 7
//
////
//// default size of buffers when parsing
////
//#define DEFAULT_COMPONENT_BUFFER_SIZE 1000
//
////
//// device ID assigned to 'all adapters'
////
//#define ALL_ADAPTERS_DEVICE_ID 0
//
////
//// NULL token
////
//#define NULL_TOKEN '\0'
//**********************************************************************
// Macro definitions
//**********************************************************************
#define DPNA_BAUD_RATE_9600_W L"9600"
#define DPNA_BAUD_RATE_14400_W L"14400"
#define DPNA_BAUD_RATE_19200_W L"19200"
#define DPNA_BAUD_RATE_38400_W L"38400"
#define DPNA_BAUD_RATE_56000_W L"56000"
#define DPNA_BAUD_RATE_57600_W L"57600"
#define DPNA_BAUD_RATE_115200_W L"115200"
// values for baud rate
#define DPNA_BAUD_RATE_9600_A "9600"
#define DPNA_BAUD_RATE_14400_A "14400"
#define DPNA_BAUD_RATE_19200_A "19200"
#define DPNA_BAUD_RATE_38400_A "38400"
#define DPNA_BAUD_RATE_56000_A "56000"
#define DPNA_BAUD_RATE_57600_A "57600"
#define DPNA_BAUD_RATE_115200_A "115200"
//**********************************************************************
// Structure definitions
//**********************************************************************
//**********************************************************************
// Variable definitions
//**********************************************************************
//
// list of baud rates
//
STRING_BLOCK g_BaudRate[] =
{
{ CBR_9600, DPNA_BAUD_RATE_9600_W, ( LENGTHOF( DPNA_BAUD_RATE_9600_W ) - 1 ), DPNA_BAUD_RATE_9600_A, ( LENGTHOF( DPNA_BAUD_RATE_9600_A ) - 1 ) },
{ CBR_14400, DPNA_BAUD_RATE_14400_W, ( LENGTHOF( DPNA_BAUD_RATE_14400_W ) - 1 ), DPNA_BAUD_RATE_14400_A, ( LENGTHOF( DPNA_BAUD_RATE_14400_A ) - 1 ) },
{ CBR_19200, DPNA_BAUD_RATE_19200_W, ( LENGTHOF( DPNA_BAUD_RATE_19200_W ) - 1 ), DPNA_BAUD_RATE_19200_A, ( LENGTHOF( DPNA_BAUD_RATE_19200_A ) - 1 ) },
{ CBR_38400, DPNA_BAUD_RATE_38400_W, ( LENGTHOF( DPNA_BAUD_RATE_38400_W ) - 1 ), DPNA_BAUD_RATE_38400_A, ( LENGTHOF( DPNA_BAUD_RATE_38400_A ) - 1 ) },
{ CBR_56000, DPNA_BAUD_RATE_56000_W, ( LENGTHOF( DPNA_BAUD_RATE_56000_W ) - 1 ), DPNA_BAUD_RATE_56000_A, ( LENGTHOF( DPNA_BAUD_RATE_56000_A ) - 1 ) },
{ CBR_57600, DPNA_BAUD_RATE_57600_W, ( LENGTHOF( DPNA_BAUD_RATE_57600_W ) - 1 ), DPNA_BAUD_RATE_57600_A, ( LENGTHOF( DPNA_BAUD_RATE_57600_A ) - 1 ) },
{ CBR_115200, DPNA_BAUD_RATE_115200_W, ( LENGTHOF( DPNA_BAUD_RATE_115200_W ) - 1 ), DPNA_BAUD_RATE_115200_A, ( LENGTHOF( DPNA_BAUD_RATE_115200_A ) - 1 ) },
};
const DWORD g_dwBaudRateCount = LENGTHOF( g_BaudRate );
//
// list of stop bit types
//
STRING_BLOCK g_StopBits[] =
{
{ ONESTOPBIT, DPNA_STOP_BITS_ONE, ( LENGTHOF( DPNA_STOP_BITS_ONE ) - 1 ), DPNA_STOP_BITS_ONE_A, ( LENGTHOF( DPNA_STOP_BITS_ONE_A ) - 1 ) },
{ ONE5STOPBITS, DPNA_STOP_BITS_ONE_FIVE, ( LENGTHOF( DPNA_STOP_BITS_ONE_FIVE ) - 1 ), DPNA_STOP_BITS_ONE_FIVE_A, ( LENGTHOF( DPNA_STOP_BITS_ONE_FIVE_A ) - 1 ) },
{ TWOSTOPBITS, DPNA_STOP_BITS_TWO, ( LENGTHOF( DPNA_STOP_BITS_TWO ) - 1 ), DPNA_STOP_BITS_TWO_A, ( LENGTHOF( DPNA_STOP_BITS_TWO_A ) - 1 ) }
};
const DWORD g_dwStopBitsCount = LENGTHOF( g_StopBits );
//
// list of parity types
//
STRING_BLOCK g_Parity[] =
{
{ EVENPARITY, DPNA_PARITY_EVEN, ( LENGTHOF( DPNA_PARITY_EVEN ) - 1 ), DPNA_PARITY_EVEN_A, ( LENGTHOF( DPNA_PARITY_EVEN_A ) - 1 ) },
{ MARKPARITY, DPNA_PARITY_MARK, ( LENGTHOF( DPNA_PARITY_MARK ) - 1 ), DPNA_PARITY_MARK_A, ( LENGTHOF( DPNA_PARITY_MARK_A ) - 1 ) },
{ NOPARITY, DPNA_PARITY_NONE, ( LENGTHOF( DPNA_PARITY_NONE ) - 1 ), DPNA_PARITY_NONE_A, ( LENGTHOF( DPNA_PARITY_NONE_A ) - 1 ) },
{ ODDPARITY, DPNA_PARITY_ODD, ( LENGTHOF( DPNA_PARITY_ODD ) - 1 ), DPNA_PARITY_ODD_A, ( LENGTHOF( DPNA_PARITY_ODD_A ) - 1 ) },
{ SPACEPARITY, DPNA_PARITY_SPACE, ( LENGTHOF( DPNA_PARITY_SPACE ) - 1 ), DPNA_PARITY_SPACE_A, ( LENGTHOF( DPNA_PARITY_SPACE_A ) - 1 ) }
};
const DWORD g_dwParityCount = LENGTHOF( g_Parity );
//
// list of flow control types
//
STRING_BLOCK g_FlowControl[] =
{
{ FLOW_NONE, DPNA_FLOW_CONTROL_NONE, ( LENGTHOF( DPNA_FLOW_CONTROL_NONE ) - 1 ), DPNA_FLOW_CONTROL_NONE_A, ( LENGTHOF( DPNA_FLOW_CONTROL_NONE_A ) - 1 ) },
{ FLOW_XONXOFF, DPNA_FLOW_CONTROL_XONXOFF, ( LENGTHOF( DPNA_FLOW_CONTROL_XONXOFF ) - 1 ), DPNA_FLOW_CONTROL_XONXOFF_A, ( LENGTHOF( DPNA_FLOW_CONTROL_XONXOFF_A ) - 1 ) },
{ FLOW_RTS, DPNA_FLOW_CONTROL_RTS, ( LENGTHOF( DPNA_FLOW_CONTROL_RTS ) - 1 ), DPNA_FLOW_CONTROL_RTS_A, ( LENGTHOF( DPNA_FLOW_CONTROL_RTS_A ) - 1 ) },
{ FLOW_DTR, DPNA_FLOW_CONTROL_DTR, ( LENGTHOF( DPNA_FLOW_CONTROL_DTR ) - 1 ), DPNA_FLOW_CONTROL_DTR_A, ( LENGTHOF( DPNA_FLOW_CONTROL_DTR_A ) - 1 ) },
{ FLOW_RTSDTR, DPNA_FLOW_CONTROL_RTSDTR, ( LENGTHOF( DPNA_FLOW_CONTROL_RTSDTR ) - 1 ), DPNA_FLOW_CONTROL_RTSDTR_A, ( LENGTHOF( DPNA_FLOW_CONTROL_RTSDTR_A ) - 1 ) }
};
const DWORD g_dwFlowControlCount = LENGTHOF( g_FlowControl );
//**********************************************************************
// Function prototypes
//**********************************************************************
//**********************************************************************
// Function definitions
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::CComPortData - constructor
//
// Entry: Nothing
//
// Exit: Nothing
//
// Notes: Do not allocate anything in a constructor
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::CComPortData"
CComPortData::CComPortData():
m_dwDeviceID( INVALID_DEVICE_ID ),
m_BaudRate( CBR_57600 ),
m_StopBits( ONESTOPBIT ),
m_Parity( NOPARITY ),
m_FlowControl( FLOW_NONE )
{
//
// verify that the DPlay8 address baud rate #defines match those in Windows
//
DBG_CASSERT( CBR_9600 == DPNA_BAUD_RATE_9600 );
DBG_CASSERT( CBR_14400 == DPNA_BAUD_RATE_14400 );
DBG_CASSERT( CBR_19200 == DPNA_BAUD_RATE_19200 );
DBG_CASSERT( CBR_38400 == DPNA_BAUD_RATE_38400 );
DBG_CASSERT( CBR_56000 == DPNA_BAUD_RATE_56000 );
DBG_CASSERT( CBR_57600 == DPNA_BAUD_RATE_57600 );
DBG_CASSERT( CBR_115200 == DPNA_BAUD_RATE_115200 );
memset( m_ComPortName, 0x00, sizeof( m_ComPortName ));
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::~CComPortData - destructor
//
// Entry: Nothing
//
// Exit: Nothing
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::~CComPortData"
CComPortData::~CComPortData()
{
DNASSERT( m_dwDeviceID == INVALID_DEVICE_ID );
DNASSERT( m_BaudRate == CBR_57600 );
DNASSERT( m_StopBits == ONESTOPBIT );
DNASSERT( m_Parity == NOPARITY );
DNASSERT( m_FlowControl == FLOW_NONE );
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::ComPortDataFromDP8Addresses - initialize ComPortData from a DirectPlay8 address
//
// Entry: Pointer to host address (may be NULL)
// Pointer to device address
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::ComPortDataFromDP8Addresses"
HRESULT CComPortData::ComPortDataFromDP8Addresses( IDirectPlay8Address *const pHostAddress,
IDirectPlay8Address *const pDeviceAddress )
{
HRESULT hr;
UINT_PTR uIndex;
CParseClass ParseClass;
const PARSE_KEY ParseKeyList[] =
{
{ DPNA_KEY_DEVICE, LENGTHOF( DPNA_KEY_DEVICE ) - 1, this, ParseDevice },
{ DPNA_KEY_BAUD, LENGTHOF( DPNA_KEY_BAUD) - 1, this, ParseBaud },
{ DPNA_KEY_STOPBITS, LENGTHOF( DPNA_KEY_STOPBITS ) - 1, this, ParseStopBits },
{ DPNA_KEY_PARITY, LENGTHOF( DPNA_KEY_PARITY ) - 1, this, ParseParity },
{ DPNA_KEY_FLOWCONTROL, LENGTHOF( DPNA_KEY_FLOWCONTROL ) - 1, this, ParseFlowControl }
};
DNASSERT( pDeviceAddress != NULL );
//
// initialize
//
hr = DPN_OK;
//
// reset parsing flags and parse
//
uIndex = LENGTHOF( m_ComponentInitializationState );
while ( uIndex > 0 )
{
uIndex--;
m_ComponentInitializationState[ uIndex ] = SP_ADDRESS_COMPONENT_UNINITIALIZED;
}
hr = ParseClass.ParseDP8Address( pDeviceAddress,
&CLSID_DP8SP_SERIAL,
ParseKeyList,
LENGTHOF( ParseKeyList )
);
//
// There are two addresses to parse for a comport. The device address will
// be present for all commands, so do it first. The host address will be
// parsed if it's available.
//
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Failed address parse!" );
DisplayDNError( 0, hr );
goto Exit;
}
if ( pHostAddress != NULL )
{
hr = ParseClass.ParseDP8Address( pHostAddress,
&CLSID_DP8SP_SERIAL,
ParseKeyList,
LENGTHOF( ParseKeyList )
);
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Failed parse of host address!" );
DisplayDNError( 0, hr );
goto Exit;
}
}
//
// check for all parameters being initialized, or fail if one of the
// parameters failed to initialize.
//
DNASSERT( hr == DPN_OK );
uIndex = COMPORT_PARSE_KEY_MAX;
while ( uIndex > 0 )
{
uIndex--;
switch ( m_ComponentInitializationState[ uIndex ] )
{
//
// This component was initialized properly. Continue checking
// for other problems.
//
case SP_ADDRESS_COMPONENT_INITIALIZED:
{
break;
}
//
// This component was not initialized, note that the address was
// incomplete and that the user will need to be queried. Keep
// checking components for other problems.
//
case SP_ADDRESS_COMPONENT_UNINITIALIZED:
{
hr = DPNERR_INCOMPLETEADDRESS;
break;
}
//
// initialization of this component failed, fail the parse.
//
case SP_ADDRESS_COMPONENT_INITIALIZATION_FAILED:
{
hr = DPNERR_ADDRESSING;
DPFX(DPFPREP, 8, "DataPortFromDNAddress: parse failure!" );
goto Failure;
break;
}
}
}
//
// do we indicate an attempt at initialization?
//
DNASSERT( ( hr == DPN_OK ) || ( hr == DPNERR_INCOMPLETEADDRESS ) );
Exit:
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "Problem with CComPortData::ComPortDataFromDNAddress()" );
DisplayDNError( 0, hr );
}
return hr;
Failure:
goto Exit;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::DP8AddressFromComPortData - convert a ComPortData to a DirectPlay8 address
//
// Entry: Address type
//
// Exit: Pointer to DirecctPlayAddress
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::DP8AddressFromComPortData"
IDirectPlay8Address *CComPortData::DP8AddressFromComPortData( const ADDRESS_TYPE AddressType ) const
{
HRESULT hr;
UINT_PTR uIndex;
GUID DeviceGuid;
const WCHAR *pComponentString;
DWORD dwComponentStringSize;
IDirectPlay8Address *pAddress;
DNASSERT( ( AddressType == ADDRESS_TYPE_REMOTE_HOST ) ||
( AddressType == ADDRESS_TYPE_LOCAL_ADAPTER ) ||
( AddressType == ADDRESS_TYPE_LOCAL_ADAPTER_HOST_FORMAT ) );
//
// initialize
//
pAddress = NULL;
uIndex = COMPORT_PARSE_KEY_MAX;
while ( uIndex > 0 )
{
uIndex--;
if ( m_ComponentInitializationState[ uIndex ] != SP_ADDRESS_COMPONENT_INITIALIZED )
{
DPFX(DPFPREP, 0, "Attempt made to extract partial ComPortData information!" );
DNASSERT( FALSE );
goto Failure;
}
}
//
// create output address
//
hr = COM_CoCreateInstance( CLSID_DirectPlay8Address,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Address,
reinterpret_cast<void**>( &pAddress ), FALSE );
if ( hr != S_OK )
{
DNASSERT( pAddress == NULL );
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to create Address when converting data port to address!" );
goto Failure;
}
//
// set the SP guid
//
hr = IDirectPlay8Address_SetSP( pAddress, &CLSID_DP8SP_SERIAL );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to set service provider GUID!" );
DisplayDNError( 0, hr );
goto Failure;
}
//
// All serial settings are part of the local adapter. Host settings return
// just the SP type.
//
if ( AddressType == ADDRESS_TYPE_LOCAL_ADAPTER )
{
DeviceIDToGuid( &DeviceGuid, GetDeviceID(), &g_SerialSPEncryptionGuid );
hr = IDirectPlay8Address_SetDevice( pAddress, &DeviceGuid );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to add device GUID!" );
DisplayDNError( 0, hr );
goto Failure;
}
//
// set baud rate
//
DBG_CASSERT( sizeof( SP_BAUD_RATE ) == sizeof( DWORD ) );
hr = IDirectPlay8Address_AddComponent( pAddress,
DPNA_KEY_BAUD,
&m_BaudRate,
sizeof( SP_BAUD_RATE ),
DPNA_DATATYPE_DWORD );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to add baud rate!" );
DisplayDNError( 0, hr );
goto Failure;
}
//
// set stop bits
//
if ( ValueToString( &pComponentString, // pointer to value string
&dwComponentStringSize, // pointer to length of value string
GetStopBits(), // enum value
g_StopBits, // pointer to enum-string array
g_dwStopBitsCount // length of enum-string array
) == FALSE )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to convert baud rate!" );
DNASSERT( FALSE );
goto Failure;
}
hr = IDirectPlay8Address_AddComponent( pAddress,
DPNA_KEY_STOPBITS,
pComponentString,
( ( dwComponentStringSize + 1 ) * sizeof( WCHAR ) ),
DPNA_DATATYPE_STRING );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to add stop bits!" );
DisplayDNError( 0, hr );
goto Failure;
}
//
// set parity
//
if ( ValueToString( &pComponentString, // pointer to value string
&dwComponentStringSize, // pointer to length of value string
GetParity(), // enum value
g_Parity, // pointer to enum-string array
g_dwParityCount // length of enum-string array
) == FALSE )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to convert parity!" );
DNASSERT( FALSE );
goto Failure;
}
hr = IDirectPlay8Address_AddComponent( pAddress,
DPNA_KEY_PARITY,
pComponentString,
( ( dwComponentStringSize + 1 ) * sizeof( WCHAR ) ),
DPNA_DATATYPE_STRING );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to add parity!" );
DisplayDNError( 0, hr );
goto Failure;
}
//
// set flow control
//
if ( ValueToString( &pComponentString, // pointer to value string
&dwComponentStringSize, // pointer to length of value string
GetFlowControl(), // enum value
g_FlowControl, // pointer to enum-string array
g_dwFlowControlCount // length of enum-string array
) == FALSE )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to convert flow control!" );
DNASSERT( FALSE );
goto Failure;
}
hr = IDirectPlay8Address_AddComponent( pAddress,
DPNA_KEY_FLOWCONTROL,
pComponentString,
( ( dwComponentStringSize + 1 ) * sizeof( WCHAR ) ),
DPNA_DATATYPE_STRING );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 0, "DP8AddressFromComPortData: Failed to add flow control!" );
DisplayDNError( 0, hr );
goto Failure;
}
}
Exit:
return pAddress;
Failure:
if ( pAddress != NULL )
{
IDirectPlay8Address_Release( pAddress );
pAddress = NULL;
}
goto Exit;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::SetDeviceID - set device ID
//
// Entry: Device ID
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::SetDeviceID"
HRESULT CComPortData::SetDeviceID( const DWORD dwDeviceID )
{
HRESULT hr;
//
// initialize
//
hr = DPN_OK;
if ( ( dwDeviceID > MAX_DATA_PORTS ) ||
( dwDeviceID == 0 ) )
{
if ( dwDeviceID != INVALID_DEVICE_ID )
{
hr = DPNERR_ADDRESSING;
}
else
{
m_dwDeviceID = INVALID_DEVICE_ID;
DNASSERT( hr == DPN_OK );
}
goto Exit;
}
m_dwDeviceID = dwDeviceID;
ClearComPortName();
ComDeviceIDToString( ComPortName(), m_dwDeviceID );
m_ComponentInitializationState[ COMPORT_PARSE_KEY_DEVICE ] = SP_ADDRESS_COMPONENT_INITIALIZED;
Exit:
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::SetBaudRate - set baud rate
//
// Entry: Baud rate
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::SetBaudRate"
HRESULT CComPortData::SetBaudRate( const SP_BAUD_RATE BaudRate )
{
HRESULT hr;
hr = DPN_OK;
switch ( BaudRate )
{
//
// valid rates
//
case CBR_110:
case CBR_300:
case CBR_600:
case CBR_1200:
case CBR_2400:
case CBR_4800:
case CBR_9600:
case CBR_14400:
case CBR_19200:
case CBR_38400:
case CBR_56000:
case CBR_57600:
case CBR_115200:
case CBR_128000:
case CBR_256000:
{
m_BaudRate = BaudRate;
m_ComponentInitializationState[ COMPORT_PARSE_KEY_BAUDRATE ] = SP_ADDRESS_COMPONENT_INITIALIZED;
break;
}
//
// other
//
default:
{
hr = DPNERR_ADDRESSING;
DPFX(DPFPREP, 0, "Invalid baud rate (%d)!", BaudRate );
DNASSERT( FALSE );
break;
}
}
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::SetStopBits - set stop bits
//
// Entry: Stop bits
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::SetStopBits"
HRESULT CComPortData::SetStopBits( const SP_STOP_BITS StopBits )
{
HRESULT hr;
hr = DPN_OK;
switch ( StopBits )
{
//
// valid settings
//
case ONESTOPBIT:
case ONE5STOPBITS:
case TWOSTOPBITS:
{
m_StopBits = StopBits;
m_ComponentInitializationState[ COMPORT_PARSE_KEY_STOPBITS ] = SP_ADDRESS_COMPONENT_INITIALIZED;
break;
}
//
// other
//
default:
{
hr = DPNERR_ADDRESSING;
DPFX(DPFPREP, 0, "Ivalid stop bit setting (0x%x)!", StopBits );
DNASSERT( FALSE );
break;
}
}
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::SetParity - set parity
//
// Entry: Parity
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::SetParity"
HRESULT CComPortData::SetParity( const SP_PARITY_TYPE Parity )
{
HRESULT hr;
hr = DPN_OK;
switch ( Parity )
{
//
// valid settings
//
case NOPARITY:
case EVENPARITY:
case ODDPARITY:
case MARKPARITY:
case SPACEPARITY:
{
m_Parity = Parity;
m_ComponentInitializationState[ COMPORT_PARSE_KEY_PARITY ] = SP_ADDRESS_COMPONENT_INITIALIZED;
break;
}
//
// other
//
default:
{
hr = DPNERR_ADDRESSING;
DPFX(DPFPREP, 0, "Invalid parity (0x%x)!", Parity );
DNASSERT( FALSE );
break;
}
}
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::SetFlowControl - set flow control
//
// Entry: Flow control
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::SetFlowControl"
HRESULT CComPortData::SetFlowControl( const SP_FLOW_CONTROL FlowControl )
{
HRESULT hr;
hr = DPN_OK;
switch ( FlowControl )
{
//
// valid settings
//
case FLOW_NONE:
case FLOW_XONXOFF:
case FLOW_RTS:
case FLOW_DTR:
case FLOW_RTSDTR:
{
m_FlowControl = FlowControl;
m_ComponentInitializationState[ COMPORT_PARSE_KEY_FLOWCONTROL ] = SP_ADDRESS_COMPONENT_INITIALIZED;
break;
}
//
// other
//
default:
{
hr = DPNERR_ADDRESSING;
DPFX(DPFPREP, 0, "Invalid flow control (0x%x)!", FlowControl );
DNASSERT( FALSE );
break;
}
}
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::IsEqual - is this comport data block equal to another?
//
// Entry: Pointer to other data block
//
// Exit: Boolean indicating equality
// TRUE = is equal
// FALSE = is not equal
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::IsEqual"
BOOL CComPortData::IsEqual( const CComPortData *const pOtherPort ) const
{
BOOL fReturn;
fReturn = TRUE;
if ( ( GetDeviceID() != pOtherPort->GetDeviceID() ) ||
( GetBaudRate() != pOtherPort->GetBaudRate() ) ||
( GetStopBits() != pOtherPort->GetStopBits() ) ||
( GetParity() != pOtherPort->GetParity() ) ||
( GetFlowControl() != pOtherPort->GetFlowControl() ) )
{
fReturn = FALSE;
}
return fReturn;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::Copy - copy from another data block
//
// Entry: Pointer to other data block
//
// Exit: Nothing
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::Copy"
void CComPortData::Copy( const CComPortData *const pOtherPort )
{
HRESULT hr;
DNASSERT( pOtherPort != NULL );
// DBG_CASSERT( sizeof( m_ComPortName ) == sizeof( pOtherPort->m_ComPortName ) );
// memcpy( m_ComPortName, pOtherPort->m_ComPortName, sizeof( m_ComPortName ) );
hr = SetDeviceID( pOtherPort->GetDeviceID() );
DNASSERT( hr == DPN_OK );
hr = SetBaudRate( pOtherPort->GetBaudRate() );
DNASSERT( hr == DPN_OK );
hr = SetStopBits( pOtherPort->GetStopBits() );
DNASSERT( hr == DPN_OK );
hr = SetParity( pOtherPort->GetParity() );
DNASSERT( hr == DPN_OK );
hr = SetFlowControl( pOtherPort->GetFlowControl() );
DNASSERT( hr == DPN_OK );
//
// no need to copy comport name because it was set with the device ID
//
// DBG_CASSERT( sizeof( m_ComPortName ) == sizeof( pOtherPort->m_ComPortName ) );
// memcpy( m_ComPortName, pOtherPort->m_ComPortName, sizeof( m_ComPortName ) );
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::ParseDevice - get comport device from string
//
// Entry: Pointer to address component
// Size of address component
// Component type
// Pointer to context (this obejct)
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::ParseDevice"
HRESULT CComPortData::ParseDevice( const void *const pAddressComponent,
const DWORD dwComponentSize,
const DWORD dwComponentType,
void *const pContext )
{
HRESULT hr;
CComPortData *pThisComPortData;
const GUID *pDeviceGuid;
DNASSERT( pAddressComponent != NULL );
DNASSERT( pContext != NULL );
//
// initialize
//
hr = DPN_OK;
pThisComPortData = static_cast<CComPortData*>( pContext );
//
// is this a COM port, and is the name small enough?
//
if ( dwComponentSize != sizeof( *pDeviceGuid ) )
{
DNASSERT( FALSE );
hr = DPNERR_ADDRESSING;
goto Exit;
}
pDeviceGuid = reinterpret_cast<const GUID*>( pAddressComponent );
hr = pThisComPortData->SetDeviceID( GuidToDeviceID( pDeviceGuid, &g_SerialSPEncryptionGuid ) );
if ( hr != DPN_OK )
{
DPFX(DPFPREP, 8, "ParseDevice: couldn't set device ID." );
DisplayDNError( 8, hr );
goto Exit;
}
DNASSERT( hr == DPN_OK );
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_DEVICE ] = SP_ADDRESS_COMPONENT_INITIALIZED;
Exit:
//
// note initialization failures
//
if ( hr != DPN_OK )
{
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_DEVICE ] = SP_ADDRESS_COMPONENT_INITIALIZATION_FAILED;
}
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::ParseBaud - get baud rate from string
//
// Entry: Pointer to address component
// Size of component
// Component type
// Pointer to context (this object)
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::ParseBaud"
HRESULT CComPortData::ParseBaud( const void *const pAddressComponent,
const DWORD dwComponentSize,
const DWORD dwComponentType,
void *const pContext )
{
HRESULT hr;
CComPortData *pThisComPortData;
const SP_BAUD_RATE *pBaudRate;
DNASSERT( pAddressComponent != NULL );
DNASSERT( pContext != NULL );
//
// initialize
//
hr = DPN_OK;
pThisComPortData = static_cast<CComPortData*>( pContext );
DNASSERT( sizeof( *pBaudRate ) == dwComponentSize );
pBaudRate = static_cast<const SP_BAUD_RATE*>( pAddressComponent );
hr = pThisComPortData->SetBaudRate( *pBaudRate );
if ( hr != DPN_OK )
{
hr = DPNERR_ADDRESSING;
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_BAUDRATE ] = SP_ADDRESS_COMPONENT_INITIALIZATION_FAILED;
goto Exit;
}
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_BAUDRATE ] = SP_ADDRESS_COMPONENT_INITIALIZED;
Exit:
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::ParseStopBits - get stop bits from string
//
// Entry: Pointer to address component
// Component size
// Component type
// Pointer to context (this object)
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::ParseStopBits"
HRESULT CComPortData::ParseStopBits( const void *const pAddressComponent,
const DWORD dwComponentSize,
const DWORD dwComponentType,
void *const pContext )
{
HRESULT hr;
CComPortData *pThisComPortData;
DNASSERT( pAddressComponent != NULL );
DNASSERT( pContext != NULL );
//
// initialize
//
hr = DPN_OK;
pThisComPortData = static_cast<CComPortData*>( pContext );
//
// convert string to value
//
if ( StringToValue( static_cast<const WCHAR*>( pAddressComponent ), // pointer to string
( ( dwComponentSize / sizeof( WCHAR ) ) - 1 ), // length of string
&pThisComPortData->m_StopBits, // pointer to destination
g_StopBits, // pointer to string/enum pairs
g_dwStopBitsCount // number of string/enum pairs
) == FALSE )
{
hr = DPNERR_ADDRESSING;
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_STOPBITS ] = SP_ADDRESS_COMPONENT_INITIALIZATION_FAILED;
goto Exit;
}
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_STOPBITS ] = SP_ADDRESS_COMPONENT_INITIALIZED;
Exit:
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::ParseParity - get parity from string
//
// Entry: Pointer to address component
// Component size
// Component type
// Pointer to context (this object)
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::ParseParity"
HRESULT CComPortData::ParseParity( const void *const pAddressComponent,
const DWORD dwComponentSize,
const DWORD dwComponentType,
void *const pContext )
{
HRESULT hr;
CComPortData *pThisComPortData;
DNASSERT( pAddressComponent != NULL );
DNASSERT( pContext != NULL );
//
// initialize
//
hr = DPN_OK;
pThisComPortData = static_cast<CComPortData*>( pContext );
//
// convert string to value
//
if ( StringToValue( static_cast<const WCHAR*>( pAddressComponent ), // pointer to string
( ( dwComponentSize / sizeof( WCHAR ) ) - 1 ), // length of string
&pThisComPortData->m_Parity, // pointer to destination
g_Parity, // pointer to string/enum pairs
g_dwParityCount // number of string/enum pairs
) == FALSE )
{
hr = DPNERR_ADDRESSING;
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_PARITY ] = SP_ADDRESS_COMPONENT_INITIALIZATION_FAILED;
goto Exit;
}
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_PARITY ] = SP_ADDRESS_COMPONENT_INITIALIZED;
Exit:
return hr;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// CComPortData::ParseFlowControl - get flow control from string
//
// Entry: Pointer to address component
// Component size
// Component type
// Pointer to context (this object)
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CComPortData::ParseFlowControl"
HRESULT CComPortData::ParseFlowControl( const void *const pAddressComponent,
const DWORD dwComponentSize,
const DWORD dwComponentType,
void *const pContext )
{
HRESULT hr;
CComPortData *pThisComPortData;
DNASSERT( pAddressComponent != NULL );
DNASSERT( pContext != NULL );
//
// initialize
//
hr = DPN_OK;
pThisComPortData = static_cast<CComPortData*>( pContext );
//
// convert string to value
//
DBG_CASSERT( sizeof( pThisComPortData->m_FlowControl ) == sizeof( VALUE_ENUM_TYPE ) );
if ( StringToValue( static_cast<const WCHAR*>( pAddressComponent ), // pointer to string
( ( dwComponentSize / sizeof( WCHAR ) ) - 1 ), // length of string
reinterpret_cast<VALUE_ENUM_TYPE*>( &pThisComPortData->m_FlowControl ), // pointer to destination
g_FlowControl, // pointer to string/enum pairs
g_dwFlowControlCount // number of string/enum pairs
) == FALSE )
{
hr = DPNERR_ADDRESSING;
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_FLOWCONTROL ] = SP_ADDRESS_COMPONENT_INITIALIZATION_FAILED;
goto Exit;
}
pThisComPortData->m_ComponentInitializationState[ COMPORT_PARSE_KEY_FLOWCONTROL ] = SP_ADDRESS_COMPONENT_INITIALIZED;
Exit:
return hr;
}
//**********************************************************************