118 lines
2.5 KiB
C++
118 lines
2.5 KiB
C++
|
/*****************************************************************************
|
||
|
*
|
||
|
* cookies.cpp - Take care of the status bar.
|
||
|
*
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#include "priv.h"
|
||
|
#include "cookie.h"
|
||
|
|
||
|
int CCookieList::_FreeStringEnum(LPVOID pString, LPVOID pData)
|
||
|
{
|
||
|
LPTSTR pszString = (LPTSTR) pString;
|
||
|
Str_SetPtr(&pszString, NULL);
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
DWORD CCookieList::_Find(LPCTSTR pszString)
|
||
|
{
|
||
|
DWORD dwCookie = -1; // -1 means not found.
|
||
|
DWORD dwIndex;
|
||
|
DWORD dwSize = DPA_GetPtrCount(m_hdpa);
|
||
|
|
||
|
for (dwIndex = 0; dwIndex < dwSize; dwIndex++)
|
||
|
{
|
||
|
LPCTSTR pszCurrent = (LPCTSTR) DPA_FastGetPtr(m_hdpa, dwIndex);
|
||
|
if (pszCurrent && !StrCmp(pszCurrent, pszString))
|
||
|
{
|
||
|
dwCookie = dwIndex;
|
||
|
break; // Found, it's already in the list so recycle.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return dwCookie;
|
||
|
}
|
||
|
|
||
|
DWORD CCookieList::GetCookie(LPCTSTR pszString)
|
||
|
{
|
||
|
ENTERCRITICAL;
|
||
|
DWORD dwCookie = -1;
|
||
|
|
||
|
if (!EVAL(pszString))
|
||
|
return -1;
|
||
|
|
||
|
if (!m_hdpa)
|
||
|
m_hdpa = DPA_Create(10);
|
||
|
|
||
|
if (EVAL(m_hdpa))
|
||
|
{
|
||
|
dwCookie = _Find(pszString);
|
||
|
// Did we not find it in the list?
|
||
|
if (-1 == dwCookie)
|
||
|
{
|
||
|
LPTSTR pszCopy = NULL;
|
||
|
|
||
|
dwCookie = DPA_GetPtrCount(m_hdpa);
|
||
|
Str_SetPtr(&pszCopy, pszString);
|
||
|
DPA_AppendPtr(m_hdpa, pszCopy);
|
||
|
}
|
||
|
}
|
||
|
LEAVECRITICAL;
|
||
|
|
||
|
return dwCookie;
|
||
|
}
|
||
|
|
||
|
HRESULT CCookieList::GetString(DWORD dwCookie, LPTSTR pszString, DWORD cchSize)
|
||
|
{
|
||
|
ENTERCRITICAL;
|
||
|
HRESULT hr = S_FALSE;
|
||
|
|
||
|
if (m_hdpa &&
|
||
|
(dwCookie < (DWORD)DPA_GetPtrCount(m_hdpa)))
|
||
|
{
|
||
|
LPCTSTR pszCurrent = (LPCTSTR) DPA_FastGetPtr(m_hdpa, dwCookie);
|
||
|
|
||
|
StrCpyN(pszString, pszCurrent, cchSize);
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
|
||
|
LEAVECRITICAL;
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/****************************************************\
|
||
|
Constructor
|
||
|
\****************************************************/
|
||
|
CCookieList::CCookieList()
|
||
|
{
|
||
|
DllAddRef();
|
||
|
|
||
|
// This needs to be allocated in Zero Inited Memory.
|
||
|
// Assert that all Member Variables are inited to Zero.
|
||
|
ASSERT(!m_hdpa);
|
||
|
|
||
|
LEAK_ADDREF(LEAK_CCookieList);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************\
|
||
|
Destructor
|
||
|
\****************************************************/
|
||
|
CCookieList::~CCookieList(void)
|
||
|
{
|
||
|
ENTERCRITICAL;
|
||
|
if (m_hdpa)
|
||
|
DPA_DestroyCallback(m_hdpa, _FreeStringEnum, NULL);
|
||
|
LEAVECRITICAL;
|
||
|
|
||
|
ASSERTNONCRITICAL;
|
||
|
|
||
|
DllRelease();
|
||
|
LEAK_DELREF(LEAK_CCookieList);
|
||
|
}
|
||
|
|
||
|
|