windows-nt/Source/XPSP1/NT/ds/security/services/ca/certview/column.cpp

552 lines
9.9 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: column.cpp
//
// Contents: Cert Server Data Base interface implementation
//
//---------------------------------------------------------------------------
#include <pch.cpp>
#pragma hdrstop
#include "csdisp.h"
#include "csprop.h"
#include "column.h"
#include "view.h"
#if DBG_CERTSRV
LONG g_cCertViewColumn;
LONG g_cCertViewColumnTotal;
#endif
CEnumCERTVIEWCOLUMN::CEnumCERTVIEWCOLUMN()
{
DBGCODE(InterlockedIncrement(&g_cCertViewColumn));
DBGCODE(InterlockedIncrement(&g_cCertViewColumnTotal));
m_pvw = NULL;
m_prow = NULL;
m_cRef = 1;
}
CEnumCERTVIEWCOLUMN::~CEnumCERTVIEWCOLUMN()
{
DBGCODE(InterlockedDecrement(&g_cCertViewColumn));
#if DBG_CERTSRV
if (m_cRef > 1)
{
DBGPRINT((
DBG_SS_CERTVIEWI,
"%hs has %d instances left over\n",
"CEnumCERTVIEWCOLUMN",
m_cRef));
}
#endif
if (NULL != m_pvw)
{
m_pvw->Release();
}
if (NULL != m_prow)
{
LocalFree(m_prow);
}
}
HRESULT
CEnumCERTVIEWCOLUMN::Open(
IN LONG Flags,
IN LONG iRow,
IN ICertView *pvw,
OPTIONAL IN CERTTRANSDBRESULTROW const *prow)
{
HRESULT hr;
if (NULL == pvw)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
CSASSERT(0 == (CVRC_TABLE_MASK & CVRC_COLUMN_MASK));
hr = E_INVALIDARG;
if (~(CVRC_TABLE_MASK | CVRC_COLUMN_MASK) & Flags)
{
_JumpError(hr, error, "Flags");
}
switch (CVRC_COLUMN_MASK & Flags)
{
case CVRC_COLUMN_SCHEMA:
case CVRC_COLUMN_RESULT:
case CVRC_COLUMN_VALUE:
break;
default:
_JumpError(hr, error, "Flags column");
}
switch (CVRC_TABLE_MASK & Flags)
{
case CVRC_TABLE_REQCERT:
case CVRC_TABLE_EXTENSIONS:
case CVRC_TABLE_ATTRIBUTES:
case CVRC_TABLE_CRL:
break;
default:
_JumpError(hr, error, "Flags table");
}
m_Flags = Flags;
m_iRow = iRow;
m_pvw = pvw;
m_pvw->AddRef();
DBGPRINT((
DBG_SS_CERTVIEWI,
"CEnumCERTVIEWCOLUMN::Open(cvrcTable=%x, cvrcColumn=%x)\n",
CVRC_TABLE_MASK & Flags,
CVRC_COLUMN_MASK & Flags));
if (NULL != prow)
{
m_prow = (CERTTRANSDBRESULTROW *) LocalAlloc(LMEM_FIXED, prow->cbrow);
if (NULL == m_prow)
{
hr = E_OUTOFMEMORY;
_JumpError(hr, error, "LocalAlloc");
}
CopyMemory(m_prow, prow, prow->cbrow);
}
hr = m_pvw->GetColumnCount(m_Flags, &m_celt);
_JumpIfError(hr, error, "GetColumnCount");
Reset();
error:
return(hr);
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::Next(
/* [out, retval] */ LONG *pIndex)
{
HRESULT hr;
if (NULL == pIndex)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
if (-1 > m_ielt || m_ielt >= m_celt - 1)
{
*pIndex = -1;
hr = S_FALSE;
goto error;
}
m_ielt++;
hr = ((CCertView *) m_pvw)->FindColumn(
m_Flags,
m_ielt,
&m_pcol,
&m_pwszDisplayName);
_JumpIfError(hr, error, "FindColumn");
*pIndex = m_ielt;
error:
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::Next"));
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::GetName(
/* [out, retval] */ BSTR *pstrOut)
{
HRESULT hr;
if (NULL == pstrOut)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
if (NULL == m_pcol)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "m_pcol NULL");
}
if (!ConvertWszToBstr(pstrOut, m_pcol->pwszName, -1))
{
hr = E_OUTOFMEMORY;
_JumpError(hr, error, "ConvertWszToBstr");
}
hr = S_OK;
error:
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetName"));
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::GetDisplayName(
/* [out, retval] */ BSTR *pstrOut)
{
HRESULT hr;
if (NULL == pstrOut)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
if (NULL == m_pwszDisplayName)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "m_pwszDisplayName NULL");
}
if (!ConvertWszToBstr(pstrOut, m_pwszDisplayName, -1))
{
hr = E_OUTOFMEMORY;
_JumpError(hr, error, "ConvertWszToBstr");
}
hr = S_OK;
error:
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetDisplayName"));
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::GetType(
/* [out, retval] */ LONG *pType)
{
HRESULT hr;
if (NULL == pType)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
if (NULL == m_pcol)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "m_pcol NULL");
}
*pType = PROPTYPE_MASK & m_pcol->Type;
hr = S_OK;
error:
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetType"));
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::IsIndexed(
/* [out, retval] */ LONG *pIndexed)
{
HRESULT hr;
if (NULL == pIndexed)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
if (NULL == m_pcol)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "m_pcol NULL");
}
*pIndexed = (PROPFLAGS_INDEXED & m_pcol->Type)? TRUE : FALSE;
hr = S_OK;
error:
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::IsIndexed"));
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::GetMaxLength(
/* [out, retval] */ LONG *pMaxLength)
{
HRESULT hr;
if (NULL == pMaxLength)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
if (NULL == m_pcol)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "m_pcol NULL");
}
*pMaxLength = m_pcol->cbMax;
hr = S_OK;
error:
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetMaxLength"));
}
DWORD
AsnPropId(
IN LONG Flags,
IN WCHAR const *pwszName)
{
DWORD PropId = CR_PROP_NONE;
switch (CVRC_TABLE_MASK & Flags)
{
case CVRC_TABLE_CRL:
if (0 == lstrcmpi(pwszName, wszPROPCRLRAWCRL))
{
PropId = CR_PROP_BASECRL;
}
break;
case CVRC_TABLE_REQCERT:
if (0 == lstrcmpi(pwszName, wszPROPREQUESTRAWREQUEST))
{
PropId = MAXDWORD;
}
break;
}
return(PropId);
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::GetValue(
/* [in] */ LONG Flags,
/* [out, retval] */ VARIANT *pvarValue)
{
HRESULT hr = E_UNEXPECTED;
BYTE const *pbValue;
CERTTRANSDBRESULTCOLUMN const *pColResult;
if (NULL == pvarValue)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
VariantInit(pvarValue);
if (CVRC_COLUMN_VALUE != (CVRC_COLUMN_MASK & m_Flags))
{
_JumpError(hr, error, "No Value");
}
if (NULL == m_pcol)
{
_JumpError(hr, error, "m_pcol NULL");
}
pColResult = &((CERTTRANSDBRESULTCOLUMN const *) (m_prow + 1))[m_ielt];
CSASSERT(m_pcol->Type == pColResult->Type);
if (0 == pColResult->obValue)
{
hr = S_OK; // leave VariantClear()'s VT_EMPTY tag
goto error;
}
pbValue = (BYTE const *) Add2ConstPtr(m_prow, pColResult->obValue);
hr = myUnmarshalFormattedVariant(
Flags,
AsnPropId(m_Flags, m_pcol->pwszName),
m_pcol->Type,
pColResult->cbValue,
pbValue,
pvarValue);
_JumpIfError(hr, error, "myUnmarshalFormattedVariant");
error:
if (S_OK != hr)
{
VariantClear(pvarValue);
}
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetValue"));
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::Skip(
/* [in] */ LONG celt)
{
HRESULT hr;
LONG ieltnew = m_ielt + celt;
if (-1 > ieltnew)
{
hr = E_INVALIDARG;
_JumpError(hr, error, "Skip back to before start");
}
m_ielt = ieltnew;
m_pcol = NULL;
hr = S_OK;
error:
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::Skip"));
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::Reset(VOID)
{
m_ielt = -1;
m_pcol = NULL;
return(S_OK);
}
STDMETHODIMP
CEnumCERTVIEWCOLUMN::Clone(
/* [out] */ IEnumCERTVIEWCOLUMN **ppenum)
{
HRESULT hr;
IEnumCERTVIEWCOLUMN *penum = NULL;
if (NULL == ppenum)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
*ppenum = NULL;
penum = new CEnumCERTVIEWCOLUMN;
if (NULL == penum)
{
hr = E_OUTOFMEMORY;
_JumpError(hr, error, "new CEnumCERTVIEWCOLUMN");
}
hr = ((CEnumCERTVIEWCOLUMN *) penum)->Open(
m_Flags,
-1,
m_pvw,
m_prow);
_JumpIfError(hr, error, "Open");
if (-1 != m_ielt)
{
hr = penum->Skip(m_ielt);
_JumpIfError(hr, error, "Skip");
if (NULL != m_pcol)
{
LONG Index;
hr = penum->Next(&Index);
_JumpIfError(hr, error, "Next");
CSASSERT(Index == m_ielt);
}
}
*ppenum = penum;
penum = NULL;
hr = S_OK;
error:
if (NULL != penum)
{
penum->Release();
}
return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::Clone"));
}
HRESULT
CEnumCERTVIEWCOLUMN::_SetErrorInfo(
IN HRESULT hrError,
IN WCHAR const *pwszDescription)
{
CSASSERT(FAILED(hrError) || S_OK == hrError || S_FALSE == hrError);
if (FAILED(hrError))
{
HRESULT hr;
hr = DispatchSetErrorInfo(
hrError,
pwszDescription,
wszCLASS_CERTVIEW L".CEnumCERTVIEWCOLUMN",
&IID_IEnumCERTVIEWCOLUMN);
CSASSERT(hr == hrError);
}
return(hrError);
}
#if 1
// IUnknown implementation
STDMETHODIMP
CEnumCERTVIEWCOLUMN::QueryInterface(
const IID& iid,
void **ppv)
{
HRESULT hr;
if (NULL == ppv)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
if (iid == IID_IUnknown)
{
*ppv = static_cast<IEnumCERTVIEWCOLUMN *>(this);
}
else if (iid == IID_IDispatch)
{
*ppv = static_cast<IEnumCERTVIEWCOLUMN *>(this);
}
else if (iid == IID_ISupportErrorInfo)
{
*ppv = static_cast<IEnumCERTVIEWCOLUMN *>(this);
}
else if (iid == IID_IEnumCERTVIEWCOLUMN)
{
*ppv = static_cast<IEnumCERTVIEWCOLUMN *>(this);
}
else
{
*ppv = NULL;
hr = E_NOINTERFACE;
_JumpError(hr, error, "IID");
}
reinterpret_cast<IUnknown *>(*ppv)->AddRef();
hr = S_OK;
error:
return(hr);
}
ULONG STDMETHODCALLTYPE
CEnumCERTVIEWCOLUMN::AddRef()
{
return(InterlockedIncrement(&m_cRef));
}
ULONG STDMETHODCALLTYPE
CEnumCERTVIEWCOLUMN::Release()
{
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
}
return(cRef);
}
#endif