// File : HMObject.inl // // Copyright (c) 2000 Microsoft Corporation // // 03/25/00 v-marfin 60298 Delete source object after a drag and drop MOVE // operation. // 04/05/00 v-marfin 59492b Also check for object type of CActionPolicy // in Refresh function so this type is not deleted as // part of the refresh. // // // #ifdef _DEBUG #define new DEBUG_NEW #endif ///////////////////////////////////////////////////////////////////////////// // Create/Destroy ///////////////////////////////////////////////////////////////////////////// inline void CHMObject::Destroy(bool bDeleteClassObject /*= false*/) { TRACEX(_T("CHMObject::Destroy\n")); if( bDeleteClassObject ) { DeleteClassObject(); } for( int i = 0; i < GetChildCount(); i++ ) { CHMObject* pObject = GetChild(i); if( pObject ) { pObject->Destroy(bDeleteClassObject); delete pObject; m_Children.SetAt(i,NULL); } } m_Children.RemoveAll(); RemoveAllScopeItems(); // TODO : Destroy Events } ///////////////////////////////////////////////////////////////////////////// // WMI Operations ///////////////////////////////////////////////////////////////////////////// inline HRESULT CHMObject::EnumerateChildren() { TRACEX(_T("CHMObject::EnumerateChildren\n")); // ASSERT(FALSE); return E_FAIL; } inline CString CHMObject::GetObjectPath() { TRACEX(_T("CHMObject::GetObjectPath\n")); return _T(""); } inline CString CHMObject::GetStatusObjectPath() { TRACEX(_T("CHMObject::GetStatusObjectPath\n")); return _T(""); } inline CWbemClassObject* CHMObject::GetClassObject() { TRACEX(_T("CHMObject::GetClassObject\n")); CWbemClassObject* pClassObject = new CWbemClassObject; if( ! CHECKHRESULT(pClassObject->Create(GetSystemName())) ) { delete pClassObject; return NULL; } if( ! CHECKHRESULT(pClassObject->GetObject(GetObjectPath())) ) { delete pClassObject; return NULL; } return pClassObject; } inline CWbemClassObject* CHMObject::GetParentClassObject() { TRACEX(_T("CHMObject::GetParentClassObject\n")); return NULL; } inline CHMEvent* CHMObject::GetStatusClassObject() { TRACEX(_T("CHMObject::GetStatusClassObject\n")); CHMEvent* pClassObject = new CHMEvent; pClassObject->SetMachineName(GetSystemName()); if( ! CHECKHRESULT(pClassObject->GetObject(GetStatusObjectPath())) ) { delete pClassObject; return NULL; } return pClassObject; } inline void CHMObject::DeleteClassObject() { TRACEX(_T("CHMObject::DeleteClassObject\n")); if( GetObjectPath().IsEmpty() ) // check if there is a WMI class associated to this object { return; } CWbemClassObject HMSystemConfig; HMSystemConfig.Create(GetSystemName()); if( ! CHECKHRESULT(HMSystemConfig.GetObject(IDS_STRING_MOF_SYSTEM_CONFIG)) ) { return; } int iResult = 0; CString sArgValue; sArgValue.Format(_T("{%s}"),GetGuid()); if( ! CHECKHRESULT(HMSystemConfig.ExecuteMethod(_T("Delete"),_T("TargetGUID"),sArgValue,iResult)) ) { return; } } inline bool CHMObject::ImportMofFile(CArchive& ar) { TRACEX(_T("CHMObject::ImportMofFile\n")); ASSERT(ar.IsLoading()); return true; } inline bool CHMObject::ExportMofFile(CArchive& ar) { TRACEX(_T("CHMObject::ExportMofFile\n")); ASSERT(ar.IsStoring()); CString sText; CWbemClassObject* pClassObject = GetClassObject(); pClassObject->GetObjectText(sText); USES_CONVERSION; char* pszAnsiText = T2A(sText); ar.Write(pszAnsiText,strlen(pszAnsiText)+sizeof(char)); /* for( int i = 0; i < GetChildCount(); i++ ) { CHMObject* pObject = GetChild(i); if( pObject ) { pObject->ExportMofFile(ar); } } */ return true; } ///////////////////////////////////////////////////////////////////////////// // Clipboard Operations ///////////////////////////////////////////////////////////////////////////// inline bool CHMObject::Copy(CString& sParentGuid, COleSafeArray& Instances) { TRACEX(_T("CHMObject::Copy\n")); CWbemClassObject SystemConfigObject; SystemConfigObject.Create(GetSystemName()); HRESULT hr = SystemConfigObject.GetObject(IDS_STRING_MOF_SYSTEM_CONFIG); if( ! CHECKHRESULT(hr) ) { return false; } CWbemClassObject CopyMethodIn; CWbemClassObject CopyMethodOut; hr = SystemConfigObject.GetMethod(_T("Copy"),CopyMethodIn); if( ! CHECKHRESULT(hr) ) { CnxDisplayErrorMsgBox(hr,GetSystemName()); return false; } CString sGuid = _T("{") + GetGuid() + _T("}"); CopyMethodIn.SetProperty(_T("TargetGUID"),sGuid); hr = SystemConfigObject.ExecuteMethod(_T("Copy"),CopyMethodIn,CopyMethodOut); if( ! CHECKHRESULT(hr) ) { CnxDisplayErrorMsgBox(hr,GetSystemName()); return false; } CopyMethodOut.GetProperty(_T("OriginalParentGuid"),sParentGuid); CopyMethodOut.GetProperty(_T("Instances"),Instances); return true; } // Move operations result in bIsOperationCopy = 0 // Copy operations result in bIsOperationCopy = 1 inline bool CHMObject::Paste(CHMObject* pObject, bool bIsOperationCopy) { TRACEX(_T("CHMObject::Paste\n")); TRACEARGn(pObject); TRACEARGn(bIsOperationCopy); if( ! GfxCheckObjPtr(pObject,CHMObject) ) { return false; } COleSafeArray Instances; CString sParentGuid; if( ! pObject->Copy(sParentGuid,Instances) ) { return false; } CWbemClassObject SystemConfigObject; SystemConfigObject.Create(GetSystemName()); HRESULT hr = SystemConfigObject.GetObject(IDS_STRING_MOF_SYSTEM_CONFIG); if( ! CHECKHRESULT(hr) ) { return false; } CWbemClassObject PasteMethodIn; CWbemClassObject PasteMethodOut; hr = SystemConfigObject.GetMethod(_T("Paste"),PasteMethodIn); if( ! CHECKHRESULT(hr) ) { CnxDisplayErrorMsgBox(hr,GetSystemName()); return false; } CString sGuid; if( GetGuid() == _T("@") ) sGuid = GetGuid(); else sGuid = _T("{") + GetGuid() + _T("}"); PasteMethodIn.SetProperty(_T("TargetGUID"),sGuid); PasteMethodIn.SetProperty(_T("ForceReplace"),false); PasteMethodIn.SetProperty(_T("OriginalSystem"),pObject->GetSystemName()); PasteMethodIn.SetProperty(_T("OriginalParentGuid"),sParentGuid); PasteMethodIn.SetProperty(_T("Instances"),Instances); hr = SystemConfigObject.ExecuteMethod(_T("Paste"),PasteMethodIn,PasteMethodOut); if( ! CHECKHRESULT(hr) ) { CnxDisplayErrorMsgBox(hr,GetSystemName()); return false; } // v-marfin : 60298 ----------------------------------------- // If this is a move operation, delete the source object. // RemoveScopeItem instead? if (!bIsOperationCopy) { // Call the scope item's OnDelete() function which will do the // necessary cleanup etc. CHMScopeItem* pItem = (CHMScopeItem*)pObject->GetScopeItem(0); pItem->OnDelete(FALSE); // FALSE = skip the confirmation prompt } //----------------------------------------------------------- Refresh(); return true; } inline bool CHMObject::QueryPaste(CHMObject* pObject) { TRACEX(_T("CHMObject::GetGuid\n")); TRACEARGn(pObject); if( ! GfxCheckObjPtr(pObject,CHMObject) ) { return false; } CString sTargetClass = GetRuntimeClass()->m_lpszClassName; CString sSourceClass = pObject->GetRuntimeClass()->m_lpszClassName; if( sTargetClass == _T("CSystemGroup") ) { if( sSourceClass != _T("CSystem") ) { return false; } } else if( sTargetClass == _T("CSystem") ) { if( sSourceClass == _T("CSystem") || sSourceClass == _T("CSystemGroup") ) { return false; } } else if( sTargetClass == _T("CDataGroup") ) { if( sSourceClass == _T("CSystem") || sSourceClass == _T("CSystemGroup") ) { return false; } } else if( sTargetClass == _T("CDataElement") ) { if( sSourceClass != _T("CRule") ) { return false; } } else if( sTargetClass == _T("CRule") ) { return false; } return true; } ///////////////////////////////////////////////////////////////////////////// // Operations ///////////////////////////////////////////////////////////////////////////// inline CString CHMObject::GetGuid() { TRACEX(_T("CHMObject::GetGuid\n")); return m_sGUID; } inline void CHMObject::SetGuid(const CString& sGuid) { TRACEX(_T("CHMObject::SetGuid\n")); TRACEARGs(m_sGUID); m_sGUID = sGuid; if( m_sGUID[0] == _T('{') ) { m_sGUID.TrimLeft(_T('{')); m_sGUID.TrimRight(_T('}')); } } inline CString CHMObject::GetName() { TRACEX(_T("CHMObject::GetName\n")); return m_sName; } inline void CHMObject::SetName(const CString& sNewName) { TRACEX(_T("CHMObject::SetName\n")); TRACEARGs(sNewName); m_sName = sNewName; } inline bool CHMObject::Rename(const CString& sNewName) { TRACEX(_T("CHMObject::Rename\n")); TRACEARGs(sNewName); if( ! GetScopeItemCount() ) { return false; } // rename the WMI instance...if this object has one if( GetObjectPath().IsEmpty() ) // no object path, so just rename the scope items and the object { CHMScopeItem* pParentItem = (CHMScopeItem*)GetScopeItem(0)->GetParent(); if( pParentItem ) { CHMObject* pParentObject = pParentItem->GetObjectPtr(); if( pParentObject ) { if( pParentObject->GetChild(sNewName) ) { return false; } } } m_sName = sNewName; for(int i = 0; i < m_ScopeItems.GetSize(); i++) { m_ScopeItems[i]->SetDisplayName(0,m_sName); m_ScopeItems[i]->SetItem(); } return true; } CWbemClassObject WmiInstance; if( ! CHECKHRESULT(WmiInstance.Create(GetSystemName())) ) { return false; } if( ! CHECKHRESULT(WmiInstance.GetObject(GetObjectPath())) ) { return false; } CHMScopeItem* pParentItem = (CHMScopeItem*)GetScopeItem(0)->GetParent(); if( pParentItem ) { CHMObject* pParentObject = pParentItem->GetObjectPtr(); if( pParentObject ) { if( pParentObject->GetChild(sNewName) ) { return false; } } } WmiInstance.SetProperty(IDS_STRING_MOF_NAME,sNewName); if( ! CHECKHRESULT(WmiInstance.SaveAllProperties()) ) { return false; } m_sName = sNewName; for(int i = 0; i < m_ScopeItems.GetSize(); i++) { m_ScopeItems[i]->SetDisplayName(0,m_sName); m_ScopeItems[i]->SetItem(); } return true; } inline CString CHMObject::GetTypeName() { TRACEX(_T("CHMObject::GetTypeName\n")); return m_sTypeName; } inline CString CHMObject::GetUITypeName() { TRACEX(_T("CHMObject::GetUITypeName\n")); return _T(""); } inline CString CHMObject::GetSystemName() { TRACEX(_T("CHMObject::GetSystemName\n")); return m_sSystemName; } inline void CHMObject::SetSystemName(const CString& sNewSystemName) { TRACEX(_T("CHMObject::SetSystemName\n")); TRACEARGs(sNewSystemName); m_sSystemName = sNewSystemName; } inline void CHMObject::ToggleStatusIcon(bool bOn /*= true*/) { TRACEX(_T("CHMObject::ToggleStatusIcon\n")); TRACEARGn(m_bStatusIconsOn); m_bStatusIconsOn = bOn; for(int i = 0; i < m_ScopeItems.GetSize(); i++) { // turn status icons on/off } } inline bool CHMObject::Refresh() { TRACEX(_T("CHMObject::Refresh\n")); for( int i = GetChildCount()-1; i >= 0; i-- ) { CHMObject* pChildObject = GetChild(i); // v-marfin 59492b : Also check to see if object is a CActionPolicy ("Actions") // item since we added an object path to it before so that // handling of individual action states would work. if( pChildObject && !pChildObject->GetObjectPath().IsEmpty() && !pChildObject->IsActionsItem()) // 59492b { pChildObject->DestroyAllChildren(); DestroyChild(i); } else { pChildObject->Refresh(); } } EnumerateChildren(); UpdateStatus(); return true; } inline bool CHMObject::ResetStatus() { TRACEX(_T("CHMObject::ResetStatus\n")); if( GetObjectPath().IsEmpty() ) // check if there is a WMI class associated to this object { return false; } CWbemClassObject HMSystemConfig; HMSystemConfig.Create(GetSystemName()); if( ! CHECKHRESULT(HMSystemConfig.GetObject(IDS_STRING_MOF_SYSTEM_CONFIG)) ) { return false; } int iResult = 0; CString sArgValue; if( GetGuid() == _T("@") ) sArgValue.Format(_T("%s"),GetGuid()); else sArgValue.Format(_T("{%s}"),GetGuid()); if( ! CHECKHRESULT(HMSystemConfig.ExecuteMethod(_T("ResetDataCollectorState"),_T("TargetGUID"),sArgValue,iResult)) ) { return false; } return true; } inline bool CHMObject::ResetStatistics() { TRACEX(_T("CHMObject::ResetStatistics\n")); if( GetObjectPath().IsEmpty() ) // check if there is a WMI class associated to this object { return false; } CWbemClassObject HMSystemConfig; HMSystemConfig.Create(GetSystemName()); if( ! CHECKHRESULT(HMSystemConfig.GetObject(IDS_STRING_MOF_SYSTEM_CONFIG)) ) { return false; } int iResult = 0; CString sArgValue; if( GetGuid() == _T("@") ) sArgValue.Format(_T("%s"),GetGuid()); else sArgValue.Format(_T("{%s}"),GetGuid()); if( ! CHECKHRESULT(HMSystemConfig.ExecuteMethod(_T("ResetDataCollectorStatistics"),_T("TargetGUID"),sArgValue,iResult)) ) { return false; } return true; } inline bool CHMObject::CheckNow() { TRACEX(_T("CHMObject::ResetStatistics\n")); if( GetObjectPath().IsEmpty() ) // check if there is a WMI class associated to this object { return false; } CWbemClassObject HMSystemConfig; HMSystemConfig.Create(GetSystemName()); if( ! CHECKHRESULT(HMSystemConfig.GetObject(IDS_STRING_MOF_SYSTEM_CONFIG)) ) { return false; } int iResult = 0; CString sArgValue; if( GetGuid() == _T("@") ) sArgValue.Format(_T("%s"),GetGuid()); else sArgValue.Format(_T("{%s}"),GetGuid()); if( ! CHECKHRESULT(HMSystemConfig.ExecuteMethod(_T("EvaluateDataCollectorNow"),_T("TargetGUID"),sArgValue,iResult)) ) { return false; } return true; } inline bool CHMObject::DeleteActionAssoc(const CString& sActionConfigGuid) { CWbemClassObject SystemConfigObject; SystemConfigObject.Create(GetSystemName()); HRESULT hr = SystemConfigObject.GetObject(IDS_STRING_MOF_SYSTEM_CONFIG); if( ! CHECKHRESULT(hr) ) { return false; } CWbemClassObject MethodIn; CWbemClassObject MethodOut; hr = SystemConfigObject.GetMethod(_T("DeleteConfigurationActionAssociation"),MethodIn); if( ! CHECKHRESULT(hr) ) { CnxDisplayErrorMsgBox(hr,GetSystemName()); return false; } CString sGuid = _T("{") + GetGuid() + _T("}"); MethodIn.SetProperty(_T("TargetGUID"),sGuid); MethodIn.SetProperty(_T("ActionGUID"),sActionConfigGuid); hr = SystemConfigObject.ExecuteMethod(_T("DeleteConfigurationActionAssociation"),MethodIn,MethodOut); if( ! CHECKHRESULT(hr) ) { CnxDisplayErrorMsgBox(hr,GetSystemName()); return false; } return true; } inline int CHMObject::IsEnabled() { TRACEX(_T("CHMObject::IsEnabled\n")); if( GetObjectPath().IsEmpty() ) // check if there is a WMI class associated to this object { return false; } return( GetState() != HMS_DISABLED ); } inline void CHMObject::Enable() { TRACEX(_T("CHMObject::Enable\n")); if( GetObjectPath().IsEmpty() ) // check if there is a WMI class associated to this object { return; } CWbemClassObject* pClassObject = GetClassObject(); if( ! pClassObject ) { return; } bool bEnabled = true; HRESULT hr = pClassObject->SetProperty(IDS_STRING_MOF_ENABLE,bEnabled); pClassObject->SaveAllProperties(); delete pClassObject; if( ! CHECKHRESULT(hr) ) { TRACE(_T("FAILED : CWbemClassObject::SetProperty failed.\n")); } } inline void CHMObject::Disable() { TRACEX(_T("CHMObject::Disable\n")); if( GetObjectPath().IsEmpty() ) // check if there is a WMI class associated to this object { return; } CWbemClassObject* pClassObject = GetClassObject(); if( ! pClassObject ) { return; } bool bEnabled = false; HRESULT hr = pClassObject->SetProperty(IDS_STRING_MOF_ENABLE,bEnabled); pClassObject->SaveAllProperties(); delete pClassObject; if( ! CHECKHRESULT(hr) ) { TRACE(_T("FAILED : CWbemClassObject::SetProperty failed.\n")); } } inline CTime CHMObject::GetCreateDateTime() { TRACEX(_T("CHMObject::GetCreateDateTime\n")); return m_CreateDateTime; } inline void CHMObject::GetCreateDateTime(CString& sDateTime) { TRACEX(_T("CHMObject::GetCreateDateTime\n")); TRACEARGs(sDateTime); SYSTEMTIME st; m_CreateDateTime.GetAsSystemTime(st); CString sTime; CString sDate; int iLen = GetTimeFormat(LOCALE_USER_DEFAULT,0L,&st,NULL,NULL,0); iLen = GetTimeFormat(LOCALE_USER_DEFAULT,0L,&st,NULL,sTime.GetBuffer(iLen+(sizeof(TCHAR)*1)),iLen); sTime.ReleaseBuffer(); iLen = GetDateFormat(LOCALE_USER_DEFAULT,0L,&st,NULL,NULL,0); iLen = GetDateFormat(LOCALE_USER_DEFAULT,0L,&st,NULL,sDate.GetBuffer(iLen+(sizeof(TCHAR)*1)),iLen); sDate.ReleaseBuffer(); sDateTime = sDate + _T(" ") + sTime; } inline void CHMObject::SetCreateDateTime(const CTime& dtime) { TRACEX(_T("CHMObject::SetCreateDateTime\n")); m_CreateDateTime = dtime; } inline CTime CHMObject::GetModifiedDateTime() { TRACEX(_T("CHMObject::GetModifiedDateTime\n")); return m_ModifiedDateTime; } inline void CHMObject::GetModifiedDateTime(CString& sDateTime) { TRACEX(_T("CHMObject::GetModifiedDateTime\n")); TRACEARGs(sDateTime); SYSTEMTIME st; m_ModifiedDateTime.GetAsSystemTime(st); CString sTime; CString sDate; int iLen = GetTimeFormat(LOCALE_USER_DEFAULT,0L,&st,NULL,NULL,0); iLen = GetTimeFormat(LOCALE_USER_DEFAULT,0L,&st,NULL,sTime.GetBuffer(iLen+(sizeof(TCHAR)*1)),iLen); sTime.ReleaseBuffer(); iLen = GetDateFormat(LOCALE_USER_DEFAULT,0L,&st,NULL,NULL,0); iLen = GetDateFormat(LOCALE_USER_DEFAULT,0L,&st,NULL,sDate.GetBuffer(iLen+(sizeof(TCHAR)*1)),iLen); sDate.ReleaseBuffer(); sDateTime = sDate + _T(" ") + sTime; } inline void CHMObject::SetModifiedDateTime(const CTime& dtime) { TRACEX(_T("CHMObject::SetModifiedDateTime\n")); m_ModifiedDateTime = dtime; } inline CString CHMObject::GetComment() { TRACEX(_T("CHMObject::GetComment\n")); return m_sComment; } inline void CHMObject::SetComment(const CString& sComment) { TRACEX(_T("CHMObject::SetComment\n")); m_sComment = sComment; } inline void CHMObject::UpdateComment(const CString& sComment) { TRACEX(_T("CHMObject::UpdateComment\n")); SetComment(sComment); for( int i = 0; i < GetScopeItemCount(); i++ ) { CStringArray& saNames = GetScopeItem(i)->GetDisplayNames(); if( saNames.GetSize() > 1 ) { GetScopeItem(i)->SetDisplayName((int)saNames.GetUpperBound(),sComment); GetScopeItem(i)->SetItem(); } } // update the comment for the WMI instance...if this object has one if( GetObjectPath().IsEmpty() ) // no object path, so just return { return; } CWbemClassObject* pClassObject = GetClassObject(); if( pClassObject ) { pClassObject->SetProperty(IDS_STRING_MOF_DESCRIPTION,m_sComment); pClassObject->SaveAllProperties(); delete pClassObject; } } inline void CHMObject::Serialize(CArchive& ar) { TRACEX(_T("CHMObject::Serialize\n")); CCmdTarget::Serialize(ar); if( ar.IsStoring() ) { ar << GetName(); } else { CString sName; ar >> sName; SetName(sName); } } ///////////////////////////////////////////////////////////////////////////// // Child Members ///////////////////////////////////////////////////////////////////////////// inline int CHMObject::GetChildCount(CRuntimeClass* pClass /*=NULL*/) { TRACEX(_T("CHMObject::GetChildCount\n")); TRACEARGn(pClass); if( ! pClass ) { return (int)m_Children.GetSize(); } int iCount = 0; for( int i = 0; i < m_Children.GetSize(); i++ ) { if( m_Children[i]->IsKindOf(pClass) ) { iCount++; } } return iCount; } inline int CHMObject::AddChild(CHMObject* pObject) { TRACEX(_T("CHMObject::AddChild\n")); TRACEARGn(pObject); if( ! GfxCheckObjPtr(pObject,CHMObject) ) { TRACE(_T("FAILED : pObject is not a valid pointer.\n")); return -1; } int iIndex = (int)m_Children.Add(pObject); pObject->SetScopePane(GetScopePane()); for( int i = 0; i < GetScopeItemCount(); i++ ) { CScopePaneItem* pItem = pObject->CreateScopeItem(); if( ! pItem->Create(m_pPane,GetScopeItem(i)) ) { ASSERT(FALSE); delete pItem; return -1; } pItem->SetIconIndex(pObject->GetState()); pItem->SetOpenIconIndex(pObject->GetState()); pItem->SetDisplayName(0,pObject->GetName()); if( GfxCheckObjPtr(pItem,CHMScopeItem) ) { ((CHMScopeItem*)pItem)->SetObjectPtr(pObject); } int iIndex = GetScopeItem(i)->AddChild(pItem); pItem->InsertItem(iIndex); pObject->AddScopeItem(pItem); } AddContainer(GetGuid(),pObject->GetGuid(),pObject); pObject->UpdateStatus(); return iIndex; } inline bool CHMObject::CreateChild(CHMObject* pObject, const CString& sWMIClassName, const CString& sWMIAssociatorClassName) { TRACEX(_T("CHMObject::CreateChild\n")); TRACEARGn(pObject); TRACEARGs(sWMIClassName); TRACEARGs(sWMIAssociatorClassName); if( ! GfxCheckObjPtr(pObject,CHMObject) ) { return false; } pObject->SetSystemName(GetSystemName()); // create the GUID GUID ChildGuid; CoCreateGuid(&ChildGuid); OLECHAR szGuid[GUID_CCH]; ::StringFromGUID2(ChildGuid, szGuid, GUID_CCH); CString sGuid = OLE2CT(szGuid); pObject->SetGuid(sGuid); // Add the child AddChild(pObject); // create child instance CWbemClassObject ChildClassObject; if( ! CHECKHRESULT(ChildClassObject.Create(GetSystemName())) ) { return false; } BSTR bsTemp = sWMIClassName.AllocSysString(); if( ! CHECKHRESULT(ChildClassObject.CreateInstance(bsTemp)) ) { ::SysFreeString(bsTemp); return false; } ::SysFreeString(bsTemp); // Save the child instance properties for name and guid ChildClassObject.SetProperty(IDS_STRING_MOF_NAME,pObject->GetName()); ChildClassObject.SetProperty(IDS_STRING_MOF_GUID,sGuid); // create the association class instance CWbemClassObject Associator; if( ! CHECKHRESULT(Associator.Create(GetSystemName())) ) { return false; } bsTemp = sWMIAssociatorClassName.AllocSysString(); if( ! CHECKHRESULT(Associator.CreateInstance(bsTemp)) ) { ::SysFreeString(bsTemp); return false; } ::SysFreeString(bsTemp); // set path properties for the association class instance Associator.SetProperty(IDS_STRING_MOF_PARENT_ASSOC,GetObjectPath()); Associator.SetProperty(IDS_STRING_MOF_CHILD_ASSOC,pObject->GetObjectPath()); // commit the changes to WMI ChildClassObject.SaveAllProperties(); Associator.SaveAllProperties(); // Add the child return true; } inline CString CHMObject::GetUniqueChildName(UINT uiFmtID /*= IDS_STRING_UNITITLED */) { TRACEX(_T("CHMObject::GetUniqueChildName\n")); CString sName; sName.LoadString(uiFmtID); sName = sName.Left(sName.GetLength()-3); while( GetChild(sName) != NULL ) { sName.Format(uiFmtID,m_lNameSuffix++); } return sName; } inline CHMObject* CHMObject::GetChild(const CString& sName) { TRACEX(_T("CHMObject::GetChild\n")); for( int i = 0; i < m_Children.GetSize(); i++ ) { if( m_Children[i]->GetName().CompareNoCase(sName) == 0 ) { return GetChild(i); } } return NULL; } inline CHMObject* CHMObject::GetChildByGuid(const CString& sGuid) { TRACEX(_T("CHMObject::GetChildByGUID\n")); TRACEARGs(sGuid); for( int i = 0; i < m_Children.GetSize(); i++ ) { if( m_Children[i]->GetGuid() == sGuid ) { return GetChild(i); } } return NULL; } inline CHMObject* CHMObject::GetDescendantByGuid(const CString& sGuid) { TRACEX(_T("CHMObject::GetDescendantByGuid\n")); TRACEARGs(sGuid); for( int i = 0; i < m_Children.GetSize(); i++ ) { if( m_Children[i]->GetGuid() == sGuid ) { return GetChild(i); } CHMObject* pDescendantObject = m_Children[i]->GetDescendantByGuid(sGuid); if( pDescendantObject ) { return pDescendantObject; } } return NULL; } inline CHMObject* CHMObject::GetChild(int iIndex) { TRACEX(_T("CHMObject::GetChild\n")); TRACEARGn(iIndex); if( iIndex >= m_Children.GetSize() || iIndex < 0 ) { TRACE(_T("FAILED : iIndex is out of array bounds.\n")); return NULL; } return m_Children[iIndex]; } inline void CHMObject::RemoveChild(CHMObject* pObject) { TRACEX(_T("CHMObject::RemoveChild\n")); TRACEARGn(pObject); for( int i = 0; i < m_Children.GetSize(); i++ ) { if( m_Children[i] == pObject ) { m_Children.RemoveAt(i); return; } } } inline void CHMObject::DestroyChild(CHMObject* pChildObject, bool bDeleteClassObject /*= false*/) { TRACEX(_T("CHMObject::DestroyChild\n")); TRACEARGn(pChildObject); TRACEARGn(bDeleteClassObject); for( int i = 0; i < m_Children.GetSize(); i++ ) { if( GetChild(i) == pChildObject ) { DestroyChild(i,bDeleteClassObject); break; } } } inline void CHMObject::DestroyAllChildren() { TRACEX(_T("CHMObject::DestroyAllChildren\n")); for( int i = (int)m_Children.GetSize() - 1; i >= 0; i-- ) { m_Children[i]->DestroyAllChildren(); DestroyChild(i); } } ///////////////////////////////////////////////////////////////////////////// // State Members ///////////////////////////////////////////////////////////////////////////// inline void CHMObject::SetState(int iState, bool bUpdateScopeItems /*= false*/, bool bApplyToChildren /*= false*/) { TRACEX(_T("CHMObject::SetState\n")); TRACEARGn(iState); m_nState = iState; if( bUpdateScopeItems ) { for( int i = 0; i < GetScopeItemCount(); i++ ) { CScopePaneItem* pItem = GetScopeItem(i); if( pItem ) { pItem->SetIconIndex(GetState()); pItem->SetOpenIconIndex(GetState()); pItem->SetItem(); } } } if( bApplyToChildren ) { for( int i = 0; i < GetChildCount(); i++ ) { CHMObject* pObject = GetChild(i); if( pObject ) { pObject->SetState(iState,bUpdateScopeItems,bApplyToChildren); } } } } inline void CHMObject::TallyChildStates() { TRACEX(_T("CHMObject::TallyChildStates\n")); m_lNormalCount = 0L; m_lWarningCount = 0L; m_lCriticalCount = 0L; m_lUnknownCount = 0L; for( int i = 0; i < m_Children.GetSize(); i++ ) { switch( m_Children[i]->GetState() ) { case HMS_NORMAL: { m_lNormalCount++; } break; case HMS_WARNING: { m_lWarningCount++; } break; case HMS_CRITICAL: { m_lCriticalCount++; } break; case HMS_UNKNOWN: { m_lUnknownCount++; } break; } } } ///////////////////////////////////////////////////////////////////////////// // Associated Scope Pane Member ///////////////////////////////////////////////////////////////////////////// inline CScopePane* CHMObject::GetScopePane() { TRACEX(_T("CHMObject::GetScopePane\n")); if( ! GfxCheckObjPtr(m_pPane,CScopePane) ) { TRACE(_T("FAILED : m_pPane is not a valid pointer.\n")); return NULL; } return m_pPane; } inline void CHMObject::SetScopePane(CScopePane* pPane) { TRACEX(_T("CHMObject::SetScopePane\n")); TRACEARGn(pPane); if( ! GfxCheckObjPtr(pPane,CScopePane) ) { TRACE(_T("FAILED : pPane is not a valid pointer.\n")); return; } m_pPane = pPane; } ///////////////////////////////////////////////////////////////////////////// // Scope Item Members ///////////////////////////////////////////////////////////////////////////// inline int CHMObject::GetScopeItemCount() { TRACEX(_T("CHMObject::GetScopeItemCount\n")); return (int)m_ScopeItems.GetSize(); } inline CScopePaneItem* CHMObject::GetScopeItem(int iIndex) { TRACEX(_T("CHMObject::GetScopeItem\n")); TRACEARGn(iIndex); if( iIndex >= m_ScopeItems.GetSize() || iIndex < 0 ) { TRACE(_T("FAILED : iIndex is out of array bounds.\n")); return NULL; } if( ! GfxCheckObjPtr(m_ScopeItems[iIndex],CScopePaneItem) ) { TRACE(_T("FAILED : The Scope Pane Item pointer stored at iIndex is invalid.\n")); return NULL; } return m_ScopeItems[iIndex]; } inline int CHMObject::AddScopeItem(CScopePaneItem* pItem) { TRACEX(_T("CHMObject::AddScopeItem\n")); TRACEARGn(pItem); if( ! GfxCheckObjPtr(pItem,CScopePaneItem) ) { TRACE(_T("FAILED : pItem is not a valid pointer.\n")); return -1; } if( pItem->GetChildCount() == 0 && GetChildCount() != 0 ) { for( int i = 0; i < m_Children.GetSize(); i++ ) { CScopePaneItem* pNewItem = m_Children[i]->CreateScopeItem(); if( ! pNewItem->Create(m_pPane,pItem) ) { ASSERT(FALSE); delete pNewItem; return -1; } if( m_Children[i]->GetScopeItemCount() ) { pNewItem->SetDisplayNames(m_Children[i]->GetScopeItem(0)->GetDisplayNames()); } else { pNewItem->SetDisplayName(0,m_Children[i]->GetName()); } pNewItem->SetIconIndex(m_Children[i]->GetState()); pNewItem->SetOpenIconIndex(m_Children[i]->GetState()); int iIndex = pItem->AddChild(pNewItem); pNewItem->InsertItem(iIndex); m_Children[i]->AddScopeItem(pNewItem); } } // make certain the new scope item has the correct icon pItem->SetIconIndex(GetState()); pItem->SetOpenIconIndex(GetState()); return (int)m_ScopeItems.Add(pItem); } inline void CHMObject::RemoveScopeItem(int iIndex) { TRACEX(_T("CHMObject::RemoveScopeItem\n")); TRACEARGn(iIndex); if( iIndex >= m_ScopeItems.GetSize() || iIndex < 0 ) { TRACE(_T("FAILED : iIndex is out of array bounds.\n")); return; } if( ! GfxCheckObjPtr(m_ScopeItems[iIndex],CScopePaneItem) ) { TRACE(_T("FAILED : The Scope Pane Item pointer stored at iIndex is invalid.\n")); return; } m_ScopeItems.RemoveAt(iIndex); } inline void CHMObject::RemoveAllScopeItems() { TRACEX(_T("CHMObject::RemoveAllScopeItems\n")); m_ScopeItems.RemoveAll(); } inline CScopePaneItem* CHMObject::IsSelected() { TRACEX(_T("CHMObject::IsSelected\n")); if( ! GetScopePane() ) { return NULL; } for( int i = 0; i < GetScopeItemCount(); i++ ) { if( m_pPane->GetSelectedScopeItem() == GetScopeItem(i) ) { return GetScopeItem(i); } } return NULL; }