/*++

    Copyright (C) Microsoft Corporation, 1996 - 1999

    Module Name:

        Loader.hxx

    Abstract:

        Global state for the transport interface

    Author:

        Mario Goertzel    [MarioGo]

    Revision History:

        MarioGo     11/1/1996    Bits 'n pieces
        EdwardR     07/1/1997    Added MSMQ support.

--*/

#ifndef __LOADER_HXX
#define __LOADER_HXX

//
// Global state
//

extern DWORD gdwComputerNameLength;
extern RPC_CHAR gpstrComputerName[];

extern const RPC_CHAR HexDigits[];

extern LONG g_NotifyRt;

#ifdef _INTERNAL_RPC_BUILD_
extern RPCLT_PDU_FILTER_FUNC gpfnFilter;
#endif

//
// Transport interfaces defined by each protocol
//

extern const RPC_CONNECTION_TRANSPORT TCP_TransportInterface;
#ifdef SPX_ON
extern const RPC_CONNECTION_TRANSPORT SPX_TransportInterface;
#endif
extern const RPC_CONNECTION_TRANSPORT NMP_TransportInterface;
#ifdef NETBIOS_ON
extern const RPC_CONNECTION_TRANSPORT NBF_TransportInterface;
extern const RPC_CONNECTION_TRANSPORT NBT_TransportInterface;
extern const RPC_CONNECTION_TRANSPORT NBI_TransportInterface;
#endif
#if defined(APPLETALK_ON)
extern const RPC_CONNECTION_TRANSPORT DSP_TransportInterface;
#endif
extern const RPC_CONNECTION_TRANSPORT HTTP_TransportInterface;
extern const RPC_DATAGRAM_TRANSPORT UDP_TransportInterface;
extern const RPC_DATAGRAM_TRANSPORT IPX_TransportInterface;
extern const RPC_DATAGRAM_TRANSPORT CDP_TransportInterface;
#ifdef NCADG_MQ_ON
extern const RPC_DATAGRAM_TRANSPORT MQ_TransportInterface;
#endif

//
// Each protocol is assigned an ID here
//

typedef INT PROTOCOL_ID;

const INT INVALID_PROTOCOL_ID = 0;
const INT TCP  = 1;

#ifdef SPX_ON
const INT SPX  = 2;
#endif

const INT NMP  = 3;

#ifdef NETBIOS_ON
const INT NBF  = 4;       // Netbios flavors
const INT NBT  = 5;
const INT NBI  = 6;
#endif

#ifdef APPLETALK_ON
const INT DSP  = 7;
#endif

// const INT SPP  = 8;     // Banyan Vines - no longer supported
const INT HTTP = 9;

const INT UDP  = 10;
const INT IPX  = 11;
const INT CDP  = 12;        // Cluster Datagram Protocol

#ifdef NCADG_MQ_ON
const INT MSMQ = 13;
#endif

const INT TCP_IPv6 = 14;

const INT HTTPv2 = 15; // this is a special ID that does not go into
                        // the usual ID scheme. It is used in few places
                        // to differentiate b/n HTTP and HTTP2

extern PROTOCOL_ID
MapProtseq(
          IN const RPC_CHAR *Protseq
          );

extern PROTOCOL_ID
MapProtseq(
          IN const CHAR *Protseq
          );

extern PROTOCOL_ID
MapProtocolId (
    IN UINT Protocol,
    IN UINT AddressFamily
    );

//
// Based on ID, each protocol is given an entry in the TransportTable
//

class BASE_CONNECTION;
typedef BASE_CONNECTION *PCONNECTION;

typedef RPC_STATUS (*CO_READ_MESSAGE)(PCONNECTION, DWORD, BUFFER *, PUINT );
typedef RPC_STATUS (*CO_ABORT)(RPC_TRANSPORT_CONNECTION);

struct TRANSPORT_TABLE_ENTRY
    {
    UINT                     ProtocolTowerId;
    UINT                     AddressTowerId;
    RPC_TRANSPORT_INTERFACE  pInfo;
    };

extern const TRANSPORT_TABLE_ENTRY TransportTable[];
extern const DWORD cTransportTable;

#endif // __LOADER_HXX