WindowsXP-SP1/admin/hmonitor/snapin/systemgroup.cpp
2020-09-30 16:53:49 +02:00

223 lines
5.5 KiB
C++

// SystemGroup.cpp : implementation file
//
#include "stdafx.h"
#include "snapin.h"
#include "SystemGroup.h"
#include "EventManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSystemGroup
IMPLEMENT_SERIAL(CSystemGroup, CHMObject, 1)
CSystemGroup::CSystemGroup()
{
EnableAutomation();
// To keep the application running as long as an OLE automation
// object is active, the constructor calls AfxOleLockApp.
AfxOleLockApp();
m_nState = HMS_NORMAL;
// create the GUID
GUID ChildGuid;
CoCreateGuid(&ChildGuid);
OLECHAR szGuid[GUID_CCH];
::StringFromGUID2(ChildGuid, szGuid, GUID_CCH);
CString sGuid = OLE2CT(szGuid);
SetGuid(sGuid);
}
CSystemGroup::~CSystemGroup()
{
// To terminate the application when all objects created with
// with OLE automation, the destructor calls AfxOleUnlockApp.
AfxOleUnlockApp();
}
int CSystemGroup::AddShortcut(CHMObject* pObject)
{
TRACEX(_T("CSystemGroup::AddShortcut\n"));
TRACEARGn(pObject);
if( ! GfxCheckObjPtr(pObject,CHMObject) )
{
TRACE(_T("FAILED : pObject is not a valid pointer.\n"));
return -1;
}
pObject->SetScopePane(GetScopePane());
int iIndex = (int)m_Shortcuts.Add(pObject);
for( int i = 0; i < GetScopeItemCount(); i++ )
{
CScopePaneItem* pItem = pObject->CreateScopeItem();
if( ! pItem->Create(m_pPane,GetScopeItem(i)) )
{
ASSERT(FALSE);
delete pItem;
return -1;
}
if( pObject->GetScopeItemCount() )
{
pItem->SetDisplayNames(pObject->GetScopeItem(0)->GetDisplayNames());
}
else
{
pItem->SetDisplayName(0,pObject->GetName());
}
pItem->SetIconIndex(pObject->GetState());
pItem->SetOpenIconIndex(pObject->GetState());
if( GfxCheckObjPtr(pItem,CHMScopeItem) )
{
((CHMScopeItem*)pItem)->SetObjectPtr(pObject);
}
int iIndex = GetScopeItem(i)->AddChild(pItem);
pItem->InsertItem(iIndex);
pObject->AddScopeItem(pItem);
}
EvtGetEventManager()->AddSystemShortcutAssociation(GetGuid(),pObject->GetSystemName());
return iIndex;
}
void CSystemGroup::RemoveShortcut(CHMObject* pObject)
{
TRACEX(_T("CSystemGroup::RemoveShortcut\n"));
TRACEARGn(pObject);
if( ! pObject )
{
return;
}
EvtGetEventManager()->RemoveSystemShortcutAssociation(GetGuid(),pObject->GetSystemName());
for( int i = 0; i < m_Shortcuts.GetSize(); i++ )
{
if( m_Shortcuts[i] == pObject )
{
for( int j = pObject->GetScopeItemCount()-1; j >= 0; j-- )
{
CScopePaneItem* pChildItem = pObject->GetScopeItem(j);
if( pChildItem )
{
CHMScopeItem* pParentItem = (CHMScopeItem*)pChildItem->GetParent();
if( pParentItem && pParentItem->GetObjectPtr() == this )
{
pObject->RemoveScopeItem(j);
pParentItem->DestroyChild(pChildItem);
}
}
}
m_Shortcuts.RemoveAt(i);
return;
}
}
}
void CSystemGroup::OnFinalRelease()
{
// When the last reference for an automation object is released
// OnFinalRelease is called. The base class will automatically
// deletes the object. Add additional cleanup required for your
// object before calling the base class.
CHMObject::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CSystemGroup, CHMObject)
//{{AFX_MSG_MAP(CSystemGroup)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CSystemGroup, CHMObject)
//{{AFX_DISPATCH_MAP(CSystemGroup)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
// Note: we add support for IID_ISystemGroup to support typesafe binding
// from VBA. This IID must match the GUID that is attached to the
// dispinterface in the .ODL file.
// {D9BF4F9D-F673-11D2-BDC4-0000F87A3912}
static const IID IID_ISystemGroup =
{ 0xd9bf4f9d, 0xf673, 0x11d2, { 0xbd, 0xc4, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12 } };
BEGIN_INTERFACE_MAP(CSystemGroup, CHMObject)
INTERFACE_PART(CSystemGroup, IID_ISystemGroup, Dispatch)
END_INTERFACE_MAP()
// {D9BF4F9E-F673-11D2-BDC4-0000F87A3912}
IMPLEMENT_OLECREATE_EX(CSystemGroup, "SnapIn.SystemGroup", 0xd9bf4f9e, 0xf673, 0x11d2, 0xbd, 0xc4, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12)
BOOL CSystemGroup::CSystemGroupFactory::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);
}
/////////////////////////////////////////////////////////////////////////////
// CSystemGroup message handlers
/////////////////////////////////////////////////////////////////////////////
// CAllSystemsGroup
IMPLEMENT_SERIAL(CAllSystemsGroup, CSystemGroup, 1)
CAllSystemsGroup::CAllSystemsGroup()
{
EnableAutomation();
// To keep the application running as long as an OLE automation
// object is active, the constructor calls AfxOleLockApp.
AfxOleLockApp();
m_nState = HMS_NORMAL;
// create the GUID
GUID ChildGuid;
CoCreateGuid(&ChildGuid);
OLECHAR szGuid[GUID_CCH];
::StringFromGUID2(ChildGuid, szGuid, GUID_CCH);
CString sGuid = OLE2CT(szGuid);
SetGuid(sGuid);
}
CAllSystemsGroup::~CAllSystemsGroup()
{
// To terminate the application when all objects created with
// with OLE automation, the destructor calls AfxOleUnlockApp.
AfxOleUnlockApp();
}