//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: ndscopy.cxx // // Contents: NDS Object to Variant Copy Routines // // Functions: // // History: 25-Apr-96 KrishnaG Created. // // // // // The following conversions are not supported // // NDS_ASN1_TYPE_1 // // NDS_ASN1_TYPE_2 // // NDS_ASN1_TYPE_3 // // NDS_ASN1_TYPE_4 // // NDS_ASN1_TYPE_5 // // NDS_ASN1_TYPE_6 // // NDS_ASN1_TYPE_7 // // NDS_ASN1_TYPE_8 // // NDS_ASN1_TYPE_9 // // NDS_ASN1_TYPE_10 // // NDS_ASN1_TYPE_11 // // NDS_ASN1_TYPE_12 // // NDS_ASN1_TYPE_13 // // NDS_ASN1_TYPE_14 // // NDS_ASN1_TYPE_15 // // NDS_ASN1_TYPE_16 // // NDS_ASN1_TYPE_17 // // NDS_ASN1_TYPE_18 // // NDS_ASN1_TYPE_19 // // NDS_ASN1_TYPE_20 // // NDS_ASN1_TYPE_21 // // NDS_ASN1_TYPE_22 // // NDS_ASN1_TYPE_23 // // NDS_ASN1_TYPE_24 // // NDS_ASN1_TYPE_25 // // NDS_ASN1_TYPE_26 // // NDS_ASN1_TYPE_27 // // //---------------------------------------------------------------------------- #include "nds.hxx" // // NdsType 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 NdsTypeToVarTypeCopyNDSSynId1( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_BSTR; hr = ADsAllocString( lpNdsSrcObject->NdsValue.value_1.DNString, &(lpVarDestObject->bstrVal) ); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId2( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_BSTR; hr = ADsAllocString( lpNdsSrcObject->NdsValue.value_1.DNString, &(lpVarDestObject->bstrVal) ); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId3( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; VariantInit(lpVarDestObject); lpVarDestObject->vt = VT_BSTR; hr = ADsAllocString( lpNdsSrcObject->NdsValue.value_1.DNString, &(lpVarDestObject->bstrVal) ); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId4( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_BSTR; hr = ADsAllocString( lpNdsSrcObject->NdsValue.value_1.DNString, &(lpVarDestObject->bstrVal) ); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId5( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_BSTR; hr = ADsAllocString( lpNdsSrcObject->NdsValue.value_1.DNString, &(lpVarDestObject->bstrVal) ); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId6( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound; long i; BSTR bstrAddress; DWORD cElements = 0; IADsCaseIgnoreList* pCaseIgnoreList = NULL; IDispatch * pDispatch = NULL; VARIANT VarDestObject; struct _NDS_CI_LIST *pCurrent = NULL; VARIANT varElement; hr = CCaseIgnoreList::CreateCaseIgnoreList( IID_IADsCaseIgnoreList, (void **)&pCaseIgnoreList ); BAIL_ON_FAILURE(hr); pCurrent = &(lpNdsSrcObject->NdsValue.value_6); while (pCurrent) { cElements++; pCurrent = pCurrent->Next; } aBound.lLbound = 0; aBound.cElements = cElements; aList = SafeArrayCreate( VT_VARIANT, 1, &aBound ); if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } pCurrent = &(lpNdsSrcObject->NdsValue.value_6); for ( i = 0; i < (long)cElements; i++ ) { VariantInit(&varElement); varElement.vt = VT_BSTR; hr = ADsAllocString( pCurrent->String, &varElement.bstrVal ); BAIL_ON_FAILURE(hr); hr = SafeArrayPutElement( aList, &i, &varElement); BAIL_ON_FAILURE(hr); pCurrent = pCurrent->Next; VariantClear(&varElement); } VariantInit(&VarDestObject); V_VT(&VarDestObject) = VT_ARRAY | VT_VARIANT; V_ARRAY(&VarDestObject) = aList; hr = pCaseIgnoreList->put_CaseIgnoreList(VarDestObject); BAIL_ON_FAILURE(hr); VariantClear(&VarDestObject); aList = NULL; hr = pCaseIgnoreList->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if ( aList ) { SafeArrayDestroy( aList ); } if (pCaseIgnoreList) { pCaseIgnoreList->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId7( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_BOOL; lpVarDestObject->boolVal = (lpNdsSrcObject->NdsValue.value_7.Boolean)? VARIANT_TRUE: VARIANT_FALSE; RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId8( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_I4; lpVarDestObject->lVal = lpNdsSrcObject->NdsValue.value_8.Integer; RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId9( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; VariantInit(lpVarDestObject); hr = BinaryToVariant( lpNdsSrcObject->NdsValue.value_9.Length, lpNdsSrcObject->NdsValue.value_9.OctetString, lpVarDestObject); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId10( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_BSTR; hr = ADsAllocString( lpNdsSrcObject->NdsValue.value_10.TelephoneNumber, &(lpVarDestObject->bstrVal) ); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId11( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; IADsFaxNumber * pFaxNumber= NULL; IDispatch * pDispatch = NULL; VARIANT VarDestObject; VariantInit(lpVarDestObject); hr = CFaxNumber::CreateFaxNumber( IID_IADsFaxNumber, (void **)&pFaxNumber ); BAIL_ON_FAILURE(hr); hr = pFaxNumber->put_TelephoneNumber(lpNdsSrcObject->NdsValue.value_11.TelephoneNumber); BAIL_ON_FAILURE(hr); VariantInit(&VarDestObject); hr = BinaryToVariant( lpNdsSrcObject->NdsValue.value_11.NumberOfBits, lpNdsSrcObject->NdsValue.value_11.Parameters, &VarDestObject); BAIL_ON_FAILURE(hr); hr = pFaxNumber->put_Parameters(VarDestObject); BAIL_ON_FAILURE(hr); VariantClear(&VarDestObject); hr = pFaxNumber->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pFaxNumber) { pFaxNumber->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId12( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { IADsNetAddress * pNetAddress = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; VARIANT VarDestObject; VariantInit(lpVarDestObject); hr = CNetAddress::CreateNetAddress( IID_IADsNetAddress, (void **)&pNetAddress ); BAIL_ON_FAILURE(hr); hr = pNetAddress->put_AddressType(lpNdsSrcObject->NdsValue.value_12.AddressType); BAIL_ON_FAILURE(hr); VariantInit(&VarDestObject); hr = BinaryToVariant( lpNdsSrcObject->NdsValue.value_12.AddressLength, lpNdsSrcObject->NdsValue.value_12.Address, &VarDestObject); BAIL_ON_FAILURE(hr); hr = pNetAddress->put_Address(VarDestObject); BAIL_ON_FAILURE(hr); VariantClear(&VarDestObject); hr = pNetAddress->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pNetAddress) { pNetAddress->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId13( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound; CHAR HUGEP *pArray = NULL; long i; struct _NDS_OCTET_LIST *pCurrent = NULL; DWORD cElements = 0; IADsOctetList* pOctetList = NULL; IDispatch * pDispatch = NULL; VARIANT VarDestObject; VARIANT VarElement; hr = COctetList::CreateOctetList( IID_IADsOctetList, (void **)&pOctetList ); BAIL_ON_FAILURE(hr); pCurrent = &(lpNdsSrcObject->NdsValue.value_13); while (pCurrent) { cElements++; pCurrent = pCurrent->Next; } aBound.lLbound = 0; aBound.cElements = cElements; aList = SafeArrayCreate( VT_VARIANT, 1, &aBound ); if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } pCurrent = &(lpNdsSrcObject->NdsValue.value_13); for ( i = 0; i < (long)cElements; i++ ) { VariantInit(&VarElement); hr = BinaryToVariant( pCurrent->Length, pCurrent->Data, &VarElement); BAIL_ON_FAILURE(hr); hr = SafeArrayPutElement( aList, &i, &VarElement); BAIL_ON_FAILURE(hr); pCurrent = pCurrent->Next; } VariantInit(&VarDestObject); V_VT(&VarDestObject) = VT_ARRAY | VT_BSTR; V_ARRAY(&VarDestObject) = aList; hr = pOctetList->put_OctetList(VarDestObject); BAIL_ON_FAILURE(hr); VariantClear(&VarDestObject); aList = NULL; hr = pOctetList->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if ( aList ) { SafeArrayDestroy( aList ); } if (pOctetList) { pOctetList->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId14( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; IADsEmail * pEmail= NULL; IDispatch * pDispatch = NULL; VARIANT VarDestObject; VariantInit(lpVarDestObject); hr = CEmail::CreateEmail( IID_IADsEmail, (void **)&pEmail ); BAIL_ON_FAILURE(hr); hr = pEmail->put_Address(lpNdsSrcObject->NdsValue.value_14.Address); BAIL_ON_FAILURE(hr); hr = pEmail->put_Type(lpNdsSrcObject->NdsValue.value_14.Type); BAIL_ON_FAILURE(hr); hr = pEmail->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pEmail) { pEmail->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId15( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { IADsPath * pPath = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; VariantInit(lpVarDestObject); hr = CPath::CreatePath( IID_IADsPath, (void **)&pPath ); BAIL_ON_FAILURE(hr); hr = pPath->put_Type(lpNdsSrcObject->NdsValue.value_15.Type); BAIL_ON_FAILURE(hr); hr = pPath->put_VolumeName(lpNdsSrcObject->NdsValue.value_15.VolumeName); BAIL_ON_FAILURE(hr); hr = pPath->put_Path(lpNdsSrcObject->NdsValue.value_15.Path); BAIL_ON_FAILURE(hr); hr = pPath->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pPath) { pPath->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId16( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { IADsReplicaPointer * pReplicaPointer = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; LPWSTR ServerName = NULL; DWORD ReplicaType = 0; DWORD ReplicaNumber = 0; DWORD Count = 0; NDSOBJECT object; VARIANT varDestObject; VariantInit(lpVarDestObject); hr = CReplicaPointer::CreateReplicaPointer( IID_IADsReplicaPointer, (void **)&pReplicaPointer ); BAIL_ON_FAILURE(hr); hr = pReplicaPointer->put_ServerName(lpNdsSrcObject->NdsValue.value_16.ServerName); BAIL_ON_FAILURE(hr); hr = pReplicaPointer->put_ReplicaType(lpNdsSrcObject->NdsValue.value_16.ReplicaType); BAIL_ON_FAILURE(hr); hr = pReplicaPointer->put_ReplicaNumber(lpNdsSrcObject->NdsValue.value_16.ReplicaNumber); BAIL_ON_FAILURE(hr); if (lpNdsSrcObject->NdsValue.value_16.Count > 0) { // // We only support the retrieval of 1 ReplicaAddressHints in the // ReplicaPointer. Supporting more than 1 requires the support // of marshalling an array variant which is more complex. // Judging that there is no real usage of this interface since // the Replica Pointer is for NDS internal use only. We have // decided that we'll postpone this to post W2K and will fix it // only if there is a need. // hr = pReplicaPointer->put_Count(1); BAIL_ON_FAILURE(hr); VariantInit(&varDestObject); memcpy(&object.NdsValue.value_12, lpNdsSrcObject->NdsValue.value_16.ReplicaAddressHints, sizeof(NDS_ASN1_TYPE_12)); hr = NdsTypeToVarTypeCopyNDSSynId12( &object, &varDestObject ); BAIL_ON_FAILURE(hr); hr = pReplicaPointer->put_ReplicaAddressHints(varDestObject); BAIL_ON_FAILURE(hr); VariantClear(&varDestObject); } hr = pReplicaPointer->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pReplicaPointer) { pReplicaPointer->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId17( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { IADsAcl * pSecDes = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; hr = CAcl::CreateSecurityDescriptor( IID_IADsAcl, (void **)&pSecDes ); BAIL_ON_FAILURE(hr); hr = pSecDes->put_SubjectName(lpNdsSrcObject->NdsValue.value_17.SubjectName); BAIL_ON_FAILURE(hr); hr = pSecDes->put_ProtectedAttrName(lpNdsSrcObject->NdsValue.value_17.ProtectedAttrName); BAIL_ON_FAILURE(hr); hr = pSecDes->put_Privileges(lpNdsSrcObject->NdsValue.value_17.Privileges); BAIL_ON_FAILURE(hr); hr = pSecDes->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pSecDes) { pSecDes->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId18( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound; CHAR HUGEP *pArray = NULL; long i; BSTR bstrAddress; IADsPostalAddress* pPostalAddress = NULL; IDispatch * pDispatch = NULL; VARIANT VarDestObject; VARIANT varElement; VariantInit(&VarDestObject); hr = CPostalAddress::CreatePostalAddress( IID_IADsPostalAddress, (void **)&pPostalAddress ); BAIL_ON_FAILURE(hr); aBound.lLbound = 0; aBound.cElements = 6; aList = SafeArrayCreate( VT_VARIANT, 1, &aBound ); if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } for ( i = 0; i < (long) 6; i++ ) { VariantInit(&varElement); varElement.vt = VT_BSTR; hr = ADsAllocString( lpNdsSrcObject->NdsValue.value_18.PostalAddress[i], &varElement.bstrVal ); BAIL_ON_FAILURE(hr); hr = SafeArrayPutElement( aList, &i, &varElement); BAIL_ON_FAILURE(hr); VariantClear(&varElement); } V_VT(&VarDestObject) = VT_ARRAY | VT_VARIANT; V_ARRAY(&VarDestObject) = aList; hr = pPostalAddress->put_PostalAddress(VarDestObject); BAIL_ON_FAILURE(hr); hr = pPostalAddress->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (aList) SafeArrayDestroy(aList); if (pPostalAddress) { pPostalAddress->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId19( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { IADsTimestamp * pTime = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; hr = CTimestamp::CreateTimestamp( IID_IADsTimestamp, (void **)&pTime ); BAIL_ON_FAILURE(hr); hr = pTime->put_WholeSeconds(lpNdsSrcObject->NdsValue.value_19.WholeSeconds); BAIL_ON_FAILURE(hr); hr = pTime->put_EventID(lpNdsSrcObject->NdsValue.value_19.EventID); BAIL_ON_FAILURE(hr); hr = pTime->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pTime) { pTime->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId20( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_BSTR; hr = ADsAllocString( lpNdsSrcObject->NdsValue.value_20.ClassName, &(lpVarDestObject->bstrVal) ); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId21( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; VariantInit(lpVarDestObject); hr = BinaryToVariant( lpNdsSrcObject->NdsValue.value_21.Length, lpNdsSrcObject->NdsValue.value_21.Data, lpVarDestObject); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId22( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_I4; lpVarDestObject->lVal = lpNdsSrcObject->NdsValue.value_22.Counter; RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId23( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { IADsBackLink * pBackLink = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; hr = CBackLink::CreateBackLink( IID_IADsBackLink, (void **)&pBackLink ); BAIL_ON_FAILURE(hr); hr = pBackLink->put_ObjectName(lpNdsSrcObject->NdsValue.value_23.ObjectName); BAIL_ON_FAILURE(hr); hr = pBackLink->put_RemoteID(lpNdsSrcObject->NdsValue.value_23.RemoteID); BAIL_ON_FAILURE(hr); hr = pBackLink->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pBackLink) { pBackLink->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId24( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_DATE; hr = ConvertDWORDtoDATE( lpNdsSrcObject->NdsValue.value_24.Time, &(lpVarDestObject->date), TRUE ); RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId25( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { IADsTypedName * pTypedName = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; hr = CTypedName::CreateTypedName( IID_IADsTypedName, (void **)&pTypedName ); BAIL_ON_FAILURE(hr); hr = pTypedName->put_ObjectName(lpNdsSrcObject->NdsValue.value_25.ObjectName); BAIL_ON_FAILURE(hr); hr = pTypedName->put_Level(lpNdsSrcObject->NdsValue.value_25.Level); BAIL_ON_FAILURE(hr); hr = pTypedName->put_Interval(lpNdsSrcObject->NdsValue.value_25.Interval); BAIL_ON_FAILURE(hr); hr = pTypedName->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pTypedName) { pTypedName->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId26( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { IADsHold * pHold = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; hr = CHold::CreateHold( IID_IADsHold, (void **)&pHold ); BAIL_ON_FAILURE(hr); hr = pHold->put_ObjectName(lpNdsSrcObject->NdsValue.value_26.ObjectName); BAIL_ON_FAILURE(hr); hr = pHold->put_Amount(lpNdsSrcObject->NdsValue.value_26.Amount); BAIL_ON_FAILURE(hr); hr = pHold->QueryInterface(IID_IDispatch, (void**)&pDispatch); BAIL_ON_FAILURE(hr); VariantInit(lpVarDestObject); V_VT(lpVarDestObject) = VT_DISPATCH; V_DISPATCH(lpVarDestObject) = pDispatch; error: if (pHold) { pHold->Release(); } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyNDSSynId27( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; lpVarDestObject->vt = VT_I4; lpVarDestObject->lVal = lpNdsSrcObject->NdsValue.value_27.Interval; RRETURN(hr); } HRESULT NdsTypeToVarTypeCopy( PNDSOBJECT lpNdsSrcObject, PVARIANT lpVarDestObject ) { HRESULT hr = S_OK; switch (lpNdsSrcObject->NdsType) { case 1: hr = NdsTypeToVarTypeCopyNDSSynId1( lpNdsSrcObject, lpVarDestObject ); break; case 2: hr = NdsTypeToVarTypeCopyNDSSynId2( lpNdsSrcObject, lpVarDestObject ); break; case 3: hr = NdsTypeToVarTypeCopyNDSSynId3( lpNdsSrcObject, lpVarDestObject ); break; case 4: hr = NdsTypeToVarTypeCopyNDSSynId4( lpNdsSrcObject, lpVarDestObject ); break; case 5: hr = NdsTypeToVarTypeCopyNDSSynId5( lpNdsSrcObject, lpVarDestObject ); break; case 6: hr = NdsTypeToVarTypeCopyNDSSynId6( lpNdsSrcObject, lpVarDestObject ); break; case 7: hr = NdsTypeToVarTypeCopyNDSSynId7( lpNdsSrcObject, lpVarDestObject ); break; case 8: hr = NdsTypeToVarTypeCopyNDSSynId8( lpNdsSrcObject, lpVarDestObject ); break; case 9: hr = NdsTypeToVarTypeCopyNDSSynId9( lpNdsSrcObject, lpVarDestObject ); break; case 10: hr = NdsTypeToVarTypeCopyNDSSynId10( lpNdsSrcObject, lpVarDestObject ); break; case 11: hr = NdsTypeToVarTypeCopyNDSSynId11( lpNdsSrcObject, lpVarDestObject ); break; case 12: hr = NdsTypeToVarTypeCopyNDSSynId12( lpNdsSrcObject, lpVarDestObject ); break; case 13: hr = NdsTypeToVarTypeCopyNDSSynId13( lpNdsSrcObject, lpVarDestObject ); break; case 14: hr = NdsTypeToVarTypeCopyNDSSynId14( lpNdsSrcObject, lpVarDestObject ); break; case 15: hr = NdsTypeToVarTypeCopyNDSSynId15( lpNdsSrcObject, lpVarDestObject ); break; case 16: hr = NdsTypeToVarTypeCopyNDSSynId16( lpNdsSrcObject, lpVarDestObject ); break; case 17: hr = NdsTypeToVarTypeCopyNDSSynId17( lpNdsSrcObject, lpVarDestObject ); break; case 18: hr = NdsTypeToVarTypeCopyNDSSynId18( lpNdsSrcObject, lpVarDestObject ); break; case 19: hr = NdsTypeToVarTypeCopyNDSSynId19( lpNdsSrcObject, lpVarDestObject ); break; case 20: hr = NdsTypeToVarTypeCopyNDSSynId20( lpNdsSrcObject, lpVarDestObject ); break; case 21: hr = NdsTypeToVarTypeCopyNDSSynId21( lpNdsSrcObject, lpVarDestObject ); break; case 22: hr = NdsTypeToVarTypeCopyNDSSynId22( lpNdsSrcObject, lpVarDestObject ); break; case 23: hr = NdsTypeToVarTypeCopyNDSSynId23( lpNdsSrcObject, lpVarDestObject ); break; case 24: hr = NdsTypeToVarTypeCopyNDSSynId24( lpNdsSrcObject, lpVarDestObject ); break; case 25: hr = NdsTypeToVarTypeCopyNDSSynId25( lpNdsSrcObject, lpVarDestObject ); break; case 26: hr = NdsTypeToVarTypeCopyNDSSynId26( lpNdsSrcObject, lpVarDestObject ); break; case 27: hr = NdsTypeToVarTypeCopyNDSSynId27( lpNdsSrcObject, lpVarDestObject ); break; default: hr = E_FAIL; break; } RRETURN(hr); } HRESULT NdsTypeToVarTypeCopyConstruct( LPNDSOBJECT pNdsSrcObjects, DWORD dwNumObjects, PVARIANT pVarDestObjects, BOOLEAN bReturnArrayAlways ) { long i = 0; HRESULT hr = S_OK; VARIANT VarDestObjectsTemp; SAFEARRAY *aList = NULL; SAFEARRAY *aListTmp = NULL; if ((pNdsSrcObjects->NdsType == 17) || (dwNumObjects > 1) || bReturnArrayAlways) { VariantInit(pVarDestObjects); // // The following are for handling are multi-value properties // 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 = NdsTypeToVarTypeCopy( pNdsSrcObjects + 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; // // If it is an NDS ACL, we will convert it into an // NT Security Descriptor // if (pNdsSrcObjects->NdsType == 17) { hr = ConvertNDSAclVArrayToSecDesVar(pVarDestObjects, &VarDestObjectsTemp); SafeArrayDestroy( aList ); aList = NULL; if (!bReturnArrayAlways) { V_VT(pVarDestObjects) = V_VT(&VarDestObjectsTemp); V_DISPATCH(pVarDestObjects) = V_DISPATCH(&VarDestObjectsTemp); } else { // // Pack SecDescriptor into a one-element array // SAFEARRAYBOUND aBoundTmp; long j = 0; aBoundTmp.lLbound = 0; aBoundTmp.cElements = 1; aListTmp = SafeArrayCreate( VT_VARIANT, 1, &aBoundTmp); if ( aListTmp == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } hr = SafeArrayPutElement( aListTmp, &j, &VarDestObjectsTemp); BAIL_ON_FAILURE(hr); V_VT(pVarDestObjects) = VT_ARRAY | VT_VARIANT; V_ARRAY(pVarDestObjects) = aListTmp; } } } else { hr = NdsTypeToVarTypeCopy( pNdsSrcObjects, pVarDestObjects ); } BAIL_ON_FAILURE(hr); RRETURN(hr); error: if ( aList ) { SafeArrayDestroy( aList ); } if ( aListTmp ) { SafeArrayDestroy( aListTmp ); } RRETURN(hr); }