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.

125 lines
3.3 KiB

  1. /*==========================================================================
  2. *
  3. * Copyright (C) 1999 - 1999 Microsoft Corporation. All Rights Reserved.
  4. *
  5. * File: vnametbl.h
  6. * Content: Voice Player Name Table
  7. *
  8. * History:
  9. * Date By Reason
  10. * ==== == ======
  11. * 03/26/00 rodtoll Created
  12. * 06/02/00 rodtoll Updated so host migration algorithm returns ID as well as order ID
  13. * 07/01/2000 rodtoll Bug #38280 - DVMSGID_DELETEVOICEPLAYER messages are being sent in non-peer to peer sessions
  14. * Nametable will now only unravel with messages if session is peer to peer.
  15. * 07/09/2000 rodtoll Added signature bytes
  16. ***************************************************************************/
  17. #include "dxvoicepch.h"
  18. #undef DPF_SUBCOMP
  19. #define DPF_SUBCOMP DN_SUBCOMP_VOICE
  20. // DeInitialize
  21. //
  22. // Cleanup the name table
  23. #undef DPF_MODNAME
  24. #define DPF_MODNAME "CVoiceNameTable::DeInitialize"
  25. HRESULT CVoiceNameTable::DeInitialize(BOOL fUnRavel, PVOID pvContext, LPDVMESSAGEHANDLER pvMessageHandler )
  26. {
  27. CVoicePlayer *pPlayer;
  28. DVID dvID;
  29. PVOID pvPlayerContext;
  30. DVMSG_DELETEVOICEPLAYER dvMsgDelete;
  31. if( !m_fInitialized )
  32. return DV_OK;
  33. Lock();
  34. while( !m_nameTable.IsEmpty() )
  35. {
  36. if( m_nameTable.RemoveLastEntry( &pPlayer ) )
  37. {
  38. // Mark it as disconnected
  39. pPlayer->SetDisconnected();
  40. dvID = pPlayer->GetPlayerID();
  41. pvPlayerContext = pPlayer->GetContext();
  42. // Release the player record reference we had
  43. pPlayer->Release();
  44. if( pvMessageHandler != NULL )
  45. {
  46. if( fUnRavel )
  47. {
  48. // Drop locks to call up to user
  49. UnLock();
  50. dvMsgDelete.dvidPlayer = dvID;
  51. dvMsgDelete.dwSize = sizeof( DVMSG_DELETEVOICEPLAYER );
  52. dvMsgDelete.pvPlayerContext = pvPlayerContext;
  53. (*pvMessageHandler)( pvContext, DVMSGID_DELETEVOICEPLAYER, &dvMsgDelete );
  54. Lock();
  55. }
  56. }
  57. }
  58. }
  59. UnLock();
  60. m_nameTable.Deinitialize();
  61. m_fInitialized = FALSE;
  62. DNDeleteCriticalSection( &m_csTableLock );
  63. return DV_OK;
  64. }
  65. #undef DPF_MODNAME
  66. #define DPF_MODNAME "CVoiceNameTable::GetLowestHostOrderID"
  67. DWORD CVoiceNameTable::GetLowestHostOrderID(DVID *pdvidHost)
  68. {
  69. DWORD dwLowestID = DVPROTOCOL_HOSTORDER_INVALID;
  70. Lock();
  71. DWORD dwNumTableEntries = 1 << m_nameTable.m_iHashBitDepth;
  72. CBilink *blLink;
  73. CClassHashEntry<CVoicePlayer,DVID> *pEntry;
  74. // Search the list, finding the lowest ID
  75. for( DWORD dwIndex = 0; dwIndex < dwNumTableEntries; dwIndex++ )
  76. {
  77. blLink = &m_nameTable.m_pHashEntries[ dwIndex ];
  78. while ( blLink->GetNext() != &m_nameTable.m_pHashEntries[ dwIndex ] )
  79. {
  80. pEntry = CClassHashEntry<CVoicePlayer,DVID>::EntryFromBilink( blLink->GetNext() );
  81. DPFX(DPFPREP, DVF_HOSTMIGRATE_DEBUG_LEVEL, "HOST MIGRATION: ID [0x%x] ORDERID [0x%x]", pEntry->m_pItem->GetPlayerID(), pEntry->m_pItem->GetHostOrder() );
  82. if( pEntry->m_pItem->GetHostOrder() < dwLowestID )
  83. {
  84. DPFX(DPFPREP, DVF_HOSTMIGRATE_DEBUG_LEVEL, "HOST MIGRATION: ID [0x%x] IS CURRENT CANDIDATE", pEntry->m_pItem->GetPlayerID() );
  85. dwLowestID = pEntry->m_pItem->GetHostOrder();
  86. *pdvidHost = pEntry->m_pItem->GetPlayerID();
  87. }
  88. blLink = blLink->GetNext();
  89. }
  90. }
  91. UnLock();
  92. return dwLowestID;
  93. }