/*                                      W3C Sample Code Library libwww Private Hst Definition
 */
/*
**      (c) COPYRIGHT MIT 1995.
**      Please first read the full copyright statement in the file COPYRIGH.
*/
/*

   This is the private definition of the Host Class. Please look in the public Host Class
   for more documentation
   
   This module is implemented by HTHost.c, and it is a part of the W3C Sample Code
   Library.
   
 */
#ifndef HTHSTMAN_H
#define HTHSTMAN_H
#include "HTHost.h"
#include "HTDNS.h"
#include "HTEvent.h"
#include "HTProt.h"

#define PIPE_BUFFER_SIZE        8192
/*

   The HTHost object is the core of the request queue management. This object contains
   information about the socket descriptor, the input read buffer etc. required to
   identify and service a request.
   
 */
typedef enum _TCPState {
    TCP_ERROR           = -2,
    TCP_CONNECTED       = -1,
    TCP_BEGIN           = 0,
    TCP_CHANNEL,
    TCP_DNS,
    TCP_NEED_SOCKET,
    TCP_NEED_BIND,
    TCP_NEED_LISTEN,
    TCP_NEED_CONNECT,
    TCP_IN_USE
} TCPState;

struct _HTHost {
    int                 hash;

    /* Information about the otherend */
    char *              hostname;            /* name of host + optional port */
    u_short             u_port;
    time_t              ntime;                              /* Creation time */
    char *              type;                                   /* Peer type */
    int                 version;                             /* Peer version */
    HTMethod            methods;                /* Public methods (bit-flag) */
    char *              server;                               /* Server name */
    char *              user_agent;                            /* User Agent */
    char *              range_units;                                  /* ??? */

    /* When does this entry expire? */
    time_t              expires;          /* Persistent channel expires time */
    int                 reqsPerConnection;        /* from Keep-Alive: header */
    int                 reqsMade;                /* updated as they are sent */

    /* Queuing and connection modes */
    HTList *            pipeline;                /* Pipe line of net objects */
    HTList *            pending;              /* List of pending Net objects */
    HTNet *             doit;               /* Transfer from pending to pipe */
    HTNet *             lock;             /* This is a kludge! */
    BOOL                persistent;
    HTTransportMode     mode;                              /* Supported mode */
    HTTimer *           timer;         /* Timer for handling idle connection */
    BOOL                do_recover;         /* If we are supposed to recover */
    int                 recovered;        /* How many times had we recovered */
    BOOL                close_notification;        /* Got a hint about close */
    BOOL                broken_pipe;

    /* Support for transports */
    HTChannel *         channel;                             /* data channel */

    /* Connection dependent stuff */
    HTdns *             dns;                           /* Link to DNS object */
    TCPState            tcpstate;                     /* State in connection */
    SockA               sock_addr;           /* SockA is defined in wwwsys.h */
    int                 retry;               /* Counting attempts to connect */
    int                 home;                    /* Current home if multiple */
    ms_t                connecttime;       /* Time in ms on multihomed hosts */

    /* Event Management */
    HTEvent *           events[HTEvent_TYPES];/* reading and writing may differ */
    HTEventType         registeredFor;    /* Which actions are we blocked on */
    size_t              remainingRead;   /* Tells HostEvent to call next net */

    /* User specific stuff */
    ms_t                delay;                          /* Write delay in ms */
    void *              context;                /* Protocol Specific context */
    int                 forceWriteFlush;
};

#define HTHost_bytesRead(me)            ((me) ? (me)->bytes_read : -1)
#define HTHost_bytesWritten(me)         ((me) ? (me)->bytes_written : -1)

#define HTHost_setBytesRead(me,l)       ((me) ? (me->bytes_read=(l)) : -1)
#define HTHost_setBytesWritten(me,l)    ((me) ? (me->bytes_written=(l)) :-1)
#define HTHost_setDNS (host, dns)       ((me) ? (me->dns=(dns)) :-1)
/*

 */
#endif /* HTHSTMAN_H */
/*

   
   ___________________________________
   
   */
