You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
335 lines
8.8 KiB
335 lines
8.8 KiB
// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
|
|
// JOBase.cpp
|
|
|
|
|
|
#include "precomp.h"
|
|
//#include <windows.h>
|
|
//#include <cominit.h>
|
|
//#include <objbase.h>
|
|
//#include <comdef.h>
|
|
|
|
#include "CUnknown.h"
|
|
#include <wbemprov.h>
|
|
#include "FRQueryEx.h"
|
|
#include "globals.h"
|
|
#include "CVARIANT.h"
|
|
#include "CObjProps.h"
|
|
#include "JOBase.h"
|
|
#include "Factory.h"
|
|
#include "helpers.h"
|
|
#include <map>
|
|
#include <vector>
|
|
#include "SmartHandle.h"
|
|
#include "AssertBreak.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HRESULT CJOBase::Initialize(
|
|
LPWSTR pszUser,
|
|
LONG lFlags,
|
|
LPWSTR pszNamespace,
|
|
LPWSTR pszLocale,
|
|
IWbemServices *pNamespace,
|
|
IWbemContext *pCtx,
|
|
IWbemProviderInitSink *pInitSink)
|
|
{
|
|
if(pNamespace) pNamespace->AddRef();
|
|
m_pNamespace = pNamespace;
|
|
m_chstrNamespace = pszNamespace;
|
|
|
|
//Let CIMOM know you are initialized
|
|
pInitSink->SetStatus(
|
|
WBEM_S_INITIALIZED,
|
|
0);
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
|
|
|
|
|
|
HRESULT CJOBase::GetObjectAsync(
|
|
const BSTR ObjectPath,
|
|
long lFlags,
|
|
IWbemContext __RPC_FAR *pCtx,
|
|
IWbemObjectSink __RPC_FAR *pResponseHandler,
|
|
CObjProps& objprops,
|
|
PFN_CHECK_PROPS pfnChk,
|
|
LPWSTR wstrClassName,
|
|
LPCWSTR wstrKeyProp)
|
|
{
|
|
HRESULT hr = WBEM_E_NOT_FOUND;
|
|
|
|
// We need the name of the instance they requested...
|
|
WCHAR wstrObjInstKeyVal[MAX_PATH];
|
|
hr = GetObjInstKeyVal(
|
|
ObjectPath,
|
|
wstrClassName,
|
|
wstrKeyProp,
|
|
wstrObjInstKeyVal,
|
|
sizeof(wstrObjInstKeyVal) - sizeof(WCHAR));
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// wstrObjInstKeyVal now contains the name of the object. See if
|
|
// it exists...
|
|
SmartHandle hJob;
|
|
hJob = ::OpenJobObject(
|
|
MAXIMUM_ALLOWED,
|
|
FALSE,
|
|
wstrObjInstKeyVal);
|
|
|
|
if(hJob)
|
|
{
|
|
// We seem to have found one matching the specified name,
|
|
// so create a return instance...
|
|
objprops.SetJobHandle(hJob);
|
|
IWbemClassObjectPtr pIWCO = NULL;
|
|
|
|
hr = CreateInst(
|
|
m_pNamespace,
|
|
&pIWCO,
|
|
_bstr_t(wstrClassName),
|
|
pCtx);
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// see what properties are requested...
|
|
hr = objprops.GetWhichPropsReq(
|
|
ObjectPath,
|
|
pCtx,
|
|
wstrClassName,
|
|
pfnChk);
|
|
}
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// set the key properties...
|
|
hr = objprops.SetKeysFromPath(
|
|
ObjectPath,
|
|
pCtx);
|
|
}
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// set the non-key requested properties...
|
|
hr = objprops.SetNonKeyReqProps();
|
|
}
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Load requested non-key properties
|
|
// to the instance...
|
|
hr = objprops.LoadPropertyValues(
|
|
pIWCO);
|
|
|
|
// Commit the instance...
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = pResponseHandler->Indicate(
|
|
1,
|
|
&pIWCO);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set Status
|
|
pResponseHandler->SetStatus(0, hr, NULL, NULL);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
HRESULT CJOBase::ExecQueryAsync(
|
|
const BSTR QueryLanguage,
|
|
const BSTR Query,
|
|
long lFlags,
|
|
IWbemContext __RPC_FAR *pCtx,
|
|
IWbemObjectSink __RPC_FAR *pResponseHandler,
|
|
CObjProps& objprops,
|
|
LPCWSTR wstrClassName,
|
|
LPCWSTR wstrKeyProp)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
// We will optimize for those cases in which
|
|
// a particular set of named job objects
|
|
// (e.g., 1 or more). Enumerate also
|
|
// optimizes for the properties that were
|
|
// requested.
|
|
CFrameworkQuery cfwq;
|
|
hr = cfwq.Init(
|
|
QueryLanguage,
|
|
Query,
|
|
lFlags,
|
|
m_chstrNamespace);
|
|
|
|
std::vector<_bstr_t> rgNamedJOs;
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = cfwq.GetValuesForProp(
|
|
_bstr_t(wstrKeyProp),
|
|
rgNamedJOs);
|
|
}
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = Enumerate(
|
|
pCtx,
|
|
pResponseHandler,
|
|
rgNamedJOs,
|
|
objprops,
|
|
wstrClassName);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
HRESULT CJOBase::CreateInstanceEnumAsync(
|
|
const BSTR Class,
|
|
long lFlags,
|
|
IWbemContext __RPC_FAR *pCtx,
|
|
IWbemObjectSink __RPC_FAR *pResponseHandler,
|
|
CObjProps& objprops,
|
|
LPCWSTR wstrClassName)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
if(wcsicmp(
|
|
Class,
|
|
wstrClassName) != NULL)
|
|
{
|
|
hr = WBEM_E_INVALID_CLASS;
|
|
}
|
|
|
|
// For every job object, return all accounting
|
|
// info properties...
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Get a list of named jobs...
|
|
std::vector<_bstr_t> rgNamedJOs;
|
|
hr = GetJobObjectList(rgNamedJOs);
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = Enumerate(
|
|
pCtx,
|
|
pResponseHandler,
|
|
rgNamedJOs,
|
|
objprops,
|
|
wstrClassName);
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
HRESULT CJOBase::Enumerate(
|
|
IWbemContext __RPC_FAR *pCtx,
|
|
IWbemObjectSink __RPC_FAR *pResponseHandler,
|
|
std::vector<_bstr_t>& rgNamedJOs,
|
|
CObjProps& objprops,
|
|
LPCWSTR wstrClassName)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
long lNumJobs = rgNamedJOs.size();
|
|
|
|
try // CVARIANT can throw and I want the error...
|
|
{
|
|
if(lNumJobs > 0)
|
|
{
|
|
// Create an object path...
|
|
_bstr_t bstrtObjPath;
|
|
bstrtObjPath = wstrClassName;
|
|
|
|
// Get which props requested...
|
|
hr = objprops.GetWhichPropsReq(
|
|
bstrtObjPath,
|
|
pCtx);
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
SmartHandle hJob;
|
|
|
|
for(long m = 0L; m < lNumJobs; m++)
|
|
{
|
|
// We have the name of a JO; need to open it up
|
|
// and get its properties...
|
|
hJob = ::OpenJobObject(
|
|
MAXIMUM_ALLOWED,
|
|
FALSE,
|
|
(LPCWSTR)(rgNamedJOs[m]));
|
|
// (NOTE: hJob smarthandle class automatically
|
|
// closes its handle on destruction and on
|
|
// reassignment.)
|
|
if(hJob)
|
|
{
|
|
// Set the handle...
|
|
objprops.SetJobHandle(hJob);
|
|
|
|
// Set the key properties directly...
|
|
std::vector<CVARIANT> vecvKeys;
|
|
CVARIANT vID(rgNamedJOs[m]);
|
|
vecvKeys.push_back(vID);
|
|
hr = objprops.SetKeysDirect(vecvKeys);
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// set the non-key requested
|
|
// properties...
|
|
hr = objprops.SetNonKeyReqProps();
|
|
}
|
|
|
|
// Create a new outgoing instance...
|
|
IWbemClassObjectPtr pIWCO = NULL;
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = CreateInst(
|
|
m_pNamespace,
|
|
&pIWCO,
|
|
_bstr_t(wstrClassName),
|
|
pCtx);
|
|
}
|
|
|
|
// Load the properties of the
|
|
// new outgoing instance...
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = objprops.LoadPropertyValues(pIWCO);
|
|
}
|
|
|
|
// And send it out...
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = pResponseHandler->Indicate(
|
|
1,
|
|
&pIWCO);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ASSERT_BREAK(0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch(CVARIANTError& cve)
|
|
{
|
|
hr = cve.GetWBEMError();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|