|
|
//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: helpers.cxx
//
// Contents: ADs C Wrappers (Helper functions)
//
// ADsBuildEnumerator
// ADsFreeEnumerator
// ADsEnumerateNext
// ADsBuildVarArrayStr
// ADsBuildVarArrayInt
//
// History:
// 1-March-1995 KrishnaG -- Created
//
//----------------------------------------------------------------------------
#include "oleds.hxx"
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Function: ADsBuildEnumerator
//
// Synopsis: C wrapper code to create an Enumerator object.
//
// Arguments: [pNetOleCollection] -- The input Collection object.
//
// [ppEnumVariant] -- The created Enumerator object.
//
// Returns: HRESULT
//
//----------------------------------------------------------------------------
HRESULT ADsBuildEnumerator( IADsContainer *pADsContainer, IEnumVARIANT * * ppEnumVariant ) {
HRESULT hr; IUnknown *pUnk = NULL;
//
// Get a new enumerator object.
//
hr = pADsContainer->get__NewEnum( &pUnk ); if (FAILED(hr)) {
goto Fail; }
//
// QueryInterface the IUnknown pointer for an IEnumVARIANT interface,
//
hr = pUnk->QueryInterface( IID_IEnumVARIANT, (void FAR* FAR*)ppEnumVariant ); if (FAILED(hr)) {
goto Fail; }
//
// Release the IUnknown pointer.
//
pUnk->Release();
return(hr);
Fail:
if (pUnk) { pUnk->Release(); }
return(hr); }
//+---------------------------------------------------------------------------
//
// Function: ADsFreeEnumerator
//
// Synopsis: Frees an Enumerator object.
//
// Arguments: [pEnumerator] -- The Enumerator object to be freed.
//
// Returns: HRESULT
//----------------------------------------------------------------------------
HRESULT ADsFreeEnumerator( IEnumVARIANT *pEnumVariant ) {
HRESULT hr = E_ADS_BAD_PARAMETER;
ULONG uRefCount = 0;
if (pEnumVariant) { uRefCount = pEnumVariant->Release();
return(S_OK); }
return(hr); }
//+---------------------------------------------------------------------------
//
// Function: ADsEnumerateNext
//
// Synopsis: C wrapper code for IEnumVARIANT::Next
//
// Arguments: [pEnumVariant] -- Input enumerator object.
//
// [cElements] -- Number of elements to retrieve.
//
// [pvar] -- VARIANT array.
//
// [pcElementFetched] -- Number of elements fetched.
//
// Returns: HRESULT
//
//----------------------------------------------------------------------------
HRESULT ADsEnumerateNext( IEnumVARIANT *pEnumVariant, ULONG cElements, VARIANT * pvar, ULONG * pcElementsFetched ) {
return(pEnumVariant->Next(cElements, pvar, pcElementsFetched)); }
//+---------------------------------------------------------------------------
//
// Function: ADsBuildVarArrayStr
//
// Synopsis: Build a variant array of strings
//
// Arguments: [lppPathNames] -- List of pathnames to be put in the array.
//
// [dwPathNames] -- Number of pathnames in the list.
//
// [ppvar] -- Pointer to a pointer of a Variant array.
//
// Returns: HRESULT
//
//----------------------------------------------------------------------------
HRESULT ADsBuildVarArrayStr( LPWSTR * lppPathNames, DWORD dwPathNames, VARIANT * pVar ) {
VARIANT v; SAFEARRAYBOUND sabNewArray; DWORD i; SAFEARRAY *psa = NULL; HRESULT hr = E_FAIL;
if (!pVar) { hr = E_ADS_BAD_PARAMETER; goto Fail; } VariantInit(pVar);
sabNewArray.cElements = dwPathNames; sabNewArray.lLbound = 0; psa = SafeArrayCreate(VT_VARIANT, 1, &sabNewArray);
if (!psa) { goto Fail; }
for (i = 0; i < dwPathNames; i++) {
VariantInit(&v); V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString(*(lppPathNames + i)); hr = SafeArrayPutElement(psa, (long FAR *)&i, &v ); VariantClear( &v ); if (FAILED(hr)) { goto Fail; } }
V_VT(pVar) = VT_ARRAY | VT_VARIANT;
V_ARRAY(pVar) = psa;
return(ResultFromScode(S_OK));
Fail:
if (psa) { SafeArrayDestroy(psa); }
return(E_FAIL);
}
//+---------------------------------------------------------------------------
//
// Function: ADsBuildVarArrayInt
//
// Synopsis: Build a variant array of integers
//
// Arguments: [lppObjectTypes] -- List of object types to be put in the array.
//
// [dwObjectTypes] -- Number of object types in the list.
//
// [ppvar] -- Pointer to a pointer of a Variant array.
//
// Returns: HRESULT
//
//----------------------------------------------------------------------------
HRESULT ADsBuildVarArrayInt( LPDWORD lpdwObjectTypes, DWORD dwObjectTypes, VARIANT * pVar ) {
VARIANT v; SAFEARRAYBOUND sabNewArray; DWORD i; SAFEARRAY *psa = NULL; HRESULT hr = E_FAIL;
if (!pVar) { hr = E_ADS_BAD_PARAMETER; goto Fail; } VariantInit(pVar);
sabNewArray.cElements = dwObjectTypes; sabNewArray.lLbound = 0; psa = SafeArrayCreate(VT_VARIANT, 1, &sabNewArray);
if (!psa) { goto Fail; }
for (i = 0; i < dwObjectTypes; i++) {
VariantInit(&v); V_VT(&v) = VT_I4; V_I4(&v) = *(lpdwObjectTypes + i); hr = SafeArrayPutElement(psa, (long FAR *)&i, &v ); VariantClear( &v ); if (FAILED(hr)) { goto Fail; } }
V_VT(pVar) = VT_VARIANT | VT_ARRAY;
V_ARRAY(pVar) = psa;
return(ResultFromScode(S_OK));
Fail:
if (psa) { SafeArrayDestroy(psa); }
return(E_FAIL); }
//+---------------------------------------------------------------------------
// Function: BinarySDToSecurityDescriptor.
//
// Synopsis: Convert the given binary blob to an equivalent object
// implementing the IADsSecurityDescriptor interface.
//
// Arguments: pSecurityDescriptor - the binary SD to convert.
// pVarsec - return value.
// pszServerName - serverName the SD was
// retrieved from (optional).
// userName - not used, optional.
// passWord - not used, optional.
// dwFlags - not used, optional.
//
// Returns: HRESULT - S_OK or any failure error code
//
// Modifies: pVarsec to contain a VT_DISPATCH if successful.
//
//----------------------------------------------------------------------------
HRESULT BinarySDToSecurityDescriptor( PSECURITY_DESCRIPTOR pSecurityDescriptor, VARIANT *pVarsec, LPCWSTR pszServerName, // defaulted to NULL
LPCWSTR userName, // defaulted to NULL
LPCWSTR passWord, // defaulted to NULL
DWORD dwFlags // defaulted to 0
) { CCredentials creds((LPWSTR)userName, (LPWSTR)passWord, dwFlags);
//
// Call internal routine in sec2var.cxx that does all the work.
//
RRETURN(ConvertSecDescriptorToVariant( (LPWSTR)pszServerName, creds, pSecurityDescriptor, pVarsec, TRUE // we will always expect NT format.
) ); }
//+---------------------------------------------------------------------------
// Function: SecurityDescriptorToBinarySD.
//
// Synopsis: Convert the given IADsSecurityDescriptor to (in the variant
// to a binary security descriptor blob.
//
// Arguments: vVarSecDes - the binary SD to convert.
// ppSecurityDescriptor - ptr to output binary blob.
// pszServerName - serverName the SD
// is being put on, optional.
// userName - not used, optional.
// passWord - not used, optional.
// dwFlags - not used, optional.
//
// Returns: HRESULT - S_OK or any failure error code
//
// Modifies: pVarsec to contain a VT_DISPATCH if successful.
//
//----------------------------------------------------------------------------
HRESULT SecurityDescriptorToBinarySD( VARIANT vVarSecDes, PSECURITY_DESCRIPTOR * ppSecurityDescriptor, PDWORD pdwSDLength, LPCWSTR pszServerName, // defaulted to NULL
LPCWSTR userName, // defaulted to NULL
LPCWSTR passWord, // defaulted to NULL
DWORD dwFlags // defaulted to 0
) { HRESULT hr = E_FAIL; IADsSecurityDescriptor *pIADsSecDesc = NULL; CCredentials creds((LPWSTR)userName, (LPWSTR)passWord, dwFlags);
//
// Verify it is a VT_DISPATCH and also that ptr is valid.
//
if ((vVarSecDes.vt != VT_DISPATCH) || (!V_DISPATCH(&vVarSecDes)) ) { BAIL_ON_FAILURE(hr); } //
// Get the interface ptr from the variant (it has to be IDispatch)
//
hr = vVarSecDes.pdispVal->QueryInterface( IID_IADsSecurityDescriptor, (void **) &pIADsSecDesc ); BAIL_ON_FAILURE(hr);
//
// Call the helper routine in sec2var.cxx
//
hr = ConvertSecurityDescriptorToSecDes( (LPWSTR)pszServerName, creds, pIADsSecDesc, ppSecurityDescriptor, pdwSDLength, TRUE // always NT Sec desc mode
);
error:
if (pIADsSecDesc) { pIADsSecDesc->Release(); }
RRETURN(hr); }
// end of helpers.cxx
|