/* * 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 CComponentDataTemplate : public CComponentData, public CComCoClass< CComponentDataTemplate, pclsid > { typedef CComponentDataTemplate 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 t_ComponentInstance; SC sc = S_OK; t_ComponentInstance *pComponent = NULL; t_ComponentInstance::CreateInstance(&pComponent); pComponent->SetComponentData(this); sc = pComponent->QueryInterface(IID_IComponent, reinterpret_cast(ppComponent)); return sc; } };