about summary refs log tree commit diff stats
path: root/include/uv_link.h
blob: 2d2b7449a60ec7c59c6c37bf479f125c2e65ddff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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_source_s uv_link_source_t;

typedef void (*uv_link_close_cb)(uv_link_t* link);
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_s {
  uv_link_t* parent;
  uv_link_t* child;

  uv_link_alloc_cb alloc_cb;
  uv_link_read_cb read_cb;

  /* Sort of virtual table */
  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_source_s {
  uv_link_t link;

  uv_stream_t* stream;
};

UV_EXTERN int uv_link_init(uv_loop_t* loop, uv_link_t* link);
UV_EXTERN int uv_link_close(uv_link_t* link, uv_link_close_cb close_cb);

UV_EXTERN int uv_link_chain(uv_link_t* from, uv_link_t* to);

/* Source */

/* NOTE: uses `stream->data` field */
UV_EXTERN int uv_link_source_init(uv_loop_t* loop,
                                  uv_link_source_t* source,
                                  uv_stream_t* stream);
UV_EXTERN int uv_link_source_destroy(uv_link_source_t* source);

#endif  /* INCLUDE_UV_LINK_H_ */