197 lines
6.3 KiB
C++
197 lines
6.3 KiB
C++
/*==========================================================================
|
|
*
|
|
* Copyright (C) 2000 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: addcore.h
|
|
* Content: DIRECTPLAY8ADDRESS CORE HEADER FILE
|
|
*@@BEGIN_MSINTERNAL
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 02/04/2000 rmt Created
|
|
* 02/17/2000 rmt Added new defines for
|
|
* 02/17/2000 rmt Parameter validation work
|
|
* 02/21/2000 rmt Updated to make core Unicode and remove ANSI calls
|
|
* 07/09/2000 rmt Added signature bytes to start of address objects
|
|
* 07/13/2000 rmt Bug #39274 - INT 3 during voice run
|
|
* 07/21/2000 rmt Bug #39940 - Addressing library doesn't properly parse stopbits in URLs
|
|
* 7/31/2000 RichGr IA64: FPM_Release() overwrites first 8 bytes of chunk of memory on IA64.
|
|
* Rearrange positions of members of affected structs so that's OK.
|
|
*@@END_MSINTERNAL
|
|
*
|
|
***************************************************************************/
|
|
|
|
#ifndef __ADDCORE_H
|
|
#define __ADDCORE_H
|
|
|
|
class CStringCache;
|
|
|
|
// Length of a single byte of userdata
|
|
#define DNURL_LENGTH_USERDATA_BYTE 1
|
|
|
|
// Header length (14 chars + null terminator)
|
|
#define DNURL_LENGTH_HEADER 15
|
|
|
|
// Includes escaped brackets
|
|
#define DNURL_LENGTH_GUID 42
|
|
|
|
// Just the number, in decimal
|
|
#define DNURL_LENGTH_DWORD 10
|
|
|
|
// The length of the seperator for user data
|
|
#define DNURL_LENGTH_USERDATA_SEPERATOR 1
|
|
|
|
// The right length for one byte of escaped data
|
|
#define DNURL_LENGTH_BINARY_BYTE 3
|
|
|
|
|
|
#define DP8A_ENTERLEVEL 2
|
|
#define DP8A_INFOLEVEL 7
|
|
#define DP8A_ERRORLEVEL 0
|
|
#define DP8A_WARNINGLEVEL 1
|
|
#define DP8A_PARAMLEVEL 3
|
|
|
|
extern const WCHAR *szBaseStrings[];
|
|
extern const DWORD dwBaseRequiredTypes[];
|
|
extern const DWORD c_dwNumBaseStrings;
|
|
|
|
#if defined(DEBUG) || defined(DBG)
|
|
|
|
extern BOOL IsValidDP8AObject( LPVOID lpvObject );
|
|
|
|
#define DP8A_VALID(a) IsValidDP8AObject( a )
|
|
#else
|
|
#define DP8A_VALID(a) TRUE
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define DP8A_RETURN( x ) DPFX(DPFPREP, DP8A_ENTERLEVEL, "Function returning hr=0x%x", x ); \
|
|
return x;
|
|
|
|
extern LPFPOOL fpmAddressClassFacs;
|
|
extern LPFPOOL fpmAddressObjects;
|
|
extern LPFPOOL fpmAddressElements;
|
|
extern LPFPOOL fpmAddressInterfaceLists;
|
|
extern LPFPOOL fpmAddressObjectDatas;
|
|
|
|
extern CStringCache *g_pcstrKeyCache;
|
|
|
|
#define DP8ADDRESS_ELEMENT_HEAP 0x00000001
|
|
|
|
#define DPASIGNATURE_ELEMENT 'LEAD'
|
|
#define DPASIGNATURE_ELEMENT_FREE 'LEA_'
|
|
|
|
#define DPASIGNATURE_ADDRESS 'BOAD'
|
|
#define DPASIGNATURE_ADDRESS_FREE 'BOA_'
|
|
|
|
// DP8ADDRESSELEMENT
|
|
//
|
|
// This structure contains all the information about a single element of the
|
|
// address. These address elements are allocated from a central, fixed
|
|
//
|
|
// 7/31/2000(RichGr) - IA64: FPM_Release() overwrites first 8 bytes. Rearrange position of dwSignature so that's OK.
|
|
typedef struct _DP8ADDRESSELEMENT
|
|
{
|
|
DWORD dwTagSize; // Size of the tag
|
|
DWORD dwType; // Element type DNADDRESS8_DATATYPE_XXXXXX
|
|
DWORD dwDataSize; // Size of the data
|
|
DWORD dwStringSize;
|
|
DWORD dwSignature; // Element debug signature
|
|
WCHAR *pszTag; // Tag for the element.
|
|
DWORD dwFlags; // Flags DNADDRESSELEMENT_XXXX
|
|
union {
|
|
GUID guidData;
|
|
DWORD dwData;
|
|
WCHAR szData[sizeof(GUID)];
|
|
PVOID pvData;
|
|
} uData; // Union
|
|
CBilink blAddressElements; // Bilink of address elements
|
|
} DP8ADDRESSELEMENT, *PDP8ADDRESSELEMENT;
|
|
|
|
// DP8ADDRESSELEMENT
|
|
//
|
|
// Data structure representing the address itself
|
|
class DP8ADDRESSOBJECT
|
|
{
|
|
public:
|
|
|
|
HRESULT Cleanup();
|
|
HRESULT Clear();
|
|
HRESULT Init();
|
|
HRESULT SetElement( const WCHAR * const pszTag, const void * const pvData, const DWORD dwDataSize, const DWORD dwDataType );
|
|
HRESULT GetElement( DWORD dwIndex, WCHAR * pszTag, PDWORD pdwTagSize, void * pvDataBuffer, PDWORD pdwDataSize, PDWORD pdwDataType );
|
|
HRESULT GetElement( const WCHAR * const pszTag, void * pvDataBuffer, PDWORD pdwDataSize, PDWORD pdwDataType );
|
|
HRESULT GetSP( GUID * pGuid );
|
|
HRESULT SetSP( LPCGUID const pGuid );
|
|
HRESULT GetDevice( GUID * pGuid );
|
|
HRESULT SetDevice( LPCGUID const pGuid );
|
|
HRESULT SetUserData( const void * const pvData, const DWORD dwDataSize );
|
|
HRESULT GetUserData( void * pvDataBuffer, PDWORD pdwDataSize );
|
|
|
|
HRESULT BuildURL( WCHAR * szURL, PDWORD pdwRequiredSize ) ;
|
|
HRESULT SetURL( WCHAR * szURL );
|
|
|
|
HRESULT GetElementType( const WCHAR * pszTag, PDWORD pdwType );
|
|
|
|
HRESULT Lock();
|
|
HRESULT UnLock();
|
|
|
|
HRESULT SetDirectPlay4Address( void * pvDataBuffer, const DWORD dwDataSize );
|
|
|
|
inline GetNumComponents() { return m_dwElements; };
|
|
|
|
inline void ENTERLOCK() { DNEnterCriticalSection( &m_csAddressLock ); };
|
|
inline void LEAVELOCK() { DNLeaveCriticalSection( &m_csAddressLock ); };
|
|
|
|
static void FPM_Element_BlockInit( void *pvItem );
|
|
static void FPM_Element_BlockRelease( void *pvItem );
|
|
|
|
static BOOL FPM_BlockCreate( void *pvItem );
|
|
static void FPM_BlockInit( void *pvItem );
|
|
static void FPM_BlockRelease( void *pvItem );
|
|
static void FPM_BlockDestroy( void *pvItem );
|
|
|
|
protected:
|
|
|
|
inline BOOL IsLocked() { return (m_iLockCount>0); };
|
|
|
|
HRESULT BuildURL_AddElements( WCHAR *szElements );
|
|
HRESULT BuildURL_AddHeader( WCHAR *szWorking );
|
|
HRESULT BuildURL_AddUserData( WCHAR *szWorking );
|
|
void BuildURL_AddString( WCHAR *szElements, WCHAR *szSource );
|
|
HRESULT BuildURL_AddBinaryData( WCHAR *szSource, BYTE *bData, DWORD dwDataLen );
|
|
|
|
HRESULT InternalGetElement( const WCHAR * const pszTag, PDP8ADDRESSELEMENT *ppaElement );
|
|
HRESULT InternalGetElement( const DWORD dwIndex, PDP8ADDRESSELEMENT *ppaElement );
|
|
HRESULT CalcComponentStringSize( PDP8ADDRESSELEMENT paddElement, PDWORD pdwSize );
|
|
DWORD CalcExpandedStringSize( WCHAR *szString );
|
|
DWORD CalcExpandedBinarySize( PBYTE pbData, DWORD dwDataSize );
|
|
BOOL IsEscapeChar( WCHAR ch );
|
|
BOOL IsValid();
|
|
|
|
DWORD m_dwSignature;
|
|
DNCRITICAL_SECTION m_csAddressLock;
|
|
DWORD m_dwStringSize;
|
|
DWORD m_dwElements;
|
|
PDP8ADDRESSELEMENT m_pSP;
|
|
PDP8ADDRESSELEMENT m_pAdapter;
|
|
PVOID m_pvUserData;
|
|
DWORD m_dwUserDataSize;
|
|
DWORD m_dwUserDataStringSize;
|
|
int m_iLockCount;
|
|
BOOL m_fValid;
|
|
CBilink m_blAddressElements;
|
|
|
|
};
|
|
|
|
typedef DP8ADDRESSOBJECT *PDP8ADDRESSOBJECT;
|
|
|
|
HRESULT DP8A_STRCACHE_Init();
|
|
void DP8A_STRCACHE_Free();
|
|
|
|
|
|
#endif
|
|
|