// This is a part of the Microsoft Management Console. // Copyright (C) Microsoft Corporation, 1995 - 1999 // 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 #ifndef _CSNAPIN_H_ #define _CSNAPIN_H_ #include "resource.h" // main symbols #ifndef __mmc_h__ #include #endif using namespace CertSrv; enum { // Identifiers for each of the commands/views to be inserted into the context menu. IDM_COMMAND1, IDM_COMMAND2, IDM_SAMPLE_OCX_VIEW, IDM_SAMPLE_WEB_VIEW }; template TYPE* Extract(LPDATAOBJECT lpDataObject, CLIPFORMAT cf); BOOL IsMMCMultiSelectDataObject(IDataObject* pDataObject); CLSID* ExtractClassID(LPDATAOBJECT lpDataObject); GUID* ExtractNodeType(LPDATAOBJECT lpDataObject); wchar_t* ExtractWorkstation(LPDATAOBJECT lpDataObject); INTERNAL* ExtractInternalFormat(LPDATAOBJECT lpDataObject); HRESULT _QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, CComponentDataImpl* pImpl, LPDATAOBJECT* ppDataObject); DWORD GetItemType(MMC_COOKIE cookie); ///////////////////////////////////////////////////////////////////////////// // 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); enum CUSTOM_VIEW_ID { VIEW_DEFAULT_LV = 0, VIEW_ERROR_OCX = 1, }; class CSnapin : public IComponent, public IExtendContextMenu, // Step 3 public IExtendControlbar, public IExtendPropertySheet, public IResultDataCompare, 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(IExtendPropertySheet) COM_INTERFACE_ENTRY(IResultDataCompare) 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); // IExtendControlbar STDMETHOD(SetControlbar)(LPCONTROLBAR pControlbar); STDMETHOD(ControlbarNotify)(MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); // IExtendPropertySheet interface public: STDMETHOD(CreatePropertyPages)(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject); STDMETHOD(QueryPagesFor)(LPDATAOBJECT lpDataObject); 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, LPWSTR pszName, DWORD *pcName); 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 OnDelete(LPDATAOBJECT lpDataObject, 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, int 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: void Construct(); void LoadResources(); HRESULT InitializeHeaders(MMC_COOKIE cookie); HRESULT Enumerate(MMC_COOKIE cookie, HSCOPEITEM pParent); HRESULT EnumerateResultPane(MMC_COOKIE cookie); // Result pane helpers void RemoveResultItems(MMC_COOKIE cookie); void AddUser(CFolder* pFolder); void AddExtUser(CFolder* pFolder); void AddVirtual(); HRESULT AddCACertTypesToResults(CFolder* pParentFolder); RESULT_DATA* GetVirtualResultItem(int iIndex); // 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); CFolder* GetVirtualFolder(); CFolder* GetParentFolder(INTERNAL* pInternal); // Interface pointers protected: LPCONSOLE2 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 LPCONTROLBAR m_pControlbar; // control bar to hold my tool bars LPCONSOLEVERB m_pConsoleVerb; // pointer the console verb #ifdef INSERT_DEBUG_FOLDERS LPMENUBUTTON m_pMenuButton1; // Menu Button for view #endif // INSERT_DEBUG_FOLDERS LPTOOLBAR m_pSvrMgrToolbar1; // Toolbar for view CBitmap* m_pbmpSvrMgrToolbar1; // Imagelist for the toolbar CFolder* m_pCurrentlySelectedScopeFolder; // keep track of who has focus 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 CCertTypeAboutImpl : public ISnapinAbout, public CComObjectRoot, public CComCoClass { public: CCertTypeAboutImpl(); ~CCertTypeAboutImpl(); public: DECLARE_REGISTRY(CSnapin, _T("Snapin.PolicySettingsAbout.1"), _T("Snapin.PolicySettingsAbout"), IDS_SNAPIN_DESC, THREADFLAGS_BOTH) BEGIN_COM_MAP(CCertTypeAboutImpl) 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); HRESULT AboutHelper2(LPSTR str, LPOLESTR* lpPtr); }; class CCAPolicyAboutImpl : public ISnapinAbout, public CComObjectRoot, public CComCoClass { public: CCAPolicyAboutImpl(); ~CCAPolicyAboutImpl(); public: DECLARE_REGISTRY(CSnapin, _T("Snapin.PolicySettingsAbout.1"), _T("Snapin.PolicySettingsAbout"), IDS_SNAPIN_DESC, THREADFLAGS_BOTH) BEGIN_COM_MAP(CCAPolicyAboutImpl) 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); HRESULT AboutHelper2(LPSTR str, LPOLESTR* lpPtr); }; #define FREE_DATA(pData) \ ASSERT(pData != NULL); \ do { if (pData != NULL) \ GlobalFree(pData); } \ while(0); #endif // #define _CSNAPIN_H_