|
|
//---------------------------------------------------------------------------
//
//
// 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); }
|