mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|
|
|
|
|