windows-nt/Source/XPSP1/NT/enduser/troubleshoot/msinfo/compdata.h
2020-09-26 16:20:57 +08:00

305 lines
10 KiB
C++

// CompData.h : ComponentData Implementation classes.
//
// Copyright (c) 1998-1999 Microsoft Corporation
#pragma once
#define MSINFO_COMPDATA_H
#include "StdAfx.h"
#include <atlcom.h>
#ifndef IDS_DESCRIPTION
#include "Resource.h"
#endif // IDS_DESCRIPTION
// This hack is required because we may be building in an environment
// which doesn't have a late enough version of rpcndr.h
#if __RPCNDR_H_VERSION__ < 440
#define __RPCNDR_H_VERSION__ 440
#define MIDL_INTERFACE(x) interface
#endif
#ifndef __mmc_h__
#include <mmc.h> // ..\..\..\public\sdk\inc
#endif // __mmc_h__
#include "DataObj.h"
#include "DataSrc.h"
#include "ScopeMap.h"
#include "SysInfo.h"
#include "chooser.h"
#include "Dialogs.h"
#ifndef IDS_SNAPIN_DESC
#define IDS_SNAPIN_DESC IDS_DESCRIPTION
#endif // IDS_SNAPIN_DESC
#ifndef IDS_EXTENSION_DESC
#define IDS_EXTENSION_DESC IDS_DESCRIPTION
#endif // IDS_EXTENSION_DESC
/*
* CSystemInfoScope - the class interface to the Microsoft Management
* Console namespace items of the MSInfo Snap-in.
*/
class CSystemInfoScope:
public IComponentData,
public IExtendContextMenu,
public IExtendPropertySheet,
public IPersistStream,
public ISnapinHelp,
public CComObjectRoot
{
BEGIN_COM_MAP(CSystemInfoScope)
COM_INTERFACE_ENTRY(IComponentData)
COM_INTERFACE_ENTRY(IExtendContextMenu)
COM_INTERFACE_ENTRY(IExtendPropertySheet)
COM_INTERFACE_ENTRY(IPersistStream)
COM_INTERFACE_ENTRY(ISnapinHelp)
END_COM_MAP()
friend class CDataObject;
friend class CCabTool;
friend HRESULT CSystemInfo::OnDoubleClick(LPDATAOBJECT);
friend HRESULT CSystemInfo::OnRefresh(LPDATAOBJECT);
friend STDMETHODIMP CSystemInfo::GetDisplayInfo(LPRESULTDATAITEM);
friend STDMETHODIMP CSystemInfo::Notify(LPDATAOBJECT pDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param);
friend void CSystemInfo::SetInitialVerbState(BOOL);
friend HRESULT CSystemInfo::OnPropertyChange(LPDATAOBJECT);
friend void CSystemInfo::SetRefreshing(LPARAM lparamMessage);
// Constructors and destructors.
public:
CSystemInfoScope();
~CSystemInfoScope();
public:
virtual const CLSID &GetCoClassID() = 0;
virtual const BOOL IsPrimaryImpl() = 0;
// IComponentData interface members
public:
STDMETHOD(Initialize)(LPUNKNOWN pUnknown);
STDMETHOD(CreateComponent)(LPCOMPONENT *ppComponent);
STDMETHOD(Destroy)();
STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param);
STDMETHOD(QueryDataObject)(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT *ppDataObject);
STDMETHOD(GetDisplayInfo)(SCOPEDATAITEM *pScopeDataItem);
STDMETHOD(CompareObjects)(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
// IExtendContextMenu interface members
public:
STDMETHOD(AddMenuItems)(LPDATAOBJECT lpDataObject, LPCONTEXTMENUCALLBACK pCallback,
long *pInsertionAllowed);
STDMETHOD(Command)(long lCommandID, LPDATAOBJECT lpDataObject);
// IExtendPropertySheet interface members
public:
STDMETHOD(CreatePropertyPages)(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle,
LPDATAOBJECT lpDataObject);
STDMETHOD(QueryPagesFor)(LPDATAOBJECT lpDataObject);
// IPersistStream interface members
public:
STDMETHOD(GetClassID)(CLSID *pClassID);
STDMETHOD(IsDirty)();
STDMETHOD(Load)(IStream *pReadStream);
STDMETHOD(Save)(IStream *pWriteStream, BOOL fClearDirty = TRUE);
STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize);
// ISnapinHelp interface member
public:
STDMETHOD(GetHelpTopic)(LPOLESTR __RPC_FAR *lpCompiledHelpFile);
public:
void SaveReport();
void SaveFile();
void PrintReport();
void DoFind();
void OpenFile();
void CloseFile();
void SetSelectedFolder(CFolder *pFolder);
BOOL SelectItem(const CString &szPath, int iLine = 0);
void SetView(enum DataComplexity, BOOL fViewInitialized = TRUE);
MMC_COOKIE RootCookie() { return m_RootCookie; }
void WaitForRefresh();
BOOL InRefresh();
void RefreshAsync(CFolder * pFolder, CSystemInfo * pSystemInfo, BOOL fSoftRefresh = TRUE);
// Persistance debug instance variables
private:
bool m_bInitializedCD;
#ifdef _DEBUG
bool m_bLoadedCD;
bool m_bDestroyedCD;
#endif // _DEBUG
public:
enum CommandID { IDM_SAVEREPORT, IDM_SAVEFILE, IDM_FIND, IDM_PRINT, IDM_TASK_OPENFILE, IDM_TASK_CLOSE,
IDM_TASK_FIND, IDM_TASK_SAVEREPORT, IDM_TASK_SAVEFILE, IDM_TASK_PRINT, IDM_TASK_VIEWCAB, IDM_VIEW_ADVANCED, IDM_VIEW_BASIC };
// Private helper functions
private:
// AddToTopMenu is a convenience wrapper for AddToMenu
HRESULT AddToTopMenu(LPCONTEXTMENUCALLBACK lpCallback, long lNameResource, long lStatusResource, long lCommandID)
{
return AddToMenu(lpCallback, lNameResource, lStatusResource, lCommandID,
CCM_INSERTIONPOINTID_PRIMARY_TOP, 0L);
}
// AddToTaskMenu is a convenience wrapper for AddToMenu
HRESULT AddToTaskMenu(LPCONTEXTMENUCALLBACK lpCallback, long lNameResource,
long lStatusResource, long lCommandID)
{
return AddToMenu(lpCallback, lNameResource, lStatusResource, lCommandID,
CCM_INSERTIONPOINTID_PRIMARY_TASK, 0L);
}
// AddToViewMenu is a convenience wrapper for AddToMenu
HRESULT AddToViewMenu(LPCONTEXTMENUCALLBACK lpCallback, long lNameResource,
long lStatusResource, long lCommandID, long fFlags)
{
return AddToMenu(lpCallback, lNameResource, lStatusResource, lCommandID,
CCM_INSERTIONPOINTID_PRIMARY_VIEW, fFlags);
}
HRESULT AddToMenu(LPCONTEXTMENUCALLBACK lpCallback, long lNameResource,
long lStatusResource, long lCommandID, long lInsertionPoint, long fFlags);
HRESULT AddToolbarButtons(LPTOOLBAR pToolbar);
HRESULT RefreshNameSpace();
HRESULT AddSubMenu(CMenu *pMenu, void *pContext);
HRESULT AddRoot(HSCOPEITEM hsiRoot, CFolder **ppFolder);
HRESULT AddExtensionRoot(HSCOPEITEM &hsiNode, CFolder **ppFolder);
HRESULT ScopeEnumerate(HSCOPEITEM hsiNode, CFolder *pFolder);
HRESULT InitializeDialogs();
HRESULT InitializeInternal();
void DestroyInternal();
HRESULT ProcessCommandLine();
HRESULT MessageBox( CString lpszText);
// We can't initialize in the Initialize function, so the real initialization
// happens here.
HRESULT InitializeSource();
HRESULT InitializeView();
BOOL SetMachine(const CString &strMachine);
HRESULT PreUIInit();
void PostUIInit();
// Member access function
public:
CFolder *pRootCategory() const { return pSource() ? pSource()->GetRootNode() : NULL; }
void CloseFindWindow();
void ExecuteFind(long lFindState);
void Refresh(CFolder *pfSelected = NULL, CSystemInfo * pSystemInfo = NULL);
void StopFind();
LPCTSTR MachineName() const;
void DisplayGatherError(DWORD dwError, LPCTSTR szMachineName = NULL);
// Member access functions.
private:
LPCONSOLENAMESPACE pScope() const { return m_pScope; }
LPCONSOLE pConsole() const { return m_pConsole; }
CDataSource *pSource() const { return m_pSource; }
void SetSource(CDataSource *pNewSource, BOOL fPreLaunch = FALSE);
// Notify handler declarations
private:
// We will probably never implement these methods.
HRESULT OnRemoveChildren(long arg);
HRESULT OnExpand(LPDATAOBJECT lpDataObject, LPARAM fExpand, HSCOPEITEM hsiNode);
HRESULT OnProperties(LPARAM param);
// Member access functions
private:
void SetDirty(BOOL b = TRUE) { m_bIsDirty = b; }
void ClearDirty() { SetDirty(FALSE); }
BOOL ObjectIsDirty() { return m_bIsDirty; }
// Internal data.
private:
LPCONSOLENAMESPACE m_pScope;
LPCONSOLE m_pConsole;
BOOL m_fViewUninitialized;
CDataSource *m_pSource;
CMSInfoReportDialog *m_prdReport;
CMSInfoSaveDialog *m_prdSave;
CMSInfoOpenDialog *m_prdOpen;
long m_BasicFlags;
long m_AdvancedFlags;
CWnd *m_pwConsole;
CFindThread *m_pthdFind;
HWND m_hwndFind;
MMC_COOKIE m_RootCookie;
CFolder *m_pfLast;
CString *m_pstrCategory;
BOOL m_fSelectCategory;
CString m_strDeferredLoad;
CString m_strDeferredCategories;
CString m_strDeferredMachine;
BOOL m_fInternalDelete;
// Save a pointer to the last system info object created - this can be used
// to update that status bar when a global refresh is happening.
CSystemInfo * m_pLastSystemInfo;
// As a work around for the problem we're having when compmgmt redirects us,
// we need a variable to save the IUnknown pointer to the console. When we
// get an MMCN_REMOVE_CHILDREN notification, we will set this variable, then
// uninitialize as if we were being unloaded. The next time we get an
// MMCN_EXPAND message, we'll reinitialize as if we were starting up.
LPUNKNOWN m_pSaveUnknown;
// These variables are used to avoid calling SetSource twice on
// initialization with the same parameters.
CDataSource * m_pSetSourceSource;
BOOL m_fSetSourcePreLaunch;
// Memory leak problems associated with no call to CSystemInfoScope
// destructor require these to be pointers.
CString *m_pstrMachineName;
CString *m_pstrOverrideName;
CString m_strLastMachineName; // in case the new one is bad
private:
// Memory lead problems (see above)
CScopeItemMap *m_pmapCategories;
BOOL m_bIsDirty;
CCabTool *m_pViewCABTool; // tool for viewing CAB contents
};
/*
* CComponentDataPrimaryImpl - The subclass of the main user interface used as
* the stand-alone portion of MSInfo.
*/
class CSystemInfoScopePrimary : public CSystemInfoScope,
public CComCoClass<CSystemInfoScopePrimary, &CLSID_MSInfo>
{
public:
CSystemInfoScopePrimary() { }
~CSystemInfoScopePrimary() { }
DECLARE_REGISTRY(CSnapin, _T("MSInfo.Snapin.1"), _T("MSInfo.Snapin"), IDS_SNAPIN_DESC, THREADFLAGS_APARTMENT)
virtual const CLSID &GetCoClassID() { return CLSID_MSInfo; }
virtual const BOOL IsPrimaryImpl() { return TRUE; }
};
/*
* CComponentDataExtensionImpl - The subclass of the main user interface used as
* the extension portion of MSInfo.
*/
class CSystemInfoScopeExtension : public CSystemInfoScope,
public CComCoClass<CSystemInfoScopeExtension, &CLSID_Extension>
{
public:
CSystemInfoScopeExtension() { }
~CSystemInfoScopeExtension() { }
DECLARE_REGISTRY(CSnapin, _T("MSInfo.Extension.1"), _T("MSInfo.Extension"), IDS_EXTENSION_DESC, THREADFLAGS_APARTMENT)
virtual const CLSID &GetCoClassID() { return CLSID_Extension; }
virtual const BOOL IsPrimaryImpl() { return FALSE; }
};