HRESULT CAVDConfDlg::EnablePresence(BOOL bEnable) { IRTCClientPresence * pPresence = NULL; HRESULT hr; // 清理好友列表 ClearBuddyList(); // 获取 RTC 客户端出席信息接口 hr = m_pClient->QueryInterface( IID_IRTCClientPresence, (void **)&pPresence); if (FAILED(hr)) { // QueryInterface 失败 return hr; } // 获取出席信息存储区的位置 VARIANT varStorage; VariantInit(&varStorage); varStorage.vt = VT_BSTR; varStorage.bstrVal = SysAllocString(L"presence.xml"); // 如果禁用出席信息,则将最新的 // 出席信息数据副本保存到 presence.xml 文件。 if (!bEnable && m_bPresenceEnabled) { hr = pPresence->Export(varStorage); if (FAILED(hr)) { // 导出失败 SAFE_RELEASE(pPresence); VariantClear(&varStorage); return hr; } } // 启用出席信息 hr = pPresence->EnablePresence( bEnable VARIANT_TRUE : VARIANT_FALSE, varStorage);
VariantClear(&varStorage); if (FAILED(hr)) { // EnablePresence 失败 SAFE_RELEASE(pPresence); return hr; } // 设置启用标志 m_bPresenceEnabled = bEnable; // 如果禁用出席信息,则清理 // 出席信息数据 if (!bEnable) { // 清理好友 IRTCEnumBuddies * pEnumBuddy = NULL; IRTCBuddy * pBuddy = NULL; if (FAILED(hr)) { // 枚举好友失败 SAFE_RELEASE(pPresence); return hr; }
// 枚举用户的好友列表。 hr = pPresence->EnumerateBuddies(&pEnumBuddy);
if (FAILED(hr)) { // 枚举好友失败 SAFE_RELEASE(pPresence); return hr; } while (pEnumBuddy->Next(1, &pBuddy, NULL) == S_OK) { pPresence->RemoveBuddy(pBuddy); SAFE_RELEASE(pBuddy); } SAFE_RELEASE(pEnumBuddy); // 清理观察程序 IRTCEnumWatchers * pEnumWatcher = NULL; IRTCWatcher * pWatcher = NULL; hr = pPresence->EnumerateWatchers(&pEnumWatcher);
if (FAILED(hr)) { // 枚举观察程序失败 SAFE_RELEASE(pPresence); return hr; } while (pEnumWatcher->Next(1, &pWatcher, NULL) == S_OK) { pPresence->RemoveWatcher(pWatcher); SAFE_RELEASE(pWatcher); } SAFE_RELEASE(pEnumWatcher); } SAFE_RELEASE(pPresence); return S_OK; } |