215 lines
5.2 KiB
C++
215 lines
5.2 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (C) 1999-2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "baseprov.h"
|
||
|
|
||
|
#ifdef __FOR_ALPHA
|
||
|
#define EXTRA_PUT_PARAMS
|
||
|
#else
|
||
|
#define EXTRA_PUT_PARAMS ,0
|
||
|
#endif
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// CInstPro::CInstPro
|
||
|
// CInstPro::~CInstPro
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
|
||
|
CBaseProvider::CBaseProvider(BSTR ObjectPath, BSTR User, BSTR Password)
|
||
|
{
|
||
|
m_pNamespace = NULL;
|
||
|
m_cRef=0;
|
||
|
|
||
|
ObjectCreated();
|
||
|
|
||
|
IHmmLocator *pOLEMSLocator;
|
||
|
SCODE sc;
|
||
|
|
||
|
// Get a pointer locator and use it to get a pointer to the gateway
|
||
|
|
||
|
sc = CoCreateInstance(CLSID_HmmLocator,
|
||
|
NULL,
|
||
|
CLSCTX_INPROC_SERVER,
|
||
|
IID_IHmmLocator,
|
||
|
(void**)&pOLEMSLocator);
|
||
|
if(FAILED(sc))
|
||
|
return;
|
||
|
|
||
|
if(ObjectPath == NULL)
|
||
|
{
|
||
|
ObjectPath = L"root\\default";
|
||
|
}
|
||
|
sc = pOLEMSLocator->ConnectServer(ObjectPath, User, Password, 0, 0,
|
||
|
&m_pNamespace);
|
||
|
pOLEMSLocator->Release(); // Release the locator handle, we no longer need it
|
||
|
if(sc != S_OK) {
|
||
|
m_pNamespace = NULL;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
#ifndef __FOR_ALPHA
|
||
|
// Mark this interface pointer as "critical"
|
||
|
// =========================================
|
||
|
|
||
|
IHmmConfigure* pConfigure;
|
||
|
sc = m_pNamespace->QueryInterface(IID_IHmmConfigure, (void**)&pConfigure);
|
||
|
if(SUCCEEDED(sc))
|
||
|
{
|
||
|
pConfigure->SetConfigurationFlags(HMM_CONFIGURATION_FLAG_CRITICAL_USER);
|
||
|
pConfigure->Release();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// something weird happened --- old version of HMOM or something
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
sc = m_pNamespace->GetObject(L"AssocProvNotifyStatus", 0, &m_pStatusClass,
|
||
|
NULL);
|
||
|
if(FAILED(sc))
|
||
|
{
|
||
|
sc = m_pNamespace->GetObject(L"__ExtendedStatus", 0, &m_pStatusClass,
|
||
|
NULL);
|
||
|
if(FAILED(sc))
|
||
|
{
|
||
|
m_pNamespace = NULL;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CBaseProvider::~CBaseProvider(void)
|
||
|
{
|
||
|
ObjectDestroyed();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// CInstPro::QueryInterface
|
||
|
// CInstPro::AddRef
|
||
|
// CInstPro::Release
|
||
|
//
|
||
|
// Purpose: IUnknown members for CInstPro object.
|
||
|
//***************************************************************************
|
||
|
|
||
|
|
||
|
STDMETHODIMP CBaseProvider::QueryInterface(REFIID riid, PPVOID ppv)
|
||
|
{
|
||
|
*ppv=NULL;
|
||
|
|
||
|
if (IID_IUnknown==riid || IID_IHmmServices == riid)
|
||
|
*ppv=this;
|
||
|
|
||
|
if (NULL!=*ppv) {
|
||
|
AddRef();
|
||
|
return NOERROR;
|
||
|
}
|
||
|
else
|
||
|
return E_NOINTERFACE;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CBaseProvider::AddRef(void)
|
||
|
{
|
||
|
return InterlockedIncrement(&m_cRef);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CBaseProvider::Release(void)
|
||
|
{
|
||
|
LONG cRef = InterlockedDecrement(&m_cRef);
|
||
|
if(cRef == 0)
|
||
|
{
|
||
|
delete this;
|
||
|
}
|
||
|
return cRef;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// CInstPro::PutInstance
|
||
|
//
|
||
|
// Purpose: Wites the intances data. Here we dont do anything and just
|
||
|
// return HMM_NO_ERROR;
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
|
||
|
STDMETHODIMP CBaseProvider::PutInstance( IHmmClassObject FAR* pClassInt,
|
||
|
long lFlags, IHmmClassObject FAR* FAR* ppErrorObject)
|
||
|
{
|
||
|
return HMM_E_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// CInstPro::CreateInstanceEnumAsync
|
||
|
//
|
||
|
// Purpose: Asynchronously enumerates the instances. AsyncEnum is where the
|
||
|
// thread runs.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
|
||
|
SCODE CBaseProvider::StuffErrorCode(HRESULT hCode, IHmmObjectSink* pSink)
|
||
|
{
|
||
|
IHmmClassObject* pStatus;
|
||
|
HRESULT hres;
|
||
|
|
||
|
hres = m_pStatusClass->SpawnInstance(0, &pStatus);
|
||
|
VARIANT v;
|
||
|
V_VT(&v) = VT_I4;
|
||
|
V_I4(&v) = hCode;
|
||
|
hres = pStatus->Put(L"StatusCode", 0, &v EXTRA_PUT_PARAMS);
|
||
|
|
||
|
hres = pSink->Indicate(1, &pStatus);
|
||
|
pStatus->Release();
|
||
|
return hres;
|
||
|
}
|
||
|
|
||
|
|
||
|
SCODE CBaseProvider::CreateInstanceEnumAsync( BSTR RefStr, long lFlags,
|
||
|
IHmmObjectSink FAR* pHandler, long FAR* plAsyncRequestHandle)
|
||
|
{
|
||
|
HRESULT hres = EnumInstances(RefStr, lFlags, pHandler);
|
||
|
StuffErrorCode(hres, pHandler);
|
||
|
return hres;
|
||
|
}
|
||
|
|
||
|
SCODE CBaseProvider::GetObjectAsync(BSTR ObjectPath, long lFlags,
|
||
|
IHmmObjectSink FAR* pHandler, long * plAsyncRquestHandle)
|
||
|
{
|
||
|
CObjectPathParser Parser;
|
||
|
ParsedObjectPath* pParsedPath;
|
||
|
int nRes = Parser.Parse(ObjectPath, &pParsedPath);
|
||
|
if(nRes != CObjectPathParser::NoError)
|
||
|
{
|
||
|
return HMM_E_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
IHmmClassObject* pInstance;
|
||
|
HRESULT hres = GetInstance(pParsedPath, lFlags, &pInstance);
|
||
|
Parser.Free(pParsedPath);
|
||
|
|
||
|
StuffErrorCode(hres, pHandler);
|
||
|
return HMM_S_NO_ERROR;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CBaseProvider::ExecQueryAsync(BSTR QueryFormat, BSTR Query,
|
||
|
long lFlags,
|
||
|
IHmmObjectSink* pResponseHandler, long* plAsyncRequestHandle)
|
||
|
{
|
||
|
StuffErrorCode(HMM_E_PROVIDER_NOT_CAPABLE, pResponseHandler);
|
||
|
return HMM_S_NO_ERROR;
|
||
|
}
|