//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: winnt2var.cxx // // Contents: WinNT Object to Variant Copy Routines // // Functions: // // History: 06/12/96 RamV Created. // cloned off NDS conversion code. // // Issues: Check null ptrs for AllocADsMem and AllocADsStr // //---------------------------------------------------------------------------- // // NTType objects copy code // #include "winnt.hxx" #pragma hdrstop #define INITGUID void VarTypeFreeVarObjects( PVARIANT pVarObject, DWORD dwNumValues ) { DWORD i = 0; if( !pVarObject){ return; } for (i = 0; i < dwNumValues; i++ ) { VariantClear(pVarObject + i); } FreeADsMem(pVarObject); return; } HRESULT NTTypeToVarTypeCopyOctetString( PNTOBJECT pNTSrcValue, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; if(!lpVarDestObject){ RRETURN(E_POINTER); } hr = BinaryToVariant( (pNTSrcValue->NTValue).octetstring.dwSize, (pNTSrcValue->NTValue).octetstring.pByte, lpVarDestObject ); RRETURN(hr); } HRESULT NTTypeToVarTypeCopyBOOL( PNTOBJECT pNTSrcValue, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; if(!lpVarDestObject){ RRETURN(E_POINTER); } if(!pNTSrcValue){ RRETURN(E_POINTER); } lpVarDestObject->vt = VT_BOOL; if((pNTSrcValue->NTValue).fValue){ lpVarDestObject->boolVal = VARIANT_TRUE; // notation for TRUE in V_BOOL } else { lpVarDestObject->boolVal = VARIANT_FALSE; } RRETURN(hr); } HRESULT NTTypeToVarTypeCopySYSTEMTIME( PNTOBJECT pNTSrcValue, PVARIANT lpVarDestObject ) { HRESULT hr; if(!pNTSrcValue){ RRETURN(E_POINTER); } if(!lpVarDestObject){ RRETURN(E_POINTER); } lpVarDestObject->vt = VT_DATE; hr = ConvertSystemTimeToDATE (pNTSrcValue->NTValue.stSystemTimeValue, &lpVarDestObject->date ); RRETURN(hr); } HRESULT NTTypeToVarTypeCopyDWORD( PNTOBJECT pNTSrcValue, PVARIANT lpVarDestObject ) { // // we cast the DWORD to a LONG // HRESULT hr = S_OK; if(!lpVarDestObject){ RRETURN(E_POINTER); } if(!pNTSrcValue){ RRETURN(E_POINTER); } lpVarDestObject->vt = VT_I4; lpVarDestObject->lVal = (LONG)(pNTSrcValue->NTValue).dwValue; RRETURN(hr); } HRESULT NTTypeToVarTypeCopyDATE70( PNTOBJECT pNTSrcValue, PVARIANT lpVarDestObject ) { // // we cast the DWORD to a LONG // HRESULT hr = S_OK; if(!lpVarDestObject){ RRETURN(E_POINTER); } if(!pNTSrcValue){ RRETURN(E_POINTER); } lpVarDestObject->vt = VT_DATE; hr = ConvertDWORDtoDATE( (pNTSrcValue->NTValue).dwSeconds1970, &(lpVarDestObject->date) ); RRETURN(hr); } HRESULT NTTypeToVarTypeCopyDATE( PNTOBJECT pNTSrcValue, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; SYSTEMTIME stSystemTime; SYSTEMTIME LocalTime; DATE date; BOOL fRetval; GetSystemTime( &stSystemTime); fRetval = SystemTimeToTzSpecificLocalTime( NULL, &stSystemTime, &LocalTime ); if(!fRetval){ RRETURN(HRESULT_FROM_WIN32(GetLastError())); } stSystemTime.wHour = (WORD)(pNTSrcValue->NTValue.dwValue)/60; stSystemTime.wMinute = (WORD)(pNTSrcValue->NTValue.dwValue)%60; stSystemTime.wSecond =0; stSystemTime.wMilliseconds = 0; if(!lpVarDestObject){ RRETURN(E_POINTER); } if(!pNTSrcValue){ RRETURN(E_POINTER); } lpVarDestObject->vt = VT_DATE; hr = ConvertSystemTimeToDATE (stSystemTime, &date ); BAIL_ON_FAILURE(hr); // We are casting date to DWORD and then subtracting it from date, which is double, // so that we only keep hours and minutes related info from the source DATE lpVarDestObject->date = date - (DWORD)date; error: RRETURN(hr); } HRESULT NTTypeToVarTypeCopyLPTSTR( PNTOBJECT pNTSrcValue, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; if(!lpVarDestObject){ RRETURN(E_POINTER); } lpVarDestObject->vt = VT_BSTR; if(!(pNTSrcValue->NTValue).pszValue){ lpVarDestObject->bstrVal = NULL; hr = S_OK; goto error; } if(!pNTSrcValue){ lpVarDestObject->bstrVal = NULL; } else { hr = ADsAllocString((pNTSrcValue->NTValue).pszValue, &(lpVarDestObject->bstrVal)); } error: RRETURN(hr); } HRESULT NtTypeToVarTypeCopy( PNTOBJECT lpNtSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; switch (lpNtSrcObject->NTType) { case NT_SYNTAX_ID_BOOL: hr = NTTypeToVarTypeCopyBOOL( lpNtSrcObject, lpVarDestObject ); break; case NT_SYNTAX_ID_SYSTEMTIME: hr = NTTypeToVarTypeCopySYSTEMTIME( lpNtSrcObject, lpVarDestObject ); break; case NT_SYNTAX_ID_DWORD: hr = NTTypeToVarTypeCopyDWORD( lpNtSrcObject, lpVarDestObject ); break; case NT_SYNTAX_ID_DATE: hr = NTTypeToVarTypeCopyDATE( lpNtSrcObject, lpVarDestObject ); break; case NT_SYNTAX_ID_LPTSTR: hr = NTTypeToVarTypeCopyLPTSTR( lpNtSrcObject, lpVarDestObject ); break; case NT_SYNTAX_ID_DelimitedString: hr = NTTypeToVarTypeCopyLPTSTR( lpNtSrcObject, lpVarDestObject ); break; case NT_SYNTAX_ID_NulledString : hr = NTTypeToVarTypeCopyLPTSTR( lpNtSrcObject, lpVarDestObject ); break; case NT_SYNTAX_ID_DATE_1970: hr = NTTypeToVarTypeCopyDATE70( lpNtSrcObject, lpVarDestObject ); break; case NT_SYNTAX_ID_OCTETSTRING : hr = NTTypeToVarTypeCopyOctetString( lpNtSrcObject, lpVarDestObject ); break; default: hr = E_FAIL; break; } RRETURN(hr); } HRESULT NtTypeToVarTypeCopyConstruct( LPNTOBJECT pNtSrcObjects, DWORD dwNumObjects, PVARIANT pVarDestObjects ) { long i = 0; HRESULT hr = S_OK; VariantInit( pVarDestObjects ); // // 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 = NtTypeToVarTypeCopy( pNtSrcObjects + i, &v ); 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); }