first cut of Object Notification API and tests
[cilux] / src / include / kernelapi.h
1 #ifndef KERNEL_H
2 #define KERNEL_H
3
4 /* 
5    This API is the equivalent of a system call API and thereby
6    insulates its user from a GPL implementation.
7 */
8
9 #include <platform.h>
10
11 /* -------------------------------------------------------------------------- */
12
13 PUBLIC char*   k_version;
14 PUBLIC char*   k_ciux;
15 PUBLIC void  (*k_terminate)(void);
16
17 /* -------------------------------------------------------------------------- */
18
19 #define NAME_OF_MODULE_LOADED_FN "_module_loaded"
20
21 typedef int (*k_module_loaded_fn)(void);
22
23 /* -------------------------------------------------------------------------- */
24
25 #define NAME_OF_MODULE_TICK_FN "_module_tick"
26
27 typedef void (*k_module_tick_fn)(void);
28
29 /* -------------------------------------------------------------------------- */
30
31 #define NAME_OF_MODULE_EVENT_FN  "_module_event"
32
33 typedef int (*k_module_event_fn)(void* data);
34
35 PUBLIC int k_event_post(char* module, void* data);
36
37 /* -------------------------------------------------------------------------- */
38
39 typedef void (*k_gl_reshape_event)(int width, int height);
40 typedef void (*k_gl_draw_event)(void);
41 typedef void (*k_gl_key_event)(unsigned char k, int down);
42
43 PUBLIC void k_gl_register_reshape(k_gl_reshape_event);
44 PUBLIC void k_gl_register_draw(   k_gl_draw_event);
45 PUBLIC void k_gl_register_key(    k_gl_key_event);
46 PUBLIC void k_gl_swap_buffers(void);
47 PUBLIC void k_gl_end(void);
48
49 /* -------------------------------------------------------------------------- */
50
51 #define CRLF "\015\012"
52 #define CHAN_LISTEN 1
53 #define CHAN_ESTABL 2
54 #define CHAN_ANY    3
55
56 typedef struct k_channel      k_channel;
57 typedef struct k_channel_priv k_channel_priv;
58
59 typedef int (*k_channel_event)(k_channel* chan,
60                                int        bufpos, 
61                                int        size);
62
63 struct k_channel{ struct k_channel* next;
64
65         char*           name;
66         char*           listenhost;
67         int             listenport;
68         char*           banner;
69         k_channel_event rdcallback;
70         k_channel_event wrcallback;
71         void*           context;
72         int             type;
73         struct in_addr  clientip;
74         int             linger;
75         k_channel_priv* priv;
76 };
77
78 PUBLIC char*      k_channel_name(char* type, char* ip, int port, char* other);
79 PUBLIC k_channel* k_channel_connect_name(char*           chanm,
80                                          k_channel_event rdcallback,
81                                          k_channel_event wrcallback);
82 PUBLIC k_channel* k_channel_get_name(char* chanm);
83 PUBLIC void       k_channel_show_all(void);
84
85 PUBLIC k_channel* k_channel_listen(char*           name,
86                                    int             listenport,
87                                    char*           banner,
88                                    k_channel_event rdcallback,
89                                    k_channel_event wrcallback,
90                                    void*           context);
91
92 PUBLIC k_channel* k_channel_connect(char*           name,
93                                     char*           listenhost,
94                                     int             listenport,
95                                     k_channel_event rdcallback,
96                                     k_channel_event wrcallback,
97                                     void*           context);
98
99 #define FREE_ON_SENT 1
100 PUBLIC k_channel* k_channel_send(k_channel*  chan,
101                                  char*       base,
102                                  size_t      size,
103                                  int         free);
104
105 #define BUFFER_ALREADY_SET -1
106 #define BUFFER_FILLED       1
107 #define BUFFER_SET          0
108 PUBLIC char* k_channel_chop_div( k_channel* chan, char*  divider);
109 PUBLIC char* k_channel_chop_len( k_channel* chan, size_t size);
110 PUBLIC int   k_channel_setbuf(   k_channel* chan, char*  rdbuffer, size_t size);
111 PUBLIC char* k_channel_getbuf(   k_channel* chan);
112
113 PUBLIC void k_channel_close(k_channel* chan);
114
115 /* -------------------------------------------------------------------------- */
116
117 #define STAT_F 0100000
118 #define STAT_D 0040000
119 #define STAT_L 0120000
120 #define MAX_FILESIZE (1024*1024*1024)
121 #define USE_MMAP 0
122 #define USE_MALL MAX_FILESIZE
123
124 typedef struct k_stat{
125         int    type;
126         size_t size;
127         time_t time;
128         mode_t perm;
129 } k_stat;
130
131 typedef void (*k_file_event)(char*  basedir,
132                              char*  filename,
133                              char*  data,
134                              int    usedmmap,
135                              k_stat stat,
136                              void*  context);
137
138 PUBLIC void k_file_stat( char* basedir, char* filename,
139                                           k_file_event callback, void* context);
140 PUBLIC void k_file_read( char* basedir, char* filename, size_t msz, size_t size,
141                                           k_file_event callback, void* context);
142 PUBLIC void k_file_write(char* basedir, char* filename, char* data, size_t size,
143                                           k_file_event callback, void* context);
144 PUBLIC void k_dir_list(  char* basedir, char* dirname,
145                          char* pattern[], char* format[],  
146                                           k_file_event callback, void* context);
147 PUBLIC int  k_file_sync(char* data, size_t size);
148
149 /* -------------------------------------------------------------------------- */
150
151 typedef struct k_hashtable{ struct k_hashtable* next; } k_hashtable;
152
153 typedef void (*k_hashtable_apply_fn)(void* arg, char* key, void* val);
154
155 PUBLIC k_hashtable* k_hashtable_new(char* name, int ignorecase);
156 PUBLIC k_hashtable* k_hashtable_dup( k_hashtable* tab);
157 PUBLIC k_hashtable* k_hashtable_deep(k_hashtable* tab);
158 PUBLIC k_hashtable* k_hashtable_dip( k_hashtable* tab, char* includes[]);
159 PUBLIC void  k_hashtable_merge(  k_hashtable* tab, k_hashtable* tam);
160 PUBLIC void  k_hashtable_set(    k_hashtable* tab, char* key, void* val);
161 PUBLIC void  k_hashtable_put(    k_hashtable* tab, char* key, void* val);
162 PUBLIC void  k_hashtable_put_dup(k_hashtable* tab, char* key, char* val);
163 PUBLIC void  k_hashtable_put_int(k_hashtable* tab, char* key, int   val);
164 PUBLIC void  k_hashtable_sub(    k_hashtable* tab, char* key, k_hashtable* sub);
165 PUBLIC void* k_hashtable_get(    k_hashtable* tab, char* key);
166 PUBLIC char* k_hashtable_get_dup(k_hashtable* tab, char* key);
167 PUBLIC int   k_hashtable_get_int(k_hashtable* tab, char* key);
168 PUBLIC int   k_hashtable_is(     k_hashtable* tab, char* key, char* val);
169 PUBLIC int   k_hashtable_isi(    k_hashtable* tab, char* key, char* val);
170 PUBLIC int   k_hashtable_isn(    k_hashtable* tab, char* key, char* val,size_t);
171 PUBLIC void  k_hashtable_remove( k_hashtable* tab, char* key);
172 PUBLIC void* k_hashtable_extract(k_hashtable* tab, char* key);
173 PUBLIC void  k_hashtable_apply(  k_hashtable* tab, k_hashtable_apply_fn, void*);
174 PUBLIC void  k_hashtable_show(      k_hashtable* tab);
175 PUBLIC void  k_hashtable_show_chars(k_hashtable* tab);
176 PUBLIC int   k_hashtable_snprintf(  k_hashtable* tab, char* buf, size_t size);
177 PUBLIC int   k_hashtable_snprintf_i(k_hashtable* tab, char* buf, size_t size,
178                                                             char* includes[]);
179 PUBLIC int   k_hashtable_snprintf_x(k_hashtable* tab, char* buf, size_t size,
180                                                             char* excludes[]);
181 PUBLIC void  k_hashtable_delete(k_hashtable* tab);
182
183 /* -------------------------------------------------------------------------- */
184
185 PUBLIC int  k_string_matches_pattern(char* string, char* pattern);
186 PUBLIC int  k_string_ends_with(      char* string, char* postfix);
187 PUBLIC void k_string_url_decode(     char* string);
188
189 /* -------------------------------------------------------------------------- */
190
191 PUBLIC char*  k_time_to_rfc(time_t t);
192 PUBLIC char*  k_time_to_rfc_relative(int plus);
193 PUBLIC time_t k_time_from_rfc(char* s);
194 PUBLIC void   k_time_get_now(char* buf, size_t size, char* format);
195
196 /* -------------------------------------------------------------------------- */
197
198 PUBLIC void k_random_bytes(char* buf, size_t size);
199
200 /* -------------------------------------------------------------------------- */
201
202 PUBLIC void* k_malloc(size_t size);
203 PUBLIC void* k_realloc(void* o, size_t size);
204 PUBLIC char* k_strdup(char* s);
205 PUBLIC void* k_memdup(void* s, size_t size);
206 PUBLIC void  k_free(void* o);
207
208 /* -------------------------------------------------------------------------- */
209
210 PUBLIC void k_log_out(char* format, ...);
211 PUBLIC void k_log_err(char* format, ...);
212 PUBLIC void k_assert( int t, char* format, ...);
213 PUBLIC void k_fatal(  char* format, ...);
214
215 /* -------------------------------------------------------------------------- */
216
217 #endif