271 lines
5.9 KiB
C++
271 lines
5.9 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);
|
||
|
}
|
||
|
|