/*--------------------------------------------------------------------------* * * Microsoft Windows * Copyright (C) Microsoft Corporation, 1999 - 1999 * * File: fldrsnap.h * * Contents: Header file for built-in snapins that implement * the Folder, ActiveX Control, and Web Link nodes. * These replace earlier code that had special "built-in" * nodetypes. * * History: 23-Jul-98 vivekj Created * *--------------------------------------------------------------------------*/ #ifndef __FOLDERSNAPIN_H_ #define __FOLDERSNAPIN_H_ extern const CLSID CLSID_FolderSnapin; extern const CLSID CLSID_OCXSnapin; extern const CLSID CLSID_HTMLSnapin; extern LPCTSTR szClsid_FolderSnapin; extern LPCTSTR szClsid_HTMLSnapin; extern LPCTSTR szClsid_OCXSnapin; // forward decls class CHTMLPage1; class CHTMLPage2; class CActiveXPage0; class CActiveXPage1; class CActiveXPage2; HRESULT WINAPI IPersistStreamFunc(void* pv, REFIID riid, LPVOID* ppv, DWORD dw); SC ScFormatIndirectSnapInName ( HINSTANCE hInst, /* I:module containing the resource */ int idNameString, /* I:ID of name's string resource */ CStr& strName); /* O:formatted indirect name string */ /*+-------------------------------------------------------------------------* * Class: CSnapinDescriptor * * PURPOSE: A class that contains information to be filled in by * derived snap-ins. * *+-------------------------------------------------------------------------*/ class CSnapinDescriptor { private: UINT m_idsName; UINT m_idsDescription; UINT m_idbSmallImage; UINT m_idbSmallImageOpen; UINT m_idbLargeImage; long m_viewOptions; // for GetResultViewType UINT m_idiSnapinImage; // the icon used by ISnapinAbout public: const CLSID & m_clsidSnapin; // the snapin class ID const LPCTSTR m_szClsidSnapin; const GUID & m_guidNodetype; // root node type const LPCTSTR m_szGuidNodetype; const LPCTSTR m_szClassName; const LPCTSTR m_szProgID; const LPCTSTR m_szVersionIndependentProgID; public: CSnapinDescriptor(); CSnapinDescriptor(UINT idsName, UINT idsDescription, UINT idiSnapinImage, UINT idbSmallImage, UINT idbSmallImageOpen, UINT idbLargeImage, const CLSID &clsidSnapin, LPCTSTR szClsidSnapin, const GUID &guidNodetype, LPCTSTR szGuidNodetype, LPCTSTR szClassName, LPCTSTR szProgID, LPCTSTR szVersionIndependentProgID, long viewOptions); void GetName(CStr &str); void GetRegisteredDefaultName(CStr &str); void GetRegisteredIndirectName(CStr &str); UINT GetDescription() {return m_idsDescription;} HBITMAP GetSmallImage(); HBITMAP GetSmallImageOpen(); HBITMAP GetLargeImage(); long GetViewOptions(); HICON GetSnapinImage(); }; /*+-------------------------------------------------------------------------* * class CSnapinComponentDataImpl * * * PURPOSE: Implements IComponentData for the built-in snapins. * *+-------------------------------------------------------------------------*/ class CSnapinComponentDataImpl : public IComponentData, public CComObjectRoot, public ISnapinAbout, public ISnapinHelp, public IPersistStream, public IExtendPropertySheet2, public CSerialObjectRW { friend class CSnapinComponentImpl; public: CSnapinComponentDataImpl(); virtual CSnapinDescriptor& GetDescriptor() = 0; // IComponentData STDMETHODIMP Initialize(LPUNKNOWN pUnknown); STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); STDMETHODIMP Destroy(); STDMETHODIMP QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject); STDMETHODIMP GetDisplayInfo( SCOPEDATAITEM* pScopeDataItem); STDMETHODIMP CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB); // IPersistStream STDMETHODIMP GetClassID(CLSID *pClassID); STDMETHODIMP IsDirty(void); STDMETHODIMP Load(LPSTREAM pStm); STDMETHODIMP Save(LPSTREAM pStm , BOOL fClearDirty); STDMETHODIMP GetSizeMax(ULARGE_INTEGER* pcbSize ); // ISnapinHelp STDMETHODIMP GetHelpTopic (LPOLESTR* ppszCompiledHelpFile); // IExtendPropertySheet2 STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject) = 0; STDMETHODIMP GetWatermarks(LPDATAOBJECT lpIDataObject, HBITMAP * lphWatermark, HBITMAP * lphHeader, HPALETTE * lphPalette, BOOL* bStretch); STDMETHODIMP QueryPagesFor(LPDATAOBJECT lpDataObject); // override virtual UINT GetHeaderBitmap() {return 0;} virtual UINT GetWatermark() {return 0;} // CSerialObject methods virtual UINT GetVersion() {return 1;} virtual HRESULT ReadSerialObject (IStream &stm, UINT nVersion); virtual HRESULT WriteSerialObject(IStream &stm); protected: HRESULT OnPreload(HSCOPEITEM scopeItem); private: // attributes - not persisted IConsole2Ptr m_spConsole2; IConsoleNameSpace2Ptr m_spConsoleNameSpace2; bool m_bDirty; protected: UINT m_iImage; UINT m_iOpenImage; void SetDirty(BOOL bState = TRUE) { m_bDirty = bState; } private: // attributes - persisted CStringTableString m_strName; // the name of the root node, which is the only node created by the snapin CStringTableString m_strView; // the view displayed by the node. public: void SetName(LPCTSTR sz); LPCTSTR GetName() {return m_strName.data();} void SetView(LPCTSTR sz); LPCTSTR GetView() {return m_strView.data();} }; /*+-------------------------------------------------------------------------* * class CSnapinComponentImpl * * * PURPOSE: Implements IComponent for the built-in snapins. * *+-------------------------------------------------------------------------*/ class CSnapinComponentImpl : public CComObjectRoot, public IComponent { public: BEGIN_COM_MAP(CSnapinComponentImpl) COM_INTERFACE_ENTRY(IComponent) END_COM_MAP() void Init(IComponentData *pComponentData); // IComponent STDMETHODIMP Initialize(LPCONSOLE lpConsole); STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); STDMETHODIMP Destroy(MMC_COOKIE cookie); STDMETHODIMP QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject); STDMETHODIMP GetResultViewType(MMC_COOKIE cookie, LPOLESTR* ppViewType, long* pViewOptions); STDMETHODIMP GetDisplayInfo( RESULTDATAITEM* pResultDataItem); STDMETHODIMP CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB); protected: CSnapinComponentDataImpl * GetComponentData(); protected: virtual SC ScOnSelect(BOOL bScope, BOOL bSelect); protected: // attributes - not persisted IConsole2Ptr m_spConsole2; IComponentDataPtr m_spComponentData; }; /*+-------------------------------------------------------------------------* * class CSnapinDataObject * * * PURPOSE: Implements IDataObject for the built-in snapins. * *+-------------------------------------------------------------------------*/ class CSnapinDataObject : public CComObjectRoot, public IDataObject { public: BEGIN_COM_MAP(CSnapinDataObject) COM_INTERFACE_ENTRY(IDataObject) END_COM_MAP() CSnapinDataObject(); // IDataObject STDMETHODIMP GetDataHere(FORMATETC *pformatetc, STGMEDIUM *pmedium); private: STDMETHODIMP GetData(LPFORMATETC lpFormatetcIn, LPSTGMEDIUM lpMedium){ return E_NOTIMPL; }; STDMETHODIMP EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC* ppEnumFormatEtc){ return E_NOTIMPL; }; STDMETHODIMP QueryGetData(LPFORMATETC lpFormatetc) { return E_NOTIMPL; }; STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC lpFormatetcIn, LPFORMATETC lpFormatetcOut){ return E_NOTIMPL; }; STDMETHODIMP SetData(LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium, BOOL bRelease){ return E_NOTIMPL; }; STDMETHODIMP DAdvise(LPFORMATETC lpFormatetc, DWORD advf, LPADVISESINK pAdvSink, LPDWORD pdwConnection){ return E_NOTIMPL; }; STDMETHODIMP DUnadvise(DWORD dwConnection){ return E_NOTIMPL; }; STDMETHODIMP EnumDAdvise(LPENUMSTATDATA* ppEnumAdvise){ return E_NOTIMPL; }; HRESULT WriteString(IStream *pStream, LPCOLESTR sz); public: void Initialize(IComponentData *pComponentData, DATA_OBJECT_TYPES type); DATA_OBJECT_TYPES GetType() const {return m_type;} private: bool m_bInitialized; IComponentDataPtr m_spComponentData; // back pointer to the parent. DATA_OBJECT_TYPES m_type; // Clipboard formats that are required by the console static void RegisterClipboardFormats(); static UINT s_cfNodeType; static UINT s_cfNodeTypeString; static UINT s_cfDisplayName; static UINT s_cfCoClass; static UINT s_cfSnapinPreloads; }; SC ScLoadAndAllocateString(UINT ids, LPOLESTR *lpstrOut); /*+-------------------------------------------------------------------------* * class CSnapinWrapper * * * PURPOSE: A template class, used to instantiate the snapin. * *+-------------------------------------------------------------------------*/ template class CSnapinWrapper : public CSnapin, public CComCoClass { typedef CSnapinWrapper ThisClass; BEGIN_COM_MAP(ThisClass) COM_INTERFACE_ENTRY(IComponentData) COM_INTERFACE_ENTRY(ISnapinAbout) COM_INTERFACE_ENTRY(ISnapinHelp) COM_INTERFACE_ENTRY(IPersistStream) COM_INTERFACE_ENTRY(IExtendPropertySheet2) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(ThisClass) // registry static HRESULT WINAPI UpdateRegistry(BOOL bRegister) { USES_CONVERSION; CStr strName; GetSnapinDescriptor().GetRegisteredDefaultName (strName); CStr strIndirectName; GetSnapinDescriptor().GetRegisteredIndirectName (strIndirectName); _ATL_REGMAP_ENTRY rgEntries[] = { { L"VSnapinClsid", T2COLE( GetSnapinDescriptor().m_szClsidSnapin)}, { L"VNodetype", T2COLE( GetSnapinDescriptor().m_szGuidNodetype)}, { L"VSnapinName", T2COLE((LPCTSTR) strName)}, { L"VSnapinNameIndirect", T2COLE((LPCTSTR) strIndirectName)}, { L"VClassName", T2COLE( GetSnapinDescriptor().m_szClassName)}, { L"VProgID", T2COLE( GetSnapinDescriptor().m_szProgID)}, { L"VVersionIndependentProgID", T2COLE( GetSnapinDescriptor().m_szVersionIndependentProgID)}, { L"VFileName", T2COLE( g_szMmcndmgrDll)}, {NULL, NULL} }; return _Module.UpdateRegistryFromResource(IDR_FOLDERSNAPIN, bRegister, rgEntries); } STDMETHODIMP GetSnapinDescription(LPOLESTR* lpDescription) { DECLARE_SC(sc, TEXT("CSnapinWrapper::GetSnapinDescription")); sc = ScLoadAndAllocateString(GetSnapinDescriptor().GetDescription(), lpDescription); return sc.ToHr(); } STDMETHODIMP GetProvider(LPOLESTR* lpDescription) { DECLARE_SC(sc, TEXT("CSnapinWrapper::GetProvider")); sc = ScLoadAndAllocateString(IDS_BUILTIN_SNAPIN_PROVIDER, lpDescription); return sc.ToHr(); } STDMETHODIMP GetSnapinVersion(LPOLESTR* lpDescription) { return E_NOTIMPL; } STDMETHODIMP GetSnapinImage(HICON* hAppIcon) { DECLARE_SC (sc, TEXT("CSnapinWrapper::GetSnapinImage")); sc = ScCheckPointers(hAppIcon); if(sc) return sc.ToHr(); *hAppIcon = GetDescriptor().GetSnapinImage(); return sc.ToHr(); } STDMETHODIMP GetStaticFolderImage(HBITMAP* hSmallImage, HBITMAP* hSmallImageOpen, HBITMAP* hLargeImage, COLORREF* cMask) { DECLARE_SC (sc, TEXT("CSnapinWrapper::GetStaticFolderImage")); sc = ScCheckPointers(hSmallImage, hSmallImageOpen, hLargeImage, cMask); if(sc) return sc.ToHr(); *hSmallImage = GetDescriptor().GetSmallImage(); *hSmallImageOpen = GetDescriptor().GetSmallImageOpen(); *hLargeImage = GetDescriptor().GetLargeImage(); *cMask = RGB(255, 0, 255); return sc.ToHr(); } virtual CSnapinDescriptor& GetDescriptor() { return GetSnapinDescriptor(); } CSnapinWrapper() { CStr strName; GetDescriptor().GetName(strName); SetName(strName); } }; //____________________________________________________________________________ // // Class: CFolderSnapinData // // PURPOSE: //____________________________________________________________________________ // class CFolderSnapinData : public CSnapinComponentDataImpl { typedef CSnapinComponentDataImpl BC; public: CFolderSnapinData(); // IComponentData STDMETHODIMP CreateComponent(LPCOMPONENT* ppComponent); // IExtendPropertySheet2 STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject); void SetDirty(BOOL bState = TRUE) { BC::SetDirty(bState); } static CSnapinDescriptor& GetSnapinDescriptor(); }; typedef CSnapinWrapper CFolderSnapin; //____________________________________________________________________________ // // Class: CFolderSnapinComponent // // PURPOSE: //____________________________________________________________________________ // class CFolderSnapinComponent : public CSnapinComponentImpl { }; //____________________________________________________________________________ // // Class: CHTMLSnapinData // // PURPOSE: //____________________________________________________________________________ // class CHTMLSnapinData : public CSnapinComponentDataImpl { typedef CSnapinComponentDataImpl BC; public: CHTMLSnapinData(); ~CHTMLSnapinData(); // IComponentData STDMETHODIMP CreateComponent(LPCOMPONENT* ppComponent); STDMETHODIMP Destroy(); // IExtendPropertySheet2 STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject); virtual UINT GetWatermark() {return IDB_SETUPWIZARD1;} static CSnapinDescriptor& GetSnapinDescriptor(); private: CHTMLPage1 *m_pHtmlPage1; CHTMLPage2 *m_pHtmlPage2; }; typedef CSnapinWrapper CHTMLSnapin; //____________________________________________________________________________ // // Class: CHTMLSnapinComponent // // PURPOSE: //____________________________________________________________________________ // class CHTMLSnapinComponent : public CSnapinComponentImpl { typedef CSnapinComponentImpl BC; public: virtual SC ScOnSelect(BOOL bScope, BOOL bSelect); STDMETHODIMP GetResultViewType(MMC_COOKIE cookie, LPOLESTR* ppViewType, long* pViewOptions); }; //____________________________________________________________________________ // // Class: COCXSnapinData // // PURPOSE: //____________________________________________________________________________ // class COCXSnapinData : public CSnapinComponentDataImpl { typedef CSnapinComponentDataImpl BC; public: COCXSnapinData(); ~COCXSnapinData(); // IComponentData STDMETHODIMP CreateComponent(LPCOMPONENT* ppComponent); STDMETHODIMP Destroy(); // IExtendPropertySheet2 STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject); virtual UINT GetHeaderBitmap() {return IDB_OCX_WIZARD_HEADER;} virtual UINT GetWatermark() {return IDB_SETUPWIZARD;} static CSnapinDescriptor& GetSnapinDescriptor(); private: CActiveXPage0* m_pActiveXPage0; CActiveXPage1* m_pActiveXPage1; CActiveXPage2* m_pActiveXPage2; }; typedef CSnapinWrapper COCXSnapin; //____________________________________________________________________________ // // Class: COCXSnapinComponent // // PURPOSE: //____________________________________________________________________________ // class COCXSnapinComponent : public CSnapinComponentImpl, IPersistStorage { public: COCXSnapinComponent() : m_bLoaded(FALSE), m_bInitialized(FALSE) {} BEGIN_COM_MAP(COCXSnapinComponent) COM_INTERFACE_ENTRY(IPersistStorage) COM_INTERFACE_ENTRY_CHAIN(CSnapinComponentImpl) END_COM_MAP() // IPersistStorage STDMETHODIMP HandsOffStorage(); STDMETHODIMP InitNew(IStorage* pStg); STDMETHODIMP IsDirty(); STDMETHODIMP Load(IStorage* pStg); STDMETHODIMP Save(IStorage* pStg, BOOL fSameAsLoad); STDMETHODIMP SaveCompleted(IStorage* pStgNew); STDMETHODIMP GetClassID(CLSID *pClassID); // IComponenent override STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); protected: STDMETHODIMP OnInitOCX(LPDATAOBJECT lpDataObject, LPARAM arg, LPARAM param); private: IStoragePtr m_spStg; // Storage provided by MMC IStoragePtr m_spStgInner; // Nested storage given to OCX IPersistStreamPtr m_spIPStm; // Persist interfaces from OCX IPersistStoragePtr m_spIPStg; // only one will be used BOOL m_bLoaded; // MMC called Load BOOL m_bInitialized; // MMC called InitNew }; #endif