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

1011 lines
25 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: ods2nds.cxx
//
// Contents: NDS Object to Variant Copy Routines
//
// Functions:
//
// History: 25-Apr-96 KrishnaG Created.
//
//
//
//----------------------------------------------------------------------------
#include "nds.hxx"
HRESULT
AdsTypeToNdsTypeCopyDNString(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_DN_STRING){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_1;
lpNdsDestObject->NdsValue.value_1.DNString =
AllocADsStr(
lpAdsSrcValue->DNString
);
if (!lpNdsDestObject->NdsValue.value_1.DNString) {
hr = E_OUTOFMEMORY;
}
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyCaseExactString(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_CASE_EXACT_STRING){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_2;
lpNdsDestObject->NdsValue.value_2.CaseExactString =
AllocADsStr(
lpAdsSrcValue->CaseExactString
);
if (!lpNdsDestObject->NdsValue.value_2.CaseExactString) {
hr = E_OUTOFMEMORY;
}
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyCaseIgnoreList(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
PADS_PROV_SPECIFIC test;
PADS_CASEIGNORE_LIST pAdsNext = lpAdsSrcValue->pCaseIgnoreList;
struct _NDS_CI_LIST *pNdsOutput = &lpNdsDestObject->NdsValue.value_6;
struct _NDS_CI_LIST *pNdsCurrent = NULL;
if(lpAdsSrcValue->dwType != ADSTYPE_CASEIGNORE_LIST){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
if (pAdsNext == NULL) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_6;
pNdsOutput->String = AllocADsStr(pAdsNext->String);
if (!pNdsOutput->String ) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
pAdsNext = pAdsNext->Next;
while (pAdsNext) {
pNdsCurrent = (struct _NDS_CI_LIST *)AllocADsMem(sizeof(struct _NDS_CI_LIST));
if (!pNdsCurrent) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
pNdsCurrent->String = AllocADsStr(pAdsNext->String);
if (!pNdsCurrent->String ) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
pNdsOutput->Next = pNdsCurrent;
pNdsOutput = pNdsOutput->Next;
pAdsNext = pAdsNext->Next;
}
pNdsOutput->Next = NULL;
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyOctetList(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
PADS_OCTET_LIST pAdsNext = lpAdsSrcValue->pOctetList;
struct _NDS_OCTET_LIST *pNdsOutput = &lpNdsDestObject->NdsValue.value_13;
struct _NDS_OCTET_LIST *pNdsCurrent = NULL;
if(lpAdsSrcValue->dwType != ADSTYPE_OCTET_LIST){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
if (pAdsNext == NULL) {
hr = E_FAIL;
RRETURN(hr);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_13;
pNdsOutput->Next = NULL;
pNdsOutput->Data = NULL;
hr = CopyOctetString(pAdsNext->Length,
pAdsNext->Data,
&pNdsOutput->Length,
&pNdsOutput->Data);
BAIL_ON_FAILURE(hr);
pAdsNext = pAdsNext->Next;
while (pAdsNext) {
pNdsCurrent = (struct _NDS_OCTET_LIST *)AllocADsMem(sizeof(struct _NDS_OCTET_LIST));
if (!pNdsCurrent) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
pNdsCurrent->Next = NULL;
pNdsCurrent->Data = NULL;
hr = CopyOctetString(pAdsNext->Length,
pAdsNext->Data,
&pNdsCurrent->Length,
&pNdsCurrent->Data);
if (FAILED(hr)) {
FreeADsMem(pNdsCurrent);
BAIL_ON_FAILURE(hr);
}
pNdsOutput->Next = pNdsCurrent;
pNdsOutput = pNdsCurrent;
pAdsNext = pAdsNext->Next;
}
pNdsOutput->Next = NULL;
RRETURN(hr);
error:
if (lpNdsDestObject->NdsValue.value_13.Data) {
FreeADsMem(lpNdsDestObject->NdsValue.value_13.Data);
}
pNdsOutput = lpNdsDestObject->NdsValue.value_13.Next;
while (pNdsOutput) {
if (pNdsOutput->Data) {
FreeADsMem(pNdsOutput->Data);
}
pNdsCurrent = pNdsOutput->Next;
FreeADsMem(pNdsOutput);
pNdsOutput = pNdsCurrent;
}
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyPath(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_PATH){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
if (lpAdsSrcValue->pPath == NULL) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_15;
lpNdsDestObject->NdsValue.value_15.VolumeName =
AllocADsStr(
lpAdsSrcValue->pPath->VolumeName
);
if (!lpNdsDestObject->NdsValue.value_15.VolumeName) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsValue.value_15.Path=
AllocADsStr(
lpAdsSrcValue->pPath->Path
);
if (!lpNdsDestObject->NdsValue.value_15.Path) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsValue.value_15.Type =
lpAdsSrcValue->pPath->Type;
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyPostalAddress(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
long i;
if(lpAdsSrcValue->dwType != ADSTYPE_POSTALADDRESS){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
if (lpAdsSrcValue->pPostalAddress == NULL) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_18;
for (i=0;i<6;i++) {
if (lpAdsSrcValue->pPostalAddress->PostalAddress[i]) {
lpNdsDestObject->NdsValue.value_18.PostalAddress[i] =
AllocADsStr(
lpAdsSrcValue->pPostalAddress->PostalAddress[i]
);
if (!lpNdsDestObject->NdsValue.value_18.PostalAddress[i]) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
}
else {
lpNdsDestObject->NdsValue.value_18.PostalAddress[i] =
AllocADsStr(
L""
);
if (!lpNdsDestObject->NdsValue.value_18.PostalAddress[i]) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
}
}
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyNdsTime(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_TIMESTAMP){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_19;
lpNdsDestObject->NdsValue.value_19.WholeSeconds =
lpAdsSrcValue->Timestamp.WholeSeconds;
lpNdsDestObject->NdsValue.value_19.EventID =
lpAdsSrcValue->Timestamp.EventID;
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyBackLink(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_BACKLINK){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_23;
lpNdsDestObject->NdsValue.value_23.ObjectName =
AllocADsStr(
lpAdsSrcValue->BackLink.ObjectName
);
if (!lpNdsDestObject->NdsValue.value_23.ObjectName) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsValue.value_23.RemoteID =
lpAdsSrcValue->BackLink.RemoteID;
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyTypedName(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_TYPEDNAME){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
if (lpAdsSrcValue->pTypedName == NULL) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_25;
lpNdsDestObject->NdsValue.value_25.ObjectName=
AllocADsStr(
lpAdsSrcValue->pTypedName->ObjectName
);
if (!lpNdsDestObject->NdsValue.value_25.ObjectName) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsValue.value_25.Level=
lpAdsSrcValue->pTypedName->Level;
lpNdsDestObject->NdsValue.value_25.Interval=
lpAdsSrcValue->pTypedName->Interval;
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyHold(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_HOLD){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_26;
lpNdsDestObject->NdsValue.value_26.ObjectName=
AllocADsStr(
lpAdsSrcValue->Hold.ObjectName
);
if (!lpNdsDestObject->NdsValue.value_26.ObjectName) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsValue.value_26.Amount=
lpAdsSrcValue->Hold.Amount;
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyEmail(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_EMAIL){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_14;
lpNdsDestObject->NdsValue.value_14.Address=
AllocADsStr(
lpAdsSrcValue->Email.Address
);
if (!lpNdsDestObject->NdsValue.value_14.Address) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsValue.value_14.Type=
lpAdsSrcValue->Email.Type;
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyNetAddress(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_NETADDRESS){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
if (lpAdsSrcValue->pNetAddress == NULL) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_12;
lpNdsDestObject->NdsValue.value_12.AddressType =
lpAdsSrcValue->pNetAddress->AddressType;
hr = CopyOctetString(lpAdsSrcValue->pNetAddress->AddressLength,
lpAdsSrcValue->pNetAddress->Address,
&lpNdsDestObject->NdsValue.value_12.AddressLength,
&lpNdsDestObject->NdsValue.value_12.Address);
BAIL_ON_FAILURE(hr);
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyFaxNumber(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_FAXNUMBER){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
if (lpAdsSrcValue->pFaxNumber == NULL) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_11;
lpNdsDestObject->NdsValue.value_11.TelephoneNumber =
AllocADsStr(lpAdsSrcValue->pFaxNumber->TelephoneNumber);
if (!lpNdsDestObject->NdsValue.value_11.TelephoneNumber) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
hr = CopyOctetString(lpAdsSrcValue->pFaxNumber->NumberOfBits,
lpAdsSrcValue->pFaxNumber->Parameters,
&lpNdsDestObject->NdsValue.value_11.NumberOfBits,
&lpNdsDestObject->NdsValue.value_11.Parameters);
BAIL_ON_FAILURE(hr);
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyReplicaPointer(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
DWORD dwCount,dwIter;
if(lpAdsSrcValue->dwType != ADSTYPE_REPLICAPOINTER){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
if (lpAdsSrcValue->pReplicaPointer == NULL) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_16;
lpNdsDestObject->NdsValue.value_16.ServerName=
AllocADsStr(
lpAdsSrcValue->pReplicaPointer->ServerName
);
if (!lpNdsDestObject->NdsValue.value_16.ServerName) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
lpNdsDestObject->NdsValue.value_16.ReplicaType =
lpAdsSrcValue->pReplicaPointer->ReplicaType;
lpNdsDestObject->NdsValue.value_16.ReplicaNumber =
lpAdsSrcValue->pReplicaPointer->ReplicaNumber;
dwCount = lpAdsSrcValue->pReplicaPointer->Count;
lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints =
(LPNDS_ASN1_TYPE_12)AllocADsMem(sizeof(NDS_ASN1_TYPE_12 )*dwCount);
if (!lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
memset(lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints, 0, sizeof(NDS_ASN1_TYPE_12 )*dwCount);
for ( dwIter = 0; dwIter < dwCount; dwIter++ ) {
(lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints+dwIter)->AddressType =
(lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints+dwIter)->AddressType;
hr = CopyOctetString((lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints+dwIter)->AddressLength,
(lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints+dwIter)->Address,
&((lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints+dwIter)->AddressLength),
&((lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints+dwIter)->Address));
}
lpNdsDestObject->NdsValue.value_16.Count = dwCount;
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyCaseIgnoreString(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_CASE_IGNORE_STRING){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = ADSTYPE_CASE_IGNORE_STRING;
lpNdsDestObject->NdsValue.value_3.CaseIgnoreString =
AllocADsStr(
lpAdsSrcValue->CaseIgnoreString
);
if (!lpNdsDestObject->NdsValue.value_3.CaseIgnoreString) {
hr = E_OUTOFMEMORY;
}
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyPrintableString(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_PRINTABLE_STRING){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_4;
lpNdsDestObject->NdsValue.value_4.PrintableString =
AllocADsStr(
lpAdsSrcValue->PrintableString
);
if (!lpNdsDestObject->NdsValue.value_4.PrintableString) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyNumericString(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_NUMERIC_STRING){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_5;
lpNdsDestObject->NdsValue.value_5.NumericString =
AllocADsStr(
lpAdsSrcValue->NumericString
);
if (!lpNdsDestObject->NdsValue.value_5.NumericString) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyBoolean(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_BOOLEAN){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_7;
lpNdsDestObject->NdsValue.value_7.Boolean =
lpAdsSrcValue->Boolean;
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyInteger(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_INTEGER){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_8;
lpNdsDestObject->NdsValue.value_8.Integer =
lpAdsSrcValue->Integer;
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyOctetString(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
LPBYTE lpByteStream = NULL;
DWORD dwNumBytes = 0;
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_OCTET_STRING){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_9;
dwNumBytes = lpAdsSrcValue->OctetString.dwLength;
lpByteStream = (LPBYTE)AllocADsMem(dwNumBytes);
if (!lpByteStream) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
memcpy(
lpByteStream,
lpAdsSrcValue->OctetString.lpValue,
dwNumBytes
);
lpNdsDestObject->NdsValue.value_9.Length = dwNumBytes;
lpNdsDestObject->NdsValue.value_9.OctetString = lpByteStream;
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyTime(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_UTC_TIME){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_24;
hr = ConvertSYSTEMTIMEtoDWORD(
&(lpAdsSrcValue->UTCTime),
&(lpNdsDestObject->NdsValue.value_24.Time)
);
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyObjectClass(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
if(lpAdsSrcValue->dwType != ADSTYPE_OBJECT_CLASS){
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
lpNdsDestObject->NdsType = NDS_SYNTAX_ID_20;
lpNdsDestObject->NdsValue.value_20.ClassName =
AllocADsStr(
lpAdsSrcValue->ClassName
);
if (!lpNdsDestObject->NdsValue.value_20.ClassName) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
error:
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopy(
PADSVALUE lpAdsSrcValue,
PNDSOBJECT lpNdsDestObject
)
{
HRESULT hr = S_OK;
switch (lpAdsSrcValue->dwType){
case ADSTYPE_DN_STRING:
hr = AdsTypeToNdsTypeCopyDNString(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_CASE_EXACT_STRING:
hr = AdsTypeToNdsTypeCopyCaseExactString(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_CASE_IGNORE_STRING:
hr = AdsTypeToNdsTypeCopyCaseIgnoreString(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_PRINTABLE_STRING:
hr = AdsTypeToNdsTypeCopyPrintableString(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_NUMERIC_STRING:
hr = AdsTypeToNdsTypeCopyNumericString(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_BOOLEAN:
hr = AdsTypeToNdsTypeCopyBoolean(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_INTEGER:
hr = AdsTypeToNdsTypeCopyInteger(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_OCTET_STRING:
hr = AdsTypeToNdsTypeCopyOctetString(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_UTC_TIME:
hr = AdsTypeToNdsTypeCopyTime(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_OBJECT_CLASS:
hr = AdsTypeToNdsTypeCopyObjectClass(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_CASEIGNORE_LIST:
hr = AdsTypeToNdsTypeCopyCaseIgnoreList(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_FAXNUMBER:
hr = AdsTypeToNdsTypeCopyFaxNumber(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_NETADDRESS:
hr = AdsTypeToNdsTypeCopyNetAddress(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_OCTET_LIST:
hr = AdsTypeToNdsTypeCopyOctetList(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_EMAIL:
hr = AdsTypeToNdsTypeCopyEmail(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_PATH:
hr = AdsTypeToNdsTypeCopyPath(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_REPLICAPOINTER:
hr = AdsTypeToNdsTypeCopyReplicaPointer(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_TIMESTAMP:
hr = AdsTypeToNdsTypeCopyNdsTime(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_POSTALADDRESS:
hr = AdsTypeToNdsTypeCopyPostalAddress(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_BACKLINK:
hr = AdsTypeToNdsTypeCopyBackLink(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_TYPEDNAME:
hr = AdsTypeToNdsTypeCopyTypedName(
lpAdsSrcValue,
lpNdsDestObject
);
break;
case ADSTYPE_HOLD:
hr = AdsTypeToNdsTypeCopyHold(
lpAdsSrcValue,
lpNdsDestObject
);
break;
default:
hr = E_FAIL;
break;
}
RRETURN(hr);
}
HRESULT
AdsTypeToNdsTypeCopyConstruct(
LPADSVALUE pAdsSrcValues,
DWORD dwNumObjects,
LPNDSOBJECT * ppNdsDestObjects,
PDWORD pdwNumNdsObjects,
PDWORD pdwNdsSyntaxId
)
{
DWORD i = 0;
LPNDSOBJECT pNdsDestObjects = NULL;
HRESULT hr = S_OK;
pNdsDestObjects = (LPNDSOBJECT)AllocADsMem(
dwNumObjects * sizeof(NDSOBJECT)
);
if (!pNdsDestObjects) {
RRETURN(E_FAIL);
}
for (i = 0; i < dwNumObjects; i++ ) {
hr = AdsTypeToNdsTypeCopy(
pAdsSrcValues + i,
pNdsDestObjects + i
);
BAIL_ON_FAILURE(hr);
}
*ppNdsDestObjects = pNdsDestObjects;
*pdwNumNdsObjects = dwNumObjects;
*pdwNdsSyntaxId = pNdsDestObjects->NdsType;
RRETURN(S_OK);
error:
if (pNdsDestObjects) {
NdsTypeFreeNdsObjects(
pNdsDestObjects,
dwNumObjects
);
}
*ppNdsDestObjects = NULL;
*pdwNumNdsObjects = 0;
RRETURN(hr);
}