//*************************************************************************** // // Copyright © Microsoft Corporation. All rights reserved. // // Instance.CPP // // Purpose: Implementation of CInstance class // //*************************************************************************** #include "precomp.h" #include #include #include #include "FWStrings.h" #define DEPRECATED 1 //////////////////////////////////////////////////////////////////////// // // Function: CInstance ctor // // // // Inputs: IWbemClassObject* - the class we want to wrap // MethodContext* - since the context is shared, this will be addreffed // Outputs: // // Return: // // Comments: pointers should not be NULL // //////////////////////////////////////////////////////////////////////// CInstance::CInstance(IWbemClassObject* piClassObject, MethodContext* pMethodContext) : m_nRefCount( 1 ) { ASSERT_BREAK(piClassObject != NULL); ASSERT_BREAK(pMethodContext != NULL); // Both these values will be released in the destructor, so they both oughta // be AddRefed. Note that they are m_piClassObject = piClassObject; if ( NULL != piClassObject ) { // this, however, is a copy m_piClassObject->AddRef(); } m_pMethodContext = pMethodContext; if (pMethodContext) { // this, however, is a copy m_pMethodContext->AddRef(); } } //////////////////////////////////////////////////////////////////////// // // Function: CInstance Dtor // // // // Inputs: // // Outputs: // // Return: // // Comments: // //////////////////////////////////////////////////////////////////////// CInstance::~CInstance() { if ( NULL != m_piClassObject ) { m_piClassObject->Release(); } if ( NULL != m_pMethodContext ) { m_pMethodContext->Release(); } } //////////////////////////////////////////////////////////////////////// // // Function: CInstance::AddRef // // Increments our reference count. // // Inputs: None. // // Outputs: None. // // Return: New Reference Count. // // Comments: We may want to go to an Interlocked Inc/Dec model at // some point if Thread Safety on these objects becomes // an issue. // //////////////////////////////////////////////////////////////////////// LONG CInstance::AddRef( void ) { return InterlockedIncrement(&m_nRefCount); } //////////////////////////////////////////////////////////////////////// // // Function: CInstance::Release // // Decrements our reference count. // // Inputs: None. // // Outputs: None. // // Return: New Reference Count. // // Comments: Deletes the object when the ref count hits 0. We may // want to go to an Interlocked Inc/Dec model at some // point if Thread Safety on these objects becomes an issue. // //////////////////////////////////////////////////////////////////////// LONG CInstance::Release( void ) { LONG nRet = InterlockedDecrement(&m_nRefCount); ASSERT_BREAK(nRet >= 0); if ( 0 == nRet ) { delete this; } else if (nRet < 0) { // Duplicate release. Let's try to dump the stack DWORD t_stack[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; #ifdef _X86_ DWORD *dwEBP; _asm { mov dwEBP, ebp } dwEBP += 1; memcpy(&t_stack, dwEBP, sizeof(t_stack)); #endif CHString sMsg; sMsg.Format(L"Duplicate release: %08x %08x %08x %08x %08x %08x %08x %08x " L"%08x %08x %08x %08x %08x %08x %08x %08x " L"%08x %08x %08x %08x %08x %08x %08x %08x " L"%08x %08x %08x %08x %08x %08x %08x %08x ", t_stack[0], t_stack[1], t_stack[2], t_stack[3], t_stack[4], t_stack[5], t_stack[6], t_stack[7], t_stack[8], t_stack[9], t_stack[10], t_stack[11], t_stack[12], t_stack[13], t_stack[14], t_stack[15], t_stack[16], t_stack[17], t_stack[18], t_stack[19], t_stack[20], t_stack[21], t_stack[22], t_stack[23], t_stack[24], t_stack[25], t_stack[26], t_stack[27], t_stack[28], t_stack[29], t_stack[30], t_stack[31] ); LogErrorMessage(sMsg); } return nRet; } //////////////////////////////////////////////////////////////////////// // // Function: Commit // // returns this CInstance to CIMOM // will stuff it into the cache someday // Inputs: // // Outputs: // // Return: // // Comments: // //////////////////////////////////////////////////////////////////////// HRESULT CInstance::Commit(void) { return m_pMethodContext->Commit( this ); } IWbemClassObject* CInstance::GetClassObjectInterface() { m_piClassObject->AddRef(); return m_piClassObject; } // reference counting // // string support // //////////////////////////////////////////////////////////////////////// // // Function: Set // // // // Inputs: Name of property to set // string to be set // // Outputs: // // Return: false if you try to set a property that is not a string type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetWCHARSplat( LPCWSTR name, LPCWSTR pStr) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; ASSERT_BREAK(name != NULL); if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v(pStr); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETCHSTRING, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETCHSTRING); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETCHSTRING); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: Set // // // // Inputs: Name of property to set to VT_NULL // // Outputs: // // Return: false if you try to set a property that is not a string type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetNull(LPCWSTR name) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; ASSERT_BREAK(name != NULL); if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; v.vt = VT_NULL ; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETCHSTRING, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETCHSTRING); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETCHSTRING); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: SetStringArray // // // // Inputs: Name of property to set // string to be set // // Outputs: // // Return: false if you try to set a property that is not a string array type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetStringArray(LPCWSTR name, const SAFEARRAY &strArray) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; ASSERT_BREAK(name != NULL); if (m_piClassObject && name) { SAFEARRAY *t_SafeArray = NULL; HRESULT hr = SafeArrayCopy ( ( SAFEARRAY * ) & strArray , &t_SafeArray ); if ( SUCCEEDED ( hr ) ) { // Variant_t handles the VariantInit/VariantClear variant_t v; v.vt = VT_BSTR | VT_ARRAY ; v.parray = t_SafeArray ; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SetStringArray, name, hr); } } else { throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ; } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SetStringArray); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SetStringArray); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: Get (CHString) // // // // Inputs: Name of property to retrieve // CHString buffer to receive value // Outputs: // // Return: false if you try to get a property that is not a string compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetCHString(LPCWSTR name, CHString& str) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; ASSERT_BREAK(name != NULL); if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_BSTR || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if ((v.vt == VT_BSTR) && (v.bstrVal != NULL)) { str = v.bstrVal; bRet = true; } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETCHSTRING, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETCHSTRING); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETCHSTRING); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: GetStringArray // // // // Inputs: Name of property to retrieve // SAFEARRAY *& strArray // Outputs: // // Return: false if you try to get a property that is not a string array compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetStringArray(LPCWSTR name, SAFEARRAY *& strArray) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; ASSERT_BREAK(name != NULL); if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = SUCCEEDED(hr) && (v.vt == (VT_BSTR|VT_ARRAY) || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if ((v.vt == (VT_BSTR|VT_ARRAY)) && (v.parray != NULL )) { if ( SUCCEEDED ( SafeArrayCopy ( v.parray , ( SAFEARRAY ** ) &strArray ) ) ) { bRet = true ; } else { throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ; } } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GetStringArray, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GetStringArray); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GetStringArray); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } bool CInstance::GetWCHAR(LPCWSTR name, WCHAR **pW) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_BSTR || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if ((v.vt == VT_BSTR) && (v.bstrVal != NULL)) { size_t uLength = wcslen(v.bstrVal) + 1; *pW = (WCHAR *)malloc((uLength)*sizeof(WCHAR)); if (*pW == NULL) { VariantClear(&v); throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ; } StringCchCopyW( *pW, uLength, v.bstrVal ); bRet = true; } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETCHSTRING, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETCHSTRING); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETCHSTRING); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } // WORD support // //////////////////////////////////////////////////////////////////////// // // Function: Set (WORD) // // // // Inputs: Name of property to set // WORD to be set // Outputs: // // Return: false if you try to set a property that is not a WORD compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetWORD(LPCWSTR name, WORD w) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; ASSERT_BREAK(name); if (m_piClassObject && name) { VARIANT v; VariantInit(&v); v.vt = VT_I4; v.lVal = (long)w; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); VariantClear(&v); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETWORD, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETWORD); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETWORD); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: Get (WORD) // // // // Inputs: Name of property to retrieve // WORD buffer to receive value // Outputs: // // Return: false if you try to get a property that is not a WORD compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetWORD(LPCWSTR name, WORD& w) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; ASSERT_BREAK(name != NULL); if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; CIMTYPE vtType; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, &vtType, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = SUCCEEDED(hr) && CIM_UINT16 == vtType; ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { // the CIM type is important here if( (v.vt == VT_I4) && (CIM_UINT16 == vtType) ) { w = (WORD)v.lVal; bRet = true; } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETWORD, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETWORD); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETWORD); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } // DWORD support // //////////////////////////////////////////////////////////////////////// // // Function: Set (DWORD) // // // // Inputs: Name of property to set // DWORD to be set // Outputs: // // Return: false if you try to set a property that is not a DWORD compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetDWORD(LPCWSTR name, DWORD d) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { VARIANT v; VariantInit(&v); v.vt = VT_I4; v.lVal = (long)d; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETDWORD, name, hr); } VariantClear(&v); } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETDWORD); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETDWORD); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: Get (DWORD) // // // // Inputs: Name of property to retrieve // DWORD buffer to receive value // Outputs: // // Return: false if you try to get a property that is not a DWORD compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetDWORD(LPCWSTR name, DWORD& d) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_I4 || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if (v.vt == VT_I4) { d = (DWORD)v.lVal; bRet = true; } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETDWORD, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETDWORD); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETDWORD); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } // DOUBLE support // //////////////////////////////////////////////////////////////////////// // // Function: Set (DOUBLE) // // // // Inputs: Name of property to set // DOUBLE to be set // Outputs: // // Return: false if you try to set a property that is not a DOUBLE compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetDOUBLE(LPCWSTR name, DOUBLE dub) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { VARIANT v; VariantInit(&v); V_R8(&v) = dub; V_VT(&v) = VT_R8; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); VariantClear(&v); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETDOUBLE, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETDOUBLE); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETDOUBLE); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: Get (DOUBLE) // // // // Inputs: Name of property to retrieve // DOUBLE buffer to receive value // Outputs: // // Return: false if you try to get a property that is not a DOUBLE compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetDOUBLE(LPCWSTR name, DOUBLE& dub) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_R8 || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if (v.vt == VT_R8) { dub = V_R8(&v); bRet = true; } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETDOUBLE, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETDOUBLE); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETDOUBLE); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: Set (Byte) // // // // Inputs: Name of property to set // BYTE to be set // Outputs: // // Return: false if you try to set a property that is not a BYTE compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetByte(LPCWSTR name, BYTE b) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { VARIANT v; VariantInit(&v); v.vt = VT_UI1; v.bVal = (long)b ; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETBYTE, name, hr); } VariantClear(&v); } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETBYTE); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETBYTE); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: SetEmbeddedObject // // // // Inputs: Name of property to set // CInstance to be set // Outputs: // // Return: false if you try to set a property that is not a IUnknown compatible type // // Comments: CInstance is not released - responsibility of caller // //////////////////////////////////////////////////////////////////////// bool CInstance::SetEmbeddedObject(LPCWSTR name, CInstance& cInstance ) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { IWbemClassObject *t_ClassObject = cInstance.GetClassObjectInterface(); if ( t_ClassObject ) { variant_t v; v.vt = VT_UNKNOWN; v.punkVal = t_ClassObject; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SetEmbeddedObject, name, hr); } } else { dwLastErr = (WBEM_E_FAILED); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SetEmbeddedObject); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SetEmbeddedObject); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: Get (Byte) // // // // Inputs: Name of property to retrieve // BYTE buffer to receive value // Outputs: // // Return: false if you try to get a property that is not a DWORD compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetByte(LPCWSTR name, BYTE& b) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; CIMTYPE vtType; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, &vtType, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = (SUCCEEDED(hr)) && ((vtType == CIM_SINT8) || (vtType == CIM_UINT8)); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if( (v.vt == VT_UI1) && ( (vtType == CIM_SINT8) || (vtType == CIM_UINT8) ) ) { b = v.bVal; bRet = true; } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETBYTE, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETBYTE); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETBYTE); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: GetEmbeddedObject // // // // Inputs: Name of property to retrieve // reference to buffer hold pointer to new instance // Outputs: // // Return: false if you try to get a property that is not a object compatible type // // Comments: Creates CInstance, user is responsible for release // //////////////////////////////////////////////////////////////////////// bool CInstance::GetEmbeddedObject (LPCWSTR name, CInstance** pInstance, MethodContext* pMethodContext) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; ASSERT_BREAK(m_piClassObject && (pInstance != NULL)); if (m_piClassObject && name && (pInstance != NULL)) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_UNKNOWN || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if (v.vt == VT_UNKNOWN) { IUnknown *t_Unknown = v.punkVal ; if ( t_Unknown ) { IWbemClassObject *t_Object = NULL; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT t_Result = t_Unknown->QueryInterface ( IID_IWbemClassObject , (void**) &t_Object ) ; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); if ( SUCCEEDED ( t_Result ) ) { *pInstance = new CInstance(t_Object, pMethodContext); if (pInstance == NULL) { throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ; } bRet = true ; } else { dwLastErr = (t_Result); } } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } else { if (bSuccess) { dwLastErr = (WBEM_S_NO_MORE_DATA); } } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GetEmbeddedObject, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GetEmbeddedObject); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GetEmbeddedObject); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } // bool support // //////////////////////////////////////////////////////////////////////// // // Function: Set (bool) // // // // Inputs: Name of property to set // bool to be set // Outputs: // // Return: false if you try to set a property that is not a bool compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::Setbool(LPCWSTR name, bool b) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { VARIANT v; VariantInit(&v); v.vt = VT_BOOL; if (b) { v.boolVal = VARIANT_TRUE; } else { v.boolVal = VARIANT_FALSE; } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETBOOL, name, hr); } VariantClear(&v); } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETBOOL); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETBOOL); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: Get (bool) // // // // Inputs: Name of property to retrieve // bool buffer to receive value // Outputs: // // Return: false if you try to get a property that is not a bool compatible type // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::Getbool(LPCWSTR name, bool& b) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = (SUCCEEDED(hr)) && (v.vt == VT_BOOL || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if (v.vt == VT_BOOL) { if (v.boolVal) { b = true; } else { b = false; } bRet = true; ASSERT_BREAK((v.boolVal == VARIANT_TRUE) || (v.boolVal == VARIANT_FALSE)); } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETBOOL, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETBOOL); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETBOOL); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: SetVariant // // // // Inputs: const LPCWSTR name - Name of property to set // const VARIANT& variant - Value to assign to Name. // // Outputs: // // Return: false if the supplied variant type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetVariant( LPCWSTR name, const VARIANT& variant ) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { HRESULT hr; // I realize the (VARIANT*) cast is ugly, as it is a const, // HOWEVER, somewhere nobody seems to understand why we would // possibly want to keep things const. I could copy the VARIANT, // but that requires the same cast, so under duress, and to reduce // redundant code, I'm casting here. Did I mention EXTREME // DURESS? PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); hr = m_piClassObject->Put(name, 0, (VARIANT*) &variant, NULL ); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETVARIANT, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETVARIANT); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETVARIANT); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: GetVariant // // // // Inputs: const LPCWSTR name - Name of property to set // VARIANT& variant - Value to assign to Name. // // Outputs: // // Return: false if the supplied variant type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetVariant( LPCWSTR name, VARIANT& variant ) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &variant, NULL, NULL ); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETVARIANT, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETVARIANT); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETVARIANT); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: SetDateTime // // // // Inputs: const LPCWSTR name - Name of property to set // const WBEMTime& wbemtime - Value to assign to Name. // // Outputs: // // Return: false if the supplied time type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetDateTime( LPCWSTR name, const WBEMTime& wbemtime ) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name && (wbemtime.IsOk())) { //GetDMTF may throw so get htis before modifying variant_t BSTR bstrTmp = wbemtime.GetDMTF(true); // Variant_t handles the VariantInit/VariantClear variant_t v; // Time is stored as a BSTR v.vt = VT_BSTR; v.bstrVal = bstrTmp; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETDATETIME, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETDATETIME); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETDATETIME); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: GetDateTime // // // // Inputs: const LPCWSTR name - Name of property to set // WBEMTime& wbemtime - Value to obtain from Name. // // Outputs: // // Return: false if the supplied variant type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetDateTime( LPCWSTR name, WBEMTime& wbemtime ) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; // // Get the name as a BSTR and pass it into the // wbemtime, which handles the conversion internally // like a good little class. // PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = (SUCCEEDED(hr)) && (v.vt == VT_BSTR || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if ((v.vt == VT_BSTR) && (v.bstrVal != NULL)) { wbemtime = v.bstrVal; bRet = wbemtime.IsOk(); if (!bRet) { dwLastErr = (WBEM_E_TYPE_MISMATCH); } } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETDATETIME, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETDATETIME); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETDATETIME); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: SetTimeSpan // // // // Inputs: const LPCWSTR name - Name of property to set // const WBEMTimeSpan& wbemtimespan - Value to assign to Name. // // Outputs: // // Return: false if the supplied timespan type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetTimeSpan( LPCWSTR name, const WBEMTimeSpan& wbemtimespan ) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name && (wbemtimespan.IsOk())) { //GetBSTR may throw so get this before modifying variant_t BSTR bstrTmp = wbemtimespan.GetBSTR(); // Variant_t handles the VariantInit/VariantClear variant_t v; // Time is stored as a BSTR v.vt = VT_BSTR; v.bstrVal = bstrTmp; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETTIMESPAN, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETTIMESPAN); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETTIMESPAN); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: GetTimeSpan // // // // Inputs: const LPCWSTR name - Name of property to set // WBEMTimeSpan& wbemtimespan - Value to obtain from Name. // // Outputs: // // Return: false if the supplied timespan type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetTimeSpan( LPCWSTR name, WBEMTimeSpan& wbemtimespan ) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; // // Get the name as a BSTR and pass it into the // wbemtimespan, which handles the conversion // internally like a good little class. // PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = (SUCCEEDED(hr)) && (v.vt == VT_BSTR || v.vt == VT_NULL); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if ((v.vt == VT_BSTR) && (v.bstrVal != NULL)) { wbemtimespan = v.bstrVal; bRet = wbemtimespan.IsOk(); // This is freed by the VariantClear // SysFreeString(v.bstrVal); if (!bRet) { dwLastErr = (WBEM_E_TYPE_MISMATCH); } } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETTIMESPAN, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETTIMESPAN); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETTIMESPAN); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: SetWBEMINT64 // // // // Inputs: const LPCWSTR name - Name of property to set // const WBEMINT64& wbemint64 - Value to assign to Name. // // Outputs: // // Return: false if the supplied wbemint64 type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetWBEMINT64( LPCWSTR name, const WBEMINT64& wbemint64 ) { // For right now, this is just a CHString. return SetWCHARSplat( name, wbemint64 ); } bool CInstance::SetWBEMINT64( LPCWSTR name, const LONGLONG i64Value ) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); WCHAR szBuff[33]; _i64tow(i64Value, szBuff, 10); return SetWCHARSplat(name, szBuff); } bool CInstance::SetWBEMINT64( LPCWSTR name, const ULONGLONG i64Value ) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); WCHAR szBuff[33]; _ui64tow(i64Value, szBuff, 10); return SetWCHARSplat(name, szBuff); } //////////////////////////////////////////////////////////////////////// // // Function: GetWBEMINT64 // // // // Inputs: const LPCWSTR name - Name of property to set // WBEMINT64& wbemint64 - Value to assign to Name. // // Outputs: // // Return: false if the supplied wbemint64 type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetWBEMINT64( LPCWSTR name, WBEMINT64& wbemint64 ) const { // For right now, this is just a CHString. return GetCHString( name, wbemint64 ); } bool CInstance::GetWBEMINT64( LPCWSTR name, LONGLONG& i64Value) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); CHString s; bool b = GetWBEMINT64(name, s); if (b) i64Value = _wtoi64(s); return b; } bool CInstance::GetWBEMINT64( LPCWSTR name, ULONGLONG& i64Value) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); CHString s; bool b = GetWBEMINT64(name, s); if (b) i64Value = _wtoi64(s); return b; } //////////////////////////////////////////////////////////////////////// // // Function: SetWBEMINT16 // // // // Inputs: const LPCWSTR name - Name of property to set // const WBEMINT16& wbemint16 - Value to assign to Name. // // Outputs: // // Return: false if the supplied wbemint16 type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::SetWBEMINT16( LPCWSTR name, const WBEMINT16& wbemint16 ) { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { VARIANT v; VariantInit(&v); v.vt = VT_I2; v.iVal = wbemint16; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); ASSERT_BREAK(SUCCEEDED(hr)); bRet = (bool)SUCCEEDED(hr); if (!bRet) { dwLastErr = (hr); LogError(IDS_FAILED, IDS_SETWBEMINT16, name, hr); } VariantClear(&v); } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_SETWBEMINT16); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_SETWBEMINT16); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: GetWBEMINT16 // // // // Inputs: const LPCWSTR name - Name of property to set // WBEMINT16& wbemint16 - Value to assign to Name. // // Outputs: // // Return: false if the supplied wbemint16 type is not correct // for the property we are setting. // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetWBEMINT16( LPCWSTR name, WBEMINT16& wbemint16 ) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = false; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; CIMTYPE vtType; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, &vtType, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); // If bSuccess is TRUE, we don't need to log an error. This keeps Gets on // null properties from logging an error. BOOL bSuccess = (SUCCEEDED(hr)) && (CIM_SINT16 == vtType) && ((v.vt == VT_I2) || (v.vt == VT_NULL)); ASSERT_BREAK(bSuccess); if (SUCCEEDED(hr)) { if ((vtType == CIM_SINT16) && (v.vt == VT_I2)) { wbemint16 = v.iVal; bRet = true; } else { dwLastErr = (WBEM_S_NO_MORE_DATA); } } if (!bSuccess) { if (SUCCEEDED(hr)) { hr = WBEM_E_TYPE_MISMATCH; } dwLastErr = (hr); LogError(IDS_FAILED, IDS_GETWBEMINT16, name, hr); } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); LogError(IDS_InParam, IDS_GETWBEMINT16); } else { dwLastErr = (WBEM_E_FAILED); LogError(IDS_NOCLASS, IDS_GETWBEMINT16); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: IsNull (LPCWSTR) // // Inputs: Name of property to check // // Outputs: // // Return: true if VT_NULL or (VT_BSTR and *bstr == NULL) // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::IsNull(LPCWSTR name) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool bRet = true; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); if (SUCCEEDED(hr)) { if (( v.vt != VT_NULL ) && ( (v.vt != VT_BSTR) || (v.bstrVal != NULL) )) { bRet = false; } else { bRet = true; } } else { ASSERT_BREAK(0); LogError(IDS_FAILED, IDS_CINSTANCEISNULL, name, hr); } } else { ASSERT_BREAK(0); if (m_piClassObject) { LogError(IDS_InParam, IDS_CINSTANCEISNULL); } else { LogError(IDS_NOCLASS, IDS_CINSTANCEISNULL); } } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); return bRet; } //////////////////////////////////////////////////////////////////////// // // Function: GetStatus (LPCWSTR, bool&,VARTYPE &) // // // // Inputs: Name of property to check // // Outputs: // // Return: true if succeeded, false otherwise // // Comments: // //////////////////////////////////////////////////////////////////////// bool CInstance::GetStatus (LPCWSTR name, bool &a_Exists , VARTYPE &a_VarType ) const { PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); bool t_Status = true ; DWORD dwLastErr = 0; if (m_piClassObject && name) { // Variant_t handles the VariantInit/VariantClear variant_t v; PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer); HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL); PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer); if (SUCCEEDED(hr)) { a_Exists = true ; a_VarType = v.vt ; } else { a_Exists = false ; } } else { if (m_piClassObject) { dwLastErr = (WBEM_E_INVALID_PARAMETER); } else { dwLastErr = (WBEM_E_FAILED); } t_Status = false ; } PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer); SetLastError(dwLastErr); return t_Status ; } //////////////////////////////////////////////////////////////////////// MethodContext* CInstance::GetMethodContext() const { return m_pMethodContext; } //////////////////////////////////////////////////////////////////////// void CInstance::LogError(LPCWSTR errorStr, LPCWSTR pFunctionName, LPCWSTR pArgs /*= NULL*/, HRESULT hError /*= -1*/) const { if (IsErrorLoggingEnabled()) { CHString className(IDS_UNKNOWNCLASS); // GetCHString("__NAME", className); // okay, I'm NOT going through GetCHString to get this // why? what happens if it fails? it tries to call this function... // can you say "stack overflow?" if (m_piClassObject) { // Variant_t handles the VariantInit/VariantClear variant_t v; HRESULT hr = m_piClassObject->Get(IDS_CLASS, 0, &v, NULL, NULL); ASSERT_BREAK((SUCCEEDED(hr)) && ((v.vt == VT_NULL) || (v.vt == VT_BSTR))); if (SUCCEEDED(hr)) { if ( v.bstrVal != NULL && v.vt != VT_NULL ) { className = v.bstrVal; } } } // intent is that the error string look like: // ERROR CInstance(Win32_UnlogicalDisk)::SetDoohicky(argVal) thing broke! error code: 0xFF1234 if (hError != -1) { if (pArgs == NULL) { LogErrorMessage6(L"%s%s)::%s %s error# %X", IDS_CINSTANCEERROR, (LPCWSTR)className, pFunctionName, errorStr, hError); } else { LogErrorMessage7(L"%s%s)::%s(%s) %s error# %X", IDS_CINSTANCEERROR, (LPCWSTR)className, pFunctionName, pArgs, errorStr, hError); } } else { if (pArgs == NULL) { LogErrorMessage5(L"%s%s)::%s %s", IDS_CINSTANCEERROR, (LPCWSTR)className, pFunctionName, errorStr); } else { LogErrorMessage6(L"%s%s)::%s(%s) %s", IDS_CINSTANCEERROR, (LPCWSTR)className, pFunctionName, pArgs, errorStr); } } } } bool CInstance::SetCHString(LPCWSTR name, const CHString& str) { return SetWCHARSplat(name, str); } bool CInstance::SetCHString(LPCWSTR name, LPCWSTR str) { return SetWCHARSplat(name, str); } bool CInstance::SetCharSplat(LPCWSTR name, LPCWSTR pStr) { return SetWCHARSplat(name, pStr); } bool CInstance::SetCHString(LPCWSTR name, LPCSTR str) { return SetWCHARSplat(name, CHString(str)); } bool CInstance::SetCharSplat( LPCWSTR name, LPCSTR pStr) { return SetWCHARSplat(name, CHString(pStr)); } bool CInstance::SetCharSplat(LPCWSTR name, DWORD dwResID) { ASSERT_BREAK(DEPRECATED); SetLastError(WBEM_E_NOT_SUPPORTED); return false; }