Leaked source code of windows server 2003
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.

210 lines
4.7 KiB

  1. /*==========================================================================
  2. *
  3. * Copyright (C) 2000 Microsoft Corporation. All Rights Reserved.
  4. *
  5. * File: GroupMem.cpp
  6. * Content: Group Membership object routines
  7. *@@BEGIN_MSINTERNAL
  8. * History:
  9. * Date By Reason
  10. * ==== == ======
  11. * 03/03/00 mjn Created
  12. * 08/05/99 mjn Modified SetMembership to perform duplicate check and get NameTable version internally
  13. * 08/15/00 mjn Allow NULL pGroupConnection in SetGroupConnection()
  14. * 09/17/00 mjn Remove locks from SetMembership()
  15. * 09/26/00 mjn Assume NameTable locks are taken for AddMembership() and RemoveMembership()
  16. *@@END_MSINTERNAL
  17. *
  18. ***************************************************************************/
  19. #include "dncorei.h"
  20. void CGroupMember::ReturnSelfToPool( void )
  21. {
  22. g_GroupMemberPool.Release( this );
  23. };
  24. #undef DPF_MODNAME
  25. #define DPF_MODNAME "CGroupMember::Release"
  26. void CGroupMember::Release( void )
  27. {
  28. LONG lRefCount;
  29. lRefCount = DNInterlockedDecrement(&m_lRefCount);
  30. if (lRefCount == 0)
  31. {
  32. DNASSERT(!(m_dwFlags & GROUP_MEMBER_FLAG_AVAILABLE));
  33. if (m_pGroup != NULL)
  34. {
  35. m_pGroup->Release();
  36. m_pGroup = NULL;
  37. }
  38. if (m_pPlayer != NULL)
  39. {
  40. m_pPlayer->Release();
  41. m_pPlayer = NULL;
  42. }
  43. if (m_pGroupConnection != NULL)
  44. {
  45. m_pGroupConnection->Release();
  46. m_pGroupConnection = NULL;
  47. }
  48. ReturnSelfToPool();
  49. }
  50. }
  51. #undef DPF_MODNAME
  52. #define DPF_MODNAME "CGroupMember::SetMembership"
  53. HRESULT CGroupMember::SetMembership(CNameTableEntry *const pGroup,
  54. CNameTableEntry *const pPlayer,
  55. DWORD *const pdwVersion)
  56. {
  57. HRESULT hResultCode;
  58. CBilink *pBilink;
  59. CGroupMember *pGroupMember;
  60. DNASSERT(pGroup != NULL);
  61. DNASSERT(pPlayer != NULL);
  62. //
  63. // THIS ASSUMES THAT LOCKS FOR NameTable,pGroup,pPlayer and 'this' are taken (in that order) !
  64. //
  65. //
  66. // Scan group list to ensure this player is not a member already
  67. //
  68. pBilink = pGroup->m_bilinkMembership.GetNext();
  69. while (pBilink != &pGroup->m_bilinkMembership)
  70. {
  71. pGroupMember = CONTAINING_OBJECT(pBilink,CGroupMember,m_bilinkPlayers);
  72. if (pGroupMember->GetPlayer() == pPlayer)
  73. {
  74. hResultCode = DPNERR_PLAYERALREADYINGROUP;
  75. goto Failure;
  76. }
  77. pBilink = pBilink->GetNext();
  78. }
  79. //
  80. // Version stuff
  81. //
  82. if (pdwVersion)
  83. {
  84. if (*pdwVersion)
  85. {
  86. DPFX(DPFPREP, 7,"Version already specified");
  87. m_dwVersion = *pdwVersion;
  88. m_pdnObject->NameTable.SetVersion(*pdwVersion);
  89. }
  90. else
  91. {
  92. DPFX(DPFPREP, 7,"New version required");
  93. m_pdnObject->NameTable.GetNewVersion( &m_dwVersion );
  94. *pdwVersion = m_dwVersion;
  95. }
  96. }
  97. else
  98. {
  99. m_dwVersion = 0;
  100. }
  101. //
  102. // Update
  103. //
  104. AddRef();
  105. pGroup->AddRef();
  106. m_pGroup = pGroup;
  107. AddRef();
  108. pPlayer->AddRef();
  109. m_pPlayer = pPlayer;
  110. m_bilinkGroups.InsertBefore(&pPlayer->m_bilinkMembership);
  111. m_bilinkPlayers.InsertBefore(&pGroup->m_bilinkMembership);
  112. if (m_pGroupConnection)
  113. {
  114. m_pGroupConnection->AddToConnectionList( &pGroup->m_bilinkConnections );
  115. }
  116. hResultCode = DPN_OK;
  117. Exit:
  118. return(hResultCode);
  119. Failure:
  120. goto Exit;
  121. }
  122. void CGroupMember::RemoveMembership( DWORD *const pdnVersion )
  123. {
  124. //
  125. // THIS ASSUMES THAT LOCKS FOR NameTable,pGroup,pPlayer and 'this' are taken (in that order) !
  126. // Since there will be several Release()'d items, someone should keep a reference on them
  127. // so that they don't get free'd with all of the locks taken !
  128. //
  129. m_pGroup->Release();
  130. m_pGroup = NULL;
  131. Release();
  132. m_pPlayer->Release();
  133. m_pPlayer = NULL;
  134. Release();
  135. m_bilinkGroups.RemoveFromList();
  136. m_bilinkPlayers.RemoveFromList();
  137. if (m_pGroupConnection)
  138. {
  139. m_pGroupConnection->RemoveFromConnectionList();
  140. }
  141. if (pdnVersion)
  142. {
  143. if (*pdnVersion != 0)
  144. {
  145. m_pdnObject->NameTable.SetVersion( *pdnVersion );
  146. }
  147. else
  148. {
  149. m_pdnObject->NameTable.GetNewVersion( pdnVersion );
  150. }
  151. }
  152. };
  153. void CGroupMember::SetGroupConnection( CGroupConnection *const pGroupConnection )
  154. {
  155. if (pGroupConnection)
  156. {
  157. pGroupConnection->AddRef();
  158. }
  159. m_pGroupConnection = pGroupConnection;
  160. }
  161. HRESULT CGroupMember::PackMembershipInfo(CPackedBuffer *const pPackedBuffer)
  162. {
  163. HRESULT hResultCode;
  164. DN_NAMETABLE_MEMBERSHIP_INFO *pdnMembershipInfo;
  165. pdnMembershipInfo = static_cast<DN_NAMETABLE_MEMBERSHIP_INFO*>(pPackedBuffer->GetHeadAddress());
  166. if ((hResultCode = pPackedBuffer->AddToFront(NULL,sizeof(DN_NAMETABLE_MEMBERSHIP_INFO))) == DPN_OK)
  167. {
  168. pdnMembershipInfo->dpnidGroup = m_pGroup->GetDPNID();
  169. pdnMembershipInfo->dpnidPlayer = m_pPlayer->GetDPNID();
  170. pdnMembershipInfo->dwVersion = m_dwVersion;
  171. pdnMembershipInfo->dwVersionNotUsed = 0;
  172. }
  173. return(hResultCode);
  174. }