|
|
//---------------------------------------------------------------------------
//
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995
//
// File: schmgmt.cxx
//
// Contents: Microsoft ADs LDAP Provider Generic Object
//
//
// History: 03-02-97 ShankSh Created.
//
//----------------------------------------------------------------------------
#include "ldapc.hxx"
#pragma hdrstop
HRESULT ADsEnumAttributes( LPWSTR pszLdapServer, LPWSTR pszLdapDn, CCredentials Credentials, DWORD dwPort, LPWSTR * ppszAttrNames, DWORD dwNumAttributes, PADS_ATTR_DEF * ppAttrDefinition, DWORD * pdwNumAttributes ) { HRESULT hr = S_OK;
LDAP_SCHEMA_HANDLE hSchema = NULL; DWORD cAttributes, cClasses; PROPERTYINFO *pPropertyInfo;
DWORD dwMemSize = 0, dwStrBufSize = 0;
DWORD dwLdapSyntax;
LPBYTE pBuffer = NULL; LPWSTR pszNameEntry = NULL; PADS_ATTR_DEF pAttrDefEntry = NULL;
ULONG i;
if ( !ppAttrDefinition || !pdwNumAttributes || (((LONG)dwNumAttributes) < 0 && ((LONG)dwNumAttributes) != -1) ) { RRETURN (E_INVALIDARG); }
*ppAttrDefinition = NULL; *pdwNumAttributes = NULL;
hr = SchemaOpen( pszLdapServer, &hSchema, Credentials, dwPort ); BAIL_ON_FAILURE(hr);
if (dwNumAttributes != (DWORD)-1) { //
// List of attributes specified;
//
cAttributes = 0;
for (i=0; i < dwNumAttributes; i++) {
hr = SchemaGetPropertyInfo( hSchema, ppszAttrNames[i], &pPropertyInfo);
BAIL_ON_FAILURE(hr);
if (pPropertyInfo != NULL) { cAttributes++; dwStrBufSize += (wcslen(ppszAttrNames[i]) + 1) * sizeof (WCHAR); }
}
dwMemSize = sizeof(ADS_ATTR_DEF) * cAttributes + dwStrBufSize;
pBuffer = (LPBYTE) AllocADsMem(dwMemSize);
if (!pBuffer) BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
pAttrDefEntry = (PADS_ATTR_DEF) pBuffer; pszNameEntry = (LPWSTR) (pBuffer + cAttributes * sizeof(ADS_ATTR_DEF));
for (i=0; i < dwNumAttributes; i++) {
hr = SchemaGetPropertyInfo( hSchema, ppszAttrNames[i], &pPropertyInfo);
BAIL_ON_FAILURE(hr);
if (pPropertyInfo == NULL) continue;
dwLdapSyntax = LdapGetSyntaxIdFromName( pPropertyInfo->pszSyntax);
pAttrDefEntry->dwADsType = MapLDAPTypeToADSType(dwLdapSyntax);
pAttrDefEntry->dwMinRange = pPropertyInfo->lMinRange;
pAttrDefEntry->dwMaxRange = pPropertyInfo->lMaxRange;
pAttrDefEntry->fMultiValued = !(pPropertyInfo->fSingleValued);
wcscpy(pszNameEntry, ppszAttrNames[i]); pAttrDefEntry->pszAttrName = pszNameEntry;
pszNameEntry += wcslen(ppszAttrNames[i]) + 1; pAttrDefEntry ++; } } else { //
// Get all the attribute definitions
//
hr = SchemaGetObjectCount( hSchema, &cClasses, &cAttributes);
BAIL_ON_FAILURE(hr);
dwMemSize = sizeof(ADS_ATTR_DEF) * cAttributes;
//
// Calculate the size of the buffer
//
for (i=0; i < cAttributes; i++) {
hr = SchemaGetPropertyInfoByIndex( hSchema, i, &pPropertyInfo); BAIL_ON_FAILURE(hr);
dwMemSize += (wcslen(pPropertyInfo->pszPropertyName) + 1) * sizeof (WCHAR);
}
pBuffer = (LPBYTE) AllocADsMem(dwMemSize);
if (!pBuffer) BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
pAttrDefEntry = (PADS_ATTR_DEF) pBuffer; pszNameEntry = (LPWSTR) (pBuffer + cAttributes * sizeof(ADS_ATTR_DEF));
for (i=0; i < cAttributes; i++) {
hr = SchemaGetPropertyInfoByIndex( hSchema, i, &pPropertyInfo); BAIL_ON_FAILURE(hr);
dwLdapSyntax = LdapGetSyntaxIdFromName( pPropertyInfo->pszSyntax);
pAttrDefEntry->dwADsType = MapLDAPTypeToADSType(dwLdapSyntax);
pAttrDefEntry->dwMinRange = pPropertyInfo->lMinRange;
pAttrDefEntry->dwMaxRange = pPropertyInfo->lMaxRange;
pAttrDefEntry->fMultiValued = !(pPropertyInfo->fSingleValued);
wcscpy(pszNameEntry, pPropertyInfo->pszPropertyName); pAttrDefEntry->pszAttrName = pszNameEntry;
pszNameEntry += wcslen(pPropertyInfo->pszPropertyName) + 1; pAttrDefEntry ++; }
}
*ppAttrDefinition = (PADS_ATTR_DEF) pBuffer; *pdwNumAttributes = cAttributes;
error:
if ( hSchema ) SchemaClose( &hSchema );
RRETURN(hr); }
HRESULT ADsCreateAttributeDefinition( LPWSTR pszAttributeName, PADS_ATTR_DEF pAttributeDefinition ) { RRETURN (E_NOTIMPL); }
HRESULT ADsWriteAttributeDefinition( LPWSTR pszAttributeName, PADS_ATTR_DEF pAttributeDefinition ) { RRETURN (E_NOTIMPL); }
HRESULT ADsDeleteAttributeDefinition( LPWSTR pszAttributeName ) { RRETURN (E_NOTIMPL); }
HRESULT ADsEnumClasses( LPWSTR * ppszAttrNames, DWORD dwNumClasses, PADS_CLASS_DEF * ppAttrDefinition, DWORD * pdwNumClasses ) { RRETURN (E_NOTIMPL); }
HRESULT ADsCreateClassDefinition( LPWSTR pszClassName, PADS_CLASS_DEF pClassDefinition ) { RRETURN (E_NOTIMPL); }
HRESULT ADsWriteClassDefinition( LPWSTR pszClassName, PADS_CLASS_DEF pClassDefinition ) { RRETURN (E_NOTIMPL); }
HRESULT ADsDeleteClassDefinition( LPWSTR pszClassName ) { RRETURN (E_NOTIMPL); }
|