/*++ Copyright (C) 1997-2001 Microsoft Corporation Module Name: INDEXCAC.CPP Abstract: Caches string/integer combinations. History: a-davj 04-Mar-97 Created. --*/ #include "precomp.h" #include "indexcac.h" //*************************************************************************** // // CCacheEntry::CCacheEntry // // DESCRIPTION: // // Constructor. // // PARAMETERS: // // pValue string value to save // iIndex integer value to save //*************************************************************************** CCacheEntry::CCacheEntry( TCHAR * pValue, int iIndex) : CObject() { m_iIndex = iIndex; m_ptcValue = pValue; m_pwcValue = NULL; } //*************************************************************************** // // CCacheEntry::CCacheEntry // // DESCRIPTION: // // Constructor. // // PARAMETERS: // // pValue string value to save // //*************************************************************************** CCacheEntry::CCacheEntry( WCHAR * pValue) : CObject() { m_iIndex = -1; m_ptcValue = NULL; m_pwcValue = pValue; } //*************************************************************************** // // CCacheEntry::~CCacheEntry // // DESCRIPTION: // // Destructor. // //*************************************************************************** CCacheEntry::~CCacheEntry() { if(m_ptcValue) delete m_ptcValue; if(m_pwcValue) delete m_pwcValue; } //*************************************************************************** // // CIndexCache::CIndexCache // // DESCRIPTION: // // Constructor. // //*************************************************************************** CIndexCache::CIndexCache() { } //*************************************************************************** // // void CIndexCache::Empty // // DESCRIPTION: // // Frees up the storage. // //*************************************************************************** void CIndexCache::Empty() { CCacheEntry * pEntry; int iCnt, iSize; iSize = m_Array.Size(); for(iCnt = 0; iCnt < iSize; iCnt++) { pEntry = (CCacheEntry *)m_Array.GetAt(iCnt); if(pEntry) delete pEntry; } if(iSize > 0) m_Array.Empty(); } //*************************************************************************** // // int CIndexCache::Find // // DESCRIPTION: // // Finds an entry in the cache. // // PARAMETERS: // // pFind string value used to locate the entry // dwWhichEntry a non zero value would return subsequent // matching entries. // // RETURN VALUE: // // index in cache. -1 if the entry cant be found // //*************************************************************************** int CIndexCache::Find( IN const TCHAR * pFind, DWORD dwWhichEntry) { CCacheEntry * pEntry; int iCnt, iSize; DWORD dwFound = 0; iSize = m_Array.Size(); for(iCnt = 0; iCnt < iSize; iCnt++) { pEntry = (CCacheEntry *)m_Array.GetAt(iCnt); if(!lstrcmpi(pEntry->m_ptcValue, pFind)) if(dwFound == dwWhichEntry) return pEntry->m_iIndex; else dwFound++; } return -1; // never found it } //*************************************************************************** // // BOOL CIndexCache::Add // // DESCRIPTION: // // Adds an entry to the cache. // // PARAMETERS: // // pAdd string to add to cache // iIndex associated number // // RETURN VALUE: // // //*************************************************************************** BOOL CIndexCache::Add( IN TCHAR * pAdd, IN int iIndex) { DWORD dwLen = lstrlen(pAdd)+1; TCHAR * pValue = new TCHAR[dwLen]; if(pValue == NULL) return FALSE; StringCchCopyW(pValue, dwLen, pAdd); // Note that if created, the CCacheEntry object owns the string and // will take care of freeing it CCacheEntry * pNew = new CCacheEntry(pValue, iIndex); if(pNew == NULL) { delete pValue; return FALSE; } int iRet = m_Array.Add(pNew); if(iRet == CFlexArray::no_error) return TRUE; { delete pNew; return FALSE; } } //*************************************************************************** // // WCHAR * CIndexCache::GetWString // // DESCRIPTION: // // Gets a string from the cache. // // PARAMETERS: // // iIndex cache index // // RETURN VALUE: // // pointer to string, does not need to be freed. NULL if the index // is invalid. //*************************************************************************** WCHAR * CIndexCache::GetWString( IN int iIndex) { DWORD dwLen; if(iIndex >= m_Array.Size()) return NULL; CCacheEntry * pEntry = (CCacheEntry *)m_Array.GetAt(iIndex); if(pEntry == NULL) return NULL; dwLen = wcslen(pEntry->m_pwcValue)+1; WCHAR * pRet = new WCHAR[dwLen]; if(pRet) StringCchCopyW(pRet, dwLen, pEntry->m_pwcValue); return pRet; } //*************************************************************************** // // BOOL CIndexCache::SetAt // // DESCRIPTION: // // Sets a cache entry. // // PARAMETERS: // // pwcAdd string to store // iIndex cache index to use // // RETURN VALUE: // // //*************************************************************************** BOOL CIndexCache::SetAt( IN WCHAR * pwcAdd, IN int iIndex) { DWORD dwLen = wcslen(pwcAdd)+1; WCHAR * pValue = new WCHAR[dwLen]; if(pValue == NULL) return FALSE; StringCchCopyW(pValue, dwLen, pwcAdd); // Note that if created, the CCacheEntry object owns the string and // will take care of freeing it CCacheEntry * pNew = new CCacheEntry(pValue); if(pNew == NULL) { delete pValue; return FALSE; } if(iIndex < m_Array.Size()) { m_Array.SetAt(iIndex, pNew); return TRUE; } if(CFlexArray::no_error == m_Array.InsertAt(iIndex, pNew)) return TRUE; { delete pNew; return FALSE; } }