// This is a part of the Microsoft Management Console. // Copyright 1995 - 1997 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Management Console and related // electronic documentation provided with the interfaces. // CSnapin.h : Declaration of the CSnapin #include "resource.h" // main symbols #ifndef __mmc_h__ #include #endif class CFolder; // Note - This is the offset in my image list that represents the folder const FOLDER_IMAGE_IDX = 0; const OPEN_FOLDER_IMAGE_IDX = 5; const USER_IMAGE = 2; const COMPANY_IMAGE = 3; const VIRTUAL_IMAGE = 4; ///////////////////////////////////////////////////////////////////////////// // Snapin // // helper methods extracting data from data object // INTERNAL * ExtractInternalFormat(LPDATAOBJECT lpDataObject); wchar_t * ExtractWorkstation(LPDATAOBJECT lpDataObject); GUID * ExtractNodeType(LPDATAOBJECT lpDataObject); CLSID * ExtractClassID(LPDATAOBJECT lpDataObject); class CComponentDataImpl: public IComponentData, public IExtendPropertySheet2, public IExtendContextMenu, public IPersistStream, public CComObjectRoot { BEGIN_COM_MAP(CComponentDataImpl) COM_INTERFACE_ENTRY(IComponentData) COM_INTERFACE_ENTRY(IExtendPropertySheet) COM_INTERFACE_ENTRY(IExtendPropertySheet2) COM_INTERFACE_ENTRY(IExtendContextMenu) COM_INTERFACE_ENTRY(IPersistStream) END_COM_MAP() friend class CSnapin; friend class CDataObject; CComponentDataImpl(); ~CComponentDataImpl(); public: virtual const CLSID& GetCoClassID() = 0; virtual const BOOL IsPrimaryImpl() = 0; public: // IComponentData interface members STDMETHOD(Initialize)(LPUNKNOWN pUnknown); STDMETHOD(CreateComponent)(LPCOMPONENT* ppComponent); STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); STDMETHOD(Destroy)(); STDMETHOD(QueryDataObject)(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject); STDMETHOD(GetDisplayInfo)(SCOPEDATAITEM* pScopeDataItem); STDMETHOD(CompareObjects)(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB); // IExtendPropertySheet2 interface public: STDMETHOD(CreatePropertyPages)(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject); STDMETHOD(QueryPagesFor)(LPDATAOBJECT lpDataObject); STDMETHOD(GetWatermarks)(LPDATAOBJECT lpIDataObject, HBITMAP* lphWatermark, HBITMAP* lphHeader, HPALETTE* lphPalette, BOOL* pbStretch); // IExtendContextMenu public: STDMETHOD(AddMenuItems)(LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK pCallbackUnknown, long *pInsertionAllowed); STDMETHOD(Command)(long nCommandID, LPDATAOBJECT pDataObject); public: // IPersistStream interface members STDMETHOD(GetClassID)(CLSID *pClassID); STDMETHOD(IsDirty)(); STDMETHOD(Load)(IStream *pStm); STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty); STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize); bool m_bInitializedCD; bool m_bLoadedCD; bool m_bDestroyedCD; public: // Other public methods void DeleteAndReinsertAll(); // Notify handler declarations private: HRESULT OnDelete(MMC_COOKIE cookie); HRESULT OnRemoveChildren(LPARAM arg); HRESULT OnRename(MMC_COOKIE cookie, LPARAM arg, LPARAM param); HRESULT OnExpand(LPDATAOBJECT lpDataObject, LPARAM arg, LPARAM param); HRESULT OnSelect(MMC_COOKIE cookie, LPARAM arg, LPARAM param); HRESULT OnProperties(LPARAM param); #if DBG==1 public: ULONG InternalAddRef() { return CComObjectRoot::InternalAddRef(); } ULONG InternalRelease() { return CComObjectRoot::InternalRelease(); } #endif // DBG==1 // Scope item creation helpers private: CFolder* FindObject(MMC_COOKIE cookie); void CreateFolderList(LPDATAOBJECT lpDataObject); // scope item cookie helper void DeleteList(); void EnumerateScopePane(LPDATAOBJECT lpDataObject, HSCOPEITEM pParent); BOOL IsScopePaneNode(LPDATAOBJECT lpDataObject); HRESULT DoInsertWizard(LPPROPERTYSHEETCALLBACK lpProvider); private: LPCONSOLENAMESPACE m_pScope; // My interface pointer to the scope pane LPCONSOLE m_pConsole; // My interface pointer to the console HSCOPEITEM m_pStaticRoot; BOOL m_bIsDirty; void SetDirty(BOOL b = TRUE) { m_bIsDirty = b; } void ClearDirty() { m_bIsDirty = FALSE; } BOOL ThisIsDirty() { return m_bIsDirty; } void AddScopeItemToResultPane(MMC_COOKIE cookie); private: CList m_scopeItemList; #ifdef _DEBUG friend class CDataObject; int m_cDataObjects; #endif }; class CComponentDataPrimaryImpl : public CComponentDataImpl, public CComCoClass { public: DECLARE_REGISTRY(CSnapin, _T("Snapin.Snapin.1"), _T("Snapin.Snapin"), IDS_SNAPIN_DESC, THREADFLAGS_APARTMENT) virtual const CLSID & GetCoClassID() { return CLSID_Snapin; } virtual const BOOL IsPrimaryImpl() { return TRUE; } }; class CComponentDataExtensionImpl : public CComponentDataImpl, public CComCoClass { public: DECLARE_REGISTRY(CSnapin, _T("Extension.Extension.1"), _T("Extension.Extension"), IDS_SNAPIN_DESC, THREADFLAGS_APARTMENT) virtual const CLSID & GetCoClassID(){ return CLSID_Extension; } virtual const BOOL IsPrimaryImpl() { return FALSE; } }; enum CUSTOM_VIEW_ID { VIEW_DEFAULT_LV = 0, VIEW_CALENDAR_OCX = 1, VIEW_MICROSOFT_URL = 2, VIEW_DEFAULT_MESSAGE_VIEW = 3, }; class CSnapin : public IComponent, public IExtendContextMenu, // Step 3 public IExtendControlbar, public IResultDataCompare, public IResultOwnerData, public IPersistStream, public CComObjectRoot { public: CSnapin(); ~CSnapin(); BEGIN_COM_MAP(CSnapin) COM_INTERFACE_ENTRY(IComponent) COM_INTERFACE_ENTRY(IExtendContextMenu) // Step 3 COM_INTERFACE_ENTRY(IExtendControlbar) COM_INTERFACE_ENTRY(IResultDataCompare) COM_INTERFACE_ENTRY(IResultOwnerData) COM_INTERFACE_ENTRY(IPersistStream) END_COM_MAP() friend class CDataObject; static long lDataObjectRefCount; // IComponent interface members public: STDMETHOD(Initialize)(LPCONSOLE lpConsole); STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); STDMETHOD(Destroy)(MMC_COOKIE cookie); STDMETHOD(GetResultViewType)(MMC_COOKIE cookie, LPOLESTR* ppViewType, long* pViewOptions); STDMETHOD(QueryDataObject)(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject); STDMETHOD(GetDisplayInfo)(RESULTDATAITEM* pResultDataItem); STDMETHOD(CompareObjects)(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB); // IResultDataCompare STDMETHOD(Compare)(LPARAM lUserParam, MMC_COOKIE cookieA, MMC_COOKIE cookieB, int* pnResult); // IResultOwnerData STDMETHOD(FindItem)(LPRESULTFINDINFO pFindInfo, int* pnFoundIndex); STDMETHOD(CacheHint)(int nStartIndex, int nEndIndex); STDMETHOD(SortItems)(int nColumn, DWORD dwSortOptions, LPARAM lUserParam); // IExtendControlbar STDMETHOD(SetControlbar)(LPCONTROLBAR pControlbar); STDMETHOD(ControlbarNotify)(MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); public: // IPersistStream interface members STDMETHOD(GetClassID)(CLSID *pClassID); STDMETHOD(IsDirty)(); STDMETHOD(Load)(IStream *pStm); STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty); STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize); // Only for debug purpose bool m_bInitializedC; bool m_bLoadedC; bool m_bDestroyedC; // Helpers for CSnapin public: void SetIComponentData(CComponentDataImpl* pData); void GetItemName(LPDATAOBJECT lpDataObject, LPTSTR pszName); BOOL IsPrimaryImpl() { CComponentDataImpl* pData = dynamic_cast(m_pComponentData); ASSERT(pData != NULL); if (pData != NULL) return pData->IsPrimaryImpl(); return FALSE; } #if DBG==1 public: int dbg_cRef; ULONG InternalAddRef() { ++dbg_cRef; return CComObjectRoot::InternalAddRef(); } ULONG InternalRelease() { --dbg_cRef; return CComObjectRoot::InternalRelease(); } #endif // DBG==1 // Notify event handlers protected: HRESULT OnFolder(MMC_COOKIE cookie, LPARAM arg, LPARAM param); HRESULT OnAddImages(MMC_COOKIE cookie, LPARAM arg, LPARAM param); HRESULT OnShow(MMC_COOKIE cookie, LPARAM arg, LPARAM param); HRESULT OnActivate(MMC_COOKIE cookie, LPARAM arg, LPARAM param); HRESULT OnMinimize(MMC_COOKIE cookie, LPARAM arg, LPARAM param); HRESULT OnPropertyChange(LPDATAOBJECT lpDataObject); // Step 3 HRESULT OnUpdateView(LPDATAOBJECT lpDataObject); HRESULT OnResultItemClk(DATA_OBJECT_TYPES type, MMC_COOKIE cookie); HRESULT OnContextHelp(LPDATAOBJECT lpDataObject); void OnButtonClick(LPDATAOBJECT pdtobj, LONG_PTR idBtn); HRESULT QueryMultiSelectDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject); // IExtendContextMenu public: STDMETHOD(AddMenuItems)(LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK pCallbackUnknown, long *pInsertionAllowed); STDMETHOD(Command)(long nCommandID, LPDATAOBJECT pDataObject); // End step 3 // Helper functions protected: BOOL IsEnumerating(LPDATAOBJECT lpDataObject); void Construct(); void LoadResources(); HRESULT InitializeHeaders(MMC_COOKIE cookie); void Enumerate(MMC_COOKIE cookie, HSCOPEITEM pParent); void EnumerateResultPane(MMC_COOKIE cookie); void PopulateMessageView (MMC_COOKIE cookie); // Result pane helpers void AddResultItems(RESULT_DATA* pData, int nCount, int imageIndex); void AddUser(); void AddCompany(); void AddExtUser(); void AddExtCompany(); void AddVirtual(); RESULT_DATA* GetVirtualResultItem(int iIndex); HRESULT InitializeBitmaps(MMC_COOKIE cookie); // UI Helpers void HandleStandardVerbs(bool bDeselectAll, LPARAM arg, LPDATAOBJECT lpDataObject); void HandleExtToolbars(bool bDeselectAll, LPARAM arg, LPARAM param); void HandleExtMenus(LPARAM arg, LPARAM param); void _OnRefresh(LPDATAOBJECT pDataObject); // Interface pointers protected: LPCONSOLE m_pConsole; // Console's IFrame interface LPHEADERCTRL m_pHeader; // Result pane's header control interface LPCOMPONENTDATA m_pComponentData; LPRESULTDATA m_pResult; // My interface pointer to the result pane LPIMAGELIST m_pImageResult; // My interface pointer to the result pane image list LPTOOLBAR m_pToolbar1; // Toolbar for view LPTOOLBAR m_pToolbar2; // Toolbar for view LPCONTROLBAR m_pControlbar; // control bar to hold my tool bars LPCONSOLEVERB m_pConsoleVerb; // pointer the console verb LPMENUBUTTON m_pMenuButton1; // Menu Button for view ::CBitmap* m_pbmpToolbar1; // Imagelist for the first toolbar ::CBitmap* m_pbmpToolbar2; // Imagelist for the first toolbar // Header titles for each nodetype(s) protected: CString m_column1; // Name CString m_column2; // Size CString m_column3; // Type private: BOOL m_bIsDirty; CUSTOM_VIEW_ID m_CustomViewID; BOOL m_bVirtualView; DWORD m_dwVirtualSortOptions; void SetDirty(BOOL b = TRUE) { m_bIsDirty = b; } void ClearDirty() { m_bIsDirty = FALSE; } BOOL ThisIsDirty() { return m_bIsDirty; } }; inline void CSnapin::SetIComponentData(CComponentDataImpl* pData) { ASSERT(pData); ASSERT(m_pComponentData == NULL); LPUNKNOWN pUnk = pData->GetUnknown(); HRESULT hr; hr = pUnk->QueryInterface(IID_IComponentData, reinterpret_cast(&m_pComponentData)); ASSERT(hr == S_OK); } class CSnapinAboutImpl : public ISnapinAbout, public CComObjectRoot, public CComCoClass { public: CSnapinAboutImpl(); ~CSnapinAboutImpl(); public: DECLARE_REGISTRY(CSnapin, _T("Snapin.About.1"), _T("Snapin.About"), IDS_SNAPIN_DESC, THREADFLAGS_BOTH) BEGIN_COM_MAP(CSnapinAboutImpl) COM_INTERFACE_ENTRY(ISnapinAbout) END_COM_MAP() public: STDMETHOD(GetSnapinDescription)(LPOLESTR* lpDescription); STDMETHOD(GetProvider)(LPOLESTR* lpName); STDMETHOD(GetSnapinVersion)(LPOLESTR* lpVersion); STDMETHOD(GetSnapinImage)(HICON* hAppIcon); STDMETHOD(GetStaticFolderImage)(HBITMAP* hSmallImage, HBITMAP* hSmallImageOpen, HBITMAP* hLargeImage, COLORREF* cLargeMask); // Internal functions private: HRESULT AboutHelper(UINT nID, LPOLESTR* lpPtr); }; #define FREE_DATA(pData) \ ASSERT(pData != NULL); \ do { if (pData != NULL) \ GlobalFree(pData); } \ while(0); #define ARRAYLEN(x) (sizeof(x) / sizeof((x)[0]))