/*========================================================================== * * Copyright (C) 2000 Microsoft Corporation. All Rights Reserved. * * File: GroupMem.h * Content: Group Membership Object Header File *@@BEGIN_MSINTERNAL * History: * Date By Reason * ==== == ====== * 03/03/00 mjn Created * 08/05/99 mjn Modified SetMembership to perform duplicate check and get NameTable version internally * 09/17/99 mjn Added GROUP_MEMBER_FLAG_NEED_TO_ADD,GROUP_MEMBER_FLAG_NEED_TO_REMOVE *@@END_MSINTERNAL * ***************************************************************************/ #ifndef __GROUPMEM_H__ #define __GROUPMEM_H__ //********************************************************************** // Constant definitions //********************************************************************** #define GROUP_MEMBER_FLAG_VALID 0x0001 #define GROUP_MEMBER_FLAG_AVAILABLE 0x0002 #define GROUP_MEMBER_FLAG_NEED_TO_ADD 0x0004 #define GROUP_MEMBER_FLAG_NEED_TO_REMOVE 0x0008 //********************************************************************** // Macro definitions //********************************************************************** //********************************************************************** // Structure definitions //********************************************************************** class CPackedBuffer; class CGroupConnection; class CNameTableEntry; typedef struct _DIRECTNETOBJECT DIRECTNETOBJECT; // // Used to pass NameTable group membership // typedef struct _DN_NAMETABLE_MEMBERSHIP_INFO { DPNID dpnidPlayer; DPNID dpnidGroup; DWORD dwVersion; DWORD dwVersionNotUsed; } DN_NAMETABLE_MEMBERSHIP_INFO, *PDN_NAMETABLE_MEMBERSHIP_INFO; //********************************************************************** // Variable definitions //********************************************************************** //********************************************************************** // Function prototypes //********************************************************************** //********************************************************************** // Class prototypes //********************************************************************** // class for Group Members class CGroupMember { public: #undef DPF_MODNAME #define DPF_MODNAME "CGroupMember::FPMAlloc" static BOOL FPMAlloc( void* pvItem, void* pvContext ) { CGroupMember* pGroupMember = (CGroupMember*)pvItem; pGroupMember->m_Sig[0] = 'G'; pGroupMember->m_Sig[1] = 'M'; pGroupMember->m_Sig[2] = 'E'; pGroupMember->m_Sig[3] = 'M'; if (!DNInitializeCriticalSection(&pGroupMember->m_cs)) { return(FALSE); } DebugSetCriticalSectionRecursionCount(&pGroupMember->m_cs,0); pGroupMember->m_bilinkPlayers.Initialize(); pGroupMember->m_bilinkGroups.Initialize(); return(TRUE); }; #undef DPF_MODNAME #define DPF_MODNAME "CGroupMember::FPMInitialize" static void FPMInitialize( void* pvItem, void* pvContext ) { CGroupMember* pGroupMember = (CGroupMember*)pvItem; pGroupMember->m_pdnObject = static_cast(pvContext); pGroupMember->m_dwFlags = 0; pGroupMember->m_lRefCount = 1; pGroupMember->m_pGroup = NULL; pGroupMember->m_pPlayer = NULL; pGroupMember->m_pGroupConnection = NULL; DNASSERT(pGroupMember->m_bilinkPlayers.IsEmpty()); DNASSERT(pGroupMember->m_bilinkGroups.IsEmpty()); }; #undef DPF_MODNAME #define DPF_MODNAME "CGroupMember::FPMRelease" static void FPMRelease( void* pvItem ) { const CGroupMember* pGroupMember = (CGroupMember*)pvItem; DNASSERT(pGroupMember->m_bilinkPlayers.IsEmpty()); DNASSERT(pGroupMember->m_bilinkGroups.IsEmpty()); }; #undef DPF_MODNAME #define DPF_MODNAME "CGroupMember::FPMDealloc" static void FPMDealloc( void* pvItem ) { CGroupMember* pGroupMember = (CGroupMember*)pvItem; DNDeleteCriticalSection(&pGroupMember->m_cs); }; void MakeValid( void ) { m_dwFlags |= GROUP_MEMBER_FLAG_VALID; }; void MakeInvalid( void ) { m_dwFlags &= (~GROUP_MEMBER_FLAG_VALID); }; BOOL IsValid( void ) const { if (m_dwFlags & GROUP_MEMBER_FLAG_VALID) return(TRUE); return(FALSE); }; #undef DPF_MODNAME #define DPF_MODNAME "CGroupMember::MakeAvailable" void MakeAvailable( void ) { DNASSERT(m_pGroup != NULL); DNASSERT(m_pPlayer != NULL); m_dwFlags |= GROUP_MEMBER_FLAG_AVAILABLE; }; #undef DPF_MODNAME #define DPF_MODNAME "CGroupMember::MakeUnavailable" void MakeUnavailable( void ) { m_dwFlags &= (~GROUP_MEMBER_FLAG_AVAILABLE); }; BOOL IsAvailable( void ) const { if (m_dwFlags & GROUP_MEMBER_FLAG_AVAILABLE) return(TRUE); return(FALSE); }; void SetNeedToAdd( void ) { m_dwFlags |= GROUP_MEMBER_FLAG_NEED_TO_ADD; }; void ClearNeedToAdd( void ) { m_dwFlags &= (~GROUP_MEMBER_FLAG_NEED_TO_ADD); }; BOOL IsNeedToAdd( void ) const { if (m_dwFlags & GROUP_MEMBER_FLAG_NEED_TO_ADD) { return( TRUE ); } return( FALSE ); }; void SetNeedToRemove( void ) { m_dwFlags |= GROUP_MEMBER_FLAG_NEED_TO_REMOVE; }; void ClearNeedToRemove( void ) { m_dwFlags &= (~GROUP_MEMBER_FLAG_NEED_TO_REMOVE); }; BOOL IsNeedToRemove( void ) const { if (m_dwFlags & GROUP_MEMBER_FLAG_NEED_TO_REMOVE) { return( TRUE ); } return( FALSE ); }; void AddRef( void ) { DNInterlockedIncrement(&m_lRefCount); }; void Release( void ); void ReturnSelfToPool( void ); void Lock( void ) { DNEnterCriticalSection(&m_cs); }; void Unlock( void ) { DNLeaveCriticalSection(&m_cs); }; void CGroupMember::RemoveMembership( DWORD *const pdnVersion ); void SetVersion( const DWORD dwVersion ) { m_dwVersion = dwVersion; }; DWORD GetVersion( void ) const { return(m_dwVersion); }; HRESULT CGroupMember::SetMembership(CNameTableEntry *const pGroup, CNameTableEntry *const pPlayer, DWORD *const pdwVersion); CNameTableEntry *GetGroup( void ) { return(m_pGroup); }; CNameTableEntry *GetPlayer( void ) { return(m_pPlayer); }; void SetGroupConnection( CGroupConnection *const pGroupConnection ); CGroupConnection *GetGroupConnection( void ) { return(m_pGroupConnection); }; HRESULT CGroupMember::PackMembershipInfo(CPackedBuffer *const pPackedBuffer); CBilink m_bilinkPlayers; // Players in this group CBilink m_bilinkGroups; // Groups this player belongs to private: BYTE m_Sig[4]; DWORD m_dwFlags; LONG m_lRefCount; CNameTableEntry *m_pPlayer; CNameTableEntry *m_pGroup; CGroupConnection *m_pGroupConnection; DWORD m_dwVersion; DWORD m_dwVersionNotUsed; DIRECTNETOBJECT *m_pdnObject; #ifndef DPNBUILD_ONLYONETHREAD DNCRITICAL_SECTION m_cs; #endif // !DPNBUILD_ONLYONETHREAD }; #undef DPF_MODNAME #endif // __GROUPMEM_H__