//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1997 - 1999
//
//  File:       router.idl
//
//--------------------------------------------------------------------------

// mprsnap.idl : IDL source for MPRSNAP DLLs
//

#ifndef _ROUTER_IDL_
#define _ROUTER_IDL_

import "basetsd.h";
import "wtypes.idl";
import "mprsnap.idl";
import "rrasui.idl";
 
typedef BYTE *	PBYTE;

const ULONG RTR_ID_MAX = 256;
const ULONG RTR_TITLE_MAX = 256;
const ULONG RTR_DEVICE_MAX = 256;
const ULONG RTR_PATH_MAX = 516;
const ULONG VENDOR_NAME_MAX = 256;

// predefined
interface IRouterInfo;
interface IRtrMgrInfo;
interface IRtrMgrProtocolInfo;
interface IInterfaceInfo;
interface IRtrMgrInterfaceInfo;
interface IRtrMgrProtocolInterfaceInfo;


typedef enum
{
	// This flag is used to indicate that the interface exists in the UI
	// and in the router.  This means that it is ok to delete this
	// interface if we have found that it has been deleted (since it
	// should be in sync).  If this flag, is 0, then it exists only on the
	// local machine (usually it has just been created but not persisted)
	// and that if a merge occurs, do not delete this interface.
	// ----------------------------------------------------------------
    RouterSnapin_InSyncWithRouter = 0x00000001,
	RouterSnapin_RASOnly = 0x00000002,		// NT4 non-Steelhead router
    RouterSnapin_IsConfigured = 0x00000004, // is router configured?
    RouterSnapin_Workstation = 0x00000008,  // is this a workstation?
	
} RouterSnapinFlags;

typedef enum
{
	// ----------------------------------------------------------------
    RouterInfo_AddedAsLocal = 0x00000001,	// the router is added as local machine -- 
	
} RouterInfoFlags;

//----------------------------------------------------------------------------
// Struct:      RouterVersionInfo
//
// Router version information.
//----------------------------------------------------------------------------

typedef struct _RouterVersionInfo
{
	DWORD	dwSize;
	DWORD	dwRouterVersion;
	DWORD	dwOsMajorVersion;
	DWORD	dwOsMinorVersion;
	DWORD	dwOsBuildNo;
	DWORD	dwOsServicePack;
	DWORD	dwOsFlags;
    DWORD   dwRouterFlags;
} RouterVersionInfo;

//----------------------------------------------------------------------------
// Struct:      RouterCB
//
// Contains information applying to the router as a whole
//----------------------------------------------------------------------------

typedef struct _RouterCB
{
	DWORD	dwLANOnlyMode;		// 0 or 1
} RouterCB;

//----------------------------------------------------------------------------
// Struct:      RtrMgrCB
//
// Contains information applying to a particular router-manager
//----------------------------------------------------------------------------

typedef struct _RtrMgrCB
{
    DWORD       dwTransportId;			// e.g. PID_IP (mprapi.h)
	OLECHAR		szId [RTR_ID_MAX+1];		// e.g. "Tcpip"
	OLECHAR		szTitle [RTR_TITLE_MAX+1];	// e.g. "TCP/IP Router Manager"
	OLECHAR		szDLLPath [RTR_PATH_MAX+1];	// e.g. "%systemroot%\system32\iprtrmgr.dll"
} RtrMgrCB;

