|
|
// 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); }
|