Source code of Windows XP (NT5)
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.

215 lines
4.4 KiB

  1. // File: iMember.cpp
  2. //
  3. // INmMember interface (participant routines)
  4. #include "precomp.h"
  5. #include "imember.h"
  6. #include "imanager.h" // for g_pNodeController
  7. /* C N M M E M B E R */
  8. /*-------------------------------------------------------------------------
  9. %%Function: CNmMember Constructor
  10. -------------------------------------------------------------------------*/
  11. CNmMember::CNmMember(PWSTR pwszName, DWORD dwGCCID, DWORD dwFlags, ULONG uCaps) :
  12. m_bstrName (SysAllocString(pwszName)),
  13. m_dwGCCID (dwGCCID),
  14. m_dwFlags (dwFlags),
  15. m_uCaps (uCaps),
  16. m_uNmchCaps (0),
  17. m_dwGccIdParent(INVALID_GCCID)
  18. {
  19. DebugEntry(CNmMember::CNmMember);
  20. // Local state never changes
  21. m_fLocal = 0 != (PF_LOCAL_NODE & m_dwFlags);
  22. DebugExitVOID(CNmMember::CNmMember);
  23. }
  24. CNmMember::~CNmMember(void)
  25. {
  26. DebugEntry(CNmMember::~CNmMember);
  27. if (m_bstrName)
  28. {
  29. SysFreeString(m_bstrName);
  30. m_bstrName = NULL;
  31. }
  32. DebugExitVOID(CNmMember::~CNmMember);
  33. }
  34. VOID CNmMember::SetGccIdParent(DWORD dwGccId)
  35. {
  36. m_dwGccIdParent = dwGccId;
  37. if (0 == dwGccId)
  38. {
  39. // No Parent means this is the Top Provider
  40. m_dwFlags |= PF_T120_TOP_PROV;
  41. }
  42. else
  43. {
  44. m_dwFlags &= ~PF_T120_TOP_PROV;
  45. }
  46. }
  47. ///////////////////////////
  48. // CNmMember:IUknown
  49. ULONG STDMETHODCALLTYPE CNmMember::AddRef(void)
  50. {
  51. DebugEntry(CNmMember::AddRef);
  52. TRACE_OUT(("CNmMember [%ls]: AddRef this = 0x%X", m_bstrName ? m_bstrName : L"", this));
  53. ULONG ul = RefCount::AddRef();
  54. DebugExitULONG(CNmMember::AddRef, ul);
  55. return ul;
  56. }
  57. ULONG STDMETHODCALLTYPE CNmMember::Release(void)
  58. {
  59. DebugEntry(CNmMember::Release);
  60. TRACE_OUT(("CNmMember [%ls]: Release this = 0x%X", m_bstrName ? m_bstrName : L"", this));
  61. ULONG ul = RefCount::Release();
  62. DebugExitULONG(CNmMember::Release, ul);
  63. return ul;
  64. }
  65. HRESULT STDMETHODCALLTYPE CNmMember::QueryInterface(REFIID riid, PVOID *ppv)
  66. {
  67. HRESULT hr = S_OK;
  68. if ((riid == IID_INmMember) || (riid == IID_IUnknown))
  69. {
  70. *ppv = (INmMember *)this;
  71. TRACE_OUT(("CNmMember::QueryInterface()"));
  72. }
  73. else
  74. {
  75. hr = E_NOINTERFACE;
  76. *ppv = NULL;
  77. TRACE_OUT(("CNmMember::QueryInterface(): Called on unknown interface."));
  78. }
  79. if (S_OK == hr)
  80. {
  81. AddRef();
  82. }
  83. return hr;
  84. }
  85. ///////////////
  86. // INmMember
  87. HRESULT STDMETHODCALLTYPE CNmMember::GetName(BSTR *pbstrName)
  88. {
  89. if (NULL == pbstrName)
  90. return E_POINTER;
  91. *pbstrName = SysAllocString(m_bstrName);
  92. return *pbstrName ? S_OK : E_FAIL;
  93. }
  94. HRESULT STDMETHODCALLTYPE CNmMember::GetID(ULONG *puID)
  95. {
  96. if (NULL == puID)
  97. return E_POINTER;
  98. *puID = m_dwGCCID;
  99. return (0 != m_dwGCCID) ? S_OK : NM_E_NO_T120_CONFERENCE;
  100. }
  101. STDMETHODIMP CNmMember::GetConference(INmConference **ppConference)
  102. {
  103. return ::GetConference(ppConference);
  104. }
  105. HRESULT STDMETHODCALLTYPE CNmMember::IsSelf(void)
  106. {
  107. return m_fLocal ? S_OK : S_FALSE;
  108. }
  109. HRESULT STDMETHODCALLTYPE CNmMember::IsMCU(void)
  110. {
  111. return (m_dwFlags & PF_T120_MCU) ? S_OK : S_FALSE;
  112. }
  113. HRESULT STDMETHODCALLTYPE CNmMember::Eject(void)
  114. {
  115. if (m_fLocal)
  116. return E_FAIL; // can't eject ourselves.
  117. CNmMember * pMemberLocal = GetLocalMember();
  118. if ((NULL == pMemberLocal) || !pMemberLocal->FTopProvider())
  119. return E_FAIL; // only top providers should be allowed to do this
  120. CConfObject * pco = ::GetConfObject();
  121. if (NULL != pco)
  122. {
  123. ASSERT(g_pNodeController);
  124. ASSERT(pco->GetConfHandle());
  125. pco->GetConfHandle()->EjectUser(m_dwGCCID);
  126. }
  127. return S_OK;
  128. }
  129. ///////////////////////////////////////////////////////////////////////
  130. // Utility Functions
  131. /* G E T L O C A L M E M B E R */
  132. /*-------------------------------------------------------------------------
  133. %%Function: GetLocalMember
  134. -------------------------------------------------------------------------*/
  135. CNmMember * GetLocalMember(void)
  136. {
  137. CConfObject * pco = ::GetConfObject();
  138. if (NULL == pco)
  139. return NULL;
  140. return pco->GetLocalMember();
  141. }
  142. /* P M E M B E R F R O M G C C I D */
  143. /*-------------------------------------------------------------------------
  144. %%Function: PMemberFromGCCID
  145. -------------------------------------------------------------------------*/
  146. CNmMember * PMemberFromGCCID(UINT uNodeID)
  147. {
  148. CConfObject* pco = ::GetConfObject();
  149. if (NULL == pco)
  150. return NULL;
  151. return pco->PMemberFromGCCID(uNodeID);
  152. }
  153. CNmMember * PMemberFromName(PCWSTR pwszName)
  154. {
  155. CConfObject* pco = ::GetConfObject();
  156. if (NULL == pco)
  157. return NULL;
  158. return pco->PMemberFromName(pwszName);
  159. }