#ifndef LIBOPM_H
#define LIBOPM_H

#include "config.h"
#include "inet.h"
#include "opm_common.h"
#include "opm.h"

#define CBLEN 5            /* Number of callback functions  */
#define READBUFLEN 128    /* Size of conn->readbuf         */
#define SENDBUFLEN 512     /* Size of sendbuffer in proxy.c */

typedef struct  _OPM_SCAN             OPM_SCAN_T;
typedef struct  _OPM_CONNECTION       OPM_CONNECTION_T;
typedef struct  _OPM_PROTOCOL_CONFIG  OPM_PROTOCOL_CONFIG_T;
typedef struct  _OPM_PROTOCOL         OPM_PROTOCOL_T;

/*  Types of hard coded proxy READ/WRITE functions which are 
   setup in a table in libopm.c */

typedef int OPM_PROXYWRITE_T (OPM_T *, OPM_SCAN_T *, OPM_CONNECTION_T *);
typedef int OPM_PROXYREAD_T  (OPM_T *, OPM_SCAN_T *, OPM_CONNECTION_T *);

struct _OPM_SCAN { 
   opm_sockaddr         addr;           /* Address in byte order of remote client */
   OPM_REMOTE_T        *remote;         /* Pointed to the OPM_REMOTE_T for this scan, passed by client */
   OPM_LIST_T          *connections;    /* List of individual connections of this scan (1 for each protocol) */
};

struct _OPM_CONNECTION {

   OPM_PROTOCOL_T     *protocol;        /* Pointer to specific protocol this connection handles */
   unsigned short int  port;            /* Some protocols have multiple ports, eg. HTTP */

   int                fd;               /* Allocated file descriptor, 0 if not yet allocated */
   unsigned short int bytes_read;       /* Bytes read so far in this connection */
   char               readbuf[READBUFLEN + 1]; /* 128 byte read buffer, anything over 128 is probably not of use */
   unsigned short int readlen;          /* Length of readbuf */
   unsigned short int state;            /* State of connection */
   time_t             creation;         /* When this connection was established */
};

struct _OPM_PROTOCOL_CONFIG
{
   OPM_PROTOCOL_T *type;                /* Protocol type */
   unsigned short int port;             /* Port to connect on */

};

struct _OPM_PROTOCOL
{
   int type;                            /* Protocol type */

   OPM_PROXYWRITE_T *write_function;    /* Write function handler for this protocol */
   OPM_PROXYREAD_T  *read_function;     /* Read function handler for this protocol */
};

#endif /* LIBOPM_H */