/*---------------------------------------------------------------------------
	IEnumRtrMgrCB
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB0F-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumRtrMgrCB : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [in,out]	RtrMgrCB *pBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumRtrMgrCB **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumRtrMgrCBMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, RtrMgrCB *pBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumRtrMgrCB **ppBlockEnum) IPURE; \\")
cpp_quote("")



//----------------------------------------------------------------------------
// Struct:      RtrMgrProtocolCB
//
// Contains information describing a routing protocol.
//----------------------------------------------------------------------------

typedef struct _RtrMgrProtocolCB
{
    DWORD   dwProtocolId;       // e.g. IP_RIP (routprot.h)
    OLECHAR	szId [RTR_ID_MAX+1];	// e.g. "IPRIP"
    DWORD   dwFlags;
    DWORD   dwTransportId;      // e.g. PID_IP
    OLECHAR	szRtrMgrId [RTR_ID_MAX+1];         // e.g. "Tcpip"
    OLECHAR	szTitle [RTR_TITLE_MAX+1];         // e.g. "RIP for Internet Protocol"
    OLECHAR	szDLLName [RTR_PATH_MAX+1];			// e.g. "iprip2.dll"
	OLECHAR szVendorName[VENDOR_NAME_MAX+1];
	GUID	guidConfig;			// GUID for the configuration object
	GUID	guidAdminUI;		// GUID of the snapin
} RtrMgrProtocolCB;

typedef enum {
    RtrMgrProtocolCBFlagHidden = 0x00000001,
	RtrMgrProtocolSupportsRouting = 0x00000002,
} RtrMgrProtocolCBFlags;

/*---------------------------------------------------------------------------
	IEnumRtrMgrProtocolCB
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB10-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumRtrMgrProtocolCB : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	RtrMgrProtocolCB *ppBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumRtrMgrProtocolCB **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumRtrMgrProtocolCBMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, RtrMgrProtocolCB *pBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumRtrMgrProtocolCB **ppBlockEnum) IPURE; \\")
cpp_quote("")




//----------------------------------------------------------------------------
// Struct:      InterfaceCB
//
// Contains transport-independent information applying to a interface
//----------------------------------------------------------------------------

typedef struct _InterfaceCB
{
    OLECHAR	szId [RTR_ID_MAX+1];   // e.g. "EPRO1"
    DWORD   dwIfType;           // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
    BOOL    bEnable;            // e.g. Enabled or Disabled

	// On NT4, the szTitle == szDevice
	// On NT5, szTitle == friendly name, szDevice == "[1] Intel EtherPro"
	OLECHAR	szTitle [RTR_TITLE_MAX+1]; // e.g. see above
	OLECHAR szDevice[RTR_DEVICE_MAX+1];// e.g. see above


    // Tells us what protocols are bound to this interface
    // If the transport is not bound to the adapter, then we don't
    // let the adapter be added to that router-manager.
    DWORD   dwBindFlags;        // e.g. InterfaceCB_BindToIp
} InterfaceCB;

typedef enum {
    InterfaceCB_BindToIp = 0x00000001,
    InterfaceCB_BindToIpx = 0x00000002,
} InterfaceCBBindFlags;


/*---------------------------------------------------------------------------
	IEnumInterfaceCB
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB11-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumInterfaceCB : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	InterfaceCB *pBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumInterfaceCB **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumInterfaceCBMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, InterfaceCB *pBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumInterfaceCB **ppBlockEnum) IPURE; \\")
cpp_quote("")



//----------------------------------------------------------------------------
// Struct:      RtrMgrInterfaceCB
//
// Contains router-manager-specific information for an interface
//----------------------------------------------------------------------------

typedef struct _RtrMgrInterfaceCB
{
    DWORD       dwTransportId;      // e.g. PID_IP (mprapi.h)
    OLECHAR		szId [RTR_ID_MAX+1];   // e.g. "Tcpip"
	OLECHAR		szInterfaceId [RTR_ID_MAX+1];	// e.g. "EPRO1"
    DWORD       dwIfType;           // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
	OLECHAR		szTitle [RTR_TITLE_MAX+1]; // e.g. "[1] Intel Etherexpress PRO"
} RtrMgrInterfaceCB;

/*---------------------------------------------------------------------------
	IEnumRtrMgrInterfaceCB
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB12-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumRtrMgrInterfaceCB : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	RtrMgrInterfaceCB *pBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumRtrMgrInterfaceCB **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumRtrMgrInterfaceCBMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, RtrMgrInterfaceCB *pBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumRtrMgrInterfaceCB **ppBlockEnum) IPURE; \\")
cpp_quote("")




//----------------------------------------------------------------------------
// Struct:      RtrMgrProtocolInterfaceCB
//
// contains routing-protocol-specific information for an interface
//----------------------------------------------------------------------------

typedef struct RtrMgrProtocolInterfaceCB
{
    DWORD   dwProtocolId;       // e.g. IP_RIP (routprot.h)
	OLECHAR	szId [RTR_ID_MAX+1];	// e.g. "IPRIP"
    DWORD   dwTransportId;      // e.g. PID_IP
    OLECHAR	szRtrMgrId [RTR_TITLE_MAX+1];	// e.g. "Tcpip"
    OLECHAR	szInterfaceId [RTR_ID_MAX+1];  // e.g. "EPRO1"
    DWORD   dwIfType;           // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
	OLECHAR	szTitle [RTR_TITLE_MAX+1];	// e.g. "[1] Intel Etherexpress PRO"
} RtrMgrProtocolInterfaceCB;


/*---------------------------------------------------------------------------
	IEnumRtrMgrProtocolInterfaceCB
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB13-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumRtrMgrProtocolInterfaceCB : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	RtrMgrProtocolInterfaceCB *pBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumRtrMgrProtocolInterfaceCB **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumRtrMgrProtocolInterfaceCBMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, RtrMgrProtocolInterfaceCB *pBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumRtrMgrProtocolInterfaceCB **ppBlockEnum) IPURE; \\")
cpp_quote("")



/*---------------------------------------------------------------------------
	Misc. things for the refresh object
 ---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------
	IRouterRefreshModify
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(66A2DB1D-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]

interface IRouterRefreshModify : IUnknown
{
	import "unknwn.idl";
    
	// to make it refresh multiple routers
	HRESULT	AddRouterObject([in] REFCLSID riid,
                            [in, iid_is(riid)] IUnknown *pUnk);
	HRESULT	RemoveRouterObject([in] REFCLSID riid,
                               [in, iid_is(riid)] IUnknown *pUnk);
}

cpp_quote("#define DeclareIRouterRefreshModifyMembers(IPURE)\\")
cpp_quote("	STDMETHOD(AddRouterObject)(THIS_ REFIID riid, IUnknown *pUnk) IPURE;\\")
cpp_quote("	STDMETHOD(RemoveRouterObject)(THIS_ REFIID rrid, IUnknown *pUnk) IPURE;\\")

/*---------------------------------------------------------------------------
	These are additional values that are used in the OnChange.
 ---------------------------------------------------------------------------*/
cpp_quote("// Valid values for dwChangeType of OnChange")
cpp_quote("//efine ROUTER_REFRESH       0 - defined in rrasui.idl")
cpp_quote("#define ROUTER_DATA_CHANGE	16")
cpp_quote("#define ROUTER_DATA_DELETE	17")
cpp_quote("#define ROUTER_CHILD_ADD		18")
cpp_quote("#define ROUTER_CHILD_DELETE	19")
cpp_quote("#define ROUTER_CHILD_PREADD	20")

cpp_quote("// Valid values for dwObjectType of OnChange")
cpp_quote("#define ROUTER_OBJ_Router		1")
cpp_quote("#define ROUTER_OBJ_Rm			2")
cpp_quote("#define ROUTER_OBJ_RmProt		3")
cpp_quote("#define ROUTER_OBJ_If			4")
cpp_quote("#define ROUTER_OBJ_RmIf			5")
cpp_quote("#define ROUTER_OBJ_RmProtIf		6")


