uv_link_t/include/uv_link_t.h

127 lines
3.8 KiB
C

#ifndef INCLUDE_UV_LINK_H_
#define INCLUDE_UV_LINK_H_
#include "uv.h"
typedef struct uv_link_s uv_link_t;
typedef struct uv_link_methods_s uv_link_methods_t;
typedef struct uv_link_source_s uv_link_source_t;
typedef struct uv_link_observer_s uv_link_observer_t;
typedef void (*uv_link_alloc_cb)(uv_link_t* link,
size_t suggested_size,
uv_buf_t* buf);
typedef void (*uv_link_read_cb)(uv_link_t* link,
ssize_t nread,
const uv_buf_t* buf);
typedef void (*uv_link_write_cb)(uv_link_t* link, int status);
typedef void (*uv_link_shutdown_cb)(uv_link_t* link, int status);
struct uv_link_methods_s {
int (*read_start)(uv_link_t* link);
int (*read_stop)(uv_link_t* link);
int (*write)(uv_link_t* link,
const uv_buf_t bufs[],
unsigned int nbufs,
uv_stream_t* send_handle,
uv_link_write_cb cb);
int (*try_write)(uv_link_t* link,
const uv_buf_t bufs[],
unsigned int nbufs);
int (*shutdown)(uv_link_t* link, uv_link_shutdown_cb cb);
};
struct uv_link_s {
uv_link_t* parent;
uv_link_t* child;
uv_link_alloc_cb alloc_cb;
uv_link_read_cb read_cb;
/* Read-only after assigning initial values */
/* Sort of virtual table */
uv_link_methods_t const* methods;
/* Private, used for chain/unchain */
uv_link_alloc_cb saved_alloc_cb;
uv_link_read_cb saved_read_cb;
};
UV_EXTERN int uv_link_init(uv_link_t* link, uv_link_methods_t const* methods);
UV_EXTERN void uv_link_close(uv_link_t* link);
UV_EXTERN int uv_link_chain(uv_link_t* from,
uv_link_t* to,
uv_link_alloc_cb alloc_cb,
uv_link_read_cb read_cb);
UV_EXTERN int uv_link_unchain(uv_link_t* from, uv_link_t* to);
/* Use this to invoke methods */
UV_EXTERN void uv_link_invoke_alloc_cb(uv_link_t* link,
size_t suggested_size,
uv_buf_t* buf);
UV_EXTERN void uv_link_invoke_read_cb(uv_link_t* link,
ssize_t nread,
const uv_buf_t* buf);
static int uv_link_read_start(uv_link_t* link) {
return link->methods->read_start(link);
}
static int uv_link_read_stop(uv_link_t* link) {
return link->methods->read_stop(link);
}
static int uv_link_write(uv_link_t* link,
const uv_buf_t bufs[],
unsigned int nbufs,
uv_stream_t* send_handle,
uv_link_write_cb cb) {
return link->methods->write(link, bufs, nbufs, send_handle, cb);
}
static int uv_link_try_write(uv_link_t* link,
const uv_buf_t bufs[],
unsigned int nbufs) {
return link->methods->try_write(link, bufs, nbufs);
}
static int uv_link_shutdown(uv_link_t* link, uv_link_shutdown_cb cb) {
return link->methods->shutdown(link, cb);
}
/* Source */
struct uv_link_source_s {
uv_link_t link;
uv_stream_t* stream;
};
/* NOTE: uses `stream->data` field */
UV_EXTERN int uv_link_source_init(uv_link_source_t* source,
uv_stream_t* stream);
UV_EXTERN void uv_link_source_close(uv_link_source_t* source);
/* Observer */
struct uv_link_observer_s {
uv_link_t link;
uv_link_t* target;
/* This will be called, even if the ones in `link` will be overwritten */
void (*read_cb)(uv_link_observer_t* observer,
ssize_t nread,
const uv_buf_t* buf);
};
UV_EXTERN int uv_link_observer_init(uv_link_observer_t* observer,
uv_link_t* target);
UV_EXTERN int uv_link_observer_close(uv_link_observer_t* observer);
#endif /* INCLUDE_UV_LINK_H_ */