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.

381 lines
8.5 KiB

  1. // File: iMember.cpp
  2. //
  3. // INmMember interface (participant routines)
  4. #include "precomp.h"
  5. #include "imember.h"
  6. #include "rostinfo.h"
  7. #include "imanager.h" // for g_pNodeController
  8. /* C N M M E M B E R */
  9. /*-------------------------------------------------------------------------
  10. %%Function: CNmMember Constructor
  11. -------------------------------------------------------------------------*/
  12. CNmMember::CNmMember(PWSTR pwszName, DWORD dwGCCID, DWORD dwFlags, ULONG uCaps,
  13. REFGUID rguidNode, PVOID pwszUserInfo, UINT cbUserInfo) :
  14. m_bstrName (SysAllocString(pwszName)),
  15. m_dwGCCID (dwGCCID),
  16. m_dwFlags (dwFlags),
  17. m_uCaps (uCaps),
  18. m_guidNode (rguidNode),
  19. m_cbUserInfo (cbUserInfo),
  20. m_uNmchCaps (0),
  21. m_dwGccIdParent(INVALID_GCCID),
  22. m_pwszUserInfo (NULL),
  23. m_pConnection(NULL)
  24. {
  25. // Local state never changes
  26. m_fLocal = 0 != (PF_LOCAL_NODE & m_dwFlags);
  27. // check to see if we have the right GUID for local member
  28. // guid will be NULL if we have H323 disabled.
  29. ASSERT (!m_fLocal || (GUID_NULL == rguidNode) || (g_guidLocalNodeId == rguidNode));
  30. SetUserInfo(pwszUserInfo, cbUserInfo);
  31. DbgMsg(iZONE_OBJECTS, "Obj: %08X created CNmMember", this);
  32. }
  33. CNmMember::~CNmMember(void)
  34. {
  35. SysFreeString(m_bstrName);
  36. delete m_pwszUserInfo;
  37. if(m_pConnection)
  38. m_pConnection->Release();
  39. DbgMsg(iZONE_OBJECTS, "Obj: %08X destroyed CNmMember", this);
  40. }
  41. VOID CNmMember::SetGccIdParent(DWORD dwGccId)
  42. {
  43. m_dwGccIdParent = dwGccId;
  44. if (0 == dwGccId)
  45. {
  46. // No Parent means this is the Top Provider
  47. m_dwFlags |= PF_T120_TOP_PROV;
  48. }
  49. else
  50. {
  51. m_dwFlags &= ~PF_T120_TOP_PROV;
  52. }
  53. }
  54. VOID CNmMember::SetUserInfo(PVOID pwszUserInfo, UINT cbUserInfo)
  55. {
  56. // clear out any previous data
  57. delete m_pwszUserInfo;
  58. m_cbUserInfo = 0;
  59. if (0 == cbUserInfo)
  60. {
  61. m_pwszUserInfo = NULL;
  62. }
  63. else
  64. {
  65. m_pwszUserInfo = (PWSTR) new BYTE[cbUserInfo];
  66. if (NULL == m_pwszUserInfo)
  67. {
  68. WARNING_OUT(("CNmMember: unable to alloc space for user data"));
  69. }
  70. else
  71. {
  72. m_cbUserInfo = cbUserInfo;
  73. CopyMemory(m_pwszUserInfo, pwszUserInfo, m_cbUserInfo);
  74. }
  75. }
  76. }
  77. BOOL CNmMember::GetSecurityData(PBYTE * ppb, ULONG * pcb)
  78. {
  79. DWORD dwGCCID = FLocal() ? 0 : GetGCCID();
  80. (* pcb) = 0;
  81. (* ppb) = NULL;
  82. // If this node is directly connected to the member, we use the transport data...
  83. if (::T120_GetSecurityInfoFromGCCID(dwGCCID,NULL,pcb)) {
  84. if (0 != (* pcb)) {
  85. // We are directly connected and security data is valid.
  86. (*ppb) = (PBYTE)CoTaskMemAlloc(*pcb);
  87. if ((*ppb) != NULL)
  88. {
  89. ::T120_GetSecurityInfoFromGCCID(dwGCCID,*ppb,pcb);
  90. return TRUE;
  91. }
  92. else
  93. {
  94. ERROR_OUT(("CoTaskMemAlloc failed in GetSecurityData"));
  95. }
  96. }
  97. else if (GetUserData(g_csguidSecurity,ppb,pcb) == S_OK)
  98. {
  99. // We are not directly connected, so get security data from roster.
  100. return TRUE;
  101. }
  102. }
  103. return FALSE;
  104. }
  105. HRESULT CNmMember::ExtractUserData(LPTSTR psz, UINT cchMax, PWSTR pwszKey)
  106. {
  107. CRosterInfo ri;
  108. HRESULT hr = ri.Load(GetUserInfo());
  109. if (FAILED(hr))
  110. return hr;
  111. hr = ri.ExtractItem(NULL, pwszKey, psz, cchMax);
  112. return hr;
  113. }
  114. HRESULT CNmMember::GetIpAddr(LPTSTR psz, UINT cchMax)
  115. {
  116. return ExtractUserData(psz, cchMax, (PWSTR) g_cwszIPTag);
  117. }
  118. ///////////////////////////
  119. // CNmMember:IUknown
  120. ULONG STDMETHODCALLTYPE CNmMember::AddRef(void)
  121. {
  122. DBGENTRY(CNmMember::AddRef);
  123. TRACE_OUT(("CNmMember [%ls]: AddRef this = 0x%X", m_bstrName ? m_bstrName : L"", this));
  124. ULONG ul = RefCount::AddRef();
  125. DBGEXIT(CNmMember::AddRef);
  126. return ul;
  127. }
  128. ULONG STDMETHODCALLTYPE CNmMember::Release(void)
  129. {
  130. DBGENTRY(CNmMember::Release);
  131. TRACE_OUT(("CNmMember [%ls]: Release this = 0x%X", m_bstrName ? m_bstrName : L"", this));
  132. ULONG ul = RefCount::Release();
  133. DBGEXIT(CNmMember::Release);
  134. return ul;
  135. }
  136. HRESULT STDMETHODCALLTYPE CNmMember::QueryInterface(REFIID riid, PVOID *ppv)
  137. {
  138. HRESULT hr = S_OK;
  139. if ((riid == IID_INmMember) || (riid == IID_IUnknown))
  140. {
  141. *ppv = (INmMember *)this;
  142. ApiDebugMsg(("CNmMember::QueryInterface()"));
  143. }
  144. else
  145. {
  146. hr = E_NOINTERFACE;
  147. *ppv = NULL;
  148. ApiDebugMsg(("CNmMember::QueryInterface(): Called on unknown interface."));
  149. }
  150. if (S_OK == hr)
  151. {
  152. AddRef();
  153. }
  154. return hr;
  155. }
  156. ///////////////
  157. // INmMember
  158. HRESULT STDMETHODCALLTYPE CNmMember::GetName(BSTR *pbstrName)
  159. {
  160. if (NULL == pbstrName)
  161. return E_POINTER;
  162. *pbstrName = SysAllocString(m_bstrName);
  163. return *pbstrName ? S_OK : E_FAIL;
  164. }
  165. HRESULT STDMETHODCALLTYPE CNmMember::GetID(ULONG *puID)
  166. {
  167. if (NULL == puID)
  168. return E_POINTER;
  169. *puID = m_dwGCCID;
  170. return (0 != m_dwGCCID) ? S_OK : NM_E_NO_T120_CONFERENCE;
  171. }
  172. HRESULT STDMETHODCALLTYPE CNmMember::GetNmVersion(ULONG *puVersion)
  173. {
  174. if (NULL == puVersion)
  175. return E_POINTER;
  176. *puVersion = (ULONG) HIWORD(m_dwFlags & PF_VER_MASK);
  177. return S_OK;
  178. }
  179. HRESULT STDMETHODCALLTYPE CNmMember::GetAddr(BSTR *pbstrAddr, NM_ADDR_TYPE *puType)
  180. {
  181. if ((NULL == pbstrAddr) || (NULL == puType))
  182. return E_POINTER;
  183. TCHAR szIp[MAX_PATH];
  184. if (S_OK != GetIpAddr(szIp, CCHMAX(szIp)))
  185. {
  186. return E_FAIL;
  187. }
  188. *puType = NM_ADDR_IP;
  189. *pbstrAddr = SysAllocString(CUSTRING(szIp));
  190. return *pbstrAddr ? S_OK : E_FAIL;
  191. }
  192. HRESULT STDMETHODCALLTYPE CNmMember::SetUserData(REFGUID rguid, BYTE *pb, ULONG cb)
  193. {
  194. return m_UserData.AddUserData((GUID *)&rguid,(unsigned short)cb,pb);
  195. }
  196. HRESULT STDMETHODCALLTYPE CNmMember::GetUserData(REFGUID rguid, BYTE **ppb, ULONG *pcb)
  197. {
  198. return m_UserData.GetUserData(rguid,ppb,pcb);
  199. }
  200. STDMETHODIMP CNmMember::GetConference(INmConference **ppConference)
  201. {
  202. return ::GetConference(ppConference);
  203. }
  204. HRESULT STDMETHODCALLTYPE CNmMember::GetNmchCaps(ULONG *puCaps)
  205. {
  206. if (NULL == puCaps)
  207. return E_POINTER;
  208. if (m_dwFlags & PF_T120)
  209. {
  210. // this can be removed when NMCH_SHARE and NMCH_DATA is reliable
  211. *puCaps = m_uNmchCaps | NMCH_SHARE | NMCH_DATA;
  212. }
  213. else
  214. {
  215. *puCaps = m_uNmchCaps;
  216. }
  217. return S_OK;
  218. }
  219. HRESULT STDMETHODCALLTYPE CNmMember::GetShareState(NM_SHARE_STATE *puState)
  220. {
  221. return(E_FAIL);
  222. }
  223. HRESULT STDMETHODCALLTYPE CNmMember::IsSelf(void)
  224. {
  225. return m_fLocal ? S_OK : S_FALSE;
  226. }
  227. HRESULT STDMETHODCALLTYPE CNmMember::IsMCU(void)
  228. {
  229. return (m_dwFlags & PF_T120_MCU) ? S_OK : S_FALSE;
  230. }
  231. HRESULT STDMETHODCALLTYPE CNmMember::Eject(void)
  232. {
  233. if (m_fLocal)
  234. return E_FAIL; // can't eject ourselves.
  235. if (PF_T120 & m_dwFlags)
  236. {
  237. CNmMember * pMemberLocal = GetLocalMember();
  238. if ((NULL == pMemberLocal) || !pMemberLocal->FTopProvider())
  239. return E_FAIL; // only top providers should be allowed to do this
  240. CConfObject * pco = ::GetConfObject();
  241. if (NULL != pco)
  242. {
  243. ASSERT(g_pNodeController);
  244. ASSERT(pco->GetConfHandle());
  245. pco->GetConfHandle()->EjectUser(m_dwGCCID);
  246. }
  247. }
  248. if (NULL != m_pConnection)
  249. {
  250. HRESULT hr = m_pConnection->Disconnect();
  251. if (FAILED(hr))
  252. {
  253. WARNING_OUT(("m_pConnection->Disconnect() failed - hr = %s",
  254. ::GetHRESULTString(hr)));
  255. }
  256. }
  257. return S_OK;
  258. }
  259. ///////////////////////////////////////////////////////////////////////
  260. // Utility Functions
  261. /* G E T L O C A L M E M B E R */
  262. /*-------------------------------------------------------------------------
  263. %%Function: GetLocalMember
  264. -------------------------------------------------------------------------*/
  265. CNmMember * GetLocalMember(void)
  266. {
  267. CConfObject * pco = ::GetConfObject();
  268. if (NULL == pco)
  269. return NULL;
  270. return pco->GetLocalMember();
  271. }
  272. /* P M E M B E R F R O M G C C I D */
  273. /*-------------------------------------------------------------------------
  274. %%Function: PMemberFromGCCID
  275. -------------------------------------------------------------------------*/
  276. CNmMember * PMemberFromGCCID(UINT uNodeID)
  277. {
  278. CConfObject* pco = ::GetConfObject();
  279. if (NULL == pco)
  280. return NULL;
  281. return pco->PMemberFromGCCID(uNodeID);
  282. }
  283. /* P M E M B E R F R O M N O D E G U I D */
  284. /*-------------------------------------------------------------------------
  285. %%Function: PMemberFromNodeGuid
  286. -------------------------------------------------------------------------*/
  287. CNmMember * PMemberFromNodeGuid(REFGUID rguidNode)
  288. {
  289. CConfObject* pco = ::GetConfObject();
  290. if (NULL == pco)
  291. return NULL;
  292. return pco->PMemberFromNodeGuid(rguidNode);
  293. }
  294. CNmMember * PDataMemberFromName(PCWSTR pwszName)
  295. {
  296. CConfObject* pco = ::GetConfObject();
  297. if (NULL == pco)
  298. return NULL;
  299. return pco->PDataMemberFromName(pwszName);
  300. }