00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef _GUAC_SOCKET_H
00039 #define _GUAC_SOCKET_H
00040
00041 #include <pthread.h>
00042 #include <stdint.h>
00043 #include <unistd.h>
00044
00054 #define GUAC_SOCKET_OUTPUT_BUFFER_SIZE 8192
00055
00056 typedef struct guac_socket guac_socket;
00057
00068 typedef ssize_t guac_socket_read_handler(guac_socket* socket,
00069 void* buf, size_t count);
00070
00081 typedef ssize_t guac_socket_write_handler(guac_socket* socket,
00082 const void* buf, size_t count);
00083
00095 typedef int guac_socket_select_handler(guac_socket* socket, int usec_timeout);
00096
00105 typedef int guac_socket_free_handler(guac_socket* socket);
00106
00111 struct guac_socket {
00112
00116 void* data;
00117
00121 guac_socket_read_handler* read_handler;
00122
00128 guac_socket_write_handler* write_handler;
00129
00134 guac_socket_select_handler* select_handler;
00135
00139 guac_socket_free_handler* free_handler;
00140
00144 int __ready;
00145
00150 int __ready_buf[3];
00151
00155 int __written;
00156
00161 char __out_buf[GUAC_SOCKET_OUTPUT_BUFFER_SIZE];
00162
00166 int __instructionbuf_parse_start;
00167
00171 int __instructionbuf_size;
00172
00176 int __instructionbuf_used_length;
00177
00183 char* __instructionbuf;
00184
00188 int __instructionbuf_elementc;
00189
00194 char* __instructionbuf_elementv[64];
00195
00200 int __threadsafe_instructions;
00201
00206 pthread_mutex_t __instruction_write_lock;
00207
00211 pthread_mutex_t __buffer_lock;
00212
00213 };
00214
00222 guac_socket* guac_socket_alloc();
00223
00229 void guac_socket_free(guac_socket* socket);
00230
00240 void guac_socket_require_threadsafe(guac_socket* socket);
00241
00249 void guac_socket_instruction_begin(guac_socket* socket);
00250
00257 void guac_socket_instruction_end(guac_socket* socket);
00258
00266 void guac_socket_update_buffer_begin(guac_socket* socket);
00267
00275 void guac_socket_update_buffer_end(guac_socket* socket);
00276
00289 guac_socket* guac_socket_open(int fd);
00290
00305 guac_socket* guac_socket_nest(guac_socket* parent, int index);
00306
00319 ssize_t guac_socket_write_int(guac_socket* socket, int64_t i);
00320
00335 ssize_t guac_socket_write_string(guac_socket* socket, const char* str);
00336
00353 ssize_t guac_socket_write_base64(guac_socket* socket, const void* buf, size_t count);
00354
00367 ssize_t guac_socket_write(guac_socket* socket, const void* buf, size_t count);
00368
00382 ssize_t guac_socket_read(guac_socket* socket, void* buf, size_t count);
00383
00393 ssize_t guac_socket_flush_base64(guac_socket* socket);
00394
00404 ssize_t guac_socket_flush(guac_socket* socket);
00405
00406
00423 int guac_socket_select(guac_socket* socket, int usec_timeout);
00424
00425 #endif
00426