/*========================================================================== * * Copyright (C) 2000-2002 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 #ifdef DPNBUILD_ONLYONESP // DPNA_KEY_PROVIDER DPNA_SEPARATOR_KEYVALUE CLSID_DP8SP_TCPIP encoded #define DPNA_BUILTINPROVIDER DPNA_KEY_PROVIDER L"=%7BEBFE7BA0-628D-11D2-AE0F-006097B01411%7D" // Characters in the above string, not including NULL terminator #define DNURL_LENGTH_BUILTINPROVIDER (8 + 1 + DNURL_LENGTH_GUID) #endif // DPNBUILD_ONLYONESP #define DP8A_ENTERLEVEL 2 #define DP8A_INFOLEVEL 7 #define DP8A_ERRORLEVEL 0 #define DP8A_WARNINGLEVEL 1 #define DP8A_PARAMLEVEL 3 extern const WCHAR *g_szBaseStrings[]; extern const DWORD g_dwBaseRequiredTypes[]; extern const DWORD c_dwNumBaseStrings; #ifndef DPNBUILD_NOPARAMVAL #ifdef DBG extern BOOL IsValidDP8AObject( LPVOID lpvObject ); #define DP8A_VALID(a) IsValidDP8AObject( a ) #else // !DBG #define DP8A_VALID(a) TRUE #endif // !DBG #endif // !DPNBUILD_NOPARAMVAL #define DP8A_RETURN( x ) DPFX(DPFPREP, DP8A_ENTERLEVEL, "Function returning hr=0x%x", x ); \ return x; extern CFixedPool fpmAddressObjects; extern CFixedPool fpmAddressElements; extern CStringCache *g_pcstrKeyCache; #ifndef DPNBUILD_PREALLOCATEDMEMORYMODEL #define DP8ADDRESS_ELEMENT_HEAP 0x00000001 #endif // ! DPNBUILD_PREALLOCATEDMEMORYMODEL #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. #define MAX_EMBEDDED_STRING_LENGTH 64 // in wide characters (i.e. 128 bytes) 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[MAX_EMBEDDED_STRING_LENGTH]; #ifndef DPNBUILD_PREALLOCATEDMEMORYMODEL PVOID pvData; #endif // ! DPNBUILD_PREALLOCATEDMEMORYMODEL } uData; // Union CBilink blAddressElements; // Bilink of address elements } DP8ADDRESSELEMENT, *PDP8ADDRESSELEMENT; // DP8ADDRESSELEMENT // // Data structure representing the address itself class DP8ADDRESSOBJECT { public: #ifdef DPNBUILD_LIBINTERFACE // // For lib interface builds, the interface Vtbl and refcount are embedded // in the object itself. // LPVOID lpVtbl; // must be first entry in structure LONG lRefCount; #endif // DPNBUILD_LIBINTERFACE HRESULT Cleanup(); HRESULT Clear(); HRESULT Copy( DP8ADDRESSOBJECT * const pAddressSource ); 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 ); #ifndef DPNBUILD_ONLYONESP HRESULT GetSP( GUID * pGuid ); HRESULT SetSP( const GUID* const pGuid ); #endif // ! DPNBUILD_ONLYONESP #ifndef DPNBUILD_ONLYONEADAPTER HRESULT GetDevice( GUID * pGuid ); HRESULT SetDevice( const GUID* const pGuid ); #endif // ! DPNBUILD_ONLYONEADAPTER HRESULT SetUserData( const void * const pvData, const DWORD dwDataSize ); HRESULT GetUserData( void * pvDataBuffer, PDWORD pdwDataSize ); HRESULT BuildURLA( char * szURL, PDWORD pdwRequiredSize ) ; HRESULT BuildURLW( WCHAR * szURL, PDWORD pdwRequiredSize ) ; HRESULT SetURL( WCHAR * szURL ); HRESULT GetElementType( const WCHAR * pszTag, PDWORD pdwType ); HRESULT SetDirectPlay4Address( void * pvDataBuffer, const DWORD dwDataSize ); inline GetNumComponents() const { return m_dwElements; }; inline void ENTERLOCK() { DNEnterCriticalSection( &m_csAddressLock ); }; inline void LEAVELOCK() { DNLeaveCriticalSection( &m_csAddressLock ); }; static void FPM_Element_BlockInit( void *pvItem, PVOID pvContext ); static void FPM_Element_BlockRelease( void *pvItem ); static BOOL FPM_BlockCreate( void *pvItem, PVOID pvContext ); static void FPM_BlockInit( void *pvItem, PVOID pvContext ); static void FPM_BlockRelease( void *pvItem ); static void FPM_BlockDestroy( void *pvItem ); protected: HRESULT BuildURL_AddElements( WCHAR *szElements ); static 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 ); static BOOL IsEscapeChar( WCHAR ch ); DWORD m_dwSignature; #ifndef DPNBUILD_ONLYONETHREAD DNCRITICAL_SECTION m_csAddressLock; #endif // !DPNBUILD_ONLYONETHREAD DWORD m_dwStringSize; DWORD m_dwElements; #ifndef DPNBUILD_ONLYONESP PDP8ADDRESSELEMENT m_pSP; #endif // ! DPNBUILD_ONLYONESP #ifndef DPNBUILD_ONLYONEADAPTER PDP8ADDRESSELEMENT m_pAdapter; #endif // ! DPNBUILD_ONLYONEADAPTER PVOID m_pvUserData; DWORD m_dwUserDataSize; DWORD m_dwUserDataStringSize; CBilink m_blAddressElements; }; typedef DP8ADDRESSOBJECT *PDP8ADDRESSOBJECT; HRESULT DP8A_STRCACHE_Init(); void DP8A_STRCACHE_Free(); #endif // __ADDCORE_H