windows-nt/Source/XPSP1/NT/admin/hmonitor/snapin/healthmonscopepane.cpp
2020-09-26 16:20:57 +08:00

435 lines
9.4 KiB
C++

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