723 lines
14 KiB
C++
723 lines
14 KiB
C++
//---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
|
//
|
|
// File: cclsobj.cxx
|
|
//
|
|
// Contents: Microsoft ADs NDS Provider Generic Object
|
|
//
|
|
//
|
|
// History: 01-30-95 krishnag Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include "nds.hxx"
|
|
#pragma hdrstop
|
|
|
|
// Class CNDSClass
|
|
|
|
DEFINE_IDispatch_Implementation(CNDSClass)
|
|
DEFINE_IADs_Implementation(CNDSClass)
|
|
|
|
|
|
CNDSClass::CNDSClass():
|
|
_pDispMgr( NULL ),
|
|
_bstrCLSID( NULL ),
|
|
_bstrOID( NULL ),
|
|
_bstrPrimaryInterface( NULL ),
|
|
_bstrHelpFileName( NULL ),
|
|
_lHelpFileContext( 0 ),
|
|
|
|
_dwFlags(0),
|
|
_lpClassName(0),
|
|
_dwNumberOfSuperClasses(0),
|
|
_lpSuperClasses(0),
|
|
_dwNumberOfContainmentClasses(0),
|
|
_lpContainmentClasses(0),
|
|
_dwNumberOfNamingAttributes(0),
|
|
_lpNamingAttributes(0),
|
|
_dwNumberOfMandatoryAttributes(0),
|
|
_lpMandatoryAttributes(0),
|
|
_dwNumberOfOptionalAttributes(0),
|
|
_lpOptionalAttributes(0)
|
|
|
|
{
|
|
VariantInit(&_vFilter);
|
|
|
|
ENLIST_TRACKING(CNDSClass);
|
|
}
|
|
|
|
HRESULT
|
|
CNDSClass::CreateClass(
|
|
BSTR Parent,
|
|
BSTR CommonName,
|
|
LPNDS_CLASS_DEF lpClassDefs,
|
|
CCredentials& Credentials,
|
|
DWORD dwObjectState,
|
|
REFIID riid,
|
|
void **ppvObj
|
|
)
|
|
{
|
|
CNDSClass FAR * pClass = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = AllocateClassObject(Credentials, &pClass);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pClass->InitializeCoreObject(
|
|
Parent,
|
|
CommonName,
|
|
CLASS_CLASS_NAME,
|
|
L"",
|
|
CLSID_NDSClass,
|
|
dwObjectState
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pClass->QueryInterface(riid, ppvObj);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pClass->_Credentials = Credentials;
|
|
|
|
pClass->_dwFlags = lpClassDefs->dwFlags;
|
|
|
|
pClass->_dwNumberOfSuperClasses =
|
|
lpClassDefs->dwNumberOfSuperClasses;
|
|
pClass->_lpSuperClasses = CreatePropertyList(
|
|
lpClassDefs->lpSuperClasses
|
|
);
|
|
|
|
pClass->_dwNumberOfContainmentClasses =
|
|
lpClassDefs->dwNumberOfContainmentClasses;
|
|
pClass->_lpContainmentClasses = CreatePropertyList(
|
|
lpClassDefs->lpContainmentClasses
|
|
);
|
|
|
|
pClass->_dwNumberOfNamingAttributes =
|
|
lpClassDefs->dwNumberOfNamingAttributes;
|
|
pClass->_lpNamingAttributes = CreatePropertyList(
|
|
lpClassDefs->lpNamingAttributes
|
|
);
|
|
|
|
pClass->_dwNumberOfMandatoryAttributes =
|
|
lpClassDefs->dwNumberOfMandatoryAttributes;
|
|
pClass->_lpMandatoryAttributes = CreatePropertyList(
|
|
lpClassDefs->lpMandatoryAttributes
|
|
);
|
|
|
|
pClass->_dwNumberOfOptionalAttributes =
|
|
lpClassDefs->dwNumberOfOptionalAttributes;
|
|
pClass->_lpOptionalAttributes = CreatePropertyList(
|
|
lpClassDefs->lpOptionalAttributes
|
|
);
|
|
|
|
pClass->Release();
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
delete pClass;
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CNDSClass::CreateClass(
|
|
BSTR Parent,
|
|
BSTR CommonName,
|
|
NDS_CONTEXT_HANDLE hADsContext,
|
|
CCredentials& Credentials,
|
|
DWORD dwObjectState,
|
|
REFIID riid,
|
|
void **ppvObj
|
|
)
|
|
{
|
|
DWORD dwStatus = 0;
|
|
HRESULT hr = S_OK;
|
|
LPNDS_CLASS_DEF lpClassDefs = NULL;
|
|
DWORD dwObjectsReturned = 0;
|
|
DWORD dwInfoType = 0;
|
|
HANDLE hOperationData = NULL;
|
|
|
|
|
|
hr = ADsNdsReadClassDef(
|
|
hADsContext,
|
|
DS_EXPANDED_CLASS_DEFS,
|
|
&CommonName,
|
|
1,
|
|
&hOperationData
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
|
|
hr = ADsNdsGetClassDefListFromBuffer(
|
|
hADsContext,
|
|
hOperationData,
|
|
&dwObjectsReturned,
|
|
&dwInfoType,
|
|
&lpClassDefs
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
if (!lpClassDefs) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
hr = CNDSClass::CreateClass(
|
|
Parent,
|
|
CommonName,
|
|
lpClassDefs,
|
|
Credentials,
|
|
dwObjectState,
|
|
riid,
|
|
ppvObj
|
|
);
|
|
|
|
error:
|
|
|
|
if (hOperationData) {
|
|
ADsNdsFreeBuffer(hOperationData);
|
|
}
|
|
|
|
ADsNdsFreeClassDefList(lpClassDefs, dwObjectsReturned);
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
CNDSClass::~CNDSClass( )
|
|
{
|
|
if ( _bstrCLSID ) {
|
|
ADsFreeString( _bstrCLSID );
|
|
}
|
|
|
|
if ( _bstrOID ) {
|
|
ADsFreeString( _bstrOID );
|
|
}
|
|
|
|
if ( _bstrPrimaryInterface ) {
|
|
ADsFreeString( _bstrPrimaryInterface );
|
|
}
|
|
|
|
if ( _bstrHelpFileName ) {
|
|
ADsFreeString( _bstrHelpFileName );
|
|
}
|
|
|
|
|
|
if (_lpSuperClasses) {
|
|
|
|
FreePropertyList(_lpSuperClasses);
|
|
}
|
|
|
|
if (_lpContainmentClasses) {
|
|
|
|
FreePropertyList(_lpContainmentClasses);
|
|
}
|
|
|
|
if (_lpNamingAttributes) {
|
|
|
|
FreePropertyList(_lpNamingAttributes);
|
|
}
|
|
|
|
if (_lpMandatoryAttributes) {
|
|
|
|
FreePropertyList(_lpMandatoryAttributes);
|
|
}
|
|
|
|
|
|
if (_lpOptionalAttributes) {
|
|
|
|
FreePropertyList(_lpOptionalAttributes);
|
|
}
|
|
|
|
|
|
|
|
VariantClear( &_vFilter );
|
|
|
|
delete _pDispMgr;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::QueryInterface(
|
|
REFIID iid,
|
|
LPVOID FAR* ppv
|
|
)
|
|
{
|
|
if (ppv == NULL) {
|
|
RRETURN(E_POINTER);
|
|
}
|
|
|
|
if (IsEqualIID(iid, IID_IUnknown))
|
|
{
|
|
*ppv = (IADsClass FAR *) this;
|
|
}
|
|
else if (IsEqualIID(iid, IID_IADsClass))
|
|
{
|
|
*ppv = (IADsClass FAR *) this;
|
|
}
|
|
else if (IsEqualIID(iid, IID_IADs))
|
|
{
|
|
*ppv = (IADsClass FAR *) this;
|
|
}
|
|
else if (IsEqualIID(iid, IID_IDispatch))
|
|
{
|
|
*ppv = (IADsClass FAR *) this;
|
|
}
|
|
else
|
|
{
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::SetInfo(THIS)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::GetInfo(THIS)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::GetInfoEx(THIS_ VARIANT vProperties, long lnReserved)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CNDSClass::AllocateClassObject(
|
|
CCredentials& Credentials,
|
|
CNDSClass ** ppClass
|
|
)
|
|
{
|
|
CNDSClass FAR * pClass = NULL;
|
|
CDispatchMgr FAR * pDispMgr = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
pClass = new CNDSClass();
|
|
if (pClass == NULL) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pDispMgr = new CDispatchMgr;
|
|
if (pDispMgr == NULL) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = LoadTypeInfoEntry(
|
|
pDispMgr,
|
|
LIBID_ADs,
|
|
IID_IADsClass,
|
|
(IADsClass *)pClass,
|
|
DISPID_REGULAR
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pClass->_pDispMgr = pDispMgr;
|
|
*ppClass = pClass;
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
delete pDispMgr;
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::GetInfo(
|
|
THIS_ DWORD dwApiLevel,
|
|
BOOL fExplicit
|
|
)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::Get(
|
|
THIS_ BSTR bstrName,
|
|
VARIANT FAR* pvProp
|
|
)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::Put(
|
|
THIS_ BSTR bstrName,
|
|
VARIANT vProp
|
|
)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::GetEx(
|
|
THIS_ BSTR bstrName,
|
|
VARIANT FAR* pvProp
|
|
)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::PutEx(
|
|
THIS_ long lnControlCode,
|
|
BSTR bstrName,
|
|
VARIANT vProp
|
|
)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
|
|
/* IADsClass methods */
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_PrimaryInterface( THIS_ BSTR FAR *pbstrGUID )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_CLSID( THIS_ BSTR FAR *pbstrCLSID )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_CLSID( THIS_ BSTR bstrCLSID )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_OID( THIS_ BSTR FAR *pbstrOID )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_OID( THIS_ BSTR bstrOID )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_Abstract( THIS_ VARIANT_BOOL FAR *pfAbstract )
|
|
{
|
|
if (_dwFlags & NDS_EFFECTIVE_CLASS) {
|
|
*pfAbstract = VARIANT_FALSE;
|
|
}else {
|
|
*pfAbstract = VARIANT_TRUE;
|
|
}
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_Abstract( THIS_ VARIANT_BOOL fAbstract )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_Auxiliary( THIS_ VARIANT_BOOL FAR *pfAuxiliary )
|
|
{
|
|
*pfAuxiliary = VARIANT_FALSE;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_Auxiliary( THIS_ VARIANT_BOOL fAuxiliary )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_MandatoryProperties( THIS_ VARIANT FAR *pvMandatoryProperties )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = MakeVariantFromPropList(
|
|
_lpMandatoryAttributes,
|
|
_dwNumberOfMandatoryAttributes,
|
|
pvMandatoryProperties
|
|
);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_MandatoryProperties( THIS_ VARIANT vMandatoryProperties )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_DerivedFrom( THIS_ VARIANT FAR *pvDerivedFrom )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = MakeVariantFromPropList(
|
|
_lpSuperClasses,
|
|
_dwNumberOfSuperClasses,
|
|
pvDerivedFrom
|
|
);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_DerivedFrom( THIS_ VARIANT vDerivedFrom )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_AuxDerivedFrom( THIS_ VARIANT FAR *pvAuxDerivedFrom )
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_AuxDerivedFrom( THIS_ VARIANT vAuxDerivedFrom )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_PossibleSuperiors( THIS_ VARIANT FAR *pvPossSuperiors)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_PossibleSuperiors( THIS_ VARIANT vPossSuperiors )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_Containment( THIS_ VARIANT FAR *pvContainment )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = MakeVariantFromPropList(
|
|
_lpContainmentClasses,
|
|
_dwNumberOfContainmentClasses,
|
|
pvContainment
|
|
);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_Containment( THIS_ VARIANT vContainment )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_Container( THIS_ VARIANT_BOOL FAR *pfContainer )
|
|
{
|
|
if (_dwFlags & NDS_CONTAINER_CLASS) {
|
|
*pfContainer = VARIANT_TRUE;
|
|
}else {
|
|
*pfContainer = VARIANT_FALSE;
|
|
}
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_Container( THIS_ VARIANT_BOOL fContainer )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_HelpFileName( THIS_ BSTR FAR *pbstrHelpFileName )
|
|
{
|
|
if ( !pbstrHelpFileName )
|
|
RRETURN(E_ADS_BAD_PARAMETER);
|
|
|
|
RRETURN( ADsAllocString( _bstrHelpFileName, pbstrHelpFileName ));
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_HelpFileName( THIS_ BSTR bstrHelpFile )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_HelpFileContext( THIS_ long FAR *plHelpContext )
|
|
{
|
|
if ( !plHelpContext )
|
|
RRETURN(E_ADS_BAD_PARAMETER);
|
|
|
|
*plHelpContext = _lHelpFileContext;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_HelpFileContext( THIS_ long lHelpContext )
|
|
{
|
|
RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::Qualifiers(THIS_ IADsCollection FAR* FAR* ppQualifiers)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
|
|
PPROPENTRY
|
|
CreatePropertyList(
|
|
LPWSTR_LIST lpStringList
|
|
)
|
|
{
|
|
PPROPENTRY pStart = NULL;
|
|
PPROPENTRY pPropEntry = NULL;
|
|
|
|
while (lpStringList) {
|
|
|
|
pPropEntry = CreatePropertyEntry(
|
|
lpStringList->szString,
|
|
0
|
|
);
|
|
|
|
if (!pPropEntry)
|
|
goto error;
|
|
|
|
pPropEntry->pNext = pStart;
|
|
pStart = pPropEntry;
|
|
|
|
lpStringList = lpStringList->Next;
|
|
}
|
|
|
|
error:
|
|
return(pStart);
|
|
}
|
|
|
|
HRESULT
|
|
MakeVariantFromPropList(
|
|
PPROPENTRY pPropList,
|
|
DWORD dwNumEntries,
|
|
VARIANT * pVarList
|
|
)
|
|
{
|
|
SAFEARRAYBOUND sabNewArray;
|
|
SAFEARRAY * pFilter = NULL;
|
|
HRESULT hr = S_OK;
|
|
DWORD dwSLBound = 0;
|
|
DWORD dwSUBound = 0;
|
|
DWORD i = 0;
|
|
VARIANT v;
|
|
|
|
VariantInit(pVarList);
|
|
|
|
sabNewArray.cElements = dwNumEntries;
|
|
sabNewArray.lLbound = 0;
|
|
|
|
pFilter = SafeArrayCreate(
|
|
VT_VARIANT,
|
|
1,
|
|
&sabNewArray
|
|
);
|
|
|
|
if (!pFilter) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
for (i = dwSLBound; i < (dwSLBound + dwNumEntries); i++) {
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_BSTR;
|
|
|
|
V_BSTR(&v) = SysAllocString(pPropList->pszPropName);
|
|
|
|
hr = SafeArrayPutElement(
|
|
pFilter,
|
|
(long*)&i,
|
|
(void *)&v
|
|
);
|
|
VariantClear(&v);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pPropList = pPropList->pNext;
|
|
|
|
}
|
|
|
|
V_VT(pVarList) = VT_ARRAY | VT_VARIANT;
|
|
V_ARRAY(pVarList) = pFilter;
|
|
|
|
RRETURN(S_OK);
|
|
|
|
error:
|
|
|
|
if (pFilter) {
|
|
SafeArrayDestroy(pFilter);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_OptionalProperties( THIS_ VARIANT FAR *retval )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = MakeVariantFromPropList(
|
|
_lpOptionalAttributes,
|
|
_dwNumberOfOptionalAttributes,
|
|
retval
|
|
);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_OptionalProperties( THIS_ VARIANT vOptionalProperties )
|
|
{
|
|
|
|
HRESULT hr = E_NOTIMPL;
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::get_NamingProperties( THIS_ VARIANT FAR *retval )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = MakeVariantFromPropList(
|
|
_lpNamingAttributes,
|
|
_dwNumberOfNamingAttributes,
|
|
retval
|
|
);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSClass::put_NamingProperties( THIS_ VARIANT vNamingProperties )
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|