///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996-1999 Microsoft Corporation // // Module Name: // AtlExtDll.h // // Implementation File: // AtlExtDll.cpp // // Description: // Definition of the Cluster Administrator extension classes. // // Author: // David Potter (davidp) May 31, 1996 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #ifndef __ATLEXTDLL_H_ #define __ATLEXTDLL_H_ // Required because of class names longer than 16 characters in lists. #pragma warning( disable : 4786 ) // identifier was truncated to '255' characters ni the browser information ///////////////////////////////////////////////////////////////////////////// // Include Files ///////////////////////////////////////////////////////////////////////////// #ifndef __cluadmex_h__ #include // for extension DLL definitions #endif #ifndef __cluadmexhostsvr_h__ #include "CluAdmExHostSvr.h" // for CLSIDs #endif #ifndef __CLUADMEXDATAOBJ_H_ #include "CluAdmExDataObj.h" // for CCluAdmExDataObject #endif //#ifndef _TRACETAG_H_ //#include "TraceTag.h" // for CTraceTag, Trace //#endif #ifndef __ATLEXTMENU_H_ #include "AtlExtMenu.h" // for CCluAdmExMenuItemList #endif #ifndef __ATLBASEPROPPAGE_H_ #include "AtlBasePropPage.h" // for CBasePropertyPageImpl #endif #ifndef __ATLBASEWIZPAGE_H_ #include "AtlBaseWizPage.h" // for CBaseWizardPageImpl #endif ///////////////////////////////////////////////////////////////////////////// // Forward Class Declarations ///////////////////////////////////////////////////////////////////////////// class CCluAdmExtensions; class CCluAdmExDll; class CCluAdmExPropPage; class CCluAdmExWizPage; class CCluAdmExWiz97Page; ///////////////////////////////////////////////////////////////////////////// // External Class Declarations ///////////////////////////////////////////////////////////////////////////// class CClusterObject; class CBaseSheetWindow; class CBasePropertySheetWindow; class CWizardWindow; ///////////////////////////////////////////////////////////////////////////// // Type Definitions ///////////////////////////////////////////////////////////////////////////// #define CAEXT_MENU_FIRST_ID 35000 typedef CComObject< CCluAdmExDll > CComCluAdmExDll; typedef std::list< CComCluAdmExDll * > CCluAdmExDllList; typedef std::list< CString > CStringList; ///////////////////////////////////////////////////////////////////////////// // Global Variable Definitions ///////////////////////////////////////////////////////////////////////////// //#if DBG //extern CTraceTag g_tagExtDll; //extern CTraceTag g_tagExtDllRef; //#endif // DBG ///////////////////////////////////////////////////////////////////////////// //++ // // class CCluAdmExtensions // // Description: // Encapsulates access to a list of extension DLLs. // // Inheritance: // CCluAdmExtensions // //-- ///////////////////////////////////////////////////////////////////////////// class CCluAdmExtensions { friend class CCluAdmExDll; public: // // Construction. // // Default constructor CCluAdmExtensions( void ) : m_pco( NULL ) , m_hfont( NULL ) , m_hicon( NULL ) , m_pdoData( NULL ) , m_plextdll( NULL ) , m_psht( NULL ) , m_pmenu( NULL ) , m_plMenuItems( NULL ) , m_nFirstCommandID( (ULONG) -1 ) , m_nNextCommandID( (ULONG) -1 ) , m_nFirstMenuID( (ULONG) -1 ) , m_nNextMenuID( (ULONG) -1 ) { } //*** CCluAdmExtensions() // Destructor virtual ~CCluAdmExtensions( void ) { UnloadExtensions(); } //*** ~CCluAdmExtensions() protected: // Initialize the list void Init( IN const CStringList & rlstrExtensions, IN OUT CClusterObject * pco, IN HFONT hfont, IN HICON hicon ); // Unload all the extensions void UnloadExtensions( void ); // Attributes private: const CStringList * m_plstrExtensions; // List of extensions. CClusterObject * m_pco; // Cluster item being administered. HFONT m_hfont; // Font for dialog text. HICON m_hicon; // Icon for upper left corner. protected: // // Accessor methods. // const CStringList * PlstrExtensions( void ) const { return m_plstrExtensions; } CClusterObject * Pco( void ) const { return m_pco; } HFONT Hfont( void ) const { return m_hfont; } HICON Hicon( void ) const { return m_hicon; } // Operations public: // // IWEExtendPropertySheet methods. // // Create extension property sheet pages void CreatePropertySheetPages( IN OUT CBasePropertySheetWindow * psht, IN const CStringList & rlstrExtensions, IN OUT CClusterObject * pco, IN HFONT hfont, IN HICON hicon ); public: // // IWEExtendWizard methods. // // Create extension wizard pages void CreateWizardPages( IN OUT CWizardWindow * psht, IN const CStringList & rlstrExtensions, IN OUT CClusterObject * pco, IN HFONT hfont, IN HICON hicon ); public: // // IWEExtendWizard97 methods. // // Create extension Wizard97 wizard pages void CreateWizard97Pages( IN OUT CWizardWindow * psht, IN const CStringList & rlstrExtensions, IN OUT CClusterObject * pco, IN HFONT hfont, IN HICON hicon ); public: // // IWEExtendContextMenu methods. // // Add extension context menu items void AddContextMenuItems( IN OUT CMenu * pmenu, IN const CStringList & rlstrExtensions, IN OUT CClusterObject * pco ); // Execute an extension context menu item BOOL BExecuteContextMenuItem( IN ULONG nCommandID ); // Get a command string to display on the status bar BOOL BGetCommandString( IN ULONG nCommandID, OUT CString & rstrMessage ); // Set the GetResNetName function pointer void SetPfGetResNetName( PFGETRESOURCENETWORKNAME pfGetResNetName, PVOID pvContext ) { if ( Pdo() != NULL ) { Pdo()->SetPfGetResNetName( pfGetResNetName, pvContext ); } // if: data object specified } //*** SetPfGetResNetName() // Implementation private: CComObject< CCluAdmExDataObject > * m_pdoData; // Data object for exchanging data. CCluAdmExDllList * m_plextdll; // List of extension DLLs. CBaseSheetWindow * m_psht; // Property sheet for IWEExtendPropertySheet. CMenu * m_pmenu; // Menu for IWEExtendContextMenu. CCluAdmExMenuItemList * m_plMenuItems; ULONG m_nFirstCommandID; ULONG m_nNextCommandID; ULONG m_nFirstMenuID; ULONG m_nNextMenuID; protected: CComObject< CCluAdmExDataObject > * Pdo( void ) { return m_pdoData; } CCluAdmExDllList * Plextdll( void ) const { return m_plextdll; } CBaseSheetWindow * Psht( void ) const { return m_psht; } CMenu * Pmenu( void ) const { return m_pmenu; } CCluAdmExMenuItemList * PlMenuItems( void ) const { return m_plMenuItems; } CCluAdmExMenuItem * PemiFromCommandID( ULONG nCommandID ) const; #if DBG CCluAdmExMenuItem * PemiFromExtCommandID( ULONG nExtCommandID ) const; #endif // DBG ULONG NFirstCommandID( void ) const { return m_nFirstCommandID; } ULONG NNextCommandID( void ) const { return m_nNextCommandID; } ULONG NFirstMenuID( void ) const { return m_nFirstMenuID; } ULONG NNextMenuID( void ) const { return m_nNextMenuID; } // Get the wizard page pointer from an HPROPSHEETPAGE CWizardPageWindow * PwpPageFromHpage( IN HPROPSHEETPAGE hpage ); public: // void OnUpdateCommand( CCmdUI * pCmdUI ); // BOOL OnCmdMsg( UINT nID, int nCode, void * pExtra, AFX_CMDHANDLERINFO * pHandlerInfo ); }; //*** class CCluAdmExtensions ///////////////////////////////////////////////////////////////////////////// //++ // // class CCluAdmExDll // // Description: // Encapsulates access to an extension DLL. // // Inheritance: // CCluAdmExDll // CComObjectRootEx<>, CComCoClass<>, // //-- ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CCluAdmExDll : public CComObjectRootEx< CComSingleThreadModel >, public CComCoClass< CCluAdmExDll, &CLSID_CoCluAdmExHostSvr >, public ISupportErrorInfo, public IWCPropertySheetCallback, public IWCWizardCallback, public IWCWizard97Callback, public IWCContextMenuCallback { friend class CCluAdmExtensions; public: // // Object construction and destruction. // // Default constructor CCluAdmExDll( void ) : m_piExtendPropSheet( NULL ) , m_piExtendWizard( NULL ) , m_piExtendWizard97( NULL ) , m_piExtendContextMenu( NULL ) , m_piInvokeCommand( NULL ) , m_pext( NULL ) { } //*** CCluAdmExDll() // Destructor virtual ~CCluAdmExDll( void ) { UnloadExtension(); } //*** ~CCluAdmExDll() // // Map interfaces to this class. // BEGIN_COM_MAP( CCluAdmExDll ) COM_INTERFACE_ENTRY( IWCPropertySheetCallback ) COM_INTERFACE_ENTRY( IWCWizardCallback ) COM_INTERFACE_ENTRY( IWCWizard97Callback ) COM_INTERFACE_ENTRY( IWCContextMenuCallback ) COM_INTERFACE_ENTRY( ISupportErrorInfo ) END_COM_MAP() DECLARE_NO_REGISTRY() DECLARE_NOT_AGGREGATABLE( CCluAdmExDll ) // Attributes private: CString m_strCLSID; // Name of extension DLL. protected: const CString & StrCLSID( void ) const { return m_strCLSID; } CClusterObject * Pco( void ) const { return Pext()->Pco(); } // Operations public: void Init( IN const CString & rstrExtension, IN OUT CCluAdmExtensions * pext ); IUnknown * LoadInterface( IN const REFIID riid ); void UnloadExtension( void ); public: // // IWEExtendPropertySheet methods. // // Create extension property sheet pages void CreatePropertySheetPages( void ); public: // // IWEExtendWizard methods. // // Create extension wizard pages void CreateWizardPages( void ); public: // // IWEExtendWizard97 methods. // // Create extension wizard pages void CreateWizard97Pages( void ); public: // // IWEExtendContextMenu methods. // // Add extension context menu items void AddContextMenuItems( void ); public: // // ISupportsErrorInfo methods. // STDMETHOD( InterfaceSupportsErrorInfo )( REFIID riid ); public: // // IWCPropertySheetCallback methods. // // Callback to add extension property sheet pages STDMETHOD( AddPropertySheetPage )( IN LONG * hpage // really should be HPROPSHEETPAGE ); public: // // IWCWizardCallback methods. // // Callback to add extension wizard pages STDMETHOD( AddWizardPage )( IN LONG * hpage // really should be HPROPSHEETPAGE ); public: // // IWCWizard97Callback methods. // // Callback to add extension wizard 97 pages STDMETHOD( AddWizard97Page )( IN LONG * hpage // really should be HPROPSHEETPAGE ); public: // // IWCWizardCallback and IWCWizard97Callback methods. // // Callback to enable the next button STDMETHOD( EnableNext )( IN LONG * hpage, IN BOOL bEnable ); public: // // IWCContextMenuCallback methods. // // Callback to add extension context menu items STDMETHOD( AddExtensionMenuItem )( IN BSTR lpszName, IN BSTR lpszStatusBarText, IN ULONG nCommandID, IN ULONG nSubmenuCommandID, IN ULONG uFlags ); // Implementation private: CCluAdmExtensions * m_pext; CLSID m_clsid; IWEExtendPropertySheet * m_piExtendPropSheet; // Pointer to an IWEExtendPropertySheet interface. IWEExtendWizard * m_piExtendWizard; // Pointer to an IWEExtendWizard interface. IWEExtendWizard97 * m_piExtendWizard97; // Pointer to an IWEExtendWizard97 interface. IWEExtendContextMenu * m_piExtendContextMenu; // Pointer to an IWEExtendContextMenu interface. IWEInvokeCommand * m_piInvokeCommand; // Pointer to an IWEInvokeCommand interface. protected: CCluAdmExtensions * Pext( void ) const { ATLASSERT( m_pext != NULL ); return m_pext; } const CLSID & Rclsid( void ) const { return m_clsid; } IWEExtendPropertySheet * PiExtendPropSheet( void ) const { return m_piExtendPropSheet; } IWEExtendWizard * PiExtendWizard( void ) const { return m_piExtendWizard; } IWEExtendWizard97 * PiExtendWizard97( void ) const { return m_piExtendWizard97; } IWEExtendContextMenu * PiExtendContextMenu( void ) const { return m_piExtendContextMenu; } IWEInvokeCommand * PiInvokeCommand( void ) const { return m_piInvokeCommand; } CComObject< CCluAdmExDataObject > * Pdo( void ) const { return Pext()->Pdo(); } CBaseSheetWindow * Psht( void ) const { return Pext()->Psht(); } CMenu * Pmenu( void ) const { return Pext()->Pmenu(); } CCluAdmExMenuItemList * PlMenuItems( void ) const { return Pext()->PlMenuItems(); } ULONG NFirstCommandID( void ) const { return Pext()->NFirstCommandID(); } ULONG NNextCommandID( void ) const { return Pext()->NNextCommandID(); } ULONG NFirstMenuID( void ) const { return Pext()->NFirstMenuID(); } ULONG NNextMenuID( void ) const { return Pext()->NNextMenuID(); } void ReleaseInterface( IN OUT IUnknown ** ppi #if DBG , IN LPCTSTR szClassName #endif ) { ATLASSERT( ppi != NULL ); if ( *ppi != NULL ) { #if DBG ULONG ulNewRefCount; // Trace( g_tagExtDllRef, _T("Releasing %s"), szClassName ); ulNewRefCount = #endif // DBG (*ppi)->Release(); *ppi = NULL; #if DBG // Trace( g_tagExtDllRef, _T(" Reference count = %d"), ulNewRefCount ); // Trace( g_tagExtDllRef, _T("ReleaseInterface() - %s = %08.8x"), szClassName, *ppi ); #endif // DBG } // if: interface specified } //*** ReleaseInterface( IUnknown ) void ReleaseInterface( IN OUT IWEExtendPropertySheet ** ppi ) { ReleaseInterface( (IUnknown **) ppi #if DBG , _T("IWEExtendPropertySheet") #endif // DBG ); } //*** ReleaseInterface( IWEExtendPropertySheet ) void ReleaseInterface( IN OUT IWEExtendWizard ** ppi ) { ReleaseInterface( (IUnknown **) ppi #if DBG , _T("IWEExtendWizard") #endif // DBG ); } //*** ReleaseInterface( IWEExtendWizard ) void ReleaseInterface( IN OUT IWEExtendWizard97 ** ppi ) { ReleaseInterface( (IUnknown **) ppi #if DBG , _T("IWEExtendWizard97") #endif // DBG ); } //*** ReleaseInterface( IWEExtendWizard97 ) void ReleaseInterface( IN OUT IWEExtendContextMenu ** ppi ) { ReleaseInterface( (IUnknown **) ppi #if DBG , _T("IWEExtendContextMenu") #endif // DBG ); } //*** ReleaseInterface( IWEExtendContextMenu ) void ReleaseInterface( IN OUT IWEInvokeCommand ** ppi ) { ReleaseInterface( (IUnknown **) ppi #if DBG , _T("IWEInvokeCommand") #endif // DBG ); } //*** ReleaseInterface( IWEInvokeCommand ) }; //*** class CCluAdmExDll ///////////////////////////////////////////////////////////////////////////// //++ // // class CCluAdmExPropPage // // Description: // Encapsulates an extension property page. // // Inheritance: // CCluAdmExPropPage // CExtensionPropertyPageImpl< CCluAdmExPropPage > // CBasePropertyPageImpl< CCluAdmExPropPage, CExtensionPropertyPageWindow > // CBasePageImpl< CCluAdmExPropPage, CExtensionPropertyPageWindow > // CPropertyPageImpl< CCluAdmExPropPage, CExtensionPropertyPageWindow > // CExtensionPropertyPageWindow // CDynamicPropertyPageWindow // CBasePropertyPageWindow // CBasePageWindow // CPropertyPageWindow // //-- ///////////////////////////////////////////////////////////////////////////// class CCluAdmExPropPage : public CExtensionPropertyPageImpl< CCluAdmExPropPage > { public: // // Construction. // // Standard constructor CCluAdmExPropPage( HPROPSHEETPAGE hpage ) { ATLASSERT( hpage != NULL ); m_hpage = hpage; } //*** CCluAdmExPropPage() enum { IDD = 0 }; DECLARE_CLASS_NAME() // Return the help ID map static const DWORD * PidHelpMap( void ) { static const DWORD s_aHelpIDs[] = { 0, 0 }; return s_aHelpIDs; } //*** PidHelpMap() // Create the page DWORD ScCreatePage( void ) { // // This method is required by CDynamicPropertyPageWindow. // return ERROR_SUCCESS; } //*** ScCreatePage() }; //*** class CCluAdmExPropPage ///////////////////////////////////////////////////////////////////////////// //++ // // class CCluAdmExWizPage // // Description: // Encapsulates an extension wizard page. // // Inheritance: // CCluAdmExWizPage // CExtensionWizardPageImpl< CCluAdmExWizPage > // CWizardPageImpl< CCluAdmExWizPage, CExtensionWizardWindow > // CBasePageImpl< CCluAdmExWizPage, CExtensionWizardWindow > // CPropertyPageImpl< CCluAdmExWizPage, CExtensionWizardWindow > // CExtensionWizardPageWindow // CDynamicWizardPageWindow // CWizardPageWindow // CBasePageWindow // CPropertyPageWindow // //-- ///////////////////////////////////////////////////////////////////////////// class CCluAdmExWizPage : public CExtensionWizardPageImpl< CCluAdmExWizPage > { public: // // Construction. // // Standard constructor CCluAdmExWizPage( HPROPSHEETPAGE hpage ) { ATLASSERT( hpage != NULL ); m_hpage = hpage; } //*** CCluAdmExWizPage() WIZARDPAGE_HEADERTITLEID( 0 ) WIZARDPAGE_HEADERSUBTITLEID( 0 ) enum { IDD = 0 }; DECLARE_CLASS_NAME() // Return the help ID map static const DWORD * PidHelpMap( void ) { static const DWORD s_aHelpIDs[] = { 0, 0 }; return s_aHelpIDs; } //*** PidHelpMap() // Create the page DWORD ScCreatePage( void ) { // // This method is required by CDynamicWizardPageWindow. // return ERROR_SUCCESS; } //*** ScCreatePage() }; //*** class CCluAdmExWizPage ///////////////////////////////////////////////////////////////////////////// //++ // // class CCluAdmExWiz97Page // // Description: // Encapsulates an extension Wizard 97 page. // // Inheritance: // CCluAdmExWiz97Page // CExtensionWizard97PageImpl< CCluAdmExWiz97Page > // CWizardPageImpl< CCluAdmExWiz97Page, CExtensionWizard97Window > // CBasePageImpl< CCluAdmExWiz97Page, CExtensionWizard97Window > // CPropertyPageImpl< CCluAdmExWiz97Page, CExtensionWizard97Window > // CExtensionWizard97PageWindow // CExtensionWizardPageWindow // CDynamicWizardPageWindow // CWizardPageWindow // CBasePageWindow // CPropertyPageWindow // //-- ///////////////////////////////////////////////////////////////////////////// class CCluAdmExWiz97Page : public CExtensionWizard97PageImpl< CCluAdmExWiz97Page > { public: // // Construction. // // Standard constructor CCluAdmExWiz97Page( HPROPSHEETPAGE hpage ) { ATLASSERT( hpage != NULL ); m_hpage = hpage; } //*** CCluAdmExWiz97Page() WIZARDPAGE_HEADERTITLEID( 0 ) WIZARDPAGE_HEADERSUBTITLEID( 0 ) enum { IDD = 0 }; DECLARE_CLASS_NAME() // Return the help ID map static const DWORD * PidHelpMap( void ) { static const DWORD s_aHelpIDs[] = { 0, 0 }; return s_aHelpIDs; } //*** PidHelpMap() // Create the page DWORD ScCreatePage( void ) { // // This method is required by CDynamicWizardPageWindow. // return ERROR_SUCCESS; } //*** ScCreatePage() }; //*** class CCluAdmExWiz97Page ///////////////////////////////////////////////////////////////////////////// // Global Variables ///////////////////////////////////////////////////////////////////////////// DEFINE_CLASS_NAME( CCluAdmExPropPage ) DEFINE_CLASS_NAME( CCluAdmExWizPage ) DEFINE_CLASS_NAME( CCluAdmExWiz97Page ) ///////////////////////////////////////////////////////////////////////////// #endif // __ATLEXTDLL_H_