mirror of https://github.com/tongzx/nt5src
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.
334 lines
9.5 KiB
334 lines
9.5 KiB
// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
|
|
// JobObjectProv.h
|
|
|
|
|
|
#include "precomp.h"
|
|
#include <wbemprov.h>
|
|
#include "FRQueryEx.h"
|
|
#include "helpers.h"
|
|
#include "globals.h"
|
|
#include <map>
|
|
#include <vector>
|
|
#include "CVARIANT.h"
|
|
#include "CObjProps.h"
|
|
#include <crtdbg.h>
|
|
|
|
#ifndef PROP_NONE_REQUIRED
|
|
#define PROP_NONE_REQUIRED 0x00000000
|
|
#endif
|
|
|
|
CObjProps::CObjProps(CHString& chstrNamespace)
|
|
{
|
|
m_chstrNamespace = chstrNamespace;
|
|
}
|
|
|
|
|
|
|
|
CObjProps::~CObjProps()
|
|
{
|
|
// Clean the property map.
|
|
ClearProps();
|
|
}
|
|
|
|
|
|
void CObjProps::ClearProps()
|
|
{
|
|
// Clean the property map.
|
|
SHORT2PVARIANT::iterator theIterator;
|
|
|
|
for(theIterator = m_PropMap.begin();
|
|
theIterator != m_PropMap.end();
|
|
theIterator++)
|
|
{
|
|
if(theIterator->second != NULL)
|
|
{
|
|
delete theIterator->second;
|
|
}
|
|
}
|
|
m_PropMap.clear();
|
|
}
|
|
|
|
|
|
|
|
// Accessors to the requested properties member.
|
|
void CObjProps::SetReqProps(DWORD dwProps)
|
|
{
|
|
m_dwReqProps = dwProps;
|
|
}
|
|
|
|
DWORD CObjProps::GetReqProps()
|
|
{
|
|
return m_dwReqProps;
|
|
}
|
|
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
// Function: SetKeysFromPath
|
|
//
|
|
// called by the DeleteInstance and GetObject in order to load a
|
|
// IWbemClassObject* with the key values in an object path.
|
|
//
|
|
// Inputs: IWbemClassObject* pInstance - Instance to store
|
|
// key values in.
|
|
// ParsedObjectPath* pParsedObjectPath - All the news
|
|
// thats fit to print.
|
|
// rgKeyNameArray An array of CHStrings containing
|
|
// the names of the key properties.
|
|
// sKeyNum An array of the key property
|
|
// reference numbers.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: HRESULT Success/Failure
|
|
//
|
|
// Comments: The number of elements in rgKeyNameArray and sKeyNum must be
|
|
// the same.
|
|
//
|
|
//***************************************************************************
|
|
HRESULT CObjProps::SetKeysFromPath(
|
|
const BSTR ObjectPath,
|
|
IWbemContext __RPC_FAR *pCtx,
|
|
LPCWSTR wstrClassName,
|
|
CHStringArray& rgKeyNameArray,
|
|
short sKeyNum[])
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
_ASSERT(sKeyNum);
|
|
|
|
CObjectPathParser objpathParser;
|
|
ParsedObjectPath* pParsedPath = NULL;
|
|
|
|
try
|
|
{
|
|
int iParseResult = objpathParser.Parse(
|
|
ObjectPath,
|
|
&pParsedPath);
|
|
|
|
if(CObjectPathParser::NoError == iParseResult)
|
|
{
|
|
CFrameworkQueryEx cfwqe;
|
|
cfwqe.Init(
|
|
(ParsedObjectPath*) pParsedPath,
|
|
(IWbemContext*) pCtx,
|
|
wstrClassName,
|
|
(CHString&) m_chstrNamespace);
|
|
|
|
if(rgKeyNameArray.GetSize() == pParsedPath->m_dwNumKeys)
|
|
{
|
|
// populate key props...
|
|
for (DWORD i = 0;
|
|
SUCCEEDED(hr) && i < (pParsedPath->m_dwNumKeys);
|
|
i++)
|
|
{
|
|
if (pParsedPath->m_paKeys[i])
|
|
{
|
|
// If a name was specified in the form class.keyname=value
|
|
if (pParsedPath->m_paKeys[i]->m_pName != NULL)
|
|
{
|
|
if(_wcsicmp(pParsedPath->m_paKeys[i]->m_pName,
|
|
rgKeyNameArray[i]) == 0)
|
|
{
|
|
// Store the value...
|
|
m_PropMap.insert(SHORT2PVARIANT::value_type(
|
|
sKeyNum[i],
|
|
new CVARIANT(pParsedPath->m_paKeys[i]->m_vValue)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// There is a special case that you can say class=value
|
|
// only one key allowed in the format. Check the names
|
|
// on the path
|
|
if (pParsedPath->m_dwNumKeys == 1)
|
|
{
|
|
// Store the value...
|
|
m_PropMap.insert(SHORT2PVARIANT::value_type(
|
|
sKeyNum[i],
|
|
new CVARIANT(pParsedPath->m_paKeys[i]->m_vValue)));
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OBJECT_PATH;
|
|
_ASSERT(0); // somebody lied about the number
|
|
// of keys or the datatype was wrong
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OBJECT_PATH;
|
|
_ASSERT(0); // somebody lied about the number of keys!
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OBJECT_PATH;
|
|
_ASSERT(0); // somebody lied about the number of keys!
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OBJECT_PATH;
|
|
_ASSERT(0);
|
|
}
|
|
|
|
if (pParsedPath)
|
|
{
|
|
objpathParser.Free( pParsedPath );
|
|
}
|
|
}
|
|
catch(CVARIANTError& cve)
|
|
{
|
|
hr = cve.GetWBEMError();
|
|
if (pParsedPath)
|
|
{
|
|
objpathParser.Free( pParsedPath );
|
|
}
|
|
}
|
|
catch(...)
|
|
{
|
|
if (pParsedPath)
|
|
{
|
|
objpathParser.Free( pParsedPath );
|
|
}
|
|
throw;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
// Allows direct setting of key properties.
|
|
// Key property values are stored in vecvKeys.
|
|
// sKeyNum is an array of the key property
|
|
// positions in m_PropMap. The elements of
|
|
// these two arrays map to each other (e.g.,
|
|
// the first element in vecvKeys should be
|
|
// associated with the first element in sKeyNum,
|
|
// and so on).
|
|
HRESULT CObjProps::SetKeysDirect(
|
|
std::vector<CVARIANT>& vecvKeys,
|
|
short sKeyNum[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
UINT uiCount = vecvKeys.size();
|
|
|
|
try // CVARIANT can throw and I want the error...
|
|
{
|
|
for (UINT u = 0; u < uiCount; u++)
|
|
{
|
|
// Store the value...
|
|
m_PropMap.insert(SHORT2PVARIANT::value_type(
|
|
sKeyNum[u],
|
|
new CVARIANT(vecvKeys[u])));
|
|
}
|
|
}
|
|
catch(CVARIANTError& cve)
|
|
{
|
|
hr = cve.GetWBEMError();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
HRESULT CObjProps::GetWhichPropsReq(
|
|
CFrameworkQuery& cfwq,
|
|
PFN_CHECK_PROPS pfnChk)
|
|
{
|
|
// Get the requested properties for this
|
|
// specific object via derived class fn...
|
|
m_dwReqProps = pfnChk(cfwq);
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
|
|
|
|
|
|
// Loads all properties stored in this
|
|
// object into a new IWbemClassObject instance.
|
|
HRESULT CObjProps::LoadPropertyValues(
|
|
LPCWSTR rgwstrPropNames[],
|
|
IWbemClassObject* pIWCO)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
if(!pIWCO) return E_POINTER;
|
|
|
|
SHORT2PVARIANT::iterator theIterator;
|
|
|
|
// Our map will only contain entries for properties
|
|
// that were set via SetNonKeyReqProps, which only
|
|
// set properties that were requested.
|
|
try // CVARIANT can throw and I want the error...
|
|
{
|
|
for(theIterator = m_PropMap.begin();
|
|
theIterator != m_PropMap.end() && SUCCEEDED(hr);
|
|
theIterator++)
|
|
{
|
|
// Because DWORDS and ULONGLONGs are not
|
|
// automation compatible types (although
|
|
// they are valid CIM types!), we need
|
|
// to handle those two differently. Same
|
|
// with the other types special cased below.
|
|
LPCWSTR wstrFoo = rgwstrPropNames[theIterator->first];
|
|
CVARIANT* pvFoo = theIterator->second;
|
|
|
|
if(theIterator->second->GetType() == VT_UI4)
|
|
{
|
|
WCHAR wstrTmp[256] = { '\0' };
|
|
_ultow(theIterator->second->GetDWORD(), wstrTmp, 10);
|
|
CVARIANT vTmp(wstrTmp);
|
|
hr = pIWCO->Put(
|
|
rgwstrPropNames[theIterator->first],
|
|
0,
|
|
&vTmp,
|
|
NULL);
|
|
}
|
|
else if(theIterator->second->GetType() == VT_UI8)
|
|
{
|
|
WCHAR wstrTmp[256] = { '\0' };
|
|
_ui64tow(theIterator->second->GetULONGLONG(), wstrTmp, 10);
|
|
CVARIANT vTmp(wstrTmp);
|
|
hr = pIWCO->Put(
|
|
rgwstrPropNames[theIterator->first],
|
|
0,
|
|
&vTmp,
|
|
NULL);
|
|
}
|
|
else if(theIterator->second->GetType() == VT_I8)
|
|
{
|
|
WCHAR wstrTmp[256] = { '\0' };
|
|
_i64tow(theIterator->second->GetLONGLONG(), wstrTmp, 10);
|
|
CVARIANT vTmp(wstrTmp);
|
|
hr = pIWCO->Put(
|
|
rgwstrPropNames[theIterator->first],
|
|
0,
|
|
&vTmp,
|
|
NULL);
|
|
}
|
|
else
|
|
{
|
|
hr = pIWCO->Put(
|
|
rgwstrPropNames[theIterator->first],
|
|
0,
|
|
*(theIterator->second),
|
|
NULL);
|
|
}
|
|
}
|
|
}
|
|
catch(CVARIANTError& cve)
|
|
{
|
|
hr = cve.GetWBEMError();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|