#include "oleds.hxx" #pragma hdrstop #define DISPID_REGULAR 1 // Class CADsNamespaces DEFINE_IDispatch_Implementation(CADsNamespaces) DEFINE_IADs_Implementation(CADsNamespaces) CADsNamespaces::CADsNamespaces(): _pDispMgr(NULL), _bstrDefaultContainer(NULL) { VariantInit(&_vFilter); ENLIST_TRACKING(CADsNamespaces); } HRESULT CADsNamespaces::CreateNamespaces( BSTR Parent, BSTR NamespacesName, DWORD dwObjectState, REFIID riid, void **ppvObj ) { CADsNamespaces FAR * pNamespaces = NULL; HRESULT hr = S_OK; hr = AllocateNamespacesObject(&pNamespaces); BAIL_ON_FAILURE(hr); hr = pNamespaces->InitializeCoreObject(Parent, NamespacesName, L"Namespaces", CLSID_ADsNamespaces, dwObjectState); BAIL_ON_FAILURE(hr); hr = pNamespaces->QueryInterface(riid, ppvObj); BAIL_ON_FAILURE(hr); pNamespaces->Release(); RRETURN(hr); error: delete pNamespaces; RRETURN_EXP_IF_ERR(hr); } CADsNamespaces::~CADsNamespaces( ) { ADsFreeString(_bstrDefaultContainer); delete _pDispMgr; } STDMETHODIMP CADsNamespaces::QueryInterface( REFIID iid, LPVOID FAR* ppv ) { if (IsEqualIID(iid, IID_IUnknown)) { *ppv = (IADs FAR *)this; } else if (IsEqualIID(iid, IID_IDispatch)) { *ppv = (IADs FAR *)this; } else if (IsEqualIID(iid, IID_ISupportErrorInfo)) { *ppv = (ISupportErrorInfo FAR *) this; } else if (IsEqualIID(iid, IID_IADsContainer)) { *ppv = (IADsContainer FAR *) this; } else if (IsEqualIID(iid, IID_IADsNamespaces)) { *ppv = (IADsNamespaces FAR *) this; } else if (IsEqualIID(iid, IID_IADs)) { *ppv = (IADs FAR *) this; } else { *ppv = NULL; return E_NOINTERFACE; } AddRef(); return NOERROR; } // // ISupportErrorInfo method // STDMETHODIMP CADsNamespaces::InterfaceSupportsErrorInfo(THIS_ REFIID riid) { if (IsEqualIID(riid, IID_IADs) || IsEqualIID(riid, IID_IADsContainer) || IsEqualIID(riid, IID_IADsNamespaces)) { return S_OK; } else { return S_FALSE; } } STDMETHODIMP CADsNamespaces::SetInfo() { RRETURN_EXP_IF_ERR(E_NOTIMPL); } STDMETHODIMP CADsNamespaces::GetInfo() { RRETURN_EXP_IF_ERR(E_NOTIMPL); } /* IADsContainer methods */ STDMETHODIMP CADsNamespaces::get_Count(long FAR* retval) { RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED); } STDMETHODIMP CADsNamespaces::get_Filter(THIS_ VARIANT FAR* pVar) { HRESULT hr; VariantInit(pVar); hr = VariantCopy(pVar, &_vFilter); RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CADsNamespaces::put_Filter(THIS_ VARIANT Var) { HRESULT hr; VariantClear(&_vFilter); hr = VariantCopy(&_vFilter, &Var); RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CADsNamespaces::get_Hints(THIS_ VARIANT FAR* pHints) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } STDMETHODIMP CADsNamespaces::put_Hints(THIS_ VARIANT Hints) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } STDMETHODIMP CADsNamespaces::GetObject( THIS_ BSTR ClassName, BSTR RelativeName, IDispatch * FAR* ppObject ) { WCHAR szBuffer[MAX_PATH]; HRESULT hr = S_OK; if (!RelativeName || !*RelativeName) { RRETURN(E_ADS_UNKNOWN_OBJECT); } wcscpy(szBuffer, RelativeName); hr = ::GetObject( szBuffer, IID_IDispatch, (LPVOID *)ppObject, TRUE ); BAIL_ON_FAILURE(hr); error: RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CADsNamespaces::get__NewEnum(THIS_ IUnknown * FAR* retval) { HRESULT hr; IUnknown FAR* punkEnum=NULL; IEnumVARIANT * penum = NULL; *retval = NULL; // // Create new enumerator for items currently // in collection and QI for IUnknown // hr = CEnumVariant::Create(&penum); if (FAILED(hr)){ goto error; } hr = penum->QueryInterface(IID_IUnknown, (VOID FAR* FAR*)retval); if (FAILED(hr)){ goto error; } if (penum) { penum->Release(); } return NOERROR; error: if (penum) { delete penum; } RRETURN_EXP_IF_ERR(hr); } // // IADsNamespaces methods // STDMETHODIMP CADsNamespaces::get_DefaultContainer(THIS_ BSTR FAR* retval) { LPTSTR pszDefContainer = NULL; HRESULT hr; hr = QueryKeyValue(DEF_CONT_REG_LOCATION, TEXT("DefaultContainer"), &pszDefContainer); BAIL_IF_ERROR(hr); hr = ADsAllocString(pszDefContainer, retval); cleanup: if(pszDefContainer){ FreeADsMem(pszDefContainer); } RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CADsNamespaces::put_DefaultContainer(THIS_ BSTR bstrDefaultContainer) { HRESULT hr = S_OK; hr = SetKeyAndValue(DEF_CONT_REG_LOCATION, TEXT("DefaultContainer"), NULL, bstrDefaultContainer); RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CADsNamespaces::Create(THIS_ BSTR ClassName, BSTR RelativeName, IDispatch * FAR* ppObject) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } STDMETHODIMP CADsNamespaces::Delete(THIS_ BSTR SourceName, BSTR Type) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } STDMETHODIMP CADsNamespaces::CopyHere(THIS_ BSTR SourceName, BSTR NewName, IDispatch * FAR* ppObject) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } STDMETHODIMP CADsNamespaces::MoveHere( THIS_ BSTR SourceName, BSTR NewName, IDispatch * FAR* ppObject ) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } HRESULT CADsNamespaces::AllocateNamespacesObject( CADsNamespaces ** ppNamespaces ) { CADsNamespaces FAR * pNamespaces = NULL; CDispatchMgr FAR * pDispMgr = NULL; HRESULT hr = S_OK; pNamespaces = new CADsNamespaces(); if (pNamespaces == 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_IADs, (IADs *)pNamespaces, DISPID_REGULAR); BAIL_ON_FAILURE(hr); hr = LoadTypeInfoEntry(pDispMgr, LIBID_ADs, IID_IADsContainer, (IADsContainer *)pNamespaces, DISPID_NEWENUM); BAIL_ON_FAILURE(hr); pNamespaces->_pDispMgr = pDispMgr; *ppNamespaces = pNamespaces; RRETURN(hr); error: delete pDispMgr; RRETURN_EXP_IF_ERR(hr); }