windows-nt/Source/XPSP1/NT/shell/ext/ftp/cookie.cpp
2020-09-26 16:20:57 +08:00

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);
}