|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1997.
//
// File: iis2var.cxx
//
// Contents: IIS Object to Variant Copy Routines
//
// Functions:
//
// History: 05-Mar-97 SophiaC Created.
//
//
// Issues: Check null ptrs for AllocADsMem and AllocADsStr
//
//
//----------------------------------------------------------------------------
#include "iis.hxx"
//
// IISType objects copy code
//
void VarTypeFreeVarObjects( PVARIANT pVarObject, DWORD dwNumValues ) { DWORD i = 0;
for (i = 0; i < dwNumValues; i++ ) { VariantClear(pVarObject + i); }
FreeADsMem(pVarObject);
return; }
HRESULT IISTypeToVarTypeCopyIISSynIdDWORD( IIsSchema *pSchema, PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK;
lpVarDestObject->vt = VT_I4; lpVarDestObject->lVal = lpIISSrcObject->IISValue.value_1.dwDWORD;
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdSTRING( IIsSchema *pSchema, PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK;
lpVarDestObject->vt = VT_BSTR;
hr = ADsAllocString( lpIISSrcObject->IISValue.value_2.String, &(lpVarDestObject->bstrVal) );
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdEXPANDSZ( IIsSchema *pSchema, PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject )
{ HRESULT hr = S_OK;
lpVarDestObject->vt = VT_BSTR;
hr = ADsAllocString( lpIISSrcObject->IISValue.value_3.ExpandSz, &(lpVarDestObject->bstrVal) );
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdMULTISZ( IIsSchema *pSchema, PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK;
lpVarDestObject->vt = VT_BSTR;
hr = ADsAllocString( lpIISSrcObject->IISValue.value_4.MultiSz, &(lpVarDestObject->bstrVal) );
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdBOOL( IIsSchema *pSchema, PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK;
lpVarDestObject->vt = VT_BOOL; lpVarDestObject->boolVal = lpIISSrcObject->IISValue.value_1.dwDWORD ? VARIANT_TRUE : VARIANT_FALSE;
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdBOOLBITMASK( IIsSchema *pSchema, LPWSTR pszPropertyName, PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; DWORD dwFlag = 0;
pSchema->LookupBitMask(pszPropertyName, &dwFlag);
lpVarDestObject->vt = VT_BOOL; lpVarDestObject->boolVal = (lpIISSrcObject->IISValue.value_1.dwDWORD) & dwFlag ? VARIANT_TRUE : VARIANT_FALSE;
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdMIMEMAP( IIsSchema *pSchema, PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK;
IISMimeType * pMimeType = NULL; hr = CMimeType::CreateMimeType( IID_IISMimeType, (VOID**) &pMimeType );
BAIL_ON_FAILURE(hr);
hr = ((CMimeType*)pMimeType)->InitFromIISString( lpIISSrcObject->IISValue.value_4.MultiSz); lpVarDestObject->vt = VT_DISPATCH; lpVarDestObject->pdispVal = pMimeType;
error:
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdBinary( PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject, BOOL bReturnBinaryAsVT_VARIANT ) { HRESULT hr = S_OK; SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound; CHAR HUGEP *pArray = NULL; long i = 0;
aBound.lLbound = 0; aBound.cElements = lpIISSrcObject->IISValue.value_5.Length;;
if (bReturnBinaryAsVT_VARIANT) { aList = SafeArrayCreate( VT_VARIANT, 1, &aBound ); } else { aList = SafeArrayCreate( VT_UI1, 1, &aBound ); } if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); }
hr = SafeArrayAccessData( aList, (void HUGEP * FAR *) &pArray ); BAIL_ON_FAILURE(hr);
if (!bReturnBinaryAsVT_VARIANT) { memcpy( pArray, lpIISSrcObject->IISValue.value_5.Binary, aBound.cElements ); } else { for (i = 0; (DWORD)i < aBound.cElements; i++ ) { VARIANT v; WCHAR wVal[20];
VariantInit(&v); V_VT(&v) = VT_BSTR;
_itow(lpIISSrcObject->IISValue.value_5.Binary[i], wVal, 16);
hr = ADsAllocString( wVal, &(V_BSTR(&v)));
BAIL_ON_FAILURE(hr);
hr = SafeArrayPutElement( aList, &i, &v );
VariantClear(&v); BAIL_ON_FAILURE(hr); } }
SafeArrayUnaccessData( aList );
if (bReturnBinaryAsVT_VARIANT) { V_VT(lpVarDestObject) = VT_ARRAY | VT_VARIANT; } else { V_VT(lpVarDestObject) = VT_ARRAY | VT_UI1; } V_ARRAY(lpVarDestObject) = aList;
RRETURN(hr);
error:
if ( aList ) SafeArrayDestroy( aList );
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdNTACL( PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_DISPATCH;
hr = ConvertSecDescriptorToVariant( (PSECURITY_DESCRIPTOR)lpIISSrcObject->IISValue.value_5.Binary, lpVarDestObject );
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyIISSynIdIPSECLIST( PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK;
IISIPSecurity * pIPSec = NULL; hr = CIPSecurity::CreateIPSecurity( IID_IISIPSecurity, (VOID**) &pIPSec );
BAIL_ON_FAILURE(hr);
hr = ((CIPSecurity*)pIPSec)->InitFromBinaryBlob( lpIISSrcObject->IISValue.value_5.Binary, lpIISSrcObject->IISValue.value_5.Length); lpVarDestObject->vt = VT_DISPATCH; lpVarDestObject->pdispVal = pIPSec;
error:
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopy( IIsSchema *pSchema, LPWSTR pszPropertyName, PIISOBJECT lpIISSrcObject, PVARIANT lpVarDestObject, BOOL bReturnBinaryAsVT_VARIANT ) { HRESULT hr = S_OK; switch (lpIISSrcObject->IISType) { case IIS_SYNTAX_ID_DWORD: hr = IISTypeToVarTypeCopyIISSynIdDWORD( pSchema, lpIISSrcObject, lpVarDestObject ); break;
case IIS_SYNTAX_ID_STRING: hr = IISTypeToVarTypeCopyIISSynIdSTRING( pSchema, lpIISSrcObject, lpVarDestObject ); break;
case IIS_SYNTAX_ID_EXPANDSZ: hr = IISTypeToVarTypeCopyIISSynIdEXPANDSZ( pSchema, lpIISSrcObject, lpVarDestObject ); break;
case IIS_SYNTAX_ID_MULTISZ: hr = IISTypeToVarTypeCopyIISSynIdMULTISZ( pSchema, lpIISSrcObject, lpVarDestObject ); break;
case IIS_SYNTAX_ID_BOOL: hr = IISTypeToVarTypeCopyIISSynIdBOOL( pSchema, lpIISSrcObject, lpVarDestObject ); break;
case IIS_SYNTAX_ID_BOOL_BITMASK: hr = IISTypeToVarTypeCopyIISSynIdBOOLBITMASK( pSchema, pszPropertyName, lpIISSrcObject, lpVarDestObject ); break;
case IIS_SYNTAX_ID_MIMEMAP: hr = IISTypeToVarTypeCopyIISSynIdMIMEMAP( pSchema, lpIISSrcObject, lpVarDestObject ); break;
case IIS_SYNTAX_ID_NTACL: hr = IISTypeToVarTypeCopyIISSynIdNTACL( lpIISSrcObject, lpVarDestObject ); break;
case IIS_SYNTAX_ID_BINARY: hr = IISTypeToVarTypeCopyIISSynIdBinary( lpIISSrcObject, lpVarDestObject, bReturnBinaryAsVT_VARIANT ); break;
case IIS_SYNTAX_ID_IPSECLIST: hr = IISTypeToVarTypeCopyIISSynIdIPSECLIST( lpIISSrcObject, lpVarDestObject ); break;
default: hr = E_FAIL; break; }
RRETURN(hr); }
HRESULT IISTypeToVarTypeCopyConstruct( IIsSchema *pSchema, LPWSTR pszPropertyName, LPIISOBJECT pIISSrcObjects, DWORD dwNumObjects, PVARIANT pVarDestObjects, BOOL bReturnBinaryAsVT_VARIANT ) { long i = 0; HRESULT hr = S_OK; DWORD dwSyntaxId;
dwSyntaxId = pIISSrcObjects->IISType; if (dwSyntaxId == IIS_SYNTAX_ID_BINARY || dwSyntaxId == IIS_SYNTAX_ID_IPSECLIST || dwSyntaxId == IIS_SYNTAX_ID_NTACL) { hr = IISTypeToVarTypeCopy( pSchema, pszPropertyName, pIISSrcObjects, pVarDestObjects, bReturnBinaryAsVT_VARIANT); RRETURN(hr);
}
VariantInit(pVarDestObjects);
//
// Check to see if IISType is a Multi-sz w/ only 1 empty string element
//
if (dwNumObjects == 1 && (pIISSrcObjects->IISType == IIS_SYNTAX_ID_MULTISZ || pIISSrcObjects->IISType == IIS_SYNTAX_ID_MIMEMAP )) { if (*pIISSrcObjects->IISValue.value_4.MultiSz == L'\0') { dwNumObjects = 0; } }
// The following are for handling are multi-value properties
//
SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound;
aBound.lLbound = 0;
aBound.cElements = dwNumObjects;
aList = SafeArrayCreate( VT_VARIANT, 1, &aBound );
if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); }
for ( i = 0; i < (long) dwNumObjects; i++ ) { VARIANT v;
VariantInit(&v); hr = IISTypeToVarTypeCopy( pSchema, pszPropertyName, pIISSrcObjects + i, &v, bReturnBinaryAsVT_VARIANT); BAIL_ON_FAILURE(hr);
hr = SafeArrayPutElement( aList, &i, &v ); VariantClear(&v); BAIL_ON_FAILURE(hr); }
V_VT(pVarDestObjects) = VT_ARRAY | VT_VARIANT; V_ARRAY(pVarDestObjects) = aList;
RRETURN(S_OK);
error:
if ( aList ) SafeArrayDestroy( aList );
RRETURN(hr); }
|