//--------------------------------------------------------------------------- // // // 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 ) { HRESULT hr = S_OK; DWORD dwNumberOfEntries = 0; DWORD dwInfoType; LPNDS_ATTR_DEF lpAttrDefs = NULL; NDS_BUFFER_HANDLE hOperationData = NULL; DWORD i,j,k; DWORD dwMemSize = 0; LPBYTE pBuffer = NULL; LPWSTR pszNameEntry = NULL; PADS_ATTR_DEF pAttrDefEntry = NULL; if ( !ppAttrDefinition || !pdwNumAttributes || (dwNumAttributes < 0 && dwNumAttributes != -1) ) { RRETURN (E_INVALIDARG); } *ppAttrDefinition = NULL; *pdwNumAttributes = NULL; hr = ADsNdsReadAttrDef( _hADsContext, DS_ATTR_DEFS, ppszAttrNames, dwNumAttributes, &hOperationData ); BAIL_ON_FAILURE(hr); hr = ADsNdsGetAttrDefListFromBuffer( _hADsContext, hOperationData, &dwNumberOfEntries, &dwInfoType, &lpAttrDefs ); BAIL_ON_FAILURE(hr); if (dwInfoType != DS_ATTR_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 (hOperationData) { ADsNdsFreeBuffer(hOperationData); } ADsNdsFreeAttrDefList(lpAttrDefs, dwNumberOfEntries); 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 CNDSGenObject::EnumClasses( LPWSTR * ppszClassNames, DWORD dwNumClasses, PADS_CLASS_DEF * ppClassDefinition, DWORD * pdwNumClasses ) { 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::DeleteClassDefinition( LPWSTR pszClassName ) { 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); }