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.
228 lines
9.9 KiB
228 lines
9.9 KiB
/*==========================================================================
|
|
*
|
|
* Copyright (C) 2000-2002 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: dplegacy.cpp
|
|
* Content: Definitions for old DirectPlay's address type
|
|
*@@BEGIN_MSINTERNAL
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 03/21/2000 rmt Created
|
|
* 07/21/2000 rmt Minor bug fixes to dplay4 address parsing.
|
|
*@@END_MSINTERNAL
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include "dnaddri.h"
|
|
|
|
#ifndef DPNBUILD_NOLEGACYDP
|
|
|
|
#define DPLEGACY_ELEMENTS 11
|
|
|
|
DPLEGACYMAPGUIDTOSTRING dpLegacyMap [DPLEGACY_ELEMENTS] =
|
|
{
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_ServiceProvider, DPNA_KEY_PROVIDER, DPNA_DATATYPE_GUID ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_ComPort, DPNA_KEY_PORT, DPNA_DATATYPE_DPCOMPORTADDRESS ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_INet, DPNA_KEY_HOSTNAME, DPNA_DATATYPE_STRING_ANSI ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_INetW, DPNA_KEY_HOSTNAME, DPNA_DATATYPE_STRING ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_INetPort, DPNA_KEY_PORT, DPNA_DATATYPE_DWORD ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_LobbyProvider, L"lobbyprovider", DPNA_DATATYPE_GUID ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_Modem, L"modemname", DPNA_DATATYPE_STRING_ANSI ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_ModemW, L"modemname", DPNA_DATATYPE_STRING ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_Phone, DPNA_KEY_PHONENUMBER, DPNA_DATATYPE_STRING_ANSI ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_PhoneW, DPNA_KEY_PHONENUMBER, DPNA_DATATYPE_STRING ),
|
|
DPLEGACYMAPGUIDTOSTRING( DPAID_TotalSize, DPNA_KEY_PORT, DPNA_DATATYPE_NOP )
|
|
};
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "AddDP4Element"
|
|
|
|
HRESULT AddDP4Element( PDPADDRESS pdpAddressElement, PDP8ADDRESSOBJECT pdpAddress )
|
|
{
|
|
DWORD dwIndex;
|
|
HRESULT hr = DPN_OK;
|
|
PDPCOMPORTADDRESS pPortAddress;
|
|
WCHAR chPortBuffer[30];
|
|
|
|
// Loop through entries
|
|
for( dwIndex = 0 ; dwIndex < sizeof( dpLegacyMap ) / sizeof( DPLEGACYMAPGUIDTOSTRING ); dwIndex++ )
|
|
{
|
|
if( dpLegacyMap[dwIndex].m_guidType == pdpAddressElement->guidDataType )
|
|
{
|
|
switch( dpLegacyMap[dwIndex].m_dwDataType )
|
|
{
|
|
case DPNA_DATATYPE_STRING_ANSI:
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
// TODO: MASONB: Are these supposed to all be using element 1?
|
|
if( !DNVALID_STRING_A( (char *) &pdpAddressElement[1] ) )
|
|
{
|
|
hr = DPNERR_INVALIDADDRESSFORMAT;
|
|
}
|
|
else
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
{
|
|
WCHAR * pwszTemp;
|
|
|
|
|
|
pwszTemp = (WCHAR*) DNMalloc(pdpAddressElement->dwDataSize * 2);
|
|
if (pwszTemp == NULL)
|
|
{
|
|
DPFX(DPFPREP, 0, "Error allocating memory for conversion");
|
|
hr = DPNERR_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
hr = STR_jkAnsiToWide(pwszTemp, (const char * const) &pdpAddressElement[1], pdpAddressElement->dwDataSize);
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error unable to convert element ANSI->Unicode 0x%x", hr );
|
|
hr = DPNERR_CONVERSION;
|
|
}
|
|
else
|
|
{
|
|
hr = pdpAddress->SetElement( dpLegacyMap[dwIndex].m_wszKeyName, pwszTemp, (pdpAddressElement->dwDataSize * 2), DPNA_DATATYPE_STRING );
|
|
}
|
|
|
|
DNFree(pwszTemp);
|
|
}
|
|
|
|
break;
|
|
|
|
case DPNA_DATATYPE_DPCOMPORTADDRESS:
|
|
|
|
pPortAddress = (PDPCOMPORTADDRESS) &pdpAddressElement[1];
|
|
|
|
swprintf( chPortBuffer, L"COM%u", pPortAddress->dwComPort );
|
|
|
|
hr = pdpAddress->SetElement( DPNA_KEY_STOPBITS, chPortBuffer, (wcslen( chPortBuffer )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Unable to specify port element hr=[0x%lx]", hr );
|
|
break;
|
|
}
|
|
|
|
hr = pdpAddress->SetElement( DPNA_KEY_BAUD, &pPortAddress->dwBaudRate, sizeof( DWORD ), DPNA_DATATYPE_DWORD );
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Unable to specify baudrate element hr=[0x%lx]", hr );
|
|
break;
|
|
}
|
|
|
|
switch( pPortAddress->dwStopBits )
|
|
{
|
|
case ONESTOPBIT:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_STOPBITS, &DPNA_STOP_BITS_ONE, (wcslen( DPNA_STOP_BITS_ONE )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case ONE5STOPBITS:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_STOPBITS, &DPNA_STOP_BITS_ONE_FIVE, (wcslen( DPNA_STOP_BITS_ONE_FIVE )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case TWOSTOPBITS:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_STOPBITS, &DPNA_STOP_BITS_TWO, (wcslen( DPNA_STOP_BITS_TWO )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
default:
|
|
hr = DPNERR_INVALIDADDRESSFORMAT;
|
|
}
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error converting stopbits element hr=[0x%lx]", hr );
|
|
break;
|
|
}
|
|
|
|
switch( pPortAddress->dwParity )
|
|
{
|
|
case NOPARITY:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_PARITY, &DPNA_PARITY_NONE, (wcslen( DPNA_PARITY_NONE )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case ODDPARITY:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_PARITY, &DPNA_PARITY_ODD, (wcslen( DPNA_PARITY_ODD )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case EVENPARITY:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_PARITY, &DPNA_PARITY_EVEN, (wcslen( DPNA_PARITY_EVEN )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case MARKPARITY:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_PARITY, &DPNA_PARITY_MARK, (wcslen( DPNA_PARITY_MARK )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
default:
|
|
hr = DPNERR_INVALIDADDRESSFORMAT;
|
|
}
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error converting parity element hr=[0x%lx]", hr );
|
|
break;
|
|
}
|
|
|
|
switch( pPortAddress->dwFlowControl )
|
|
{
|
|
case DPCPA_NOFLOW:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_FLOWCONTROL, &DPNA_FLOW_CONTROL_NONE, (wcslen( DPNA_KEY_FLOWCONTROL )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case DPCPA_XONXOFFFLOW:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_FLOWCONTROL, &DPNA_FLOW_CONTROL_XONXOFF, (wcslen( DPNA_FLOW_CONTROL_XONXOFF )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case DPCPA_RTSFLOW:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_FLOWCONTROL, &DPNA_FLOW_CONTROL_RTS, (wcslen( DPNA_FLOW_CONTROL_RTS )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case DPCPA_DTRFLOW:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_FLOWCONTROL, &DPNA_FLOW_CONTROL_DTR, (wcslen( DPNA_FLOW_CONTROL_DTR )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
case DPCPA_RTSDTRFLOW:
|
|
hr = pdpAddress->SetElement( DPNA_KEY_FLOWCONTROL, &DPNA_FLOW_CONTROL_RTSDTR, (wcslen( DPNA_FLOW_CONTROL_RTSDTR )+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );
|
|
break;
|
|
default:
|
|
hr = DPNERR_INVALIDADDRESSFORMAT;
|
|
}
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error converting flow control element hr=[0x%lx]", hr );
|
|
break;
|
|
}
|
|
|
|
break;
|
|
case DPNA_DATATYPE_DWORD:
|
|
if( pdpAddressElement->dwDataSize != sizeof( DWORD ) )
|
|
hr = DPNERR_INVALIDADDRESSFORMAT;
|
|
else
|
|
hr = pdpAddress->SetElement( dpLegacyMap[dwIndex].m_wszKeyName, (LPVOID) &pdpAddressElement[1], pdpAddressElement->dwDataSize, DPNA_DATATYPE_DWORD );
|
|
break;
|
|
case DPNA_DATATYPE_GUID:
|
|
if( pdpAddressElement->dwDataSize != sizeof( GUID ) )
|
|
hr = DPNERR_INVALIDADDRESSFORMAT;
|
|
else
|
|
hr = pdpAddress->SetElement( dpLegacyMap[dwIndex].m_wszKeyName, (LPVOID) &pdpAddressElement[1], pdpAddressElement->dwDataSize, DPNA_DATATYPE_GUID );
|
|
break;
|
|
case DPNA_DATATYPE_STRING:
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if( !DNVALID_STRING_W( (WCHAR *) &pdpAddressElement[1] ) )
|
|
hr = DPNERR_INVALIDADDRESSFORMAT;
|
|
else
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
hr = pdpAddress->SetElement( dpLegacyMap[dwIndex].m_wszKeyName, (LPVOID) &pdpAddressElement[1], pdpAddressElement->dwDataSize, DPNA_DATATYPE_STRING );
|
|
break;
|
|
case DPNA_DATATYPE_NOP:
|
|
hr = DPN_OK;
|
|
break;
|
|
default:
|
|
hr = DPNERR_INVALIDADDRESSFORMAT;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( dwIndex == DPLEGACY_ELEMENTS )
|
|
{
|
|
DPFX(DPFPREP, 0, "Address contains an element which cannot be mapped" );
|
|
return DPNERR_INVALIDADDRESSFORMAT;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
#endif // ! DPNBUILD_NOLEGACYDP
|