Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

360 lines
7.1 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: nw2ods.cxx
//
// Contents: NDS Object to Variant Copy Routines
//
// Functions:
//
// History: 25-Apr-96 KrishnaG Created.
//
//
// Issues: Check null ptrs for AllocADsMem and AllocADsStr
//
//----------------------------------------------------------------------------
#include "nwcompat.hxx"
#pragma hdrstop
HRESULT
NTTypeToAdsTypeCopyString(
PNTOBJECT lpNtSrcObject,
PADSVALUE lpAdsDestValue
)
{
HRESULT hr = S_OK;
lpAdsDestValue->dwType = ADSTYPE_CASE_IGNORE_STRING;
lpAdsDestValue->DNString =
AllocADsStr(
lpNtSrcObject->NTValue.pszValue
);
RRETURN(hr);
}
HRESULT
NTTypeToAdsTypeCopyBoolean(
PNTOBJECT lpNtSrcObject,
PADSVALUE lpAdsDestValue
)
{
HRESULT hr = S_OK;
lpAdsDestValue->dwType = ADSTYPE_BOOLEAN;
lpAdsDestValue->Boolean =
lpNtSrcObject->NTValue.fValue;
RRETURN(hr);
}
HRESULT
NTTypeToAdsTypeCopyInteger(
PNTOBJECT lpNtSrcObject,
PADSVALUE lpAdsDestValue
)
{
HRESULT hr = S_OK;
lpAdsDestValue->dwType = ADSTYPE_INTEGER;
lpAdsDestValue->Integer =
lpNtSrcObject->NTValue.dwValue;
RRETURN(hr);
}
HRESULT
NTTypeToAdsTypeCopyOctetString(
PNTOBJECT lpNtSrcObject,
PADSVALUE lpAdsDestValue
)
{
HRESULT hr = S_OK;
DWORD dwLength = 0;
LPBYTE lpByte = NULL;
// sanity check the pointers
if(!lpAdsDestValue){
RRETURN(E_POINTER);
}
if(!lpNtSrcObject){
RRETURN(E_POINTER);
}
lpAdsDestValue->dwType = ADSTYPE_OCTET_STRING;
dwLength = lpNtSrcObject->NTValue.octetstring.dwSize;
if (dwLength) {
lpByte = (LPBYTE)AllocADsMem(dwLength);
if (!lpByte) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
if (lpNtSrcObject->NTValue.octetstring.pByte) {
memcpy(lpByte, lpNtSrcObject->NTValue.octetstring.pByte, dwLength);
}
lpAdsDestValue->OctetString.dwLength = dwLength;
lpAdsDestValue->OctetString.lpValue = lpByte;
}
else
{
lpAdsDestValue->OctetString.dwLength = 0;
lpAdsDestValue->OctetString.lpValue = NULL;
}
error:
RRETURN(hr);
}
HRESULT
NTTypeToAdsTypeCopyNW312Date(
PNTOBJECT pNTSrcValue,
PADSVALUE lpAdsDestValue
)
{
HRESULT hr = S_OK;
// sanity check the pointers
if(!lpAdsDestValue){
RRETURN(E_POINTER);
}
if(!pNTSrcValue){
RRETURN(E_POINTER);
}
lpAdsDestValue->dwType = ADSTYPE_UTC_TIME;
hr = ConvertNW312DateToSYSTEMTIME(
pNTSrcValue->NTValue.Nw312Date,
static_cast<SYSTEMTIME*>(&lpAdsDestValue->UTCTime)
);
BAIL_ON_FAILURE(hr);
error:
RRETURN(hr);
}
HRESULT
NTTypeToAdsTypeCopyDATE(
PNTOBJECT pNTSrcValue,
PADSVALUE lpAdsDestValue
)
{
HRESULT hr = S_OK;
SYSTEMTIME stSystemTime;
// sanity check the pointers
if(!lpAdsDestValue){
RRETURN(E_POINTER);
}
if(!pNTSrcValue){
RRETURN(E_POINTER);
}
GetSystemTime( &stSystemTime);
// The date is a DWORD containing the number of minutes elapsed
// since 12:00 AM GMT. We get the current system time for the
// current date. Current date + DWORD time = the date relative
// to today.
stSystemTime.wHour = (WORD)(pNTSrcValue->NTValue.dwValue)/60;
stSystemTime.wMinute = (WORD)(pNTSrcValue->NTValue.dwValue)%60;
stSystemTime.wSecond =0;
stSystemTime.wMilliseconds = 0;
lpAdsDestValue->dwType = ADSTYPE_UTC_TIME;
lpAdsDestValue->UTCTime = static_cast<ADS_UTC_TIME>(stSystemTime);
RRETURN(hr);
}
#if 0
// We never seem to actually get a NT_SYNTAX_ID_SYSTEMTIME.
// This code is untested as a result.
HRESULT
NTTypeToAdsTypeCopySYSTEMTIME(
PNTOBJECT pNTSrcValue,
PADSVALUE lpAdsDestValue
)
{
HRESULT hr = S_OK;
if(!pNTSrcValue){
RRETURN(E_POINTER);
}
if(!lpAdsDestValue){
RRETURN(E_POINTER);
}
lpAdsDestValue->dwType = ADSTYPE_UTC_TIME;
lpAdsDestValue->UTCTime = static_cast<ADS_UTC_TIME>
(pNTSrcValue->NTValue.stSystemTimeValue);
RRETURN(hr);
}
#endif
HRESULT
NTTypeToAdsTypeCopy(
PNTOBJECT lpNtSrcObject,
PADSVALUE lpAdsDestValue
)
{
HRESULT hr = S_OK;
switch (lpNtSrcObject->NTType) {
case NT_SYNTAX_ID_BOOL:
hr = NTTypeToAdsTypeCopyBoolean(
lpNtSrcObject,
lpAdsDestValue
);
break;
case NT_SYNTAX_ID_DWORD:
hr = NTTypeToAdsTypeCopyInteger(
lpNtSrcObject,
lpAdsDestValue
);
break;
case NT_SYNTAX_ID_LPTSTR:
hr = NTTypeToAdsTypeCopyString(
lpNtSrcObject,
lpAdsDestValue
);
break;
/*
case NT_SYNTAX_ID_SYSTEMTIME:
hr = NTTypeToAdsTypeCopySYSTEMTIME(
lpNtSrcObject,
lpAdsDestValue
);
break;
case NT_SYNTAX_ID_NulledString:
hr = NTTypeToAdsTypeCopyNDSSynId5(
lpNtSrcObject,
lpAdsDestValue
);
break;
case NT_SYNTAX_ID_DelimitedString:
hr = NTTypeToAdsTypeCopyNDSSynId6(
lpNtSrcObject,
lpAdsDestValue
);
break;
*/
case NT_SYNTAX_ID_DATE:
hr = NTTypeToAdsTypeCopyDATE(
lpNtSrcObject,
lpAdsDestValue
);
break;
case NT_SYNTAX_ID_NW312DATE:
hr = NTTypeToAdsTypeCopyNW312Date(
lpNtSrcObject,
lpAdsDestValue
);
break;
case NT_SYNTAX_ID_OCTETSTRING:
hr = NTTypeToAdsTypeCopyOctetString(
lpNtSrcObject,
lpAdsDestValue
);
break;
default:
hr = E_FAIL;
break;
}
RRETURN(hr);
}
HRESULT
NTTypeToAdsTypeCopyConstruct(
LPNTOBJECT pNtSrcObjects,
DWORD dwNumObjects,
LPADSVALUE * ppAdsDestValues
)
{
DWORD i = 0;
LPADSVALUE pAdsDestValues = NULL;
HRESULT hr = S_OK;
if (!dwNumObjects) {
*ppAdsDestValues =0;
RRETURN(S_OK);
}
pAdsDestValues = (LPADSVALUE)AllocADsMem(
dwNumObjects * sizeof(ADSVALUE)
);
if (!pAdsDestValues) {
RRETURN(E_OUTOFMEMORY);
}
for (i = 0; i < dwNumObjects; i++ ) {
hr = NTTypeToAdsTypeCopy(
pNtSrcObjects + i,
pAdsDestValues + i
);
BAIL_ON_FAILURE(hr);
}
*ppAdsDestValues = pAdsDestValues;
RRETURN(S_OK);
error:
if (pAdsDestValues) {
AdsFreeAdsValues(
pAdsDestValues,
dwNumObjects
);
FreeADsMem(pAdsDestValues);
}
*ppAdsDestValues = NULL;
RRETURN(hr);
}