Leaked source code of windows server 2003
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.
 
 
 
 
 
 

2092 lines
48 KiB

//////////////////////////////////////////////////////////////////////////////
//
// 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
// MSP Prabu (mprabu) 06-Jan-2001
//
//////////////////////////////////////////////////////////////////////////////
#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 )
{
CObjectPathParser objParser( e_ParserAcceptRelativeNamespace );
objParser.Free( 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;
_ASSERTE(pwszIn != NULL);
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()
//////////////////////////////////////////////////////////////////////////////
//++
//
// long
// CObjPath::GetLongValueForProperty(
// LPCWSTR pwszIn
// )
//
// Description:
// Retrieve the long value for the given property.
//
// Arguments:
// pwszIn -- Name of the property
//
// Return Values:
// The property's value.
//
//--
//////////////////////////////////////////////////////////////////////////////
long
CObjPath::GetLongValueForProperty(
LPCWSTR pwszIn
)
{
int idx;
KeyRef * pKey;
_ASSERTE(pwszIn != NULL);
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_I4 )
{
return pKey->m_vValue.lVal;
}
}
}
return 0;
} //*** CObjPath::GetLongValueForProperty()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LONGLONG
// CObjPath::GetI64ValueForProperty(
// LPCWSTR pwszIn
// )
//
// Description:
// Retrieve the I64 value for the given property.
// I64 properties are handled as strings in WMI.
//
// Arguments:
// pwszIn -- Name of the property
//
// Return Values:
// The property's value.
//
//--
//////////////////////////////////////////////////////////////////////////////
LONGLONG
CObjPath::GetI64ValueForProperty(
LPCWSTR pwszIn
)
{
int idx;
KeyRef * pKey;
LONGLONG llRetVal = 0;
WCHAR wszTemp[g_cchMAX_I64DEC_STRING] = L"";
_ASSERTE(pwszIn != NULL);
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 )
{
llRetVal = _wtoi64((WCHAR *) pKey->m_vValue.bstrVal);
_i64tow( llRetVal, wszTemp, 10 );
if ( _wcsicmp( wszTemp, (WCHAR *) pKey->m_vValue.bstrVal ) )
{
CProvException e( E_INVALIDARG );
throw e;
}
return llRetVal;
}
}
}
return llRetVal;
} //*** CObjPath::GetI64ValueForProperty()
//////////////////////////////////////////////////////////////////////////////
//++
//
// _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 )
{
return FALSE;
}
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
)
{
_ASSERTE(pwszValueIn != NULL);
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;
_ASSERTE(pwszNameIn != NULL);
_ASSERTE(pwszValueIn != NULL);
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
{
if ( pwszPath )
{
delete [] pwszPath;
}
throw;
}
if ( pwszPath )
{
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
)
{
_ASSERTE(pwszNameIn != NULL);
_ASSERTE(pvValueIn != NULL);
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()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetProperty(
DWORD dwValueIn,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemClassObject::SetProperty(
// double dblValueIn,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set dword value of a property.
//
// Arguments:
// dblValueIn -- Property double value
// pwszPropNameIn -- Property Name
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetPropertyR64(
double dblValueIn,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
VariantClear( &m_v );
m_v.vt = VT_R8;
m_v.dblVal = dblValueIn;
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
if ( FAILED( sc ) )
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetPropertyR64( dblValueIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemClassObject::SetPropertyI64(
// LONGLONG llValueIn,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set LONGLONG value of a property.
//
// Arguments:
// llValueIn -- Property LONGLONG value
// pwszPropNameIn -- Property Name
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetPropertyI64(
ULONGLONG ullValueIn,
LPCWSTR pwszPropNameIn
)
{
// Integers in 64-bit format must be encoded as strings
// because Automation does not support a 64-bit integral type
HRESULT sc;
WCHAR wszTemp[g_cchMAX_I64DEC_STRING] = L"";
_ASSERTE(pwszPropNameIn != NULL);
VariantClear( &m_v );
m_v.vt = VT_BSTR;
_ui64tow( ullValueIn, wszTemp, 10 );
m_v.bstrVal = _bstr_t( wszTemp ).copy();
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
if ( FAILED( sc ) )
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetPropertyI64( llValueIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemClassObject::SetPropertyI64(
// LONGLONG llValueIn,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Set LONGLONG value of a property.
//
// Arguments:
// llValueIn -- Property LONGLONG value
// pwszPropNameIn -- Property Name
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetPropertyI64(
LONGLONG llValueIn,
LPCWSTR pwszPropNameIn
)
{
// Integers in 64-bit format must be encoded as strings
// because Automation does not support a 64-bit integral type
HRESULT sc;
WCHAR wszTemp[g_cchMAX_I64DEC_STRING] = L"";
_ASSERTE(pwszPropNameIn != NULL);
VariantClear( &m_v );
m_v.vt = VT_BSTR;
_i64tow( llValueIn, wszTemp, 10 );
m_v.bstrVal = _bstr_t( wszTemp ).copy();
sc = m_pClassObject->Put(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
0
);
if ( FAILED( sc ) )
{
throw CProvException( sc );
}
return sc;
} //*** CWbemClassObject::SetPropertyI64( llValueIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetProperty(
LPCWSTR pwszValueIn,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
if ( pwszValueIn == NULL )
{
return WBEM_S_NO_ERROR;
}
VariantClear( &m_v );
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetProperty(
DWORD dwSizeIn,
PBYTE pByteIn,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc = WBEM_S_NO_ERROR;
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[ 1 ];
LONG idx;
LONG ix;
_ASSERTE(pwszPropNameIn != NULL);
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetProperty(
DWORD dwSizeIn,
BSTR * pbstrIn,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc = WBEM_S_NO_ERROR;
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[ 1 ];
LONG idx;
LONG ix;
_ASSERTE(pwszPropNameIn != NULL);
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetProperty(
DWORD dwSizeIn,
LPCWSTR pwszMultiSzIn,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc = WBEM_S_NO_ERROR;
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[ 1 ];
LPCWSTR pwsz = NULL;
LONG idx;
LONG ix;
_ASSERTE(pwszPropNameIn != NULL);
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetProperty(
LPCSTR pszValueIn,
LPCWSTR pwszPropNameIn
)
{
_ASSERTE(pwszPropNameIn != NULL);
if ( pszValueIn == NULL )
{
return S_OK;
}
return SetProperty(
static_cast< WCHAR * >( _bstr_t( pszValueIn ) ),
pwszPropNameIn
);
} //*** CWbemClassObject::SetProperty( pszValueIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SetProperty(
IWbemClassObject * pWbemClassObjectIn,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc = S_OK;
_ASSERTE(pwszPropNameIn != NULL);
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SpawnInstance(
LONG lFlagIn,
IWbemClassObject ** ppNewOut
)
{
_ASSERTE(ppNewOut != NULL);
return m_pClassObject->SpawnInstance( lFlagIn, ppNewOut );
} //*** CWbemClassObject::SpawnInstance()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::SpawnDerivedClass(
LONG lFlagIn,
IWbemClassObject ** ppNewOut
)
{
_ASSERTE(ppNewOut != NULL);
return m_pClassObject->SpawnDerivedClass( lFlagIn, ppNewOut );
} //*** CWbemClassObject::SpawnInstance()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetMethod(
BSTR bstrMethodNameIn,
LONG lFlagIn,
IWbemClassObject ** ppINOut,
IWbemClassObject ** ppOUTOut
)
{
_ASSERTE(bstrMethodNameIn != NULL);
_ASSERTE(ppINOut != NULL);
_ASSERTE(ppOUTOut != NULL);
return m_pClassObject->GetMethod(
bstrMethodNameIn,
lFlagIn,
ppINOut,
ppOUTOut
);
} //*** CWbemClassObject::GetMethod()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetProperty(
DWORD * pdwValueOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
_ASSERTE(pdwValueOut != NULL);
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;
return sc;
}
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetPropertyR64(
double * pdblValueOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
_ASSERTE(pdblValueOut != NULL);
VariantClear( &m_v );
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
NULL,
NULL
);
if ( SUCCEEDED( sc ) )
{
if( m_v.vt == VT_R8 )
{
*pdblValueOut = m_v.dblVal;
return sc;
}
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::GetPropertyR64( pdblValueOut )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemClassObject::GetPropertyI64(
// LONGLONG * pllValueOut,
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// Retrieve the LONGLONG property for this WMI object.
//
// Arguments:
// pllValueOut -- LONGLONG variable to receive property value.
// pwszPropNameIn -- Property Name.
//
// Return Values:
// WBEM_S_NO_ERROR
// WBEM_E_FAILED
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetPropertyI64(
LONGLONG * pllValueOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
_ASSERTE(pllValueOut != NULL);
VariantClear( &m_v );
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
NULL,
NULL
);
if ( SUCCEEDED( sc ) )
{
if( m_v.vt == VT_BSTR )
{
// convert from uint64 (VT_BSTR) to LONGLONG
*pllValueOut = _wtoi64( (WCHAR *) m_v.bstrVal );
return sc;
}
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::GetPropertyI64( pllValueOut )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetProperty(
_bstr_t & rBstrOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetProperty(
BOOL * pfValueOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
_ASSERTE(pfValueOut != NULL);
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
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetProperty(
DWORD * pdwSizeOut,
PBYTE * ppByteOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
VariantClear(&m_v);
_ASSERTE(pwszPropNameIn != NULL);
_ASSERTE(pdwSizeOut != NULL);
_ASSERTE(ppByteOut != NULL);
*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 ];
if ( * ppByteOut == NULL )
throw CProvException( E_OUTOFMEMORY );
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetProperty(
DWORD * pdwSizeOut,
_bstr_t ** ppbstrOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
VariantClear( &m_v );
_ASSERTE(pwszPropNameIn != NULL);
_ASSERTE(pdwSizeOut != NULL);
_ASSERTE(ppbstrOut != NULL);
*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 ];
if ( * ppbstrOut == NULL )
throw CProvException( E_OUTOFMEMORY );
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetPropertyMultiSz(
DWORD * pdwSizeOut,
LPWSTR * ppwszMultiSzOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
DWORD cElements;
DWORD cMultiSz = 0;
_ASSERTE(pwszPropNameIn != NULL);
_ASSERTE(pdwSizeOut != NULL);
_ASSERTE(ppwszMultiSzOut != NULL);
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) // prefix change
{ // prefix change
SafeArrayUnaccessData( m_v.parray ); // prefix change
throw CProvException( E_OUTOFMEMORY ); // prefix change
} // prefix change
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetProperty(
VARIANT * pVariantOut,
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
_ASSERTE(pVariantOut != NULL);
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 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// 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
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CWbemClassObject::GetProperty(
CWbemClassObject & rWcoInout,
LPCWSTR pwszPropNameIn
)
{
HRESULT hr = E_FAIL;
_ASSERTE(pwszPropNameIn != NULL);
VariantClear( &m_v );
hr = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
NULL,
NULL
);
if (FAILED(hr))
{
throw CProvException (hr);
}
if ( m_v.vt != VT_UNKNOWN )
{
hr = WBEM_E_INVALID_PARAMETER;
throw CProvException(hr);
}
IWbemClassObject * pwco = NULL;
hr = m_v.punkVal->QueryInterface( & pwco );
rWcoInout = pwco;
VariantClear( & m_v );
return WBEM_S_NO_ERROR;
} //*** CWbemClassObject::GetProperty( rWcoInout )
//////////////////////////////////////////////////////////////////////////////
//++
//
// BOOL
// CWbemClassObject::IsPropertyNull(
// LPCWSTR pwszPropNameIn
// )
//
// Description:
// return TRUE if the property is NULL
//
// Arguments:
// pwszPropNameIn -- Property Name.
//
// Return Values:
// TRUE
// FALSE
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
CWbemClassObject::IsPropertyNull(
LPCWSTR pwszPropNameIn
)
{
HRESULT sc;
_ASSERTE(pwszPropNameIn != NULL);
VariantClear( &m_v );
sc = m_pClassObject->Get(
_bstr_t( pwszPropNameIn ),
0,
&m_v,
NULL,
NULL
);
if (FAILED(sc))
{
CProvException e( sc );
throw e;
}
if ( m_v.vt == VT_NULL )
return TRUE;
return FALSE;
} //*** CWbemClassObject::IsPropertyNull