2025-04-27 07:49:33 -04:00

890 lines
19 KiB
C++

/*
******************************************************************************
******************************************************************************
*
*
* INTEL CORPORATION PROPRIETARY INFORMATION
* This software is supplied under the terms of a license agreement or
* nondisclosure agreement with Intel Corporation and may not be copied or
* disclosed except in accordance with the terms of that agreement.
*
* Copyright (c) 1997, 1998 Intel Corporation All Rights Reserved
******************************************************************************
******************************************************************************
*
*
*
*
*
*/
#include "dmipch.h" // precompiled header for dmi provider
#include "WbemDmiP.h" // project wide include
#include "Strings.h"
#include "CimClass.h"
#include "DmiData.h"
#include "WbemLoopBack.h"
#include "Trace.h"
#include "Exception.h"
#define QUAL_FLAGS WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE \
| WBEM_FLAVOR_FLAG_PROPAGATE_TO_DERIVED_CLASS
#define NON_INHERIT_QUAL_FLAGS WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
CCimObject::CCimObject()
{
m_pCimObject = NULL;
m_pIUnk = NULL;
m_pIDispatch = NULL;
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
CCimObject::~CCimObject()
{
RELEASE ( m_pIUnk );
RELEASE ( m_pIDispatch );
Release ();
};
void CCimObject::Release ()
{
if ( m_pCimObject)
{
LONG l;
l = m_pCimObject->Release ();
m_pCimObject = NULL;
//STAT_TRACE ( L"CIM Object %lx Release %lu" , this , l );
}
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::AddProperty(LPWSTR wszName, CVariant& varVal, LONG lAccess )
{
//DEV_TRACE ( L"\t\tCCimClassWrap::AddProperty(%lX, %s)", m_pCimObject,
// wszName );
// STAT_TRACE(L"[%s],[%s]" , wszName , varVal.GetValue () ) ;
SCODE result = m_pCimObject->Put( wszName, NO_FLAGS , varVal,
EMPTY_VARIANT );
if (FAILED(result))
{
throw CException ( WBEM_E_FAILED, IDS_ADDPROP_FAIL , NO_STRING ,
wszName );
}
CVariant var( ( VARIANT_BOOL ) VARIANT_TRUE);
if ( lAccess == READ_ONLY || lAccess == READ_WRITE )
AddPropertyQualifier( wszName, READ_QUALIFIER, var );
if ( lAccess == WRITE_ONLY || lAccess == READ_WRITE )
AddPropertyQualifier( wszName, WRITE_QUALIFIER, var);
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::AddProperty(LPWSTR wszName, VARTYPE vt, LONG lAccess )
{
CVariant var;
var.Null();
//DEV_TRACE ( L"\t\tCCimClassWrap::AddProperty(%lX, %s)", m_pCimObject,
// wszName ) ;
SCODE result = m_pCimObject->Put( wszName, NO_FLAGS , var, vt);
if (FAILED(result))
{
throw CException ( WBEM_E_FAILED, IDS_ADDPROP_FAIL , NO_STRING ,
wszName );
}
var.Set( ( VARIANT_BOOL ) VARIANT_TRUE);
if ( lAccess == READ_ONLY || lAccess == READ_WRITE )
AddPropertyQualifier( wszName, READ_QUALIFIER, var );
if( lAccess == WRITE_ONLY || lAccess == READ_WRITE )
AddPropertyQualifier( wszName, WRITE_QUALIFIER, var);
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::AddPropertyQualifier( LPWSTR wszName, LPWSTR wszQualifier,
CVariant& cvValue)
{
SCODE result = NO_ERROR;
IWbemQualifierSet *pIQS = NULL;
// STAT_TRACE(L"[%s],[%s],[%s]" , wszName , wszQualifier , cvValue.GetValue () ) ;
if( FAILED ( result = m_pCimObject->GetPropertyQualifierSet( wszName,
&pIQS ) ) )
{
CString cszT;
cszT.LoadString ( IDS_TO );
cszT.Prepend ( wszQualifier );
cszT.Append ( wszName ) ;
throw CException ( WBEM_E_FAILED, IDS_ADDPROPQUAL_FAIL , NO_STRING ,
cszT );
}
result = pIQS->Put( wszQualifier, cvValue, QUAL_FLAGS );
RELEASE(pIQS);
if( FAILED(result) )
{
CString cszT;
cszT.LoadString ( IDS_TO );
cszT.Prepend ( wszQualifier );
cszT.Append ( wszName ) ;
throw CException ( WBEM_E_FAILED, IDS_ADDPROPQUAL_FAIL , NO_STRING ,
cszT );
}
//DEV_TRACE ( L"\t\tCCimClassWrap::AddPropertyQualifier()" );
//DEV_TRACE ( L"\t\t\tprop name = %s" , wszName);
//DEV_TRACE ( L"\t\t\tqual name = %s" , wszQualifier);
//DEV_TRACE ( L"\t\t\tpIClass = %lX" , m_pCimObject);
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::AddClassQualifier(LPWSTR wszQualifier, CVariant& cvValue )
{
SCODE result = NO_ERROR;
IWbemQualifierSet *pIQS = NULL;
CVariant var;
if ( FAILED ( result = m_pCimObject->GetQualifierSet( &pIQS ) ))
{
throw CException ( WBEM_E_FAILED , IDS_ADDCLASSQUAL , NO_STRING ,
wszQualifier );
}
result = pIQS->Put( wszQualifier, cvValue, QUAL_FLAGS );
RELEASE(pIQS);
if ( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_ADDCLASSQUAL , NO_STRING ,
wszQualifier );
}
/* DEV_TRACE ( L"\t\tCCimClassWrap::AddClassQualifier()\n\tqual name \
= %s\n\tpIClass = %lX", wszQualifier, m_pCimObject ) ;
*/
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::AddNonInheritClassQualifier(LPWSTR wszQualifier, CVariant& cvValue )
{
SCODE result = NO_ERROR;
IWbemQualifierSet *pIQS = NULL;
CVariant var;
if ( FAILED ( result = m_pCimObject->GetQualifierSet( &pIQS ) ))
{
throw CException ( WBEM_E_FAILED , IDS_ADDCLASSQUAL , NO_STRING ,
wszQualifier );
}
result = pIQS->Put( wszQualifier, cvValue, NON_INHERIT_QUAL_FLAGS );
RELEASE(pIQS);
if ( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_ADDCLASSQUAL , NO_STRING ,
wszQualifier );
}
/* DEV_TRACE ( L"\t\tCCimClassWrap::AddClassQualifier()\n\tqual name \
= %s\n\tpIClass = %lX", wszQualifier, m_pCimObject ) ;
*/
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::AddMethod(
CWbemLoopBack*pWbem,
IWbemContext *pCtx ,
LPWSTR wszMethodName,
LPWSTR wszInParamsClassName,
CCimObject &ccimParamsClass
)
{
SCODE result = WBEM_NO_ERROR;
IWbemQualifierSet *iwqQualifierSet = NULL ;
CVariant cvValue;
CBstr cbName;
cbName.Set ( wszMethodName );
cvValue.Set ( VARIANT_TRUE );
if ( FAILED ( result = m_pCimObject->Put( cbName , NO_FLAGS ,
cvValue , NULL ) ))
{
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
CBstr t_PropertyName = NULL ;
CIMTYPE t_Type = 0 ;
long t_Flavor = 0 ;
CVariant t_Variant ;
result = m_pCimObject->PutMethod ( wszMethodName , 0 ,
(IWbemClassObject*) ccimParamsClass, NULL ) ;
if ( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
result = m_pCimObject->GetMethodQualifierSet ( wszMethodName ,
&iwqQualifierSet ) ;
if ( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
t_Variant.Set ( VARIANT_TRUE ) ;
result = iwqQualifierSet->Put ( L"Implemented" , t_Variant , 0 ) ;
if ( FAILED ( result ) )
{
RELEASE(iwqQualifierSet);
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
t_Variant.Set ( VARIANT_TRUE ) ;
result = iwqQualifierSet->Put ( L"Static" , t_Variant , 0 ) ;
if ( FAILED ( result ) )
{
RELEASE(iwqQualifierSet);
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
cbName.Set ( INPARAMS_QUALIFIER );
cvValue.Set ( wszInParamsClassName );
if(FAILED( iwqQualifierSet->Put( cbName , cvValue , QUAL_FLAGS )))
{
RELEASE(iwqQualifierSet);
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
cbName.Set ( OUTPARAMS_QUALIFIER );
cvValue.Set ( NONE_STR );
result = iwqQualifierSet->Put( cbName , cvValue , QUAL_FLAGS);
RELEASE(iwqQualifierSet);
if( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::AddInOutMethod(
CWbemLoopBack*pWbem,
IWbemContext *pCtx ,
LPWSTR wszMethodName,
LPWSTR wszInParamsClassName,
CCimObject &ccimInParamsClass,
LPWSTR wszOutParamsClassName,
CCimObject &ccimOutParamsClass
)
{
SCODE result = WBEM_NO_ERROR;
IWbemQualifierSet *iwqQualifierSet = NULL ;
CVariant cvValue;
CBstr cbName;
cbName.Set ( wszMethodName );
cvValue.Set ( VARIANT_TRUE );
if ( FAILED ( result = m_pCimObject->Put( cbName , NO_FLAGS ,
cvValue , NULL ) ))
{
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
CBstr t_PropertyName = NULL ;
CIMTYPE t_Type = 0 ;
long t_Flavor = 0 ;
CVariant t_Variant ;
result = m_pCimObject->PutMethod ( wszMethodName , 0 ,
(IWbemClassObject*) ccimInParamsClass , (IWbemClassObject*) ccimOutParamsClass ) ;
if ( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
result = m_pCimObject->GetMethodQualifierSet ( wszMethodName ,
&iwqQualifierSet ) ;
if ( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
t_Variant.Set ( VARIANT_TRUE ) ;
result = iwqQualifierSet->Put ( L"Implemented" , t_Variant , 0 ) ;
if ( FAILED ( result ) )
{
RELEASE(iwqQualifierSet);
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
t_Variant.Set ( VARIANT_TRUE ) ;
result = iwqQualifierSet->Put ( L"Static" , t_Variant , 0 ) ;
if ( FAILED ( result ) )
{
RELEASE(iwqQualifierSet);
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
#if 0
cbName.Set ( CIMTYPE_QUALIFIER );
cvValue.Set ( METHOD_QUAL_VAL );
if(FAILED( iwqQualifierSet->Put( cbName , cvValue , QUAL_FLAGS )))
{
RELEASE(iwqQualifierSet);
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
#endif 0
cbName.Set ( INPARAMS_QUALIFIER );
cvValue.Set ( wszInParamsClassName );
if(FAILED( iwqQualifierSet->Put( cbName , cvValue , QUAL_FLAGS )))
{
RELEASE(iwqQualifierSet);
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
cbName.Set ( OUTPARAMS_QUALIFIER );
cvValue.Set ( wszOutParamsClassName );
if(FAILED( iwqQualifierSet->Put( cbName , cvValue , QUAL_FLAGS )))
{
RELEASE(iwqQualifierSet);
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
RELEASE(iwqQualifierSet);
if( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_ADDMETHOD_FAIL , NO_STRING ,
wszMethodName );
}
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::Set(IWbemClassObject* pI)
{
m_pCimObject = pI;
m_pCimObject->AddRef();
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::GetProperty( LPWSTR wszName, CVariant& cvValue)
{
SCODE result = WBEM_NO_ERROR ;
if ( FAILED ( result = m_pCimObject->Get( wszName, NO_FLAGS , cvValue,
NULL, NULL) ))
{
throw CException ( WBEM_E_FAILED , IDS_GETPROP_FAIL , NO_STRING ,
CString ( result ) );
}
/* MOT_TRACE ( L"\tMOT... Read CIM Object property %s = %s)" ,
wszName , cvValue.GetBstr() ) ;
*/
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::GetPropertyQualifer( BSTR bstrPropertyName,
BSTR bstrQualifierName, CVariant& cvValue)
{
IWbemQualifierSet* pIQs= NULL;
SCODE result = WBEM_NO_ERROR;
if ( SUCCEEDED ( result = m_pCimObject->GetPropertyQualifierSet(
bstrPropertyName, &pIQs) ))
{
result = pIQs->Get( bstrQualifierName, NO_FLAGS , cvValue, NULL);
}
RELEASE(pIQs);
if ( FAILED ( result ) )
{
throw CException ( WBEM_E_FAILED , IDS_GETPROPQUAL_FAIL , NO_STRING ,
bstrPropertyName );
}
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::PutPropertyValue(LPWSTR wszName, CVariant& cvValue)
{
SCODE result = WBEM_NO_ERROR;
CBstr cbName;
cbName.Set ( wszName );
if ( FAILED ( result = m_pCimObject->Put( cbName, NO_FLAGS , cvValue,
NULL) ) )
{
throw CException ( WBEM_E_FAILED , IDS_PUTPROPVAL_FAIL , NO_STRING ,
wszName );
}
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::Create(CWbemLoopBack* pWbem, CVariant& varName,
IWbemContext* pICtx )
{
STAT_TRACE ( L"\t\tCreating CIM class %s", varName.GetBstr() );
SCODE result = WBEM_NO_ERROR;
Release();
pWbem->CreateNewClass(&m_pCimObject, pICtx );
if ( FAILED ( result = m_pCimObject->Put( CLASS_NAME, NO_FLAGS , varName,
NULL) ) )
{
throw CException ( WBEM_E_FAILED , IDS_CREATECLASS_FAIL , NO_STRING ,
varName.GetBstr() );
}
CVariant cvValue;
cvValue.Set ( ( VARIANT_BOOL ) VARIANT_TRUE);
AddClassQualifier( DYNAMIC_QUALIFIER, cvValue );
cvValue.Set ( PROVIDER_NAME );
AddClassQualifier( PROVIDER_QUALIFIER, cvValue );
//STAT_TRACE ( L"CIM Object %lx created create 2" , this );
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::CreateAbstract(CWbemLoopBack* pWbem, CVariant& varName,
IWbemContext* pICtx )
{
STAT_TRACE ( L"\t\tCreating CIM class %s", varName.GetBstr() );
SCODE result = WBEM_NO_ERROR;
Release();
pWbem->CreateNewClass(&m_pCimObject, pICtx );
if ( FAILED ( result = m_pCimObject->Put( CLASS_NAME, NO_FLAGS , varName,
NULL) ) )
{
throw CException ( WBEM_E_FAILED , IDS_CREATECLASS_FAIL , NO_STRING ,
varName.GetBstr() );
}
CVariant cvValue;
cvValue.Set ( ( VARIANT_BOOL ) VARIANT_TRUE);
AddNonInheritClassQualifier( ABSTRACT_QUALIFIER, cvValue );
//STAT_TRACE ( L"CIM Object %lx created create 2" , this );
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::Create(CWbemLoopBack* pWbem, LPWSTR wszSuperClass,
CVariant& varName, IWbemContext* pICtx )
{
STAT_TRACE ( L"\t\tCreating CIM class %s derived from %s", varName.GetBstr() ,
wszSuperClass);
SCODE result = WBEM_NO_ERROR;
Release();
pWbem->CreateNewDerivedClass( &m_pCimObject, wszSuperClass, pICtx );
if ( FAILED ( result = m_pCimObject->Put( CLASS_NAME, NO_FLAGS , varName,
NULL) ))
{
CString cszT;
cszT.LoadString ( IDS_DERIVED_FROM );
cszT.Prepend ( varName.GetBstr() ) ;
cszT.Append ( wszSuperClass );
throw CException ( WBEM_E_FAILED , IDS_CREATEDCLASS_FAIL , NO_STRING ,
cszT );
}
CVariant cvValue;
cvValue.Set ( ( VARIANT_BOOL ) VARIANT_TRUE);
AddClassQualifier( DYNAMIC_QUALIFIER, cvValue );
cvValue.Set ( PROVIDER_NAME );
AddClassQualifier( PROVIDER_QUALIFIER, cvValue );
//STAT_TRACE ( L"CIM Object %lx created create 1" , this );
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::Spawn( CCimObject& Class )
{
SCODE result = WBEM_NO_ERROR;
RELEASE ( m_pCimObject ) ;
if ( FAILED ( result = ( (IWbemClassObject*) Class)->
SpawnInstance( 0L, &m_pCimObject) ))
{
throw CException ( WBEM_E_FAILED , IDS_SPAWN_FAIL , NO_STRING ,
CString ( result ) );
}
//STAT_TRACE ( L"CIM Instance %lX spawned from %lX " , (LPWSTR)this , &Class );
}
//***************************************************************************
//
// Func:
// Purpose:
//
//
// Returns:
//
// In Params:
//
// Out Params:
//
// Note:
//
//***************************************************************************
void CCimObject::GetNames ( CBstr& cbQualifier , LONG lFlags ,
SAFEARRAY** ppsa )
{
SCODE result = WBEM_NO_ERROR;
if (FAILED (result = m_pCimObject->GetNames( cbQualifier, lFlags, NULL,
ppsa ) ) )
{
throw CException ( result ,IDS_GETNAMES_FAIL , NO_STRING ,
CString ( result ) );
}
}