1 #ifndef DUK_TRANS_DVALUE_H_INCLUDED
2 #define DUK_TRANS_DVALUE_H_INCLUDED
6 typedef struct duk_dvalue duk_dvalue
;
7 typedef struct duk_trans_buffer duk_trans_buffer
;
8 typedef struct duk_trans_dvalue_ctx duk_trans_dvalue_ctx
;
10 typedef void (*duk_trans_dvalue_received_function
)(duk_trans_dvalue_ctx
*ctx
, duk_dvalue
*dv
);
11 typedef void (*duk_trans_dvalue_cooperate_function
)(duk_trans_dvalue_ctx
*ctx
, int block
);
12 typedef void (*duk_trans_dvalue_handshake_function
)(duk_trans_dvalue_ctx
*ctx
, const char *handshake_line
);
13 typedef void (*duk_trans_dvalue_detached_function
)(duk_trans_dvalue_ctx
*ctx
);
15 /* struct duk_dvalue 'tag' values, note that these have nothing to do with
16 * Duktape debug protocol inital byte. Struct fields used with the type
17 * are noted next to the define.
19 #define DUK_DVALUE_EOM 1 /* no fields */
20 #define DUK_DVALUE_REQ 2 /* no fields */
21 #define DUK_DVALUE_REP 3 /* no fields */
22 #define DUK_DVALUE_ERR 4 /* no fields */
23 #define DUK_DVALUE_NFY 5 /* no fields */
24 #define DUK_DVALUE_INTEGER 6 /* i: 32-bit signed integer */
25 #define DUK_DVALUE_STRING 7 /* buf: string data, len: string length */
26 #define DUK_DVALUE_BUFFER 8 /* buf: buffer data, len: buffer length */
27 #define DUK_DVALUE_UNUSED 9 /* no fields */
28 #define DUK_DVALUE_UNDEFINED 10 /* no fields */
29 #define DUK_DVALUE_NULL 11 /* no fields */
30 #define DUK_DVALUE_TRUE 12 /* no fields */
31 #define DUK_DVALUE_FALSE 13 /* no fields */
32 #define DUK_DVALUE_NUMBER 14 /* d: ieee double */
33 #define DUK_DVALUE_OBJECT 15 /* i: class number, buf: pointer data, len: pointer length */
34 #define DUK_DVALUE_POINTER 16 /* buf: pointer data, len: pointer length */
35 #define DUK_DVALUE_LIGHTFUNC 17 /* i: lightfunc flags, buf: pointer data, len: pointer length */
36 #define DUK_DVALUE_HEAPPTR 18 /* buf: pointer data, len: pointer length */
39 /* Could use a union for the value but the gain would be relatively small. */
47 struct duk_trans_buffer
{
54 struct duk_trans_dvalue_ctx
{
55 duk_trans_dvalue_received_function received
;
56 duk_trans_dvalue_cooperate_function cooperate
;
57 duk_trans_dvalue_handshake_function handshake
;
58 duk_trans_dvalue_detached_function detached
;
59 duk_trans_buffer send_buf
; /* sending towards Duktape (duktape read callback) */
60 duk_trans_buffer recv_buf
; /* receiving from Duktape (duktape write callback) */
62 int double_byteorder
; /* 0=little endian, 1=big endian, 2=mixed endian */
65 /* Buffer size needed by duk_dvalue_to_string(). */
66 #define DUK_DVALUE_TOSTRING_BUFLEN 256
68 /* Dvalue handling. */
69 duk_dvalue
*duk_dvalue_alloc(void);
70 void duk_dvalue_free(duk_dvalue
*dv
);
71 void duk_dvalue_to_string(duk_dvalue
*dv
, char *buf
);
72 duk_dvalue
*duk_dvalue_make_tag(int tag
);
73 duk_dvalue
*duk_dvalue_make_tag_int(int tag
, int intval
);
74 duk_dvalue
*duk_dvalue_make_tag_double(int tag
, double dblval
);
75 duk_dvalue
*duk_dvalue_make_tag_data(int tag
, const char *buf
, size_t len
);
76 duk_dvalue
*duk_dvalue_make_tag_int_data(int tag
, int intval
, const char *buf
, size_t len
);
78 /* Initializing and freeing the transport context. */
79 duk_trans_dvalue_ctx
*duk_trans_dvalue_init(void);
80 void duk_trans_dvalue_free(duk_trans_dvalue_ctx
*ctx
);
82 /* Sending dvalues towards Duktape. */
83 void duk_trans_dvalue_send(duk_trans_dvalue_ctx
*ctx
, duk_dvalue
*dv
);
84 void duk_trans_dvalue_send_eom(duk_trans_dvalue_ctx
*ctx
);
85 void duk_trans_dvalue_send_req(duk_trans_dvalue_ctx
*ctx
);
86 void duk_trans_dvalue_send_rep(duk_trans_dvalue_ctx
*ctx
);
87 void duk_trans_dvalue_send_err(duk_trans_dvalue_ctx
*ctx
);
88 void duk_trans_dvalue_send_nfy(duk_trans_dvalue_ctx
*ctx
);
89 void duk_trans_dvalue_send_integer(duk_trans_dvalue_ctx
*ctx
, int val
);
90 void duk_trans_dvalue_send_string(duk_trans_dvalue_ctx
*ctx
, const char *str
);
91 void duk_trans_dvalue_send_lstring(duk_trans_dvalue_ctx
*ctx
, const char *str
, size_t len
);
92 void duk_trans_dvalue_send_buffer(duk_trans_dvalue_ctx
*ctx
, const char *buf
, size_t len
);
93 void duk_trans_dvalue_send_unused(duk_trans_dvalue_ctx
*ctx
);
94 void duk_trans_dvalue_send_undefined(duk_trans_dvalue_ctx
*ctx
);
95 void duk_trans_dvalue_send_null(duk_trans_dvalue_ctx
*ctx
);
96 void duk_trans_dvalue_send_true(duk_trans_dvalue_ctx
*ctx
);
97 void duk_trans_dvalue_send_false(duk_trans_dvalue_ctx
*ctx
);
98 void duk_trans_dvalue_send_number(duk_trans_dvalue_ctx
*ctx
, double val
);
99 void duk_trans_dvalue_send_object(duk_trans_dvalue_ctx
*ctx
, int classnum
, const char *ptr_data
, size_t ptr_len
);
100 void duk_trans_dvalue_send_pointer(duk_trans_dvalue_ctx
*ctx
, const char *ptr_data
, size_t ptr_len
);
101 void duk_trans_dvalue_send_lightfunc(duk_trans_dvalue_ctx
*ctx
, int lf_flags
, const char *ptr_data
, size_t ptr_len
);
102 void duk_trans_dvalue_send_heapptr(duk_trans_dvalue_ctx
*ctx
, const char *ptr_data
, size_t ptr_len
);
103 void duk_trans_dvalue_send_req_cmd(duk_trans_dvalue_ctx
*ctx
, int cmd
);
105 /* Duktape debug callbacks provided by the transport. */
106 duk_size_t
duk_trans_dvalue_read_cb(void *udata
, char *buffer
, duk_size_t length
);
107 duk_size_t
duk_trans_dvalue_write_cb(void *udata
, const char *buffer
, duk_size_t length
);
108 duk_size_t
duk_trans_dvalue_peek_cb(void *udata
);
109 void duk_trans_dvalue_read_flush_cb(void *udata
);
110 void duk_trans_dvalue_write_flush_cb(void *udata
);
111 void duk_trans_dvalue_detached_cb(void *udata
);
113 #endif /* DUK_TRANS_DVALUE_H_INCLUDED */