//============================================================================ // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: srview.h // // History: // 09/05/97 Kenn M. Takara Created. // // IPX Static Routes view // //============================================================================ #ifndef _SRVIEW_H #define _SRVIEW_H #ifndef _BASEHAND_H #include "basehand.h" #endif #ifndef _HANDLERS_H #include "handlers.h" #endif #ifndef _XSTREAM_H #include "xstream.h" // need for ColumnData #endif #ifndef _INFO_H #include "info.h" #endif #ifndef _IPXFACE_H #include "ipxface.h" #endif #ifndef _BASECON_H #include "basecon.h" // BaseContainerHandler #endif #ifndef _IPXSTRM_H #include "ipxstrm.h" #endif #ifndef _RTRSHEET_H #include "rtrsheet.h" #endif #ifndef _IPXCONN_H #include "ipxconn.h" // IPXConnection #endif #include "ipxstats.h" // IPX statistics dialogs // forward declarations class IPXAdminConfigStream; struct SIpxSRNodeMenu; /*--------------------------------------------------------------------------- This is the list of columns available for the IPX Static Routes node. - Interface, "[1] DEC DE500 ..." - Network number - Next Hop MAC address - Tick Count - Hop Count ---------------------------------------------------------------------------*/ // // If you ADD any columns to this enum, Be sure to update // the string ids for the column headers in srview.cpp // enum { IPX_SR_SI_NAME = 0, IPX_SR_SI_NETWORK, IPX_SR_SI_NEXT_HOP, IPX_SR_SI_TICK_COUNT, IPX_SR_SI_HOP_COUNT, IPX_SR_MAX_COLUMNS, }; /*--------------------------------------------------------------------------- We store a pointer to the IPConnection object in our node data ---------------------------------------------------------------------------*/ #define GET_IPX_SR_NODEDATA(pNode) \ (IPXConnection *) pNode->GetData(TFS_DATA_USER) #define SET_IPX_SR_NODEDATA(pNode, pData) \ pNode->SetData(TFS_DATA_USER, (LONG_PTR) pData) /*--------------------------------------------------------------------------- Struct: IpxSRListEntry This is an intermediate data structure. Our data-gathering routines will generate a list of these data items. We will then use this list to populate result pane. This will (eventually) be generated by the Refresh mechanism. This separation of data gathering and UI code will allow us to easily move the data gathering to a background thread. ---------------------------------------------------------------------------*/ struct IpxSRListEntry { SPIInterfaceInfo m_spIf; IPX_STATIC_ROUTE_INFO m_route; void LoadFrom(BaseIPXResultNodeData *pNodeData); void SaveTo(BaseIPXResultNodeData *pNodeData); }; typedef CList IpxSRList; /*--------------------------------------------------------------------------- Class: IpxSRHandler ---------------------------------------------------------------------------*/ class IpxSRHandler : public BaseContainerHandler { public: IpxSRHandler(ITFSComponentData *pTFSCompData); ~IpxSRHandler(); // Override QI to handle embedded interface STDMETHOD(QueryInterface)(REFIID iid, LPVOID *ppv); DeclareEmbeddedInterface(IRtrAdviseSink, IUnknown) // base handler functionality we override OVERRIDE_NodeHandler_HasPropertyPages(); OVERRIDE_NodeHandler_GetString(); OVERRIDE_NodeHandler_OnCreateDataObject(); OVERRIDE_NodeHandler_OnAddMenuItems(); OVERRIDE_NodeHandler_OnCommand(); OVERRIDE_NodeHandler_DestroyHandler(); OVERRIDE_BaseHandlerNotify_OnExpand(); OVERRIDE_ResultHandler_AddMenuItems(); OVERRIDE_ResultHandler_Command(); OVERRIDE_ResultHandler_CompareItems(); OVERRIDE_BaseResultHandlerNotify_OnResultShow(); OVERRIDE_BaseResultHandlerNotify_OnResultRefresh(); // Initializes the handler HRESULT Init(IRtrMgrInfo *pRtrMgrInfo, IPXAdminConfigStream *pConfigStream); // Initializes the node HRESULT ConstructNode(ITFSNode *pNode, LPCTSTR szName, IPXConnection *pIPXConn); public: // Structure used to pass data to callbacks - used as a way of // avoiding recomputation struct SMenuData { SPITFSNode m_spNode; }; // Function callbacks for menu enabling/disabling protected: // Refresh the data for these nodes HRESULT SynchronizeNodeData(ITFSNode *pThisNode); HRESULT MarkAllNodes(ITFSNode *pNode, ITFSNodeEnum *pEnum); HRESULT RemoveAllUnmarkedNodes(ITFSNode *pNode, ITFSNodeEnum *pEnum); HRESULT GenerateListOfRoutes(ITFSNode *pNode, IpxSRList *pSRList); // Helper function to add interfaces to the UI HRESULT AddStaticRouteNode(ITFSNode *pParent, IpxSRListEntry *pRoute); // Command implementations HRESULT OnNewRoute(ITFSNode *pNode); LONG_PTR m_ulConnId; // notification id for router info LONG_PTR m_ulRefreshConnId; // notification id for router refresh MMC_COOKIE m_cookie; // cookie for the node SPIRtrMgrInfo m_spRtrMgrInfo; SPIRouterInfo m_spRouterInfo; IPXAdminConfigStream * m_pConfigStream; CString m_stTitle; }; /*--------------------------------------------------------------------------- Class: IpxRouteHandler This is the handler for the interface nodes that appear in the IPStaticRoutes node. ---------------------------------------------------------------------------*/ class IpxRouteHandler : public BaseIPXResultHandler { public: IpxRouteHandler(ITFSComponentData *pCompData); OVERRIDE_NodeHandler_HasPropertyPages(); OVERRIDE_NodeHandler_CreatePropertyPages(); OVERRIDE_NodeHandler_OnCreateDataObject(); OVERRIDE_ResultHandler_AddMenuItems(); OVERRIDE_ResultHandler_Command(); OVERRIDE_ResultHandler_OnCreateDataObject(); OVERRIDE_ResultHandler_DestroyResultHandler(); OVERRIDE_ResultHandler_HasPropertyPages(); OVERRIDE_ResultHandler_CreatePropertyPages(); OVERRIDE_BaseResultHandlerNotify_OnResultDelete(); // Initializes the node HRESULT ConstructNode(ITFSNode *pNode, IInterfaceInfo *pIfInfo, IPXConnection *pIPXConn); HRESULT Init(IInterfaceInfo *pInfo, ITFSNode *pParent); // Refreshes all routes HRESULT ParentRefresh(ITFSNode *pNode); // Removes the static route HRESULT OnRemoveStaticRoute(ITFSNode *pNode); // Route modification apis HRESULT RemoveStaticRoute(IpxSRListEntry *pSREntry, IInfoBase *pInfo); HRESULT ModifyRouteInfo(ITFSNode *pNode, IpxSRListEntry *pSREntry, IpxSRListEntry *pSREntryOld); public: // Structure used to pass data to callbacks - used as a way of // avoiding recomputation struct SMenuData { ULONG m_ulMenuId; SPITFSNode m_spNode; }; ULONG GetSeparatorFlags(SMenuData *pData); protected: LONG_PTR m_ulConnId; SPIInterfaceInfo m_spInterfaceInfo; }; //---------------------------------------------------------------------------- // Class: CStaticRouteDlg // // Controls the 'Add/Edit Static Route' dialog. //---------------------------------------------------------------------------- // Set if we are modifying an exising entry (the only change this does // is that we will fill in the controls with the data in the structure). #define SR_DLG_MODIFY 0x00000001 class CStaticRouteDlg : public CBaseDialog { public: CStaticRouteDlg(IpxSRListEntry * pSREntry, DWORD dwFlags, IRouterInfo * pRouter, CWnd* pParent = NULL ); //{{AFX_DATA(CStaticRouteDlg) CComboBox m_cbInterfaces; CSpinButtonCtrl m_spinTickCount; CSpinButtonCtrl m_spinHopCount; //}}AFX_DATA //{{AFX_VIRTUAL(CStaticRouteDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); //}}AFX_VIRTUAL protected: static DWORD m_dwHelpMap[]; CStringList m_ifidList; DWORD m_dwFlags; SPIRouterInfo m_spRouterInfo; IpxSRListEntry *m_pSREntry; //{{AFX_MSG(CStaticRouteDlg) virtual void OnOK(); virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; HRESULT SetRouteData(BaseIPXResultNodeData *pData, IpxSRListEntry *pRoute); HRESULT AddStaticRoute(IpxSRListEntry *pSREntry, IInfoBase *InfoBase, InfoBlock *pBlock); BOOL FAreTwoRoutesEqual(IPX_STATIC_ROUTE_INFO *pRoute1, IPX_STATIC_ROUTE_INFO *pRoute2); #endif _SRVIEW_H