389 lines
7.2 KiB
C++
389 lines
7.2 KiB
C++
|
//---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
||
|
//
|
||
|
// File: object.cxx
|
||
|
//
|
||
|
// Contents: Windows NT 3.5 Enumerator Code
|
||
|
//
|
||
|
// History:
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "winnt.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
HRESULT
|
||
|
BuildObjectArray(
|
||
|
VARIANT var,
|
||
|
SAFEARRAY ** ppFilter,
|
||
|
DWORD * pdwNumElements
|
||
|
);
|
||
|
|
||
|
HRESULT
|
||
|
BuildDefaultObjectArray(
|
||
|
PFILTERS pFilters,
|
||
|
DWORD dwMaxFilters,
|
||
|
SAFEARRAY ** ppFilter,
|
||
|
DWORD * pdwNumElements
|
||
|
);
|
||
|
|
||
|
|
||
|
ObjectTypeList::ObjectTypeList()
|
||
|
{
|
||
|
_pObjList = NULL;
|
||
|
_dwCurrentIndex = 0;
|
||
|
_dwMaxElements = 0;
|
||
|
_dwUBound = 0;
|
||
|
_dwLBound = 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ObjectTypeList::CreateObjectTypeList(
|
||
|
VARIANT vFilter,
|
||
|
ObjectTypeList ** ppObjectTypeList
|
||
|
)
|
||
|
{
|
||
|
ObjectTypeList * pObjectTypeList = NULL;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
pObjectTypeList = new ObjectTypeList;
|
||
|
|
||
|
if (!pObjectTypeList) {
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
hr = BuildObjectArray(
|
||
|
vFilter,
|
||
|
&pObjectTypeList->_pObjList,
|
||
|
&pObjectTypeList->_dwMaxElements
|
||
|
);
|
||
|
|
||
|
if (FAILED(hr)) {
|
||
|
|
||
|
hr = BuildDefaultObjectArray(
|
||
|
gpFilters,
|
||
|
gdwMaxFilters,
|
||
|
&pObjectTypeList->_pObjList,
|
||
|
&pObjectTypeList->_dwMaxElements
|
||
|
);
|
||
|
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
hr = SafeArrayGetUBound(
|
||
|
pObjectTypeList->_pObjList,
|
||
|
1,
|
||
|
(long FAR *)&pObjectTypeList->_dwUBound
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = SafeArrayGetLBound(
|
||
|
pObjectTypeList->_pObjList,
|
||
|
1,
|
||
|
(long FAR *)&pObjectTypeList->_dwLBound
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
pObjectTypeList->_dwCurrentIndex = pObjectTypeList->_dwLBound;
|
||
|
|
||
|
*ppObjectTypeList = pObjectTypeList;
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
|
||
|
error:
|
||
|
if (pObjectTypeList) {
|
||
|
delete pObjectTypeList;
|
||
|
}
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
ObjectTypeList::~ObjectTypeList()
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
if (_pObjList) {
|
||
|
hr = SafeArrayDestroy(_pObjList);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ObjectTypeList::GetCurrentObject(
|
||
|
PDWORD pdwObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if (_dwCurrentIndex > _dwUBound) {
|
||
|
return(E_FAIL);
|
||
|
}
|
||
|
|
||
|
hr = SafeArrayGetElement(
|
||
|
_pObjList,
|
||
|
(long FAR *)&_dwCurrentIndex,
|
||
|
(void *)pdwObject
|
||
|
);
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
ObjectTypeList::Next()
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
_dwCurrentIndex++;
|
||
|
|
||
|
if (_dwCurrentIndex > _dwUBound) {
|
||
|
return(E_FAIL);
|
||
|
}
|
||
|
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ObjectTypeList::Reset()
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
_dwCurrentIndex = _dwLBound;
|
||
|
|
||
|
return(hr);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
IsValidFilter(
|
||
|
LPWSTR ObjectName,
|
||
|
DWORD *pdwFilterId,
|
||
|
PFILTERS pFilters,
|
||
|
DWORD dwMaxFilters
|
||
|
)
|
||
|
{
|
||
|
|
||
|
DWORD i = 0;
|
||
|
|
||
|
for (i = 0; i < dwMaxFilters; i++) {
|
||
|
|
||
|
#ifdef WIN95
|
||
|
if (!_wcsicmp(ObjectName, (pFilters + i)->szObjectName)) {
|
||
|
#else
|
||
|
if (CompareStringW(
|
||
|
LOCALE_SYSTEM_DEFAULT,
|
||
|
NORM_IGNORECASE,
|
||
|
ObjectName,
|
||
|
-1,
|
||
|
(pFilters +i)->szObjectName,
|
||
|
-1
|
||
|
) == CSTR_EQUAL ) {
|
||
|
#endif
|
||
|
*pdwFilterId = (pFilters + i)->dwFilterId;
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
*pdwFilterId = 0;
|
||
|
RRETURN(E_FAIL);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
BuildDefaultObjectArray(
|
||
|
PFILTERS pFilters,
|
||
|
DWORD dwMaxFilters,
|
||
|
SAFEARRAY ** ppFilter,
|
||
|
DWORD * pdwNumElements
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
HRESULT hr = S_OK;
|
||
|
SAFEARRAYBOUND sabNewArray;
|
||
|
SAFEARRAY * pFilter = NULL;
|
||
|
|
||
|
sabNewArray.cElements = dwMaxFilters;
|
||
|
sabNewArray.lLbound = 0;
|
||
|
|
||
|
pFilter = SafeArrayCreate(
|
||
|
VT_I4,
|
||
|
1,
|
||
|
&sabNewArray
|
||
|
);
|
||
|
if (!pFilter){
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < dwMaxFilters; i++) {
|
||
|
|
||
|
hr = SafeArrayPutElement(
|
||
|
pFilter,
|
||
|
(long *)&i,
|
||
|
(void *)&((pFilters + i)->dwFilterId)
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
*ppFilter = pFilter;
|
||
|
*pdwNumElements = dwMaxFilters;
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
error:
|
||
|
if (pFilter) {
|
||
|
SafeArrayDestroy(pFilter);
|
||
|
}
|
||
|
|
||
|
*ppFilter = NULL;
|
||
|
*pdwNumElements = 0;
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
BuildObjectArray(
|
||
|
VARIANT var,
|
||
|
SAFEARRAY ** ppFilter,
|
||
|
DWORD * pdwNumElements
|
||
|
)
|
||
|
{
|
||
|
LONG uDestCount = 0;
|
||
|
LONG dwSLBound = 0;
|
||
|
LONG dwSUBound = 0;
|
||
|
VARIANT v;
|
||
|
VARIANT varDest;
|
||
|
LONG i;
|
||
|
HRESULT hr = S_OK;
|
||
|
SAFEARRAYBOUND sabNewArray;
|
||
|
DWORD dwFilterId;
|
||
|
SAFEARRAY * pFilter = NULL;
|
||
|
|
||
|
if (!(V_VT(&var) == (VT_VARIANT|VT_ARRAY))) {
|
||
|
RRETURN(E_FAIL);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Check that there is only one dimension in this array
|
||
|
//
|
||
|
|
||
|
if ((V_ARRAY(&var))->cDims != 1) {
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
//
|
||
|
// Check that there is atleast one element in this array
|
||
|
//
|
||
|
|
||
|
if ((V_ARRAY(&var))->rgsabound[0].cElements == 0){
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// We know that this is a valid single dimension array
|
||
|
//
|
||
|
|
||
|
hr = SafeArrayGetLBound(V_ARRAY(&var),
|
||
|
1,
|
||
|
(long FAR *)&dwSLBound
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = SafeArrayGetUBound(V_ARRAY(&var),
|
||
|
1,
|
||
|
(long FAR *)&dwSUBound
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
sabNewArray.cElements = dwSUBound - dwSLBound + 1;
|
||
|
sabNewArray.lLbound = dwSLBound;
|
||
|
|
||
|
pFilter = SafeArrayCreate(
|
||
|
VT_I4,
|
||
|
1,
|
||
|
&sabNewArray
|
||
|
);
|
||
|
|
||
|
|
||
|
if (!pFilter) {
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
for (i = dwSLBound; i <= dwSUBound; i++) {
|
||
|
VariantInit(&v);
|
||
|
hr = SafeArrayGetElement(V_ARRAY(&var),
|
||
|
(long FAR *)&i,
|
||
|
&v
|
||
|
);
|
||
|
if (FAILED(hr)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
|
||
|
hr = IsValidFilter(
|
||
|
V_BSTR(&v),
|
||
|
&dwFilterId,
|
||
|
gpFilters,
|
||
|
gdwMaxFilters
|
||
|
);
|
||
|
|
||
|
if (FAILED(hr)) {
|
||
|
|
||
|
VariantClear(&v);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
VariantClear(&v);
|
||
|
|
||
|
hr = SafeArrayPutElement(
|
||
|
pFilter,
|
||
|
(long*)&uDestCount,
|
||
|
(void *)&dwFilterId
|
||
|
);
|
||
|
|
||
|
if(FAILED(hr)){
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
uDestCount++;
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// There was nothing of value that could be retrieved from the
|
||
|
// filter.
|
||
|
//
|
||
|
|
||
|
if ( !uDestCount) {
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
*pdwNumElements = uDestCount;
|
||
|
*ppFilter = pFilter;
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
error:
|
||
|
|
||
|
if (pFilter) {
|
||
|
|
||
|
SafeArrayDestroy(pFilter);
|
||
|
}
|
||
|
*ppFilter = NULL;
|
||
|
*pdwNumElements = 0;
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
}
|
||
|
|