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