234 lines
9.6 KiB
C++
234 lines
9.6 KiB
C++
|
/*
|
||
|
* componentdata.hxx
|
||
|
*
|
||
|
*
|
||
|
* Copyright (c) 1998-1999 Microsoft Corporation
|
||
|
*
|
||
|
* PURPOSE: Defines the CComponentData class
|
||
|
*
|
||
|
*
|
||
|
* OWNER: ptousig
|
||
|
*/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// CComponentData
|
||
|
//
|
||
|
// This is the "document" of a snapin. In the case of a standalone snapin, one
|
||
|
// of these is created for each root added under "Console Root".
|
||
|
// For extension snapins, things are not quite that simple. In fact, there is
|
||
|
// no rule as to when a ComponentData get constructed. MMC may change the
|
||
|
// behavior at any time, so it is best not to make any assumption.
|
||
|
//
|
||
|
// This class is not the direct COM object, CComponentDataTemplate is the
|
||
|
// actual COM object.
|
||
|
//
|
||
|
// $REVIEW (ptousig) For now, this is also the object MMC creates for a
|
||
|
// context menu extension (or property sheet extension).
|
||
|
// Creating a seperate class for these would mess up the
|
||
|
// DECLARE_SNAPIN macros. The advantage of doing this would
|
||
|
// not be worth the effort at this time.
|
||
|
//
|
||
|
class CComponentData : public IComponentData2,
|
||
|
public IExtendContextMenu,
|
||
|
public IExtendPropertySheet,
|
||
|
public IResultDataCompareEx,
|
||
|
public IPersistStreamInit,
|
||
|
public ISnapinHelp,
|
||
|
public CComObjectRoot
|
||
|
{
|
||
|
public:
|
||
|
CComponentData(CBaseSnapin *psnapin);
|
||
|
virtual ~CComponentData(void);
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Accessors
|
||
|
//
|
||
|
inline CBaseSnapin * Psnapin(void) { return m_psnapin;}
|
||
|
inline IResultData * IpResultData(void) { return m_ipResultData;}
|
||
|
inline IConsole * IpConsole(void) { return m_ipConsole;}
|
||
|
inline IConsoleNameSpace * IpConsoleNameSpace(void) { return m_ipConsoleNameSpace;}
|
||
|
inline IPropertySheetProvider *IpPropertySheetProvider(void) { return m_ipPropertySheetProvider;}
|
||
|
inline BOOL FIsRealComponentData(void) { return m_fIsRealComponentData;}
|
||
|
inline CBaseSnapinItem * PitemStandaloneRoot(void) { return m_pitemStandaloneRoot;}
|
||
|
inline void SetPitemStandaloneRoot(CBaseSnapinItem *pitem) { m_pitemStandaloneRoot = pitem;}
|
||
|
|
||
|
//
|
||
|
// Shortcuts
|
||
|
//
|
||
|
CBaseSnapinItem * Pitem(LPDATAOBJECT lpDataObject = NULL, HSCOPEITEM hscopeitem = 0, long cookie = 0);
|
||
|
inline const tstring& StrSnapinClassName(void) { return Psnapin()->StrClassName();}
|
||
|
|
||
|
//
|
||
|
// Other stuff
|
||
|
//
|
||
|
virtual SC ScCreateComponent(LPCOMPONENT * ppComponent) = 0;
|
||
|
virtual SC ScOnDocumentChangeInsertItem(CBaseSnapinItem *pitemNew);
|
||
|
virtual SC ScWasExpandedOnce(CBaseSnapinItem *pitem, BOOL *pfWasExpanded);
|
||
|
virtual SC ScRegister(BOOL fRegister);
|
||
|
static HRESULT WINAPI UpdateRegistry(BOOL fRegister) { return S_OK;} // needed by ATL
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// "Sc" version of IComponentData2 interface
|
||
|
//
|
||
|
virtual SC ScInitialize(LPUNKNOWN pUnknown);
|
||
|
virtual SC ScNotify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param);
|
||
|
virtual SC ScDestroy(void);
|
||
|
virtual SC ScGetDisplayInfo(LPSCOPEDATAITEM pScopeItem);
|
||
|
virtual SC ScQueryDataObject(long cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject);
|
||
|
virtual SC ScQueryDispatch(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDISPATCH* ppDispatch);
|
||
|
|
||
|
//
|
||
|
// "Sc" version of IExtendContextMenu interface
|
||
|
//
|
||
|
virtual SC ScCommand(long nCommandID, LPDATAOBJECT pDataObject);
|
||
|
|
||
|
//
|
||
|
// "Sc" version of IExtendPropertySheet interface
|
||
|
//
|
||
|
virtual SC ScCreatePropertyPages(LPPROPERTYSHEETCALLBACK ipPropertySheetCallback, long handle, LPDATAOBJECT pDataObject);
|
||
|
virtual SC ScQueryPagesFor(LPDATAOBJECT lpDataObject);
|
||
|
|
||
|
//
|
||
|
// "Sc" version of IPersistStreamInit interface
|
||
|
//
|
||
|
virtual SC ScLoad(IStream *pstream);
|
||
|
virtual SC ScSave(IStream *pstream, BOOL fClearDirty);
|
||
|
virtual SC ScIsDirty(void);
|
||
|
|
||
|
//
|
||
|
// Notifications
|
||
|
//
|
||
|
virtual SC ScOnExpand(LPDATAOBJECT lpDataObject, BOOL fExpand, HSCOPEITEM hscopeitem);
|
||
|
virtual SC ScOnExpandSync(LPDATAOBJECT lpDataObject, MMC_EXPANDSYNC_STRUCT *pmes);
|
||
|
virtual SC ScOnRemoveChildren(LPDATAOBJECT lpDataObject, HSCOPEITEM hscopeitem);
|
||
|
virtual SC ScOnDelete(LPDATAOBJECT lpDataObject);
|
||
|
virtual SC ScOnButtonClick(LPDATAOBJECT lpDataObject, MMC_CONSOLE_VERB mcvVerb);
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// IComponentData2 interface
|
||
|
//
|
||
|
STDMETHOD(CompareObjects) (LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
|
||
|
STDMETHOD(GetDisplayInfo) (LPSCOPEDATAITEM pItem);
|
||
|
STDMETHOD(QueryDataObject) (long cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT * ppDataObject);
|
||
|
STDMETHOD(Notify) (LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param);
|
||
|
STDMETHOD(CreateComponent) (LPCOMPONENT * ppComponent);
|
||
|
STDMETHOD(Initialize) (LPUNKNOWN pUnknown);
|
||
|
STDMETHOD(Destroy) (void);
|
||
|
STDMETHOD(QueryDispatch) (MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDISPATCH* ppDispatch);
|
||
|
|
||
|
//
|
||
|
// IExtendContextMenu interface
|
||
|
//
|
||
|
STDMETHOD(AddMenuItems) (LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK ipContextMenuCallback, long *pInsertionAllowed);
|
||
|
STDMETHOD(Command) (long nCommandID, LPDATAOBJECT pDataObject);
|
||
|
|
||
|
//
|
||
|
// IExtendPropertySheet interface
|
||
|
//
|
||
|
STDMETHOD(CreatePropertyPages) (LPPROPERTYSHEETCALLBACK lpProvider, long handle, LPDATAOBJECT lpDataObject);
|
||
|
STDMETHOD(QueryPagesFor) (LPDATAOBJECT lpDataObject);
|
||
|
|
||
|
//
|
||
|
// IResultDataCompareEx interface
|
||
|
//
|
||
|
STDMETHOD(Compare) (RDCOMPARE * prdc, int * pnResult);
|
||
|
|
||
|
//
|
||
|
// IPersistStreamInit interface
|
||
|
//
|
||
|
STDMETHOD(GetClassID) (CLSID *pclsid);
|
||
|
STDMETHOD(IsDirty) (void);
|
||
|
STDMETHOD(Load) (IStream *pstream);
|
||
|
STDMETHOD(Save) (IStream *pstream, BOOL fClearDirty);
|
||
|
STDMETHOD(GetSizeMax) (ULARGE_INTEGER *pcbSize);
|
||
|
STDMETHOD(InitNew) (void);
|
||
|
|
||
|
//
|
||
|
// ISnapinHelp interface
|
||
|
//
|
||
|
STDMETHOD(GetHelpTopic) (LPOLESTR *lpCompiledHelpFile);
|
||
|
|
||
|
private:
|
||
|
CBaseSnapin * m_psnapin;
|
||
|
|
||
|
// The component data keep track of their own standalone
|
||
|
// root item.
|
||
|
CBaseSnapinItem * m_pitemStandaloneRoot;
|
||
|
|
||
|
// This will be set to FALSE until IComponentData::Initialize
|
||
|
// is called. Context menu extensions will always be FALSE.
|
||
|
BOOL m_fIsRealComponentData;
|
||
|
|
||
|
// Interface pointers
|
||
|
IConsolePtr m_ipConsole;
|
||
|
IConsoleNameSpacePtr m_ipConsoleNameSpace;
|
||
|
IPropertySheetProviderPtr m_ipPropertySheetProvider;
|
||
|
IResultDataPtr m_ipResultData;
|
||
|
};
|
||
|
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// CComponentDataTemplate
|
||
|
//
|
||
|
// This template class is used to make the link between the ComponentData and
|
||
|
// the CBaseSnapin.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// TSnapin The CBaseSnapin-derived class.
|
||
|
// TComponent The CComponent-derived class.
|
||
|
// pclsid Needed by CComCoClass
|
||
|
//
|
||
|
// The TComponent parameter will always be CComponent at the moment. In the
|
||
|
// future, individual snapins might provide their own CComponent-derived classes.
|
||
|
//
|
||
|
template <class TSnapin, class TComponent, const CLSID* pclsid>
|
||
|
class CComponentDataTemplate : public CComponentData,
|
||
|
public CComCoClass< CComponentDataTemplate<TSnapin, TComponent, pclsid>, pclsid >
|
||
|
{
|
||
|
typedef CComponentDataTemplate<TSnapin, TComponent, pclsid> t_self;
|
||
|
|
||
|
BEGIN_COM_MAP(t_self)
|
||
|
COM_INTERFACE_ENTRY(IComponentData)
|
||
|
COM_INTERFACE_ENTRY(IComponentData2)
|
||
|
COM_INTERFACE_ENTRY(IExtendContextMenu)
|
||
|
COM_INTERFACE_ENTRY(IExtendPropertySheet)
|
||
|
COM_INTERFACE_ENTRY(IResultDataCompareEx)
|
||
|
COM_INTERFACE_ENTRY(IPersistStreamInit)
|
||
|
COM_INTERFACE_ENTRY(ISnapinHelp)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
DECLARE_NOT_AGGREGATABLE(t_self);
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Construct the base class with the CBaseSnapin * stored in the static
|
||
|
// variable s_snapin of the individual snapin.
|
||
|
//
|
||
|
CComponentDataTemplate(void) : CComponentData(&TSnapin::s_snapin)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// This is where we create new instances of CComponent.
|
||
|
//
|
||
|
virtual SC ScCreateComponent(LPCOMPONENT *ppComponent)
|
||
|
{
|
||
|
typedef CComObject<TComponent> t_ComponentInstance;
|
||
|
SC sc = S_OK;
|
||
|
t_ComponentInstance *pComponent = NULL;
|
||
|
t_ComponentInstance::CreateInstance(&pComponent);
|
||
|
pComponent->SetComponentData(this);
|
||
|
sc = pComponent->QueryInterface(IID_IComponent, reinterpret_cast<void**>(ppComponent));
|
||
|
return sc;
|
||
|
}
|
||
|
};
|