You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1659 lines
51 KiB
1659 lines
51 KiB
/*==========================================================================
|
|
*
|
|
* Copyright (C) 2000-2001 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: User.cpp
|
|
* Content: DNET user call-back routines
|
|
*@@BEGIN_MSINTERNAL
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 08/02/99 mjn Created
|
|
* 01/06/00 mjn Moved NameTable stuff to NameTable.h
|
|
* 01/07/00 mjn Allow reply in DN_UserIndicateConnect
|
|
* 01/08/00 mjn DN_UserIndicateConnect provides failed buffer back to DN_UserConnectComplete
|
|
* 01/10/00 mjn Added DN_UserUpdateAppDesc
|
|
* 01/16/00 mjn Upgraded to new UserMessageHandler definition
|
|
* 01/17/00 mjn Added DN_UserHostMigrate
|
|
* 01/17/00 mjn Implemented send time
|
|
* 01/18/00 rmt Added calls into voice layer for events
|
|
* 01/22/00 mjn Added DN_UserHostDestroyPlayer
|
|
* 01/27/00 mjn Added support for retention of receive buffers
|
|
* 01/28/00 mjn Added DN_UserConnectionTerminated
|
|
* 02/01/00 mjn Implement Player/Group context values
|
|
* 02/01/00 mjn Implement Player/Group context values
|
|
* 03/24/00 mjn Set player context through INDICATE_CONNECT notification
|
|
* 04/04/00 mjn Added DN_UserTerminateSession()
|
|
* 04/05/00 mjn Updated DN_UserHostDestroyPlayer()
|
|
* 04/18/00 mjn Added DN_UserReturnBuffer
|
|
* mjn Added ppvReplyContext to DN_UserIndicateConnect
|
|
* 04/19/00 mjn Removed hAsyncOp (unused) from DPNMSG_INDICATE_CONNECT
|
|
* 06/26/00 mjn Added reasons for DELETE_PLAYER and DESTROY_GROUP
|
|
* 07/29/00 mjn Added DNUserIndicatedConnectAborted()
|
|
* mjn DNUserConnectionTerminated() supercedes DN_TerminateSession()
|
|
* mjn Added HRESULT to DNUserReturnBuffer()
|
|
* 07/30/00 mjn Added pAddressDevice to DNUserIndicateConnect()
|
|
* mjn Use DNUserTerminateSession() rather than DNUserConnectionTerminated()
|
|
* 07/31/00 mjn DN_UserDestroyGroup() -> DNUserDestroyGroup()
|
|
* mjn DN_UserDeletePlayer() -> DNUserDestroyPlayer()
|
|
* mjn Removed DN_UserHostDestroyPlayer()
|
|
* mjn Renamed DPN_MSGID_ASYNC_OPERATION_COMPLETE to DPN_MSGID_ASYNC_OP_COMPLETE
|
|
* 08/01/00 mjn DN_UserReceive() -> DNUserReceive()
|
|
* 08/02/00 mjn DN_UserAddPlayer() -> DNUserCreatePlayer()
|
|
* 08/05/00 RichGr IA64: Use %p format specifier in DPFs for 32/64-bit pointers and handles.
|
|
* 08/08/00 mjn DN_UserCreateGroup() -> DNUserCreateGroup()
|
|
* 08/20/00 mjn Added DNUserEnumQuery() and DNUserEnumResponse()
|
|
* 09/17/00 mjn Changed parameters list of DNUserCreateGroup(),DNUserCreatePlayer(),
|
|
* DNUserAddPlayerToGroup(),DNUserRemovePlayerFromGroup()
|
|
* 02/05/01 mjn Added CCallbackThread
|
|
* 07/24/01 mjn Added DPNBUILD_NOSERVER compile flag
|
|
* 10/16/01 vanceo Added some multicast callbacks
|
|
*@@END_MSINTERNAL
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include "dncorei.h"
|
|
|
|
|
|
// DNUserConnectComplete
|
|
//
|
|
// Send a CONNECT_COMPLETE message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserConnectComplete"
|
|
|
|
HRESULT DNUserConnectComplete(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNHANDLE hAsyncOp,
|
|
PVOID const pvContext,
|
|
const HRESULT hr,
|
|
CRefCountBuffer *const pRefCountBuffer)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_CONNECT_COMPLETE Msg;
|
|
CNameTableEntry *pLocalPlayer = NULL;
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: hAsyncOp [0x%lx], pvContext [0x%p], hr [0x%lx], pRefCountBuffer [0x%p]",
|
|
hAsyncOp,pvContext,hr,pRefCountBuffer);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_CONNECT_COMPLETE);
|
|
Msg.pvUserContext = pvContext;
|
|
Msg.hAsyncOp = hAsyncOp;
|
|
Msg.hResultCode = hr;
|
|
if (pRefCountBuffer)
|
|
{
|
|
Msg.pvApplicationReplyData = pRefCountBuffer->GetBufferAddress();
|
|
Msg.dwApplicationReplyDataSize = pRefCountBuffer->GetBufferSize();
|
|
}
|
|
else
|
|
{
|
|
Msg.pvApplicationReplyData = NULL;
|
|
Msg.dwApplicationReplyDataSize = 0;
|
|
}
|
|
if (pdnObject->NameTable.GetLocalPlayerRef(&pLocalPlayer) == DPN_OK)
|
|
{
|
|
Msg.dpnidLocal = pLocalPlayer->GetDPNID();
|
|
pLocalPlayer->Release();
|
|
pLocalPlayer = NULL;
|
|
}
|
|
else
|
|
{
|
|
Msg.dpnidLocal = 0;
|
|
}
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_CONNECT_COMPLETE,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DNASSERT( pLocalPlayer == NULL );
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserIndicateConnect
|
|
//
|
|
// Send an INDICATE_CONNECT message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserIndicateConnect"
|
|
|
|
HRESULT DNUserIndicateConnect(DIRECTNETOBJECT *const pdnObject,
|
|
PVOID const pvConnectData,
|
|
const DWORD dwConnectDataSize,
|
|
void **const ppvReplyData,
|
|
DWORD *const pdwReplyDataSize,
|
|
void **const ppvReplyContext,
|
|
IDirectPlay8Address *const pAddressPlayer,
|
|
IDirectPlay8Address *const pAddressDevice,
|
|
void **const ppvPlayerContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_INDICATE_CONNECT Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pvConnectData [0x%p], dwConnectDataSize [%ld], ppvReplyData [0x%p], pdwReplyDataSize [0x%p]",
|
|
pvConnectData,dwConnectDataSize,ppvReplyData,pdwReplyDataSize);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
DNASSERT(ppvReplyData != NULL);
|
|
DNASSERT(pdwReplyDataSize != NULL);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_INDICATE_CONNECT);
|
|
Msg.pvUserConnectData = pvConnectData;
|
|
Msg.dwUserConnectDataSize = dwConnectDataSize;
|
|
Msg.pvReplyData = NULL;
|
|
Msg.dwReplyDataSize = 0;
|
|
Msg.pvReplyContext = NULL;
|
|
Msg.pvPlayerContext = NULL;
|
|
Msg.pAddressPlayer = pAddressPlayer;
|
|
Msg.pAddressDevice = pAddressDevice;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_INDICATE_CONNECT,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
*ppvReplyData = Msg.pvReplyData;
|
|
*pdwReplyDataSize = Msg.dwReplyDataSize;
|
|
*ppvReplyContext = Msg.pvReplyContext;
|
|
*ppvPlayerContext = Msg.pvPlayerContext;
|
|
|
|
if (hResultCode != DPN_OK)
|
|
{
|
|
hResultCode = DPNERR_HOSTREJECTEDCONNECTION;
|
|
}
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserIndicatedConnectAborted
|
|
//
|
|
// Send an INDICATED_CONNECT_ABORTED message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserIndicatedConnectAborted"
|
|
|
|
HRESULT DNUserIndicatedConnectAborted(DIRECTNETOBJECT *const pdnObject,
|
|
void *const pvPlayerContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_INDICATED_CONNECT_ABORTED Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pvPlayerContext [0x%p]",pvPlayerContext);
|
|
|
|
DNASSERT(pdnObject != NULL);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_INDICATED_CONNECT_ABORTED);
|
|
Msg.pvPlayerContext = pvPlayerContext;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_INDICATED_CONNECT_ABORTED,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserCreatePlayer
|
|
//
|
|
// Send a CREATE_PLAYER message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserCreatePlayer"
|
|
|
|
HRESULT DNUserCreatePlayer(DIRECTNETOBJECT *const pdnObject,
|
|
CNameTableEntry *const pNTEntry)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_CREATE_PLAYER Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pNTEntry [0x%p]",pNTEntry);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
#ifndef DPNBUILD_NOVOICE
|
|
Voice_Notify( pdnObject, DVEVENT_ADDPLAYER, pNTEntry->GetDPNID(), 0 );
|
|
#endif // !DPNBUILD_NOVOICE
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_CREATE_PLAYER);
|
|
Msg.dpnidPlayer = pNTEntry->GetDPNID();
|
|
Msg.pvPlayerContext = pNTEntry->GetContext();
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_CREATE_PLAYER,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
//
|
|
// Save context value on NameTableEntry
|
|
//
|
|
pNTEntry->Lock();
|
|
pNTEntry->SetContext( Msg.pvPlayerContext );
|
|
pNTEntry->SetCreated();
|
|
pNTEntry->Unlock();
|
|
|
|
pNTEntry->NotifyRelease();
|
|
|
|
DPFX(DPFPREP, 7,"Set context [0x%p]",pNTEntry->GetContext());
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserDestroyPlayer
|
|
//
|
|
// Send a DESTROY_PLAYER message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserDestroyPlayer"
|
|
|
|
HRESULT DNUserDestroyPlayer(DIRECTNETOBJECT *const pdnObject,
|
|
CNameTableEntry *const pNTEntry)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_DESTROY_PLAYER Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pNTEntry [0x%p]",pNTEntry);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
DNASSERT(pNTEntry != NULL);
|
|
DNASSERT(pNTEntry->GetDPNID() != 0);
|
|
DNASSERT(pNTEntry->GetDestroyReason() != 0);
|
|
|
|
#ifndef DPNBUILD_NOVOICE
|
|
Voice_Notify( pdnObject, DVEVENT_REMOVEPLAYER, pNTEntry->GetDPNID(), 0 );
|
|
#endif // !DPNBUILD_NOVOICE
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_DESTROY_PLAYER);
|
|
Msg.dpnidPlayer = pNTEntry->GetDPNID();
|
|
Msg.pvPlayerContext = pNTEntry->GetContext();
|
|
Msg.dwReason = pNTEntry->GetDestroyReason();
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_DESTROY_PLAYER,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserCreateGroup
|
|
//
|
|
// Send an CREATE_GROUP message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserCreateGroup"
|
|
|
|
HRESULT DNUserCreateGroup(DIRECTNETOBJECT *const pdnObject,
|
|
CNameTableEntry *const pNTEntry)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_CREATE_GROUP Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pNTEntry [0x%p]",pNTEntry);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
#ifndef DPNBUILD_NOVOICE
|
|
Voice_Notify( pdnObject, DVEVENT_CREATEGROUP, pNTEntry->GetDPNID(), 0 );
|
|
#endif // !DPNBUILD_NOVOICE
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_CREATE_GROUP);
|
|
Msg.dpnidGroup = pNTEntry->GetDPNID();
|
|
if (pNTEntry->IsAutoDestructGroup())
|
|
{
|
|
CNameTableEntry *pOwner = NULL;
|
|
|
|
Msg.dpnidOwner = pNTEntry->GetOwner();
|
|
|
|
if (pdnObject->NameTable.FindEntry(pNTEntry->GetOwner(),&pOwner) == DPN_OK)
|
|
{
|
|
Msg.pvOwnerContext = pOwner->GetContext();
|
|
|
|
pOwner->Release();
|
|
pOwner = NULL;
|
|
}
|
|
|
|
DNASSERT( pOwner == NULL );
|
|
}
|
|
else
|
|
{
|
|
Msg.dpnidOwner = 0;
|
|
}
|
|
Msg.pvGroupContext = pNTEntry->GetContext();
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_CREATE_GROUP,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
//
|
|
// Save context value on NameTableEntry
|
|
//
|
|
pNTEntry->Lock();
|
|
pNTEntry->SetContext( Msg.pvGroupContext );
|
|
pNTEntry->SetCreated();
|
|
pNTEntry->Unlock();
|
|
|
|
pNTEntry->NotifyRelease();
|
|
|
|
DPFX(DPFPREP, 7,"Set context [0x%p]",pNTEntry->GetContext());
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserDestroyGroup
|
|
//
|
|
// Send a DESTROY_GROUP message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserDestroyGroup"
|
|
|
|
HRESULT DNUserDestroyGroup(DIRECTNETOBJECT *const pdnObject,
|
|
CNameTableEntry *const pNTEntry)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_DESTROY_GROUP Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pNTEntry [0x%p]",pNTEntry);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
DNASSERT(pNTEntry != NULL);
|
|
DNASSERT(pNTEntry->GetDPNID() != 0);
|
|
DNASSERT(pNTEntry->GetDestroyReason() != 0);
|
|
|
|
#ifndef DPNBUILD_NOVOICE
|
|
Voice_Notify( pdnObject, DVEVENT_DELETEGROUP, pNTEntry->GetDPNID(), 0 );
|
|
#endif // !DPNBUILD_NOVOICE
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_DESTROY_GROUP);
|
|
Msg.dpnidGroup = pNTEntry->GetDPNID();
|
|
Msg.pvGroupContext = pNTEntry->GetContext();
|
|
Msg.dwReason = pNTEntry->GetDestroyReason();
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_DESTROY_GROUP,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserAddPlayerToGroup
|
|
//
|
|
// Send an ADD_PLAYER_TO_GROUP message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserAddPlayerToGroup"
|
|
|
|
HRESULT DNUserAddPlayerToGroup(DIRECTNETOBJECT *const pdnObject,
|
|
CNameTableEntry *const pGroup,
|
|
CNameTableEntry *const pPlayer)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_ADD_PLAYER_TO_GROUP Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pGroup [0x%p], pPlayer [0x%p]",pGroup,pPlayer);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
DNASSERT(pGroup != NULL);
|
|
DNASSERT(pPlayer != NULL);
|
|
|
|
#ifndef DPNBUILD_NOVOICE
|
|
Voice_Notify( pdnObject, DVEVENT_ADDPLAYERTOGROUP, pGroup->GetDPNID(), pPlayer->GetDPNID() );
|
|
#endif // !DPNBUILD_NOVOICE
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_ADD_PLAYER_TO_GROUP);
|
|
Msg.dpnidGroup = pGroup->GetDPNID();
|
|
Msg.pvGroupContext = pGroup->GetContext();
|
|
Msg.dpnidPlayer = pPlayer->GetDPNID();
|
|
Msg.pvPlayerContext = pPlayer->GetContext();
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_ADD_PLAYER_TO_GROUP,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserRemovePlayerFromGroup
|
|
//
|
|
// Send a REMOVE_PLAYER_FROM_GROUP message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserRemovePlayerFromGroup"
|
|
|
|
HRESULT DNUserRemovePlayerFromGroup(DIRECTNETOBJECT *const pdnObject,
|
|
CNameTableEntry *const pGroup,
|
|
CNameTableEntry *const pPlayer)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_REMOVE_PLAYER_FROM_GROUP Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pGroup [0x%p], pPlayer [0x%p]",pGroup,pPlayer);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
DNASSERT(pGroup != NULL);
|
|
DNASSERT(pPlayer != NULL);
|
|
|
|
#ifndef DPNBUILD_NOVOICE
|
|
Voice_Notify( pdnObject, DVEVENT_REMOVEPLAYERFROMGROUP, pGroup->GetDPNID(), pPlayer->GetDPNID());
|
|
#endif // !DPNBUILD_NOVOICE
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_REMOVE_PLAYER_FROM_GROUP);
|
|
Msg.dpnidGroup = pGroup->GetDPNID();
|
|
Msg.pvGroupContext = pGroup->GetContext();
|
|
Msg.dpnidPlayer = pPlayer->GetDPNID();
|
|
Msg.pvPlayerContext = pPlayer->GetContext();
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_REMOVE_PLAYER_FROM_GROUP,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserUpdateGroupInfo"
|
|
|
|
HRESULT DNUserUpdateGroupInfo(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNID dpnid,
|
|
const PVOID pvContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_GROUP_INFO MsgGroupInfo;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: dpnid [0x%lx], pvContext [0x%p]",dpnid,pvContext);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
MsgGroupInfo.dwSize = sizeof(DPNMSG_GROUP_INFO);
|
|
MsgGroupInfo.dpnidGroup = dpnid;
|
|
MsgGroupInfo.pvGroupContext = pvContext;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_GROUP_INFO,reinterpret_cast<BYTE*>(&MsgGroupInfo));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserUpdatePeerInfo"
|
|
|
|
HRESULT DNUserUpdatePeerInfo(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNID dpnid,
|
|
const PVOID pvContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_PEER_INFO MsgPeerInfo;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: dpnid [0x%lx], pvContext [0x%p]",dpnid,pvContext);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
MsgPeerInfo.dwSize = sizeof(DPNMSG_PEER_INFO);
|
|
MsgPeerInfo.dpnidPeer = dpnid;
|
|
MsgPeerInfo.pvPlayerContext = pvContext;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_PEER_INFO,reinterpret_cast<BYTE*>(&MsgPeerInfo));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
#ifndef DPNBUILD_NOSERVER
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserUpdateClientInfo"
|
|
|
|
HRESULT DNUserUpdateClientInfo(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNID dpnid,
|
|
const PVOID pvContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_CLIENT_INFO MsgClientInfo;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: dpnid [0x%lx], pvContext [0x%p]",dpnid,pvContext);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
MsgClientInfo.dwSize = sizeof(DPNMSG_CLIENT_INFO);
|
|
MsgClientInfo.dpnidClient = dpnid;
|
|
MsgClientInfo.pvPlayerContext = pvContext;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_CLIENT_INFO,reinterpret_cast<BYTE*>(&MsgClientInfo));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
#endif // DPNBUILD_NOSERVER
|
|
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserUpdateServerInfo"
|
|
|
|
HRESULT DNUserUpdateServerInfo(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNID dpnid,
|
|
const PVOID pvContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_SERVER_INFO MsgServerInfo;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: dpnid [0x%lx], pvContext [0x%p]",dpnid,pvContext);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
MsgServerInfo.dwSize = sizeof(DPNMSG_SERVER_INFO);
|
|
MsgServerInfo.dpnidServer = dpnid;
|
|
MsgServerInfo.pvPlayerContext = pvContext;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_SERVER_INFO,reinterpret_cast<BYTE*>(&MsgServerInfo));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserAsyncComplete
|
|
//
|
|
// Send a DN_MSGID_ASYNC_OPERATION_COMPLETE message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserAsyncComplete"
|
|
|
|
HRESULT DNUserAsyncComplete(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNHANDLE hAsyncOp,
|
|
PVOID const pvContext,
|
|
const HRESULT hr)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_ASYNC_OP_COMPLETE Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: hAsyncOp [0x%lx], pvContext [0x%p], hr [0x%lx]",hAsyncOp,pvContext,hr);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_ASYNC_OP_COMPLETE);
|
|
Msg.hAsyncOp = hAsyncOp;
|
|
Msg.pvUserContext = pvContext;
|
|
Msg.hResultCode = hr;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_ASYNC_OP_COMPLETE,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserSendComplete
|
|
//
|
|
// Send a DN_MSGID_SEND_COMPLETE message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserSendComplete"
|
|
|
|
HRESULT DNUserSendComplete(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNHANDLE hAsyncOp,
|
|
PVOID const pvContext,
|
|
const DWORD dwStartTime,
|
|
const HRESULT hr,
|
|
const DWORD dwFirstFrameRTT,
|
|
const DWORD dwFirstFrameRetryCount)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_SEND_COMPLETE Msg;
|
|
DWORD dwEndTime;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: hAsyncOp [0x%lx], pvContext [0x%p], hr [0x%lx]",hAsyncOp,pvContext,hr);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_SEND_COMPLETE);
|
|
Msg.hAsyncOp = hAsyncOp;
|
|
Msg.pvUserContext = pvContext;
|
|
Msg.hResultCode = hr;
|
|
dwEndTime = GETTIMESTAMP();
|
|
Msg.dwSendTime = dwEndTime - dwStartTime;
|
|
Msg.dwFirstFrameRTT = dwFirstFrameRTT;
|
|
Msg.dwFirstFrameRetryCount = dwFirstFrameRetryCount;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_SEND_COMPLETE,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserUpdateAppDesc
|
|
//
|
|
// Send a DN_MSGID_APPLICATION_DESC message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserUpdateAppDesc"
|
|
|
|
HRESULT DNUserUpdateAppDesc(DIRECTNETOBJECT *const pdnObject)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: (none)");
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_APPLICATION_DESC,NULL);
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserReceive
|
|
//
|
|
// Send a DN_MSGID_RECEIVE message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserReceive"
|
|
|
|
HRESULT DNUserReceive(DIRECTNETOBJECT *const pdnObject,
|
|
CNameTableEntry *const pNTEntry,
|
|
BYTE *const pBufferData,
|
|
const DWORD dwBufferSize,
|
|
const DPNHANDLE hBufferHandle)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_RECEIVE Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pNTEntry [0x%p], pBufferData [0x%p], dwBufferSize [%ld], hBufferHandle [0x%lx]",
|
|
pNTEntry,pBufferData,dwBufferSize,hBufferHandle);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
DNASSERT(pNTEntry != NULL);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_RECEIVE);
|
|
Msg.pReceiveData = pBufferData;
|
|
Msg.dwReceiveDataSize = dwBufferSize;
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_CLIENT)
|
|
{
|
|
Msg.dpnidSender = 0;
|
|
}
|
|
else
|
|
{
|
|
Msg.dpnidSender = pNTEntry->GetDPNID();
|
|
}
|
|
Msg.pvPlayerContext = pNTEntry->GetContext();
|
|
Msg.hBufferHandle = hBufferHandle;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_RECEIVE,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
if (hResultCode != DPNERR_PENDING)
|
|
{
|
|
hResultCode = DPN_OK;
|
|
}
|
|
|
|
pNTEntry->NotifyRelease();
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DN_UserHostMigrate
|
|
//
|
|
// Send a DN_MSGID_HOST_MIGRATE message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DN_UserHostMigrate"
|
|
|
|
HRESULT DN_UserHostMigrate(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNID dpnidNewHost,
|
|
const PVOID pvPlayerContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_HOST_MIGRATE Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: (none)");
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
#ifndef DPNBUILD_NOVOICE
|
|
Voice_Notify( pdnObject, DVEVENT_MIGRATEHOST, dpnidNewHost, 0 );
|
|
#endif // !DPNBUILD_NOVOICE
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_HOST_MIGRATE);
|
|
Msg.dpnidNewHost = dpnidNewHost;
|
|
Msg.pvPlayerContext = pvPlayerContext;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_HOST_MIGRATE,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserTerminateSession
|
|
//
|
|
// Send a DN_MSGID_CONNECTION_TERMINATED message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserTerminateSession"
|
|
|
|
HRESULT DNUserTerminateSession(DIRECTNETOBJECT *const pdnObject,
|
|
const HRESULT hr,
|
|
void *const pvTerminateData,
|
|
const DWORD dwTerminateDataSize)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_TERMINATE_SESSION Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: hr [0x%lx],pvTerminateData [0x%p], dwTerminateDataSize [%ld]",
|
|
hr,pvTerminateData,dwTerminateDataSize);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_TERMINATE_SESSION);
|
|
Msg.hResultCode = hr;
|
|
Msg.pvTerminateData = pvTerminateData;
|
|
Msg.dwTerminateDataSize = dwTerminateDataSize;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_TERMINATE_SESSION,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserReturnBuffer
|
|
//
|
|
// Send a DPN_MSGID_RETURN_BUFFER message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserReturnBuffer"
|
|
|
|
HRESULT DNUserReturnBuffer(DIRECTNETOBJECT *const pdnObject,
|
|
const HRESULT hr,
|
|
void *const pvBuffer,
|
|
void *const pvUserContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_RETURN_BUFFER Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: hr [0x%lx], pvBuffer [0x%p], pvUserContext [0x%p]",hr,pvBuffer,pvUserContext);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_RETURN_BUFFER);
|
|
Msg.hResultCode = hr;
|
|
Msg.pvBuffer = pvBuffer;
|
|
Msg.pvUserContext = pvUserContext;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_RETURN_BUFFER,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserEnumQuery
|
|
//
|
|
// Send a DPN_MSGID_ENUM_QUERY message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserEnumQuery"
|
|
|
|
HRESULT DNUserEnumQuery(DIRECTNETOBJECT *const pdnObject,
|
|
DPNMSG_ENUM_HOSTS_QUERY *const pMsg)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pMsg [0x%p]",pMsg);
|
|
|
|
DNASSERT(pdnObject != NULL);
|
|
DNASSERT(pMsg != NULL);
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_ENUM_HOSTS_QUERY,reinterpret_cast<BYTE*>(pMsg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserEnumResponse
|
|
//
|
|
// Send a DPN_MSGID_ENUM_RESPONSE message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserEnumResponse"
|
|
|
|
HRESULT DNUserEnumResponse(DIRECTNETOBJECT *const pdnObject,
|
|
DPNMSG_ENUM_HOSTS_RESPONSE *const pMsg)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pMsg [0x%p]",pMsg);
|
|
|
|
DNASSERT(pdnObject != NULL);
|
|
DNASSERT(pMsg != NULL);
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_ENUM_HOSTS_RESPONSE,reinterpret_cast<BYTE*>(pMsg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
#ifndef DPNBUILD_NOMULTICAST
|
|
|
|
|
|
// DNUserJoinComplete
|
|
//
|
|
// Send a JOIN_COMPLETE message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserJoinComplete"
|
|
|
|
HRESULT DNUserJoinComplete(DIRECTNETOBJECT *const pdnObject,
|
|
const DPNHANDLE hAsyncOp,
|
|
PVOID const pvContext,
|
|
const HRESULT hr)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_JOIN_COMPLETE Msg;
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: hAsyncOp [0x%lx], pvContext [0x%p], hr [0x%lx]",
|
|
hAsyncOp,pvContext,hr);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_JOIN_COMPLETE);
|
|
Msg.hAsyncOp = hAsyncOp;
|
|
Msg.pvUserContext = pvContext;
|
|
Msg.hResultCode = hr;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_JOIN_COMPLETE,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Deinitialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserReceiveMulticast
|
|
//
|
|
// Send a DN_MSGID_RECEIVE_MULTICAST message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserReceiveMulticast"
|
|
|
|
HRESULT DNUserReceiveMulticast(DIRECTNETOBJECT *const pdnObject,
|
|
void * const pvSenderContext,
|
|
IDirectPlay8Address *const pSenderAddress,
|
|
IDirectPlay8Address *const pDeviceAddress,
|
|
BYTE *const pBufferData,
|
|
const DWORD dwBufferSize,
|
|
const DPNHANDLE hBufferHandle)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_RECEIVE_MULTICAST Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pvSenderContext [0x%p], pSenderAddress [0x%p], pDeviceAddress [0x%p], pBufferData [0x%p], dwBufferSize [%ld], hBufferHandle [0x%lx]",
|
|
pvSenderContext,pSenderAddress,pDeviceAddress,pBufferData,dwBufferSize,hBufferHandle);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_RECEIVE_MULTICAST);
|
|
Msg.pvSenderContext = pvSenderContext;
|
|
Msg.pAddressSender = pSenderAddress;
|
|
Msg.pAddressDevice = pDeviceAddress;
|
|
Msg.pReceiveData = pBufferData;
|
|
Msg.dwReceiveDataSize = dwBufferSize;
|
|
Msg.hBufferHandle = hBufferHandle;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_RECEIVE_MULTICAST,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
if (hResultCode != DPNERR_PENDING)
|
|
{
|
|
hResultCode = DPN_OK;
|
|
}
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
// DNUserCreateSenderContext
|
|
//
|
|
// Send a CREATE_SENDER_CONTEXT message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserCreateSenderContext"
|
|
|
|
HRESULT DNUserCreateSenderContext(DIRECTNETOBJECT *const pdnObject,
|
|
void *const pvContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_CREATE_SENDER_CONTEXT Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pvContext [0x%p]",pvContext);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_CREATE_SENDER_CONTEXT);
|
|
Msg.pvSenderContext = pvContext;
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_CREATE_SENDER_CONTEXT,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
|
|
// DNUserDestroySenderContext
|
|
//
|
|
// Send a DESTROY_SENDER_CONTEXT message to the user's message handler
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNUserDestroySenderContext"
|
|
|
|
HRESULT DNUserDestroySenderContext(DIRECTNETOBJECT *const pdnObject,
|
|
void *const pvContext)
|
|
{
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
CCallbackThread CallbackThread;
|
|
#endif // ! DPNBUILD_NOPARAMVAL
|
|
HRESULT hResultCode;
|
|
DPNMSG_DESTROY_SENDER_CONTEXT Msg;
|
|
|
|
DPFX(DPFPREP, 6,"Parameters: pvContext [0x%p]",pvContext);
|
|
|
|
// ensure initialized (need message handler)
|
|
DNASSERT(pdnObject->dwFlags & DN_OBJECT_FLAG_INITIALIZED);
|
|
|
|
Msg.dwSize = sizeof(DPNMSG_DESTROY_SENDER_CONTEXT);
|
|
Msg.pvSenderContext = pvContext;
|
|
//Msg.dwReason = pNTEntry->GetDestroyReason();
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
CallbackThread.Initialize();
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->InsertBefore(&pdnObject->m_bilinkCallbackThreads);
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = (pdnObject->pfnDnUserMessageHandler)(pdnObject->pvUserContext,
|
|
DPN_MSGID_DESTROY_SENDER_CONTEXT,reinterpret_cast<BYTE*>(&Msg));
|
|
|
|
#ifndef DPNBUILD_NOPARAMVAL
|
|
if (pdnObject->dwFlags & DN_OBJECT_FLAG_PARAMVALIDATION)
|
|
{
|
|
DNEnterCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.GetCallbackThreadsBilink()->RemoveFromList();
|
|
DNLeaveCriticalSection(&pdnObject->csCallbackThreads);
|
|
CallbackThread.Deinitialize();
|
|
}
|
|
#endif // !DPNBUILD_NOPARAMVAL
|
|
|
|
hResultCode = DPN_OK;
|
|
|
|
DPFX(DPFPREP, 6,"Returning: [0x%lx]",hResultCode);
|
|
return(hResultCode);
|
|
}
|
|
|
|
#endif // ! DPNBUILD_NOMULTICAST
|
|
|