CCLSOBJ.CPP
/*++ 
 
Copyright (c) 1996 Microsoft Corporation 
 
Module Name: 
 
    CClsObj.cpp 
 
Abstract: 
 
Author: 
 
Environment: 
 
    User mode 
 
Revision History : 
 
--*/ 
#include "adssmp.h" 
#pragma hdrstop 
 
//  Class CSampleDSClass 
 
DEFINE_IDispatch_Implementation(CSampleDSClass) 
DEFINE_IADs_Implementation(CSampleDSClass) 
 
 
CSampleDSClass::CSampleDSClass(): 
      _pDispMgr( NULL ), 
      _lpClassName(0), 
      _dwNumberOfMandatoryAttributes(0), 
      _lpMandatoryAttributes(0) 
 
{ 
    ENLIST_TRACKING(CSampleDSClass); 
} 
 
HRESULT 
CSampleDSClass::CreateClass( 
    BSTR Parent, 
    BSTR CommonName, 
    LPSampleDS_CLASS_DEF lpClassDefs, 
    DWORD dwObjectState, 
    REFIID riid, 
    void **ppvObj 
    ) 
{ 
    CSampleDSClass FAR * pClass = NULL; 
    HRESULT hr = S_OK; 
 
    hr = AllocateClassObject(&pClass); 
    BAIL_ON_FAILURE(hr); 
 
    hr = pClass->InitializeCoreObject( 
                Parent, 
                CommonName, 
                CLASS_CLASS_NAME, 
                L"", 
                CLSID_SampleDSClass, 
                dwObjectState 
                ); 
    BAIL_ON_FAILURE(hr); 
 
    hr = pClass->QueryInterface(riid, ppvObj); 
    BAIL_ON_FAILURE(hr); 
 
    pClass->_dwNumberOfMandatoryAttributes = 
                    lpClassDefs->dwNumberOfMandatoryAttributes; 
    pClass->_lpMandatoryAttributes = CreatePropertyList( 
                                          lpClassDefs->lpMandatoryAttributes 
                                          ); 
     
    pClass->Release(); 
 
    RRETURN(hr); 
 
error: 
 
    delete pClass; 
    RRETURN(hr); 
} 
 
HRESULT 
CSampleDSClass::CreateClass( 
    BSTR Parent, 
    BSTR CommonName, 
    HANDLE hTree, 
    DWORD dwObjectState, 
    REFIID riid, 
    void **ppvObj 
    ) 
{ 
    HRESULT hr = S_OK; 
    LPSampleDS_CLASS_DEF lpClassDefs = NULL; 
 
    hr = SampleDSGetClassDefinition(&lpClassDefs, 
                                    CommonName); 
    BAIL_ON_FAILURE(hr); 
     
    if (!lpClassDefs) { 
        hr = E_FAIL; 
        BAIL_ON_FAILURE(hr); 
    } 
 
    hr = CSampleDSClass::CreateClass( 
                    Parent, 
                    CommonName, 
                    lpClassDefs, 
                    dwObjectState, 
                    riid, 
                    ppvObj 
                    ); 
 
error: 
    if (lpClassDefs) { 
        SampleDSFreeClassDefinition(lpClassDefs, 
                                    1); 
    }; 
    RRETURN(hr); 
} 
 
 
CSampleDSClass::~CSampleDSClass( ) 
{ 
    delete _pDispMgr; 
} 
 
