|
|
//============================================================================
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: info.h
//
// History:
// Abolade Gbadegesin Feb. 10, 1996 Created.
//
// This file contains declarations for InfoBase parsing code.
// Also including are classes for loading and saving the Router's
// configuration tree (CRouterInfo, CRmInfo, etc.)
//
// The classes are as follows
// (in the diagrams, d => derives, c => contains-list-of):
//
//
// CInfoBase
// |
// c---SInfoBlock
//
//
// CInfoBase holds block of data broken up into a list
// of SInfoBlock structures using RTR_INFO_BLOCK_HEADER
// as a template (see rtinfo.h).
//
// CRouterInfo // router info
// |
// c---CRmInfo // router-manager info
// | |
// | c---CRmProtInfo // protocol info
// |
// c---CInterfaceInfo // router interface info
// |
// c---CRmInterfaceInfo // router-manager interface
// |
// c---CRmProtInterfaceInfo // protocol info
//
// CRouterInfo top-level container for Router registry info.
// holds list of router-managers and interfaces.
//
// CRmInfo global information for a router-manager,
// holds list of routing-protocols.
//
// CRmProtInfo global information for a routing-protocol.
//
// CInterfaceInfo global information for a router-interface.
// holds list of CRmInterfaceInfo structures,
// which hold per-interface info for router-managers.
//
// CRmInterfaceInfo per-interface info for a router-manager.
// holds list of CRmProtInterfaceInfo structures,
// which hold per-interface info for protocols.
//
// CRmProtInterfaceInfo per-interface info for a routing-protocol.
//
//============================================================================
#ifndef _INFOI_H_
#define _INFOI_H_
#include "router.h"
#ifndef _INFOPRIV_H
#include "infopriv.h"
#endif
#ifndef _RTRLIST_H
#include "rtrlist.h"
#endif
//
// Forward declarations of router-information classes.
//
class CRmInfo; class CRmProtInfo; class CInterfaceInfo; class CRmInterfaceInfo; class CRmProtInterfaceInfo; class RouterRefreshObject;
typedef struct _SRouterCB { DWORD dwLANOnlyMode; // 0 or 1
void LoadFrom(const RouterCB *pcb); void SaveTo(RouterCB *pcb); } SRouterCB;
typedef struct _SRtrMgrCB { DWORD dwTransportId; // e.g. PID_IP (mprapi.h)
CString stId; // e.g. "Tcpip"
CString stTitle; // e.g. "TCP/IP Router Manager"
CString stDLLPath; // e.g. "%systemroot%\system32\iprtrmgr.dll"
//CString stConfigDLL; // e.g. "rtrui.dll"
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const RtrMgrCB *pcb); void SaveTo(RtrMgrCB *pcb); } SRtrMgrCB;
typedef struct _SRtrMgrProtocolCB { DWORD dwProtocolId; // e.g. IP_RIP (routprot.h)
CString stId; // e.g. "IPRIP"
DWORD dwFlags; DWORD dwTransportId; // e.g. PID_IP
CString stRtrMgrId; // e.g. "Tcpip"
CString stTitle; // e.g. "RIP for Internet Protocol"
CString stDLLName; // e.g. "iprip2.dll"
//CString stConfigDLL; // e.g. "rtrui.dll"
GUID guidConfig; // CLSID for config object
GUID guidAdminUI; // CLSID for snapin
CString stVendorName; // Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const RtrMgrProtocolCB *pcb); void SaveTo(RtrMgrProtocolCB *pcb); } SRtrMgrProtocolCB;
typedef struct _SInterfaceCB { CString stId; // e.g. "EPRO1"
DWORD dwIfType; // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
BOOL bEnable; // e.g. Enabled or Disabled
CString stTitle; // e.g. friendly name(NT5) or the device name(NT4)
CString stDeviceName; // e.g. "[1] Intel EtherPro"
DWORD dwBindFlags; // e.g. Bound to IP or IPX
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const InterfaceCB *pcb); void SaveTo(InterfaceCB *pcb); } SInterfaceCB;
typedef struct _SRtrMgrInterfaceCB { DWORD dwTransportId; // e.g. PID_IP (mprapi.h)
CString stId; // e.g. "Tcpip"
CString stInterfaceId; // e.g. "EPRO1"
DWORD dwIfType; // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
CString stTitle; // e.g. "[1] Intel Etherexpress PRO"
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const RtrMgrInterfaceCB *pcb); void SaveTo(RtrMgrInterfaceCB *pcb); } SRtrMgrInterfaceCB;
typedef struct _SRtrMgrProtocolInterfaceCB { DWORD dwProtocolId; // e.g. IP_RIP (routprot.h)
CString stId; // e.g. "IPRIP"
DWORD dwTransportId; // e.g. PID_IP
CString stRtrMgrId; // e.g. "Tcpip"
CString stInterfaceId; // e.g. "EPRO1"
DWORD dwIfType; // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
CString stTitle; // e.g. "[1] Intel Etherexpress PRO"
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const RtrMgrProtocolInterfaceCB *pcb); void SaveTo(RtrMgrProtocolInterfaceCB *pcb); } SRtrMgrProtocolInterfaceCB;
/*---------------------------------------------------------------------------
CList classes for the external structures ---------------------------------------------------------------------------*/ typedef CList<RtrMgrCB *, RtrMgrCB *> RtrMgrCBList; typedef CList<RtrMgrProtocolCB *, RtrMgrProtocolCB *> RtrMgrProtocolCBList; typedef CList<InterfaceCB *, InterfaceCB *> InterfaceCBList; typedef CList<RtrMgrInterfaceCB *, RtrMgrInterfaceCB *> RtrMgrInterfaceCBList; typedef CList<RtrMgrProtocolInterfaceCB *, RtrMgrProtocolInterfaceCB *> RtrMgrProtocolInterfaceCBList;
/*---------------------------------------------------------------------------
CList classes for the various internal structures ---------------------------------------------------------------------------*/ typedef CList<SRtrMgrCB *, SRtrMgrCB *> SRtrMgrCBList; typedef CList<SRtrMgrProtocolCB *, SRtrMgrProtocolCB *> SRtrMgrProtocolCBList; typedef CList<SInterfaceCB *, SInterfaceCB *> SInterfaceCBList; typedef CList<SRtrMgrInterfaceCB *, SRtrMgrInterfaceCB *> SRtrMgrInterfaceCBList; typedef CList<SRtrMgrProtocolInterfaceCB *, SRtrMgrProtocolInterfaceCB *> SRtrMgrProtocolInterfaceCBList;
/*---------------------------------------------------------------------------
Smart pointers for the various structures ---------------------------------------------------------------------------*/ DeclareSP(SRouterCB, SRouterCB) DeclareSP(SRtrMgrCB, SRtrMgrCB) DeclareSP(SRtrMgrProtocolCB, SRtrMgrProtocolCB) DeclareSP(SInterfaceCB, SInterfaceCB) DeclareSP(SRtrMgrInterfaceCB, SRtrMgrInterfaceCB) DeclareSP(SRtrMgrProtocolInterfaceCB, SRtrMgrProtocolInterfaceCB)
struct SRmData { IRtrMgrInfo * m_pRmInfo;
SRmData() : m_pRmInfo(NULL){};
// Do this instead of using a destructor to avoid problems with
// destruction of temporaries.
static void Destroy(SRmData *pRmData); }; typedef CList<SRmData, SRmData> RmDataList;
struct SIfData { IInterfaceInfo * pIfInfo; DWORD dwConnection;
SIfData() : pIfInfo(NULL), dwConnection(0) {};
}; typedef CList<SIfData, SIfData> IfList;
/*---------------------------------------------------------------------------
CreateEnum for the various CBs ---------------------------------------------------------------------------*/ HRESULT CreateEnumFromSRmCBList(SRtrMgrCBList *pRmCBList, IEnumRtrMgrCB **ppEnum); HRESULT CreateEnumFromSRmProtCBList(SRtrMgrProtocolCBList *pRmProtCBList, IEnumRtrMgrProtocolCB **ppEnum); HRESULT CreateEnumFromSIfCBList(SInterfaceCBList *pIfCBList, IEnumInterfaceCB **ppEnum); HRESULT CreateEnumFromSRmIfCBList(SRtrMgrInterfaceCBList *pRmIfCBList, IEnumRtrMgrInterfaceCB **ppEnum); HRESULT CreateEnumFromSRmProtIfCBList(SRtrMgrProtocolInterfaceCBList *pRmIfProtCBList, IEnumRtrMgrProtocolInterfaceCB **ppEnum);
/*---------------------------------------------------------------------------
CreateEnum for the various interface lists ---------------------------------------------------------------------------*/
// These lists are assumed to have arrays of WEAK references!
HRESULT CreateEnumFromRmList(RmDataList *pRmList, IEnumRtrMgrInfo **ppEnum); HRESULT CreateEnumFromRtrMgrProtocolList(PRtrMgrProtocolInfoList *pRmProtList, IEnumRtrMgrProtocolInfo **ppEnum); HRESULT CreateEnumFromInterfaceList(PInterfaceInfoList *pIfList, IEnumInterfaceInfo **ppEnum); HRESULT CreateEnumFromRtrMgrInterfaceList(PRtrMgrInterfaceInfoList *pRmIfList, IEnumRtrMgrInterfaceInfo **ppEnum); HRESULT CreateEnumFromRtrMgrProtocolInterfaceList(PRtrMgrProtocolInterfaceInfoList *pRmProtIfList, IEnumRtrMgrProtocolInterfaceInfo **ppEnum);
/*---------------------------------------------------------------------------
Struct: SAdviseData Helper class for management of advise connections. ---------------------------------------------------------------------------*/ struct SAdviseData { IRtrAdviseSink *m_pAdvise; LONG_PTR m_ulConnection; LPARAM m_lUserParam;
// This m_ulFlags parameter is used by the AdviseDataList.
ULONG m_ulFlags;
SAdviseData() : m_pAdvise(NULL), m_ulConnection(0) {};
static void Destroy(SAdviseData *pAdviseData); }; typedef CList<SAdviseData, SAdviseData> _SAdviseDataList;
// Possible values for the m_ulFlags
#define ADVISEDATA_DELETED (1)
class AdviseDataList : public _SAdviseDataList { public: HRESULT AddConnection(IRtrAdviseSink *pAdvise, LONG_PTR ulConnection, LPARAM lUserParam); HRESULT RemoveConnection(LONG_PTR ulConnection);
HRESULT NotifyChange(DWORD dwChange, DWORD dwObj, LPARAM lParam);
protected: // Need to have a private list to handle the notifies.
// This list is created while in a NotifyChange(). Any calls
// to RemoveConnection() DURING a notify, will mark entries as
// invalid (and are thus not called during the NotifyChange()).
_SAdviseDataList m_listNotify; };
/*---------------------------------------------------------------------------
Class: RtrCriticalSection
This class is used to support entering/leaving of critical sections. Put this class at the top of a function that you want protected. ---------------------------------------------------------------------------*/
class RtrCriticalSection { public: RtrCriticalSection(CRITICAL_SECTION *pCritSec) : m_pCritSec(pCritSec) { IfDebug(m_cEnter=0;) Assert(m_pCritSec); Enter(); } ~RtrCriticalSection() { Detach(); }
void Enter() { if (m_pCritSec) { IfDebug(m_cEnter++;) EnterCriticalSection(m_pCritSec); AssertSz(m_cEnter==1, "EnterCriticalSection called too much!"); } } BOOL TryToEnter() { if (m_pCritSec) return TryEnterCriticalSection(m_pCritSec); return TRUE; } void Leave() { if (m_pCritSec) { IfDebug(m_cEnter--;) LeaveCriticalSection(m_pCritSec); Assert(m_cEnter==0); } }
void Detach() { Leave(); m_pCritSec = NULL; } private: CRITICAL_SECTION * m_pCritSec; IfDebug(int m_cEnter;) };
/*---------------------------------------------------------------------------
Class: RouterInfo ---------------------------------------------------------------------------*/
class RouterInfo : public CWeakRef, public IRouterInfo, public IRouterAdminAccess { public: DeclareIUnknownMembers(IMPL) DeclareIRouterRefreshAccessMembers(IMPL) DeclareIRouterInfoMembers(IMPL) DeclareIRtrAdviseSinkMembers(IMPL) DeclareIRouterAdminAccessMembers(IMPL)
// Constructor
RouterInfo(HWND hWndSync, LPCWSTR machineName);
// If you are releasing ANY interface pointers do it in
// the Destruct() call instead.
virtual ~RouterInfo();
// Internal calls to help out with adding/removing interfaces
// ----------------------------------------------------------------
HRESULT AddInterfaceInternal(IInterfaceInfo *pInfo, BOOL fForce, BOOL fAddToRouter); HRESULT RemoveInterfaceInternal(LPCOLESTR pszIf, BOOL fRemoveFromRouter); HRESULT RemoteRtrMgrInternal(DWORD dwTransportId, BOOL fRemoveFromRouter); HRESULT FindInterfaceByName(LPCOLESTR pszIfName, IInterfaceInfo **ppInfo); HRESULT NotifyRtrMgrInterfaceOfMove(IInterfaceInfo *pInfo);
// Functions to load up static information about the router.
// This will return information about the INSTALLED protocols/rms,
// not necessarily the RUNNING protocols/rms.
// ----------------------------------------------------------------
static HRESULT LoadInstalledRtrMgrList(LPCTSTR pszMachine, SRtrMgrCBList *pRmCBList); static HRESULT LoadInstalledInterfaceList(LPCTSTR pszMachine, SInterfaceCBList *pIfCBList); static HRESULT LoadInstalledRtrMgrProtocolList(LPCTSTR pszMachine, DWORD dwTransportId, SRtrMgrProtocolCBList *pRmProtCBList, LPCWSTR lpwszUserName, LPCWSTR lpwszPassword , LPCWSTR lpwszDomain ); static HRESULT LoadInstalledRtrMgrProtocolList(LPCTSTR pszMachine, DWORD dwTransportId, SRtrMgrProtocolCBList *pRmProtCBList, RouterInfo * pRouter); static HRESULT LoadInstalledRtrMgrProtocolList(LPCTSTR pszMachine, DWORD dwTransportId, SRtrMgrProtocolCBList *pRmProtCBList, IRouterInfo * pRouter); protected: // The router control block for this router. There's not too much
// information here.
// ----------------------------------------------------------------
SRouterCB m_SRouterCB;
// List of Router-Managers that are running on the router.
// ----------------------------------------------------------------
RmDataList m_RmList;
// List of interfaces that have been added to the router.
// WEAK-REF ptrs to IInterfaceInfo objects.
// ----------------------------------------------------------------
PInterfaceInfoList m_IfList;
// Name of this machine.
// ----------------------------------------------------------------
CString m_stMachine;
// MPR_CONFIG_HANDLE to the router
// Obtained by MprAdminServerConnect();
// ----------------------------------------------------------------
MPR_CONFIG_HANDLE m_hMachineConfig;
// MPR_SERVER_HANDLE to the router
// Obtained by MprAdminServerConnect();
// ----------------------------------------------------------------
MPR_SERVER_HANDLE m_hMachineAdmin;
// This is set to TRUE if we are to disconnect the machine handles.
// ----------------------------------------------------------------
BOOL m_bDisconnect;
// This is the router type (LAN, WAN, RAS);
// ----------------------------------------------------------------
DWORD m_dwRouterType;
// Version info for the router and machine.
// ----------------------------------------------------------------
RouterVersionInfo m_VersionInfo;
// Pointer to the refresh object connected with this machine.
// ----------------------------------------------------------------
SPIRouterRefresh m_spRefreshObject;
HWND m_hWndSync; // hwnd of the background hidden window
SRtrMgrCBList m_RmCBList; // contains ptrs to RtrMgrCB objects
SRtrMgrProtocolCBList m_RmProtCBList; // ptrs to RtrMgrProtocolCB objects
SInterfaceCBList m_IfCBList; // ptrs to InterfaceCB objects
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
HRESULT LoadRtrMgrList(); HRESULT LoadInterfaceList(); HRESULT TryToConnect(LPCWSTR pswzMachine, HANDLE hMachine);
// Functions for merge support
HRESULT MergeRtrMgrCB(IRouterInfo *pNewRouter); HRESULT MergeInterfaceCB(IRouterInfo *pNewRouter); HRESULT MergeRtrMgrProtocolCB(IRouterInfo *pNewRouter); HRESULT MergeRtrMgrs(IRouterInfo *pNewRouter); HRESULT MergeInterfaces(IRouterInfo *pNewRouter);
SRtrMgrCB * FindRtrMgrCB(DWORD dwTransportId); SInterfaceCB * FindInterfaceCB(LPCTSTR pszInterfaceId); SRtrMgrProtocolCB * FindRtrMgrProtocolCB(DWORD dwTransportId, DWORD dwProtocolId);
// Disconnect
void Disconnect();
// Overrides of CWeakRef functions
virtual void OnLastStrongRef(); virtual void ReviveStrongRef();
// Critical section support
CRITICAL_SECTION m_critsec;
// Information for IRouterAdminAccess
BOOL m_fIsAdminInfoSet; CString m_stUserName; CString m_stDomain; BYTE * m_pbPassword; int m_cPassword; };
/*---------------------------------------------------------------------------
Class: RtrMgrInfo ---------------------------------------------------------------------------*/
class RtrMgrInfo : public IRtrMgrInfo, public CWeakRef { public: DeclareIUnknownMembers(IMPL) DeclareIRtrMgrInfoMembers(IMPL)
RtrMgrInfo(DWORD dwTransportId, LPCTSTR pszTransportName, RouterInfo *pRouterInfo); virtual ~RtrMgrInfo();
protected: SRtrMgrCB m_cb; // router-manager control block
PRtrMgrProtocolInfoList m_RmProtList; // list of routing-protocols
// CObList m_protList; // list of routing-protocols
CString m_stMachine; // machine whose config is loaded
HANDLE m_hMachineConfig; // handle to machine's router-config
HANDLE m_hTransport; // handle to transport's config
BOOL m_bDisconnect;
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
// This will contain a weak/strong ref on the parent
IRouterInfo * m_pRouterInfoParent;
//--------------------------------------------------------------------
// Functions: LoadRtrMgrInfo
// SaveRtrMgrInfo
//
// The following handle loading and saving the routing-protocol list
// for the router-manager in the correct format in the registry.
//--------------------------------------------------------------------
HRESULT LoadRtrMgrInfo(HANDLE hMachine, HANDLE hTransport ); HRESULT SaveRtrMgrInfo(HANDLE hMachine, HANDLE hTransport, IInfoBase *pGlobalInfo, IInfoBase *pClientInfo, DWORD dwDeleteProtocolId); HRESULT TryToConnect(LPCWSTR pswzMachine, HANDLE *phMachine); HRESULT TryToGetAllHandles(LPCOLESTR pszMachine, HANDLE *phMachine, HANDLE *phTransport);
// Disconnects this object
void Disconnect(); // Overrides of CWeakRef functions
virtual void OnLastStrongRef(); virtual void ReviveStrongRef(); // Critical section support
CRITICAL_SECTION m_critsec; };
/*---------------------------------------------------------------------------
Class: RtrMgrProtocolInfo ---------------------------------------------------------------------------*/
class RtrMgrProtocolInfo : public IRtrMgrProtocolInfo, public CWeakRef { public: DeclareIUnknownMembers(IMPL) DeclareIRtrMgrProtocolInfoMembers(IMPL)
RtrMgrProtocolInfo(DWORD dwProtocolId, LPCTSTR lpszId, DWORD dwTransportId, LPCTSTR lpszRm, RtrMgrInfo * pRmInfo); virtual ~RtrMgrProtocolInfo(); HRESULT SetCB(const RtrMgrProtocolCB *pcb);
protected: // This will contain a weak/strong ref on the parent
IRtrMgrInfo * m_pRtrMgrInfoParent; SRtrMgrProtocolCB m_cb; // protocol control block
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
// Disconnect
void Disconnect(); // Overrides of CWeakRef functions
virtual void OnLastStrongRef(); virtual void ReviveStrongRef(); // Critical section support
CRITICAL_SECTION m_critsec; };
/*---------------------------------------------------------------------------
Class: InterfaceInfo ---------------------------------------------------------------------------*/
class InterfaceInfo : public IInterfaceInfo, public CWeakRef { public: DeclareIUnknownMembers(IMPL) DeclareIInterfaceInfoMembers(IMPL)
InterfaceInfo(LPCTSTR lpszId, DWORD dwIfType, BOOL bEnable, DWORD dwBindFlags, RouterInfo* pRouterInfo); ~InterfaceInfo();
static HRESULT FindInterfaceTitle(LPCTSTR pszMachine, LPCTSTR pszInterface, LPTSTR *ppszTitle);
protected: // CInterfaceInfo m_CInterfaceInfo;
SInterfaceCB m_cb; // interface control block
PRtrMgrInterfaceInfoList m_RmIfList; // list of IRtrMgrInterfaceInfo
// CObList m_rmIfList; // list of CRmInterfaceInfo
CString m_stMachine; // machine whose config is loaded
HANDLE m_hMachineConfig; // handle to machine's config
HANDLE m_hInterface; // handle to interface-config
BOOL m_bDisconnect;
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
IRouterInfo * m_pRouterInfoParent;
HRESULT LoadRtrMgrInterfaceList(); HRESULT TryToConnect(LPCWSTR pszMachine, HANDLE *phMachine); HRESULT TryToGetIfHandle(HANDLE hMachine, LPCWSTR pswzInterface, HANDLE *phInterface);
// Disconnect
void Disconnect(); // Overrides of CWeakRef functions
virtual void OnLastStrongRef(); virtual void ReviveStrongRef(); // Critical section support
CRITICAL_SECTION m_critsec; };
/*---------------------------------------------------------------------------
Class: RtrMgrInterfaceInfo ---------------------------------------------------------------------------*/
class RtrMgrInterfaceInfo : public IRtrMgrInterfaceInfo, public CWeakRef { public: DeclareIUnknownMembers(IMPL) DeclareIRtrMgrInterfaceInfoMembers(IMPL) RtrMgrInterfaceInfo(DWORD dwTransportId, LPCTSTR lpszId, LPCTSTR lpszIfId, DWORD dwIfType, InterfaceInfo * pIfInfo); virtual ~RtrMgrInterfaceInfo();
protected: // CRmInterfaceInfo m_CRmInterfaceInfo;
SRtrMgrInterfaceCB m_cb; // router-manager control block
PRtrMgrProtocolInterfaceInfoList m_RmProtIfList; // CObList m_protList; // list of CRmProtInterfaceInfo
CString m_stMachine; // name of machine
HANDLE m_hMachineConfig; // handle to machine's config
HANDLE m_hInterface; // handle to interface-config
HANDLE m_hIfTransport; // handle to transport-config
BOOL m_bDisconnect;
DWORD m_dwFlags; // state of this interface
AdviseDataList m_AdviseList; // list of advises
IInterfaceInfo * m_pInterfaceInfoParent;
HRESULT LoadRtrMgrInterfaceInfo(HANDLE hMachine, HANDLE hInterface, HANDLE hIfTransport); HRESULT SaveRtrMgrInterfaceInfo(HANDLE hMachine, HANDLE hInterface, HANDLE hIfTransport, IInfoBase *pInterfaceInfoBase, DWORD dwDeleteProtocolId);
HRESULT TryToGetAllHandles(LPCWSTR pszMachine, HANDLE *phMachine, HANDLE *phInterface, HANDLE *phTransport); HRESULT TryToConnect(LPCWSTR pswzMachine, HANDLE *phMachine); HRESULT TryToGetIfHandle(HANDLE hMachine, LPCWSTR pswzInterface, HANDLE *phInterface); // Disconnect
void Disconnect();
// Notification helper functions
HRESULT NotifyOfRmProtIfAdd(IRtrMgrProtocolInterfaceInfo *pRmProtIf, IInterfaceInfo *pParentIf); // Overrides of CWeakRef functions
virtual void OnLastStrongRef(); virtual void ReviveStrongRef(); // Critical section support
CRITICAL_SECTION m_critsec; };
/*---------------------------------------------------------------------------
Class: RtrMgrProtocolInterfaceInfo ---------------------------------------------------------------------------*/
class RtrMgrProtocolInterfaceInfo : public IRtrMgrProtocolInterfaceInfo, public CWeakRef { public: DeclareIUnknownMembers(IMPL) DeclareIRtrMgrProtocolInterfaceInfoMembers(IMPL)
RtrMgrProtocolInterfaceInfo(DWORD dwProtocolId, LPCTSTR pszId, DWORD dwTransportId, LPCTSTR pszRmId, LPCTSTR pszIfId, DWORD dwIfType, RtrMgrInterfaceInfo *pRmIf); virtual ~RtrMgrProtocolInterfaceInfo();
SRtrMgrProtocolInterfaceCB m_cb; // protocol control block
protected: AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
IRtrMgrInterfaceInfo * m_pRtrMgrInterfaceInfoParent; // Disconnect
void Disconnect(); // Overrides of CWeakRef functions
virtual void OnLastStrongRef(); virtual void ReviveStrongRef(); // Critical section support
CRITICAL_SECTION m_critsec; };
#endif
|