418 lines
7.6 KiB
C++
418 lines
7.6 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|