2025-04-27 07:49:33 -04:00

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