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

1575 lines
36 KiB
C++

// ScopePane.cpp : implementation file
//
#include "stdafx.h"
#include "ScopePane.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScopePane
IMPLEMENT_DYNCREATE(CScopePane, CCmdTarget)
/////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
/////////////////////////////////////////////////////////////////////////////
CScopePane::CScopePane()
{
EnableAutomation();
m_pRootItem = NULL;
m_pMsgHook = NULL;
m_pIConsoleNamespace = NULL;
m_pIConsole = NULL;
m_pIImageList = NULL;
m_pSelectedScopeItem = NULL;
// To keep the application running as long as an OLE automation
// object is active, the constructor calls AfxOleLockApp.
AfxOleLockApp();
}
CScopePane::~CScopePane()
{
// To terminate the application when all objects created with
// with OLE automation, the destructor calls AfxOleUnlockApp.
AfxOleUnlockApp();
}
/////////////////////////////////////////////////////////////////////////////
// Creation/Destruction Overrideable Members
/////////////////////////////////////////////////////////////////////////////
bool CScopePane::OnCreate()
{
TRACEX(_T("CScopePane::OnCreate\n"));
if( ! GetRootScopeItem() )
{
TRACE(_T("FAILED : The pointer to the root item is invalid.\n"));
return false;
}
if( ! m_pRootItem->Create(this,NULL) )
{
TRACE(_T("CRootScopeItem::Create failed.\n"));
return false;
}
return true;
}
LPCOMPONENT CScopePane::OnCreateComponent()
{
TRACEX(_T("CScopePane::OnCreateComponent\n"));
CResultsPane* pNewPane = new CResultsPane;
if( ! CHECKOBJPTR(pNewPane,RUNTIME_CLASS(CResultsPane),sizeof(CResultsPane)) )
{
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 CScopePane::OnDestroy()
{
TRACEX(_T("CScopePane::OnDestroy\n"));
// unhook the window first
UnhookWindow();
if( m_pMsgHook )
{
delete m_pMsgHook;
m_pMsgHook = NULL;
}
// delete the root scope pane item
CScopePaneItem* pRootItem = GetRootScopeItem();
if( pRootItem )
{
delete pRootItem;
m_pRootItem = 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);
}
m_pSelectedScopeItem = NULL;
return true;
}
/////////////////////////////////////////////////////////////////////////////
// Root Scope Pane Item Members
/////////////////////////////////////////////////////////////////////////////
CScopePaneItem* CScopePane::CreateRootScopeItem()
{
TRACEX(_T("CScopePane::CreateRootScopeItem\n"));
return NULL;
}
CScopePaneItem* CScopePane::GetRootScopeItem()
{
TRACEX(_T("CScopePane::GetRootScopeItem\n"));
if( ! CHECKOBJPTR(m_pRootItem,RUNTIME_CLASS(CScopePaneItem),sizeof(CScopePaneItem)) )
{
return NULL;
}
return m_pRootItem;
}
void CScopePane::SetRootScopeItem(CScopePaneItem* pRootItem)
{
TRACEX(_T("CScopePane::GetRootScopeItem\n"));
if( ! CHECKOBJPTR(pRootItem,RUNTIME_CLASS(CScopePaneItem),sizeof(CScopePaneItem)) )
{
return;
}
m_pRootItem = pRootItem;
}
/////////////////////////////////////////////////////////////////////////////
// MMC Frame Window Message Hook Members
/////////////////////////////////////////////////////////////////////////////
bool CScopePane::HookWindow()
{
TRACEX(_T("CScopePane::HookWindow\n"));
if( m_pMsgHook == NULL )
{
m_pMsgHook = new CMmcMsgHook;
}
if( ! CHECKOBJPTR(m_pMsgHook,RUNTIME_CLASS(CMmcMsgHook),sizeof(CMmcMsgHook)) )
{
return false;
}
HWND hMMCMainWnd = NULL;
LPCONSOLE2 lpConsole = GetConsolePtr();
if( lpConsole == NULL )
{
return false;
}
lpConsole->GetMainWindow(&hMMCMainWnd);
m_pMsgHook->Init(GetRootScopeItem(),hMMCMainWnd);
lpConsole->Release();
return true;
}
void CScopePane::UnhookWindow()
{
TRACEX(_T("CScopePane::UnhookWindow\n"));
if( ! CHECKOBJPTR(m_pMsgHook,RUNTIME_CLASS(CMmcMsgHook),sizeof(CMmcMsgHook)) )
{
return;
}
m_pMsgHook->HookWindow(NULL);
}
/////////////////////////////////////////////////////////////////////////////
// MMC Interface Members
/////////////////////////////////////////////////////////////////////////////
LPCONSOLENAMESPACE2 CScopePane::GetConsoleNamespacePtr()
{
TRACEX(_T("CScopePane::GetConsoleNamespacePtr\n"));
if( ! CHECKPTR(m_pIConsoleNamespace,sizeof(IConsoleNameSpace2)) )
{
return NULL;
}
m_pIConsoleNamespace->AddRef();
return m_pIConsoleNamespace;
}
LPCONSOLE2 CScopePane::GetConsolePtr()
{
TRACEX(_T("CScopePane::GetConsolePtr\n"));
if( ! CHECKPTR(m_pIConsole,sizeof(IConsole2)) )
{
return NULL;
}
m_pIConsole->AddRef();
return m_pIConsole;
}
LPIMAGELIST CScopePane::GetImageListPtr()
{
TRACEX(_T("CScopePane::GetImageListPtr\n"));
if( ! CHECKPTR(m_pIImageList,sizeof(IImageList)) )
{
return NULL;
}
m_pIImageList->AddRef();
return m_pIImageList;
}
LPUNKNOWN CScopePane::GetCustomOcxPtr()
{
TRACEX(_T("CScopePane::GetCustomOcxPtr\n"));
LPCONSOLE2 pIConsole = GetConsolePtr();
if( ! CHECKPTR(pIConsole,sizeof(IConsole)) )
{
return NULL;
}
LPUNKNOWN pIUnknown = NULL;
HRESULT hr = pIConsole->QueryResultView(&pIUnknown);
if( ! CHECKHRESULT(hr) )
{
return NULL;
}
pIConsole->Release();
return pIUnknown;
}
/////////////////////////////////////////////////////////////////////////////
// MMC Scope Pane Helper Members
/////////////////////////////////////////////////////////////////////////////
CScopePaneItem* CScopePane::GetSelectedScopeItem()
{
TRACEX(_T("CScopePane::GetSelectedScopeItem\n"));
if( ! m_pSelectedScopeItem )
{
TRACE(_T("WARNING : Selected Scope Item is NULL.\n"));
return NULL;
}
if( ! GfxCheckObjPtr(m_pSelectedScopeItem,CScopePaneItem) )
{
TRACE(_T("FAILED : m_pSelectedScopeItem is not valid.\n"));
return NULL;
}
return m_pSelectedScopeItem;
}
void CScopePane::SetSelectedScopeItem(CScopePaneItem* pItem)
{
TRACEX(_T("CScopePane::SetSelectedScopeItem\n"));
TRACEARGn(pItem);
if( ! pItem )
{
m_pSelectedScopeItem = NULL;
return;
}
if( ! GfxCheckObjPtr(pItem,CScopePaneItem) )
{
TRACE(_T("FAILED : pItem pointer is invalid.\n"));
return;
}
m_pSelectedScopeItem = pItem;
}
/////////////////////////////////////////////////////////////////////////////
// Scope Item Icon Management
/////////////////////////////////////////////////////////////////////////////
int CScopePane::AddIcon(UINT nIconResID)
{
TRACEX(_T("CScopePane::AddIcon\n"));
TRACEARGn(nIconResID);
if( ! CHECKPTR(m_pIImageList,sizeof(IImageList)) )
{
return -1;
}
int nIconIndex = GetIconIndex(nIconResID);
if( nIconIndex != -1 )
{
return nIconIndex;
}
// load icon
HICON hIcon = AfxGetApp()->LoadIcon(nIconResID);
if( hIcon == NULL )
{
TRACE(_T("FAILED : Icon with resid=%d not found"),nIconResID);
return -1;
}
nIconIndex = GetIconCount();
// insert icon into image list
#ifndef IA64
if( ! CHECKHRESULT(m_pIImageList->ImageListSetIcon((long*)hIcon, nIconIndex)) )
{
return -1;
}
#endif // IA64
// add resid and index to map
m_IconMap.SetAt(nIconResID,nIconIndex);
// return index of newly inserted image
return nIconIndex;
}
int CScopePane::GetIconIndex(UINT nIconResID)
{
TRACEX(_T("CScopePane::GetIconIndex\n"));
TRACEARGn(nIconResID);
if( ! CHECKPTR(m_pIImageList,sizeof(IImageList)) )
{
return -1;
}
// check map for an existing id
int nIconIndex = -1;
if( m_IconMap.Lookup(nIconResID,nIconIndex) )
{
// if exists, return index
return nIconIndex;
}
TRACE(_T("FAILED : Icon could not be found with Resource id=%d\n"),nIconResID);
return -1;
}
int CScopePane::GetIconCount()
{
TRACEX(_T("CScopePane::GetIconCount\n"));
return (int)m_IconMap.GetCount();
}
void CScopePane::RemoveAllIcons()
{
TRACEX(_T("CScopePane::RemoveAllIcons\n"));
m_IconMap.RemoveAll();
}
/////////////////////////////////////////////////////////////////////////////
// Results Pane Members
/////////////////////////////////////////////////////////////////////////////
int CScopePane::GetResultsPaneCount() const
{
TRACEX(_T("CScopePane::GetResultsPaneCount\n"));
return (int)m_ResultsPanes.GetSize();
}
CResultsPane* CScopePane::GetResultsPane(int iIndex)
{
TRACEX(_T("CScopePane::GetResultsPaneCount\n"));
TRACEARGn(iIndex);
if( iIndex >= m_ResultsPanes.GetSize() || iIndex < 0 )
{
TRACE(_T("FAILED : Requested ResultPane is out of array bounds\n"));
return NULL;
}
CResultsPane* pPane = m_ResultsPanes[iIndex];
if( ! CHECKOBJPTR(pPane,RUNTIME_CLASS(CResultsPane),sizeof(CResultsPane)) )
{
return NULL;
}
return pPane;
}
int CScopePane::AddResultsPane(CResultsPane* pPane)
{
TRACEX(_T("CScopePane::AddResultsPane\n"));
TRACEARGn(pPane);
if( ! CHECKOBJPTR(pPane,RUNTIME_CLASS(CResultsPane),sizeof(CResultsPane)) )
{
TRACE(_T("FAILED : pPane pointer is invalid.\n"));
return -1;
}
pPane->ExternalAddRef();
return (int)m_ResultsPanes.Add(pPane);
}
void CScopePane::RemoveResultsPane(int iIndex)
{
TRACEX(_T("CScopePane::RemoveResultsPane\n"));
TRACEARGn(iIndex);
if( iIndex >= m_ResultsPanes.GetSize() || iIndex < 0 )
{
TRACE(_T("FAILED : Requested ResultPane is out of array bounds\n"));
return;
}
CResultsPane* pPane = m_ResultsPanes[iIndex];
m_ResultsPanes.RemoveAt(iIndex);
pPane->ExternalRelease();
}
/////////////////////////////////////////////////////////////////////////////
// Serialization
/////////////////////////////////////////////////////////////////////////////
bool CScopePane::OnLoad(CArchive& ar)
{
TRACEX(_T("CScopePane::OnLoad\n"));
ASSERT(ar.IsLoading());
return true;
}
bool CScopePane::OnSave(CArchive& ar)
{
TRACEX(_T("CScopePane::OnSave\n"));
ASSERT(ar.IsStoring());
return true;
}
/////////////////////////////////////////////////////////////////////////////
// MMC Help
/////////////////////////////////////////////////////////////////////////////
bool CScopePane::ShowTopic(const CString& sHelpTopic)
{
TRACEX(_T("CScopePane::ShowTopic\n"));
if( sHelpTopic.IsEmpty() )
{
return false;
}
if( ! m_pIConsole )
{
return false;
}
IDisplayHelp* pIDisplayHelp = NULL;
HRESULT hr = m_pIConsole->QueryInterface(IID_IDisplayHelp,(LPVOID*)&pIDisplayHelp);
if( ! CHECKHRESULT(hr) )
{
return false;
}
CString sHTMLHelpTopic = AfxGetApp()->m_pszHelpFilePath;
sHTMLHelpTopic = sHTMLHelpTopic + _T("::") + sHelpTopic;
LPOLESTR lpCompiledHelpTopic = reinterpret_cast<LPOLESTR>(CoTaskMemAlloc((sHTMLHelpTopic.GetLength() + 1)* sizeof(wchar_t)));
if(lpCompiledHelpTopic == NULL)
{
return false;
}
_tcscpy(lpCompiledHelpTopic, (LPCTSTR)sHTMLHelpTopic);
hr = pIDisplayHelp->ShowTopic(lpCompiledHelpTopic);
pIDisplayHelp->Release();
if( ! CHECKHRESULT(hr) )
{
return false;
}
return true;
}
/////////////////////////////////////////////////////////////////////////////
// MFC Operations
/////////////////////////////////////////////////////////////////////////////
void CScopePane::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.
CCmdTarget::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CScopePane, CCmdTarget)
//{{AFX_MSG_MAP(CScopePane)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CScopePane, CCmdTarget)
//{{AFX_DISPATCH_MAP(CScopePane)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
// Note: we add support for IID_IScopePane to support typesafe binding
// from VBA. This IID must match the GUID that is attached to the
// dispinterface in the .ODL file.
// {7D4A6858-9056-11D2-BD45-0000F87A3912}
static const IID IID_IScopePane =
{ 0x7d4a6858, 0x9056, 0x11d2, { 0xbd, 0x45, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12 } };
BEGIN_INTERFACE_MAP(CScopePane, CCmdTarget)
INTERFACE_PART(CScopePane, IID_IScopePane, Dispatch)
INTERFACE_PART(CScopePane, IID_IComponentData, ComponentData)
INTERFACE_PART(CScopePane, IID_IPersistStream, PersistStream)
INTERFACE_PART(CScopePane, IID_IExtendContextMenu, ExtendContextMenu)
INTERFACE_PART(CScopePane, IID_IExtendPropertySheet2, ExtendPropertySheet2)
INTERFACE_PART(CScopePane, IID_ISnapinHelp, SnapinHelp)
END_INTERFACE_MAP()
/////////////////////////////////////////////////////////////////////////////
// IComponentData Interface Part
ULONG FAR EXPORT CScopePane::XComponentData::AddRef()
{
METHOD_PROLOGUE(CScopePane, ComponentData)
return pThis->ExternalAddRef();
}
ULONG FAR EXPORT CScopePane::XComponentData::Release()
{
METHOD_PROLOGUE(CScopePane, ComponentData)
return pThis->ExternalRelease();
}
HRESULT FAR EXPORT CScopePane::XComponentData::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CScopePane, ComponentData)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
HRESULT FAR EXPORT CScopePane::XComponentData::Initialize(
/* [in] */ LPUNKNOWN pUnknown)
{
METHOD_PROLOGUE(CScopePane, ComponentData)
TRACEX(_T("CScopePane::XComponentData::Initialize\n"));
TRACEARGn(pUnknown);
if( ! CHECKPTR(pUnknown,sizeof(IUnknown)) )
{
return E_FAIL;
}
HRESULT hr = S_OK;
// MMC should only call ::Initialize once! But you know those MMC clowns...
ASSERT( pThis->m_pIConsoleNamespace == NULL );
if( pThis->m_pIConsoleNamespace != NULL )
{
TRACE(_T("FAILED : IComponentData::Initialize has already been called. Returning with Error.\n"));
return E_FAIL;
}
// Get pointer to name space interface
hr = pUnknown->QueryInterface(IID_IConsoleNameSpace2, (LPVOID*)(&pThis->m_pIConsoleNamespace));
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("FAILED : pUnknown->QueryInterface for IID_IConsoleNameSpace2 failed.\n"));
return hr;
}
// Get pointer to console interface
hr = pUnknown->QueryInterface(IID_IConsole2, (LPVOID*)(&pThis->m_pIConsole));
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("FAILED : pUnknown->QueryInterface for IID_IConsole2 failed.\n"));
return hr;
}
// Query for the Scope Pane ImageList Interface
pThis->m_pIImageList = NULL;
hr = pThis->m_pIConsole->QueryScopeImageList(&(pThis->m_pIImageList));
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("pUnknown->QueryScopeImageList failed.\n"));
return hr;
}
// Call OnCreate for derived classes. Base class implementation creates a new root scope pane item.
if( ! pThis->OnCreate() )
{
TRACE(_T("FAILED : CScopePane::OnCreate failed.\n"));
return E_FAIL;
}
// Hook the MMC top level window to intercept any window messages of interest
if( ! pThis->HookWindow() )
{
TRACE(_T("FAILED : Unable to hook MMC main window\n"));
return E_FAIL;
}
return hr;
}
HRESULT FAR EXPORT CScopePane::XComponentData::CreateComponent(
/* [out] */ LPCOMPONENT __RPC_FAR *ppComponent)
{
METHOD_PROLOGUE(CScopePane, ComponentData)
TRACEX(_T("CScopePane::XComponentData::CreateComponent\n"));
TRACEARGn(ppComponent);
*ppComponent = pThis->OnCreateComponent();
if( ! CHECKPTR(*ppComponent,sizeof(IComponent)) )
{
TRACE(_T("FAILED : OnCreateComponent returns invalid pointer.\n"));
return E_FAIL;
}
return S_OK;
}
HRESULT FAR EXPORT CScopePane::XComponentData::Notify(
/* [in] */ LPDATAOBJECT lpDataObject,
/* [in] */ MMC_NOTIFY_TYPE event,
/* [in] */ LPARAM arg,
/* [in] */ LPARAM param)
{
METHOD_PROLOGUE(CScopePane, ComponentData)
TRACEX(_T("CScopePane::XComponentData::Notify\n"));
TRACEARGn(lpDataObject);
TRACEARGn(event);
TRACEARGn(arg);
TRACEARGn(param);
HRESULT hr = S_OK;
switch( event )
{
case MMCN_BTN_CLICK: // toolbar button clicked
{
TRACE(_T("MMCN_BTN_CLICK received.\n"));
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(lpDataObject);
if( ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
if( psdo->GetItemType() == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
hr = pItem->OnBtnClick((MMC_CONSOLE_VERB)arg);
}
else if( psdo->GetItemType() == CCT_RESULT )
{
CResultsPaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
CResultsPaneView* pView = pItem->GetOwnerResultsView();
if( ! CHECKOBJPTR(pView,RUNTIME_CLASS(CResultsPaneView),sizeof(CResultsPaneView)) )
{
return E_FAIL;
}
ASSERT(pView);
hr = pView->OnBtnClick(pItem,(MMC_CONSOLE_VERB)arg);
}
}
break;
case MMCN_CONTEXTHELP: // F1, Help Menu Item or Help Button selected
{
TRACE(_T("MMCN_CONTEXTHELP received.\n"));
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(lpDataObject);
if( ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
if( psdo->GetItemType() == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
hr = pItem->OnContextHelp();
}
else if( psdo->GetItemType() == CCT_RESULT )
{
CResultsPaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
CResultsPaneView* pView = pItem->GetOwnerResultsView();
if( ! CHECKOBJPTR(pView,RUNTIME_CLASS(CResultsPaneView),sizeof(CResultsPaneView)) )
{
return E_FAIL;
}
ASSERT(pView);
hr = pView->OnContextHelp(pItem);
}
}
break;
case MMCN_DELETE: // delete selected
{
TRACE(_T("MMCN_DELETE received.\n"));
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(lpDataObject);
if( ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
if( psdo->GetItemType() == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
hr = pItem->OnDelete();
}
else if( psdo->GetItemType() == CCT_RESULT )
{
CResultsPaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
CResultsPaneView* pView = pItem->GetOwnerResultsView();
if( ! CHECKOBJPTR(pView,RUNTIME_CLASS(CResultsPaneView),sizeof(CResultsPaneView)) )
{
return E_FAIL;
}
ASSERT(pView);
hr = pView->OnDelete(pItem);
}
}
break;
case MMCN_EXPAND: // user clicks on a previously unexpanded node
{
TRACE(_T("MMCN_EXPAND received.\n"));
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(lpDataObject);
if( ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
if( psdo->GetItemType() == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
if( pItem == pThis->GetRootScopeItem() )
{
pItem->SetItemHandle((HSCOPEITEM)param);
}
hr = pItem->OnExpand((BOOL)arg);
}
}
break;
case MMCN_PRELOAD:
{
TRACE(_T("MMCN_PRELOAD received.\n"));
TRACE(_T("MMCN_PRELOAD not implemented.\n"));
}
break;
case MMCN_PRINT:
{
TRACE(_T("MMCN_PRINT received.\n"));
TRACE(_T("MMCN_PRINT not implemented.\n"));
}
break;
case MMCN_PROPERTY_CHANGE:
{
TRACE(_T("MMCN_PROPERTY_CHANGE received.\n"));
TRACE(_T("MMCN_PROPERTY_CHANGE not implemented.\n"));
}
break;
case MMCN_REFRESH:
{
TRACE(_T("MMCN_REFRESH received.\n"));
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(lpDataObject);
if( ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
if( psdo->GetItemType() == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
hr = pItem->OnRefresh();
}
else if( psdo->GetItemType() == CCT_RESULT )
{
CResultsPaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
CResultsPaneView* pView = pItem->GetOwnerResultsView();
if( ! CHECKOBJPTR(pView,RUNTIME_CLASS(CResultsPaneView),sizeof(CResultsPaneView)) )
{
return E_FAIL;
}
ASSERT(pView);
hr = pView->OnRefresh();
}
}
break;
case MMCN_REMOVE_CHILDREN:
{
TRACE(_T("MMCN_REMOVE_CHILDREN received.\n"));
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(lpDataObject);
if( ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
if( psdo->GetItemType() == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
hr = pItem->OnRemoveChildren();
}
}
break;
case MMCN_RENAME:
{
TRACE(_T("MMCN_RENAME received.\n"));
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(lpDataObject);
if( ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
if( psdo->GetItemType() == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
CString sNewName = (LPOLESTR)param;
hr = pItem->OnRename(sNewName);
}
}
break;
}
return hr;
}
HRESULT FAR EXPORT CScopePane::XComponentData::Destroy(void)
{
METHOD_PROLOGUE(CScopePane, ComponentData)
TRACEX(_T("CScopePane::XComponentData::Destroy\n"));
if( ! pThis->OnDestroy() )
{
return E_FAIL;
}
return S_OK;
}
HRESULT FAR EXPORT CScopePane::XComponentData::QueryDataObject(
/* [in] */ MMC_COOKIE cookie,
/* [in] */ DATA_OBJECT_TYPES type,
/* [out] */ LPDATAOBJECT __RPC_FAR *ppDataObject)
{
METHOD_PROLOGUE(CScopePane, ComponentData)
TRACEX(_T("CScopePane::XComponentData::QueryDataObject\n"));
TRACEARGn(cookie);
TRACEARGn(type);
TRACEARGn(ppDataObject);
HRESULT hr = S_OK;
CSnapinDataObject* pdoNew = NULL;
pdoNew = new CSnapinDataObject;
if( ! pdoNew )
{
hr = E_OUTOFMEMORY;
*ppDataObject = NULL;
TRACE(_T("Out of memory.\n"));
return hr;
}
*ppDataObject = (LPDATAOBJECT)pdoNew->GetInterface(&IID_IDataObject);
if( ! CHECKOBJPTR(pdoNew,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
if( cookie )
{
CScopePaneItem* pItem = (CScopePaneItem*)cookie;
if( ! CHECKOBJPTR(pItem,RUNTIME_CLASS(CScopePaneItem),sizeof(CScopePaneItem)) )
{
return E_FAIL;
}
pdoNew->SetItem(pItem);
ASSERT(pdoNew->GetItemType() == CCT_SCOPE);
}
else // In this case the node is our root scope item, and was placed there for us by MMC.
{
pdoNew->SetItem( pThis->GetRootScopeItem() );
ASSERT(pdoNew->GetItemType() == CCT_SCOPE);
}
return hr;
}
HRESULT FAR EXPORT CScopePane::XComponentData::GetDisplayInfo(
/* [out][in] */ SCOPEDATAITEM __RPC_FAR *pScopeDataItem)
{
METHOD_PROLOGUE(CScopePane, ComponentData)
TRACEX(_T("CScopePane::XComponentData::GetDisplayInfo\n"));
TRACEARGn(pScopeDataItem);
if( ! CHECKPTR(pScopeDataItem,sizeof(SCOPEDATAITEM)) )
{
return E_FAIL;
}
CScopePaneItem* pItem = NULL;
if( pScopeDataItem->lParam == 0L ) // cookie is NULL for Root Item
{
pItem = pThis->GetRootScopeItem();
}
else
{
pItem = (CScopePaneItem*)pScopeDataItem->lParam;
}
if( ! CHECKOBJPTR(pItem,RUNTIME_CLASS(CScopePaneItem),sizeof(CScopePaneItem)) )
{
return E_FAIL;
}
if( pScopeDataItem->mask & SDI_STR )
{
pScopeDataItem->displayname = (LPTSTR)(LPCTSTR)pItem->GetDisplayName();
}
if( pScopeDataItem->mask & SDI_IMAGE )
{
pScopeDataItem->nImage = pThis->AddIcon(pItem->GetIconId());
}
if( pScopeDataItem->mask & SDI_OPENIMAGE )
{
pScopeDataItem->nOpenImage = pThis->AddIcon(pItem->GetOpenIconId());
}
return S_OK;
}
HRESULT FAR EXPORT CScopePane::XComponentData::CompareObjects(
/* [in] */ LPDATAOBJECT lpDataObjectA,
/* [in] */ LPDATAOBJECT lpDataObjectB)
{
METHOD_PROLOGUE(CScopePane, ComponentData)
TRACEX(_T("CScopePane::XComponentData::CompareObjects\n"));
TRACEARGn(lpDataObjectA);
TRACEARGn(lpDataObjectB);
CSnapinDataObject* psmdo1 = CSnapinDataObject::GetSnapinDataObject(lpDataObjectA);
if( psmdo1 == NULL )
{
return S_FALSE;
}
CSnapinDataObject* psmdo2 = CSnapinDataObject::GetSnapinDataObject(lpDataObjectB);
if( psmdo2 == NULL )
{
return S_FALSE;
}
if( psmdo1->GetCookie() != psmdo2->GetCookie() )
return S_FALSE;
return S_OK;
}
// IComponentData Interface Part
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// IPersistStream Interface Part
ULONG FAR EXPORT CScopePane::XPersistStream::AddRef()
{
METHOD_PROLOGUE(CScopePane, PersistStream)
return pThis->ExternalAddRef();
}
ULONG FAR EXPORT CScopePane::XPersistStream::Release()
{
METHOD_PROLOGUE(CScopePane, PersistStream)
return pThis->ExternalRelease();
}
HRESULT FAR EXPORT CScopePane::XPersistStream::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CScopePane, PersistStream)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
HRESULT FAR EXPORT CScopePane::XPersistStream::GetClassID(
/* [out] */ CLSID __RPC_FAR *pClassID)
{
METHOD_PROLOGUE(CScopePane, PersistStream)
TRACEX(_T("CScopePane::XPersistStream::GetClassID\n"));
TRACEARGn(pClassID);
return E_NOTIMPL;
}
HRESULT FAR EXPORT CScopePane::XPersistStream::IsDirty( void)
{
METHOD_PROLOGUE(CScopePane, PersistStream)
TRACEX(_T("CScopePane::XPersistStream::IsDirty\n"));
return E_NOTIMPL;
}
HRESULT FAR EXPORT CScopePane::XPersistStream::Load(
/* [unique][in] */ IStream __RPC_FAR *pStm)
{
METHOD_PROLOGUE(CScopePane, PersistStream)
TRACEX(_T("CScopePane::XPersistStream::Load\n"));
TRACEARGn(pStm);
COleStreamFile file;
file.Attach(pStm);
CArchive ar(&file,CArchive::load);
bool bResult = pThis->OnLoad(ar);
return bResult ? S_OK : E_FAIL;
}
HRESULT FAR EXPORT CScopePane::XPersistStream::Save(
/* [unique][in] */ IStream __RPC_FAR *pStm,
/* [in] */ BOOL fClearDirty)
{
METHOD_PROLOGUE(CScopePane, PersistStream)
TRACEX(_T("CScopePane::XPersistStream::Save\n"));
TRACEARGn(pStm);
TRACEARGn(fClearDirty);
COleStreamFile file;
file.Attach(pStm);
CArchive ar(&file,CArchive::store);
bool bResult = pThis->OnSave(ar);
return bResult ? S_OK : E_FAIL;
}
HRESULT FAR EXPORT CScopePane::XPersistStream::GetSizeMax(
/* [out] */ ULARGE_INTEGER __RPC_FAR *pcbSize)
{
METHOD_PROLOGUE(CScopePane, PersistStream)
TRACEX(_T("CScopePane::XPersistStream::GetSizeMax\n"));
TRACEARGn(pcbSize);
return E_NOTIMPL;
}
// IPersistStream Interface Part
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// IExtendContextMenu Interface Part
ULONG FAR EXPORT CScopePane::XExtendContextMenu::AddRef()
{
METHOD_PROLOGUE(CScopePane, ExtendContextMenu)
return pThis->ExternalAddRef();
}
ULONG FAR EXPORT CScopePane::XExtendContextMenu::Release()
{
METHOD_PROLOGUE(CScopePane, ExtendContextMenu)
return pThis->ExternalRelease();
}
HRESULT FAR EXPORT CScopePane::XExtendContextMenu::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CScopePane, ExtendContextMenu)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
HRESULT FAR EXPORT CScopePane::XExtendContextMenu::AddMenuItems(
/* [in] */ LPDATAOBJECT piDataObject,
/* [in] */ LPCONTEXTMENUCALLBACK piCallback,
/* [out][in] */ long __RPC_FAR *pInsertionAllowed)
{
METHOD_PROLOGUE(CScopePane, ExtendContextMenu)
TRACEX(_T("CScopePane::XExtendContextMenu::AddMenuItems\n"));
TRACEARGn(piDataObject);
TRACEARGn(piCallback);
TRACEARGn(pInsertionAllowed);
HRESULT hr = S_OK;
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(piDataObject);
if( ! CHECKOBJPTR(psdo, RUNTIME_CLASS(CSnapinDataObject), sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
DATA_OBJECT_TYPES type = psdo->GetItemType();
if( type == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
hr = pItem->OnAddMenuItems(piCallback,pInsertionAllowed);
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("CScopePaneItem::OnAddMenuItems failed!\n"));
}
}
else if( type == CCT_RESULT )
{
CResultsPaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
CResultsPaneView* pView = pItem->GetOwnerResultsView();
if( ! CHECKOBJPTR(pView,RUNTIME_CLASS(CResultsPaneView),sizeof(CResultsPaneView)) )
{
return E_FAIL;
}
hr = pView->OnAddMenuItems(pItem,piCallback,pInsertionAllowed);
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("CResultsPaneView::OnAddMenuItems failed!\n"));
}
}
return hr;
}
HRESULT FAR EXPORT CScopePane::XExtendContextMenu::Command(
/* [in] */ long lCommandID,
/* [in] */ LPDATAOBJECT piDataObject)
{
METHOD_PROLOGUE(CScopePane, ExtendContextMenu)
TRACEX(_T("CScopePane::XExtendContextMenu::Command\n"));
TRACEARGn(lCommandID);
TRACEARGn(piDataObject);
HRESULT hr = S_OK;
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(piDataObject);
if( ! CHECKOBJPTR(psdo, RUNTIME_CLASS(CSnapinDataObject), sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
DATA_OBJECT_TYPES type = psdo->GetItemType();
if( type == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
hr = pItem->OnCommand(lCommandID);
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("CScopePaneItem::OnCommand failed!\n"));
}
}
return hr;
}
// IExtendContextMenu Interface Part
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// IExtendPropertySheet2 Interface Part
ULONG FAR EXPORT CScopePane::XExtendPropertySheet2::AddRef()
{
METHOD_PROLOGUE(CScopePane, ExtendPropertySheet2)
return pThis->ExternalAddRef();
}
ULONG FAR EXPORT CScopePane::XExtendPropertySheet2::Release()
{
METHOD_PROLOGUE(CScopePane, ExtendPropertySheet2)
return pThis->ExternalRelease();
}
HRESULT FAR EXPORT CScopePane::XExtendPropertySheet2::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CScopePane, ExtendPropertySheet2)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
HRESULT FAR EXPORT CScopePane::XExtendPropertySheet2::CreatePropertyPages(
/* [in] */ LPPROPERTYSHEETCALLBACK lpProvider,
/* [in] */ LONG_PTR handle,
/* [in] */ LPDATAOBJECT lpIDataObject)
{
METHOD_PROLOGUE(CScopePane, ExtendPropertySheet2)
TRACEX(_T("CScopePane::XExtendPropertySheet2::CreatePropertyPages\n"));
TRACEARGn(lpProvider);
TRACEARGn(handle);
TRACEARGn(lpIDataObject);
HRESULT hr = S_FALSE;
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(lpIDataObject);
if( ! CHECKOBJPTR(psdo, RUNTIME_CLASS(CSnapinDataObject), sizeof(CSnapinDataObject)) )
{
return E_FAIL;
}
DATA_OBJECT_TYPES type = psdo->GetItemType();
if( type == CCT_SCOPE )
{
CScopePaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
ASSERT_VALID(pItem);
hr = pItem->OnCreatePropertyPages(lpProvider,handle);
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("CScopePaneItem::OnCreatePropertyPages failed!\n"));
}
}
else if( type == CCT_RESULT )
{
CResultsPaneItem* pItem = NULL;
if( ! psdo->GetItem(pItem) )
{
return E_FAIL;
}
ASSERT(pItem);
ASSERT_VALID(pItem);
CResultsPaneView* pView = pItem->GetOwnerResultsView();
if( ! CHECKOBJPTR(pView,RUNTIME_CLASS(CResultsPaneView),sizeof(CResultsPaneView)) )
{
return E_FAIL;
}
hr = pView->OnCreatePropertyPages(pItem,lpProvider,handle);
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("CResultsPaneView::OnCreatePropertyPages failed!\n"));
}
}
return hr;
}
HRESULT FAR EXPORT CScopePane::XExtendPropertySheet2::QueryPagesFor(
/* [in] */ LPDATAOBJECT lpDataObject)
{
METHOD_PROLOGUE(CScopePane, ExtendPropertySheet2)
TRACEX(_T("CScopePane::XExtendPropertySheet2::QueryPagesFor\n"));
TRACEARGn(lpDataObject);
HRESULT hr = S_OK;
return hr;
}
HRESULT FAR EXPORT CScopePane::XExtendPropertySheet2::GetWatermarks(
/* [in] */ LPDATAOBJECT lpIDataObject,
/* [out] */ HBITMAP __RPC_FAR *lphWatermark,
/* [out] */ HBITMAP __RPC_FAR *lphHeader,
/* [out] */ HPALETTE __RPC_FAR *lphPalette,
/* [out] */ BOOL __RPC_FAR *bStretch)
{
METHOD_PROLOGUE(CScopePane, ExtendPropertySheet2)
TRACEX(_T("CScopePane::XExtendPropertySheet2::GetWatermarks\n"));
TRACEARGn(lpIDataObject);
TRACEARGn(lphWatermark);
TRACEARGn(lphHeader);
TRACEARGn(lphPalette);
TRACEARGn(bStretch);
return S_OK;
}
// IExtendPropertySheet2 Interface Part
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// ISnapinHelp Interface Part
ULONG FAR EXPORT CScopePane::XSnapinHelp::AddRef()
{
METHOD_PROLOGUE(CScopePane, SnapinHelp)
return pThis->ExternalAddRef();
}
ULONG FAR EXPORT CScopePane::XSnapinHelp::Release()
{
METHOD_PROLOGUE(CScopePane, SnapinHelp)
return pThis->ExternalRelease();
}
HRESULT FAR EXPORT CScopePane::XSnapinHelp::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CScopePane, SnapinHelp)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
HRESULT FAR EXPORT CScopePane::XSnapinHelp::GetHelpTopic(
/* [out] */ LPOLESTR __RPC_FAR *lpCompiledHelpFile)
{
METHOD_PROLOGUE(CScopePane, SnapinHelp)
TRACEX(_T("CScopePane::XSnapinHelp::GetHelpTopic\n"));
TRACEARGn(lpCompiledHelpFile);
CString sHTMLHelpFilePath = AfxGetApp()->m_pszHelpFilePath;
*lpCompiledHelpFile = reinterpret_cast<LPOLESTR>(CoTaskMemAlloc((sHTMLHelpFilePath.GetLength() + 1)* sizeof(wchar_t)));
if (*lpCompiledHelpFile == NULL)
return E_OUTOFMEMORY;
_tcscpy(*lpCompiledHelpFile, (LPCTSTR)sHTMLHelpFilePath);
return S_OK;
}
// ISnapinHelp Interface Part
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CScopePane message handlers