windows-nt/Source/XPSP1/NT/ds/adsi/drt/adscmd/proputil.cxx
2020-09-26 16:20:57 +08:00

271 lines
5.4 KiB
C++

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996
//
// File: proputil.cxx
//
// Contents: Property Listing Utilities
//
// History: 08-05-96 t-danal created
//
//----------------------------------------------------------------------------
//
// ********* System Includes
//
#define UNICODE
#define _UNICODE
#define INC_OLE2
// #define _OLEAUT32_
// #define SECURITY_WIN32
#include <windows.h>
//
// ********* CRunTime Includes
//
#include <stdlib.h>
#include <limits.h>
#include <io.h>
#include <stdio.h>
//
// ********* Public ADs includes
//
#include <activeds.h>
#include "macro.hxx"
#include "proputil.hxx"
HRESULT
PrintVariant(
VARIANT varPropData
)
{
HRESULT hr;
BSTR bstrValue;
switch (varPropData.vt) {
case VT_I4:
printf("\t%d", varPropData.lVal);
break;
case VT_BSTR:
printf("\t%S", varPropData.bstrVal);
break;
case VT_BOOL:
printf("\t%d", V_BOOL(&varPropData));
break;
case (VT_ARRAY | VT_VARIANT):
PrintVariantArray(varPropData);
break;
case VT_DATE:
hr = VarBstrFromDate(
varPropData.date,
LOCALE_SYSTEM_DEFAULT,
LOCALE_NOUSEROVERRIDE,
&bstrValue
);
printf("\t%S", bstrValue);
break;
default:
printf("\tData type is %d\n", varPropData.vt);
break;
}
printf("\n");
return(S_OK);
}
HRESULT
PrintVariantArray(
VARIANT var
)
{
LONG dwSLBound = 0;
LONG dwSUBound = 0;
VARIANT v;
LONG i;
HRESULT hr = S_OK;
if(!((V_VT(&var) & VT_VARIANT) && V_ISARRAY(&var))) {
return(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);
printf("\t");
for (i = dwSLBound; i <= dwSUBound; i++) {
VariantInit(&v);
hr = SafeArrayGetElement(V_ARRAY(&var),
(long FAR *)&i,
&v
);
if (FAILED(hr)) {
continue;
}
if (i < dwSUBound) {
printf("%S, ", v.bstrVal);
}else{
printf("%S",v.bstrVal);
}
}
return(S_OK);
error:
return(hr);
}
HRESULT
PrintProperty(
BSTR bstrPropName,
HRESULT hRetVal,
VARIANT varPropData
)
{
HRESULT hr = S_OK;
switch (hRetVal) {
case 0:
printf("Property: %S", bstrPropName);
PrintVariant(varPropData);
break;
case E_ADS_CANT_CONVERT_DATATYPE:
printf("Property: %S", bstrPropName);
printf("\tProperty data could not be converted to variant\n");
break;
default:
printf("Property: %S", bstrPropName);
printf("\tProperty not available in cache\n");
break;
}
return(hr);
}
HRESULT
GetPropertyList(
IADs * pADs,
VARIANT ** ppVariant,
PDWORD pcElementFetched
)
{
HRESULT hr= S_OK;
BSTR bstrSchemaPath = NULL;
IADsContainer * pADsContainer = NULL;
IEnumVARIANT * pEnumVariant = NULL;
BOOL fContinue = TRUE;
ULONG cthisElement = 0L;
ULONG cElementFetched = 0L;
LPBYTE pVariantArray = NULL;
VARIANT varProperty;
DWORD cb = 0;
hr = pADs->get_Schema(&bstrSchemaPath);
BAIL_ON_FAILURE(hr);
hr = ADsGetObject(
bstrSchemaPath,
IID_IADsContainer,
(void **)&pADsContainer
);
BAIL_ON_FAILURE(hr);
hr = ADsBuildEnumerator(
pADsContainer,
&pEnumVariant
);
BAIL_ON_FAILURE(hr);
while (fContinue) {
VariantInit(&varProperty);
hr = ADsEnumerateNext(
pEnumVariant,
1,
&varProperty,
&cthisElement
);
if (hr == S_FALSE) {
fContinue = FALSE;
break;
}
pVariantArray = (LPBYTE)realloc(
(void *)pVariantArray,
cb + sizeof(VARIANT)
);
if (!pVariantArray) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
memcpy(pVariantArray + cb, (LPBYTE)&varProperty, sizeof(VARIANT));
cb += sizeof(VARIANT);
cElementFetched += cthisElement;
}
*ppVariant = (LPVARIANT)pVariantArray;
*pcElementFetched = cElementFetched;
error:
if (bstrSchemaPath) {
SysFreeString(bstrSchemaPath);
}
if (pADsContainer) {
pADsContainer->Release();
}
return(hr);
}