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.
 
 
 
 
 
 

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