/*---------------------------------------------------------------------------
	IRtrMgrProtocolInfo
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(66A2DB06-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]

interface IRtrMgrProtocolInfo : IUnknown
{
	import "unknwn.idl";

	DWORD		GetFlags();
	HRESULT		SetFlags([in] DWORD dwFlags);
	
	DWORD		GetProtocolId();
	LPCOLESTR	GetTitle();
	DWORD		GetTransportId();
	HRESULT		CopyCB([in,out] RtrMgrProtocolCB *pRMProtCB);

	HRESULT		GetParentRtrMgrInfo([out] IRtrMgrInfo **ppRm);
	HRESULT		SetParentRtrMgrInfo([in] IRtrMgrInfo *pRm);
	
	HRESULT	RtrAdvise([in] IRtrAdviseSink *pRtrAdviseSink,
					  [out] LONG_PTR *pulConnection,
					  [in] LPARAM lUserParam);
	HRESULT RtrNotify([in] DWORD dwChangeType, [in] DWORD dwObjectType,
					 [in] LPARAM lParam);
	HRESULT RtrUnadvise([in] LONG_PTR ulConnection);

 	// Tell the object that it should remove all connections to the
	// running router
	HRESULT	DoDisconnect();

	HRESULT	AddWeakRef();
	HRESULT	ReleaseWeakRef();
	HRESULT	Destruct();
};

cpp_quote("#define DeclareIRtrMgrProtocolInfoMembers(IPURE)\\")
cpp_quote("	STDMETHOD_(DWORD, GetFlags)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) IPURE; \\")
cpp_quote("	STDMETHOD_(DWORD, GetProtocolId)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetTitle)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD_(DWORD, GetTransportId)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(CopyCB)(THIS_ RtrMgrProtocolCB *pRMProtCB) IPURE; \\")
cpp_quote("	STDMETHOD(GetParentRtrMgrInfo)(THIS_ IRtrMgrInfo **ppRm) IPURE; \\")
cpp_quote("	STDMETHOD(SetParentRtrMgrInfo)(THIS_ IRtrMgrInfo *pRm) IPURE; \\")
cpp_quote("	STDMETHOD(RtrAdvise)(THIS_ IRtrAdviseSink *pRtrAdviseSink,\\")
cpp_quote("		LONG_PTR *pulConnection, LPARAM lUserParam) IPURE; \\")
cpp_quote("	STDMETHOD(RtrNotify)(THIS_ DWORD dwChangeType, DWORD objtype, LPARAM lParam) IPURE;\\")
cpp_quote("	STDMETHOD(RtrUnadvise)(THIS_ LONG_PTR ulConnection) IPURE; \\")
cpp_quote("	STDMETHOD(DoDisconnect)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(AddWeakRef)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseWeakRef)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Destruct)(THIS) IPURE; \\")
cpp_quote("")

/*---------------------------------------------------------------------------
	IEnumRtrMgrProtocolInfo
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB07-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumRtrMgrProtocolInfo : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	IRtrMgrProtocolInfo **ppBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumRtrMgrProtocolInfo **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumRtrMgrProtocolInfoMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, IRtrMgrProtocolInfo **ppBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumRtrMgrProtocolInfo **ppBlockEnum) IPURE; \\")
cpp_quote("")




/*---------------------------------------------------------------------------
	IRtrMgrInfo
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(66A2DB04-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]

interface IRtrMgrInfo : IUnknown
{
	import "unknwn.idl";

	DWORD		GetFlags();
	HRESULT		SetFlags([in] DWORD dwFlags);
	
	HRESULT	Load([in,string]	LPCOLESTR         pszMachine,
				 [in]	HANDLE          hMachine,
				 [in]	HANDLE          hTransport
				 );


	HRESULT Save([in,string]	LPCOLESTR		pszMachine,
				 [in]   HANDLE          hMachine,
				 [in]   HANDLE          hTransport,
				 [in]   IInfoBase *		pGlobalInfo,
				 [in]   IInfoBase *     pClientInfo,
				 [in]   DWORD           dwDeleteProtocolId);
	
	
	HRESULT Unload( );
	

	HRESULT Delete([in,string]	LPCOLESTR	pszMachine,
				   [in] HANDLE      hMachine);
		
	HRESULT	SetInfoBase([in]	IInfoBase*      pGlobalInfo,
						[in]	IInfoBase*      pClientInfo );
	HRESULT GetInfoBase([in] HANDLE hMachine,
						[in] HANDLE hTransport,
						[out] IInfoBase ** ppGlobalInfo,
						[out] IInfoBase ** ppClientInfo);


 	HRESULT	Merge([in] IRtrMgrInfo *pNewRtrMgrInfo);
	
	DWORD		GetTransportId();
	LPCOLESTR	GetTitle();

	LPCOLESTR	GetId();
	HRESULT		SetId(LPCOLESTR pszId);

	HRESULT	CopyRtrMgrCB([in,out] RtrMgrCB *pRMCB);
	

	LPCOLESTR	GetMachineName();

	HRESULT	EnumRtrMgrProtocol([out] IEnumRtrMgrProtocolInfo ** ppEnumRMProt);
	HRESULT FindRtrMgrProtocol([in] DWORD dwProtocolId,
							   [out] IRtrMgrProtocolInfo **ppRMProtInfo);
	
	HRESULT AddRtrMgrProtocol([in] IRtrMgrProtocolInfo *pInfo,
							  [in] IInfoBase * pGlobalInfo,
							  [in] IInfoBase * pClientInfo);

	HRESULT DeleteRtrMgrProtocol([in] DWORD dwProtocolId, BOOL fRemove);
	HRESULT ReleaseRtrMgrProtocol([in] DWORD dwProtocolId);
   
	
	HRESULT	RtrAdvise([in] IRtrAdviseSink *pRtrAdviseSink,
					  [out] LONG_PTR *pulConnection,
					  [in] LPARAM lUserParam);
	HRESULT RtrNotify([in] DWORD dwChangeType, [in] DWORD dwObjectType,
					 [in] LPARAM lParam);
	HRESULT RtrUnadvise([in] LONG_PTR ulConnection);

	HRESULT	GetParentRouterInfo([out] IRouterInfo **ppRouterInfo);
	HRESULT SetParentRouterInfo([in] IRouterInfo *pRouterInfo);
	
 	// Tell the object that it should remove all connections to the
	// running router
	HRESULT	DoDisconnect();

	HRESULT	AddWeakRef();
	HRESULT	ReleaseWeakRef();
	HRESULT	Destruct();
};

cpp_quote("#define DeclareIRtrMgrInfoMembers(IPURE) \\")
cpp_quote("	STDMETHOD_(DWORD, GetFlags)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) IPURE; \\")
cpp_quote("	STDMETHOD(Load)(THIS_ LPCOLESTR pszMachine, \\")
cpp_quote("					HANDLE hMachine, \\")
cpp_quote("					HANDLE hTransport) IPURE;\\")
cpp_quote("	STDMETHOD(Save)(THIS_ LPCOLESTR pszMachine, \\")
cpp_quote("					HANDLE hMachine, \\")
cpp_quote("					HANDLE hTransport, \\")
cpp_quote("					IInfoBase *pGlobalInfo, \\")
cpp_quote("					IInfoBase *pClientInfo, \\")
cpp_quote("					DWORD dwDeleteProtocolId) IPURE; \\")
cpp_quote("	STDMETHOD(Unload)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Delete)(THIS_ LPCOLESTR pszMachine, HANDLE hMachine) IPURE; \\")
cpp_quote("	STDMETHOD(SetInfoBase)(THIS_ IInfoBase *pGlobalInfo, \\")
cpp_quote("						   IInfoBase *pClientInfo) IPURE; \\")
cpp_quote("	STDMETHOD(GetInfoBase)(THIS_ HANDLE hMachine, \\")
cpp_quote("							HANDLE hTransport, \\")
cpp_quote("							IInfoBase **ppGlobalInfo, \\")
cpp_quote("							IInfoBase **ppClientInfo) IPURE; \\")
cpp_quote("	STDMETHOD(Merge)(THIS_ IRtrMgrInfo *pNewRtrMgrInfo) IPURE; \\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetId)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(SetId)(THIS_ LPCOLESTR pszId) IPURE; \\")
cpp_quote("	STDMETHOD_(DWORD, GetTransportId)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetTitle)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(CopyRtrMgrCB)(THIS_ RtrMgrCB *pRMCB) IPURE; \\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetMachineName)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(EnumRtrMgrProtocol)(THIS_ IEnumRtrMgrProtocolInfo **ppEnumRMProt) IPURE; \\")
cpp_quote("	STDMETHOD(FindRtrMgrProtocol)(THIS_ DWORD dwProtocolId, \\")
cpp_quote("						IRtrMgrProtocolInfo **ppRMProtInfo) IPURE; \\")
cpp_quote("	STDMETHOD(AddRtrMgrProtocol)(THIS_ IRtrMgrProtocolInfo *pInfo, \\")
cpp_quote("								 IInfoBase *pGlobalInfo, \\")
cpp_quote("								 IInfoBase *pClientInfo) IPURE; \\")
cpp_quote("	STDMETHOD(DeleteRtrMgrProtocol)(THIS_ DWORD dwProtocolId, BOOL fRemove) IPURE; \\")
cpp_quote("	STDMETHOD(ReleaseRtrMgrProtocol)(THIS_ DWORD dwProtocolId) IPURE; \\")
cpp_quote("	STDMETHOD(RtrAdvise)(THIS_ IRtrAdviseSink *pRtrAdviseSink,\\")
cpp_quote("		LONG_PTR *pulConnection, LPARAM lUserParam) IPURE; \\")
cpp_quote("	STDMETHOD(RtrNotify)(THIS_ DWORD dwChangeType, DWORD objtype, LPARAM lParam) IPURE;\\")
cpp_quote("	STDMETHOD(RtrUnadvise)(THIS_ LONG_PTR ulConnection) IPURE; \\")
cpp_quote("	STDMETHOD(GetParentRouterInfo)(THIS_ IRouterInfo **ppParent) IPURE;\\")
cpp_quote("	STDMETHOD(SetParentRouterInfo)(THIS_ IRouterInfo *ppParent) IPURE;\\")
cpp_quote("	STDMETHOD(DoDisconnect)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(AddWeakRef)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseWeakRef)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Destruct)(THIS) IPURE; \\")
cpp_quote("")

/*---------------------------------------------------------------------------
	IEnumRtrMgrInfo
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB05-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumRtrMgrInfo : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	IRtrMgrInfo **ppBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumRtrMgrInfo **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumRtrMgrInfoMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, IRtrMgrInfo **ppBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumRtrMgrInfo **ppBlockEnum) IPURE; \\")
cpp_quote("")



/*---------------------------------------------------------------------------
	IRtrMgrProtocolInterfaceInfo
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(66A2DB0C-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]

interface IRtrMgrProtocolInterfaceInfo : IUnknown
{
	import "unknwn.idl";

	DWORD		GetFlags();
	HRESULT		SetFlags([in] DWORD dwFlags);
	
	DWORD	GetProtocolId();
	DWORD	GetTransportId();

	LPCOLESTR	GetInterfaceId();
	DWORD		GetInterfaceType();
	LPCOLESTR	GetTitle();
	HRESULT		SetTitle(LPCOLESTR pszTitle);

	HRESULT	CopyCB([in,out] RtrMgrProtocolInterfaceCB * pRMProtCB);

	
	HRESULT	RtrAdvise([in] IRtrAdviseSink *pRtrAdviseSink,
					  [out] LONG_PTR *pulConnection,
					  [in] LPARAM lUserParam);
	HRESULT RtrNotify([in] DWORD dwChangeType, [in] DWORD dwObjectType, [in] LPARAM lParam);
	HRESULT RtrUnadvise([in] LONG_PTR ulConnection);

	HRESULT GetParentRtrMgrInterfaceInfo([out] IRtrMgrInterfaceInfo **ppParent);
	HRESULT SetParentRtrMgrInterfaceInfo([in] IRtrMgrInterfaceInfo *pParent);
	
 	// Tell the object that it should remove all connections to the
	// running router
	HRESULT	DoDisconnect();

	HRESULT	AddWeakRef();
	HRESULT	ReleaseWeakRef();
	HRESULT	Destruct();
};

cpp_quote("#define DeclareIRtrMgrProtocolInterfaceInfoMembers(IPURE) \\")
cpp_quote("	STDMETHOD_(DWORD, GetFlags)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) IPURE; \\")
cpp_quote("	STDMETHOD_(DWORD, GetProtocolId)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD_(DWORD, GetTransportId)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetInterfaceId)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD_(DWORD, GetInterfaceType)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetTitle)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(SetTitle)(THIS_ LPCOLESTR pszTitle) IPURE;\\")
cpp_quote("	STDMETHOD(CopyCB)(THIS_ RtrMgrProtocolInterfaceCB *pRMProtCB) IPURE; \\")
cpp_quote("	STDMETHOD(RtrAdvise)(THIS_ IRtrAdviseSink *pRtrAdviseSink,\\")
cpp_quote("		LONG_PTR *pulConnection, LPARAM lUserParam) IPURE; \\")
cpp_quote("	STDMETHOD(RtrNotify)(THIS_ DWORD dwChangeType, DWORD objtype, LPARAM lParam) IPURE;\\")
cpp_quote("	STDMETHOD(RtrUnadvise)(THIS_ LONG_PTR ulConnection) IPURE; \\")
cpp_quote("	STDMETHOD(GetParentRtrMgrInterfaceInfo)(THIS_ IRtrMgrInterfaceInfo **ppParent) IPURE;\\")
cpp_quote("	STDMETHOD(SetParentRtrMgrInterfaceInfo)(THIS_ IRtrMgrInterfaceInfo *pParent) IPURE;\\")
cpp_quote("	STDMETHOD(DoDisconnect)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(AddWeakRef)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseWeakRef)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Destruct)(THIS) IPURE; \\")
cpp_quote(" ")

/*---------------------------------------------------------------------------
	IEnumRtrMgrProtocolInterfaceInfo
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB0D-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumRtrMgrProtocolInterfaceInfo : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	IRtrMgrProtocolInterfaceInfo **ppBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumRtrMgrProtocolInterfaceInfo **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumRtrMgrProtocolInterfaceInfoMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, IRtrMgrProtocolInterfaceInfo **ppBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumRtrMgrProtocolInterfaceInfo **ppBlockEnum) IPURE; \\")
cpp_quote("")




/*---------------------------------------------------------------------------
	IRtrMgrInterfaceInfo
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(66A2DB0A-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]

interface IRtrMgrInterfaceInfo : IUnknown
{
	import "unknwn.idl";

	DWORD		GetFlags();
	HRESULT		SetFlags([in] DWORD dwFlags);
	
	HRESULT Load([in,string]      LPCOLESTR   pszMachine,
				 [in]      HANDLE      hMachine,
				 [in]      HANDLE      hInterface,
				 [in]      HANDLE      hIfTransport);
	

	HRESULT Save(
			   [in,string]      LPCOLESTR     pszMachine,
			   [in]      HANDLE      hMachine,
			   [in]      HANDLE      hInterface,
			   [in]      HANDLE      hIfTransport,
			   [in]      IInfoBase*  pInterfaceInfo,
			   [in]      DWORD       dwDeleteProtocolId);
	
	HRESULT Unload( );

	HRESULT Delete([in, string]      LPCOLESTR     pszMachine,
				 [in]      HANDLE      hMachine,
				 [in]      HANDLE      hInterface);
	

 	HRESULT	Merge([in] IRtrMgrInterfaceInfo *pNewRtrMgrInterfaceInfo);
	
	HRESULT SetInfo([in] DWORD dwIfInfoSize,
					[in, size_is(dwIfInfoSize)] PBYTE pInterfaceInfoData);
	
	HRESULT SetInfoBase([in] HANDLE hMachine,
						[in] HANDLE hInterface,
						[in] HANDLE hIfTransport,
						[in] IInfoBase *pIfInfo);
	HRESULT GetInfoBase([in] HANDLE hMachine,
						[in] HANDLE hInterface,
						[in] HANDLE hIfTransport,
						[out] IInfoBase **ppIfInfo);

	DWORD		GetTransportId();

	LPCOLESTR	GetId();
	HRESULT		SetId(LPCOLESTR pszId);
	
	// Information about the interface
	LPCOLESTR	GetInterfaceId();
	DWORD		GetInterfaceType();
	
	LPCOLESTR	GetTitle();
	HRESULT		SetTitle(LPCOLESTR pszTitle);
	
	HRESULT		CopyCB([in,out] RtrMgrInterfaceCB *pRMIfCB);
	
	LPCOLESTR	GetMachineName();
	HRESULT		SetMachineName(LPCOLESTR pszMachineName);
	
	HRESULT		EnumRtrMgrProtocolInterface([out] IEnumRtrMgrProtocolInterfaceInfo **ppEnumRmProtIf);


	HRESULT		FindRtrMgrProtocolInterface([in] DWORD dwProtocolId,
						   [out] IRtrMgrProtocolInterfaceInfo **pInfo);

	HRESULT	AddRtrMgrProtocolInterface([in] IRtrMgrProtocolInterfaceInfo *pInfo,
										  [in] IInfoBase *pInterfaceInfo);

	HRESULT DeleteRtrMgrProtocolInterface([in] DWORD dwProtocolId, BOOL fRemove);
	HRESULT ReleaseRtrMgrProtocolInterface([in] DWORD dwProtocolId);

	
	HRESULT	RtrAdvise([in] IRtrAdviseSink *pRtrAdviseSink,
					  [out] LONG_PTR *pulConnection,
					  [in] LPARAM lUserParam);
	HRESULT RtrNotify([in] DWORD dwChangeType, [in] DWORD dwObjectType, [in] LPARAM lParam);
	HRESULT RtrUnadvise([in] LONG_PTR ulConnection);

	HRESULT GetParentInterfaceInfo([out] IInterfaceInfo **ppParent);
	HRESULT SetParentInterfaceInfo([in] IInterfaceInfo *pParent);
	
 	// Tell the object that it should remove all connections to the
	// running router
	HRESULT	DoDisconnect();

	HRESULT	AddWeakRef();
	HRESULT	ReleaseWeakRef();
	HRESULT	Destruct();
};

cpp_quote("#define DeclareIRtrMgrInterfaceInfoMembers(IPURE)\\")
cpp_quote("	STDMETHOD_(DWORD, GetFlags)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) IPURE;\\")
cpp_quote("	STDMETHOD(Load)(THIS_ LPCOLESTR pszMachine,\\")
cpp_quote("					HANDLE hMachine,\\")
cpp_quote("					HANDLE hInterface,\\")
cpp_quote("					HANDLE hIfTransport) IPURE;\\")
cpp_quote("	STDMETHOD(Save)(THIS_ LPCOLESTR pszMachine,\\")
cpp_quote("					HANDLE hMachine,\\")
cpp_quote("					HANDLE hInterface,\\")
cpp_quote("					HANDLE hIfTransport,\\")
cpp_quote("					IInfoBase *pInterfaceInfo,\\")
cpp_quote("					DWORD dwProtocolId) IPURE;\\")
cpp_quote("	STDMETHOD(Unload)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(Delete)(THIS_ LPCOLESTR pszMachine,\\")
cpp_quote("					  HANDLE hMachine,\\")
cpp_quote("					  HANDLE hInterface) IPURE;\\")
cpp_quote("	STDMETHOD(Merge)(THIS_ IRtrMgrInterfaceInfo *pNewRtrMgrInterfaceInfo) IPURE; \\")
cpp_quote("	STDMETHOD(SetInfo)(THIS_ DWORD dwIfInfoSize,\\")
cpp_quote("					   PBYTE pInterfaceInfoData) IPURE;\\")
cpp_quote("	STDMETHOD(SetInfoBase)(THIS_ \\")
cpp_quote("						HANDLE hMachine,\\")
cpp_quote("						HANDLE hInterface,\\")
cpp_quote("						HANDLE hIfTransport,\\")
cpp_quote("						IInfoBase *pInfoBase) IPURE;\\")
cpp_quote("	STDMETHOD(GetInfoBase)(THIS_ \\")
cpp_quote("						HANDLE hMachine,\\")
cpp_quote("						HANDLE hInterface,\\")
cpp_quote("						HANDLE hIfTransport,\\")
cpp_quote("						IInfoBase **ppInfoBase) IPURE;\\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetId)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(SetId)(THIS_ LPCOLESTR pszId) IPURE;\\")
cpp_quote("	STDMETHOD_(DWORD, GetTransportId)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetInterfaceId)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD_(DWORD, GetInterfaceType)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetTitle)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(SetTitle)(THIS_ LPCOLESTR pszTitle) IPURE;\\")
cpp_quote("	STDMETHOD(CopyCB)(THIS_ RtrMgrInterfaceCB *pRMIfCB)IPURE;\\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetMachineName)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(SetMachineName)(THIS_ LPCOLESTR pszMachineName) IPURE;\\")
cpp_quote("	STDMETHOD(EnumRtrMgrProtocolInterface)(THIS_ IEnumRtrMgrProtocolInterfaceInfo **ppEnumRmProtIf) IPURE;\\")
cpp_quote("	STDMETHOD(FindRtrMgrProtocolInterface)(THIS_ DWORD dwProtocolId,\\")
cpp_quote("		IRtrMgrProtocolInterfaceInfo **ppInfo) IPURE;\\")
cpp_quote("	STDMETHOD(AddRtrMgrProtocolInterface)(THIS_ IRtrMgrProtocolInterfaceInfo *pInfo,\\")
cpp_quote("										  IInfoBase *pIfInfo) IPURE;\\")
cpp_quote("	STDMETHOD(DeleteRtrMgrProtocolInterface)(THIS_ DWORD dwProtocolId, BOOL fRemove) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseRtrMgrProtocolInterface)(THIS_ DWORD dwProtocolId) IPURE;\\")
cpp_quote("	STDMETHOD(RtrAdvise)(THIS_ IRtrAdviseSink *pRtrAdviseSink,\\")
cpp_quote("		LONG_PTR *pulConnection, LPARAM lUserParam) IPURE; \\")
cpp_quote("	STDMETHOD(RtrNotify)(THIS_ DWORD dwChangeType, DWORD objtype, LPARAM lParam) IPURE;\\")
cpp_quote("	STDMETHOD(RtrUnadvise)(THIS_ LONG_PTR ulConnection) IPURE; \\")
cpp_quote("	STDMETHOD(GetParentInterfaceInfo)(THIS_ IInterfaceInfo **ppParent) IPURE;\\")
cpp_quote("	STDMETHOD(SetParentInterfaceInfo)(THIS_ IInterfaceInfo *pParent) IPURE;\\")
cpp_quote("	STDMETHOD(DoDisconnect)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(AddWeakRef)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseWeakRef)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Destruct)(THIS) IPURE; \\")
cpp_quote("	")


/*---------------------------------------------------------------------------
	IEnumRtrMgrInterfaceInfo
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB0B-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumRtrMgrInterfaceInfo : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	IRtrMgrInterfaceInfo **ppBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumRtrMgrInterfaceInfo **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumRtrMgrInterfaceInfoMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, IRtrMgrInterfaceInfo **ppBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumRtrMgrInterfaceInfo **ppBlockEnum) IPURE; \\")
cpp_quote("")






/*---------------------------------------------------------------------------
	IInterfaceInfo
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(66A2DB08-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]

interface IInterfaceInfo : IUnknown
{
	import "unknwn.idl";
	
	DWORD		GetFlags();
	HRESULT		SetFlags([in] DWORD dwFlags);
	
	HRESULT Load([in, string]   LPCOLESTR   pszMachine,
				 [in]   HANDLE      hMachine,
				 [in]   HANDLE      hInterface);

	HRESULT Save([in,string]      LPCOLESTR     pszMachine,
				 [in]      HANDLE      hMachine,
				 [in]      HANDLE      hInterface);


	HRESULT	Delete([in,string] LPCOLESTR     pszMachine,
				   [in]      HANDLE      hMachine);


	HRESULT Unload( );

 	HRESULT	Merge([in] IInterfaceInfo *pNewInterfaceInfo);

	// These can't be changed
	LPCOLESTR	GetId();
	DWORD		GetInterfaceType();
	LPCOLESTR	GetDeviceName();
	
	LPCOLESTR	GetTitle();
	HRESULT		SetTitle([in] LPCOLESTR pszTitle);

	
	BOOL		IsInterfaceEnabled();
	HRESULT		SetInterfaceEnabledState([in] BOOL bEnabled);
	
	HRESULT		CopyCB([in,out] InterfaceCB *pifcb);
	
	LPCOLESTR	GetMachineName();
	HRESULT		SetMachineName([in] LPCOLESTR pszMachine);

	HRESULT		EnumRtrMgrInterface([out] IEnumRtrMgrInterfaceInfo **ppEnumRMIf);
	HRESULT		AddRtrMgrInterface([in] IRtrMgrInterfaceInfo *pInfo,
								   [in] IInfoBase *pInterfaceInfo);
	HRESULT		DeleteRtrMgrInterface([in] DWORD dwTransportId, BOOL fRemove);
	HRESULT		ReleaseRtrMgrInterface([in] DWORD dwTransportId);
	HRESULT		FindRtrMgrInterface([in] DWORD dwTransportId,
								   [out] IRtrMgrInterfaceInfo **ppInfo);
	
	HRESULT	RtrAdvise([in] IRtrAdviseSink *pRtrAdviseSink,
					  [out] LONG_PTR *pulConnection,
					  [in] LPARAM lUserParam);
	HRESULT RtrNotify([in] DWORD dwChangeType, [in] DWORD dwObjectType,
					  [in] LPARAM lParam);
	HRESULT RtrUnadvise([in] LONG_PTR ulConnection);

	HRESULT	GetParentRouterInfo([out] IRouterInfo **ppRouterInfo);
	HRESULT	SetParentRouterInfo([in] IRouterInfo *pRouterInfo);

 	// Tell the object that it should remove all connections to the
	// running router
	HRESULT	DoDisconnect();

	HRESULT	AddWeakRef();
	HRESULT	ReleaseWeakRef();
	HRESULT	Destruct();
};

cpp_quote("#define DeclareIInterfaceInfoMembers(IPURE)\\")
cpp_quote("	STDMETHOD_(DWORD, GetFlags)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) IPURE; \\")
cpp_quote("	STDMETHOD(Load)(THIS_ LPCOLESTR   pszMachine,\\")
cpp_quote("				 HANDLE      hMachine,\\")
cpp_quote("				 HANDLE      hInterface) IPURE;\\")
cpp_quote("	STDMETHOD(Save)(THIS_ LPCOLESTR     pszMachine,\\")
cpp_quote("				 HANDLE      hMachine,\\")
cpp_quote("				 HANDLE      hInterface) IPURE;\\")
cpp_quote("	STDMETHOD(Delete)(THIS_ LPCOLESTR     pszMachine,\\")
cpp_quote("				   HANDLE      hMachine) IPURE;\\")
cpp_quote("	STDMETHOD(Unload)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(Merge)(THIS_ IInterfaceInfo *pNewInterfaceInfo) IPURE; \\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetId)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD_(DWORD, GetInterfaceType)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetDeviceName)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetTitle)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(SetTitle)(THIS_ LPCOLESTR pszTitle) IPURE;\\")
cpp_quote("	STDMETHOD_(BOOL, IsInterfaceEnabled)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(SetInterfaceEnabledState)(THIS_ BOOL bEnabled) IPURE;\\")
cpp_quote("	STDMETHOD(CopyCB)(THIS_ InterfaceCB *pifcb) IPURE;\\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetMachineName)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(SetMachineName)(THIS_ LPCOLESTR pszMachineName) IPURE;\\")
cpp_quote("	STDMETHOD(EnumRtrMgrInterface)(THIS_ IEnumRtrMgrInterfaceInfo **ppEnumRMIf) IPURE;\\")
cpp_quote("	STDMETHOD(AddRtrMgrInterface)(THIS_  IRtrMgrInterfaceInfo *pInfo,\\")
cpp_quote("									IInfoBase *pInterfaceInfo) IPURE;\\")
cpp_quote("	STDMETHOD(DeleteRtrMgrInterface)(THIS_  DWORD dwTransportId, BOOL fRemove) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseRtrMgrInterface)(THIS_  DWORD dwTransportId) IPURE;\\")
cpp_quote("	STDMETHOD(FindRtrMgrInterface)(THIS_  DWORD dwTransportId,\\")
cpp_quote("									 IRtrMgrInterfaceInfo **ppInfo) IPURE;\\")
cpp_quote("	STDMETHOD(RtrAdvise)(THIS_ IRtrAdviseSink *pRtrAdviseSink,\\")
cpp_quote("		LONG_PTR *pulConnection, LPARAM lUserParam) IPURE; \\")
cpp_quote("	STDMETHOD(RtrNotify)(THIS_ DWORD dwChangeType, DWORD objtype, LPARAM lParam) IPURE;\\")
cpp_quote("	STDMETHOD(RtrUnadvise)(THIS_ LONG_PTR ulConnection) IPURE; \\")
cpp_quote("	STDMETHOD(GetParentRouterInfo)(THIS_ IRouterInfo **ppRouterInfo) IPURE;\\")
cpp_quote("	STDMETHOD(SetParentRouterInfo)(THIS_ IRouterInfo *pRouterInfo) IPURE;\\")
cpp_quote("	STDMETHOD(DoDisconnect)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(AddWeakRef)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseWeakRef)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Destruct)(THIS) IPURE; \\")
cpp_quote(" ")

/*---------------------------------------------------------------------------
	IEnumInterfaceInfo
 ---------------------------------------------------------------------------*/

