113 lines
3.8 KiB
C

#ifndef CHANNEL_H_INCLUDED
#define CHANNEL_H_INCLUDED
/*============================================================================
This is the generic channel interface for Abyss. It includes both
the generic interface to a channel from above and the interface
between generic channel code and a particular channel
implementation (e.g. POSIX socket) below.
Abyss uses a channel to converse with an HTTP client. A channel is
oblivious to HTTP -- it just transports a byte stream in each direction.
============================================================================*/
#include "bool.h"
#include "int.h"
#include "xmlrpc-c/abyss.h"
struct TChannelVtbl;
void
ChannelCreate(const struct TChannelVtbl * const vtblP,
void * const implP,
TChannel ** const channelPP);
typedef void ChannelDestroyImpl(TChannel * const channelP);
typedef void ChannelWriteImpl(TChannel * const channelP,
const unsigned char * const buffer,
uint32_t const len,
bool * const failedP);
typedef void ChannelReadImpl(TChannel * const channelP,
unsigned char * const buffer,
uint32_t const len,
uint32_t * const bytesReceivedP,
bool * const failedP);
typedef uint32_t ChannelErrorImpl(TChannel * const channelP);
typedef void ChannelWaitImpl(TChannel * const channelP,
bool const waitForRead,
bool const waitForWrite,
uint32_t const timems,
bool * const readyToReadP,
bool * const readyToWriteP,
bool * const failedP);
typedef void ChannelInterruptImpl(TChannel * const channelP);
typedef void ChannelFormatPeerInfoImpl(TChannel * const channelP,
const char ** const peerStringP);
struct TChannelVtbl {
ChannelDestroyImpl * destroy;
ChannelWriteImpl * write;
ChannelReadImpl * read;
ChannelWaitImpl * wait;
ChannelInterruptImpl * interrupt;
ChannelFormatPeerInfoImpl * formatPeerInfo;
};
struct _TChannel {
unsigned int signature;
/* With both background and foreground use of sockets, and
background being both fork and pthread, it is very easy to
screw up socket lifetime and try to destroy twice. We use
this signature to help catch such bugs.
*/
void * implP;
struct TChannelVtbl vtbl;
};
#define TIME_INFINITE 0xffffffff
extern bool ChannelTraceIsActive;
void
ChannelInit(const char ** const errorP);
void
ChannelTerm(void);
void
ChannelWrite(TChannel * const channelP,
const unsigned char * const buffer,
uint32_t const len,
bool * const failedP);
void
ChannelRead(TChannel * const channelP,
unsigned char * const buffer,
uint32_t const len,
uint32_t * const bytesReceivedP,
bool * const failedP);
void
ChannelWait(TChannel * const channelP,
bool const waitForRead,
bool const waitForWrite,
uint32_t const timems,
bool * const readyToReadP,
bool * const readyToWriteP,
bool * const failedP);
void
ChannelInterrupt(TChannel * const channelP);
void
ChannelFormatPeerInfo(TChannel * const channelP,
const char ** const peerStringP);
#endif