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

213 lines
4.5 KiB
C++

//---------------------------------------------------------------------------
//
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995
//
// File: cdssch.cxx
//
// Contents: Microsoft ADs NDS Provider Generic Object
//
//
// History: 03-02-97 ShankSh Created.
//
//----------------------------------------------------------------------------
#include "nds.hxx"
#pragma hdrstop
static WCHAR gszObjClassAttr[] = L"Object Class";
static WCHAR gszNameAttr[] = L"cn";
HRESULT
CNDSGenObject::EnumAttributes(
LPWSTR * ppszAttrNames,
DWORD dwNumAttributes,
PADS_ATTR_DEF * ppAttrDefinition,
DWORD * pdwNumAttributes
)
{
HRESULT hr = S_OK;
DWORD dwNumberOfEntries = 0;
DWORD dwInfoType;
LPNDS_ATTR_DEF lpAttrDefs = NULL;
NDS_BUFFER_HANDLE hOperationData = NULL;
DWORD i,j,k;
DWORD dwMemSize = 0;
LPBYTE pBuffer = NULL;
LPWSTR pszNameEntry = NULL;
PADS_ATTR_DEF pAttrDefEntry = NULL;
if ( !ppAttrDefinition || !pdwNumAttributes ||
(dwNumAttributes < 0 && dwNumAttributes != -1) ) {
RRETURN (E_INVALIDARG);
}
*ppAttrDefinition = NULL;
*pdwNumAttributes = NULL;
hr = ADsNdsReadAttrDef(
_hADsContext,
DS_ATTR_DEFS,
ppszAttrNames,
dwNumAttributes,
&hOperationData
);
BAIL_ON_FAILURE(hr);
hr = ADsNdsGetAttrDefListFromBuffer(
_hADsContext,
hOperationData,
&dwNumberOfEntries,
&dwInfoType,
&lpAttrDefs
);
BAIL_ON_FAILURE(hr);
if (dwInfoType != DS_ATTR_DEFS )
BAIL_ON_FAILURE( hr = E_FAIL );
//
// Now package this data into a single contiguous buffer
//
hr = ComputeADsAttrDefBufferSize(
lpAttrDefs,
dwNumberOfEntries,
&dwMemSize
);
BAIL_ON_FAILURE(hr);
pBuffer = (LPBYTE) AllocADsMem(dwMemSize);
if (!pBuffer)
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
pAttrDefEntry = (PADS_ATTR_DEF) pBuffer;
pszNameEntry = (LPWSTR) (pBuffer + dwNumberOfEntries * sizeof(ADS_ATTR_DEF));
for (j = 0; j < dwNumberOfEntries ; j++ ) {
if (lpAttrDefs[j].dwSyntaxID >= g_cMapNdsTypeToADsType)
pAttrDefEntry->dwADsType = ADSTYPE_INVALID;
else
pAttrDefEntry->dwADsType = g_MapNdsTypeToADsType[lpAttrDefs[j].dwSyntaxID];
pAttrDefEntry->dwMinRange = lpAttrDefs[j].dwLowerLimit;
pAttrDefEntry->dwMaxRange = lpAttrDefs[j].dwUpperLimit;
pAttrDefEntry->fMultiValued = !(lpAttrDefs[j].dwFlags & NDS_SINGLE_VALUED_ATTR);
wcscpy(pszNameEntry, lpAttrDefs[j].szAttributeName);
pAttrDefEntry->pszAttrName = pszNameEntry;
pszNameEntry += wcslen(lpAttrDefs[j].szAttributeName) + 1;
pAttrDefEntry ++;
}
*ppAttrDefinition = (PADS_ATTR_DEF) pBuffer;
*pdwNumAttributes = dwNumberOfEntries;
error:
if (hOperationData) {
ADsNdsFreeBuffer(hOperationData);
}
ADsNdsFreeAttrDefList(lpAttrDefs, dwNumberOfEntries);
RRETURN(hr);
}
HRESULT
CNDSGenObject::CreateAttributeDefinition(
LPWSTR pszAttributeName,
PADS_ATTR_DEF pAttributeDefinition
)
{
RRETURN (E_NOTIMPL);
}
HRESULT
CNDSGenObject::WriteAttributeDefinition(
LPWSTR pszAttributeName,
PADS_ATTR_DEF pAttributeDefinition
)
{
RRETURN (E_NOTIMPL);
}
HRESULT
CNDSGenObject::DeleteAttributeDefinition(
LPWSTR pszAttributeName
)
{
RRETURN (E_NOTIMPL);
}
HRESULT
CNDSGenObject::EnumClasses(
LPWSTR * ppszClassNames,
DWORD dwNumClasses,
PADS_CLASS_DEF * ppClassDefinition,
DWORD * pdwNumClasses
)
{
RRETURN (E_NOTIMPL);
}
HRESULT
CNDSGenObject::CreateClassDefinition(
LPWSTR pszClassName,
PADS_CLASS_DEF pClassDefinition
)
{
RRETURN (E_NOTIMPL);
}
HRESULT
CNDSGenObject::WriteClassDefinition(
LPWSTR pszClassName,
PADS_CLASS_DEF pClassDefinition
)
{
RRETURN (E_NOTIMPL);
}
HRESULT
CNDSGenObject::DeleteClassDefinition(
LPWSTR pszClassName
)
{
RRETURN (E_NOTIMPL);
}
HRESULT
ComputeADsAttrDefBufferSize(
LPNDS_ATTR_DEF pAttributes,
DWORD dwNumAttributes,
PDWORD pdwSize
)
{
DWORD i = 0;
DWORD dwSize = 0;
dwSize = sizeof(ADS_ATTR_DEF) * dwNumAttributes;
for (i = 0; i < dwNumAttributes; i++)
dwSize += (wcslen(pAttributes[i].szAttributeName) + 1)*sizeof(WCHAR);
*pdwSize = dwSize;
RRETURN(S_OK);
}