275 lines
6.2 KiB
C++
275 lines
6.2 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
|
||
)
|
||
{
|
||
LPWSTR pszNDSPath = NULL;
|
||
DWORD dwStatus;
|
||
HRESULT hr = S_OK;
|
||
DWORD dwNumberOfEntries;
|
||
DWORD dwInfoType;
|
||
LPNDS_ATTR_DEF lpAttrDefs = NULL;
|
||
HANDLE hConnection = NULL, hOperationData = NULL;
|
||
DWORD i,j,k;
|
||
|
||
DWORD dwMemSize = 0;
|
||
|
||
LPBYTE pBuffer = NULL;
|
||
LPWSTR pszNameEntry = NULL;
|
||
PADS_ATTR_DEF pAttrDefEntry = NULL;
|
||
|
||
if ( !ppAttrDefinition || !pdwNumAttributes ||
|
||
(((LONG)dwNumAttributes) < 0 && ((LONG)dwNumAttributes) != -1) ) {
|
||
RRETURN (E_INVALIDARG);
|
||
}
|
||
|
||
*ppAttrDefinition = NULL;
|
||
*pdwNumAttributes = NULL;
|
||
|
||
//
|
||
// Allocate memory for pszNDSPath before calling BuildNDSTreeNameFromADsPath
|
||
// Allocating ADsPath is safe as the tree name is always less.
|
||
//
|
||
|
||
pszNDSPath = AllocADsStr(_ADsPath);
|
||
if (!pszNDSPath)
|
||
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
||
hr = BuildNDSTreeNameFromADsPath(
|
||
_ADsPath,
|
||
pszNDSPath
|
||
);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
dwStatus = NwNdsOpenObject(
|
||
pszNDSPath,
|
||
NULL,
|
||
NULL,
|
||
&hConnection,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
0,
|
||
0
|
||
);
|
||
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
||
|
||
if (dwNumAttributes != (DWORD)-1) {
|
||
|
||
dwStatus = NwNdsCreateBuffer(
|
||
NDS_SCHEMA_READ_ATTR_DEF,
|
||
&hOperationData
|
||
);
|
||
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
||
|
||
for (i=0; i < dwNumAttributes; i++) {
|
||
dwStatus = NwNdsPutInBuffer(
|
||
ppszAttrNames[i],
|
||
0,
|
||
NULL,
|
||
0,
|
||
0,
|
||
hOperationData
|
||
);
|
||
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
||
}
|
||
}
|
||
else {
|
||
|
||
//
|
||
// Tell the server to give us back all the attributes
|
||
//
|
||
|
||
hOperationData = NULL;
|
||
|
||
}
|
||
|
||
dwStatus = NwNdsReadAttrDef(
|
||
hConnection,
|
||
NDS_INFO_NAMES_DEFS,
|
||
&hOperationData
|
||
);
|
||
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
||
|
||
dwStatus = NwNdsGetAttrDefListFromBuffer(
|
||
hOperationData,
|
||
&dwNumberOfEntries,
|
||
&dwInfoType,
|
||
(LPVOID *) &lpAttrDefs
|
||
);
|
||
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
||
|
||
if (dwInfoType != NDS_INFO_NAMES_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 (pszNDSPath)
|
||
FreeADsStr(pszNDSPath);
|
||
|
||
if (hOperationData)
|
||
NwNdsFreeBuffer( hOperationData );
|
||
|
||
if (hConnection)
|
||
NwNdsCloseObject( hConnection);
|
||
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
|
||
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);
|
||
}
|
||
|
||
|
||
HRESULT
|
||
CNDSGenObject::DeleteClassDefinition(
|
||
LPWSTR pszClassName
|
||
)
|
||
{
|
||
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::EnumClasses(
|
||
LPWSTR *ppszClassNames,
|
||
DWORD dwNumClasses,
|
||
PADS_CLASS_DEF *ppClassDefinition,
|
||
DWORD *pdwNumClasses
|
||
)
|
||
{
|
||
RRETURN(E_NOTIMPL);
|
||
}
|
||
|
||
|
||
|