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

984 lines
18 KiB
C++

/*
******************************************************************************
******************************************************************************
*
*
* INTEL CORPORATION PROPRIETARY INFORMATION
* This software is supplied under the terms of a license agreement or
* nondisclosure agreement with Intel Corporation and may not be copied or
* disclosed except in accordance with the terms of that agreement.
*
* Copyright (c) 1997, 1998 Intel Corporation All Rights Reserved
******************************************************************************
******************************************************************************
*
*
*
*
*
*/
#define WATCH_MOT_REF_COUNT 1
#include "dmipch.h" // project wide include
#include "WbemDmiP.h" // project wide include
#include "Trace.h"
#include "Exception.h"
#include "DmiData.h"
#include "MOTObjects.h"
//////////////////////////////////////////////////////////////////
// SMART POINTERS
CEnumVariantI::CEnumVariantI()
{
#if WATCH_MOT_REF_COUNT
MOT_TRACE ( L"\t\t\tMOT ======== Enum Variant wrapper %lX construct" , this );
#endif
p = NULL;
}
CEnumVariantI::~CEnumVariantI()
{
Release ( );
}
ULONG CEnumVariantI::Next( CVariant& va )
{
ULONG ulRet = 0;
va.Clear();
if (FAILED( p->Next( 1, va, &ulRet ) ))
{
throw CException ( WBEM_E_FAILED , IDS_MOT_ATTRIBUTES_FAIL ,
IDS_NEXT_FAIL );
}
return ulRet;
}
void CEnumVariantI::Release( )
{
if ( p )
{
LONG l = p->Release() ;
#if WATCH_MOT_REF_COUNT
MOT_TRACE ( L"\t\t\tMOT ======== Enum Variant wrapper %lX Release = %lu" , this , l );
#endif
p = NULL;
}
}
/////////////////////////////////////////////////////////////////////////
CUnknownI::CUnknownI()
{
#if WATCH_MOT_REF_COUNT
MOT_TRACE ( L"\t\t\tMOT ======== IUnknown wrapper %lX construct" , this );
#endif
p = NULL;
}
CUnknownI::~CUnknownI()
{
Release ();
}
void CUnknownI::Release ( )
{
if ( p )
{
LONG l = p->Release() ;
#if WATCH_MOT_REF_COUNT
MOT_TRACE ( L"\t\t\tMOT ======== IUnknown wrapper %lX Release = %lu" , this , l );
#endif
p = NULL;
}
}
CDEnumColI::CDEnumColI( )
{
#if WATCH_MOT_REF_COUNT
MOT_TRACE ( L"\t\t\tMOT ======== IEnumCol wrapper %lX construct" , this );
#endif
p = NULL;
}
void CDEnumColI::Release( )
{
if ( p )
{
LONG l = p->Release() ;
#if WATCH_MOT_REF_COUNT
MOT_TRACE ( L"\t\t\tMOT ======== IEnumCol wrapper %lX Release = %lu" , this , l );
#endif
p = NULL;
}
}
void CUnknownI::GetEnum( CEnumVariantI& Enum )
{
Enum.Release ( );
if ( FAILED ( p->QueryInterface( IID_IEnumVARIANT, Enum ) ))
{
throw CException ( WBEM_E_FAILED , IDS_MOT_ATTRIBUTES_FAIL ,
IDS_QI_FAIL );
}
}
CDAttributeI::CDAttributeI()
{
p = NULL;
#if WATCH_MOT_REF_COUNT
MOT_TRACE ( L"\t\t\t\tMOT ======== IAttribute wrapper %lX construct" , this);
#endif
}
void CDAttributeI::CoCreate ( )
{
if ( FAILED ( CoCreateInstance (CLSID_DMIAttribute, NULL, EXE_TYPE,
IID_IDualAttribute , (void**) &p ) ) )
{
throw CException ( WBEM_E_FAILED , IDS_GETCOMPONENT_FAIL ,
IDS_CC_FAIL );
}
}
void CDAttributeI::Read ( LPWSTR wszPath )
{
SCODE result = WBEM_NO_ERROR;
CVariant cvMask, cvPath;
VARIANT_BOOL vbRead;
cvMask.Set( (LONG)READ_CONN_SP );
cvPath.Set( wszPath );
result = p->Read( cvPath, cvMask, &vbRead);
if ( SUCCEEDED ( result ) && vbRead == VARIANT_TRUE )
{
return;
}
CString cszT ( result );
throw CException ( WBEM_E_FAILED , IDS_MOT_READ_FAIL ,
IDS_READ_FAIL , cszT );
}
void CDAttributeI::GetDmiEnum ( CDEnumColI& DECI )
{
SCODE result = NO_ERROR;
VARIANT_BOOL vbResult = VARIANT_FALSE;
DECI.Release();
if( FAILED ( result = p->get_IsEnumeration( &vbResult ) ))
{
throw CException ( WBEM_E_FAILED , IDS_GETATTRIBENUM_FAIL ,
IDS_GETISENUM_FAIL , CString ( result ) );
}
if ( vbResult == VARIANT_FALSE )
{
throw CException ( WBEM_E_INVALID_OPERATION ,
IDS_GETATTRIBENUM_FAIL , IDS_NOT_ENUM );
}
if ( FAILED ( result = p->get_Enumerations( DECI ) ))
{
throw CException ( WBEM_E_FAILED , IDS_GETATTRIBENUM_FAIL ,
IDS_GETENUMS_FAIL , CString ( result ) );
}
}
void CDAttributeI::Release ( )
{
LONG l;
if ( p )
{
l = p->Release();
#if WATCH_MOT_REF_COUNT
MOT_TRACE ( L"\t\t\t\tMOT ======== IAttribute wrapper %lX Release = %lu" , this , l );
#endif
p = NULL;
}
}
void CDAttributesI::Release ( )
{
if ( p )
{
LONG l = p->Release() ;
p = NULL;
}
}
void CDAttributesI::Item ( LONG lAttribute , CDAttributeI& DAI )
{
CVariant cvItem;
cvItem.Set ( lAttribute );
DAI.Release();
if ( FAILED ( p->get_Item ( cvItem , DAI ) ))
{
throw CException ( WBEM_E_FAILED , IDS_GETATTRIBENUM_FAIL ,
IDS_MOT_ATTRB_ITEM );
}
}
void CDGroupI::QI ( CVariant& va )
{
if ( FAILED ( va.GetDispId()->QueryInterface( IID_IDualGroup, (void**) &p )))
{
throw CException ( WBEM_E_FAILED,
IDS_MOT_GETGROUPS_FAIL , IDS_QI_FAIL );
}
}
void CDGroupI::CoCreate ( )
{
if ( FAILED ( CoCreateInstance (CLSID_DMIGroup, NULL, EXE_TYPE,
IID_IDualGroup, ( void ** ) &p) ) )
{
throw CException ( WBEM_E_FAILED , IDS_GETGROUP_FAIL , IDS_CC_FAIL );
}
}
void CDGroupI::Read ( LPWSTR wszPath )
{
SCODE result = WBEM_NO_ERROR;
CVariant cvMask, cvPath;
VARIANT_BOOL vbRead;
cvMask.Set( (LONG)READ_CONN_SP );
cvPath.Set( wszPath );
result = p->Read( cvPath, cvMask, &vbRead);
if ( SUCCEEDED ( result ) && vbRead == VARIANT_TRUE )
return;
throw CException ( WBEM_E_FAILED , IDS_GETGROUP_FAIL , IDS_READ_FAIL ,
wszPath);
}
void CDGroupI::GetRows ( CDRowsI& DRSI )
{
DRSI.Release();
if(FAILED ( p->get_Rows( DRSI ) ))
{
throw CException ( WBEM_E_FAILED , IDS_MOT_FILLROWS_FAIL ,
IDS_MOT_GETROWS_FAIL );
}
}
void CDGroupI::GetAttributes ( CDAttributesI& DASI )
{
DASI.Release( );
if ( FAILED ( p->get_Attributes ( DASI ) ) )
{
throw CException ( WBEM_E_FAILED , IDS_MOT_ATTRIBUTES_FAIL , 0 );
}
}
void CDGroupsI::Release ( )
{
if ( p )
{
LONG l = p->Release() ;
p = NULL;
}
}
void CDGroupsI::Remove ( LONG lGroup )
{
LONG lCount1 , lCount2;
SCODE result = NO_ERROR;
CVariant cvGroupId ( lGroup );
if ( FAILED ( p->get_Count ( &lCount1) ))
{
throw CException ( WBEM_E_FAILED, IDS_DEL_GROUP_FAIL,
IDS_GETCOUNT_FAIL );
}
if (FAILED ( result = p->Remove( cvGroupId, &lCount2 ) ) )
{
throw CException ( WBEM_E_FAILED, IDS_DEL_GROUP_FAIL,
IDS_REMOVE_FAIL , CString ( result) );
}
if ( lCount2 >= lCount1 )
{
throw CException ( WBEM_E_FAILED , IDS_DEL_GROUP_FAIL,
IDS_COUNT_NOT_DEC );
}
}
void CDGroupsI::Add ( CVariant& cvMifFile )
{
LONG lCount1 , lCount2;
SCODE result = NO_ERROR;
if ( FAILED ( p->get_Count ( &lCount1) ))
{
throw CException ( WBEM_E_FAILED, IDS_MOT_GROUP_ADD_FAIL,
IDS_GETCOUNT_FAIL );
}
if (FAILED ( result = p->Add( cvMifFile, &lCount2) ) )
{
throw CException ( WBEM_E_FAILED, IDS_MOT_GROUP_ADD_FAIL,
IDS_ADD_FAIL , CString ( result) );
}
if ( lCount2 <= lCount1 )
{
throw CException ( WBEM_E_FAILED, IDS_MOT_GROUP_ADD_FAIL,
IDS_COUNT_NOT_INC );
}
}
void CDRowsI::Release ( )
{
if ( p )
{
LONG l = p->Release() ;
p = NULL;
}
}
void CDRowsI::Add ( CDRowI& DRI )
{
LONG lRowCount1 = 0, lRowCount2 = 0;
SCODE result;
if ( FAILED ( p->get_Count ( &lRowCount1) ))
{
throw CException ( WBEM_E_FAILED, IDS_ADD_ROW_FAIL,
IDS_GETCOUNT_FAIL );
}
// Add the new row
if ( FAILED ( result = p->Add( DRI, &lRowCount2) ))
{
throw CException ( WBEM_E_FAILED , IDS_ADD_ROW_FAIL,
IDS_ADD_FAIL , CString ( result ) );
}
if ( lRowCount2 <= lRowCount1 )
{
throw CException ( WBEM_E_FAILED , IDS_ADD_ROW_FAIL,
IDS_COUNT_NOT_INC );
}
}
void CDRowsI::Remove ( CAttributes* pKeys )
{
SCODE result = 0;
long lCount1 , lCount2;
CRows Rows;
Rows.Read ( p );
CRow* pRow;
int i = 1;
while ( pRow = Rows.Next() )
{
if ( pRow->m_Keys.Equal ( *pKeys ) )
break;
i++;
}
CVariant cvRowId;
cvRowId.Set ( (long)i );
if ( FAILED ( p->get_Count ( &lCount1) ))
{
throw CException ( WBEM_E_FAILED,
IDS_DEL_ROW_FAIL , IDS_GETCOUNT_FAIL );
}
if ( FAILED ( result = p->Remove( cvRowId , &lCount2 ) ) )
{
throw CException ( WBEM_E_FAILED,
IDS_DEL_ROW_FAIL,
IDS_REMOVE_FAIL,
CString ( result ) );
}
if ( lCount2 >= lCount1 )
{
throw CException ( WBEM_E_FAILED,
IDS_DEL_ROW_FAIL, IDS_COUNT_NOT_DEC );
}
}
BOOL CDRowI::Read( LPWSTR wszPath )
{
CVariant cvMask , cvPath;
VARIANT_BOOL vbRead;
cvMask.Set( (LONG)READ_CONN_SP );
cvPath.Set( wszPath );
SCODE hresult = p->Read( cvPath, cvMask, &vbRead);
// fail silently on puropse
if ( vbRead == VARIANT_FALSE)
return FALSE;
return TRUE;
}
void CDRowI::CoCreate( )
{
if ( FAILED ( CoCreateInstance ( CLSID_DMIRow, NULL , EXE_TYPE ,
IID_IDualRow , ( void ** ) &p )))
{
throw CException ( WBEM_E_FAILED , IDS_ADD_ROW_FAIL ,
IDS_CC_FAIL );
}
}
void CDRowI::GetAttributes ( CDAttributesI& DASI )
{
// Don't Orphan a previously assagned Interface pointer
DASI.Release( );
// Get the row's set of attribute interface pointers
p->get_Attributes ( DASI );
}
void CDRowI::GetKeys ( CDAttributesI& DASI )
{
// Don't Orphan a previously assagned Interface pointer
DASI.Release();
// get the keys and their values
p->get_KeyList ( DASI );
}
void CDLanguagesI::Release ()
{
if ( p )
{
LONG l = p->Release() ;
p = NULL;
}
}
void CDLanguagesI::Add ( CString& cszLanguageMif )
{
LONG lCount1 = 0 , lCount2 = 0;
SCODE result = WBEM_NO_ERROR;
if ( FAILED ( p->get_Count( &lCount1 ) ))
{
throw CException ( WBEM_E_FAILED,
IDS_LANGUAGE_ADD_FAIL, IDS_GETCOUNT_FAIL );
}
CBstr cbLanguage;
cbLanguage.Set ( cszLanguageMif );
if ( FAILED ( result = p->Add( cbLanguage , &lCount2 ) ))
{
throw CException ( WBEM_E_FAILED , IDS_LANGUAGE_ADD_FAIL,
IDS_ADD_FAIL , CString ( result ) ) ;
}
if ( lCount2 <= lCount1 )
{
throw CException ( WBEM_E_FAILED, IDS_LANGUAGE_ADD_FAIL,
IDS_COUNT_NOT_INC );
}
}
void CDLanguagesI::Remove ( CString& cszLanguage )
{
LONG lCount1 , lCount2;
CVariant cvIdx;
int idx;
BOOL bFound = FALSE;
SCODE result = NO_ERROR;
if ( FAILED ( p->get_Count( &lCount1 ) ))
{
throw CException ( WBEM_E_FAILED,
IDS_MOT_DEL_LANG_FAIL, IDS_GETCOUNT_FAIL );
}
MOT_TRACE ( L"\tMOT...\tAbout to delete language, language count\
is = %lu" , lCount1);
for ( idx = 0 ; idx < lCount1 ; idx++)
{
CBstr cbTemp;
cvIdx.Set( (LONG)idx );
if ( FAILED ( p->get_Item ( cvIdx , cbTemp ) ) )
{
throw CException ( WBEM_E_FAILED, IDS_MOT_DEL_LANG_FAIL,
IDS_GETITEM_FAIL , CString ( idx ) );
}
if ( cszLanguage.Equals ( cbTemp ) )
{
bFound = TRUE;
break;
}
}
if ( bFound )
{
if ( FAILED ( result = p->Remove( cvIdx , &lCount2) ))
{
throw CException ( WBEM_E_INVALID_PARAMETER,
IDS_MOT_DEL_LANG_FAIL , IDS_REMOVE_FAIL , CString ( result ) );
}
/*
MOT_TRACE ( L"\tMOT...\thave deleted language without error\
language count returned is = %lu" , lCount2);
*/
if ( lCount2 >= lCount1 )
{
throw CException ( WBEM_E_FAILED,IDS_MOT_DEL_LANG_FAIL,
IDS_COUNT_NOT_DEC );
}
//next line is purely debug
p->get_Count( &lCount1 );
// MOT_TRACE ( L"\tMOT...\tlanguage count is now %lu" , lCount1);
}
else
{
throw CException ( WBEM_E_FAILED, IDS_MOT_DEL_LANG_FAIL,
IDS_LANG_NOT_FOUND , cszLanguage);
}
}
/////////////////////////////////////////////////////////////////////////
void CDComponentI::QI ( CVariant& cvComponent )
{
// don't orphan if previously assigned
if ( p )
p->Release();
if ( FAILED ( cvComponent.GetDispId()->QueryInterface (
IID_IDualComponent, (void ** )&p ) ))
{
throw CException ( WBEM_E_FAILED, IDS_MOT_COMPONENTS_READ,
IDS_QI_FAIL );
}
}
void CDComponentI::CoCreate ( )
{
// don't orphan if previously assigned
Release( );
// Get the uninitialized Interface pointer to a mot
// dmi component object
if ( FAILED ( CoCreateInstance (CLSID_DMIComponent, NULL, EXE_TYPE,
IID_IDualComponent, (void**) &p ) ) )
{
throw CException ( WBEM_E_FAILED , IDS_GETCOMPONENT_FAIL ,
IDS_CC_FAIL );
}
}
void CDComponentI::GetGroups ( CDGroupsI& DGI )
{
// don't orphan if previously assigned
DGI.Release ();
// get this component's group collection
if ( FAILED ( p->get_Groups( DGI ) ) )
{
throw CException ( WBEM_E_FAILED, IDS_MOT_GETGROUPS_FAIL ,
IDS_MOT_GETGROUPSO_FAIL );
}
}
void CDComponentI::GetLanguages ( CDLanguagesI& DLSI )
{
SCODE result = NO_ERROR;
// don't orphan if previously assigned
DLSI.Release ();
// get this component's language collection
if ( FAILED ( result = p->get_Languages( DLSI ) ))
{
throw CException ( WBEM_E_FAILED,
IDS_LANGUAGE_ADD_FAIL ,
IDS_GETLANG_FAIL , CString ( result ) );
}
}
void CDComponentI::Read( LPWSTR wszPath )
{
SCODE result = WBEM_NO_ERROR;
CVariant cvMask, cvPath;
VARIANT_BOOL vbRead;
cvMask.Set( (LONG)READ_CONN_SP );
cvPath.Set( wszPath );
result = p->Read( cvPath, cvMask, &vbRead);
if ( SUCCEEDED ( result ) && vbRead == VARIANT_TRUE )
{
return;
}
CString cszT ( result );
throw CException ( WBEM_E_FAILED , IDS_MOT_COMPONENT_READ_FAIL ,
IDS_READ_FAIL , cszT );
}
void CDComponentI::Release ( )
{
if ( p )
{
LONG l = p->Release();
MOT_TRACE ( L"\t\tMOT ======== Components wrapper %lX Release = %lu" , this , l );
}
p = NULL;
}
////////////////////////////////////////////////////////////////////////
CDComponentsI::CDComponentsI()
{
MOT_TRACE ( L"\t\tMOT ======== Components wrapper %lx created", this );
p = NULL;
}
CDComponentsI::~CDComponentsI()
{
Release ();
}
void CDComponentsI::GetUnk ( CUnknownI& Unk )
{
// don't orphan if previously assigned
Unk.Release ();
// get this component's collection enum
if ( FAILED ( p->get__NewEnum( Unk ) ))
{
throw CException ( WBEM_E_FAILED, IDS_MOT_COMPONENTS_READ,
IDS_MOT_GETNEWENUM_FAIL );
}
}
void CDComponentsI::Remove ( CVariant& cvId )
{
LONG lCount1 = 0 , lCount2 = 0;
SCODE result = WBEM_NO_ERROR;
if ( FAILED ( p->get_Count ( &lCount1) ))
{
throw CException ( WBEM_E_FAILED, IDS_DEL_COMPONENT_FAIL ,
IDS_GETCOUNT_FAIL );
}
if ( FAILED ( result = p->Remove( cvId, &lCount2 ) ) )
{
throw CException ( WBEM_E_FAILED, IDS_DEL_COMPONENT_FAIL ,
IDS_REMOVE_FAIL , CString ( result ) );
}
if ( lCount2 >= lCount1 )
{
throw CException ( WBEM_E_FAILED, IDS_DEL_COMPONENT_FAIL ,
IDS_COUNT_NOT_DEC );
}
}
void CDComponentsI::Add ( CVariant& cvFile )
{
LONG lCount2 = 0, lCount1 = 0;
SCODE result = WBEM_NO_ERROR;
if ( FAILED ( p->get_Count ( &lCount1 ) ))
{
throw CException ( WBEM_E_FAILED,
IDS_MOT_COMPONENT_ADD_FAIL , IDS_GETCOUNT_FAIL );
}
if ( FAILED ( result = p->Add(cvFile, &lCount2) ))
{
CString cszT ( result );
throw CException ( WBEM_E_FAILED,
IDS_MOT_COMPONENT_ADD_FAIL , IDS_MOT_ADD_FAIL , cszT );
}
if ( lCount2 <= lCount1 )
{
throw CException ( WBEM_E_FAILED, IDS_MOT_COMPONENT_ADD_FAIL,
IDS_COUNT_NOT_INC );
}
}
////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
CDMgmtNodeI::CDMgmtNodeI()
{
p = NULL;
}
CDMgmtNodeI::~CDMgmtNodeI()
{
if ( p )
{
LONG l = p->Release();
}
}
void CDMgmtNodeI::CoCreate( )
{
if ( FAILED (
CoCreateInstance (CLSID_DMIMgmtNode, NULL, EXE_TYPE,
IID_IDualMgmtNode, (void**) &p )
) )
{
throw CException ( WBEM_E_FAILED , IDS_GETNODE_FAIL , IDS_CC_FAIL );
}
}
void CDMgmtNodeI::Read ( LPWSTR wszPath )
{
SCODE result = WBEM_NO_ERROR;
CVariant cvMask, cvPath;
VARIANT_BOOL vbRead;
cvMask.Set( (LONG)READ_CONN_SP );
cvPath.Set( wszPath );
result = p->Read( cvPath, cvMask, &vbRead);
if ( SUCCEEDED ( result ) && vbRead == VARIANT_TRUE )
{
return;
}
CString cszT ( result );
throw CException ( WBEM_E_FAILED , IDS_GETNODE_FAIL ,
IDS_READ_FAIL , cszT );
}
void CDMgmtNodeI::GetComponents( CDComponentsI& DCSI )
{
SCODE result = 0;
if ( FAILED ( result = p->get_Components( DCSI ) ))
{
CString cszT ( result );
throw CException ( WBEM_E_FAILED, IDS_MOT_COMPONENT_ADD_FAIL ,
IDS_MOT_GETCOMPONENTSO_FAIL , cszT );
}
MOT_TRACE ( L"\t\tMOT ======== Components wrapper %lx obtained Interface pointer from node" , DCSI );
}
void CDMgmtNodeI::GetLanguage( CBstr& cbLanguage )
{
cbLanguage.Clear ( );
if ( FAILED ( p->get_Language( cbLanguage ) ))
{
throw CException ( WBEM_E_FAILED , IDS_READNODE_FAIL ,
IDS_GETLANG_FAIL );
}
}
void CDMgmtNodeI::PutLanguage( const BSTR bstrLanguage )
{
SCODE result = NO_ERROR;
if ( FAILED ( result = p->put_Language( bstrLanguage ) ))
{
CString cszT ( result );
throw CException( WBEM_E_FAILED , IDS_MOT_SETDEFLANG_FAIL ,
IDS_MOT_PUTLANG_FAIL, cszT );
}
}
void CDMgmtNodeI::GetVersion( CBstr& cbVersion )
{
cbVersion.Clear ( );
if ( FAILED ( p->get_Version( cbVersion ) ) )
{
throw CException ( WBEM_E_FAILED , IDS_READNODE_FAIL ,
IDS_GETVER_FAIL );
}
}
void CDMgmtNodeI::AddComponent ( CVariant& cvMifFile )
{
CDComponentsI DCSI;
GetComponents( DCSI );
DCSI.Add ( cvMifFile );
}
void CDMgmtNodeI::DeleteComponent ( LONG lId )
{
CDComponentsI DCSI;
CVariant cvId;
cvId.Set ( lId );
GetComponents( DCSI );
try
{
DCSI.Remove ( cvId );
}
catch ( CException& e)
{
// for some reason the release order is important even though
// ref count goes to zero, If we don't through out of here there
// is not problem
Release ();
DCSI.Release ();
throw CException ( e.WbemError() , e.DescriptionId() , e.OperationId() );
}
}