///////////////////////////////////////////////////////////////////////////
//
// Copyright(C) 1997-1998 Microsoft Corporation all rights reserved.
//
// Module:      iaspipeline.idl
//
// Project:     Everest
//
// Description: IAS Pipeline Interfaces
//
// Author:      TLP 1/20/98
//
///////////////////////////////////////////////////////////////////////////

// This file will be processed by the MIDL tool to
// produce the type library (iaspolcy.tlb) and marshalling code.

import "iaspolcy.idl";
import "iascomp.idl";

	//////////////////////////////////////////////////////////////////////////
	// Pipeline Interfaces
	//////////////////////////////////////////////////////////////////////////
	
	interface IPipeline;            // Forward reference
	interface IStage;               // Forward reference
	interface IConnector;           // Forward reference

	// Pipeline Object Types
	//
	typedef enum _PIPELINE_OBJECT_TYPES
	{
		PIPELINE_OBJECT_PIPELINE=1,
		PIPELINE_OBJECT_STAGE,
		PIPELINE_OBJECT_HANDLER

	} PIPELINE_OBJECT_TYPES;

	// Pipeline Ids
	//
	typedef enum _PIPELINE_IDS
	{
		PIPELINE_BEGIN_SESSION=1,      // 1
		PIPELINE_IN_SESSION,           // 2
		PIPELINE_END_SESSION,          // 3
		// New Pipeline Ids Here

		PIPELINE_MAX_ID

	} PIPELINE_IDS;

	// Stage Ids
	//
	typedef enum _STAGE_IDS
	{
		STAGE_PREOP=1,                 // 1
		STAGE_POSTOP,                  // 2
		STAGE_ROAMING,                 // 3
		STAGE_CREDENTIAL_RETRIEVAL,    // 4
		STAGE_NAP_EVALUATION,          // 5
		STAGE_USER_AUTHORIZATION,      // 6
		STAGE_AUTHENTICATION,          // 7
		STAGE_ACCOUNTING,              // 8
		STAGE_USER_RESTRICTIONS,       // 9
		STAGE_LOGGING,                 // 10
		// New Stage Ids Here...

		STAGE_MAX_ID

	} STAGE_IDS;

	// Request Handler Ids - See - iascomp.idl
	//

	// Relative order of pipeline objects 
	typedef enum _IASMERIT
	{
		MERIT_FIRST_IN_CHAIN = 1,
		// 2 - 1023 for object ordering
		MERIT_LAST_IN_CHAIN = 1024

	} IASMERIT;

	// Upper bounds on pipeline objects
	typedef enum _IAS_PIPELINE_MAX
	{
		IAS_MAX_PIPELINES=16,	// Maximum number of pipelines in a pipeline group
		IAS_MAX_STAGES=32,		// Maximum number of stages on a pipeline
		IAS_MAX_HANDLERS=32,	// Maximum number of request handlers on a stage
		IAS_MAX_EVENTS=32,		// Maximum number of events for a pipeline
		IAS_MAX_NAME=32,		// Maximum length of a pipeline object name
		IAS_MAX_PROGID=32,		// Maximum length of a pipeline object ProgID
		IAS_MAX_DESCRIPTION=64	// Maximum length of a pipeline object description
	
	} IAS_PIPELINE_MAX;

	typedef struct _PIPELINE_OBJECT_INFO
	{
	    QUALITYSTATUS		eQualityStatus;
		IUnknown*			pObjectUnkwn;
		LONG				lType;
		LONG				lId;
		LONG				lParentId;
		ULONG				ulMerit;    
		ULONG				ulEventCount;
		LONG				lEvents[IAS_MAX_EVENTS];
		WCHAR				Name[IAS_MAX_NAME];
		WCHAR				Description[IAS_MAX_DESCRIPTION];
		WCHAR				ProgID[IAS_MAX_PROGID];

	} PIPELINE_OBJECT_INFO, *PPIPELINE_OBJECT_INFO;

	//////////////////////////////////////////////////////////////////////////
	// Pipeline Manager Object Interface
	//////////////////////////////////////////////////////////////////////////
	[
		object,
		hidden,
		restricted,
		uuid(6BC096BE-0CE6-11D1-BAAE-00C04FC2E20D),
		pointer_default(unique)
	]
	interface IPipelineManager : IUnknown
	{
		HRESULT 
		Initialize([in] LPCWSTR lpszPipelineGroup);
		
		HRESULT 
		Shutdown(void);

		HRESULT 
		EnumPipelines([in, out] LPDWORD lpdwCount, [out] PIPELINE_OBJECT_INFO* pPipelineInfo);
	};

	//////////////////////////////////////////////////////////////////////////
	// Pipeline Object Interface
	//////////////////////////////////////////////////////////////////////////
	[
		object,
		hidden,
		restricted,
		uuid(6BC096AD-0CE6-11D1-BAAE-00C04FC2E20D),
		pointer_default(unique)
	]
	interface IPipeline : IUnknown
	{
		HRESULT 
		Initialize([in] PIPELINE_OBJECT_INFO* pPipelineInfo);
		
		HRESULT 
		Shutdown(void);

		HRESULT 
		EnumStages([in, out] LPDWORD lpdwCount, [out] PIPELINE_OBJECT_INFO* pStageInfo);

		HRESULT 
		GetPipelineInfo([out] PIPELINE_OBJECT_INFO* pPipelineInfo);
	};

	//////////////////////////////////////////////////////////////////////////
	// Pipeline Stage Object Interface
	//////////////////////////////////////////////////////////////////////////
	[
		object,
		hidden,
		restricted,
		uuid(6BC096AC-0CE6-11D1-BAAE-00C04FC2E20D),
		pointer_default(unique)
	]
	interface IStage : IUnknown
	{
		HRESULT 
		Initialize([in] PIPELINE_OBJECT_INFO* pStageInfo);
		
		HRESULT 
		Shutdown(void);

		HRESULT 
		GetOutboundConnector( [out] IConnector** pOutboundConnector);

		HRESULT 
		GetInboundConnector([out] IConnector** pInboundConnector);

		HRESULT
		EnumRequestHandlers([in, out] LPDWORD lpdwCount, [out] PIPELINE_OBJECT_INFO* pRequestHandlerInfo);

		HRESULT 
		GetStageInfo([out] PIPELINE_OBJECT_INFO* pStageInfo);
	};

	//////////////////////////////////////////////////////////////////////////
	// Pipeline Stage Connector Object Interface
	//////////////////////////////////////////////////////////////////////////
	typedef enum _CONNECTOR_DIRECTION
	{
		CONNECTOR_DIRECTION_INBOUND = 1,
		CONNECTOR_DIRECTION_OUTBOUND = 2
		
	} CONNECTOR_DIRECTION;

	typedef enum _CONNECTOR_STATE
	{
		CONNECTOR_STATE_CONNECTED = 1,
		CONNECTOR_STATE_DISCONNECTED = 2

	} CONNECTOR_STATE;

	typedef struct _tagCONNECTORINFO
	{
		CONNECTOR_STATE			eState;
		CONNECTOR_DIRECTION     eDirection;
		ULONG                   ulStageID;
		ULONG                   ulRequestCount;

	} CONNECTORINFO, *PCONNECTORINFO;

	[
		object,
		hidden,
		restricted,
		uuid(6BC096AE-0CE6-11D1-BAAE-00C04FC2E20D),
		pointer_default(unique)
	]
	interface IConnector : IUnknown
	{
		HRESULT 
		Connect([in] IConnector* pInboundConnector);

		HRESULT 
		ReceiveConnection([in] IConnector* pOutboundConnector);

		HRESULT 
		Disconnect(void);

		HRESULT 
		ConnectedTo([out] IConnector** ppConnector);

		HRESULT 
		GetConnectorInfo([out] PCONNECTORINFO pConnectorInfo);
	};

	//////////////////////////////////////////////////////////////////////////
	// Pipeline Stage Connector Object Input Interface
	//////////////////////////////////////////////////////////////////////////
	[
		object,
		hidden,
		restricted,
		uuid(6BC096AF-0CE6-11D1-BAAE-00C04FC2E20D),
		pointer_default(unique)
	]
	interface IConnectorInput : IUnknown
	{
		HRESULT 
		ReceiveRequest([in] IRequest* pRequest);
	};


///////////////
// Type Library
///////////////

[
	uuid(6BC096B9-0CE6-11D1-BAAE-00C04FC2E20D),
	version(1.0),
	helpstring("IAS Pipeline 1.0 Type Library")
]
library IASPipelineLib
{
	importlib("stdole2.tlb");

	//////////
	// Classes
	//////////

	//////////////////////////////////////////////////////////////////////////
	[
		uuid(6BC096B2-0CE6-11D1-BAAE-00C04FC2E20D),
		helpstring("Stage Class"),
		hidden,
		restricted
	]
	coclass Stage
	{
		[default] interface IStage;
	};

	//////////////////////////////////////////////////////////////////////////
	[
		uuid(6BC096B3-0CE6-11D1-BAAE-00C04FC2E20D),
		helpstring("Pipeline Class"),
		hidden,
		restricted
	]
	coclass Pipeline
	{
		[default] interface IPipeline;
	};

	//////////////////////////////////////////////////////////////////////////
	[
		uuid(6BC096BF-0CE6-11D1-BAAE-00C04FC2E20D),
		helpstring("Pipeline Manager Class"),
		hidden,
		restricted
	]
	coclass PipelineManager
	{
		[default] interface IPipelineManager;
	};

};
