1034 lines
28 KiB
C++
1034 lines
28 KiB
C++
/+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
|
//
|
|
// File: ndsmrshl.cxx
|
|
//
|
|
// Contents:
|
|
//
|
|
// Functions:
|
|
//
|
|
//
|
|
// History: 25-Apr-96 KrishnaG Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include "nds.hxx"
|
|
|
|
HRESULT
|
|
CopyNDSNetAddressToNDS12(
|
|
pNet_Address_T lpSrcNetAddress,
|
|
LPNDS_ASN1_TYPE_12 lpDest12
|
|
)
|
|
{
|
|
LPBYTE pBuffer = NULL;
|
|
|
|
lpDest12->AddressType = lpSrcNetAddress->addressType;
|
|
|
|
lpDest12->AddressLength = lpSrcNetAddress->addressLength;
|
|
|
|
if (lpSrcNetAddress->addressLength) {
|
|
pBuffer = (LPBYTE)AllocADsMem(lpSrcNetAddress->addressLength);
|
|
|
|
if (!pBuffer) {
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(pBuffer, lpSrcNetAddress->address, lpSrcNetAddress->addressLength);
|
|
|
|
lpDest12->Address = pBuffer;
|
|
}else {
|
|
lpDest12->Address = NULL;
|
|
}
|
|
|
|
RRETURN(S_OK);
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CopyNDS12ToNDSNetAddress(
|
|
LPNDS_ASN1_TYPE_12 lpSrc12,
|
|
pNet_Address_T lpDestNetAddress
|
|
)
|
|
{
|
|
LPBYTE pBuffer = NULL;
|
|
|
|
lpDestNetAddress->addressType = lpSrc12->AddressType;
|
|
|
|
lpDestNetAddress->addressLength = lpSrc12->AddressLength;
|
|
|
|
if (lpSrc12->AddressLength) {
|
|
pBuffer = (LPBYTE)AllocADsMem(lpSrc12->AddressLength);
|
|
|
|
if (!pBuffer) {
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(pBuffer, lpSrc12->Address, lpSrc12->AddressLength);
|
|
|
|
lpDestNetAddress->address = pBuffer;
|
|
}else {
|
|
lpDestNetAddress->address = NULL;
|
|
}
|
|
|
|
RRETURN(S_OK);
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CopyNdsValueToNdsObject(
|
|
nptr attrVal,
|
|
nuint32 luAttrValSize,
|
|
nuint32 luSyntax,
|
|
PNDSOBJECT pNdsObject
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (!pNdsObject || !attrVal) {
|
|
RRETURN (E_ADS_BAD_PARAMETER);
|
|
}
|
|
|
|
pNdsObject->NdsType = luSyntax;
|
|
|
|
switch (luSyntax) {
|
|
case 1:
|
|
|
|
pNdsObject->NdsValue.value_1.DNString = AllocADsStr( (LPWSTR) attrVal);
|
|
break;
|
|
|
|
case 2:
|
|
|
|
pNdsObject->NdsValue.value_2.CaseExactString = AllocADsStr( (LPWSTR) attrVal);
|
|
break;
|
|
|
|
case 3:
|
|
|
|
pNdsObject->NdsValue.value_3.CaseIgnoreString = AllocADsStr( (LPWSTR) attrVal);
|
|
break;
|
|
|
|
case 4:
|
|
|
|
pNdsObject->NdsValue.value_4.PrintableString = AllocADsStr( (LPWSTR) attrVal);
|
|
break;
|
|
|
|
case 5:
|
|
|
|
pNdsObject->NdsValue.value_5.NumericString = AllocADsStr( (LPWSTR) attrVal);
|
|
break;
|
|
|
|
case 6: {
|
|
|
|
pCI_List_T pCaseIgnoreList = (pCI_List_T) attrVal;
|
|
|
|
LPNDS_ASN1_TYPE_6 pNdsTempASN1_6 = NULL;
|
|
LPNDS_ASN1_TYPE_6 pNdsNextASN1_6 = NULL;
|
|
|
|
pNdsTempASN1_6 = &(pNdsObject->NdsValue.value_6);
|
|
|
|
pNdsObject->NdsType = NDS_SYNTAX_ID_6;
|
|
|
|
if (! pCaseIgnoreList->s) {
|
|
pNdsTempASN1_6->String = NULL;
|
|
pNdsTempASN1_6->Next = NULL;
|
|
RRETURN (S_OK);
|
|
}
|
|
|
|
pNdsTempASN1_6->String =
|
|
(LPWSTR)AllocADsStr((LPWSTR) pCaseIgnoreList->s);
|
|
|
|
while ( pCaseIgnoreList->next != NULL )
|
|
{
|
|
pCaseIgnoreList = pCaseIgnoreList->next;
|
|
|
|
pNdsNextASN1_6 =
|
|
(LPNDS_ASN1_TYPE_6)AllocADsMem(sizeof(NDS_ASN1_TYPE_6));
|
|
|
|
if (!pNdsNextASN1_6) {
|
|
//
|
|
// BUGBUG: need to clean up the list
|
|
//
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
pNdsNextASN1_6->String =
|
|
(LPWSTR)AllocADsStr((LPWSTR) pCaseIgnoreList->s);
|
|
|
|
if (!pNdsNextASN1_6->String) {
|
|
//
|
|
// BUGBUG: need to clean up the list
|
|
//
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
pNdsTempASN1_6->Next = pNdsNextASN1_6;
|
|
|
|
pNdsTempASN1_6 = pNdsNextASN1_6;
|
|
}
|
|
|
|
pNdsTempASN1_6->Next = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case 7:
|
|
|
|
pNdsObject->NdsValue.value_7.Boolean = *((Boolean_T *) attrVal);
|
|
break;
|
|
|
|
case 8:
|
|
|
|
pNdsObject->NdsValue.value_8.Integer = *((Integer_T *) attrVal);
|
|
break;
|
|
|
|
case 9: {
|
|
|
|
pOctet_String_T lpNdsOctetString = (pOctet_String_T) attrVal;
|
|
|
|
if (lpNdsOctetString->length) {
|
|
|
|
pNdsObject->NdsValue.value_9.Length = lpNdsOctetString->length;
|
|
|
|
pNdsObject->NdsValue.value_9.OctetString =
|
|
(LPBYTE) AllocADsMem(lpNdsOctetString->length);
|
|
if (!pNdsObject->NdsValue.value_9.OctetString) {
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
pNdsObject->NdsValue.value_9.OctetString,
|
|
lpNdsOctetString->data,
|
|
lpNdsOctetString->length
|
|
);
|
|
}
|
|
else {
|
|
|
|
pNdsObject->NdsValue.value_9.OctetString = NULL;
|
|
pNdsObject->NdsValue.value_9.Length = 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 10:
|
|
|
|
pNdsObject->NdsValue.value_10.TelephoneNumber = AllocADsStr( (LPWSTR) attrVal);
|
|
break;
|
|
|
|
case 11: {
|
|
pFax_Number_T pNdsFaxNumber = (pFax_Number_T) attrVal;
|
|
LPNDS_ASN1_TYPE_11 pNdsASN1_11 = &(pNdsObject->NdsValue.value_11);
|
|
|
|
pNdsASN1_11->TelephoneNumber = AllocADsStr((LPWSTR)pNdsFaxNumber->telephoneNumber);
|
|
pNdsASN1_11->NumberOfBits = pNdsFaxNumber->parameters.numOfBits;
|
|
pNdsASN1_11->Parameters = (LPBYTE) AllocADsMem((pNdsASN1_11->NumberOfBits + 7) / 8);
|
|
if (!pNdsASN1_11->Parameters) {
|
|
RRETURN (E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
pNdsASN1_11->Parameters,
|
|
pNdsFaxNumber->parameters.data,
|
|
((pNdsASN1_11->NumberOfBits+7) / 8)
|
|
);
|
|
|
|
break;
|
|
}
|
|
|
|
case 12: {
|
|
pNet_Address_T pNetAddress = (pNet_Address_T) attrVal;
|
|
LPBYTE pBuffer = NULL;
|
|
|
|
pNdsObject->NdsValue.value_12.AddressType = pNetAddress->addressType;
|
|
|
|
pNdsObject->NdsValue.value_12.AddressLength = pNetAddress->addressLength;
|
|
|
|
if (pNetAddress->addressLength) {
|
|
pBuffer = (LPBYTE)AllocADsMem(pNetAddress->addressLength);
|
|
if (!pBuffer) {
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(pBuffer, pNetAddress->address, pNetAddress->addressLength);
|
|
pNdsObject->NdsValue.value_12.Address = pBuffer;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case 13: {
|
|
|
|
pOctet_List_T pOctetList = (pOctet_List_T) attrVal;
|
|
LPNDS_ASN1_TYPE_13 * lppNext = NULL;
|
|
LPBYTE lpBuffer = NULL;
|
|
LPNDS_ASN1_TYPE_13 pNextObj = NULL;
|
|
|
|
lpBuffer = (LPBYTE)AllocADsMem(pOctetList->length);
|
|
if (!lpBuffer) {
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(lpBuffer, pOctetList->data, pOctetList->length);
|
|
|
|
pNdsObject->NdsValue.value_13.Length = pOctetList->length;
|
|
pNdsObject->NdsValue.value_13.Data = lpBuffer;
|
|
|
|
lppNext = &(pNdsObject->NdsValue.value_13.Next);
|
|
|
|
while ( pOctetList->next != NULL )
|
|
{
|
|
pOctetList = pOctetList->next;
|
|
|
|
pNextObj =
|
|
(LPNDS_ASN1_TYPE_13)AllocADsMem(sizeof(NDS_ASN1_TYPE_13));
|
|
if (!pNextObj) {
|
|
// BUGBUG: need to clean up list
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
lpBuffer = (LPBYTE)AllocADsMem(pOctetList->length);
|
|
|
|
memcpy(lpBuffer, pOctetList->data, pOctetList->length);
|
|
|
|
|
|
pNextObj->Length = pOctetList->length;
|
|
pNextObj->Data = lpBuffer;
|
|
|
|
*lppNext = pNextObj;
|
|
|
|
lppNext = &pNextObj->Next;
|
|
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case 14: {
|
|
|
|
pEMail_Address_T pEmailAddress = (pEMail_Address_T) attrVal;
|
|
|
|
pNdsObject->NdsValue.value_14.Type = pEmailAddress->type;
|
|
|
|
pNdsObject->NdsValue.value_14.Address =
|
|
(LPWSTR)AllocADsStr((LPWSTR) pEmailAddress->address);
|
|
|
|
break;
|
|
}
|
|
|
|
case 15: {
|
|
|
|
pPath_T pPath = (pPath_T) attrVal;
|
|
|
|
pNdsObject->NdsValue.value_15.Type = pPath->nameSpaceType;
|
|
|
|
pNdsObject->NdsValue.value_15.VolumeName =
|
|
(LPWSTR)AllocADsStr( (LPWSTR) pPath->volumeName);
|
|
|
|
pNdsObject->NdsValue.value_15.Path =
|
|
(LPWSTR)AllocADsStr( (LPWSTR) pPath->path);
|
|
|
|
if (!pNdsObject->NdsValue.value_15.Path) {
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case 16: {
|
|
|
|
pReplica_Pointer_T pReplicaPtr = (pReplica_Pointer_T) attrVal;
|
|
LPNDS_ASN1_TYPE_12 pNdsASN1_12 = NULL;
|
|
DWORD iter = 0;
|
|
|
|
pNdsObject->NdsValue.value_16.ServerName =
|
|
(LPWSTR)AllocADsStr((LPWSTR) pReplicaPtr->serverName);
|
|
|
|
pNdsObject->NdsValue.value_16.ReplicaType = pReplicaPtr->replicaType;
|
|
|
|
pNdsObject->NdsValue.value_16.ReplicaNumber = pReplicaPtr->replicaNumber;
|
|
|
|
pNdsObject->NdsValue.value_16.Count = pReplicaPtr->count;
|
|
|
|
//
|
|
// NDS is kinda goofy. It stores one substructure as part of the
|
|
// containing data type instead of a pointer to the object.
|
|
//
|
|
|
|
pNdsASN1_12 = (LPNDS_ASN1_TYPE_12)AllocADsMem(
|
|
pReplicaPtr->count * sizeof(NDS_ASN1_TYPE_12)
|
|
);
|
|
if (!pNdsASN1_12) {
|
|
RRETURN (E_OUTOFMEMORY);
|
|
}
|
|
|
|
pNdsObject->NdsValue.value_16.ReplicaAddressHints = pNdsASN1_12;
|
|
|
|
for ( iter = 0; iter < pReplicaPtr->count; iter++ )
|
|
{
|
|
|
|
hr = CopyNDSNetAddressToNDS12(
|
|
pReplicaPtr->replicaAddressHint + iter,
|
|
(pNdsASN1_12 + iter)
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case 17: {
|
|
|
|
pObject_ACL_T pObjectACL = (pObject_ACL_T) attrVal;
|
|
|
|
pNdsObject->NdsValue.value_17.ProtectedAttrName =
|
|
(LPWSTR)AllocADsStr((LPWSTR) pObjectACL->protectedAttrName);
|
|
|
|
pNdsObject->NdsValue.value_17.SubjectName =
|
|
(LPWSTR)AllocADsStr((LPWSTR) pObjectACL->subjectName);
|
|
|
|
pNdsObject->NdsValue.value_17.Privileges =
|
|
pObjectACL->privileges;
|
|
break;
|
|
}
|
|
|
|
case 18: {
|
|
|
|
LPWSTR *pPostalAddresses = (LPWSTR *) attrVal;
|
|
|
|
for (DWORD i = 0; i < 6; i++) {
|
|
|
|
pNdsObject->NdsValue.value_18.PostalAddress[i] =
|
|
(LPWSTR)AllocADsStr((LPWSTR) pPostalAddresses[i]);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 19: {
|
|
|
|
pNWDS_TimeStamp_T pTimeStamp = (pNWDS_TimeStamp_T) attrVal;
|
|
|
|
pNdsObject->NdsValue.value_19.WholeSeconds = pTimeStamp->wholeSeconds;
|
|
|
|
pNdsObject->NdsValue.value_19.EventID = pTimeStamp->eventID;
|
|
|
|
break;
|
|
}
|
|
|
|
case 20:
|
|
|
|
pNdsObject->NdsValue.value_20.ClassName = AllocADsStr( (LPWSTR) attrVal);
|
|
break;
|
|
|
|
case 21: {
|
|
|
|
pStream_T lpASN1_21 = (pStream_T) attrVal;
|
|
|
|
//
|
|
// The Length value is supposedly always zero!!
|
|
//
|
|
pNdsObject->NdsValue.value_21.Length = lpASN1_21->length;
|
|
pNdsObject->NdsValue.value_21.Data = NULL;
|
|
|
|
break;
|
|
}
|
|
|
|
case 22:
|
|
|
|
pNdsObject->NdsValue.value_22.Counter = *((DWORD *) attrVal);
|
|
break;
|
|
|
|
case 23: {
|
|
|
|
pBack_Link_T pBackLink = (pBack_Link_T) attrVal;
|
|
|
|
pNdsObject->NdsValue.value_23.RemoteID = pBackLink->remoteID;
|
|
|
|
pNdsObject->NdsValue.value_23.ObjectName =
|
|
(LPWSTR)AllocADsStr( (LPWSTR) pBackLink->objectName);
|
|
|
|
if (!pBackLink->objectName) {
|
|
RRETURN (E_OUTOFMEMORY);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case 24:
|
|
|
|
pNdsObject->NdsValue.value_24.Time = *((DWORD *) attrVal);
|
|
break;
|
|
|
|
case 25: {
|
|
|
|
pTyped_Name_T pTypedName = (pTyped_Name_T) attrVal;
|
|
|
|
pNdsObject->NdsValue.value_25.ObjectName =
|
|
(LPWSTR)AllocADsStr( (LPWSTR) pTypedName->objectName);
|
|
|
|
pNdsObject->NdsValue.value_25.Level = pTypedName->level;
|
|
|
|
pNdsObject->NdsValue.value_25.Interval = pTypedName->interval;
|
|
|
|
break;
|
|
}
|
|
|
|
case 26: {
|
|
|
|
pHold_T pHold = (pHold_T) attrVal;
|
|
|
|
pNdsObject->NdsValue.value_26.ObjectName =
|
|
(LPWSTR)AllocADsStr( (LPWSTR) pHold->objectName);
|
|
|
|
pNdsObject->NdsValue.value_26.Amount = pHold->amount;
|
|
|
|
break;
|
|
}
|
|
|
|
case 27:
|
|
|
|
pNdsObject->NdsValue.value_27.Interval = *((DWORD *) attrVal);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
//
|
|
// BugBug. Get the proper value from NDS
|
|
//
|
|
RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
|
|
break;
|
|
}
|
|
|
|
error:
|
|
|
|
RRETURN (hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
CopyNdsObjectToNdsValue(
|
|
PNDSOBJECT lpNdsObject,
|
|
nptr *ppAttrVal,
|
|
pnuint32 pluAttrValSize,
|
|
pnuint32 pluSyntax
|
|
)
|
|
{
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if (!lpNdsObject || !ppAttrVal || !pluAttrValSize || !pluSyntax) {
|
|
RRETURN(E_ADS_BAD_PARAMETER);
|
|
}
|
|
|
|
*pluAttrValSize = 0;
|
|
*ppAttrVal = NULL;
|
|
*pluSyntax = lpNdsObject->NdsType;
|
|
|
|
switch (lpNdsObject->NdsType) {
|
|
case 1:
|
|
|
|
*ppAttrVal = AllocADsStr( lpNdsObject->NdsValue.value_1.DNString );
|
|
*pluAttrValSize = (wcslen( lpNdsObject->NdsValue.value_1.DNString ) + 1) * sizeof (WCHAR) ;
|
|
break;
|
|
|
|
case 2:
|
|
|
|
*ppAttrVal = AllocADsStr( lpNdsObject->NdsValue.value_2.CaseExactString );
|
|
*pluAttrValSize = (wcslen( lpNdsObject->NdsValue.value_2.CaseExactString ) + 1) * sizeof (WCHAR) ;
|
|
break;
|
|
|
|
case 3:
|
|
|
|
*ppAttrVal = AllocADsStr( lpNdsObject->NdsValue.value_3.CaseIgnoreString );
|
|
*pluAttrValSize = (wcslen( lpNdsObject->NdsValue.value_3.CaseIgnoreString ) + 1) * sizeof (WCHAR) ;
|
|
break;
|
|
|
|
case 4:
|
|
|
|
*ppAttrVal = AllocADsStr( lpNdsObject->NdsValue.value_4.PrintableString );
|
|
*pluAttrValSize = (wcslen( lpNdsObject->NdsValue.value_4.PrintableString ) + 1) * sizeof (WCHAR) ;
|
|
break;
|
|
|
|
case 5:
|
|
|
|
*ppAttrVal = AllocADsStr( lpNdsObject->NdsValue.value_5.NumericString );
|
|
*pluAttrValSize = (wcslen( lpNdsObject->NdsValue.value_5.NumericString ) + 1) * sizeof (WCHAR) ;
|
|
break;
|
|
|
|
case 6: {
|
|
|
|
LPNDS_ASN1_TYPE_6 lpNdsTempASN1_6 = &(lpNdsObject->NdsValue.value_6);
|
|
pCI_List_T pCaseIgnoreList = (pCI_List_T) AllocADsMem(sizeof(CI_List_T));
|
|
if (!pCaseIgnoreList) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
*ppAttrVal = pCaseIgnoreList;
|
|
*pluAttrValSize = sizeof(CI_List_T);
|
|
|
|
pCaseIgnoreList->s = (pnchar8) AllocADsStr( lpNdsTempASN1_6->String );
|
|
if (!pCaseIgnoreList->s) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
while ( lpNdsTempASN1_6->Next)
|
|
{
|
|
|
|
pCaseIgnoreList->next = (pCI_List_T) AllocADsMem(sizeof(CI_List_T));
|
|
if (!pCaseIgnoreList->next) {
|
|
// BUGBUG: need to clean up list
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pCaseIgnoreList = pCaseIgnoreList->next;
|
|
|
|
lpNdsTempASN1_6 = lpNdsTempASN1_6->Next;
|
|
|
|
pCaseIgnoreList->s = (pnchar8) AllocADsStr( lpNdsTempASN1_6->String );
|
|
if (!pCaseIgnoreList) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
}
|
|
pCaseIgnoreList->next = NULL;
|
|
|
|
break;
|
|
}
|
|
|
|
case 7: {
|
|
|
|
Boolean_T *pBool = (Boolean_T *) AllocADsMem(sizeof(Boolean_T));
|
|
if (!pBool) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
*pBool = *((Boolean_T *) &lpNdsObject->NdsValue.value_7.Boolean);
|
|
*ppAttrVal = pBool;
|
|
*pluAttrValSize = sizeof(Boolean_T);
|
|
break;
|
|
}
|
|
|
|
case 8: {
|
|
|
|
Integer_T *pInteger = (Integer_T *) AllocADsMem(sizeof(Integer_T));
|
|
if (!pInteger) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
*pInteger = *((Integer_T *) &lpNdsObject->NdsValue.value_8.Integer);
|
|
*ppAttrVal = pInteger;
|
|
*pluAttrValSize = sizeof(Integer_T);
|
|
break;
|
|
}
|
|
|
|
case 9: {
|
|
|
|
pOctet_String_T lpOctetString = (pOctet_String_T)
|
|
AllocADsMem(sizeof(Octet_String_T));
|
|
|
|
if (!lpOctetString) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
if (lpNdsObject->NdsValue.value_9.Length) {
|
|
|
|
lpOctetString->length = lpNdsObject->NdsValue.value_9.Length;
|
|
|
|
lpOctetString->data = (LPBYTE) AllocADsMem (
|
|
lpNdsObject->NdsValue.value_9.Length);
|
|
if (!lpOctetString->data) {
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
lpOctetString->data,
|
|
lpNdsObject->NdsValue.value_9.OctetString,
|
|
lpNdsObject->NdsValue.value_9.Length
|
|
);
|
|
}
|
|
else {
|
|
lpOctetString->length = 0;
|
|
lpOctetString->data = NULL;
|
|
|
|
}
|
|
*ppAttrVal = lpOctetString;
|
|
*pluAttrValSize = sizeof(Octet_String_T);
|
|
break;
|
|
}
|
|
|
|
case 10:
|
|
|
|
*ppAttrVal = AllocADsStr( lpNdsObject->NdsValue.value_11.TelephoneNumber );
|
|
*pluAttrValSize = (wcslen( lpNdsObject->NdsValue.value_11.TelephoneNumber ) + 1) * sizeof (WCHAR) ;
|
|
break;
|
|
|
|
case 11: {
|
|
|
|
pFax_Number_T pFaxNumber = (pFax_Number_T) AllocADsMem(sizeof(Fax_Number_T));
|
|
|
|
pFaxNumber->telephoneNumber =
|
|
(pnchar8)AllocADsStr(
|
|
lpNdsObject->NdsValue.value_11.TelephoneNumber
|
|
);
|
|
if (!pFaxNumber->telephoneNumber) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pFaxNumber->parameters.numOfBits = lpNdsObject->NdsValue.value_11.NumberOfBits;
|
|
|
|
pFaxNumber->parameters.data = (LPBYTE) AllocADsMem((pFaxNumber->parameters.numOfBits+7) / 8);
|
|
|
|
memcpy(
|
|
pFaxNumber->parameters.data,
|
|
lpNdsObject->NdsValue.value_11.Parameters,
|
|
(pFaxNumber->parameters.numOfBits+7) / 8
|
|
);
|
|
|
|
*ppAttrVal = pFaxNumber;
|
|
*pluAttrValSize = sizeof(Fax_Number_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 12: {
|
|
|
|
pNet_Address_T pNetAddress = (pNet_Address_T) AllocADsMem(sizeof (Net_Address_T));
|
|
LPBYTE pBuffer = NULL;
|
|
|
|
pNetAddress->addressType = lpNdsObject->NdsValue.value_12.AddressType;
|
|
|
|
pNetAddress->addressLength = lpNdsObject->NdsValue.value_12.AddressLength;
|
|
|
|
pBuffer = (LPBYTE)AllocADsMem(pNetAddress->addressLength);
|
|
if (!pBuffer) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
pBuffer,
|
|
lpNdsObject->NdsValue.value_12.Address,
|
|
pNetAddress->addressLength
|
|
);
|
|
|
|
pNetAddress->address = pBuffer;
|
|
|
|
*ppAttrVal = pNetAddress;
|
|
*pluAttrValSize = sizeof(Net_Address_T);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case 13: {
|
|
|
|
LPNDS_ASN1_TYPE_13 lpNdsTempASN1_13 = &(lpNdsObject->NdsValue.value_13);
|
|
pOctet_List_T pOctetList = (pOctet_List_T) AllocADsMem(sizeof(Octet_List_T));
|
|
if (!pOctetList) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
*ppAttrVal = pOctetList;
|
|
*pluAttrValSize = sizeof(Octet_List_T);
|
|
|
|
pOctetList->length = lpNdsTempASN1_13->Length;
|
|
|
|
pOctetList->data =
|
|
(LPBYTE)AllocADsMem(
|
|
lpNdsTempASN1_13->Length
|
|
);
|
|
if (!pOctetList->data) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
pOctetList->data,
|
|
lpNdsTempASN1_13->Data,
|
|
pOctetList->length
|
|
);
|
|
|
|
while ( lpNdsTempASN1_13->Next)
|
|
{
|
|
|
|
pOctetList->next = (pOctet_List_T) AllocADsMem(sizeof(Octet_List_T));
|
|
if (!pOctetList->next) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pOctetList = pOctetList->next;
|
|
|
|
lpNdsTempASN1_13 = lpNdsTempASN1_13->Next;
|
|
|
|
pOctetList->length = lpNdsTempASN1_13->Length;
|
|
|
|
pOctetList->data = (LPBYTE) AllocADsMem( lpNdsTempASN1_13->Length );
|
|
if (!pOctetList->data) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
pOctetList->data,
|
|
lpNdsTempASN1_13->Data,
|
|
pOctetList->length
|
|
);
|
|
}
|
|
pOctetList->next = NULL;
|
|
|
|
break;
|
|
}
|
|
|
|
case 14: {
|
|
|
|
pEMail_Address_T pEmailAddress = (pEMail_Address_T) AllocADsMem(sizeof (EMail_Address_T));
|
|
if (!pEmailAddress) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pEmailAddress->type = lpNdsObject->NdsValue.value_14.Type;
|
|
|
|
pEmailAddress->address = (pnchar8) AllocADsStr( (LPWSTR) lpNdsObject->NdsValue.value_14.Address);
|
|
|
|
*ppAttrVal = pEmailAddress;
|
|
*pluAttrValSize = sizeof(EMail_Address_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 15: {
|
|
|
|
pPath_T pPath = (pPath_T) AllocADsMem(sizeof (Path_T));
|
|
if (!pPath) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pPath->nameSpaceType = lpNdsObject->NdsValue.value_15.Type;
|
|
pPath->volumeName = (pnchar8) AllocADsStr( lpNdsObject->NdsValue.value_15.VolumeName);
|
|
pPath->path = (pnchar8) AllocADsStr( (LPWSTR) lpNdsObject->NdsValue.value_15.Path);
|
|
|
|
*ppAttrVal = pPath;
|
|
*pluAttrValSize = sizeof(Path_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 16: {
|
|
|
|
LPNDS_ASN1_TYPE_12 pNdsASN1_12 = NULL;
|
|
DWORD dwSize = sizeof (Replica_Pointer_T) +
|
|
(lpNdsObject->NdsValue.value_16.Count-1) * sizeof (Net_Address_T);
|
|
|
|
pReplica_Pointer_T pReplicaPointer =
|
|
(pReplica_Pointer_T) AllocADsMem(dwSize);
|
|
|
|
if (!pReplicaPointer) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pReplicaPointer->serverName = (pnchar8) AllocADsStr( (LPWSTR) lpNdsObject->NdsValue.value_16.ServerName);
|
|
pReplicaPointer->replicaType = lpNdsObject->NdsValue.value_16.ReplicaType;
|
|
pReplicaPointer->replicaNumber = lpNdsObject->NdsValue.value_16.ReplicaNumber;
|
|
pReplicaPointer->count = lpNdsObject->NdsValue.value_16.Count;
|
|
|
|
pNdsASN1_12 = lpNdsObject->NdsValue.value_16.ReplicaAddressHints;
|
|
|
|
for ( DWORD iter = 0; iter < pReplicaPointer->count; iter++ )
|
|
{
|
|
|
|
hr = CopyNDS12ToNDSNetAddress(
|
|
pNdsASN1_12 + iter,
|
|
pReplicaPointer->replicaAddressHint + iter
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
*ppAttrVal = pReplicaPointer;
|
|
*pluAttrValSize = dwSize;
|
|
|
|
break;
|
|
}
|
|
|
|
case 17: {
|
|
|
|
pObject_ACL_T pObjectACL = (pObject_ACL_T) AllocADsMem(sizeof (Object_ACL_T));
|
|
if (!pObjectACL) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pObjectACL->protectedAttrName = (pnchar8) AllocADsStr( (LPWSTR) lpNdsObject->NdsValue.value_17.ProtectedAttrName);
|
|
|
|
pObjectACL->subjectName = (pnchar8) AllocADsStr( lpNdsObject->NdsValue.value_17.SubjectName);
|
|
|
|
pObjectACL->privileges = lpNdsObject->NdsValue.value_17.Privileges;
|
|
|
|
*ppAttrVal = pObjectACL;
|
|
*pluAttrValSize = sizeof(Object_ACL_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 18: {
|
|
|
|
LPWSTR *pPostalAddresses = (LPWSTR *) AllocADsMem(sizeof (LPWSTR) * 6);
|
|
if (!pPostalAddresses) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
for (DWORD i=0; i < 6; i++) {
|
|
pPostalAddresses[i] = AllocADsStr( (LPWSTR) lpNdsObject->NdsValue.value_18.PostalAddress[i]);
|
|
}
|
|
|
|
*ppAttrVal = pPostalAddresses;
|
|
*pluAttrValSize = sizeof(LPWSTR) * 6;
|
|
|
|
break;
|
|
}
|
|
|
|
case 19: {
|
|
|
|
pNWDS_TimeStamp_T pTimeStamp = (pNWDS_TimeStamp_T) AllocADsMem(sizeof (NWDS_TimeStamp_T));
|
|
if (!pTimeStamp) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pTimeStamp->wholeSeconds = lpNdsObject->NdsValue.value_19.WholeSeconds;
|
|
pTimeStamp->eventID = lpNdsObject->NdsValue.value_19.EventID;
|
|
|
|
*ppAttrVal = pTimeStamp;
|
|
*pluAttrValSize = sizeof(NWDS_TimeStamp_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 20:
|
|
|
|
*ppAttrVal = AllocADsStr( lpNdsObject->NdsValue.value_20.ClassName );
|
|
*pluAttrValSize = (wcslen( lpNdsObject->NdsValue.value_20.ClassName ) + 1) * sizeof (WCHAR) ;
|
|
break;
|
|
|
|
case 21:{
|
|
|
|
pStream_T pStream = (pStream_T) AllocADsMem(sizeof (NWDS_TimeStamp_T));
|
|
if (!pStream) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pStream->length = lpNdsObject->NdsValue.value_21.Length;
|
|
pStream->data = NULL;
|
|
|
|
*ppAttrVal = pStream;
|
|
*pluAttrValSize = sizeof(Stream_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 22: {
|
|
|
|
Counter_T *pCounter = (Counter_T *) AllocADsMem(sizeof(Counter_T));
|
|
if (!pCounter) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
*pCounter = *((Counter_T *) &lpNdsObject->NdsValue.value_22.Counter);
|
|
*ppAttrVal = pCounter;
|
|
*pluAttrValSize = sizeof(Counter_T);
|
|
break;
|
|
}
|
|
|
|
case 23: {
|
|
|
|
pBack_Link_T pBackLink = (pBack_Link_T) AllocADsMem(sizeof (Back_Link_T));
|
|
if (!pBackLink) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pBackLink->remoteID = lpNdsObject->NdsValue.value_23.RemoteID;
|
|
|
|
pBackLink->objectName = (pnchar8) AllocADsStr( lpNdsObject->NdsValue.value_23.ObjectName);
|
|
|
|
*ppAttrVal = pBackLink;
|
|
*pluAttrValSize = sizeof(Back_Link_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 24: {
|
|
|
|
Integer_T *pInteger = (Integer_T *) AllocADsMem(sizeof(Integer_T));
|
|
if (!pInteger) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
*pInteger = *((Integer_T *) &lpNdsObject->NdsValue.value_24.Time);
|
|
*ppAttrVal = pInteger;
|
|
*pluAttrValSize = sizeof(Integer_T);
|
|
break;
|
|
}
|
|
|
|
case 25: {
|
|
|
|
pTyped_Name_T pTypedName = (pTyped_Name_T) AllocADsMem(sizeof (Typed_Name_T));
|
|
if (!pTypedName) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pTypedName->objectName = (pnchar8) AllocADsStr( lpNdsObject->NdsValue.value_25.ObjectName);
|
|
|
|
pTypedName->level = lpNdsObject->NdsValue.value_25.Level;
|
|
|
|
pTypedName->interval = lpNdsObject->NdsValue.value_25.Interval;
|
|
|
|
*ppAttrVal = pTypedName;
|
|
*pluAttrValSize = sizeof(Typed_Name_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 26: {
|
|
|
|
pHold_T pHold = (pHold_T) AllocADsMem(sizeof (Hold_T));
|
|
if (!pHold) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pHold->objectName = (pnchar8) AllocADsStr( (LPWSTR) lpNdsObject->NdsValue.value_26.ObjectName);
|
|
|
|
pHold->amount = lpNdsObject->NdsValue.value_26.Amount;
|
|
|
|
*ppAttrVal = pHold;
|
|
*pluAttrValSize = sizeof(Hold_T);
|
|
|
|
break;
|
|
}
|
|
|
|
case 27: {
|
|
|
|
nuint32 *pInterval = (nuint32 *) AllocADsMem(sizeof(nuint32));
|
|
if (!pInterval) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
*pInterval = *((nuint32 *) &lpNdsObject->NdsValue.value_27.Interval);
|
|
*ppAttrVal = pInterval;
|
|
*pluAttrValSize = sizeof(nuint32);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
|
|
//
|
|
// BugBug. Get the proper value from NDS
|
|
//
|
|
RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
|
|
break;
|
|
}
|
|
|
|
RRETURN (hr);
|
|
|
|
error:
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|