|
|
/*==========================================================================
* * Copyright (C) 2000-2002 Microsoft Corporation. All Rights Reserved. * * File: AppDesc.cpp * Content: Application Description Object *@@BEGIN_MSINTERNAL * History: * Date By Reason * ==== == ====== * 09/02/00 mjn Created * 09/14/2000 rmt Bug #44625 - CORE: Multihomed machines are not always enumerable (extra spew) * 01/25/01 mjn Fixed 64-bit alignment problem when unpacking AppDesc *@@END_MSINTERNAL * ***************************************************************************/
#include "dncorei.h"
//**********************************************************************
// Constant definitions
//**********************************************************************
//**********************************************************************
// Macro definitions
//**********************************************************************
//**********************************************************************
// Structure definitions
//**********************************************************************
//**********************************************************************
// Variable definitions
//**********************************************************************
//**********************************************************************
// Function prototypes
//**********************************************************************
//**********************************************************************
// Function definitions
//**********************************************************************
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::Initialize"
HRESULT CApplicationDesc::Initialize( void ) { memset(this,0,sizeof(CApplicationDesc));
m_Sig[0] = 'A'; m_Sig[1] = 'P'; m_Sig[2] = 'P'; m_Sig[3] = 'D';
if (!DNInitializeCriticalSection(&m_cs)) { return( DPNERR_OUTOFMEMORY ); }
return( DPN_OK ); }
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::Deinitialize"
void CApplicationDesc::Deinitialize( void ) { if (m_pwszSessionName) { DNFree(m_pwszSessionName); m_pwszSessionName = NULL; m_dwSessionNameSize = 0; }
if (m_pwszPassword) { DNFree(m_pwszPassword); m_pwszPassword = NULL; m_dwPasswordSize = 0; }
if (m_pvReservedData) { DNFree(m_pvReservedData); m_pvReservedData = NULL; m_dwReservedDataSize = 0; }
if (m_pvApplicationReservedData) { DNFree(m_pvApplicationReservedData); m_pvApplicationReservedData = NULL; m_dwApplicationReservedDataSize = 0; }
DNDeleteCriticalSection(&m_cs); }
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::Pack"
HRESULT CApplicationDesc::Pack(CPackedBuffer *const pPackedBuffer, const DWORD dwFlags) { HRESULT hResultCode; DPN_APPLICATION_DESC *pdpnAppDesc;
DPFX(DPFPREP, 6,"Parameters: pPackedBuffer [0x%p], dwFlags [0x%lx]",pPackedBuffer,dwFlags);
Lock();
//
// Add structure
//
pdpnAppDesc = reinterpret_cast<DPN_APPLICATION_DESC*>(pPackedBuffer->GetHeadAddress()); hResultCode = pPackedBuffer->AddToFront(NULL,sizeof(DPN_APPLICATION_DESC));
//
// Add session name
//
if ((dwFlags & DN_APPDESCINFO_FLAG_SESSIONNAME) && (m_dwSessionNameSize > 0)) { hResultCode = pPackedBuffer->AddToBack(m_pwszSessionName,m_dwSessionNameSize); if (hResultCode == DPN_OK) { pdpnAppDesc->pwszSessionName = static_cast<WCHAR*>(pPackedBuffer->GetTailAddress()); } } else { if (hResultCode == DPN_OK) { pdpnAppDesc->pwszSessionName = NULL; } }
//
// Add password
//
if ((dwFlags & DN_APPDESCINFO_FLAG_PASSWORD) && (m_dwPasswordSize > 0)) { hResultCode = pPackedBuffer->AddToBack(m_pwszPassword,m_dwPasswordSize); if (hResultCode == DPN_OK) { pdpnAppDesc->pwszPassword = static_cast<WCHAR*>(pPackedBuffer->GetTailAddress()); } } else { if (hResultCode == DPN_OK) { pdpnAppDesc->pwszPassword = NULL; } }
//
// Add reserved data
//
if ((dwFlags & DN_APPDESCINFO_FLAG_RESERVEDDATA) && (m_dwReservedDataSize > 0)) { PVOID pvReservedData; DWORD dwReservedDataSize; BYTE AppDescReservedData[DPN_MAX_APPDESC_RESERVEDDATA_SIZE];
//
// If we understand the reserved data, we want to pad the buffer so the user doesn't
// assume the data is less than DPN_MAX_APPDESC_RESERVEDDATA_SIZE bytes long.
//
if ((m_dwReservedDataSize == sizeof(SPSESSIONDATA_XNET)) && (*((DWORD*) m_pvReservedData) == SPSESSIONDATAINFO_XNET)) { SPSESSIONDATA_XNET * pSessionDataXNet;
pSessionDataXNet = (SPSESSIONDATA_XNET*) AppDescReservedData; memcpy(pSessionDataXNet, m_pvReservedData, m_dwReservedDataSize); memset((pSessionDataXNet + 1), (((BYTE*) (&pSessionDataXNet->ullKeyID))[1] ^ ((BYTE*) (&pSessionDataXNet->guidKey))[2]), (DPN_MAX_APPDESC_RESERVEDDATA_SIZE - sizeof(SPSESSIONDATA_XNET)));
pvReservedData = AppDescReservedData; dwReservedDataSize = DPN_MAX_APPDESC_RESERVEDDATA_SIZE; } else { pvReservedData = m_pvReservedData; dwReservedDataSize = m_dwReservedDataSize; } hResultCode = pPackedBuffer->AddToBack(pvReservedData, dwReservedDataSize); if (hResultCode == DPN_OK) { pdpnAppDesc->pvReservedData = pPackedBuffer->GetTailAddress(); pdpnAppDesc->dwReservedDataSize = dwReservedDataSize; } } else { if (hResultCode == DPN_OK) { pdpnAppDesc->pvReservedData = NULL; pdpnAppDesc->dwReservedDataSize = 0; } }
//
// Add app reserved data
//
if ((dwFlags & DN_APPDESCINFO_FLAG_APPRESERVEDDATA) && (m_dwApplicationReservedDataSize > 0)) { hResultCode = pPackedBuffer->AddToBack(m_pvApplicationReservedData,m_dwApplicationReservedDataSize); if (hResultCode == DPN_OK) { pdpnAppDesc->pvApplicationReservedData = pPackedBuffer->GetTailAddress(); pdpnAppDesc->dwApplicationReservedDataSize = m_dwApplicationReservedDataSize; } } else { if (hResultCode == DPN_OK) { pdpnAppDesc->pvApplicationReservedData = NULL; pdpnAppDesc->dwApplicationReservedDataSize = 0; } }
//
// Fill in remainder of structure (if space)
//
if (hResultCode == DPN_OK) { pdpnAppDesc->dwSize = sizeof(DPN_APPLICATION_DESC); pdpnAppDesc->dwFlags = m_dwFlags; pdpnAppDesc->dwMaxPlayers = m_dwMaxPlayers; pdpnAppDesc->dwCurrentPlayers = m_dwCurrentPlayers; memcpy(&pdpnAppDesc->guidInstance,&m_guidInstance,sizeof(GUID)); memcpy(&pdpnAppDesc->guidApplication,&m_guidApplication,sizeof(GUID)); }
Unlock();
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode); return(hResultCode); }
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::PackInfo"
HRESULT CApplicationDesc::PackInfo(CPackedBuffer *const pPackedBuffer, const DWORD dwFlags) { HRESULT hResultCode; DPN_APPLICATION_DESC_INFO *pInfo;
DPFX(DPFPREP, 6,"Parameters: pPackedBuffer [0x%p], dwFlags [0x%lx]",pPackedBuffer,dwFlags);
//
// Add structure
//
pInfo = reinterpret_cast<DPN_APPLICATION_DESC_INFO*>(pPackedBuffer->GetHeadAddress()); hResultCode = pPackedBuffer->AddToFront(NULL,sizeof(DPN_APPLICATION_DESC_INFO));
Lock();
//
// Add session name
//
if ((dwFlags & DN_APPDESCINFO_FLAG_SESSIONNAME) && (m_dwSessionNameSize > 0)) { hResultCode = pPackedBuffer->AddToBack(m_pwszSessionName,m_dwSessionNameSize); if (hResultCode == DPN_OK) { pInfo->dwSessionNameOffset = pPackedBuffer->GetTailOffset(); pInfo->dwSessionNameSize = m_dwSessionNameSize; } } else { if (hResultCode == DPN_OK) { pInfo->dwSessionNameOffset = 0; pInfo->dwSessionNameSize = 0; } }
//
// Add password
//
if ((dwFlags & DN_APPDESCINFO_FLAG_PASSWORD) && (m_dwPasswordSize > 0)) { hResultCode = pPackedBuffer->AddToBack(m_pwszPassword,m_dwPasswordSize); if (hResultCode == DPN_OK) { pInfo->dwPasswordOffset = pPackedBuffer->GetTailOffset(); pInfo->dwPasswordSize = m_dwPasswordSize; } } else { if (hResultCode == DPN_OK) { pInfo->dwPasswordOffset = 0; pInfo->dwPasswordSize = 0; } }
//
// Add reserved data
//
if ((dwFlags & DN_APPDESCINFO_FLAG_RESERVEDDATA) && (m_dwReservedDataSize > 0)) { hResultCode = pPackedBuffer->AddToBack(m_pvReservedData,m_dwReservedDataSize); if (hResultCode == DPN_OK) { pInfo->dwReservedDataOffset = pPackedBuffer->GetTailOffset(); pInfo->dwReservedDataSize = m_dwReservedDataSize; } } else { if (hResultCode == DPN_OK) { pInfo->dwReservedDataOffset = 0; pInfo->dwReservedDataSize = 0; } }
//
// Add app reserved data
//
if ((dwFlags & DN_APPDESCINFO_FLAG_APPRESERVEDDATA) && (m_dwApplicationReservedDataSize > 0)) { hResultCode = pPackedBuffer->AddToBack(m_pvApplicationReservedData,m_dwApplicationReservedDataSize); if (hResultCode == DPN_OK) { pInfo->dwApplicationReservedDataOffset = pPackedBuffer->GetTailOffset(); pInfo->dwApplicationReservedDataSize = m_dwApplicationReservedDataSize; } } else { if (hResultCode == DPN_OK) { pInfo->dwApplicationReservedDataOffset = 0; pInfo->dwApplicationReservedDataSize = 0; } }
//
// Fill in remainder of structure (if space)
//
if (hResultCode == DPN_OK) { pInfo->dwFlags = m_dwFlags; pInfo->dwMaxPlayers = m_dwMaxPlayers; pInfo->dwCurrentPlayers = m_dwCurrentPlayers; memcpy(&pInfo->guidInstance,&m_guidInstance,sizeof(GUID)); memcpy(&pInfo->guidApplication,&m_guidApplication,sizeof(GUID)); }
Unlock();
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode); return(hResultCode); }
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::UnpackInfo"
HRESULT CApplicationDesc::UnpackInfo(UNALIGNED DPN_APPLICATION_DESC_INFO *const pdnAppDescInfo, void *const pBufferStart, const DWORD dwFlags) { HRESULT hResultCode; WCHAR *pwszSessionName; WCHAR *pwszPassword; void *pvReservedData; void *pvApplicationReservedData;
DPFX(DPFPREP, 6,"Parameters: pdnAppDescInfo [0x%p], pBufferStart [0x%p], dwFlags [0x%lx]",pdnAppDescInfo,pBufferStart,dwFlags);
pwszSessionName = NULL; pwszPassword = NULL; pvReservedData = NULL; pvApplicationReservedData = NULL;
//
// We will allocate the required memory for the data fields first.
// If everything succeeds, we will update the object
//
//
// Session Name
//
if ((dwFlags & DN_APPDESCINFO_FLAG_SESSIONNAME) && (pdnAppDescInfo->dwSessionNameSize)) { if ((pwszSessionName = static_cast<WCHAR*>(DNMalloc(pdnAppDescInfo->dwSessionNameSize))) == NULL) { DPFERR("Could not allocate application desc session name"); hResultCode = DPNERR_OUTOFMEMORY; goto Failure; } memcpy( pwszSessionName, static_cast<BYTE*>(pBufferStart) + pdnAppDescInfo->dwSessionNameOffset, pdnAppDescInfo->dwSessionNameSize); }
//
// Password
//
if ((dwFlags & DN_APPDESCINFO_FLAG_PASSWORD) && (pdnAppDescInfo->dwPasswordSize)) { if ((pwszPassword = static_cast<WCHAR*>(DNMalloc(pdnAppDescInfo->dwPasswordSize))) == NULL) { DPFERR("Could not allocate application desc password"); hResultCode = DPNERR_OUTOFMEMORY; goto Failure; } memcpy( pwszPassword, static_cast<BYTE*>(pBufferStart) + pdnAppDescInfo->dwPasswordOffset, pdnAppDescInfo->dwPasswordSize); }
//
// Reserved Data
//
if ((dwFlags & DN_APPDESCINFO_FLAG_RESERVEDDATA) && (pdnAppDescInfo->dwReservedDataSize)) { if ((pvReservedData = DNMalloc(pdnAppDescInfo->dwReservedDataSize)) == NULL) { DPFERR("Could not allocate application desc reserved data"); hResultCode = DPNERR_OUTOFMEMORY; goto Failure; } memcpy( pvReservedData, static_cast<BYTE*>(pBufferStart) + pdnAppDescInfo->dwReservedDataOffset, pdnAppDescInfo->dwReservedDataSize); }
//
// Application Reserved Data
//
if ((dwFlags & DN_APPDESCINFO_FLAG_APPRESERVEDDATA) && (pdnAppDescInfo->dwApplicationReservedDataSize)) { if ((pvApplicationReservedData = DNMalloc(pdnAppDescInfo->dwApplicationReservedDataSize)) == NULL) { DPFERR("Could not allocate application desc app reserved data"); hResultCode = DPNERR_OUTOFMEMORY; goto Failure; } memcpy( pvApplicationReservedData, static_cast<BYTE*>(pBufferStart) + pdnAppDescInfo->dwApplicationReservedDataOffset, pdnAppDescInfo->dwApplicationReservedDataSize); }
//
// Replace old values in object
//
Lock();
//
// Session Name
//
if (dwFlags & DN_APPDESCINFO_FLAG_SESSIONNAME) { if (m_pwszSessionName) { DNFree(m_pwszSessionName); m_pwszSessionName = NULL; m_dwSessionNameSize = 0; } m_pwszSessionName = pwszSessionName; m_dwSessionNameSize = pdnAppDescInfo->dwSessionNameSize; }
//
// Password
//
if (dwFlags & DN_APPDESCINFO_FLAG_PASSWORD) { if (m_pwszPassword) { DNFree(m_pwszPassword); m_pwszPassword = NULL; m_dwPasswordSize = 0; } m_pwszPassword = pwszPassword; m_dwPasswordSize = pdnAppDescInfo->dwPasswordSize; }
//
// Reserved Data
//
if (dwFlags & DN_APPDESCINFO_FLAG_RESERVEDDATA) { if (m_pvReservedData) { DNFree(m_pvReservedData); m_pvReservedData = NULL; m_dwReservedDataSize = 0; } m_pvReservedData = pvReservedData; m_dwReservedDataSize = pdnAppDescInfo->dwReservedDataSize; }
//
// Application Reserved Data
//
if (dwFlags & DN_APPDESCINFO_FLAG_APPRESERVEDDATA) { if (m_pvApplicationReservedData) { DNFree(m_pvApplicationReservedData); m_pvApplicationReservedData = NULL; m_dwApplicationReservedDataSize = 0; } m_pvApplicationReservedData = pvApplicationReservedData; m_dwApplicationReservedDataSize = pdnAppDescInfo->dwApplicationReservedDataSize; }
//
// Remaining fields
//
m_dwMaxPlayers = pdnAppDescInfo->dwMaxPlayers; m_dwFlags = pdnAppDescInfo->dwFlags; memcpy(&m_guidInstance,&pdnAppDescInfo->guidInstance,sizeof(GUID)); memcpy(&m_guidApplication,&pdnAppDescInfo->guidApplication,sizeof(GUID));
Unlock();
hResultCode = DPN_OK;
Exit: DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode); return(hResultCode);
Failure: if (pwszSessionName) { DNFree(pwszSessionName); pwszSessionName = NULL; } if (pwszPassword) { DNFree(pwszPassword); pwszPassword = NULL; } if (pvReservedData) { DNFree(pvReservedData); pvReservedData = NULL; } if (pvApplicationReservedData) { DNFree(pvApplicationReservedData); pvApplicationReservedData = NULL; } goto Exit; }
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::Update"
HRESULT CApplicationDesc::Update(const DPN_APPLICATION_DESC *const pdnAppDesc, const DWORD dwFlags) { HRESULT hResultCode; WCHAR *pwszSessionName; DWORD dwSessionNameSize; WCHAR *pwszPassword; DWORD dwPasswordSize; void *pvReservedData; DWORD dwReservedDataSize; void *pvApplicationReservedData;
DPFX(DPFPREP, 6,"Parameters: pdnAppDesc [0x%p], dwFlags [0x%lx]",pdnAppDesc,dwFlags);
pwszSessionName = NULL; dwSessionNameSize = 0; pwszPassword = NULL; dwPasswordSize = 0; pvReservedData = NULL; dwReservedDataSize = 0; pvApplicationReservedData = NULL;
//
// We will allocate the required memory for the data fields first.
// If everything succeeds, we will update the object
//
//
// Session Name
//
if ((dwFlags & DN_APPDESCINFO_FLAG_SESSIONNAME) && (pdnAppDesc->pwszSessionName)) { dwSessionNameSize = (wcslen(pdnAppDesc->pwszSessionName) + 1) * sizeof(WCHAR); if ((pwszSessionName = static_cast<WCHAR*>(DNMalloc(dwSessionNameSize))) == NULL) { DPFERR("Could not allocate application desc session name"); hResultCode = DPNERR_OUTOFMEMORY; goto Failure; } memcpy( pwszSessionName, pdnAppDesc->pwszSessionName, dwSessionNameSize); }
//
// Password
//
if ((dwFlags & DN_APPDESCINFO_FLAG_PASSWORD) && (pdnAppDesc->pwszPassword)) { dwPasswordSize = (wcslen(pdnAppDesc->pwszPassword) + 1) * sizeof(WCHAR); if ((pwszPassword = static_cast<WCHAR*>(DNMalloc(dwPasswordSize))) == NULL) { DPFERR("Could not allocate application desc password"); hResultCode = DPNERR_OUTOFMEMORY; goto Failure; } memcpy( pwszPassword, pdnAppDesc->pwszPassword, dwPasswordSize); }
//
// Reserved Data
//
if ((dwFlags & DN_APPDESCINFO_FLAG_RESERVEDDATA) && (pdnAppDesc->pvReservedData)) { dwReservedDataSize = pdnAppDesc->dwReservedDataSize;
//
// We don't need to store all of the reserved data for types we understand.
//
if ((dwReservedDataSize == DPN_MAX_APPDESC_RESERVEDDATA_SIZE) && (*((DWORD*) pdnAppDesc->pvReservedData) == SPSESSIONDATAINFO_XNET)) { dwReservedDataSize = sizeof(SPSESSIONDATA_XNET); } if ((pvReservedData = DNMalloc(dwReservedDataSize)) == NULL) { DPFERR("Could not allocate application desc reserved data"); hResultCode = DPNERR_OUTOFMEMORY; goto Failure; } memcpy( pvReservedData, pdnAppDesc->pvReservedData, dwReservedDataSize); }
//
// Application Reserved Data
//
if ((dwFlags & DN_APPDESCINFO_FLAG_APPRESERVEDDATA) && (pdnAppDesc->pvApplicationReservedData)) { if ((pvApplicationReservedData = DNMalloc(pdnAppDesc->dwApplicationReservedDataSize)) == NULL) { DPFERR("Could not allocate application desc app reserved data"); hResultCode = DPNERR_OUTOFMEMORY; goto Failure; } memcpy( pvApplicationReservedData, pdnAppDesc->pvApplicationReservedData, pdnAppDesc->dwApplicationReservedDataSize); }
//
// Replace old values in object
//
//
// Session Name
//
if (dwFlags & DN_APPDESCINFO_FLAG_SESSIONNAME) { if (m_pwszSessionName) { DNFree(m_pwszSessionName); m_pwszSessionName = NULL; m_dwSessionNameSize = 0; } m_pwszSessionName = pwszSessionName; m_dwSessionNameSize = dwSessionNameSize; }
//
// Password
//
if (dwFlags & DN_APPDESCINFO_FLAG_PASSWORD) { if (m_pwszPassword) { DNFree(m_pwszPassword); m_pwszPassword = NULL; m_dwPasswordSize = 0; } m_pwszPassword = pwszPassword; m_dwPasswordSize = dwPasswordSize; }
//
// Reserved Data
//
if (dwFlags & DN_APPDESCINFO_FLAG_RESERVEDDATA) { if (m_pvReservedData) { DNFree(m_pvReservedData); m_pvReservedData = NULL; m_dwReservedDataSize = 0; } m_pvReservedData = pvReservedData; m_dwReservedDataSize = dwReservedDataSize; }
//
// Application Reserved Data
//
if (dwFlags & DN_APPDESCINFO_FLAG_APPRESERVEDDATA) { if (m_pvApplicationReservedData) { DNFree(m_pvApplicationReservedData); m_pvApplicationReservedData = NULL; m_dwApplicationReservedDataSize = 0; } m_pvApplicationReservedData = pvApplicationReservedData; m_dwApplicationReservedDataSize = pdnAppDesc->dwApplicationReservedDataSize; }
//
// Remaining fields
//
m_dwMaxPlayers = pdnAppDesc->dwMaxPlayers; m_dwFlags = pdnAppDesc->dwFlags; if (dwFlags & DN_APPDESCINFO_FLAG_GUIDS) { memcpy(&m_guidInstance,&pdnAppDesc->guidInstance,sizeof(GUID)); memcpy(&m_guidApplication,&pdnAppDesc->guidApplication,sizeof(GUID)); }
hResultCode = DPN_OK;
Exit: DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode); return(hResultCode);
Failure: if (pwszSessionName) { DNFree(pwszSessionName); pwszSessionName = NULL; } if (pwszPassword) { DNFree(pwszPassword); pwszPassword = NULL; } if (pvReservedData) { DNFree(pvReservedData); pvReservedData = NULL; } if (pvApplicationReservedData) { DNFree(pvApplicationReservedData); pvApplicationReservedData = NULL; } goto Exit; }
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::CreateNewInstanceGuid"
HRESULT CApplicationDesc::CreateNewInstanceGuid( void ) { HRESULT hResultCode;
hResultCode = DNCoCreateGuid(&m_guidInstance);
return(hResultCode); }
#ifndef DPNBUILD_SINGLEPROCESS
#undef DPF_SUBCOMP
#define DPF_SUBCOMP DN_SUBCOMP_DPNSVR
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::RegisterWithDPNSVR"
HRESULT CApplicationDesc::RegisterWithDPNSVR( IDirectPlay8Address *const pListenAddr ) { HRESULT hResultCode;
#ifdef DBG
DPFX(DPFPREP, 8, "Registering w/DPNSVR" );
TCHAR szTmpAddress[200]; DWORD dwSize = 200;
hResultCode = IDirectPlay8Address_GetURL( pListenAddr, szTmpAddress, &dwSize ); if( FAILED( hResultCode ) ) { DPFX(DPFPREP, 1, "Failed to get URL of listen for debug purposes hr=0x%x", hResultCode ); } else { DPFX(DPFPREP, 8, "Listen on: [%s]", szTmpAddress ); }
#endif // DBG
hResultCode = DPNSVR_Register( &m_guidApplication,&m_guidInstance,pListenAddr );
DPFX(DPFPREP, 8, "Request result hr=0x%x", hResultCode ); return(hResultCode); }
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::UnregisterWithDPNSVR"
HRESULT CApplicationDesc::UnregisterWithDPNSVR( void ) { HRESULT hResultCode;
hResultCode = DPNSVR_UnRegister( &m_guidApplication,&m_guidInstance ); return(hResultCode); }
#endif // ! DPNBUILD_SINGLEPROCESS
#undef DPF_SUBCOMP
#define DPF_SUBCOMP DN_SUBCOMP_CORE
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::IncPlayerCount"
HRESULT CApplicationDesc::IncPlayerCount(const BOOL fCheckLimit) { HRESULT hResultCode;
Lock();
if ((fCheckLimit) && (m_dwMaxPlayers) && (m_dwCurrentPlayers >= m_dwMaxPlayers)) { hResultCode = DPNERR_SESSIONFULL; } else { m_dwCurrentPlayers++; hResultCode = DPN_OK; }
Unlock();
return(hResultCode); }
#undef DPF_MODNAME
#define DPF_MODNAME "CApplicationDesc::DecPlayerCount"
void CApplicationDesc::DecPlayerCount( void ) { Lock(); m_dwCurrentPlayers--; Unlock(); }
#undef DPF_MODNAME
#define DPF_MODNAME "DNProcessUpdateAppDesc"
HRESULT DNProcessUpdateAppDesc(DIRECTNETOBJECT *const pdnObject, DPN_APPLICATION_DESC_INFO *const pv) { HRESULT hResultCode;
DPFX(DPFPREP, 6,"Parameters: pv [0x%p]",pv);
DNASSERT(pdnObject != NULL); DNASSERT(pv != NULL);
hResultCode = pdnObject->ApplicationDesc.UnpackInfo(pv, pv, DN_APPDESCINFO_FLAG_SESSIONNAME | DN_APPDESCINFO_FLAG_PASSWORD | DN_APPDESCINFO_FLAG_RESERVEDDATA | DN_APPDESCINFO_FLAG_APPRESERVEDDATA);
hResultCode = DNUserUpdateAppDesc(pdnObject);
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode); return(hResultCode); }
|