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.
234 lines
5.5 KiB
234 lines
5.5 KiB
/***************************************************************************/
|
|
/** Microsoft Windows **/
|
|
/** Copyright(c) Microsoft Corp., 1995-1996 **/
|
|
/***************************************************************************/
|
|
|
|
//
|
|
// File: RostInfo.cpp
|
|
// Created: ChrisPi 6/17/96
|
|
// Modified:
|
|
//
|
|
// The CRosterInfo class is implemented, which is used for adding user
|
|
// information to the T.120 roster
|
|
//
|
|
|
|
#include "precomp.h"
|
|
#include <RostInfo.h>
|
|
#include "confutil.h"
|
|
|
|
GUID g_csguidRostInfo = GUID_ROSTINFO;
|
|
|
|
static const HROSTINFO g_cshriEOList = (HROSTINFO)((LONG_PTR)-1);
|
|
|
|
CRosterInfo::~CRosterInfo()
|
|
{
|
|
DebugEntry(CRosterInfo::~CRosterInfo);
|
|
|
|
while (FALSE == m_ItemList.IsEmpty())
|
|
{
|
|
PWSTR pwszItem = (PWSTR) m_ItemList.RemoveHead();
|
|
ASSERT(pwszItem);
|
|
delete pwszItem;
|
|
}
|
|
delete m_pvSaveData;
|
|
|
|
DebugExitVOID(CRosterInfo::~CRosterInfo);
|
|
}
|
|
|
|
HRESULT CRosterInfo::AddItem(PCWSTR pcwszTag, PCWSTR pcwszData)
|
|
{
|
|
DebugEntry(CRosterInfo::AddItem);
|
|
ASSERT(pcwszTag);
|
|
ASSERT(pcwszData);
|
|
HRESULT hr = E_OUTOFMEMORY;
|
|
|
|
int nTagLength = lstrlenW(pcwszTag);
|
|
int nDataLength = lstrlenW(pcwszData);
|
|
|
|
// +1 for tag sep, +1 for rost info sep
|
|
PWSTR pwszNewItem = new WCHAR[nTagLength + 1 + nDataLength + 1];
|
|
if (NULL != pwszNewItem)
|
|
{
|
|
::CopyMemory( (PVOID) pwszNewItem,
|
|
pcwszTag,
|
|
sizeof(WCHAR) * nTagLength);
|
|
pwszNewItem[nTagLength] = g_cwchRostInfoTagSeparator;
|
|
::CopyMemory( (PVOID) &(pwszNewItem[nTagLength + 1]),
|
|
pcwszData,
|
|
sizeof(WCHAR) * nDataLength);
|
|
pwszNewItem[nTagLength + 1 + nDataLength] = g_cwchRostInfoSeparator;
|
|
m_ItemList.AddTail(pwszNewItem);
|
|
hr = S_OK;
|
|
}
|
|
|
|
DebugExitHRESULT(CRosterInfo::AddItem, hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CRosterInfo::ExtractItem( PHROSTINFO phRostInfo,
|
|
PCWSTR pcwszTag,
|
|
LPTSTR pszBuffer,
|
|
UINT cbLength)
|
|
{
|
|
DebugEntry(CRosterInfo::ExtractItem);
|
|
ASSERT(pcwszTag);
|
|
HRESULT hr = E_FAIL;
|
|
|
|
|
|
POSITION pos;
|
|
if ((NULL == phRostInfo) ||
|
|
(NULL == *phRostInfo))
|
|
{
|
|
pos = m_ItemList.GetHeadPosition();
|
|
}
|
|
else
|
|
{
|
|
pos = *phRostInfo;
|
|
}
|
|
|
|
if (g_cshriEOList != pos)
|
|
{
|
|
while (NULL != pos)
|
|
{
|
|
PWSTR pwszItem = (PWSTR) m_ItemList.GetNext(pos);
|
|
if (NULL != phRostInfo)
|
|
{
|
|
*phRostInfo = (NULL != pos) ? pos : g_cshriEOList;
|
|
}
|
|
ASSERT(pwszItem);
|
|
int nItemLength = lstrlenW(pwszItem);
|
|
int nTagLength = lstrlenW(pcwszTag);
|
|
|
|
// NOTE: CRT is used for memcmp
|
|
if ((nItemLength > nTagLength) &&
|
|
(0 == memcmp( pcwszTag,
|
|
pwszItem,
|
|
sizeof(WCHAR) * nTagLength)) &&
|
|
(g_cwchRostInfoTagSeparator == pwszItem[nTagLength]))
|
|
{
|
|
if (NULL != pszBuffer)
|
|
{
|
|
LPTSTR szName;
|
|
BSTR bstrItem = ::SysAllocString(&pwszItem[nTagLength + 1]);
|
|
if(bstrItem)
|
|
{
|
|
hr = BSTR_to_LPTSTR (&szName,bstrItem);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
lstrcpyn(pszBuffer, szName, cbLength);
|
|
delete szName;
|
|
}
|
|
SysFreeString(bstrItem);
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
DebugExitHRESULT(CRosterInfo::ExtractItem, hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CRosterInfo::Load(PVOID pData)
|
|
{
|
|
DebugEntry(CRosterInfo::Load);
|
|
HRESULT hr = E_FAIL;
|
|
|
|
PWSTR pwszUserInfo = (PWSTR) pData;
|
|
if (NULL != pwszUserInfo)
|
|
{
|
|
hr = S_OK;
|
|
while (L'\0' != pwszUserInfo[0])
|
|
{
|
|
// this includes the null terminator
|
|
int nItemLenNT = lstrlenW(pwszUserInfo) + 1;
|
|
PWSTR pwszNewItem = new WCHAR[nItemLenNT];
|
|
if (NULL != pwszNewItem)
|
|
{
|
|
::CopyMemory( pwszNewItem,
|
|
pwszUserInfo,
|
|
sizeof(WCHAR) * nItemLenNT);
|
|
m_ItemList.AddTail(pwszNewItem);
|
|
// Skip past this item and the n.t.
|
|
pwszUserInfo += nItemLenNT;
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TRACE_OUT(("CRosterInfo::Load() called with NULL pData"));
|
|
}
|
|
|
|
DebugExitHRESULT(CRosterInfo::Load, hr);
|
|
return hr;
|
|
}
|
|
|
|
UINT CRosterInfo::GetSize()
|
|
{
|
|
UINT uSize = sizeof(WCHAR); // for last separator
|
|
|
|
POSITION pos = m_ItemList.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
PWSTR pwszItem = (PWSTR) m_ItemList.GetNext(pos);
|
|
ASSERT(pwszItem);
|
|
uSize += sizeof(WCHAR) * (lstrlenW(pwszItem) + 1);
|
|
}
|
|
|
|
return uSize;
|
|
}
|
|
|
|
HRESULT CRosterInfo::Save(PVOID* ppvData, PUINT pcbLength)
|
|
{
|
|
DebugEntry(CRosterInfo::Save);
|
|
ASSERT(ppvData);
|
|
ASSERT(pcbLength);
|
|
HRESULT hr = E_FAIL;
|
|
|
|
*pcbLength = GetSize();
|
|
delete m_pvSaveData;
|
|
m_pvSaveData = new BYTE[*pcbLength];
|
|
if (NULL != m_pvSaveData)
|
|
{
|
|
PWSTR pwszDest = (PWSTR) m_pvSaveData;
|
|
POSITION pos = m_ItemList.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
PWSTR pwszItem = (PWSTR) m_ItemList.GetNext(pos);
|
|
ASSERT(pwszItem);
|
|
::CopyMemory( pwszDest,
|
|
pwszItem,
|
|
sizeof(WCHAR) * (lstrlenW(pwszItem) + 1));
|
|
pwszDest += (lstrlenW(pwszItem) + 1);
|
|
}
|
|
int nLastSepPos = (*pcbLength / sizeof(WCHAR)) - 1;
|
|
((PWSTR)m_pvSaveData)[nLastSepPos] = g_cwchRostInfoSeparator;
|
|
*ppvData = m_pvSaveData;
|
|
hr = S_OK;
|
|
}
|
|
|
|
DebugExitHRESULT(CRosterInfo::Save, hr);
|
|
return hr;
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
VOID CRosterInfo::Dump()
|
|
{
|
|
POSITION pos = m_ItemList.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
PWSTR pwszItem = (PWSTR) m_ItemList.GetNext(pos);
|
|
ASSERT(pwszItem);
|
|
TRACE_OUT(("\t%ls", pwszItem));
|
|
}
|
|
}
|
|
#endif // DEBUG
|
|
|