#ifndef _CONNECT
#define _CONNECT

#include "Error.h"

#define        MIN(a,b) (((a)<(b))?(a):(b))
#define        MAX(a,b) (((a)>(b))?(a):(b))

typedef Card32 Addr;

typedef struct _Packet
{
  Addr Source, Destination;
  Card16 control;
  Card32 length;
  time_t when;
  char *packet;
} Packet;

typedef struct _connectDomain
{
  char *Domain;			/* name of this connect domain */
  Method Initialize;		/* domain */
  Method NameToAddress;		/* name, address */
  Method AddressToName;		/* address, name, length */
  Method FreeAddress;		/* address */
  Method OpenConnection;	/* fromAddress, toAddress */
  Method CloseConnection;	/* fromAddress, toAddress */
  Method SendPacket;		/* packet */
  Method ReceivePacket;		/* socket, address, packet */
} ConnectDomain;

#define MAXDOMAINS 10
#define MAXDOMAINLENGTH 30
#define MAXCONNECTIONS 8192	/* Multiple of 32 */

#define NOADDRESS ((Addr)MAXCARD32)
#define ANYADDRESS ((Addr)0)

#define Connect_Domain(a) (int)((a) >> 24)
#define Connect_Index(a) (Card32)(((a) & 0x00FFFFFF))
#define Connect_Address(d, i) ((Addr)((d) << 24) | (Addr)(i))
#define Connect_AnyAddress(d) Connect_Address(d, ANYADDRESS)

#define Set 1
#define Clear 0
#define Same -1

#define NOTIMEOUT MAXCARD32

/*
Trap Connect_Initialize();
Trap Connect_RegisterDomain();
Trap Connect_NameToAddress();
Trap Connect_AddressToName();
Trap Connect_FreeAddress();
Trap Connect_OpenConnection();
Trap Connect_CloseConnection();
Trap Connect_SendPacket();
Trap Connect_NewAddress();
void Connect_KillAddress();
Trap Connect_RegisterDescriptor();
void Connect_FreeDescriptor();
void Connect_SelectInterest();
Trap Connect_Wait();
*/

extern Trap Connect_Initialize(void);
extern Trap Connect_RegisterDomain(ConnectDomain *domain);
extern Trap Connect_NameToAddress(char *name, Addr *address);
extern Trap Connect_AddressToName(Addr address, char *name, int length);
extern Trap Connect_FreeAddress(Addr address);
extern Trap Connect_OpenConnection(Addr from, Addr to);
extern Trap Connect_CloseConnection(Addr from, Addr to);
extern Trap Connect_SendPacket(Packet *p);
extern Trap Connect_NewAddress(int d, Addr *address);
extern void Connect_KillAddress(Addr address);
extern Trap Connect_RegisterDescriptor(Addr address, int descriptor);
extern void Connect_FreeDescriptor(int descriptor);
extern void Connect_SelectInterest(int descriptor, int read, int write, int except);
extern Trap Connect_Wait(Packet *packet, Card32 timeout);

#endif /* _CONNECT */
