// HealthmonScopePane.cpp: implementation of the CHealthmonScopePane class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "snapin.h" #include "AllSystemsScopeItem.h" #include "HealthmonScopePane.h" #include "HealthmonResultsPane.h" #include "SystemsScopeItem.h" #include "RootScopeItem.h" #include "SystemGroup.h" #include "System.h" #include "EventManager.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE(CHealthmonScopePane,CScopePane) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CHealthmonScopePane::CHealthmonScopePane() { EnableAutomation(); // To keep the application running as long as an OLE automation // object is active, the constructor calls AfxOleLockApp. AfxOleLockApp(); // create the root scope item SetRootScopeItem(CreateRootScopeItem()); m_pRootGroup = NULL; } CHealthmonScopePane::~CHealthmonScopePane() { if( m_pRootItem ) { if( GfxCheckObjPtr(m_pRootItem,CScopePaneItem) ) { delete m_pRootItem; } m_pRootItem = NULL; } // To terminate the application when all objects created with // with OLE automation, the destructor calls AfxOleUnlockApp. AfxOleUnlockApp(); } ///////////////////////////////////////////////////////////////////////////// // Creation/Destruction Overrideable Members ///////////////////////////////////////////////////////////////////////////// bool CHealthmonScopePane::OnCreate() { TRACEX(_T("CHealthmonScopePane::OnCreate\n")); // create connection manager if( ! CnxCreate() ) { TRACE(_T("FAILED : CnxCreate returns false.\n")); return false; } // call base class to create root scope item if( ! CScopePane::OnCreate() ) { TRACE(_T("FAILED : CScopePane::OnCreate failed.\n")); return false; } // create the Root Group m_pRootGroup = new CSystemGroup; m_pRootGroup->SetScopePane(this); CScopePaneItem* pRootItem = GetRootScopeItem(); m_pRootGroup->SetName(pRootItem->GetDisplayName()); m_pRootGroup->AddScopeItem(pRootItem); ((CHMScopeItem*)pRootItem)->SetObjectPtr(m_pRootGroup); EvtGetEventManager()->AddContainer(_T(""),_T(""),m_pRootGroup->GetGuid(),m_pRootGroup); // create the All Systems Group and add it to the root group CAllSystemsGroup* pAllSystemsGroup = new CAllSystemsGroup; CString sName; sName.LoadString(IDS_STRING_ALL_SYSTEMS_NODE); pAllSystemsGroup->SetName(sName); m_pRootGroup->AddChild(pAllSystemsGroup); return true; } LPCOMPONENT CHealthmonScopePane::OnCreateComponent() { TRACEX(_T("CHealthmonScopePane::OnCreateComponent\n")); CHealthmonResultsPane* pNewPane = new CHealthmonResultsPane; if( ! GfxCheckObjPtr(pNewPane,CHealthmonResultsPane) ) { TRACE(_T("FAILED : Out of memory.\n")); return NULL; } pNewPane->SetOwnerScopePane(this); int iIndex = AddResultsPane(pNewPane); ASSERT(iIndex != -1); LPCOMPONENT pComponent = (LPCOMPONENT)pNewPane->GetInterface(&IID_IComponent); if( ! CHECKPTR(pComponent,sizeof(IComponent)) ) { return NULL; } return pComponent; } bool CHealthmonScopePane::OnDestroy() { TRACEX(_T("CHealthmonScopePane::OnDestroy\n")); // unhook the window first UnhookWindow(); if( m_pMsgHook ) { delete m_pMsgHook; m_pMsgHook = NULL; } // destroy the root item and all its child scope items if( m_pRootItem ) { if( GfxCheckObjPtr(m_pRootItem,CScopePaneItem) ) { delete m_pRootItem; } m_pRootItem = NULL; } m_pSelectedScopeItem = NULL; // destroy the HMObjects we allocated during the console session if( m_pRootGroup ) { m_pRootGroup->Destroy(); EvtGetEventManager()->RemoveContainer(_T(""),m_pRootGroup->GetGuid()); delete m_pRootGroup; m_pRootGroup = NULL; } // Release all the interfaces queried for if( m_pIConsole ) { m_pIConsole->Release(); m_pIConsole = NULL; } if( m_pIConsoleNamespace ) { m_pIConsoleNamespace->Release(); m_pIConsoleNamespace = NULL; } if( m_pIImageList ) { m_pIImageList->Release(); m_pIImageList = NULL; } // empty Result Panes array for( int i = GetResultsPaneCount()-1; i >= 0; i-- ) { RemoveResultsPane(i); } CnxDestroy(); return true; } ///////////////////////////////////////////////////////////////////////////// // Root Scope Pane Item Members ///////////////////////////////////////////////////////////////////////////// CScopePaneItem* CHealthmonScopePane::CreateRootScopeItem() { TRACEX(_T("CHealthmonScopePane::CreateRootScopeItem\n")); return new CRootScopeItem; } ///////////////////////////////////////////////////////////////////////////// // Healthmon Scope Helper Members ///////////////////////////////////////////////////////////////////////////// CAllSystemsScopeItem* CHealthmonScopePane::GetAllSystemsScopeItem() { TRACEX(_T("CHealthmonScopePane::GetAllSystemsScopeItem\n")); CScopePaneItem* pRootItem = GetRootScopeItem(); if( ! pRootItem ) { TRACE(_T("FAILED : CScopePane::GetRootScopeItem returns NULL.\n")); return NULL; } for( int i = 0; i < pRootItem->GetChildCount(); i++ ) { CScopePaneItem* pTempItem = pRootItem->GetChild(i); if( pTempItem && pTempItem->IsKindOf(RUNTIME_CLASS(CAllSystemsScopeItem)) ) { return (CAllSystemsScopeItem*)pTempItem; } } TRACE(_T("FAILED : A node of type CAllSystemsScopeItem was not found.\n")); ASSERT(FALSE); return NULL; } CSystemGroup* CHealthmonScopePane::GetAllSystemsGroup() { TRACEX(_T("CHealthmonScopePane::GetAllSystemsGroup\n")); CSystemGroup* pRG = GetRootGroup(); CSystemGroup* pASG = (CSystemGroup*)pRG->GetChild(0); if( ! GfxCheckObjPtr(pASG,CSystemGroup) ) { return NULL; } return pASG; } CSystem* CHealthmonScopePane::GetSystem(const CString& sName) { TRACEX(_T("CHealthmonScopePane::GetSystem\n")); CSystemGroup* pGroup = GetAllSystemsGroup(); CSystem* pSystem = (CSystem*)pGroup->GetChild(sName); if( ! GfxCheckObjPtr(pSystem,CSystem) ) { return NULL; } return pSystem; } ///////////////////////////////////////////////////////////////////////////// // Serialization ///////////////////////////////////////////////////////////////////////////// bool CHealthmonScopePane::OnLoad(CArchive& ar) { TRACEX(_T("CHealthmonScopePane::OnLoad\n")); if( ! CScopePane::OnLoad(ar) ) { return false; } CSystemGroup* pASG = GetAllSystemsGroup(); ASSERT(pASG); pASG->Serialize(ar); CStringArray saSystems; if( ParseCommandLine(saSystems) ) { for( int z = 0; z < saSystems.GetSize(); z++ ) { IWbemServices* pServices = NULL; BOOL bAvail = FALSE; if( CnxGetConnection(saSystems[z],pServices,bAvail) == E_FAIL ) { MessageBeep(MB_ICONEXCLAMATION); } if( pServices ) { pServices->Release(); } CSystem* pNewSystem = new CSystem; pNewSystem->SetName(saSystems[z]); pNewSystem->SetSystemName(saSystems[z]); pNewSystem->SetScopePane(this); pASG->AddChild(pNewSystem); pNewSystem->Connect(); CActionPolicy* pPolicy = new CActionPolicy; pPolicy->SetSystemName(pNewSystem->GetName()); pNewSystem->AddChild(pPolicy); /* causes AV in MMCNDMGR if( z == 0 ) { for( int x = 0; x < pNewSystem->GetScopeItemCount(); x++ ) { CScopePaneItem* pItem = pNewSystem->GetScopeItem(x); if( pItem ) { pItem->SelectItem(); } } } */ } } CSystemGroup* pMSG = GetRootGroup(); int iSystemGroupCount; ar >> iSystemGroupCount; for( int i = 0; i < iSystemGroupCount; i++ ) { CSystemGroup* pNewGroup = new CSystemGroup; pNewGroup->SetScopePane(this); pNewGroup->SetName(pMSG->GetUniqueChildName()); pMSG->AddChild(pNewGroup); pNewGroup->Serialize(ar); } return true; } bool CHealthmonScopePane::OnSave(CArchive& ar) { TRACEX(_T("CHealthmonScopePane::OnSave\n")); if( ! CScopePane::OnSave(ar) ) { return false; } CSystemGroup* pASG = GetAllSystemsGroup(); ASSERT(pASG); pASG->Serialize(ar); CSystemGroup* pMSG = GetRootGroup(); int iSystemGroupCount = pMSG->GetChildCount(RUNTIME_CLASS(CSystemGroup))-1; ar << iSystemGroupCount; for( int i = 1; i <= iSystemGroupCount; i++ ) { pMSG->GetChild(i)->Serialize(ar); } return true; } ///////////////////////////////////////////////////////////////////////////// // Parse Command Line ///////////////////////////////////////////////////////////////////////////// bool CHealthmonScopePane::ParseCommandLine(CStringArray& saSystems) { TRACEX(_T("CHealthmonScopePane::ParseCommandLine\n")); saSystems.RemoveAll(); CString sCmdLine = GetCommandLine(); sCmdLine.MakeUpper(); int iIndex = sCmdLine.Find(_T("/HEALTHMON_SYSTEMS:")); if( iIndex == -1 ) { return false; } sCmdLine = sCmdLine.Right(sCmdLine.GetLength()-iIndex-19); iIndex = sCmdLine.Find(_T(" ")); if( iIndex != -1 ) { sCmdLine = sCmdLine.Left(iIndex); } LPTSTR lpszCmdLine = new TCHAR[sCmdLine.GetLength()+1]; _tcscpy(lpszCmdLine,sCmdLine); LPTSTR lpszToken = _tcstok(lpszCmdLine,_T(",")); while(lpszToken) { saSystems.Add(lpszToken); lpszToken = _tcstok(NULL,_T(",")); } delete[] lpszCmdLine; return true; } // {FBBB8DAE-AB34-11d2-BD62-0000F87A3912} IMPLEMENT_OLECREATE_EX(CHealthmonScopePane, "SnapIn.ScopePane", 0xfbbb8dae, 0xab34, 0x11d2, 0xbd, 0x62, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12); BOOL CHealthmonScopePane::CHealthmonScopePaneFactory::UpdateRegistry(BOOL bRegister) { if (bRegister) return AfxOleRegisterServerClass(m_clsid, m_lpszProgID, m_lpszProgID, m_lpszProgID, OAT_DISPATCH_OBJECT); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID); }