//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: var2nds.cxx // // Contents: NDS Object to Variant Copy Routines // // Functions: // // History: 25-Apr-96 KrishnaG Created. // // // // // 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 // HRESULT VarTypeToNdsTypeCopyNDSSynId1( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_BSTR){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_1; lpNdsDestObject->NdsValue.value_1.DNString = AllocADsStr( lpVarSrcObject->bstrVal ); if ((!lpNdsDestObject->NdsValue.value_1.DNString) && (lpVarSrcObject->bstrVal)) { RRETURN(E_OUTOFMEMORY); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId2( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_BSTR){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_2; lpNdsDestObject->NdsValue.value_2.CaseExactString = AllocADsStr( lpVarSrcObject->bstrVal ); if ((!lpNdsDestObject->NdsValue.value_2.CaseExactString) && (lpVarSrcObject->bstrVal)) { RRETURN(E_OUTOFMEMORY); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId3( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_BSTR){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_3; lpNdsDestObject->NdsValue.value_3.CaseIgnoreString = AllocADsStr( lpVarSrcObject->bstrVal ); if ((!lpNdsDestObject->NdsValue.value_3.CaseIgnoreString) && (lpVarSrcObject->bstrVal)) { RRETURN(E_OUTOFMEMORY); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId4( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_BSTR){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_4; lpNdsDestObject->NdsValue.value_4.PrintableString = AllocADsStr( lpVarSrcObject->bstrVal ); if ((!lpNdsDestObject->NdsValue.value_4.PrintableString) && (lpVarSrcObject->bstrVal)) { RRETURN(E_OUTOFMEMORY); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId5( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_BSTR){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_5; lpNdsDestObject->NdsValue.value_5.NumericString = AllocADsStr( lpVarSrcObject->bstrVal ); if ((!lpNdsDestObject->NdsValue.value_5.NumericString) && (lpVarSrcObject->bstrVal)) { RRETURN(E_OUTOFMEMORY); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId6( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; DWORD dwSLBound = 0; DWORD dwSUBound = 0; long i; LPNDS_ASN1_TYPE_6 pCurrent = NULL; IADsCaseIgnoreList FAR * pCaseIgnoreList = NULL; IDispatch FAR * pDispatch = NULL; BYTE* pbParameter = NULL; VARIANT varCaseIgnoreList; VARIANT varElement; VariantInit(&varCaseIgnoreList); if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsCaseIgnoreList, (void **)&pCaseIgnoreList ); BAIL_ON_FAILURE(hr); hr = pCaseIgnoreList->get_CaseIgnoreList( &varCaseIgnoreList ); BAIL_ON_FAILURE(hr); if(!((V_VT(&varCaseIgnoreList) & VT_VARIANT) && V_ISARRAY(&varCaseIgnoreList))) { return(E_FAIL); } if ((V_ARRAY(&varCaseIgnoreList))->cDims != 1) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } if ((V_ARRAY(&varCaseIgnoreList))->rgsabound[0].cElements <= 0) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } hr = SafeArrayGetLBound(V_ARRAY(&varCaseIgnoreList), 1, (long FAR *)&dwSLBound ); BAIL_ON_FAILURE(hr); hr = SafeArrayGetUBound(V_ARRAY(&varCaseIgnoreList), 1, (long FAR *)&dwSUBound ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_6; pCurrent = &lpNdsDestObject->NdsValue.value_6; for (i = dwSLBound; i <= (long)dwSUBound; i++) { VariantInit(&varElement); hr = SafeArrayGetElement(V_ARRAY(&varCaseIgnoreList), (long FAR *)&i, &varElement ); BAIL_ON_FAILURE(hr); pCurrent->String = AllocADsStr(V_BSTR(&varElement)); if ((!pCurrent->String) && (V_BSTR(&varElement))) { RRETURN(E_OUTOFMEMORY); } if (i != (long)dwSUBound) { pCurrent->Next = (LPNDS_ASN1_TYPE_6)AllocADsMem(sizeof(NDS_ASN1_TYPE_6)); if (!pCurrent->Next) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } pCurrent = pCurrent->Next; } VariantClear(&varElement); } pCurrent->Next = NULL; RRETURN(S_OK); error: VariantClear(&varCaseIgnoreList); if (pCaseIgnoreList) { pCaseIgnoreList->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId7( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_BOOL){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_7; lpNdsDestObject->NdsValue.value_7.Boolean = (lpVarSrcObject->boolVal)? TRUE:FALSE; RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId8( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; lpNdsDestObject->NdsType = NDS_SYNTAX_ID_8; if (lpVarSrcObject->vt == VT_I4) lpNdsDestObject->NdsValue.value_8.Integer = lpVarSrcObject->lVal; else if (lpVarSrcObject->vt == VT_I2) lpNdsDestObject->NdsValue.value_8.Integer = lpVarSrcObject->iVal; else hr = E_ADS_CANT_CONVERT_DATATYPE; RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId9( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr; lpNdsDestObject->NdsType = NDS_SYNTAX_ID_9; hr = VariantToBinary( lpVarSrcObject, &lpNdsDestObject->NdsValue.value_9.Length, &lpNdsDestObject->NdsValue.value_9.OctetString ); RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId10( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_BSTR){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_10; lpNdsDestObject->NdsValue.value_10.TelephoneNumber = AllocADsStr( lpVarSrcObject->bstrVal ); if ((!lpNdsDestObject->NdsValue.value_10.TelephoneNumber) && (lpVarSrcObject->bstrVal)) { RRETURN(E_OUTOFMEMORY); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId11( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsFaxNumber FAR * pFaxNumber = NULL; IDispatch FAR * pDispatch = NULL; BYTE* pbParameter = NULL; VARIANT varParameters; BSTR bstrVal; VariantInit(&varParameters); if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsFaxNumber, (void **)&pFaxNumber ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_11; hr = pFaxNumber->get_TelephoneNumber( &bstrVal ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_11.TelephoneNumber = AllocADsStr( bstrVal ); if ((!lpNdsDestObject->NdsValue.value_11.TelephoneNumber) && (bstrVal)) { RRETURN(E_OUTOFMEMORY); } hr = pFaxNumber->get_Parameters( &varParameters ); BAIL_ON_FAILURE(hr); hr = VariantToBinary( &varParameters, &lpNdsDestObject->NdsValue.value_11.NumberOfBits, &lpNdsDestObject->NdsValue.value_11.Parameters ); BAIL_ON_FAILURE(hr); error: VariantClear(&varParameters); if (pFaxNumber) { pFaxNumber->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId12( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsNetAddress FAR * pNetAddress = NULL; IDispatch FAR * pDispatch = NULL; long dwAddressType = 0; BYTE* pbAddress = NULL; VARIANT varAddress; VariantInit(&varAddress); if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsNetAddress, (void **)&pNetAddress ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_12; hr = pNetAddress->get_AddressType( &dwAddressType ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_12.AddressType = dwAddressType; VariantInit(&varAddress); hr = pNetAddress->get_Address( &varAddress ); BAIL_ON_FAILURE(hr); hr = VariantToBinary( &varAddress, &lpNdsDestObject->NdsValue.value_12.AddressLength, &lpNdsDestObject->NdsValue.value_12.Address ); BAIL_ON_FAILURE(hr); error: VariantClear(&varAddress); if (pNetAddress) { pNetAddress->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId13( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; DWORD dwSLBound = 0; DWORD dwSUBound = 0; long i; LPNDS_ASN1_TYPE_13 pCurrent = NULL; IADsOctetList FAR * pOctetList= NULL; IDispatch FAR * pDispatch = NULL; BYTE* pbParameter = NULL; VARIANT varOctetList; VARIANT varElement; VariantInit(&varOctetList); if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsOctetList, (void **)&pOctetList ); BAIL_ON_FAILURE(hr); hr = pOctetList->get_OctetList(&varOctetList); BAIL_ON_FAILURE(hr); if(!((V_VT(&varOctetList) & VT_VARIANT) && V_ISARRAY(&varOctetList))) { return(E_FAIL); } if ((V_ARRAY(&varOctetList))->cDims != 1) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } if ((V_ARRAY(&varOctetList))->rgsabound[0].cElements <= 0) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } hr = SafeArrayGetLBound(V_ARRAY(&varOctetList), 1, (long FAR *)&dwSLBound ); BAIL_ON_FAILURE(hr); hr = SafeArrayGetUBound(V_ARRAY(&varOctetList), 1, (long FAR *)&dwSUBound ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_13; pCurrent = &lpNdsDestObject->NdsValue.value_13; for (i = dwSLBound; i <= (long)dwSUBound; i++) { VariantInit(&varElement); hr = SafeArrayGetElement(V_ARRAY(&varOctetList), (long FAR *)&i, &varElement ); BAIL_ON_FAILURE(hr); hr = VariantToBinary( &varElement, &pCurrent->Length, &pCurrent->Data ); BAIL_ON_FAILURE(hr); if (i != (long)dwSUBound) { pCurrent->Next = (LPNDS_ASN1_TYPE_13)AllocADsMem(sizeof(NDS_ASN1_TYPE_13)); if (!pCurrent->Next) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } pCurrent = pCurrent->Next; } VariantClear(&varElement); } pCurrent->Next = NULL; error: VariantClear(&varOctetList); if (pOctetList) { pOctetList->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId14( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsEmail FAR * pEmail = NULL; IDispatch FAR * pDispatch = NULL; long dwAddressType = 0; BSTR bstrAddress; if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsEmail, (void **)&pEmail ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_14; hr = pEmail->get_Type( &dwAddressType ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_14.Type = dwAddressType; hr = pEmail->get_Address( &bstrAddress ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_14.Address= AllocADsStr( bstrAddress ); if ((!lpNdsDestObject->NdsValue.value_14.Address) && (bstrAddress)) { RRETURN(E_OUTOFMEMORY); } error: if (pEmail) { pEmail->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId15( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsPath FAR * pPath = NULL; IDispatch FAR * pDispatch = NULL; DWORD dwType = 0; BSTR bstrVolumeName = NULL; BSTR bstrPath = NULL; if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsPath, (void **)&pPath ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_15; hr = pPath->get_VolumeName( &bstrVolumeName ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_15.VolumeName= AllocADsStr(bstrVolumeName); if ((!lpNdsDestObject->NdsValue.value_15.VolumeName) && (bstrVolumeName)) { RRETURN(E_OUTOFMEMORY); } hr = pPath->get_Path( &bstrPath ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_15.Path= AllocADsStr(bstrPath); if ((!lpNdsDestObject->NdsValue.value_15.Path) && (bstrPath)) { RRETURN(E_OUTOFMEMORY); } hr = pPath->get_Type((LONG *)&dwType); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_15.Type = dwType; error: if (pPath) { pPath->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId16( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsReplicaPointer FAR * pReplicaPointer = NULL; IDispatch FAR * pDispatch = NULL; DWORD dwReplicaType = 0; DWORD dwReplicaNumber = 0; DWORD dwCount = 0; BSTR bstrServerName = NULL; NDSOBJECT object; VARIANT varAddress; VariantInit(&varAddress); if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsReplicaPointer, (void **)&pReplicaPointer ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_16; hr = pReplicaPointer->get_ServerName( &bstrServerName ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_16.ServerName= AllocADsStr(bstrServerName); if ((!lpNdsDestObject->NdsValue.value_16.ServerName) && (bstrServerName)) { RRETURN(E_OUTOFMEMORY); } hr = pReplicaPointer->get_ReplicaType((LONG *)&dwReplicaType); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_16.ReplicaType= dwReplicaType; hr = pReplicaPointer->get_ReplicaNumber((LONG *)&dwReplicaNumber); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_16.ReplicaNumber= dwReplicaNumber; hr = pReplicaPointer->get_Count((LONG *)&dwCount); BAIL_ON_FAILURE(hr); if (dwCount == 0) { lpNdsDestObject->NdsValue.value_16.Count = 0; lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints = NULL; } else { // // We only support the setting 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. // lpNdsDestObject->NdsValue.value_16.Count = 1; hr = pReplicaPointer->get_ReplicaAddressHints(&varAddress); BAIL_ON_FAILURE(hr); hr = VarTypeToNdsTypeCopyNDSSynId12( &varAddress, &object ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints = (LPNDS_ASN1_TYPE_12)AllocADsMem(sizeof(NDS_ASN1_TYPE_12)); if (lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints == NULL) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } memcpy(lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints, &object.NdsValue.value_12, sizeof(NDS_ASN1_TYPE_12)); } error: VariantClear(&varAddress); if (pReplicaPointer) { pReplicaPointer->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId17( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsAcl FAR * pSecDes = NULL; IDispatch FAR * pDispatch = NULL; DWORD dwPrivileges = 0; BSTR bstrProtectedAttrName = NULL; BSTR bstrSubjectName = NULL; if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsAcl, (void **)&pSecDes ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_17; hr = pSecDes->get_ProtectedAttrName( &bstrProtectedAttrName ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_17.ProtectedAttrName = AllocADsStr(bstrProtectedAttrName); if ((!lpNdsDestObject->NdsValue.value_17.ProtectedAttrName) && (bstrProtectedAttrName)) { RRETURN(E_OUTOFMEMORY); } hr = pSecDes->get_SubjectName( &bstrSubjectName ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_17.SubjectName= AllocADsStr(bstrSubjectName); if ((!lpNdsDestObject->NdsValue.value_17.SubjectName) && (bstrSubjectName)) { RRETURN(E_OUTOFMEMORY); } hr = pSecDes->get_Privileges((LONG *)&dwPrivileges); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_17.Privileges= dwPrivileges; error: if (pSecDes) { pSecDes->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId18( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; DWORD dwSLBound = 0; DWORD dwSUBound = 0; long i; IADsPostalAddress FAR * pPostalAddress = NULL; IDispatch FAR * pDispatch = NULL; VARIANT varPostalAddress; VARIANT varElement; BSTR bstrElement; VariantInit(&varPostalAddress); if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsPostalAddress, (void **)&pPostalAddress ); BAIL_ON_FAILURE(hr); hr = pPostalAddress->get_PostalAddress( &varPostalAddress ); BAIL_ON_FAILURE(hr); if(!((V_VT(&varPostalAddress) & VT_VARIANT) && V_ISARRAY(&varPostalAddress))) { return(E_FAIL); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_18; if ((V_ARRAY(&varPostalAddress))->cDims != 1) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } if ( ((V_ARRAY(&varPostalAddress))->rgsabound[0].cElements <= 0) || ((V_ARRAY(&varPostalAddress))->rgsabound[0].cElements >6) ) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } hr = SafeArrayGetLBound(V_ARRAY(&varPostalAddress), 1, (long FAR *)&dwSLBound ); BAIL_ON_FAILURE(hr); hr = SafeArrayGetUBound(V_ARRAY(&varPostalAddress), 1, (long FAR *)&dwSUBound ); BAIL_ON_FAILURE(hr); for (i = dwSLBound; i <= (long)dwSUBound; i++) { VariantInit(&varElement); hr = SafeArrayGetElement(V_ARRAY(&varPostalAddress), (long FAR *)&i, &varElement ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_18.PostalAddress[i-dwSLBound] = AllocADsStr(V_BSTR(&varElement)); if ((!lpNdsDestObject->NdsValue.value_18.PostalAddress[i-dwSLBound]) && (V_BSTR(&varElement))) { RRETURN(E_OUTOFMEMORY); } VariantClear(&varElement); } error: VariantClear(&varPostalAddress); if (pPostalAddress) { pPostalAddress->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId19( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsTimestamp FAR * pTime = NULL; IDispatch FAR * pDispatch = NULL; long dwEventID = 0; long dwWholeSeconds = 0; if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsTimestamp, (void **)&pTime ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_19; hr = pTime->get_WholeSeconds( &dwWholeSeconds ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_19.WholeSeconds= dwWholeSeconds; BAIL_ON_FAILURE(hr); hr = pTime->get_EventID( &dwEventID ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_19.EventID = dwEventID; BAIL_ON_FAILURE(hr); error: if (pTime) { pTime->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId20( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_BSTR){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_20; lpNdsDestObject->NdsValue.value_20.ClassName = AllocADsStr( lpVarSrcObject->bstrVal ); if ((!lpNdsDestObject->NdsValue.value_20.ClassName) && (lpVarSrcObject->bstrVal)) { RRETURN(E_OUTOFMEMORY); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId21( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr; lpNdsDestObject->NdsType = NDS_SYNTAX_ID_21; hr = VariantToBinary( lpVarSrcObject, &lpNdsDestObject->NdsValue.value_21.Length, &lpNdsDestObject->NdsValue.value_21.Data ); RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId22( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_I4){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_22; lpNdsDestObject->NdsValue.value_22.Counter = lpVarSrcObject->lVal; RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId23( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsBackLink FAR * pBackLink = NULL; IDispatch FAR * pDispatch = NULL; long dwRemoteID = 0; BSTR bstrObjectName = NULL; if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsBackLink, (void **)&pBackLink ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_23; hr = pBackLink->get_ObjectName( &bstrObjectName ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_23.ObjectName= AllocADsStr(bstrObjectName); if ((!lpNdsDestObject->NdsValue.value_23.ObjectName) && (bstrObjectName)) { RRETURN(E_OUTOFMEMORY); } hr = pBackLink->get_RemoteID((LONG *)&dwRemoteID); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_23.RemoteID = dwRemoteID; error: if (pBackLink) { pBackLink->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId24( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_DATE){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_24; hr = ConvertDATEtoDWORD( lpVarSrcObject->date, &(lpNdsDestObject->NdsValue.value_24.Time), TRUE ); RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId25( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsTypedName FAR * pTypedName = NULL; IDispatch FAR * pDispatch = NULL; DWORD dwLevel = 0; DWORD dwInterval = 0; BSTR bstrObjectName = NULL; if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsTypedName, (void **)&pTypedName ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_25; hr = pTypedName->get_ObjectName( &bstrObjectName ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_25.ObjectName= AllocADsStr(bstrObjectName); if ((!lpNdsDestObject->NdsValue.value_25.ObjectName) && (bstrObjectName)) { RRETURN(E_OUTOFMEMORY); } hr = pTypedName->get_Level((LONG *)&dwLevel); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_25.Level = dwLevel; hr = pTypedName->get_Interval((LONG *)&dwInterval); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_25.Interval= dwInterval; error: if (pTypedName) { pTypedName->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId26( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; IADsHold FAR * pHold = NULL; IDispatch FAR * pDispatch = NULL; DWORD dwAmount = 0; BSTR bstrObjectName = NULL; if (V_VT(lpVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(lpVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsHold, (void **)&pHold ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsType = NDS_SYNTAX_ID_26; hr = pHold->get_ObjectName( &bstrObjectName ); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_26.ObjectName= AllocADsStr(bstrObjectName); if ((!lpNdsDestObject->NdsValue.value_26.ObjectName) && (bstrObjectName)) { RRETURN(E_OUTOFMEMORY); } hr = pHold->get_Amount((LONG *)&dwAmount); BAIL_ON_FAILURE(hr); lpNdsDestObject->NdsValue.value_26.Amount = dwAmount; error: if (pHold) { pHold->Release(); } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyNDSSynId27( PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; if(lpVarSrcObject->vt != VT_I4){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } lpNdsDestObject->NdsType = NDS_SYNTAX_ID_27; lpNdsDestObject->NdsValue.value_27.Interval = lpVarSrcObject->lVal; RRETURN(hr); } HRESULT VarTypeToNdsTypeCopy( DWORD dwNdsType, PVARIANT lpVarSrcObject, PNDSOBJECT lpNdsDestObject ) { HRESULT hr = S_OK; switch (dwNdsType){ case 1: hr = VarTypeToNdsTypeCopyNDSSynId1( lpVarSrcObject, lpNdsDestObject ); break; case 2: hr = VarTypeToNdsTypeCopyNDSSynId2( lpVarSrcObject, lpNdsDestObject ); break; case 3: hr = VarTypeToNdsTypeCopyNDSSynId3( lpVarSrcObject, lpNdsDestObject ); break; case 4: hr = VarTypeToNdsTypeCopyNDSSynId4( lpVarSrcObject, lpNdsDestObject ); break; case 5: hr = VarTypeToNdsTypeCopyNDSSynId5( lpVarSrcObject, lpNdsDestObject ); break; case 6: hr = VarTypeToNdsTypeCopyNDSSynId6( lpVarSrcObject, lpNdsDestObject ); break; case 7: hr = VarTypeToNdsTypeCopyNDSSynId7( lpVarSrcObject, lpNdsDestObject ); break; case 8: hr = VarTypeToNdsTypeCopyNDSSynId8( lpVarSrcObject, lpNdsDestObject ); break; case 9: hr = VarTypeToNdsTypeCopyNDSSynId9( lpVarSrcObject, lpNdsDestObject ); break; case 10: hr = VarTypeToNdsTypeCopyNDSSynId10( lpVarSrcObject, lpNdsDestObject ); break; case 11: hr = VarTypeToNdsTypeCopyNDSSynId11( lpVarSrcObject, lpNdsDestObject ); break; case 12: hr = VarTypeToNdsTypeCopyNDSSynId12( lpVarSrcObject, lpNdsDestObject ); break; case 13: hr = VarTypeToNdsTypeCopyNDSSynId13( lpVarSrcObject, lpNdsDestObject ); break; case 14: hr = VarTypeToNdsTypeCopyNDSSynId14( lpVarSrcObject, lpNdsDestObject ); break; case 15: hr = VarTypeToNdsTypeCopyNDSSynId15( lpVarSrcObject, lpNdsDestObject ); break; case 16: hr = VarTypeToNdsTypeCopyNDSSynId16( lpVarSrcObject, lpNdsDestObject ); break; case 17: hr = VarTypeToNdsTypeCopyNDSSynId17( lpVarSrcObject, lpNdsDestObject ); break; case 18: hr = VarTypeToNdsTypeCopyNDSSynId18( lpVarSrcObject, lpNdsDestObject ); break; case 19: hr = VarTypeToNdsTypeCopyNDSSynId19( lpVarSrcObject, lpNdsDestObject ); break; case 20: hr = VarTypeToNdsTypeCopyNDSSynId20( lpVarSrcObject, lpNdsDestObject ); break; case 21: hr = VarTypeToNdsTypeCopyNDSSynId21( lpVarSrcObject, lpNdsDestObject ); break; case 22: hr = VarTypeToNdsTypeCopyNDSSynId22( lpVarSrcObject, lpNdsDestObject ); break; case 23: hr = VarTypeToNdsTypeCopyNDSSynId23( lpVarSrcObject, lpNdsDestObject ); break; case 24: hr = VarTypeToNdsTypeCopyNDSSynId24( lpVarSrcObject, lpNdsDestObject ); break; case 25: hr = VarTypeToNdsTypeCopyNDSSynId25( lpVarSrcObject, lpNdsDestObject ); break; case 26: hr = VarTypeToNdsTypeCopyNDSSynId26( lpVarSrcObject, lpNdsDestObject ); break; case 27: hr = VarTypeToNdsTypeCopyNDSSynId27( lpVarSrcObject, lpNdsDestObject ); break; default: hr = E_FAIL; break; } RRETURN(hr); } HRESULT VarTypeToNdsTypeCopyConstruct( DWORD dwNdsType, LPVARIANT pVarSrcObjects, DWORD *pdwNumObjects, LPNDSOBJECT * ppNdsDestObjects ) { DWORD i = 0; LPNDSOBJECT pNdsDestObjects = NULL; HRESULT hr = S_OK; VARIANT varNDSAcl; IDispatch * pDispatch = NULL; IADsSecurityDescriptor * pSecDes = NULL; DWORD dwNumObjects = *pdwNumObjects; // // If it is a security descriptor, do special conversion // if (dwNdsType == 17) { // // Bail out if it contains more than 1 object // if (dwNumObjects != 1) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } if (V_VT(pVarSrcObjects) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(pVarSrcObjects); hr = pDispatch->QueryInterface( IID_IADsSecurityDescriptor, (void **)&pSecDes ); BAIL_ON_FAILURE(hr); hr = ConvertSecDesToNDSAclVarArray( pSecDes, &varNDSAcl ); BAIL_ON_FAILURE(hr); hr = ConvertSafeArrayToVariantArray( varNDSAcl, &pVarSrcObjects, &dwNumObjects ); BAIL_ON_FAILURE(hr); pNdsDestObjects = (LPNDSOBJECT)AllocADsMem( dwNumObjects * sizeof(NDSOBJECT) ); if (!pNdsDestObjects) { RRETURN(E_FAIL); } *pdwNumObjects = dwNumObjects; } else { pNdsDestObjects = (LPNDSOBJECT)AllocADsMem( dwNumObjects * sizeof(NDSOBJECT) ); if (!pNdsDestObjects) { RRETURN(E_FAIL); } } for (i = 0; i < dwNumObjects; i++ ) { hr = VarTypeToNdsTypeCopy( dwNdsType, pVarSrcObjects + i, pNdsDestObjects + i ); BAIL_ON_FAILURE(hr); } *ppNdsDestObjects = pNdsDestObjects; if (pSecDes) { pSecDes->Release(); } RRETURN(S_OK); error: if (pNdsDestObjects) { NdsTypeFreeNdsObjects( pNdsDestObjects, dwNumObjects ); } if (pSecDes) { pSecDes->Release(); } *ppNdsDestObjects = NULL; RRETURN(hr); }