//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 - 1997. // // File: var2IIS.cxx // // Contents: IIS Object to Variant Copy Routines // // Functions: // // History: 01-Mar-97 SophiaC Created. // // Issues: Check null ptrs for AllocADsMem and AllocADsStr // //---------------------------------------------------------------------------- #include "iis.hxx" // // IISType objects copy code // HRESULT VarTypeToIISTypeCopyIISSynIdDWORD( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; hr = VariantChangeType(lpVarSrcObject, lpVarSrcObject, 0, VT_UI4); if (FAILED(hr)) { if (hr == E_OUTOFMEMORY) { RRETURN(hr); } RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_DWORD; lpIISDestObject->IISValue.value_1.dwDWORD = lpVarSrcObject->lVal; RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdSTRING( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; hr = VariantChangeType(lpVarSrcObject, lpVarSrcObject, 0, VT_BSTR); if (FAILED(hr)) { if (hr == E_OUTOFMEMORY) { RRETURN(hr); } RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_STRING; lpIISDestObject->IISValue.value_2.String = AllocADsStr( lpVarSrcObject->bstrVal ); RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdEXPANDSZ( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; hr = VariantChangeType(lpVarSrcObject, lpVarSrcObject, 0, VT_BSTR); if (FAILED(hr)) { if (hr == E_OUTOFMEMORY) { RRETURN(hr); } RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_EXPANDSZ; lpIISDestObject->IISValue.value_3.ExpandSz = AllocADsStr( lpVarSrcObject->bstrVal ); RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdMULTISZ( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; hr = VariantChangeType(lpVarSrcObject, lpVarSrcObject, 0, VT_BSTR); if (FAILED(hr)) { if (hr == E_OUTOFMEMORY) { RRETURN(hr); } RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_MULTISZ; lpIISDestObject->IISValue.value_4.MultiSz = AllocADsStr( lpVarSrcObject->bstrVal ); RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdMIMEMAP( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; LPWSTR pszStr; IISMimeType * pMimeType = NULL; if(lpVarSrcObject->vt != VT_DISPATCH){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_MIMEMAP; pMimeType = (IISMimeType *)lpVarSrcObject->pdispVal; hr = ((CMimeType*) pMimeType)->CopyMimeType( &pszStr ); BAIL_ON_FAILURE(hr); lpIISDestObject->IISValue.value_6.MimeMap = pszStr; error: RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdBinary( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject, BOOL bReturnBinaryAsVT_VARIANT ) { HRESULT hr = S_OK; LONG dwSLBound = 0; LONG dwSUBound = 0; CHAR HUGEP *pArray = NULL; if (bReturnBinaryAsVT_VARIANT) { hr = VariantChangeType(lpVarSrcObject,lpVarSrcObject,0,VT_ARRAY | VT_VARIANT); } else { hr = VariantChangeType(lpVarSrcObject,lpVarSrcObject,0,VT_ARRAY | VT_UI1); } if (FAILED(hr)) { if (hr == E_OUTOFMEMORY) { RRETURN(hr); } RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } if (bReturnBinaryAsVT_VARIANT) { if( lpVarSrcObject->vt != (VT_ARRAY | VT_VARIANT)) { RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } } else { if( lpVarSrcObject->vt != (VT_ARRAY | VT_UI1)) { RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } } hr = SafeArrayGetLBound(V_ARRAY(lpVarSrcObject),1,(long FAR *) &dwSLBound ); BAIL_ON_FAILURE(hr); hr = SafeArrayGetUBound(V_ARRAY(lpVarSrcObject),1,(long FAR *) &dwSUBound ); BAIL_ON_FAILURE(hr); lpIISDestObject->IISValue.value_5.Binary = (LPBYTE) AllocADsMem(dwSUBound - dwSLBound + 1); if (lpIISDestObject->IISValue.value_5.Binary == NULL) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } lpIISDestObject->IISType = IIS_SYNTAX_ID_BINARY; lpIISDestObject->IISValue.value_5.Length = dwSUBound - dwSLBound + 1; hr = SafeArrayAccessData( V_ARRAY(lpVarSrcObject),(void HUGEP * FAR *) &pArray ); BAIL_ON_FAILURE(hr); memcpy( lpIISDestObject->IISValue.value_5.Binary,pArray,dwSUBound-dwSLBound+1); SafeArrayUnaccessData( V_ARRAY(lpVarSrcObject) ); error: RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdNTACL( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; IADsSecurityDescriptor FAR * pSecDes = NULL; PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL; DWORD Length = 0; IDispatch FAR * pDispatch = NULL; if(lpVarSrcObject->vt != VT_DISPATCH){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_BINARY; pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsSecurityDescriptor, (void **)&pSecDes ); BAIL_ON_FAILURE(hr); hr = ConvertSecurityDescriptorToSecDes( pSecDes, &pSecurityDescriptor, &Length ); BAIL_ON_FAILURE(hr); lpIISDestObject->IISValue.value_5.Binary = (LPBYTE)AllocADsMem(Length); if ((lpIISDestObject->IISValue.value_5.Binary) == NULL) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } lpIISDestObject->IISValue.value_5.Length = Length; memcpy(lpIISDestObject->IISValue.value_5.Binary, pSecurityDescriptor, Length); error: if (pSecDes) { pSecDes->Release(); } RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdIPSECLIST( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; LPBYTE pBuffer; DWORD Length = 0; IISIPSecurity * pIPSec = NULL; if(lpVarSrcObject->vt != VT_DISPATCH){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_IPSECLIST; pIPSec = (IISIPSecurity*)lpVarSrcObject->pdispVal; hr = ((CIPSecurity*) pIPSec)->CopyIPSecurity( &pBuffer, &Length ); if (pBuffer == NULL) { RRETURN(E_OUTOFMEMORY); } lpIISDestObject->IISValue.value_5.Length = Length; lpIISDestObject->IISValue.value_5.Binary = (LPBYTE)AllocADsMem(Length); memcpy(lpIISDestObject->IISValue.value_5.Binary, pBuffer, Length); RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdBOOL( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; hr = VariantChangeType(lpVarSrcObject, lpVarSrcObject, 0, VT_BOOL); if (FAILED(hr)) { if (hr == E_OUTOFMEMORY) { RRETURN(hr); } RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_BOOL; lpIISDestObject->IISValue.value_1.dwDWORD = (lpVarSrcObject->boolVal) ? 1 : 0; RRETURN(hr); } HRESULT VarTypeToIISTypeCopyIISSynIdBOOLBITMASK( PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject ) { HRESULT hr = S_OK; hr = VariantChangeType(lpVarSrcObject, lpVarSrcObject, 0, VT_BOOL); if (FAILED(hr)) { if (hr == E_OUTOFMEMORY) { RRETURN(hr); } RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpIISDestObject->IISType = IIS_SYNTAX_ID_BOOL_BITMASK; lpIISDestObject->IISValue.value_1.dwDWORD = (lpVarSrcObject->boolVal) ? 1 : 0; RRETURN(hr); } HRESULT VarTypeToIISTypeCopy( DWORD dwIISType, PVARIANT lpVarSrcObject, PIISOBJECT lpIISDestObject, BOOL bReturnBinaryAsVT_VARIANT ) { HRESULT hr = S_OK; switch (dwIISType){ case IIS_SYNTAX_ID_DWORD: hr = VarTypeToIISTypeCopyIISSynIdDWORD( lpVarSrcObject, lpIISDestObject ); break; case IIS_SYNTAX_ID_STRING: hr = VarTypeToIISTypeCopyIISSynIdSTRING( lpVarSrcObject, lpIISDestObject ); break; case IIS_SYNTAX_ID_EXPANDSZ: hr = VarTypeToIISTypeCopyIISSynIdEXPANDSZ( lpVarSrcObject, lpIISDestObject ); break; case IIS_SYNTAX_ID_MULTISZ: hr = VarTypeToIISTypeCopyIISSynIdMULTISZ( lpVarSrcObject, lpIISDestObject ); break; case IIS_SYNTAX_ID_MIMEMAP: hr = VarTypeToIISTypeCopyIISSynIdMIMEMAP( lpVarSrcObject, lpIISDestObject ); break; case IIS_SYNTAX_ID_NTACL: hr = VarTypeToIISTypeCopyIISSynIdNTACL( lpVarSrcObject, lpIISDestObject ); break; case IIS_SYNTAX_ID_BINARY: hr = VarTypeToIISTypeCopyIISSynIdBinary( lpVarSrcObject, lpIISDestObject, bReturnBinaryAsVT_VARIANT ); break; case IIS_SYNTAX_ID_IPSECLIST: hr = VarTypeToIISTypeCopyIISSynIdIPSECLIST( lpVarSrcObject, lpIISDestObject ); break; case IIS_SYNTAX_ID_BOOL: hr = VarTypeToIISTypeCopyIISSynIdBOOL( lpVarSrcObject, lpIISDestObject ); break; case IIS_SYNTAX_ID_BOOL_BITMASK: hr = VarTypeToIISTypeCopyIISSynIdBOOLBITMASK( lpVarSrcObject, lpIISDestObject ); break; default: hr = E_FAIL; break; } RRETURN(hr); } HRESULT VarTypeToIISTypeCopyConstruct( DWORD dwIISType, LPVARIANT pVarSrcObjects, DWORD dwNumObjects, LPIISOBJECT * ppIISDestObjects, BOOL bReturnBinaryAsVT_VARIANT ) { DWORD i = 0; LPIISOBJECT pIISDestObjects = NULL; HRESULT hr = S_OK; pIISDestObjects = (LPIISOBJECT)AllocADsMem( dwNumObjects * sizeof(IISOBJECT) ); if (!pIISDestObjects) { RRETURN(E_FAIL); } for (i = 0; i < dwNumObjects; i++ ) { hr = VarTypeToIISTypeCopy( dwIISType, pVarSrcObjects + i, pIISDestObjects + i, bReturnBinaryAsVT_VARIANT ); BAIL_ON_FAILURE(hr); } *ppIISDestObjects = pIISDestObjects; RRETURN(S_OK); error: if (pIISDestObjects) { IISTypeFreeIISObjects( pIISDestObjects, dwNumObjects ); } *ppIISDestObjects = NULL; RRETURN(hr); }