WindowsXP-SP1/ds/adsi/ldapc/schmgmt.cxx
2020-09-30 16:53:49 +02:00

271 lines
6.2 KiB
C++

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