STDMETHODIMP 
CSampleDSClass::QueryInterface( 
    REFIID iid, 
    LPVOID FAR* ppv 
    ) 
{ 
    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 
CSampleDSClass::SetInfo(THIS) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
STDMETHODIMP 
CSampleDSClass::GetInfo(THIS) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
HRESULT 
CSampleDSClass::AllocateClassObject( 
    CSampleDSClass ** ppClass 
    ) 
{ 
    CSampleDSClass FAR * pClass = NULL; 
    CDispatchMgr FAR * pDispMgr = NULL; 
    HRESULT hr = S_OK; 
 
    pClass = new CSampleDSClass(); 
    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); 
 
    hr = LoadTypeInfoEntry( 
                pDispMgr, 
                LIBID_ADs, 
                IID_IADsContainer, 
                (IADsContainer *)pClass, 
                DISPID_NEWENUM 
                ); 
    BAIL_ON_FAILURE(hr); 
 
    pClass->_pDispMgr = pDispMgr; 
    *ppClass = pClass; 
 
    RRETURN(hr); 
 
error: 
    delete  pDispMgr; 
 
    RRETURN(hr); 
 
} 
 
 
STDMETHODIMP 
CSampleDSClass::GetInfo( 
    THIS_ DWORD dwApiLevel, 
    BOOL fExplicit 
    ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
 
STDMETHODIMP 
CSampleDSClass::Get( 
    THIS_ BSTR bstrName, 
    VARIANT FAR* pvProp 
    ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
 
 
STDMETHODIMP 
CSampleDSClass::Put( 
    THIS_ BSTR bstrName, 
    VARIANT vProp 
    ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
PPROPENTRY 
CreatePropertyList( 
    LPWSTR_LIST  lpStringList 
    ) 
{ 
    PPROPENTRY pStart = NULL; 
    PPROPENTRY pPropEntry = NULL; 
 
    while (lpStringList) { 
 
        pPropEntry = CreatePropertyEntry( 
                            lpStringList->lpString, 
                            0 
                            ); 
 
        pPropEntry->pNext = pStart; 
        pStart = pPropEntry; 
 
        lpStringList = lpStringList->Next; 
    } 
 
    return(pStart); 
} 
 
 
PPROPENTRY 
CreatePropertyEntry( 
    LPWSTR pszPropertyName, 
    DWORD dwSyntaxId 
    ) 
{ 
    LPWSTR pszTemp = NULL; 
    PPROPENTRY pPropName = NULL; 
 
    pszTemp = (LPWSTR)AllocProvStr( 
                    pszPropertyName 
                    ); 
    if (!pszTemp) { 
        return(NULL); 
    } 
 
    pPropName = (PPROPENTRY)AllocProvMem( 
                        sizeof(PROPENTRY) 
                        ); 
    if (!pPropName) { 
        FreeProvStr(pszTemp); 
        return(NULL); 
    } 
 
    pPropName->pszPropName = pszTemp; 
    pPropName->dwSyntaxId = dwSyntaxId; 
 
    return(pPropName); 
} 
 
void 
FreePropertyEntry( 
    PPROPENTRY pPropName 
    ) 
{ 
    if (pPropName->pszPropName) { 
        FreeProvStr(pPropName->pszPropName); 
    } 
 
    FreeProvMem(pPropName); 
 
    return; 
} 
 
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 
                ); 
        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); 
} 
 
/* IADsClass methods */ 
 
STDMETHODIMP 
CSampleDSClass::get_PrimaryInterface( THIS_ BSTR FAR *pbstrGUID ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_CLSID( THIS_ BSTR FAR *pbstrCLSID ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_CLSID( THIS_ BSTR bstrCLSID ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_OID( THIS_ BSTR FAR *pbstrOID ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_OID( THIS_ BSTR bstrOID ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_Abstract( THIS_ VARIANT_BOOL FAR *pfAbstract ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_Abstract( THIS_ VARIANT_BOOL fAbstract ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_MandatoryProperties( THIS_ VARIANT FAR *pvMandatoryProperties ) 
{ 
    HRESULT hr = S_OK; 
 
    hr = MakeVariantFromPropList( 
            _lpMandatoryAttributes, 
            _dwNumberOfMandatoryAttributes, 
            pvMandatoryProperties 
            ); 
    RRETURN(hr); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_MandatoryProperties( THIS_ VARIANT vMandatoryProperties ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_DerivedFrom( THIS_ VARIANT FAR *pvDerivedFrom ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_DerivedFrom( THIS_ VARIANT vDerivedFrom ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_Containment( THIS_ VARIANT FAR *pvContainment ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_Containment( THIS_ VARIANT vContainment ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_Container( THIS_ VARIANT_BOOL FAR *pfContainer ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_Container( THIS_ VARIANT_BOOL fContainer ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_HelpFileName( THIS_ BSTR FAR *pbstrHelpFileName ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_HelpFileName( THIS_ BSTR bstrHelpFile ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_HelpFileContext( THIS_ long FAR *plHelpContext ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_HelpFileContext( THIS_ long lHelpContext ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::Qualifiers(THIS_ IADsCollection FAR* FAR* ppQualifiers) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_Auxiliary( THIS_ VARIANT_BOOL FAR *pfAuxiliary ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_Auxiliary( THIS_ VARIANT_BOOL fAuxiliary ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_OptionalProperties( THIS_ VARIANT FAR *retval ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_OptionalProperties( THIS_ VARIANT vOptionalProperties ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_NamingProperties( THIS_ VARIANT FAR *retval ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_NamingProperties( THIS_ VARIANT vNamingProperties ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
STDMETHODIMP 
CSampleDSClass::get_AuxDerivedFrom( THIS_ VARIANT FAR *pvAuxDerivedFrom ) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_AuxDerivedFrom( THIS_ VARIANT vAuxDerivedFrom ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
} 
 
STDMETHODIMP 
CSampleDSClass::get_PossibleSuperiors( THIS_ VARIANT FAR *pvPossSuperiors) 
{ 
    RRETURN(E_NOTIMPL); 
} 
 
STDMETHODIMP 
CSampleDSClass::put_PossibleSuperiors( THIS_ VARIANT vPossSuperiors ) 
{ 
    RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED); 
}