windows-nt/Source/XPSP1/NT/ds/adsi/nw312/nwcopy.cxx
2020-09-26 16:20:57 +08:00

256 lines
5.6 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: nwcopy.cxx
//
// Contents: Nw312 Object Copy Routines
//
// Functions:
//
// History: 17-June-96 KrishnaG Created.
// cloned off NDS copy code.
//
//
//
//
//
//----------------------------------------------------------------------------
//
// NtType objects copy code
//
#include "nwcompat.hxx"
#pragma hdrstop
HRESULT
NtTypeCopy(
PNTOBJECT lpNtSrcObject,
PNTOBJECT lpNtDestObject
)
{
HRESULT hr = S_OK;
switch (lpNtSrcObject->NTType) {
case NT_SYNTAX_ID_BOOL:
lpNtDestObject->NTType = NT_SYNTAX_ID_BOOL;
(lpNtDestObject->NTValue).fValue = (lpNtSrcObject->NTValue).fValue;
break;
case NT_SYNTAX_ID_SYSTEMTIME:
lpNtDestObject->NTType = NT_SYNTAX_ID_SYSTEMTIME;
(lpNtDestObject->NTValue).stSystemTimeValue =
(lpNtSrcObject->NTValue).stSystemTimeValue;
break;
case NT_SYNTAX_ID_DWORD:
lpNtDestObject->NTType = NT_SYNTAX_ID_DWORD;
(lpNtDestObject->NTValue).dwValue =
(lpNtSrcObject->NTValue).dwValue;
break;
case NT_SYNTAX_ID_DATE:
lpNtDestObject->NTType = NT_SYNTAX_ID_DATE;
(lpNtDestObject->NTValue).dwValue =
(lpNtSrcObject->NTValue).dwValue;
break;
case NT_SYNTAX_ID_NW312DATE:
lpNtDestObject->NTType = NT_SYNTAX_ID_NW312DATE;
memcpy(
(lpNtDestObject->NTValue).Nw312Date,
(lpNtSrcObject->NTValue).Nw312Date,
6
);
break;
case NT_SYNTAX_ID_LPTSTR:
lpNtDestObject->NTType = NT_SYNTAX_ID_LPTSTR;
if(!(lpNtSrcObject->NTValue).pszValue){
(lpNtDestObject->NTValue).pszValue = NULL;
hr = S_OK;
goto error;
}
(lpNtDestObject->NTValue).pszValue =
AllocADsStr((lpNtSrcObject->NTValue).pszValue);
hr =((lpNtDestObject->NTValue).pszValue == NULL)
? E_OUTOFMEMORY :S_OK;
break;
case NT_SYNTAX_ID_OCTETSTRING:
lpNtDestObject->NTType = NT_SYNTAX_ID_OCTETSTRING;
(lpNtDestObject->NTValue).octetstring.dwSize =
(lpNtSrcObject->NTValue).octetstring.dwSize;
if ((lpNtSrcObject->NTValue).octetstring.dwSize == 0) {
(lpNtDestObject->NTValue).octetstring.pByte = NULL;
}
else {
(lpNtDestObject->NTValue).octetstring.pByte =
(BYTE*)AllocADsMem(sizeof(BYTE)*(lpNtSrcObject->NTValue).octetstring.dwSize);
if (!(lpNtDestObject->NTValue).octetstring.pByte) {
RRETURN(E_OUTOFMEMORY);
}
memcpy((lpNtDestObject->NTValue).octetstring.pByte,
(lpNtSrcObject->NTValue).octetstring.pByte,
(lpNtSrcObject->NTValue).octetstring.dwSize);
}
break;
case NT_SYNTAX_ID_DelimitedString:
lpNtDestObject->NTType = NT_SYNTAX_ID_DelimitedString;
if(!(lpNtSrcObject->NTValue).pszValue){
(lpNtDestObject->NTValue).pszValue = NULL;
hr = S_OK;
goto error;
}
(lpNtDestObject->NTValue).pszValue =
AllocADsStr((lpNtSrcObject->NTValue).pszValue);
hr =((lpNtDestObject->NTValue).pszValue == NULL)
? E_OUTOFMEMORY :S_OK;
break;
case NT_SYNTAX_ID_NulledString:
lpNtDestObject->NTType = NT_SYNTAX_ID_NulledString;
if(!(lpNtSrcObject->NTValue).pszValue){
(lpNtDestObject->NTValue).pszValue = NULL;
hr = S_OK;
goto error;
}
hr = CopyNulledString((lpNtSrcObject->NTValue).pszValue,
&(lpNtDestObject->NTValue).pszValue );
BAIL_ON_FAILURE(hr);
break;
default:
hr = E_FAIL;
break;
}
error:
RRETURN(hr);
}
HRESULT
NtTypeCopyConstruct(
LPNTOBJECT pNtSrcObjects,
DWORD dwNumObjects,
LPNTOBJECT * ppNtDestObjects
)
{
DWORD i = 0;
LPNTOBJECT pNtDestObjects = NULL;
HRESULT hr = S_OK;
pNtDestObjects = (LPNTOBJECT)AllocADsMem(
dwNumObjects * sizeof(NTOBJECT)
);
if (!pNtDestObjects) {
RRETURN(E_FAIL);
}
//
// Zero out so we can clear the memory on an error
//
memset(pNtDestObjects, 0, dwNumObjects * sizeof(NTOBJECT));
for (i = 0; i < dwNumObjects; i++ ) {
hr = NtTypeCopy(pNtSrcObjects + i, pNtDestObjects + i);
BAIL_ON_FAILURE(hr);
}
*ppNtDestObjects = pNtDestObjects;
RRETURN(S_OK);
error:
//
// pNtDestObjects is assumed to be non-NULL
//
NTTypeFreeNTObjects(pNtDestObjects, dwNumObjects);
RRETURN(hr);
}
HRESULT
CopyNulledString(
LPTSTR pszSrcString,
LPTSTR *ppszDestString
)
{
HRESULT hr = S_OK;
LPTSTR pszPosition = pszSrcString;
DWORD dwLength = 0 ;
DWORD dwCurrLen = 0;
BOOL foundNULL = FALSE;
DWORD i;
ADsAssert(ppszDestString);
*ppszDestString = NULL;
if (!pszSrcString)
RRETURN(S_OK);
//
// scan source string looking for 2 successive NULLS
//
if(*pszPosition == TEXT('\0')) {
pszPosition++;
dwLength++;
}
while(*pszPosition != TEXT('\0')){
dwCurrLen = wcslen(pszPosition) +1;
dwLength += dwCurrLen;
pszPosition += dwCurrLen;
}
dwLength++;
*ppszDestString = (LPTSTR)AllocADsMem (dwLength * sizeof(TCHAR));
if ( !*ppszDestString){
RRETURN(E_OUTOFMEMORY);
}
// copy one character at a time
for ( i=0; i<dwLength; i++){
(*ppszDestString)[i] = pszSrcString[i] ;
}
RRETURN (hr);
}