WindowsXP-SP1/ds/adsi/nds/var2nds.cxx
2020-09-30 16:53:49 +02:00

1625 lines
40 KiB
C++

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