[
   object,
   uuid(66A2DB09-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]
   
interface IEnumInterfaceInfo : IUnknown
{
	HRESULT	Next( [in]	ULONG	uNum,
				  [out]	IInterfaceInfo **ppBlock,
				  [out]	ULONG *	pNumReturned );
	
	HRESULT	Skip( [in]	ULONG	uNum );
	
	HRESULT	Reset();
	
	HRESULT	Clone( [out] IEnumInterfaceInfo **ppBlockEnum );
};

cpp_quote("#define DeclareIEnumInterfaceInfoMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Next)(THIS_ ULONG uNum, IInterfaceInfo **ppBlock, \\")
cpp_quote("				   ULONG *pNumReturned) IPURE; \\")
cpp_quote("	STDMETHOD(Skip)(THIS_ ULONG uNum) IPURE; \\")
cpp_quote("	STDMETHOD(Reset)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clone)(THIS_ IEnumInterfaceInfo **ppBlockEnum) IPURE; \\")
cpp_quote("")



/*---------------------------------------------------------------------------
	IRouterAdminAccess
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(66A2DB1F-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]

   
interface IRouterAdminAccess : IUnknown
{
    // Returns TRUE if the SetInfo() has been called, FALSE otherwise
    BOOL        IsAdminInfoSet();

    // Retrieves the component parts of the info
    LPCOLESTR   GetUserName();
    LPCOLESTR   GetDomainName();
    
    // This does NOT allocate space.  Do NOT free this up.
    HRESULT     GetUserPassword(BYTE *pByte, int *pcPassword);

    //
    // Sets the information
    // Note : the cPassword is needed, because the pszPassword should
    // not be in cleartext!
    //
    HRESULT     SetInfo(LPCOLESTR pszName,
                        LPCOLESTR pszDomain,
                        BYTE *pszPassword,
                        int cPassword);

};


cpp_quote("#define DeclareIRouterAdminAccessMembers(IPURE) \\")
cpp_quote(" STDMETHOD_(BOOL, IsAdminInfoSet)(THIS) IPURE;\\")
cpp_quote(" STDMETHOD_(LPCOLESTR, GetUserName)(THIS) IPURE;\\")
cpp_quote(" STDMETHOD_(LPCOLESTR, GetDomainName)(THIS) IPURE;\\")
cpp_quote(" STDMETHOD(GetUserPassword)(THIS_ BYTE *pByte, \\")
cpp_quote("     int *pcPassword) IPURE; \\")
cpp_quote(" STDMETHOD(SetInfo)(THIS_ LPCOLESTR pszName, \\")
cpp_quote("     LPCOLESTR pszDomain,\\")
cpp_quote("     BYTE * pPassword, int cPassword) IPURE;\\")
cpp_quote("")


cpp_quote("// IRouterInfo")
cpp_quote("// To make AutoRefresh to a group of IRouterInfo(s), assign an external Refresh Object")
cpp_quote("// Without setting the ExternalRefreshObject, IRouterInfo will create up reqest by GetRefreshObject")

/*---------------------------------------------------------------------------
	IRouterInfo
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(66A2DB02-D706-11d0-A37B-00C04FC9DA04),
   local,
   pointer_default(unique),
]

interface IRouterInfo : IRouterRefreshAccess
{
	DWORD		GetFlags();
	HRESULT		SetFlags([in] DWORD dwFlags);

	
 	HRESULT	Load([in,string]	LPCOLESTR   pszMachine,
				 [in]   HANDLE      hMachine
				);
				 
	HRESULT	Save([in,string]      LPCOLESTR     pszMachine,
				 [in]      HANDLE      hMachine );
	
	HRESULT	Unload( );
	
	
 	HRESULT	Merge([in] IRouterInfo *pNewRouterInfo);

	HRESULT	SetExternalRefreshObject([in] IRouterRefresh* pRouterRefresh);
	
	
	HRESULT	CopyCB([in,out] RouterCB *pRouterCB);
	
	LPCOLESTR GetMachineName();
	DWORD	GetRouterType();
	HRESULT	GetRouterVersionInfo([out] RouterVersionInfo *pVerInfo);

	HRESULT	EnumRtrMgrCB([out] IEnumRtrMgrCB **ppEnumRtrMgrCB);
	HRESULT EnumInterfaceCB([out] IEnumInterfaceCB **ppEnumInterfaceCB);
	HRESULT EnumRtrMgrProtocolCB([out] IEnumRtrMgrProtocolCB **ppEnumRmProtCB);
	HRESULT EnumRtrMgrInterfaceCB([out] IEnumRtrMgrInterfaceCB **ppEnumRmIfCB);
	HRESULT EnumRtrMgrProtocolInterfaceCB([out] IEnumRtrMgrProtocolInterfaceCB **ppEnumRmProtIfCB);

	
	HRESULT	EnumRtrMgr([out] IEnumRtrMgrInfo **ppEnumRtrMgr);
	HRESULT FindRtrMgr([in] DWORD dwTransportId,
					   [out] IRtrMgrInfo **ppInfo);
	HRESULT AddRtrMgr([in] IRtrMgrInfo *pInfo,
					  [in] IInfoBase *pGlobalInfo,
					  [in] IInfoBase *pClientInfo);
	HRESULT	DeleteRtrMgr([in] DWORD dwTransportId, BOOL fRemove);
    HRESULT ReleaseRtrMgr([in] DWORD dwTransportId);

	HRESULT EnumInterface([out] IEnumInterfaceInfo **ppEnumInterface);
	HRESULT FindInterface([in,string] LPCOLESTR pszInterface,
						  [out] IInterfaceInfo **ppInfo);
	HRESULT	AddInterface([in] IInterfaceInfo *pInfo);
	HRESULT	DeleteInterface([in,string] LPCOLESTR pszInterface, BOOL fRemove);
    HRESULT ReleaseInterface([in, string] LPCOLESTR pszInterface);

	HRESULT	RtrAdvise([in] IRtrAdviseSink *pRtrAdviseSink,
					  [out] LONG_PTR *pulConnection,
					  [in] LPARAM lUserParam);
	HRESULT RtrNotify([in] DWORD dwChangeType, [in] DWORD dwObjectType,
					 [in] LPARAM lParam);
	HRESULT RtrUnadvise([in] LONG_PTR ulConnection);

 	// Tell the object that it should remove all connections to the
	// running router
	HRESULT	DoDisconnect();

	HRESULT	AddWeakRef();
	HRESULT	ReleaseWeakRef();
	HRESULT	Destruct();
};


cpp_quote("#define DeclareIRouterInfoMembers(IPURE)\\")
cpp_quote("	STDMETHOD_(DWORD, GetFlags)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) IPURE; \\")
cpp_quote("	STDMETHOD(Load)(THIS_ LPCOLESTR   pszMachine,\\")
cpp_quote("				   HANDLE      hMachine) IPURE;\\")
cpp_quote("	STDMETHOD(Save)(THIS_ LPCOLESTR     pszMachine,\\")
cpp_quote("				 HANDLE      hMachine ) IPURE;\\")
cpp_quote("	STDMETHOD(Unload)(THIS) IPURE;	\\")
cpp_quote("	STDMETHOD(Merge)(THIS_ IRouterInfo *pNewRouterInfo) IPURE; \\")
cpp_quote("	STDMETHOD(SetExternalRefreshObject)(THIS_ IRouterRefresh *pRefresh) IPURE;\\")
cpp_quote("	STDMETHOD(CopyCB)(THIS_ RouterCB *pRouterCB) IPURE;	\\")
cpp_quote("	STDMETHOD_(LPCOLESTR, GetMachineName)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD_(DWORD, GetRouterType)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(GetRouterVersionInfo)(THIS_ RouterVersionInfo *pVerInfo) IPURE;\\")
cpp_quote("	STDMETHOD(EnumRtrMgrCB)(THIS_ IEnumRtrMgrCB **ppEnumRtrMgrCB) IPURE;\\")
cpp_quote("	STDMETHOD(EnumInterfaceCB)(THIS_ IEnumInterfaceCB **ppEnumInterfaceCB) IPURE;\\")
cpp_quote("	STDMETHOD(EnumRtrMgrProtocolCB)(THIS_ IEnumRtrMgrProtocolCB **ppEnumRmProtCB) IPURE;\\")
cpp_quote("	STDMETHOD(EnumRtrMgrInterfaceCB)(THIS_ IEnumRtrMgrInterfaceCB **ppEnumRmIfCB) IPURE;\\")
cpp_quote("	STDMETHOD(EnumRtrMgrProtocolInterfaceCB)(THIS_ IEnumRtrMgrProtocolInterfaceCB **ppEnumRmProtIfCB) IPURE;\\")
cpp_quote("	STDMETHOD(EnumRtrMgr)(THIS_ IEnumRtrMgrInfo **ppEnumRtrMgr) IPURE;\\")
cpp_quote("	STDMETHOD(FindRtrMgr)(THIS_ DWORD dwTransportId,\\")
cpp_quote("					   IRtrMgrInfo **ppInfo) IPURE;\\")
cpp_quote("	STDMETHOD(AddRtrMgr)(THIS_ IRtrMgrInfo *pInfo,\\")
cpp_quote("					  IInfoBase *pGlobalInfo,\\")
cpp_quote("					  IInfoBase *pClientInfo) IPURE;\\")
cpp_quote("	STDMETHOD(DeleteRtrMgr)(THIS_ DWORD dwTransportId, BOOL fRemove) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseRtrMgr)(THIS_ DWORD dwTransportId) IPURE;\\")
cpp_quote("	STDMETHOD(EnumInterface)(THIS_ IEnumInterfaceInfo **ppEnumInterface) IPURE;\\")
cpp_quote("	STDMETHOD(FindInterface)(THIS_ LPCOLESTR pszInterface,\\")
cpp_quote("						  IInterfaceInfo **ppInfo) IPURE;\\")
cpp_quote("	STDMETHOD(AddInterface)(THIS_ IInterfaceInfo *pInfo) IPURE;\\")
cpp_quote("	STDMETHOD(DeleteInterface)(THIS_ LPCOLESTR pszInterface, BOOL fRemove) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseInterface)(THIS_ LPCOLESTR pszInterface) IPURE;\\")
cpp_quote("	STDMETHOD(RtrAdvise)(THIS_ IRtrAdviseSink *pRtrAdviseSink,\\")
cpp_quote("		LONG_PTR *pulConnection, LPARAM lUserParam) IPURE; \\")
cpp_quote("	STDMETHOD(RtrNotify)(THIS_ DWORD dwChangeType, DWORD objtype, LPARAM lParam) IPURE;\\")
cpp_quote("	STDMETHOD(RtrUnadvise)(THIS_ LONG_PTR ulConnection) IPURE; \\")
cpp_quote("	STDMETHOD(DoDisconnect)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(AddWeakRef)(THIS) IPURE;\\")
cpp_quote("	STDMETHOD(ReleaseWeakRef)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Destruct)(THIS) IPURE; \\")
cpp_quote(" ")



#endif  // _ROUTER_IDL_
