windows-nt/Source/XPSP1/NT/net/wlbs/nlbmgr/wmibase/mwmiinstance.cpp
2020-09-26 16:20:57 +08:00

327 lines
8.6 KiB
C++

// Copyright (c) Microsoft. All rights reserved.
//
// This is unpublished source code of Microsoft.
// The copyright notice above does not evidence any
// actual or intended publication of such source code.
// OneLiner : Implementation of MWmiInstance
// DevUnit : wlbstest
// Author : Murtaza Hakim
// include files
#include "MWmiInstance.h"
#include "MTrace.h"
#include "MWmiError.h"
#include "WTokens.h"
#include <iostream>
using namespace std;
// default constructor is purposely left undefined. No one should use it.
// constructor
//
MWmiInstance::MWmiInstance(
const _bstr_t& objectName,
const _bstr_t& path,
IWbemLocatorPtr pwl,
IWbemServicesPtr pws )
:
_objectName( objectName ),
_path( path ),
_pwl( pwl ),
_pws( pws )
{
TRACE(MTrace::INFO, L"mwmiinstance constructor\n" );
}
// copy constructor
//
MWmiInstance::MWmiInstance( const MWmiInstance& obj)
:
_path( obj._path ),
_pwl( obj._pwl ),
_pws( obj._pws ),
_objectName( obj._objectName )
{
TRACE(MTrace::INFO, L"mwmiinstance copy constructor\n" );
}
// assignment operator
//
MWmiInstance&
MWmiInstance::operator=( const MWmiInstance& rhs )
{
_path = rhs._path;
_pwl = rhs._pwl;
_pws = rhs._pws;
_objectName = rhs._objectName;
TRACE(MTrace::INFO, L"mwmiinstance assignment operator\n" );
return *this;
}
// destructor
MWmiInstance::~MWmiInstance()
{
TRACE(MTrace::INFO, L"mwmiinstance destructor\n" );
}
// runMethod
MWmiInstance::MWmiInstance_Error
MWmiInstance::runMethod(
const _bstr_t& methodToRun,
const vector<MWmiParameter *>& inputParameters,
vector<MWmiParameter *>& outputParameters
)
{
HRESULT hr;
_variant_t v_retVal;
IWbemClassObjectPtr pwcoClass;
IWbemClassObjectPtr pwcoOutput;
IWbemClassObjectPtr pwcoInput;
IWbemClassObjectPtr pwcoInputInstance;
hr = _pws->GetObject( _objectName,
0,
NULL,
&pwcoClass,
NULL );
if( FAILED(hr) )
{
TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::GetObject failure\n");
throw _com_error( hr );
}
// check if any input parameters specified.
if( inputParameters.size() != 0 )
{
hr = pwcoClass->GetMethod( methodToRun,
0,
&pwcoInput,
NULL );
if( FAILED( hr) )
{
TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::GetMethod failure\n");
throw _com_error( hr );
}
hr = pwcoInput->SpawnInstance( 0, &pwcoInputInstance );
if( FAILED( hr) )
{
TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::SpawnInstance failure. Unable to spawn instance.\n" );
throw _com_error( hr );
}
for( int i = 0; i < inputParameters.size(); ++i )
{
hr = pwcoInputInstance->Put( inputParameters[i]->getName(),
0,
&(inputParameters[i]->getValue() ),
0 );
if( FAILED( hr ) )
{
TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::Put failure\n");
throw _com_error( hr );
}
}
}
// execute method.
hr = _pws->ExecMethod( _path,
methodToRun,
0,
NULL,
pwcoInputInstance,
&pwcoOutput,
NULL);
if( FAILED( hr) )
{
TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::ExecMethod failure\n");
throw _com_error( hr );
}
// get output parameters
for( int i = 0; i < outputParameters.size(); ++i )
{
hr = pwcoOutput->Get( outputParameters[i]->getName(),
0,
&v_retVal,
NULL,
NULL );
if( FAILED( hr) )
{
TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::Get failure\n");
throw _com_error( hr );
}
outputParameters[i]->setValue( v_retVal );
v_retVal.Clear();
}
return MWmiInstance_SUCCESS;
}
// getParameters
//
MWmiInstance::MWmiInstance_Error
MWmiInstance::getParameters( vector<MWmiParameter *>& parametersToGet )
{
HRESULT hr;
IEnumWbemClassObjectPtr pewco;
IWbemClassObjectPtr pwco;
unsigned long count;
_variant_t v_path;
bool found;
CIMTYPE vtype;
_variant_t v_value;
// get object corresponding to this path.
hr = _pws->GetObject( _path,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pwco,
NULL );
if( hr == 0x8004100c || hr == 0x8004100a )
{
TRACE(MTrace::INFO, L"as this is not supported, trying different mechanism\n");
hr = _pws->CreateInstanceEnum( _objectName,
WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pewco );
if ( FAILED(hr))
{
TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::CreateInstanceEnum failure\n");
throw _com_error( hr );
}
// there may be multiple instances.
count = 1;
while ( (hr = pewco->Next( INFINITE,
1,
&pwco,
&count ) ) == S_OK )
{
hr = pwco->Get( _bstr_t(L"__RELPATH"), 0, &v_path, NULL, NULL );
if( FAILED(hr) )
{
TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::CreateInstanceEnum failure\n");
throw _com_error( hr );
}
if( _bstr_t( v_path ) == _path )
{
// required instance found
found = true;
v_path.Clear();
break;
}
count = 1;
v_path.Clear();
}
if( found == false )
{
TRACE( MTrace::SEVERE_ERROR, "unable to find instance with path specified\n");
throw _com_error( WBEM_E_NOT_FOUND );
}
}
else if ( FAILED(hr) )
{
TRACE( MTrace::SEVERE_ERROR, L"IWbemServices::GetObject failure\n");
throw _com_error( hr );
}
for( int i = 0; i < parametersToGet.size(); ++i )
{
hr = pwco->Get( parametersToGet[i]->getName(),
0,
&v_value,
&vtype,
NULL );
if( FAILED( hr ) )
{
TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::Get failure\n");
throw _com_error(hr);
}
parametersToGet[i]->setValue( v_value );
v_value.Clear();
}
return MWmiInstance_SUCCESS;
}
// setParameters
//
MWmiInstance::MWmiInstance_Error
MWmiInstance::setParameters( const vector<MWmiParameter *>& parametersToSet )
{
HRESULT hr;
IWbemClassObjectPtr pwco = NULL;
_variant_t v_value;
// get object corresponding to this path.
hr = _pws->GetObject( _path,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pwco,
NULL );
if( FAILED( hr ) )
{
TRACE( MTrace::SEVERE_ERROR, "IWbemServices::GetObject failure\n");
throw _com_error( hr );
}
for( int i = 0; i < parametersToSet.size(); ++i )
{
v_value = parametersToSet[i]->getValue();
hr = pwco->Put( parametersToSet[i]->getName(),
0,
&v_value,
NULL );
if( FAILED( hr ) )
{
TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::Get failure\n");
throw _com_error( hr );
}
v_value.Clear();
}
hr = _pws->PutInstance( pwco,
WBEM_FLAG_UPDATE_ONLY,
NULL,
NULL );
if( FAILED(hr) )
{
TRACE( MTrace::SEVERE_ERROR, "IWbemServices::PutInstance failure\n");
throw _com_error( hr );
}
return MWmiInstance_SUCCESS;
}