windows-nt/Source/XPSP1/NT/ds/adsi/nds/nds2var.cxx
2020-09-26 16:20:57 +08:00

1354 lines
30 KiB
C++

//+---------------------------------------------------------------------------
//
// 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);
}