You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1949 lines
47 KiB
1949 lines
47 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
|
//
|
|
// File: adscopy.cxx
|
|
//
|
|
// Contents: NDS Object to Variant Copy Routines
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 25-Apr-96 KrishnaG Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include "oleds.hxx"
|
|
|
|
|
|
HRESULT
|
|
AdsClear(
|
|
PADSVALUE lpAdsValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
switch (lpAdsValue->dwType){
|
|
|
|
case ADSTYPE_DN_STRING:
|
|
FreeADsStr(lpAdsValue->DNString);
|
|
break;
|
|
|
|
case ADSTYPE_CASE_EXACT_STRING:
|
|
FreeADsStr(lpAdsValue->CaseExactString);
|
|
break;
|
|
|
|
case ADSTYPE_CASE_IGNORE_STRING:
|
|
FreeADsStr(lpAdsValue->CaseIgnoreString);
|
|
break;
|
|
|
|
case ADSTYPE_PRINTABLE_STRING:
|
|
FreeADsStr(lpAdsValue->PrintableString);
|
|
break;
|
|
|
|
case ADSTYPE_NUMERIC_STRING:
|
|
FreeADsStr(lpAdsValue->NumericString);
|
|
break;
|
|
|
|
case ADSTYPE_BOOLEAN:
|
|
break;
|
|
|
|
case ADSTYPE_INTEGER:
|
|
break;
|
|
|
|
case ADSTYPE_OCTET_STRING:
|
|
if (lpAdsValue->OctetString.lpValue) {
|
|
FreeADsMem(lpAdsValue->OctetString.lpValue);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_PROV_SPECIFIC:
|
|
if (lpAdsValue->ProviderSpecific.lpValue) {
|
|
FreeADsMem(lpAdsValue->ProviderSpecific.lpValue);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_UTC_TIME:
|
|
break;
|
|
|
|
case ADSTYPE_CASEIGNORE_LIST:
|
|
{
|
|
PADS_CASEIGNORE_LIST pCurrent = NULL;
|
|
PADS_CASEIGNORE_LIST pNext = NULL;
|
|
|
|
pNext = lpAdsValue->pCaseIgnoreList;
|
|
while (pNext) {
|
|
pCurrent = pNext;
|
|
pNext = pCurrent->Next;
|
|
if (pCurrent->String) {
|
|
FreeADsStr(pCurrent->String);
|
|
}
|
|
FreeADsMem(pCurrent);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ADSTYPE_FAXNUMBER:
|
|
if (lpAdsValue->pFaxNumber) {
|
|
if (lpAdsValue->pFaxNumber->Parameters) {
|
|
FreeADsMem(lpAdsValue->pFaxNumber->Parameters);
|
|
}
|
|
if (lpAdsValue->pFaxNumber->TelephoneNumber) {
|
|
FreeADsMem(lpAdsValue->pFaxNumber->TelephoneNumber);
|
|
}
|
|
FreeADsMem(lpAdsValue->pFaxNumber);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_NETADDRESS:
|
|
if (lpAdsValue->pNetAddress) {
|
|
if (lpAdsValue->pNetAddress->Address) {
|
|
FreeADsMem(lpAdsValue->pNetAddress->Address);
|
|
}
|
|
FreeADsMem(lpAdsValue->pNetAddress);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_OCTET_LIST:
|
|
{
|
|
PADS_OCTET_LIST pCurrent = NULL;
|
|
PADS_OCTET_LIST pNext = NULL;
|
|
|
|
pNext = lpAdsValue->pOctetList;
|
|
while (pNext) {
|
|
pCurrent = pNext;
|
|
pNext = pCurrent->Next;
|
|
if (pCurrent->Data) {
|
|
FreeADsMem(pCurrent->Data);
|
|
}
|
|
FreeADsMem(pCurrent);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ADSTYPE_EMAIL:
|
|
if (lpAdsValue->Email.Address) {
|
|
FreeADsStr(lpAdsValue->Email.Address);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_PATH:
|
|
if (lpAdsValue->pPath) {
|
|
if (lpAdsValue->pPath->VolumeName) {
|
|
FreeADsStr(lpAdsValue->pPath->VolumeName);
|
|
}
|
|
if (lpAdsValue->pPath->Path) {
|
|
FreeADsStr(lpAdsValue->pPath->Path);
|
|
}
|
|
FreeADsMem(lpAdsValue->pPath);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_REPLICAPOINTER:
|
|
if (lpAdsValue->pReplicaPointer) {
|
|
if (lpAdsValue->pReplicaPointer->ServerName) {
|
|
FreeADsStr(lpAdsValue->pReplicaPointer->ServerName );
|
|
}
|
|
if (lpAdsValue->pReplicaPointer->ReplicaAddressHints->Address) {
|
|
FreeADsMem(lpAdsValue->pReplicaPointer->ReplicaAddressHints->Address);
|
|
}
|
|
FreeADsMem(lpAdsValue->pReplicaPointer);
|
|
}
|
|
break;
|
|
|
|
|
|
case ADSTYPE_TIMESTAMP:
|
|
break;
|
|
|
|
case ADSTYPE_POSTALADDRESS:
|
|
{
|
|
long i;
|
|
if (lpAdsValue->pPostalAddress) {
|
|
for (i=0;i<6;i++) {
|
|
if (lpAdsValue->pPostalAddress->PostalAddress[i]) {
|
|
FreeADsStr(lpAdsValue->pPostalAddress->PostalAddress[i]);
|
|
}
|
|
}
|
|
FreeADsMem(lpAdsValue->pPostalAddress);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ADSTYPE_BACKLINK:
|
|
if (lpAdsValue->BackLink.ObjectName) {
|
|
FreeADsStr(lpAdsValue->BackLink.ObjectName);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_TYPEDNAME:
|
|
if (lpAdsValue->pTypedName) {
|
|
if (lpAdsValue->pTypedName->ObjectName) {
|
|
FreeADsStr(lpAdsValue->pTypedName->ObjectName);
|
|
}
|
|
FreeADsMem(lpAdsValue->pTypedName);
|
|
}
|
|
|
|
break;
|
|
|
|
case ADSTYPE_HOLD:
|
|
if (lpAdsValue->Hold.ObjectName) {
|
|
FreeADsStr(lpAdsValue->Hold.ObjectName);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_NT_SECURITY_DESCRIPTOR:
|
|
if (lpAdsValue->SecurityDescriptor.lpValue) {
|
|
FreeADsMem(lpAdsValue->SecurityDescriptor.lpValue);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_OBJECT_CLASS:
|
|
FreeADsStr(lpAdsValue->ClassName);
|
|
break;
|
|
|
|
case ADSTYPE_DN_WITH_BINARY:
|
|
if (lpAdsValue->pDNWithBinary) {
|
|
|
|
if (lpAdsValue->pDNWithBinary->lpBinaryValue) {
|
|
FreeADsMem(lpAdsValue->pDNWithBinary->lpBinaryValue);
|
|
}
|
|
|
|
if (lpAdsValue->pDNWithBinary->pszDNString) {
|
|
FreeADsStr(lpAdsValue->pDNWithBinary->pszDNString);
|
|
}
|
|
FreeADsMem(lpAdsValue->pDNWithBinary);
|
|
}
|
|
break;
|
|
|
|
case ADSTYPE_DN_WITH_STRING:
|
|
if (lpAdsValue->pDNWithString) {
|
|
if (lpAdsValue->pDNWithString->pszStringValue) {
|
|
FreeADsMem(lpAdsValue->pDNWithString->pszStringValue);
|
|
}
|
|
|
|
if (lpAdsValue->pDNWithString->pszDNString) {
|
|
FreeADsStr(lpAdsValue->pDNWithString->pszDNString);
|
|
}
|
|
FreeADsMem(lpAdsValue->pDNWithString);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
memset(lpAdsValue, 0, sizeof(ADSVALUE));
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyDNString(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_DN_STRING){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_DN_STRING;
|
|
|
|
lpAdsDestValue->DNString =
|
|
AllocADsStr(
|
|
lpAdsSrcValue->DNString
|
|
);
|
|
|
|
if (lpAdsSrcValue->DNString
|
|
&& !lpAdsDestValue->DNString) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyCaseExactString(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_CASE_EXACT_STRING){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_CASE_EXACT_STRING;
|
|
|
|
lpAdsDestValue->CaseExactString =
|
|
AllocADsStr(
|
|
lpAdsSrcValue->CaseExactString
|
|
);
|
|
|
|
if (lpAdsSrcValue->CaseExactString
|
|
&& !lpAdsDestValue->CaseExactString) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsCopyCaseIgnoreString(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_CASE_IGNORE_STRING){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_CASE_IGNORE_STRING;
|
|
|
|
lpAdsDestValue->CaseIgnoreString =
|
|
AllocADsStr(
|
|
lpAdsSrcValue->CaseIgnoreString
|
|
);
|
|
if (lpAdsSrcValue->CaseIgnoreString
|
|
&& !lpAdsDestValue->CaseIgnoreString) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsCopyPrintableString(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_PRINTABLE_STRING){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_PRINTABLE_STRING;
|
|
|
|
lpAdsDestValue->PrintableString =
|
|
AllocADsStr(
|
|
lpAdsSrcValue->PrintableString
|
|
);
|
|
|
|
if (lpAdsSrcValue->PrintableString
|
|
&& !lpAdsDestValue->PrintableString) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyNumericString(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_NUMERIC_STRING){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_NUMERIC_STRING;
|
|
|
|
lpAdsDestValue->NumericString =
|
|
AllocADsStr(
|
|
lpAdsSrcValue->NumericString
|
|
);
|
|
|
|
if (lpAdsSrcValue->NumericString
|
|
&& !lpAdsDestValue->NumericString) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
|
|
HRESULT
|
|
AdsCopyBoolean(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_BOOLEAN){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_BOOLEAN;
|
|
|
|
lpAdsDestValue->Boolean =
|
|
lpAdsSrcValue->Boolean;
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsCopyInteger(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_INTEGER){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_INTEGER;
|
|
|
|
lpAdsDestValue->Integer =
|
|
lpAdsSrcValue->Integer;
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsCopyLargeInteger(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_LARGE_INTEGER){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_LARGE_INTEGER;
|
|
|
|
lpAdsDestValue->LargeInteger =
|
|
lpAdsSrcValue->LargeInteger;
|
|
|
|
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyOctetString(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
LPBYTE lpByteStream = NULL;
|
|
DWORD dwNumBytes = 0;
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_OCTET_STRING){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_OCTET_STRING;
|
|
|
|
dwNumBytes = lpAdsSrcValue->OctetString.dwLength;
|
|
lpByteStream = (LPBYTE)AllocADsMem(dwNumBytes);
|
|
|
|
if (dwNumBytes && !lpByteStream) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
lpByteStream,
|
|
lpAdsSrcValue->OctetString.lpValue,
|
|
dwNumBytes
|
|
);
|
|
|
|
lpAdsDestValue->OctetString.dwLength = dwNumBytes;
|
|
|
|
lpAdsDestValue->OctetString.lpValue = lpByteStream;
|
|
|
|
error :
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsCopyProvSpecific(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
LPBYTE lpByteStream = NULL;
|
|
DWORD dwNumBytes = 0;
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_PROV_SPECIFIC){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_PROV_SPECIFIC;
|
|
|
|
dwNumBytes = lpAdsSrcValue->ProviderSpecific.dwLength;
|
|
lpByteStream = (LPBYTE)AllocADsMem(dwNumBytes);
|
|
|
|
if (!lpByteStream && dwNumBytes) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
lpByteStream,
|
|
lpAdsSrcValue->ProviderSpecific.lpValue,
|
|
dwNumBytes
|
|
);
|
|
|
|
lpAdsDestValue->ProviderSpecific.dwLength = dwNumBytes;
|
|
|
|
lpAdsDestValue->ProviderSpecific.lpValue = lpByteStream;
|
|
|
|
RRETURN(hr);
|
|
error:
|
|
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
//
|
|
// Was overloaded to handle IDispatch.
|
|
// Removed overloading during code cleanup.
|
|
//
|
|
HRESULT
|
|
AdsCopyNTSecurityDescriptor(
|
|
PADSVALUE lpAdsSrcValue,
|
|
CPropertyValue * lpPropValue,
|
|
LPWSTR pszServerName,
|
|
CCredentials& Credentials,
|
|
BOOL fNTDSType
|
|
)
|
|
{
|
|
LPBYTE lpByteStream = NULL;
|
|
DWORD dwNumBytes = 0;
|
|
HRESULT hr = S_OK;
|
|
PADSVALUE lpAdsDestValue = lpPropValue->getADsValue();
|
|
VARIANT vVarSec;
|
|
|
|
VariantInit(&vVarSec);
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_NT_SECURITY_DESCRIPTOR){
|
|
VariantClear(&vVarSec);
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_NT_SECURITY_DESCRIPTOR;
|
|
|
|
dwNumBytes = lpAdsSrcValue->OctetString.dwLength;
|
|
lpByteStream = (LPBYTE)AllocADsMem(dwNumBytes);
|
|
|
|
if (!lpByteStream && dwNumBytes) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
lpByteStream,
|
|
lpAdsSrcValue->OctetString.lpValue,
|
|
dwNumBytes
|
|
);
|
|
|
|
|
|
//
|
|
// Now attempt to conver to security descriptor
|
|
//
|
|
hr = ConvertSecDescriptorToVariant(
|
|
pszServerName,
|
|
Credentials,
|
|
lpAdsSrcValue->OctetString.lpValue,
|
|
&vVarSec,
|
|
fNTDSType
|
|
);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = lpPropValue->put_SecurityDescriptor(V_DISPATCH(&vVarSec));
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
lpAdsDestValue->OctetString.dwLength = dwNumBytes;
|
|
|
|
lpAdsDestValue->OctetString.lpValue = lpByteStream;
|
|
|
|
VariantClear(&vVarSec);
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if(lpByteStream){
|
|
FreeADsMem(lpByteStream);
|
|
}
|
|
|
|
VariantClear(&vVarSec);
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsCopyTime(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_UTC_TIME){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_UTC_TIME;
|
|
|
|
lpAdsDestValue->UTCTime = lpAdsSrcValue->UTCTime;
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyEmail(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_EMAIL){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_EMAIL;
|
|
|
|
lpAdsDestValue->Email.Type = lpAdsSrcValue->Email.Type;
|
|
lpAdsDestValue->Email.Address = AllocADsStr(lpAdsSrcValue->Email.Address);
|
|
if (!lpAdsDestValue->Email.Address && lpAdsSrcValue->Email.Address) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
error:
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsCopyNetAddress(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
LPBYTE lpByteStream = NULL;
|
|
DWORD dwNumBytes = 0;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_NETADDRESS){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pNetAddress) {
|
|
RRETURN(hr = E_FAIL);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_NETADDRESS;
|
|
|
|
lpAdsDestValue->pNetAddress = (PADS_NETADDRESS)AllocADsMem(sizeof(ADS_NETADDRESS));
|
|
if (!lpAdsDestValue->pNetAddress) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
lpAdsDestValue->pNetAddress->AddressType = lpAdsSrcValue->pNetAddress->AddressType;
|
|
|
|
dwNumBytes = lpAdsSrcValue->pNetAddress->AddressLength;
|
|
lpByteStream = (LPBYTE)AllocADsMem(dwNumBytes);
|
|
if (!lpByteStream && dwNumBytes) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
memcpy(
|
|
lpByteStream,
|
|
lpAdsSrcValue->pNetAddress->Address,
|
|
dwNumBytes
|
|
);
|
|
|
|
lpAdsDestValue->pNetAddress->AddressLength = dwNumBytes;
|
|
lpAdsDestValue->pNetAddress->Address = lpByteStream;
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if(lpAdsDestValue->pNetAddress) {
|
|
FreeADsMem(lpAdsDestValue->pNetAddress);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyOctetList(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
PADS_OCTET_LIST pCurrent = NULL;
|
|
PADS_OCTET_LIST pResult = NULL;
|
|
PADS_OCTET_LIST pNext = NULL;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_OCTET_LIST){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
if (!lpAdsSrcValue->pOctetList) {
|
|
RRETURN(hr = E_FAIL);
|
|
}
|
|
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_OCTET_LIST;
|
|
|
|
lpAdsDestValue->pOctetList = (PADS_OCTET_LIST)AllocADsMem(sizeof(ADS_OCTET_LIST));
|
|
if (!lpAdsDestValue->pOctetList) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
pCurrent = lpAdsSrcValue->pOctetList;
|
|
pResult = lpAdsDestValue->pOctetList;
|
|
hr = CopyOctetString(
|
|
pCurrent->Length,
|
|
pCurrent->Data,
|
|
&pResult->Length,
|
|
&pResult->Data);
|
|
BAIL_ON_FAILURE(hr);
|
|
while (pCurrent->Next) {
|
|
pResult->Next = (PADS_OCTET_LIST)AllocADsMem(
|
|
sizeof(ADS_OCTET_LIST));
|
|
if (!pResult->Next) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
pResult = pResult->Next;
|
|
pCurrent = pCurrent->Next;
|
|
hr = CopyOctetString(
|
|
pCurrent->Length,
|
|
pCurrent->Data,
|
|
&pResult->Length,
|
|
&pResult->Data);
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
pResult->Next = NULL;
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
pResult = lpAdsDestValue->pOctetList;
|
|
while ( pResult) {
|
|
pNext = pResult->Next;
|
|
FreeADsMem(pResult);
|
|
pResult = pNext;
|
|
}
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyCaseIgnoreList(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
PADS_CASEIGNORE_LIST pCurrent = NULL;
|
|
PADS_CASEIGNORE_LIST pResult = NULL;
|
|
PADS_CASEIGNORE_LIST pNext = NULL;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_CASEIGNORE_LIST){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pCaseIgnoreList) {
|
|
RRETURN(hr = E_FAIL);
|
|
}
|
|
|
|
lpAdsDestValue->pCaseIgnoreList = (PADS_CASEIGNORE_LIST)AllocADsMem(sizeof(ADS_CASEIGNORE_LIST));
|
|
if (!lpAdsDestValue->pCaseIgnoreList) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_CASEIGNORE_LIST;
|
|
pCurrent = lpAdsSrcValue->pCaseIgnoreList;
|
|
pResult = lpAdsDestValue->pCaseIgnoreList;
|
|
pResult->String = AllocADsStr(pCurrent->String);
|
|
if (!pResult->String && pCurrent->String) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
while (pCurrent->Next) {
|
|
pResult->Next = (PADS_CASEIGNORE_LIST)AllocADsMem(
|
|
sizeof(ADS_CASEIGNORE_LIST));
|
|
if (!pResult->Next) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
pResult = pResult->Next;
|
|
pCurrent = pCurrent->Next;
|
|
pResult->String = AllocADsStr(pCurrent->String);
|
|
if (!pResult->String && pCurrent->String) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
}
|
|
pResult->Next = NULL;
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
pResult = lpAdsDestValue->pCaseIgnoreList;
|
|
while ( pResult) {
|
|
pNext = pResult->Next;
|
|
if (pResult->String) {
|
|
FreeADsStr(pResult->String);
|
|
}
|
|
FreeADsMem(pResult);
|
|
pResult = pNext;
|
|
}
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyPath(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_PATH){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pPath) {
|
|
RRETURN(hr = E_FAIL);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_PATH;
|
|
lpAdsDestValue->pPath = (PADS_PATH)AllocADsMem(sizeof(ADS_PATH));
|
|
if (!lpAdsDestValue->pPath) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
lpAdsDestValue->pPath->Type = lpAdsSrcValue->pPath->Type;
|
|
lpAdsDestValue->pPath->VolumeName = AllocADsStr(lpAdsSrcValue->pPath->VolumeName);
|
|
if (!lpAdsDestValue->pPath->VolumeName && lpAdsSrcValue->pPath->VolumeName) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
lpAdsDestValue->pPath->Path = AllocADsStr(lpAdsSrcValue->pPath->Path);
|
|
if (!lpAdsDestValue->pPath->Path && lpAdsSrcValue->pPath->Path) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if (lpAdsDestValue->pPath) {
|
|
if (lpAdsDestValue->pPath->VolumeName) {
|
|
FreeADsStr(lpAdsDestValue->pPath->VolumeName);
|
|
}
|
|
FreeADsMem(lpAdsDestValue->pPath);
|
|
}
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyPostalAddress(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
long i;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_POSTALADDRESS){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pPostalAddress) {
|
|
RRETURN(hr = E_FAIL);
|
|
}
|
|
|
|
lpAdsDestValue->pPostalAddress = (PADS_POSTALADDRESS)AllocADsMem(sizeof(ADS_POSTALADDRESS));
|
|
if (!lpAdsDestValue->pPostalAddress) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
lpAdsDestValue->dwType = ADSTYPE_POSTALADDRESS;
|
|
|
|
for (i=0;i<6;i++) {
|
|
lpAdsDestValue->pPostalAddress->PostalAddress[i] = AllocADsStr(lpAdsSrcValue->pPostalAddress->PostalAddress[i]);
|
|
if (!lpAdsDestValue->pPostalAddress->PostalAddress[i] &&
|
|
lpAdsSrcValue->pPostalAddress->PostalAddress[i]) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if (lpAdsDestValue->pPostalAddress) {
|
|
|
|
//
|
|
// Ideally I would need to loop only until i<5
|
|
// Being extra cautious over here in case some other code gets
|
|
// added after the for loop that returns an error which would
|
|
// bring us over here
|
|
//
|
|
|
|
for (i=0;i<6;i++) {
|
|
if (lpAdsDestValue->pPostalAddress->PostalAddress[i]) {
|
|
FreeADsStr(lpAdsDestValue->pPostalAddress->PostalAddress[i]);
|
|
}
|
|
}
|
|
|
|
FreeADsMem(lpAdsDestValue->pPostalAddress);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyBackLink(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_BACKLINK){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_BACKLINK;
|
|
|
|
lpAdsDestValue->BackLink.RemoteID = lpAdsSrcValue->BackLink.RemoteID;
|
|
lpAdsDestValue->BackLink.ObjectName = AllocADsStr(lpAdsSrcValue->BackLink.ObjectName);
|
|
if (!lpAdsDestValue->BackLink.ObjectName &&
|
|
lpAdsSrcValue->BackLink.ObjectName) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
error:
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyTypedName(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
LPWSTR ObjectName;
|
|
DWORD Level;
|
|
DWORD Interval;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_TYPEDNAME){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pTypedName) {
|
|
RRETURN(hr = E_FAIL);
|
|
}
|
|
lpAdsDestValue->dwType = ADSTYPE_TYPEDNAME;
|
|
lpAdsDestValue->pTypedName = (PADS_TYPEDNAME)AllocADsMem(sizeof(ADS_TYPEDNAME));
|
|
if (!lpAdsDestValue->pTypedName) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
lpAdsDestValue->pTypedName->Level = lpAdsSrcValue->pTypedName->Level;
|
|
lpAdsDestValue->pTypedName->Interval = lpAdsSrcValue->pTypedName->Interval;
|
|
lpAdsDestValue->pTypedName->ObjectName = AllocADsStr(lpAdsSrcValue->pTypedName->ObjectName);
|
|
if (!lpAdsDestValue->pTypedName->ObjectName &&
|
|
lpAdsSrcValue->pTypedName->ObjectName) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
if (lpAdsDestValue->pTypedName) {
|
|
FreeADsMem(lpAdsDestValue->pTypedName);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyHold(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_HOLD){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_HOLD;
|
|
|
|
lpAdsDestValue->Hold.Amount = lpAdsSrcValue->Hold.Amount;
|
|
lpAdsDestValue->Hold.ObjectName = AllocADsStr(lpAdsSrcValue->Hold.ObjectName);
|
|
if (!lpAdsDestValue->Hold.ObjectName &&
|
|
lpAdsSrcValue->Hold.ObjectName) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
error:
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyReplicaPointer(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
LPBYTE lpByteStream = NULL;
|
|
DWORD dwNumBytes = 0;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_REPLICAPOINTER){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pReplicaPointer) {
|
|
RRETURN(hr = E_FAIL);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_REPLICAPOINTER;
|
|
lpAdsDestValue->pReplicaPointer = (PADS_REPLICAPOINTER)AllocADsMem(sizeof(ADS_REPLICAPOINTER));
|
|
if (!lpAdsDestValue->pReplicaPointer) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
lpAdsDestValue->pReplicaPointer->ReplicaType = lpAdsSrcValue->pReplicaPointer->ReplicaType;
|
|
lpAdsDestValue->pReplicaPointer->ReplicaNumber = lpAdsSrcValue->pReplicaPointer->ReplicaNumber;
|
|
lpAdsDestValue->pReplicaPointer->Count = lpAdsSrcValue->pReplicaPointer->Count;
|
|
lpAdsDestValue->pReplicaPointer->ServerName = AllocADsStr(lpAdsSrcValue->pReplicaPointer->ServerName);
|
|
if (!lpAdsDestValue->pReplicaPointer->ServerName &&
|
|
lpAdsSrcValue->pReplicaPointer->ServerName) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
//
|
|
// Doing NetAddress
|
|
//
|
|
|
|
lpAdsDestValue->pReplicaPointer->ReplicaAddressHints = (PADS_NETADDRESS)AllocADsMem(sizeof(ADS_NETADDRESS));
|
|
if (!lpAdsDestValue->pReplicaPointer->ReplicaAddressHints) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
lpAdsDestValue->pReplicaPointer->ReplicaAddressHints->AddressType = lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints->AddressType;
|
|
|
|
hr = CopyOctetString(
|
|
lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints->AddressLength,
|
|
lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints->Address,
|
|
&lpAdsDestValue->pReplicaPointer->ReplicaAddressHints->AddressLength,
|
|
&lpAdsDestValue->pReplicaPointer->ReplicaAddressHints->Address);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
if (lpAdsDestValue->pReplicaPointer) {
|
|
if (lpAdsDestValue->pReplicaPointer->ServerName) {
|
|
FreeADsStr(lpAdsDestValue->pReplicaPointer->ServerName);
|
|
}
|
|
if (lpAdsDestValue->pReplicaPointer->ReplicaAddressHints) {
|
|
FreeADsMem(lpAdsDestValue->pReplicaPointer->ReplicaAddressHints);
|
|
}
|
|
FreeADsMem(lpAdsDestValue->pReplicaPointer);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyFaxNumber(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
LPBYTE lpByteStream = NULL;
|
|
DWORD dwNumBytes = 0;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_FAXNUMBER){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pFaxNumber) {
|
|
RRETURN(hr = E_FAIL);
|
|
}
|
|
|
|
lpAdsDestValue->pFaxNumber = (PADS_FAXNUMBER)AllocADsMem(sizeof(ADS_FAXNUMBER));
|
|
if (!lpAdsDestValue->pFaxNumber) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
lpAdsDestValue->dwType = ADSTYPE_FAXNUMBER;
|
|
|
|
dwNumBytes = lpAdsSrcValue->pFaxNumber->NumberOfBits;
|
|
lpByteStream = (LPBYTE)AllocADsMem(dwNumBytes);
|
|
if (!lpByteStream && dwNumBytes) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
memcpy(
|
|
lpByteStream,
|
|
lpAdsSrcValue->pFaxNumber->Parameters,
|
|
dwNumBytes
|
|
);
|
|
|
|
lpAdsDestValue->pFaxNumber->NumberOfBits = dwNumBytes;
|
|
lpAdsDestValue->pFaxNumber->Parameters = lpByteStream;
|
|
|
|
lpAdsDestValue->pFaxNumber->TelephoneNumber = AllocADsStr(lpAdsSrcValue->pFaxNumber->TelephoneNumber);
|
|
if (!lpAdsDestValue->pFaxNumber->TelephoneNumber &&
|
|
lpAdsSrcValue->pFaxNumber->TelephoneNumber) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if (lpAdsDestValue->pFaxNumber) {
|
|
FreeADsMem(lpAdsDestValue->pFaxNumber);
|
|
}
|
|
if (lpByteStream) {
|
|
FreeADsMem(lpByteStream);
|
|
}
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyNDSTimestamp(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpAdsSrcValue->dwType != ADSTYPE_TIMESTAMP){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_TIMESTAMP;
|
|
|
|
lpAdsDestValue->Timestamp.WholeSeconds = lpAdsSrcValue->Timestamp.WholeSeconds;
|
|
lpAdsDestValue->Timestamp.EventID = lpAdsSrcValue->Timestamp.EventID;
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopyDNWithBinary(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
PADS_DN_WITH_BINARY pDestDNBin = NULL;
|
|
PADS_DN_WITH_BINARY pSrcDNBin = NULL;
|
|
|
|
if (lpAdsSrcValue->dwType != ADSTYPE_DN_WITH_BINARY) {
|
|
BAIL_ON_FAILURE(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pDNWithBinary) {
|
|
//
|
|
// No source object so return
|
|
//
|
|
RRETURN(hr);
|
|
}
|
|
|
|
pSrcDNBin = lpAdsSrcValue->pDNWithBinary;
|
|
|
|
pDestDNBin = (PADS_DN_WITH_BINARY)
|
|
AllocADsMem(sizeof(ADS_DN_WITH_BINARY));
|
|
|
|
if (!pDestDNBin) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
if (pSrcDNBin->dwLength) {
|
|
|
|
//
|
|
// Copy the octet string over.
|
|
//
|
|
pDestDNBin->lpBinaryValue = (LPBYTE) AllocADsMem(pSrcDNBin->dwLength);
|
|
if (!pDestDNBin->lpBinaryValue && pSrcDNBin->dwLength) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
pDestDNBin->dwLength = pSrcDNBin->dwLength;
|
|
|
|
memcpy(
|
|
pDestDNBin->lpBinaryValue,
|
|
pSrcDNBin->lpBinaryValue,
|
|
pSrcDNBin->dwLength
|
|
);
|
|
}
|
|
|
|
if (pSrcDNBin->pszDNString) {
|
|
//
|
|
// Copy the DNString value over
|
|
//
|
|
pDestDNBin->pszDNString = AllocADsStr(pSrcDNBin->pszDNString);
|
|
if (!pDestDNBin->pszDNString && pSrcDNBin->pszDNString) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
}
|
|
|
|
lpAdsDestValue->pDNWithBinary = pDestDNBin;
|
|
lpAdsDestValue->dwType = ADSTYPE_DN_WITH_BINARY;
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if (pDestDNBin) {
|
|
//
|
|
// Clean up the mem for string and byte array
|
|
//
|
|
if (pDestDNBin->pszDNString) {
|
|
FreeADsStr(pDestDNBin->pszDNString);
|
|
}
|
|
|
|
if (pDestDNBin->lpBinaryValue) {
|
|
FreeADsMem(pDestDNBin->lpBinaryValue);
|
|
}
|
|
FreeADsMem(pDestDNBin);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsCopyDNWithString(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
PADS_DN_WITH_STRING pDestDNStr = NULL;
|
|
PADS_DN_WITH_STRING pSrcDNStr = NULL;
|
|
|
|
if (lpAdsSrcValue->dwType != ADSTYPE_DN_WITH_STRING) {
|
|
BAIL_ON_FAILURE(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!lpAdsSrcValue->pDNWithString) {
|
|
//
|
|
// No source object so return
|
|
//
|
|
RRETURN(hr);
|
|
}
|
|
|
|
pSrcDNStr = lpAdsSrcValue->pDNWithString;
|
|
|
|
pDestDNStr = (PADS_DN_WITH_STRING)
|
|
AllocADsMem(sizeof(ADS_DN_WITH_STRING));
|
|
|
|
if (!pDestDNStr) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
if (pSrcDNStr->pszStringValue) {
|
|
|
|
//
|
|
// Copy the string over.
|
|
//
|
|
pDestDNStr->pszStringValue = AllocADsStr(pSrcDNStr->pszStringValue);
|
|
if (!pDestDNStr->pszStringValue && pSrcDNStr->pszStringValue) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
}
|
|
|
|
if (pSrcDNStr->pszDNString) {
|
|
//
|
|
// Copy the DNString value over
|
|
//
|
|
pDestDNStr->pszDNString = AllocADsStr(pSrcDNStr->pszDNString);
|
|
if (!pDestDNStr->pszDNString && pSrcDNStr->pszDNString) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
}
|
|
|
|
lpAdsDestValue->pDNWithString = pDestDNStr;
|
|
lpAdsDestValue->dwType = ADSTYPE_DN_WITH_STRING;
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if (pDestDNStr) {
|
|
//
|
|
// Clean up the mem for string and byte array
|
|
//
|
|
if (pDestDNStr->pszDNString) {
|
|
FreeADsStr(pDestDNStr->pszDNString);
|
|
}
|
|
|
|
if (pDestDNStr->pszStringValue) {
|
|
FreeADsMem(pDestDNStr->pszStringValue);
|
|
}
|
|
FreeADsMem(pDestDNStr);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
AdsCopy(
|
|
PADSVALUE lpAdsSrcValue,
|
|
PADSVALUE lpAdsDestValue
|
|
)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
switch (lpAdsSrcValue->dwType){
|
|
|
|
case ADSTYPE_DN_STRING:
|
|
hr = AdsCopyDNString(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_CASE_EXACT_STRING:
|
|
hr = AdsCopyCaseExactString(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
|
|
case ADSTYPE_CASE_IGNORE_STRING:
|
|
hr = AdsCopyCaseIgnoreString(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_PRINTABLE_STRING:
|
|
hr = AdsCopyPrintableString(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_NUMERIC_STRING:
|
|
hr = AdsCopyNumericString(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
|
|
case ADSTYPE_BOOLEAN:
|
|
hr = AdsCopyBoolean(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_INTEGER:
|
|
hr = AdsCopyInteger(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_LARGE_INTEGER:
|
|
hr = AdsCopyLargeInteger(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_OCTET_STRING:
|
|
hr = AdsCopyOctetString(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_PROV_SPECIFIC:
|
|
hr = AdsCopyProvSpecific(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_UTC_TIME:
|
|
hr = AdsCopyTime(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_CASEIGNORE_LIST:
|
|
hr = AdsCopyCaseIgnoreList(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_FAXNUMBER:
|
|
hr = AdsCopyFaxNumber(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_NETADDRESS:
|
|
hr = AdsCopyNetAddress(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_OCTET_LIST:
|
|
hr = AdsCopyOctetList(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_EMAIL:
|
|
hr = AdsCopyEmail(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_PATH:
|
|
hr = AdsCopyPath(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_REPLICAPOINTER:
|
|
hr = AdsCopyReplicaPointer(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_TIMESTAMP:
|
|
hr = AdsCopyNDSTimestamp(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_POSTALADDRESS:
|
|
hr = AdsCopyPostalAddress(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_BACKLINK:
|
|
hr = AdsCopyBackLink(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_TYPEDNAME:
|
|
hr = AdsCopyTypedName(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
case ADSTYPE_HOLD:
|
|
hr = AdsCopyHold(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
|
|
case ADSTYPE_DN_WITH_BINARY:
|
|
hr = AdsCopyDNWithBinary(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_DN_WITH_STRING:
|
|
hr = AdsCopyDNWithString(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
|
|
case ADSTYPE_NT_SECURITY_DESCRIPTOR:
|
|
//
|
|
// This should be handled elsewhere not here !
|
|
//
|
|
ADsAssert(!"Invalid option to adscopy");
|
|
break;
|
|
|
|
default:
|
|
hr = E_FAIL;
|
|
break;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
//
|
|
// This routine is typically used by GetPropertyItem calls.
|
|
//
|
|
HRESULT
|
|
AdsCopyADsValueToPropObj(
|
|
PADSVALUE lpAdsSrcValue,
|
|
CPropertyValue* lpPropObj,
|
|
LPWSTR pszServerName,
|
|
CCredentials* pCredentials,
|
|
BOOL fNTDSType
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
PADSVALUE lpAdsDestValue = lpPropObj->getADsValue();
|
|
CCredentials localCredentials(NULL, NULL, 0);
|
|
|
|
switch (lpAdsSrcValue->dwType){
|
|
|
|
|
|
case ADSTYPE_NT_SECURITY_DESCRIPTOR:
|
|
|
|
if (pCredentials) {
|
|
localCredentials = *pCredentials;
|
|
}
|
|
hr = AdsCopyNTSecurityDescriptor(
|
|
lpAdsSrcValue,
|
|
lpPropObj,
|
|
pszServerName,
|
|
localCredentials,
|
|
fNTDSType
|
|
);
|
|
break;
|
|
|
|
|
|
default:
|
|
hr = AdsCopy(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
|
|
break;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
//
|
|
// This routine is typically used from PutPropertyItem.
|
|
//
|
|
HRESULT
|
|
AdsCopyPropObjToADsValue(
|
|
CPropertyValue *lpPropObj,
|
|
PADSVALUE lpAdsDestValue,
|
|
LPWSTR pszServerName,
|
|
CCredentials* pCredentials,
|
|
BOOL fNTDSType
|
|
)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
PADSVALUE lpAdsSrcValue = lpPropObj->getADsValue();
|
|
DWORD dwDataType = 0;
|
|
DWORD dwSDLength = 0;
|
|
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
|
|
CCredentials locCredentials(NULL, NULL, 0);
|
|
IDispatch *pIDispatch = NULL;
|
|
IADsSecurityDescriptor *pIADsSecDesc = NULL;
|
|
|
|
switch (lpAdsSrcValue->dwType) {
|
|
|
|
case ADSTYPE_NT_SECURITY_DESCRIPTOR :
|
|
|
|
dwDataType = lpPropObj->getExtendedDataTypeInfo();
|
|
//
|
|
// if we have the octet blob send it back
|
|
//
|
|
if (dwDataType == CPropertyValue::VAL_IDISPATCH_SECDESC_ALL) {
|
|
|
|
hr = AdsCopyOctetString(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
else if (dwDataType == CPropertyValue::VAL_IDISPATCH_SECDESC_ONLY) {
|
|
|
|
if (pCredentials) {
|
|
locCredentials = *pCredentials;
|
|
}
|
|
|
|
pIDispatch = lpPropObj->getDispatchPointer();
|
|
|
|
if (pIDispatch) {
|
|
|
|
hr = pIDispatch->QueryInterface(
|
|
IID_IADsSecurityDescriptor,
|
|
(void **) &pIADsSecDesc
|
|
);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
hr = ConvertSecurityDescriptorToSecDes(
|
|
pszServerName,
|
|
locCredentials,
|
|
pIADsSecDesc,
|
|
&pSecurityDescriptor,
|
|
&dwSDLength,
|
|
fNTDSType
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
lpAdsDestValue->OctetString.lpValue
|
|
= (LPBYTE) AllocADsMem(dwSDLength);
|
|
|
|
if (!(lpAdsDestValue->OctetString.lpValue) && dwSDLength) {
|
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
|
}
|
|
|
|
memcpy(
|
|
lpAdsDestValue->OctetString.lpValue,
|
|
pSecurityDescriptor,
|
|
dwSDLength
|
|
);
|
|
|
|
lpAdsDestValue->dwType = ADSTYPE_OCTET_STRING;
|
|
lpAdsDestValue->OctetString.dwLength = dwSDLength;
|
|
|
|
} // secdesc idispatch only
|
|
break;
|
|
|
|
default:
|
|
|
|
hr = AdsCopy(
|
|
lpAdsSrcValue,
|
|
lpAdsDestValue
|
|
);
|
|
break;
|
|
} // end case
|
|
|
|
error :
|
|
|
|
//
|
|
// Needs to be executed in all cases, currently only ret is below
|
|
//
|
|
if (pIADsSecDesc) {
|
|
pIADsSecDesc->Release();
|
|
}
|
|
|
|
if (pSecurityDescriptor) {
|
|
FreeADsMem(pSecurityDescriptor);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
PropVariantToAdsType(
|
|
PVARIANT pVariant,
|
|
DWORD dwNumVariant,
|
|
PADSVALUE *ppAdsValues,
|
|
PDWORD pdwNumValues
|
|
)
|
|
{
|
|
return(PropVariantToAdsType2(
|
|
pVariant,
|
|
dwNumVariant,
|
|
ppAdsValues,
|
|
pdwNumValues,
|
|
NULL, // serverName,
|
|
NULL, // pCredentials
|
|
TRUE // NTDS Type
|
|
));
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
PropVariantToAdsType2(
|
|
PVARIANT pVariant,
|
|
DWORD dwNumVariant,
|
|
PADSVALUE *ppAdsValues,
|
|
PDWORD pdwNumValues,
|
|
LPWSTR pszServerName,
|
|
CCredentials* pCredentials,
|
|
BOOL fNTDSType
|
|
)
|
|
{
|
|
DWORD i = 0;
|
|
VARIANT * pVar = NULL;
|
|
DWORD dwCount = 0;
|
|
IDispatch FAR * pDispatch = NULL;
|
|
IADsValue FAR * pPropValue = NULL;
|
|
PADSVALUE pADsValues = NULL;
|
|
HRESULT hr = S_OK;
|
|
LPWSTR pszUserName = NULL;
|
|
LPWSTR pszPassWord = NULL;
|
|
DWORD dwFlags = 0;
|
|
|
|
pADsValues = (PADSVALUE)AllocADsMem(dwNumVariant * sizeof(ADSVALUE));
|
|
if (!pADsValues && dwNumVariant) {
|
|
RRETURN(E_OUTOFMEMORY);
|
|
}
|
|
|
|
//
|
|
// If !pCredentials, use the initialized values as they
|
|
// represent an object with CCredentials(NULL, NULL, 0)
|
|
//
|
|
if (pCredentials) {
|
|
|
|
hr = pCredentials->GetUserName(&pszUserName);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pCredentials->GetPassword(&pszPassWord);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
dwFlags = pCredentials->GetAuthFlags();
|
|
|
|
}
|
|
|
|
for (i = 0; i < dwNumVariant; i++ ) {
|
|
|
|
pVar = pVariant + i;
|
|
|
|
pDispatch = V_DISPATCH(pVar);
|
|
|
|
hr = pDispatch->QueryInterface(
|
|
IID_IADsValue,
|
|
(void **)&pPropValue
|
|
);
|
|
CONTINUE_ON_FAILURE(hr);
|
|
|
|
|
|
hr = pPropValue->ConvertPropertyValueToADsValue2(
|
|
(pADsValues + dwCount),
|
|
pszServerName,
|
|
pszUserName,
|
|
pszPassWord,
|
|
dwFlags,
|
|
fNTDSType
|
|
);
|
|
pPropValue->Release();
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
dwCount++;
|
|
|
|
}
|
|
|
|
*ppAdsValues = pADsValues;
|
|
*pdwNumValues = dwCount;
|
|
|
|
error:
|
|
|
|
if (pszUserName) {
|
|
FreeADsStr(pszUserName);
|
|
}
|
|
|
|
if (pszPassWord) {
|
|
SecureZeroMemory(pszPassWord, wcslen(pszPassWord)*sizeof(WCHAR));
|
|
FreeADsStr(pszPassWord);
|
|
}
|
|
|
|
if (FAILED(hr) && pADsValues) {
|
|
FreeADsMem(pADsValues);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT
|
|
AdsTypeToPropVariant2(
|
|
PADSVALUE pAdsValues,
|
|
DWORD dwNumValues,
|
|
PVARIANT pVarDestObjects,
|
|
LPWSTR pszServerName,
|
|
CCredentials* pCredentials,
|
|
BOOL fNTDSType
|
|
)
|
|
{
|
|
|
|
long i = 0;
|
|
HRESULT hr = S_OK;
|
|
CPropertyValue * pAdsValue = NULL;
|
|
|
|
VariantInit( pVarDestObjects );
|
|
|
|
//
|
|
// The following are for handling are multi-value properties
|
|
//
|
|
|
|
SAFEARRAY *aList = NULL;
|
|
SAFEARRAYBOUND aBound;
|
|
|
|
aBound.lLbound = 0;
|
|
aBound.cElements = dwNumValues;
|
|
|
|
aList = SafeArrayCreate( VT_VARIANT, 1, &aBound );
|
|
|
|
if ( aList == NULL )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
for ( i = 0; i < (long)dwNumValues; i++ )
|
|
{
|
|
VARIANT v;
|
|
IDispatch FAR * pDispatch = NULL;
|
|
|
|
VariantInit(&v);
|
|
|
|
hr = CPropertyValue::AllocatePropertyValueObject(&pAdsValue);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pAdsValue->ConvertADsValueToPropertyValue2(
|
|
pAdsValues + i,
|
|
pszServerName,
|
|
pCredentials,
|
|
fNTDSType
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pAdsValue->QueryInterface(
|
|
IID_IDispatch,
|
|
(void **)&pDispatch
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
|
|
V_DISPATCH(&v) = pDispatch;
|
|
V_VT(&v) = VT_DISPATCH;
|
|
|
|
if (pAdsValue) {
|
|
pAdsValue->Release();
|
|
pAdsValue = NULL;
|
|
}
|
|
|
|
hr = SafeArrayPutElement( aList, &i, &v );
|
|
VariantClear(&v);
|
|
pDispatch = NULL;
|
|
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
V_VT(pVarDestObjects) = VT_ARRAY | VT_VARIANT;
|
|
V_ARRAY(pVarDestObjects) = aList;
|
|
|
|
RRETURN(S_OK);
|
|
|
|
error:
|
|
|
|
if ( aList )
|
|
SafeArrayDestroy( aList );
|
|
|
|
if(pAdsValue)
|
|
{
|
|
pAdsValue->Release();
|
|
pAdsValue = NULL;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
AdsTypeToPropVariant(
|
|
PADSVALUE pAdsValues,
|
|
DWORD dwNumValues,
|
|
PVARIANT pVarDestObjects
|
|
)
|
|
{
|
|
RRETURN( AdsTypeToPropVariant2(
|
|
pAdsValues,
|
|
dwNumValues,
|
|
pVarDestObjects,
|
|
NULL, // serverName
|
|
NULL, // pCredentials
|
|
TRUE // serverType
|
|
)
|
|
);
|
|
}
|
|
|
|
|
|
void
|
|
AdsFreeAdsValues(
|
|
PADSVALUE pAdsValues,
|
|
DWORD dwNumValues
|
|
)
|
|
{
|
|
LPBYTE pMem = NULL;
|
|
|
|
for ( DWORD i = 0; i < dwNumValues; i++ )
|
|
{
|
|
AdsClear(&pAdsValues[i]);
|
|
}
|
|
|
|
}
|