Source code of Windows XP (NT5)
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.4 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;
}