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.
 
 
 
 
 
 

229 lines
4.6 KiB

//+---------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 1997.
//
// File: cstrings.cpp
//
// Contents: Implements the class CStrings to manage a dynamically
// expandable array of string pairs which may be enumerated
//
// Classes:
//
// Methods: CStrings::CStrings
// CStrings::~CStrings
// CStrings::PutItem
// CStrings::FindItem
// CStrings::FindAppid
// CStrings::AddClsid
// CStrings::InitGetNext
// CStrings::GetNextItem
// CStrings::GetItem
// CStrings::GetNumItems
// CStrings::RemoveItem
// CStrings::RemoveAll
//
// History: 23-Apr-96 BruceMa Created.
//
//----------------------------------------------------------------------
#include "stdafx.h"
#include "types.h"
#include "cstrings.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
CStrings::CStrings(void)
{
m_nCount = 0;
}
CStrings::~CStrings(void)
{
RemoveAll();
}
// Store a string pair, expanding the array if necessary
SItem *CStrings::PutItem(TCHAR *szString, TCHAR *szTitle, TCHAR *szAppid)
{
SItem *psTemp = new SItem(szString, szTitle, szAppid);
if (psTemp )
arrSItems.Add(psTemp);
return psTemp;
}
SItem *CStrings::FindItem(TCHAR *szItem)
{
for (int wItem = 0; wItem < arrSItems.GetSize(); wItem++)
{
SItem* pTmp = (SItem*)arrSItems.GetAt(wItem);
if (pTmp -> szItem .CompareNoCase(szItem) == 0)
return pTmp;
}
return NULL;
}
SItem *CStrings::FindAppid(TCHAR *szAppid)
{
for (int wItem = 0; wItem < arrSItems.GetSize(); wItem++)
{
SItem* pTmp = (SItem*)arrSItems.GetAt(wItem);
if (!(pTmp -> szItem.IsEmpty()) &&
(pTmp -> szAppid.CompareNoCase(szAppid) == 0))
{
return pTmp;
}
}
return NULL;
}
BOOL CStrings::AddClsid(SItem *pItem, TCHAR *szClsid)
{
// Create or expand the clsid table if necessary
if (pItem->ulClsids == pItem->ulClsidTbl)
{
TCHAR **ppTmp = new TCHAR *[pItem->ulClsidTbl + 8];
if (ppTmp == NULL)
{
return FALSE;
}
if (pItem->ppszClsids)
{
memcpy(ppTmp,
pItem->ppszClsids,
pItem->ulClsids * sizeof(TCHAR *));
delete pItem->ppszClsids;
}
pItem->ppszClsids = ppTmp;
pItem->ulClsidTbl += 8;
}
// Add the new clsid
TCHAR *pszTmp = new TCHAR[GUIDSTR_MAX + 1];
if (pszTmp == NULL)
{
return FALSE;
}
_tcscpy(pszTmp, szClsid);
pItem->ppszClsids[pItem->ulClsids++] = pszTmp;
return TRUE;
}
// Prepare to enumerate the array
DWORD CStrings::InitGetNext(void)
{
m_nCount = 0;
return (DWORD)arrSItems.GetSize();
}
// Return the first string in the next eumerated item
SItem *CStrings::GetNextItem(void)
{
if (m_nCount < arrSItems.GetSize())
{
return (SItem*)(arrSItems[m_nCount++]);
}
else
{
m_nCount = 0;
return NULL;
}
}
// Return the first string in the next eumerated item
SItem *CStrings::GetItem(DWORD dwItem)
{
if (((int)dwItem) < arrSItems.GetSize())
{
return (SItem*)(arrSItems[dwItem]);
}
else
{
m_nCount = 0;
return NULL;
}
}
// Return the total number of items
DWORD CStrings::GetNumItems(void)
{
return (DWORD)arrSItems.GetSize();
}
// Given an item index, remove it
BOOL CStrings::RemoveItem(DWORD dwItem)
{
if (((int)dwItem) < arrSItems.GetSize())
{
SItem* pTmp = (SItem*)arrSItems.GetAt(dwItem);
if (pTmp)
{
arrSItems.RemoveAt(dwItem);
delete pTmp;
return TRUE;
}
}
return FALSE;
}
// Remove the array of items
BOOL CStrings::RemoveAll(void)
{
int nItems = (int)arrSItems.GetSize();
for (int nItem = 0; nItem < nItems; nItem++)
{
SItem* pTmp = (SItem*)arrSItems.GetAt(nItem);
delete pTmp;
}
arrSItems.RemoveAll();
return TRUE;
}
SItem::SItem(LPCTSTR sItem, LPCTSTR sTitle, LPCTSTR sAppid)
: szItem(sItem), szTitle(sTitle), szAppid(sAppid)
{
fMarked = FALSE;
fChecked = FALSE;
fHasAppid = FALSE;
fDontDisplay = FALSE;
ulClsids = 0;
ulClsidTbl = 0;
ppszClsids = 0;
}
SItem::~SItem()
{
for (UINT k = 0; k < ulClsids; k++)
{
delete ppszClsids[k];
}
ulClsids = 0;
ulClsidTbl = 0;
delete ppszClsids;
}