|
|
/*==========================================================================
* * Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved. * * File: ParseClass.cpp * Content: Parsing class * * * History: * Date By Reason * ==== == ====== * 121/02/99 jtk Derived from IPXAddress.cpp * 01/10/20000 rmt Updated to build with Millenium build process ***************************************************************************/
#include "dnmdmi.h"
//**********************************************************************
// Constant definitions
//**********************************************************************
//
// default buffer size to use when parsing address components
//
#define DEFAULT_COMPONENT_BUFFER_SIZE 1000
//**********************************************************************
// Macro definitions
//**********************************************************************
//**********************************************************************
// Structure definitions
//**********************************************************************
//**********************************************************************
// Variable definitions
//**********************************************************************
//**********************************************************************
// Function prototypes
//**********************************************************************
//**********************************************************************
// Function definitions
//**********************************************************************
//**********************************************************************
// ------------------------------
// CParseClass::ParseDP8Address - parse a DirectPlay8 address
//
// Entry: Pointer to DP8Address
// Pointer to expected SP guid
// Pointer to parse keys
// Count of parse keys
//
// Exit: Error code
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "CParseClass::ParseDP8Address"
HRESULT CParseClass::ParseDP8Address( IDirectPlay8Address *const pDP8Address, const GUID *const pSPGuid, const PARSE_KEY *const pParseKeys, const UINT_PTR uParseKeyCount ) { HRESULT hr; BOOL fParsing; #ifndef DPNBUILD_ONLYONESP
GUID Guid; #endif // ! DPNBUILD_ONLYONESP
void *pAddressComponent; DWORD dwComponentSize; DWORD dwAllocatedComponentSize; UINT_PTR uIndex;
DNASSERT( pDP8Address != NULL ); DNASSERT( pSPGuid != NULL ); DNASSERT( pParseKeys != NULL ); DNASSERT( uParseKeyCount != 0 );
//
// initialize
//
hr = DPN_OK; fParsing = TRUE; dwAllocatedComponentSize = DEFAULT_COMPONENT_BUFFER_SIZE; uIndex = uParseKeyCount;
pAddressComponent = DNMalloc( dwAllocatedComponentSize ); if ( pAddressComponent == NULL ) { hr = DPNERR_OUTOFMEMORY; DPFX(DPFPREP, 0, "ParseClass: failed to allocate temp buffer for parsing" ); goto Exit; }
#ifndef DPNBUILD_ONLYONESP
//
// verify SPType
//
hr = IDirectPlay8Address_GetSP( pDP8Address, &Guid ); if ( hr != DPN_OK ) { DPFX(DPFPREP, 0, "ParseClass: failed to verify service provider type!" ); DisplayDNError( 0, hr ); goto Exit; }
if ( IsEqualCLSID( *pSPGuid, Guid ) == FALSE ) { hr = DPNERR_ADDRESSING; DPFX(DPFPREP, 0, "Service provider guid mismatch during parse!" ); goto Exit; } #endif // ! DPNBUILD_ONLYONESP
//
// parse
//
while ( uIndex != 0 ) { HRESULT hTempResult; DWORD dwDataType;
uIndex--; DNASSERT( pAddressComponent != NULL ); dwComponentSize = dwAllocatedComponentSize;
Reparse: hTempResult = IDirectPlay8Address_GetComponentByName( pDP8Address, // pointer to address
pParseKeys[ uIndex ].pKey, // pointer to key to search for
pAddressComponent, // pointer to value destination
&dwComponentSize, // pointer to value destination size
&dwDataType ); // pointer to data type
switch ( hTempResult ) { //
// component parsed successfully, figure out what it is by checking
// key length and then comparing key strings
//
case DPN_OK: { hr = pParseKeys[ uIndex ].pParseFunc( pAddressComponent, dwComponentSize, dwDataType, pParseKeys[ uIndex ].pContext ); if ( hr != DPN_OK ) { goto Exit; }
break; }
//
// buffer too small, reallocate and try again
//
case DPNERR_BUFFERTOOSMALL: { DNASSERT( dwComponentSize > dwAllocatedComponentSize ); DNASSERT( pAddressComponent != NULL );
DNFree( pAddressComponent ); pAddressComponent = DNMalloc( dwComponentSize ); if ( pAddressComponent == NULL ) { hr = DPNERR_OUTOFMEMORY; goto Exit; } dwAllocatedComponentSize = dwComponentSize;
goto Reparse;
break; }
//
// Missing component. Skip this component and
// look for other parsing errors.
//
case DPNERR_DOESNOTEXIST: { break; }
//
// error
//
default: { hr = hTempResult; DPFX(DPFPREP, 0, "ParseClass: Problem parsing address!" ); DisplayDNError( 0, hr ); DNASSERT( FALSE ); goto Exit;
break; } } }
Exit: if ( pAddressComponent != NULL ) { DNFree( pAddressComponent ); pAddressComponent = NULL; }
return hr; } //**********************************************************************
|