351 lines
6.7 KiB
C++
351 lines
6.7 KiB
C++
|
#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);
|
||
|
|
||
|
}
|