windows-nt/Source/XPSP1/NT/base/cluster/wmiprovider/objectpath.cpp
2020-09-26 16:20:57 +08:00

1570 lines
35 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2000 Microsoft Corporation
//
// Module Name:
// ObjectPath.cpp
//
// Description:
// Implementation of class CObjpath, CProvException, CProvExceptionHr,
// and CProvExceptionWin32.
//
// Author:
// Henry Wang (HenryWa) 24-AUG-1999
//
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "ObjectPath.h"
//****************************************************************************
//
// CObjPath
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// CObjPath::CObjPath( void )
//
// Description:
// Constructor.
//
// Arguments:
// None.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CObjPath::CObjPath( void )
: m_parsedObj( NULL )
{
} //*** CObjPath::CObjPath()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CObjPath::~CObjPath( void )
//
// Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CObjPath::~CObjPath( void )
{
delete m_parsedObj;
} //*** CObjPath::~CObjPath()
//////////////////////////////////////////////////////////////////////////////
//++
//
// _bstr_t
// CObjPath::GetStringValueForProperty(
// LPCWSTR pwszIn
// )
//
// Description:
// Retrieve the string value for the given property.
//
// Arguments:
// pwszIn -- Name of the property
//
// Return Values:
// The property's value.
//
//--
//////////////////////////////////////////////////////////////////////////////
_bstr_t
CObjPath::GetStringValueForProperty(
LPCWSTR pwszIn
)
{
int idx;
KeyRef * pKey;
for( idx = 0 ; idx < m_parsedObj->m_dwNumKeys ; idx++ )
{
pKey = m_parsedObj->m_paKeys[ idx ];
if( _wcsicmp( pKey->m_pName, pwszIn ) == 0 )
{
if( pKey->m_vValue.vt == VT_BSTR )
{
return pKey->m_vValue.bstrVal;
}
}
}
return L"";
} //*** CObjPath::GetStringValueForProperty()
//////////////////////////////////////////////////////////////////////////////
//++
//
// _bstr_t
// CObjPath::GetClassName( void )
//
// Description:
// Get the class name.
//
// Arguments:
// None.
//
// Return Values:
// Class name string.
//
//--
//////////////////////////////////////////////////////////////////////////////
_bstr_t
CObjPath::GetClassName( void )
{
return m_parsedObj->m_pClass;
} //*** CObjPath::GetClassName()
//////////////////////////////////////////////////////////////////////////////
//++
//
// BOOL
// CObjPath::Init(
// LPCWSTR pwszPathIn
// )
//
// Description:
// Initialize the object.
//
// Arguments:
// pwszPathIn -- Object path string
//
// Return Values:
// TRUE
// FALSE
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
CObjPath::Init(
LPCWSTR pwszPathIn
)
{
if ( pwszPathIn == NULL )
{
m_parsedObj = new ParsedObjectPath;
}
else
{
CObjectPathParser objParser( e_ParserAcceptRelativeNamespace );
objParser.Parse(
const_cast< WCHAR * >( pwszPathIn ),
&m_parsedObj
);
}
if ( m_parsedObj == NULL )
{
return FALSE;
} // if:
return TRUE;
} //*** CObjPath::Init()
//////////////////////////////////////////////////////////////////////////////
//++
//
// BOOL
// CObjPath::SetClass(
// LPCWSTR pwszValueIn
// )
//
// Description:
// Set the name of the class for the object path.
//
// Arguments:
// pwszValueIn -- Class name string.
//
// Return Values:
// TRUE
// FALSE
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
CObjPath::SetClass(
LPCWSTR pwszValueIn
)
{
return m_parsedObj->SetClassName( pwszValueIn );
} //*** CObjPath::SetClass()
//////////////////////////////////////////////////////////////////////////////
//++
//
// BOOL
// CObjPath::AddProperty(
// IN LPCWSTR pwszNameIn,
// IN LPCWSTR pwszValueIn
// )
//
// Description:
// Add property to object path.
//
// Arguments:
// pwszNameIn -- Name of the property.
// pwszValueIn -- Value of the property in WCHAR* format.
//
// Return Values:
// TRUE
// FALSE
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
CObjPath::AddProperty(
IN LPCWSTR pwszNameIn,
IN LPCWSTR pwszValueIn
)
{
VARIANT v;
BOOL bRt = FALSE;
VariantInit( & v );
v.vt = VT_BSTR;
v.bstrVal = _bstr_t( pwszValueIn ).copy( );
bRt = m_parsedObj->AddKeyRef(
pwszNameIn,
& v
);
VariantClear( & v );
return bRt;
} //*** CObjPath::AddProperty()
//////////////////////////////////////////////////////////////////////////////
//++
//
// _bstr_t
// CObjPath::GetObjectPathString( void )
//
// Description:
// Retrieve object path string.
//
// Arguments:
// None.
//
// Return Values:
// Object path string in _bstr_t.
//
//--
//////////////////////////////////////////////////////////////////////////////
_bstr_t
CObjPath::GetObjectPathString( void )
{
LPWSTR pwszPath = NULL;
_bstr_t bstrResult;
try
{
CObjectPathParser::Unparse( m_parsedObj, & pwszPath );
bstrResult = pwszPath;
}
catch( ... ) //catch _com_error
{
delete [] pwszPath;
throw;
}
delete [] pwszPath;
return bstrResult;
} //*** CObjPath::GetObjectPathString()
//////////////////////////////////////////////////////////////////////////////
//++
//
// BOOL
// CObjPath::AddProperty(
// LPCWSTR pwszNameIn,
// VARIANT * pvValueIn
// )
//
// Description:
// Add a property to this instance.
//
// Arguments:
// pwszNameIn -- Name of the property.
// pvValueIn -- Value of the property in VARIANT format
//
// Return Values:
// TRUE
// FALSE
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
CObjPath::AddProperty(
LPCWSTR pwszNameIn,
VARIANT * pvValueIn
)
{
return m_parsedObj->AddKeyRef( pwszNameIn, pvValueIn );
} //*** CObjPath::AddProperty
//****************************************************************************
//
// CProvException
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// LPCWSTR
// CProvException::PwszErrorMessage( void ) const
//
// Description:
// retrieve Error message
//
// Arguments:
// None.
//
// Return Values:
// Null-terminated Unicode error message from the exception.
//
//--
//////////////////////////////////////////////////////////////////////////////
LPCWSTR
CProvException::PwszErrorMessage( void ) const
{
if ( m_bstrError.length( ) == 0 )
{
LPWSTR pError = NULL;
DWORD rt = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
HRESULT_CODE( m_hr ),
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
(LPWSTR) &pError,
0,
NULL
);
m_bstrError = pError;
LocalFree( pError );
} // if: string is empty
return m_bstrError;
} //*** CProvException::PwszErrorMessage()
//****************************************************************************
//
// CWbemClassObject
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// CWbemClassObject::CWbemClassObject( void )
//
// Description:
// Constructor.
//
// Arguments:
// None.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CWbemClassObject::CWbemClassObject( void )
: m_pClassObject( NULL )
{
VariantInit( &m_v );
} //*** CWbemClassObject::CWbemClassObject()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CWbemClassObject::CWbemClassObject(
// IWbemClassObject * pInstIn
// )
//
// Description:
// Constructor.
//
// Arguments:
// pInstIn -- WMI class object interface.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CWbemClassObject::CWbemClassObject(
IWbemClassObject * pInstIn
)
: m_pClassObject( NULL )
{
m_pClassObject = pInstIn;
if ( m_pClassObject )
{
m_pClassObject->AddRef();
}
VariantInit( &m_v );
} //*** CWbemClassObject::CWbemClassObject( pInstIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// CWbemClassObject::~CWbemClassObject( void )
//
// Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CWbemClassObject::~CWbemClassObject( void )
{
if ( m_pClassObject )
{
m_pClassObject->Release();
}
VariantClear( &m_v );
} //*** CWbemClassObject::~CWbemClassObject()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SetProperty(
// DWORD dwValueIn,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set dword value of a property.
//
// Arguments:
// dwValueIn -- Property dword value
// pwszPropNameIn -- Property Name
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SetProperty(
DWORD dwValueIn,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
VariantClear( &m_v );
m_v.vt = VT_I4;
m_v.lVal = dwValueIn;
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
if ( FAILED( sc ) )
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetProperty( dwValueIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SetProperty(
// LPCWSTR pwszValueIn,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set wstring value of a property.
//
// Arguments:
// pwszValueIn -- Property string value.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SetProperty(
LPCWSTR pwszValueIn,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
if ( pwszValueIn == NULL )
{
return WBEM_S_NO_ERROR;
}
VariantClear( &m_v );
// _bstr_t bstrValue( pwszValueIn );
m_v.vt = VT_BSTR;
m_v.bstrVal = _bstr_t( pwszValueIn ).copy();
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
VariantClear( &m_v );
if( FAILED( sc ) )
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetProperty( pwszValueIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SetProperty(
// DWORD dwSizeIn,
// PBYTE pByteIn,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set binary value of a property.
//
// Arguments:
// dwSizeIn -- Size of block pointed by pByteIn.
// pByteIn -- Pointer to byte.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SetProperty(
DWORD dwSizeIn,
PBYTE pByteIn,
LPCWSTR pwszPropNameIn
)
{
SCODE sc = WBEM_S_NO_ERROR;
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[ 1 ];
LONG idx;
LONG ix;
rgsabound[ 0 ].lLbound = 0;
rgsabound[ 0 ].cElements = dwSizeIn;
if( pByteIn == NULL )
{
return sc;
}
VariantClear( &m_v );
psa = SafeArrayCreate( VT_UI1, 1, rgsabound );
if(psa == NULL)
{
throw WBEM_E_OUT_OF_MEMORY;
}
for( idx = 0 ; idx < dwSizeIn ; idx++ )
{
ix = idx;
sc = SafeArrayPutElement(
psa,
&ix,
static_cast< void * >( pByteIn+idx )
);
if ( sc != S_OK )
{
throw CProvException( sc );
}
}
m_v.vt = ( VT_ARRAY | VT_UI1 );
//
// no need to clear psa, managed by destructor
//
m_v.parray = psa;
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
if ( sc != S_OK )
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetProperty( pByteIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SetProperty(
// DWORD dwSizeIn,
// BSTR * pbstrIn,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set wstring array value of a property.
//
// Arguments:
// dwSizeIn -- Size of block pointed by pByteIn.
// pbstrIn -- Pointer to BSTR array.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SetProperty(
DWORD dwSizeIn,
BSTR * pbstrIn,
LPCWSTR pwszPropNameIn
)
{
SCODE sc = WBEM_S_NO_ERROR;
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[ 1 ];
LONG idx;
LONG ix;
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = dwSizeIn;
if ( pbstrIn == NULL )
{
return sc;
}
VariantClear( &m_v );
psa = SafeArrayCreate( VT_BSTR, 1, rgsabound );
if ( psa == NULL )
{
throw WBEM_E_OUT_OF_MEMORY;
}
for( idx = 0 ; idx < dwSizeIn ; idx++)
{
ix = idx;
sc = SafeArrayPutElement(
psa,
&ix,
pbstrIn[ idx ]
);
if ( sc != S_OK)
{
throw CProvException( sc );
}
}
m_v.vt = (VT_ARRAY | VT_BSTR );
//
// no need to clear psa, managed by destructor
//
m_v.parray = psa;
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
if ( sc != S_OK)
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetProperty( pbstrIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SetProperty(
//
// Description:
// Set MultiSz value of a property.
//
// Arguments:
// dwSizeIn -- Size of block pointed by pwszMultiSzIn.
// pwszMultiSzIn -- Pointer to MultiSz.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SetProperty(
DWORD dwSizeIn,
LPCWSTR pwszMultiSzIn,
LPCWSTR pwszPropNameIn
)
{
SCODE sc = WBEM_S_NO_ERROR;
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[ 1 ];
LPCWSTR pwsz = NULL;
LONG idx;
LONG ix;
if( pwszMultiSzIn == NULL )
{
return sc;
}
VariantClear( &m_v );
//
// find out the number of string
//
DWORD cMultiSz = 1;
for ( pwsz = pwszMultiSzIn; *pwsz || *pwsz ++ ; pwsz ++ )
{
if ( ! ( *pwsz ) )
{
cMultiSz ++ ;
}
}
rgsabound[ 0 ].lLbound = 0;
rgsabound[ 0 ].cElements = cMultiSz;
psa = SafeArrayCreate( VT_BSTR, 1, rgsabound);
if ( psa == NULL )
{
throw WBEM_E_OUT_OF_MEMORY;
}
pwsz = pwszMultiSzIn;
for( idx = 0 ; idx < cMultiSz ; idx++ )
{
ix = idx;
sc = SafeArrayPutElement(
psa,
&ix,
(BSTR) _bstr_t( pwsz )
);
if ( sc != S_OK )
{
throw CProvException( sc );
}
pwsz = wcschr( pwsz, L'\0' );
pwsz ++;
}
m_v.vt = (VT_ARRAY | VT_BSTR );
//
// no need to clear psa, managed by destructor
//
m_v.parray = psa;
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
if ( sc != S_OK )
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetProperty( pwszMultiSzIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SetProperty(
// LPCSTR pszValueIn,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set ansi string value of a property.
//
// Arguments:
// pszValueIn -- Property string value.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SetProperty(
LPCSTR pszValueIn,
LPCWSTR pwszPropNameIn
)
{
if ( pszValueIn == NULL )
{
return S_OK;
}
return SetProperty(
static_cast< WCHAR * >( _bstr_t( pszValueIn ) ),
pwszPropNameIn
);
} //*** CWbemClassObject::SetProperty( pszValueIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SetProperty(
// IWbemClassObject * pWbemClassObject,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set wbem class object of a property.
//
// Arguments:
// pWbemClassObject -- Property wbem class object
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SetProperty(
IWbemClassObject * pWbemClassObjectIn,
LPCWSTR pwszPropNameIn
)
{
SCODE sc = S_OK;
if ( pWbemClassObjectIn == NULL )
{
return sc;
}
VariantClear( & m_v );
m_v.vt = VT_UNKNOWN ;
m_v.punkVal = pWbemClassObjectIn;
pWbemClassObjectIn->AddRef();
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
VariantClear( &m_v );
if( FAILED( sc ) )
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetProperty( pszValueIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SpawnInstance(
// LONG lFlagIn,
// IWbemClassObject ** ppNewOut
// )
//
// Description:
// Spawn a instance of IWbemClassObject.
//
// Arguments:
// lFlagIn -- WMI flag, reserved, must be 0.
// ppNewOut -- Created new instance.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SpawnInstance(
LONG lFlagIn,
IWbemClassObject ** ppNewOut
)
{
return m_pClassObject->SpawnInstance( lFlagIn, ppNewOut );
} //*** CWbemClassObject::SpawnInstance()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::SpawnDerivedClass(
// LONG lFlagIn,
// IWbemClassObject ** ppNewOut
// )
//
// Description:
// Spawn a derived class.
//
// Arguments:
// lFlagIn -- WMI flag, reserved, must be 0.
// ppNewOut -- Created new instance.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::SpawnDerivedClass(
LONG lFlagIn,
IWbemClassObject ** ppNewOut
)
{
return m_pClassObject->SpawnDerivedClass( lFlagIn, ppNewOut );
} //*** CWbemClassObject::SpawnInstance()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetMethod(
// BSTR bstrMethodNameIn,
// LONG lFlagIn,
// IWbemClassObject ** ppINOut,
// IWbemClassObject ** ppOUTOut
// )
//
// Description:
// Retrieve the method for an WMI object.
//
// Arguments:
// bstrMethodNameIn
// Method Name.
//
// lFlagIn
// WMI flag, Reserved. It must be zero.
//
// ppINOut
// IWbemClassObject pointer which describes the in-parameters
// to the method.
//
// ppOUTOut
// an IWbemClassObject pointer which describes the
// out-parameters to the method
//
// Return Values:
// WBEM stand error
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetMethod(
BSTR bstrMethodNameIn,
LONG lFlagIn,
IWbemClassObject ** ppINOut,
IWbemClassObject ** ppOUTOut
)
{
return m_pClassObject->GetMethod(
bstrMethodNameIn,
lFlagIn,
ppINOut,
ppOUTOut
);
} //*** CWbemClassObject::GetMethod()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetProperty(
// DWORD * pdwValueOut,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the DWORD property for this WMI object.
//
// Arguments:
// pdwValueOut -- DWORD variable to receive property value.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
// WBEM_E_FAILED
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetProperty(
DWORD * pdwValueOut,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
VariantClear( &m_v );
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
NULL,
NULL
);
if ( SUCCEEDED( sc ) )
{
if( m_v.vt == VT_I4 )
{
*pdwValueOut = m_v.lVal;
return sc;
}
else if ( m_v.vt == VT_BOOL)
{
if ( m_v.boolVal == VARIANT_TRUE )
{
*pdwValueOut = 1;
}
else
{
*pdwValueOut = 0;
}
return sc;
}
else if ( m_v.vt == VT_UI1 )
{
*pdwValueOut = ( DWORD ) m_v.bVal;
}
else if ( m_v.vt == VT_NULL )
{
return WBEM_E_FAILED;
}
}
// raise exception if sc is not S_OK or vt is not expected
CProvException e( sc );
throw e;
return WBEM_E_FAILED;
} //*** CWbemClassObject::GetProperty( pdwValueOut )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetProperty(
// _bstr_t & rBstrOut,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the BSTR property for this WMI object.
//
// Arguments:
// rBstrOut -- bstr_t variable to receive property value.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
// WBEM_E_FAILED
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetProperty(
_bstr_t & rBstrOut,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
VariantClear( &m_v );
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
NULL,
NULL
);
if ( SUCCEEDED( sc ) )
{
if( m_v.vt == VT_BSTR )
{
rBstrOut = m_v.bstrVal;
return sc;
}
else if( m_v.vt == VT_NULL )
{
return WBEM_E_FAILED;
}
}
CProvException e( sc );
throw e;
return WBEM_E_FAILED;
} //*** CWbemClassObject::GetProperty( rBstrOut )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetProperty(
// BOOL * pfValueOut,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the BOOL property for this WMI object.
//
// Arguments:
// pfValueOut -- BOOL variable to receive property value.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
// WBEM_E_FAILED
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetProperty(
BOOL * pfValueOut,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
VariantClear( &m_v );
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
NULL,
NULL
);
if ( m_v.vt == VT_BOOL )
{
*pfValueOut = m_v.boolVal;
return sc;
}
return WBEM_E_FAILED;
} //*** CWbemClassObject::GetProperty
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetProperty(
// DWORD * pdwSizeOut,
// PBYTE * ppByteOut,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the binary property for this WMI object.
//
// Arguments:
// pdwSizeOut -- Size of the output buffer.
// ppByteOut -- Output buffer.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetProperty(
DWORD * pdwSizeOut,
PBYTE * ppByteOut,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
VariantClear(&m_v);
*pdwSizeOut = 0;
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
& m_v,
NULL,
NULL
);
if ( SUCCEEDED ( sc ) )
{
if ( m_v.vt == ( VT_ARRAY | VT_UI1 ) )
{
PBYTE pByte;
* pdwSizeOut = m_v.parray->rgsabound[ 0 ].cElements;
* ppByteOut = new BYTE[ *pdwSizeOut ];
sc = SafeArrayAccessData( m_v.parray, ( void ** ) &pByte );
if ( SUCCEEDED ( sc ) )
{
UINT idx;
for ( idx = 0; idx < *pdwSizeOut; idx ++ )
{
*( (* ppByteOut ) + idx ) = *( pByte + idx );
}
SafeArrayUnaccessData( m_v.parray );
}
}
else
{
throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) );
}
}
else
{
throw CProvException( sc );
}
return WBEM_S_NO_ERROR;
} //*** CWbemClassObject::GetProperty( ppByteOut )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetProperty(
// DWORD * pdwSizeOut,
// _bstr_t ** ppbstrOut,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the BSTR array property for this WMI object.
//
// Arguments:
// pdwSizeOut -- Size of the output buffer.
// ppbstrOut -- BSTR variable to receive property value.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetProperty(
DWORD * pdwSizeOut,
_bstr_t ** ppbstrOut,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
VariantClear( &m_v );
*pdwSizeOut = 0;
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
& m_v,
NULL,
NULL
);
if ( SUCCEEDED ( sc ) )
{
if ( m_v.vt == ( VT_ARRAY | VT_BSTR ) )
{
BSTR * pBstr;
*pdwSizeOut = m_v.parray->rgsabound[0].cElements;
*ppbstrOut = new _bstr_t[ *pdwSizeOut ];
sc = SafeArrayAccessData( m_v.parray, (void **) & pBstr );
if ( SUCCEEDED ( sc ) )
{
UINT idx;
for( idx = 0; idx < *pdwSizeOut; idx ++)
{
*( (*ppbstrOut) + idx ) = *( pBstr + idx );
}
SafeArrayUnaccessData( m_v.parray );
}
}
else
{
throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) );
}
}
else
{
throw CProvException( sc );
}
return WBEM_S_NO_ERROR;
} //*** CWbemClassObject::GetProperty( ppbstrOut )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetProperty(
// DWORD * pdwSizeOut,
// LPWSTR * ppwszMultiSzOut,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the MultiSz property for this WMI object.
//
// Arguments:
// pdwSizeOut -- Size of the output buffer.
// ppwszMultiSzOut -- MultiSz output buffer.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetPropertyMultiSz(
DWORD * pdwSizeOut,
LPWSTR * ppwszMultiSzOut,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
DWORD cElements;
DWORD cMultiSz = 0;
VariantClear(&m_v);
*pdwSizeOut = 0;
// *ppOut = NULL;
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
& m_v,
NULL,
NULL
);
if ( SUCCEEDED ( sc ) )
{
if ( m_v.vt == ( VT_ARRAY | VT_BSTR ) )
{
LPWSTR * ppwsz = NULL;
cElements = m_v.parray->rgsabound[ 0 ].cElements;
sc = SafeArrayAccessData( m_v.parray, ( void ** ) & ppwsz );
if ( SUCCEEDED ( sc ) )
{
UINT idx;
for( idx = 0; idx < cElements; idx ++)
{
cMultiSz = cMultiSz + wcslen( *(ppwsz + idx) ) + sizeof (WCHAR);
}
cMultiSz += sizeof( WCHAR ) * 2;
*ppwszMultiSzOut = new WCHAR[ cMultiSz ];
if ( *ppwszMultiSzOut == NULL )
{
throw CProvException( static_cast< HRESULT > ( WBEM_E_OUT_OF_MEMORY) );
}
LPWSTR pwszDst = *ppwszMultiSzOut;
LPWSTR pwszSrc;
for ( idx = 0; idx < cElements ; idx ++)
{
for( pwszSrc = *( ppwsz + idx); *pwszSrc ; pwszDst++, pwszSrc ++ )
{
*pwszDst = *pwszSrc;
}
*(pwszDst++) = L'\0';
}
*pwszDst = L'\0';
*pdwSizeOut = cMultiSz;
SafeArrayUnaccessData( m_v.parray );
}
}
else
{
throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) );
}
}
else
{
throw CProvException( sc );
}
return WBEM_S_NO_ERROR;
} //*** CWbemClassObject::GetProperty( ppwszMultiSzOut )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetProperty(
// VARIANT * pVariantOut,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the variant property for this WMI object.
//
// Arguments:
// pVariantOut -- Variant variable to receive property value
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetProperty(
VARIANT * pVariantOut,
LPCWSTR pwszPropNameIn
)
{
SCODE sc;
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
pVariantOut,
NULL,
NULL
);
if ( FAILED( sc ) )
{
CProvException e( sc );
throw e;
}
return WBEM_S_NO_ERROR;
} //*** CWbemClassObject::GetProperty( pVariantOut )
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CWbemClassObject::GetProperty(
// CWbemClassObject & rWcoInout,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the embeded object property for this WMI object.
//
// Arguments:
// rWcoInout -- class object variable to receive property value
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE
CWbemClassObject::GetProperty(
CWbemClassObject & rWcoInout,
LPCWSTR pwszPropNameIn
)
{
CError er;
VariantClear( &m_v );
er = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
NULL,
NULL
);
if ( m_v.vt != VT_UNKNOWN )
{
er = static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER );
}
IWbemClassObject * pwco = NULL;
er = m_v.punkVal->QueryInterface( & pwco );
rWcoInout = pwco;
VariantClear( & m_v );
return WBEM_S_NO_ERROR;
} //*** CWbemClassObject::GetProperty( rWcoInout )