//****************************************************************************
// Module: NMCHAT.EXE
// File: CMEMB.CPP
// Content:
//
//
// Copyright (c) Microsoft Corporation 1997
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//****************************************************************************
#include "precomp.h"
COBLIST * g_pListUser = (COBLIST *) NULL;
INmMember * g_pMemberLocal = NULL;
//****************************************************************************
//
// PUSER PUserFromINmMember(INmMember * pMember)
//
//****************************************************************************
PUSER PUserFromINmMember(INmMember * pMember)
{
if (NULL != g_pListUser)
{
POSITION pos = g_pListUser->GetHeadPosition();
while (NULL != pos)
{
PUSER pUser = (PUSER) g_pListUser->GetNext(pos);
if (pMember == pUser->pMember)
{
ASSERT(pMember == pUser->pMember);
return pUser;
}
}
}
return NULL;
}
//****************************************************************************
//
// int ItemFromPUser(PUSER pUser)
//
//****************************************************************************
int ItemFromPUser(PUSER pUser)
{
if (NULL == ghwndUser)
return -1;
LV_FINDINFO findInfo;
ClearStruct(&findInfo);
findInfo.flags = LVFI_PARAM;
findInfo.lParam = (LPARAM) pUser;
return ListView_FindItem(ghwndUser, -1, &findInfo);
}
//****************************************************************************
//
// PUSER AllocUser(INmMember * pMember)
//
//****************************************************************************
PUSER AllocUser(INmMember * pMember)
{
HRESULT hr;
BSTR bstr;
INmMember * pMemberTop;
PUSER pUser = new USER;
if (NULL == pUser)
{
return NULL;
}
ClearStruct(pUser);
pUser->pMember = pMember;
pMember->AddRef();
hr = pMember->GetName(&bstr);
if (SUCCEEDED(hr))
{
pUser->pszName = PszFromBstr(bstr);
SysFreeString(bstr);
}
hr = pMember->GetNmVersion(&pUser->uVersion);
pUser->fLocal = S_OK == pMember->IsSelf();
pUser->fMcu = S_OK == pMember->IsMCU();
pUser->fTop = FALSE;
if (SUCCEEDED(g_pConference->GetTopProvider(&pMemberTop)))
{
pUser->fTop = (pMember == pMemberTop);
pMemberTop->Release();
}
if (pUser->fLocal)
g_pMemberLocal = pMember;
return pUser;
}
//****************************************************************************
//
// VOID FreeUser(PUSER pUser)
//
//****************************************************************************
VOID FreeUser(PUSER pUser)
{
ASSERT(NULL != pUser);
if (pUser->fLocal)
{
g_pMemberLocal = NULL;
}
FreePlpv(&pUser->pszName);
if (NULL != pUser->pMember)
{
pUser->pMember->Release();
}
delete pUser;
}
//****************************************************************************
//
// VOID FreeAllUsers(void)
//
//****************************************************************************
VOID FreeAllUsers(void)
{
if (NULL == g_pListUser)
return;
while (!g_pListUser->IsEmpty())
{
USER * pUser = (USER *) g_pListUser->RemoveHead();
ASSERT(NULL != pUser);
FreeUser(pUser);
}
delete g_pListUser;
g_pListUser = NULL;
}
//****************************************************************************
//
// VOID AddMember(INmMember * pMember)
//
//****************************************************************************
VOID AddMember(INmMember * pMember)
{
PUSER pUser = AllocUser(pMember);
if (NULL == pUser)
{
return;
}
AddNode(pUser, &g_pListUser);
LV_ITEM lvItem;
ClearStruct(&lvItem);
lvItem.iItem = g_pListUser->GetItemCount();
lvItem.mask = LVIF_PARAM | LVIF_TEXT;
lvItem.pszText = (S_OK == pMember->IsSelf()) ? TEXT("everyone") : pUser->pszName;
lvItem.cchTextMax = lstrlen(pUser->pszName);
lvItem.lParam = (LPARAM) pUser;
ListView_InsertItem(ghwndUser, &lvItem);
DisplaySysMsg(TEXT("<joined>"), pMember);
}
//****************************************************************************
//
// VOID RemoveMember(INmMember * pMember)
//
//****************************************************************************
VOID RemoveMember(INmMember * pMember)
{
if (NULL == g_pListUser)
return;
POSITION pos = g_pListUser->GetHeadPosition();
while (NULL != pos)
{
POSITION posSav = pos;
PUSER pUser = (PUSER) g_pListUser->GetNext(pos);
if (pMember == pUser->pMember)
{
ASSERT(pMember == pUser->pMember);
DisplaySysMsg(TEXT("<left>"), pMember);
ListView_DeleteItem(ghwndUser, ItemFromPUser(pUser));
FreeUser(pUser);
g_pListUser->RemoveAt(posSav);
return;
}
}
}
//****************************************************************************
//
// INmMember * GetSelectedMember(void)
//
//****************************************************************************
INmMember * GetSelectedMember(void)
{
int iItem;
if (NULL == g_pListUser)
return NULL;
iItem = ListView_GetNextItem(ghwndUser, -1, LVNI_ALL | LVNI_SELECTED);
if (-1 == iItem)
return NULL;
LV_ITEM lv;
lv.mask = LVIF_PARAM;
lv.iItem = iItem;
ListView_GetItem(ghwndUser, &lv);
return ((PUSER) lv.lParam)->pMember;
}