windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/baseprov/baseprov.cpp
2020-09-26 16:20:57 +08:00

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;
}