Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

233 lines
9.6 KiB

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