|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: view.cpp
//
// Contents: CertView implementation
//
//---------------------------------------------------------------------------
#include "pch.cpp"
#pragma hdrstop
#include "csprop.h"
#include "csdisp.h"
#include "column.h"
#include "row.h"
#include "view.h"
#define __dwFILE__ __dwFILE_CERTVIEW_VIEW_CPP__
WCHAR const g_wszRequestDot[] = wszPROPREQUESTDOT;
#if DBG_CERTSRV
LONG g_cCertView; LONG g_cCertViewTotal; #endif
#define CV_COLUMN_CHUNK 66
//+--------------------------------------------------------------------------
// _cbcolNominal -- Return nominal size for DB column data, based on type.
//
// Assume string binary columns are less than full:
//+--------------------------------------------------------------------------
__inline LONG _cbcolNominal( IN LONG Type, IN LONG cbMax) { LONG divisor = 1;
switch (PROPTYPE_MASK & Type) { case PROPTYPE_STRING: divisor = 2; break; // one-half full?
case PROPTYPE_BINARY: divisor = 4; break; // one-quarter full?
} return(cbMax / divisor); }
//+--------------------------------------------------------------------------
// CCertView::CCertView -- constructor
//+--------------------------------------------------------------------------
CCertView::CCertView() { DBGCODE(InterlockedIncrement(&g_cCertView)); DBGCODE(InterlockedIncrement(&g_cCertViewTotal)); ZeroMemory(&m_aaaColumn, sizeof(m_aaaColumn)); m_fOpenConnection = FALSE; m_dwServerVersion = 0; m_pICertAdminD = NULL; m_aColumnResult = NULL; m_aDBColumnResult = NULL; m_pwszAuthority = NULL; m_fAddOk = FALSE; m_fOpenView = FALSE; m_fServerOpenView = FALSE; m_aRestriction = NULL; m_fTableSet = FALSE; m_icvTable = ICVTABLE_REQCERT; m_cvrcTable = CVRC_TABLE_REQCERT; m_pwszServerName = NULL; ZeroMemory(&m_aapwszColumnDisplayName, sizeof(m_aapwszColumnDisplayName)); }
//+--------------------------------------------------------------------------
// CCertView::~CCertView -- destructor
//
// free memory associated with this instance
//+--------------------------------------------------------------------------
CCertView::~CCertView() { DBGCODE(InterlockedDecrement(&g_cCertView));
#if DBG_CERTSRV
if (m_dwRef > 1) { DBGPRINT(( DBG_SS_CERTVIEWI, "%hs has %d instances left over\n", "CCertView", m_dwRef)); } #endif
_Cleanup(); }
//+--------------------------------------------------------------------------
// CCertView::_Cleanup
//
// free memory associated with this instance
//+--------------------------------------------------------------------------
VOID CCertView::_Cleanup() { LONG i;
myCloseDComConnection((IUnknown **) &m_pICertAdminD, &m_pwszServerName); m_dwServerVersion = 0; m_fOpenConnection = FALSE;
if (NULL != m_aColumnResult) { LocalFree(m_aColumnResult); m_aColumnResult = NULL; } if (NULL != m_aDBColumnResult) { LocalFree(m_aDBColumnResult); m_aDBColumnResult = NULL; } for (i = 0; i < ICVTABLE_MAX; i++) { if (NULL != m_aaaColumn[i]) { CERTDBCOLUMN **ppcol;
for ( ppcol = m_aaaColumn[i]; ppcol < &m_aaaColumn[i][m_acaColumn[i]]; ppcol++) { if (NULL != *ppcol) { LocalFree(*ppcol); } } LocalFree(m_aaaColumn[i]); m_aaaColumn[i] = NULL; } } if (NULL != m_aRestriction) { for (i = 0; i < m_cRestriction; i++) { if (NULL != m_aRestriction[i].pbValue) { LocalFree(m_aRestriction[i].pbValue); } } LocalFree(m_aRestriction); m_aRestriction = NULL; } if (NULL != m_pwszAuthority) { LocalFree(m_pwszAuthority); m_pwszAuthority = NULL; } for (i = 0; i < ICVTABLE_MAX; i++) { if (NULL != m_aapwszColumnDisplayName[i]) { LocalFree(m_aapwszColumnDisplayName[i]); m_aapwszColumnDisplayName[i] = NULL; } } }
HRESULT CCertView::_ValidateFlags( IN BOOL fSchemaOnly, IN DWORD Flags) { HRESULT hr = E_INVALIDARG;
if (~CVRC_COLUMN_MASK & Flags) { _JumpError(hr, error, "invalid bits"); } switch (CVRC_COLUMN_MASK & Flags) { case CVRC_COLUMN_RESULT: case CVRC_COLUMN_VALUE: if (fSchemaOnly) { _JumpError(hr, error, "RESULT/VALUE"); } break;
case CVRC_COLUMN_SCHEMA: break;
default: _JumpError(hr, error, "bad column"); } if (!m_fOpenConnection || (CVRC_COLUMN_SCHEMA != (CVRC_COLUMN_MASK & Flags) && !m_fOpenView)) { hr = E_UNEXPECTED; _JumpError(hr, error, "Unexpected"); } hr = S_OK;
error: return(hr); }
HRESULT CCertView::_SetTable( IN LONG ColumnIndex) // CVRC_TABLE_* or CV_COLUMN_*_DEFAULT
{ HRESULT hr; LONG cvrcTable; LONG icvTable; if (0 > ColumnIndex) { switch (ColumnIndex) { case CV_COLUMN_LOG_DEFAULT: case CV_COLUMN_LOG_FAILED_DEFAULT: case CV_COLUMN_LOG_REVOKED_DEFAULT: case CV_COLUMN_QUEUE_DEFAULT: icvTable = ICVTABLE_REQCERT; cvrcTable = CVRC_TABLE_REQCERT; break;
case CV_COLUMN_EXTENSION_DEFAULT: icvTable = ICVTABLE_EXTENSION; cvrcTable = CVRC_TABLE_EXTENSIONS; break;
case CV_COLUMN_ATTRIBUTE_DEFAULT: icvTable = ICVTABLE_ATTRIBUTE; cvrcTable = CVRC_TABLE_ATTRIBUTES; break;
case CV_COLUMN_CRL_DEFAULT: icvTable = ICVTABLE_CRL; cvrcTable = CVRC_TABLE_CRL; break;
default: hr = E_INVALIDARG; _JumpError(hr, error, "bad negative ColumnIndex"); } } else { if (~CVRC_TABLE_MASK & ColumnIndex) { hr = E_INVALIDARG; _JumpError(hr, error, "invalid bits"); } switch (ColumnIndex) { case CVRC_TABLE_REQCERT: icvTable = ICVTABLE_REQCERT; break;
case CVRC_TABLE_EXTENSIONS: icvTable = ICVTABLE_EXTENSION; break;
case CVRC_TABLE_ATTRIBUTES: icvTable = ICVTABLE_ATTRIBUTE; break;
case CVRC_TABLE_CRL: icvTable = ICVTABLE_CRL; break;
default: hr = E_INVALIDARG; _JumpError(hr, error, "bad table"); } cvrcTable = CVRC_TABLE_MASK & ColumnIndex; } if (m_fTableSet) { if (icvTable != m_icvTable || cvrcTable != m_cvrcTable) { DBGPRINT(( DBG_SS_CERTVIEW, "_SetTable: cvrcTable=%x <- %x\n", m_cvrcTable, cvrcTable)); hr = E_INVALIDARG; _JumpError(hr, error, "mixed tables"); } } else { m_icvTable = icvTable; m_cvrcTable = cvrcTable; m_fTableSet = TRUE; DBGPRINT((DBG_SS_CERTVIEWI, "_SetTable(cvrcTable=%x)\n", m_cvrcTable)); } hr = S_OK;
error: return(hr); }
STDMETHODIMP CCertView::SetTable( /* [in] */ LONG Table) // CVRC_TABLE_*
{ HRESULT hr; hr = _VerifyServerVersion(2); _JumpIfError(hr, error, "_VerifyServerVersion");
if (0 > Table) { hr = E_INVALIDARG; _JumpError(hr, error, "Table"); } if (m_fTableSet) { hr = E_UNEXPECTED; _JumpError(hr, error, "Already set"); } hr = _SetTable(Table); _JumpIfError(hr, error, "_SetTable");
error: return(hr); }
HRESULT CCertView::GetTable( OUT LONG *pcvrcTable) { HRESULT hr; if (NULL == pcvrcTable) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } *pcvrcTable = m_cvrcTable; hr = S_OK;
error: return(hr); }
HRESULT CCertView::FindColumn( IN LONG Flags, // CVRC_COLUMN_*
IN LONG ColumnIndex, OUT CERTDBCOLUMN const **ppColumn, // localized for server
OPTIONAL OUT WCHAR const **ppwszDisplayName) // localized for client
{ HRESULT hr; DWORD i; DBGCODE(LONG ColumnIndexArg = ColumnIndex);
if (NULL == ppColumn) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } *ppColumn = NULL;
hr = _ValidateFlags(FALSE, Flags); _JumpIfError(hr, error, "_ValidateFlags");
hr = E_INVALIDARG; if (CVRC_COLUMN_SCHEMA != (CVRC_COLUMN_MASK & Flags)) { if (m_cColumnResult <= ColumnIndex) { DBGPRINT(( DBG_SS_CERTVIEW, "FindColumn(Flags=%x, ColumnIndex=%x, m_cColumnResult=%x)\n", Flags, ColumnIndex, m_cColumnResult)); _JumpError(hr, error, "Result ColumnIndex"); } ColumnIndex = m_aColumnResult[ColumnIndex]; } if (ColumnIndex >= m_acColumn[m_icvTable]) { _JumpError(hr, error, "ColumnIndex"); } i = ColumnIndex / CV_COLUMN_CHUNK; if (i >= m_acaColumn[m_icvTable]) { _JumpError(hr, error, "ColumnIndex2"); }
*ppColumn = &m_aaaColumn[m_icvTable][i][ColumnIndex % CV_COLUMN_CHUNK];
CSASSERT(NULL != m_aapwszColumnDisplayName[m_icvTable]); CSASSERT(NULL != m_aapwszColumnDisplayName[m_icvTable][ColumnIndex]); if (NULL != ppwszDisplayName) { *ppwszDisplayName = m_aapwszColumnDisplayName[m_icvTable][ColumnIndex]; } DBGPRINT(( DBG_SS_CERTVIEWI, "FindColumn(Flags=%x, ColumnIndex=%x->%x) --> Type=%x Index=%x %ws/%ws\n", Flags, ColumnIndexArg, ColumnIndex, (*ppColumn)->Type, (*ppColumn)->Index, (*ppColumn)->pwszName, m_aapwszColumnDisplayName[m_icvTable][ColumnIndex])); hr = S_OK;
error: return(hr); }
HRESULT CCertView::_SaveColumnInfo( IN LONG icvTable, IN DWORD celt, IN CERTTRANSBLOB const *pctbColumn) { HRESULT hr; DWORD cbNew; CERTDBCOLUMN *peltNew = NULL; CERTDBCOLUMN *pelt; CERTTRANSDBCOLUMN *ptelt; CERTTRANSDBCOLUMN *pteltEnd; BYTE *pbNext; BYTE *pbEnd; CERTDBCOLUMN **ppColumn;
if (NULL == pctbColumn) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } cbNew = pctbColumn->cb + celt * (sizeof(*pelt) - sizeof(*ptelt)); peltNew = (CERTDBCOLUMN *) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, cbNew); if (NULL == peltNew) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "LocalAlloc"); }
pteltEnd = &((CERTTRANSDBCOLUMN *) pctbColumn->pb)[celt]; if ((BYTE *) pteltEnd > &pctbColumn->pb[pctbColumn->cb]) { hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); _JumpError(hr, error, "bad marshalled data"); } pelt = peltNew; pbNext = (BYTE *) &peltNew[celt]; pbEnd = (BYTE *) Add2Ptr(peltNew, cbNew); for (ptelt = (CERTTRANSDBCOLUMN *) pctbColumn->pb; ptelt < pteltEnd; ptelt++, pelt++) { pelt->Type = ptelt->Type; pelt->Index = ptelt->Index; pelt->cbMax = ptelt->cbMax;
hr = CopyMarshalledString( pctbColumn, ptelt->obwszName, pbEnd, &pbNext, &pelt->pwszName); _JumpIfError(hr, error, "CopyMarshalledString");
hr = CopyMarshalledString( pctbColumn, ptelt->obwszDisplayName, pbEnd, &pbNext, &pelt->pwszDisplayName); _JumpIfError(hr, error, "CopyMarshalledString");
} CSASSERT(pbNext == pbEnd);
ppColumn = (CERTDBCOLUMN **) LocalAlloc( LMEM_FIXED, (m_acaColumn[icvTable] + 1) * sizeof(m_aaaColumn[0])); if (NULL == ppColumn) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "LocalAlloc ppColumn"); } if (NULL != m_aaaColumn[icvTable]) { CopyMemory( ppColumn, m_aaaColumn[icvTable], m_acaColumn[icvTable] * sizeof(m_aaaColumn[0])); LocalFree(m_aaaColumn[icvTable]); } m_aaaColumn[icvTable] = ppColumn;
m_aaaColumn[icvTable][m_acaColumn[icvTable]] = peltNew; peltNew = NULL;
m_acaColumn[icvTable]++; m_acColumn[icvTable] += celt; hr = S_OK;
error: if (NULL != peltNew) { LocalFree(peltNew); } return(hr); }
HRESULT CCertView::_LoadSchema( IN LONG icvTable, IN LONG cvrcTable) { HRESULT hr; DWORD icol; DWORD ccol; CERTTRANSBLOB ctbColumn;
ctbColumn.pb = NULL; icol = 0;
CSASSERT(icvTable < ICVTABLE_MAX);
do { ccol = CV_COLUMN_CHUNK; __try { if (CVRC_TABLE_REQCERT == cvrcTable) { hr = m_pICertAdminD->EnumViewColumn( m_pwszAuthority, icol, ccol, &ccol, &ctbColumn); } else { CSASSERT(S_OK == _VerifyServerVersion(2)); hr = m_pICertAdminD->EnumViewColumnTable( m_pwszAuthority, cvrcTable, icol, ccol, &ccol, &ctbColumn); } } __except(hr = myHEXCEPTIONCODE(), EXCEPTION_EXECUTE_HANDLER) { } if (S_FALSE != hr) { _JumpIfError( hr, error, CVRC_TABLE_REQCERT == cvrcTable? "EnumViewColumn" : "EnumViewColumnTable"); }
myRegisterMemAlloc(ctbColumn.pb, ctbColumn.cb, CSM_MIDLUSERALLOC);
hr = _SaveColumnInfo(icvTable, ccol, &ctbColumn); _JumpIfError(hr, error, "_SaveColumnInfo");
CoTaskMemFree(ctbColumn.pb); ctbColumn.pb = NULL;
icol += ccol;
} while (CV_COLUMN_CHUNK == ccol);
m_aapwszColumnDisplayName[icvTable] = (WCHAR const **) LocalAlloc( LMEM_FIXED | LMEM_ZEROINIT, m_acColumn[icvTable] * sizeof(m_aapwszColumnDisplayName[icvTable][0])); if (NULL == m_aapwszColumnDisplayName[icvTable]) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "LocalAlloc"); }
for (icol = 0; icol < (DWORD) m_acColumn[icvTable]; icol++) { CERTDBCOLUMN const *pColumn;
CSASSERT(icol / CV_COLUMN_CHUNK < m_acaColumn[icvTable]); pColumn = &m_aaaColumn[icvTable][icol / CV_COLUMN_CHUNK][icol % CV_COLUMN_CHUNK];
hr = myGetColumnDisplayName( pColumn->pwszName, &m_aapwszColumnDisplayName[icvTable][icol]);
if (E_INVALIDARG == hr) { _PrintErrorStr(hr, "myGetColumnDisplayName", pColumn->pwszName); m_aapwszColumnDisplayName[icvTable][icol] = pColumn->pwszName; hr = S_OK; } _JumpIfError(hr, error, "myGetColumnDisplayName"); } hr = S_OK;
error: if (NULL != ctbColumn.pb) { CoTaskMemFree(ctbColumn.pb); } return(hr); }
STDMETHODIMP CCertView::OpenConnection( /* [in] */ BSTR const strConfig) { HRESULT hr; DWORD i; WCHAR const *pwszAuthority; BOOL fTeardownOnError = FALSE;
static LONG s_aTable[ICVTABLE_MAX] = { CVRC_TABLE_REQCERT, // ICVTABLE_REQCERT
CVRC_TABLE_EXTENSIONS, // ICVTABLE_EXTENSION
CVRC_TABLE_ATTRIBUTES, // ICVTABLE_ATTRIBUTE
CVRC_TABLE_CRL, // ICVTABLE_CRL
};
if (NULL == strConfig) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } if (m_fOpenConnection) { hr = E_UNEXPECTED; _JumpError(hr, error, "Connected"); } fTeardownOnError = TRUE;
m_dwServerVersion = 0; hr = myOpenAdminDComConnection( strConfig, &pwszAuthority, &m_pwszServerName, &m_dwServerVersion, &m_pICertAdminD); _JumpIfError(hr, error, "myOpenAdminDComConnection");
CSASSERT (0 != m_dwServerVersion);
hr = myDupString(pwszAuthority, &m_pwszAuthority); _JumpIfError(hr, error, "myDupString");
ZeroMemory(&m_acaColumn, sizeof(m_acaColumn)); ZeroMemory(&m_acColumn, sizeof(m_acColumn));
m_cRestriction = 0; m_aRestriction = (CERTVIEWRESTRICTION *) LocalAlloc(LMEM_FIXED, 0); if (NULL == m_aRestriction) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "LocalAlloc"); } m_fOpenConnection = TRUE;
for (i = 0; i < ICVTABLE_MAX; i++) { if (m_dwServerVersion >= 2 || ICVTABLE_REQCERT == i) { hr = _LoadSchema(i, s_aTable[i]); _JumpIfError(hr, error, "_LoadSchema"); } } hr = S_OK;
error: if (S_OK != hr && fTeardownOnError) { _Cleanup(); } return(_SetErrorInfo(hr, L"CCertView::OpenConnection")); }
//+--------------------------------------------------------------------------
// CCertView::_VerifyServerVersion -- verify server version
//
//+--------------------------------------------------------------------------
HRESULT CCertView::_VerifyServerVersion( IN DWORD RequiredVersion) { HRESULT hr; if (!m_fOpenConnection) { hr = HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED); _JumpError(hr, error, "Not connected"); } if (m_dwServerVersion < RequiredVersion) { hr = RPC_E_VERSION_MISMATCH; _JumpError(hr, error, "old server"); } hr = S_OK;
error: return(hr); }
STDMETHODIMP CCertView::EnumCertViewColumn( /* [in] */ LONG fResultColumn, // CVRC_COLUMN_*
/* [out, retval] */ 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(fResultColumn, -1, this, NULL); _JumpIfError(hr, error, "Open");
*ppenum = penum; penum = NULL; hr = S_OK;
error: if (NULL != penum) { penum->Release(); } return(_SetErrorInfo(hr, L"CCertView::EnumCertViewColumn")); }
STDMETHODIMP CCertView::GetColumnCount( /* [in] */ LONG fResultColumn, // CVRC_COLUMN_*
/* [out, retval] */ LONG __RPC_FAR *pcColumn) { HRESULT hr;
if (NULL == pcColumn) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } hr = _ValidateFlags(FALSE, fResultColumn); _JumpIfError(hr, error, "_ValidateFlags");
*pcColumn = CVRC_COLUMN_SCHEMA != (CVRC_COLUMN_MASK & fResultColumn)? m_cColumnResult : m_acColumn[m_icvTable];
error: return(_SetErrorInfo(hr, L"CCertView::GetColumnCount")); }
STDMETHODIMP CCertView::GetColumnIndex( /* [in] */ LONG fResultColumn, // CVRC_COLUMN_*
/* [in] */ BSTR const strColumnName, /* [out, retval] */ LONG *pColumnIndex) { HRESULT hr; CERTDBCOLUMN const *pColumn; WCHAR const *pwsz; WCHAR *pwszAlloc = NULL; WCHAR const *pwszDisplayName; LONG icol; LONG i;
if (NULL == strColumnName || NULL == pColumnIndex) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } pwsz = strColumnName;
hr = _ValidateFlags(FALSE, fResultColumn); _JumpIfError(hr, error, "_ValidateFlags");
// First pass: i == 0 -- compare against unlocalized column name
// Second pass: i == 1 -- compare against localized column name
// Third pass: i == 2 -- compare Request.pwsz against unlocalized colname
for (i = 0; ; i++) { if (1 < i) { if (ICVTABLE_REQCERT != m_icvTable || NULL != wcschr(pwsz, L'.')) { hr = E_INVALIDARG; _JumpErrorStr(hr, error, "Bad Column Name", strColumnName); } pwszAlloc = (WCHAR *) LocalAlloc( LMEM_FIXED, wcslen(pwsz) * sizeof(WCHAR) + sizeof(g_wszRequestDot)); if (NULL == pwszAlloc) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "LocalAlloc"); } wcscpy(pwszAlloc, g_wszRequestDot); wcscat(pwszAlloc, pwsz); pwsz = pwszAlloc; } for (icol = 0; icol < m_acColumn[m_icvTable]; icol++) { hr = FindColumn(fResultColumn, icol, &pColumn, &pwszDisplayName); _JumpIfErrorStr(hr, error, "FindColumn", strColumnName);
CSASSERT(NULL != pColumn); CSASSERT(NULL != pColumn->pwszName); CSASSERT(NULL != pColumn->pwszDisplayName); // localized for server
CSASSERT(NULL != pwszDisplayName); // localized for client
if (0 == lstrcmpi( pwsz, 1 == i? pwszDisplayName : pColumn->pwszName)) { break; } } if (icol < m_acColumn[m_icvTable]) { break; } }
*pColumnIndex = icol; hr = S_OK;
error: if (NULL != pwszAlloc) { LocalFree(pwszAlloc); } return(_SetErrorInfo(hr, L"CCertView::GetColumnIndex")); }
STDMETHODIMP CCertView::SetResultColumnCount( /* [in] */ LONG cResultColumn) { HRESULT hr; DWORD cColumnDefault; CERTTRANSBLOB ctbColumnDefault;
ctbColumnDefault.pb = NULL; hr = E_UNEXPECTED; if (!m_fOpenConnection) { _JumpError(hr, error, "No Connection"); } if (NULL != m_aColumnResult) { _JumpError(hr, error, "2nd call"); } if (!m_fTableSet) { hr = _SetTable(CVRC_TABLE_REQCERT); _JumpIfError(hr, error, "_SetTable"); }
m_cbcolResultNominalTotal = 0; m_fAddOk = TRUE; if (0 > cResultColumn) { m_fAddOk = FALSE;
__try { hr = m_pICertAdminD->GetViewDefaultColumnSet( m_pwszAuthority, cResultColumn, &cColumnDefault, &ctbColumnDefault); } __except(hr = myHEXCEPTIONCODE(), EXCEPTION_EXECUTE_HANDLER) { } _JumpIfError(hr, error, "GetViewDefaultColumnSet");
myRegisterMemAlloc( ctbColumnDefault.pb, ctbColumnDefault.cb, CSM_MIDLUSERALLOC);
cResultColumn = cColumnDefault; CSASSERT(NULL != ctbColumnDefault.pb); CSASSERT(cResultColumn * sizeof(DWORD) == ctbColumnDefault.cb); } else { cResultColumn &= CVRC_COLUMN_MASK; }
m_aColumnResult = (LONG *) LocalAlloc( LMEM_FIXED, cResultColumn * sizeof(m_aColumnResult[0])); if (NULL == m_aColumnResult) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "Result Column array"); }
m_aDBColumnResult = (DWORD *) LocalAlloc( LMEM_FIXED, cResultColumn * sizeof(m_aDBColumnResult[0])); if (NULL == m_aDBColumnResult) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "Result DB Column array"); }
m_cColumnResultMax = cResultColumn; m_cColumnResult = 0;
if (!m_fAddOk) { LONG i; DWORD const *pIndex;
pIndex = (DWORD const *) ctbColumnDefault.pb; for (i = 0; i < cResultColumn; pIndex++, i++) { LONG icol; CERTDBCOLUMN const *pColumn;
for (icol = 0; icol < m_acColumn[m_icvTable]; icol++) { hr = FindColumn( CVRC_COLUMN_SCHEMA, icol, &pColumn, NULL); _JumpIfError(hr, error, "FindColumn");
if (*pIndex == pColumn->Index) { m_aDBColumnResult[i] = *pIndex; m_aColumnResult[i] = icol; m_cbcolResultNominalTotal += _cbcolNominal(pColumn->Type, pColumn->cbMax); break; } } if (icol >= m_acColumn[m_icvTable]) { hr = E_INVALIDARG; _JumpError(hr, error, "ColumnIndex"); } } m_cColumnResult = cResultColumn; } hr = S_OK;
error: if (NULL != ctbColumnDefault.pb) { CoTaskMemFree(ctbColumnDefault.pb); } return(_SetErrorInfo(hr, L"CCertView::SetResultColumnCount")); }
STDMETHODIMP CCertView::SetResultColumn( /* [in] */ LONG ColumnIndex) { HRESULT hr; CERTDBCOLUMN const *pColumn;
if (m_fOpenView || !m_fAddOk || m_cColumnResultMax <= m_cColumnResult) { hr = E_UNEXPECTED; _JumpError(hr, error, "Unexpected"); } if (!m_fTableSet) { hr = _SetTable(CVRC_TABLE_REQCERT); _JumpIfError(hr, error, "_SetTable"); }
if (m_acColumn[m_icvTable] <= ColumnIndex) { hr = E_INVALIDARG; _JumpError(hr, error, "ColumnIndex"); } m_aColumnResult[m_cColumnResult] = ColumnIndex;
hr = FindColumn( CVRC_COLUMN_SCHEMA, ColumnIndex, &pColumn, NULL); _JumpIfError(hr, error, "FindColumn");
m_aDBColumnResult[m_cColumnResult] = pColumn->Index; m_cbcolResultNominalTotal += _cbcolNominal(pColumn->Type, pColumn->cbMax);
m_cColumnResult++;
error: return(_SetErrorInfo(hr, L"CCertView::SetResultColumn")); }
STDMETHODIMP CCertView::SetRestriction( /* [in] */ LONG ColumnIndex, /* [in] */ LONG SeekOperator, /* [in] */ LONG SortOrder, /* [in] */ VARIANT __RPC_FAR const *pvarValue) { HRESULT hr; CERTDBCOLUMN const *pColumn; CERTVIEWRESTRICTION cvr; CERTVIEWRESTRICTION *pcvr;
ZeroMemory(&cvr, sizeof(cvr));
hr = E_UNEXPECTED; if (!m_fOpenConnection) { _JumpError(hr, error, "No Connection"); } if (!m_fTableSet) { hr = _SetTable(CVRC_TABLE_REQCERT); _JumpIfError(hr, error, "_SetTable"); }
if (0 > ColumnIndex) { cvr.ColumnIndex = ColumnIndex; CSASSERT(CVR_SEEK_NONE == cvr.SeekOperator); CSASSERT(CVR_SORT_NONE == cvr.SortOrder); CSASSERT(NULL == cvr.pbValue); CSASSERT(0 == cvr.cbValue); hr = S_OK; } else { if (NULL == pvarValue) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); }
hr = FindColumn( CVRC_COLUMN_SCHEMA, CVRC_COLUMN_MASK & ColumnIndex, &pColumn, NULL); _JumpIfError(hr, error, "FindColumn");
switch (SeekOperator) { case CVR_SEEK_EQ: case CVR_SEEK_LT: case CVR_SEEK_LE: case CVR_SEEK_GE: case CVR_SEEK_GT: case CVR_SEEK_NONE: //case CVR_SEEK_SET:
break;
default: hr = E_INVALIDARG; _JumpError(hr, error, "Seek Operator"); } switch (SortOrder) { case CVR_SORT_NONE: case CVR_SORT_ASCEND: case CVR_SORT_DESCEND: break;
default: hr = E_INVALIDARG; _JumpError(hr, error, "Sort Order"); }
hr = myMarshalVariant( pvarValue, pColumn->Type, &cvr.cbValue, &cvr.pbValue); _JumpIfError(hr, error, "myMarshalVariant");
cvr.ColumnIndex = pColumn->Index; cvr.SeekOperator = SeekOperator; cvr.SortOrder = SortOrder; } pcvr = (CERTVIEWRESTRICTION *) LocalAlloc( LMEM_FIXED, (m_cRestriction + 1) * sizeof(*pcvr)); if (NULL == pcvr) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "LocalAlloc"); } if (NULL != m_aRestriction) { CopyMemory(pcvr, m_aRestriction, m_cRestriction * sizeof(*pcvr)); LocalFree(m_aRestriction); } CopyMemory(&pcvr[m_cRestriction], &cvr, sizeof(cvr)); cvr.pbValue = NULL;
m_aRestriction = pcvr; m_cRestriction++;
error: if (NULL != cvr.pbValue) { LocalFree(cvr.pbValue); } return(_SetErrorInfo(hr, L"CCertView::SetRestriction")); }
STDMETHODIMP CCertView::OpenView( /* [out] */ IEnumCERTVIEWROW **ppenum) { HRESULT hr; IEnumCERTVIEWROW *penum = NULL;
if (NULL == ppenum) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } *ppenum = NULL;
hr = E_UNEXPECTED; if (!m_fOpenConnection) { _JumpError(hr, error, "No Connection"); } if (m_fOpenView) { _JumpError(hr, error, "2nd call"); }
penum = new CEnumCERTVIEWROW; if (NULL == penum) { hr = E_OUTOFMEMORY; _JumpError(hr, error, "new CEnumCERTVIEWROW"); }
hr = ((CEnumCERTVIEWROW *) penum)->Open(this); _JumpIfError(hr, error, "Open");
*ppenum = penum; m_fAddOk = FALSE; m_fOpenView = TRUE; hr = S_OK;
error: if (S_OK != hr && NULL != penum) { penum->Release(); } return(_SetErrorInfo(hr, L"CCertView::OpenView")); }
HRESULT CCertView::SetViewColumns( OUT LONG *pcbrowResultNominal) { HRESULT hr; LONG icol;
if (NULL == pcbrowResultNominal) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } if (m_fServerOpenView) { hr = E_UNEXPECTED; _JumpError(hr, error, "View Already Open"); }
if (!m_fTableSet) { hr = _SetTable(CVRC_TABLE_REQCERT); _JumpIfError(hr, error, "_SetTable"); }
if (NULL == m_aDBColumnResult) { hr = SetResultColumnCount(m_acColumn[m_icvTable]); _JumpIfError(hr, error, "SetResultColumnCount");
for (icol = 0; icol < m_acColumn[m_icvTable]; icol++) { hr = SetResultColumn(icol); _JumpIfError(hr, error, "SetResultColumn"); } } *pcbrowResultNominal = sizeof(CERTDBRESULTROW) + sizeof(CERTDBRESULTCOLUMN) * m_cColumnResultMax + m_cbcolResultNominalTotal; hr = S_OK;
error: return(hr); }
HRESULT CCertView::EnumView( IN LONG cskip, IN ULONG celt, OUT ULONG *pceltFetched, OUT LONG *pieltNext, OUT LONG *pcbResultRows, OUT CERTTRANSDBRESULTROW const **ppResultRows) { HRESULT hr; CERTTRANSBLOB ctbResultRows; if (NULL == ppResultRows || NULL == pceltFetched || NULL == pieltNext || NULL == pcbResultRows) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } *ppResultRows = NULL;
if (!m_fOpenConnection) { hr = E_UNEXPECTED; _JumpError(hr, error, "No Connection"); }
DBGPRINT(( DBG_SS_CERTVIEWI, "%hs: ielt=%d cskip=%d celt=%d\n", m_fServerOpenView? "EnumView" : "OpenView", m_fServerOpenView? m_ielt : 1, cskip, celt));
if (!m_fServerOpenView) { if (m_cColumnResultMax != m_cColumnResult) { hr = E_UNEXPECTED; _JumpError(hr, error, "Missing Result Columns"); }
m_ielt = 1;
__try { hr = m_pICertAdminD->OpenView( m_pwszAuthority, m_cRestriction, m_aRestriction, m_cColumnResultMax, m_aDBColumnResult, m_ielt + cskip, celt, pceltFetched, &ctbResultRows); m_fServerOpenView = TRUE; } __except(hr = myHEXCEPTIONCODE(), EXCEPTION_EXECUTE_HANDLER) { } if (S_FALSE != hr) { _JumpIfError(hr, error, "OpenView"); } } else { __try { hr = m_pICertAdminD->EnumView( m_pwszAuthority, m_ielt + cskip, celt, pceltFetched, &ctbResultRows); } __except(hr = myHEXCEPTIONCODE(), EXCEPTION_EXECUTE_HANDLER) { } if (S_FALSE != hr) { _JumpIfError(hr, error, "EnumView"); } } myRegisterMemAlloc(ctbResultRows.pb, ctbResultRows.cb, CSM_MIDLUSERALLOC);
DBGPRINT(( DBG_SS_CERTVIEWI, "%hs: *pceltFetched=%d -> %d @ielt=%d -> %d\n", m_fServerOpenView? "EnumView" : "OpenView", celt, *pceltFetched, m_ielt + cskip, m_ielt + cskip + *pceltFetched));
m_ielt += cskip + *pceltFetched; *pieltNext = m_ielt;
DBGPRINT(( DBG_SS_CERTVIEWI, "EnumView: celtFetched=%d ieltNext=%d cb=%d hr=%x\n", *pceltFetched, *pieltNext, ctbResultRows.cb, hr));
*pcbResultRows = ctbResultRows.cb; *ppResultRows = (CERTTRANSDBRESULTROW const *) ctbResultRows.pb;
error: return(hr); }
HRESULT CCertView::EnumAttributesOrExtensions( IN DWORD RowId, IN DWORD Flags, OPTIONAL IN WCHAR const *pwszLast, IN DWORD celt, OUT DWORD *pceltFetched, CERTTRANSBLOB *pctbOut) { HRESULT hr;
if (NULL == pceltFetched || NULL == pctbOut) { hr = E_POINTER; _JumpError(hr, error, "NULL parm"); } if (!m_fOpenConnection) { hr = E_UNEXPECTED; _JumpError(hr, error, "No Connection"); } __try { hr = m_pICertAdminD->EnumAttributesOrExtensions( m_pwszAuthority, RowId, Flags, pwszLast, celt, pceltFetched, pctbOut); } __except(hr = myHEXCEPTIONCODE(), EXCEPTION_EXECUTE_HANDLER) { } if (S_FALSE != hr) { _JumpIfError(hr, error, "EnumAttributesOrExtensions"); } myRegisterMemAlloc(pctbOut->pb, pctbOut->cb, CSM_MIDLUSERALLOC);
error: return(hr); }
HRESULT CCertView::_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, &IID_ICertView); CSASSERT(hr == hrError); } return(hrError); }
|