10 # define EAPI __declspec(dllexport)
12 # define EAPI __declspec(dllimport)
17 # define EAPI __attribute__ ((visibility("default")))
28 * @brief Ecore inter-process communication functions.
35 #ifndef _ECORE_IPC_PRIVATE_H
36 typedef void Ecore_Ipc_Server; /**< An IPC connection handle */
37 typedef void Ecore_Ipc_Client; /**< An IPC connection handle */
41 * Macros used for generic data packing
43 EAPI unsigned short _ecore_ipc_swap_16(unsigned short v);
44 EAPI unsigned int _ecore_ipc_swap_32(unsigned int v);
45 EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
47 #ifdef WORDS_BIGENDIAN
48 #define ECORE_IPC_SWAP2NET64(x) _ecore_ipc_swap_64(x)
49 #define ECORE_IPC_SWAP2CPU64(x) _ecore_ipc_swap_64(x)
50 #define ECORE_IPC_SWAP2NET32(x) _ecore_ipc_swap_32(x)
51 #define ECORE_IPC_SWAP2CPU32(x) _ecore_ipc_swap_32(x)
52 #define ECORE_IPC_SWAP2NET16(x) _ecore_ipc_swap_16(x)
53 #define ECORE_IPC_SWAP2CPU16(x) _ecore_ipc_swap_16(x)
54 #define ECORE_IPC_SWAP2NET8(x) (x)
55 #define ECORE_IPC_SWAP2CPU8(x) (x)
57 #define ECORE_IPC_SWAP2NET64(x) (x)
58 #define ECORE_IPC_SWAP2CPU64(x) (x)
59 #define ECORE_IPC_SWAP2NET32(x) (x)
60 #define ECORE_IPC_SWAP2CPU32(x) (x)
61 #define ECORE_IPC_SWAP2NET16(x) (x)
62 #define ECORE_IPC_SWAP2CPU16(x) (x)
63 #define ECORE_IPC_SWAP2NET8(x) (x)
64 #define ECORE_IPC_SWAP2CPU8(x) (x)
67 /* 1, 2, 4 and 8 byte datatypes */
69 #define ECORE_IPC_GET64(v)\
71 p->v = ECORE_IPC_SWAP2CPU64(*(long long *)(ptr)); \
74 #define ECORE_IPC_GET32(v)\
76 p->v = ECORE_IPC_SWAP2CPU32(*(int *)(ptr)); \
79 #define ECORE_IPC_GET16(v)\
81 p->v = ECORE_IPC_SWAP2CPU16(*(short *)(ptr)); \
84 #define ECORE_IPC_GET8(v) \
86 p->v = ECORE_IPC_SWAP2CPU8(*(char *)(ptr)); \
90 #define ECORE_IPC_PUT64(v)\
92 *(long long *)(ptr) = ECORE_IPC_SWAP2NET64(p->v); \
95 #define ECORE_IPC_PUT32(v)\
97 *(int *)(ptr) = ECORE_IPC_SWAP2NET32(p->v); \
100 #define ECORE_IPC_PUT16(v)\
102 *(short *)(ptr) = ECORE_IPC_SWAP2NET16(p->v); \
105 #define ECORE_IPC_PUT8(v) \
107 *(char *)(ptr) = ECORE_IPC_SWAP2NET8(p->v); \
111 #define ECORE_IPC_PAD8() ptr += 1
112 #define ECORE_IPC_PAD16() ptr += 2
113 #define ECORE_IPC_PAD32() ptr += 4
114 #define ECORE_IPC_PAD64() ptr += 8
116 /* counting data when encoding lists */
117 #define ECORE_IPC_CNT8() len += 1
118 #define ECORE_IPC_CNT16() len += 2
119 #define ECORE_IPC_CNT32() len += 4
120 #define ECORE_IPC_CNT64() len += 8
123 #define ECORE_IPC_CHEKS() if (*((unsigned char *)d + s - 1) != 0) return 0;
124 #define ECORE_IPC_GETS(v) \
126 if (ptr < ((unsigned char *)d + s)) \
128 p->v = (char *)ptr; \
129 ptr += strlen(p->v) + 1; \
132 #define ECORE_IPC_PUTS(v, l)\
134 strcpy((char *)ptr, p->v); \
138 /* handy to calculate what sized block we need to alloc */
139 #define ECORE_IPC_SLEN(l, v) ((l = strlen(p->v)) + 1)
140 #define ECORE_IPC_CNTS(v) len += strlen(p->v) + 1
142 /* saves typing function headers */
143 #define ECORE_IPC_DEC_STRUCT_PROTO(x) static int x(void *d, int s, void *pp)
144 #define ECORE_IPC_ENC_STRUCT_PROTO(x) static void *x(void *pp, int *s)
145 #define ECORE_IPC_DEC_EINA_LIST_PROTO(x) static Eina_List *x(void *d, int s)
146 #define ECORE_IPC_ENC_EINA_LIST_PROTO(x) static void *x(Eina_List *lp, int *s)
149 /* decoder setup - saves typing. requires data packet of exact size, or fail */
150 #define ECORE_IPC_DEC_STRUCT_HEAD_EXACT(typ, x) \
152 unsigned char *ptr; \
154 if (!d) return 0; if (s != (x)) return 0; \
156 /* decoder setup - saves typing. requires data packet of a minimum size */
157 #define ECORE_IPC_DEC_STRUCT_HEAD_MIN(typ, x) \
159 unsigned char *ptr; \
161 if (!d) return 0; if (s < (x)) return 0; \
163 /* footer for the hell of it */
164 #define ECORE_IPC_DEC_STRUCT_FOOT() return 1
165 /* header for encoder - gives native strct type and size of flattened packet */
166 #define ECORE_IPC_ENC_STRUCT_HEAD(typ, sz) \
168 unsigned char *d, *ptr; \
171 if(!pp) return NULL; \
175 if (!d) return NULL; \
178 /* footer for the hell of it */
179 #define ECORE_IPC_ENC_STRUCT_FOOT() return d
181 #define ECORE_IPC_DEC_EINA_LIST_HEAD(typ) \
182 unsigned char *ptr; \
187 while(ptr < (unsigned char *)(d + s)) \
189 p = malloc(sizeof(typ));
191 #define ECORE_IPC_DEC_EINA_LIST_FOOT() \
192 l = eina_list_append(l, p); \
195 #define ECORE_IPC_ENC_EINA_LIST_HEAD_START(typ) \
198 unsigned char *d, *ptr; \
202 for (l = lp; l; l = l->next) \
205 #define ECORE_IPC_ENC_EINA_LIST_HEAD_FINISH() \
208 if(!d) return NULL; \
211 for (l = lp; l; l = l->next) \
215 #define ECORE_IPC_ENC_EINA_LIST_FOOT() \
219 typedef enum _Ecore_Ipc_Type
221 ECORE_IPC_LOCAL_USER,
222 ECORE_IPC_LOCAL_SYSTEM,
223 ECORE_IPC_REMOTE_SYSTEM,
224 ECORE_IPC_USE_SSL = 16
227 typedef struct _Ecore_Ipc_Event_Client_Add Ecore_Ipc_Event_Client_Add;
228 typedef struct _Ecore_Ipc_Event_Client_Del Ecore_Ipc_Event_Client_Del;
229 typedef struct _Ecore_Ipc_Event_Server_Add Ecore_Ipc_Event_Server_Add;
230 typedef struct _Ecore_Ipc_Event_Server_Del Ecore_Ipc_Event_Server_Del;
231 typedef struct _Ecore_Ipc_Event_Client_Data Ecore_Ipc_Event_Client_Data;
232 typedef struct _Ecore_Ipc_Event_Server_Data Ecore_Ipc_Event_Server_Data;
234 struct _Ecore_Ipc_Event_Client_Add
236 Ecore_Ipc_Client *client;
239 struct _Ecore_Ipc_Event_Client_Del
241 Ecore_Ipc_Client *client;
244 struct _Ecore_Ipc_Event_Server_Add
246 Ecore_Ipc_Server *server;
249 struct _Ecore_Ipc_Event_Server_Del
251 Ecore_Ipc_Server *server;
254 struct _Ecore_Ipc_Event_Client_Data
256 Ecore_Ipc_Client *client;
257 /* FIXME: this needs to become an ipc message */
267 struct _Ecore_Ipc_Event_Server_Data
269 Ecore_Ipc_Server *server;
270 /* FIXME: this needs to become an ipc message */
280 EAPI extern int ECORE_IPC_EVENT_CLIENT_ADD;
281 EAPI extern int ECORE_IPC_EVENT_CLIENT_DEL;
282 EAPI extern int ECORE_IPC_EVENT_SERVER_ADD;
283 EAPI extern int ECORE_IPC_EVENT_SERVER_DEL;
284 EAPI extern int ECORE_IPC_EVENT_CLIENT_DATA;
285 EAPI extern int ECORE_IPC_EVENT_SERVER_DATA;
287 EAPI int ecore_ipc_init(void);
288 EAPI int ecore_ipc_shutdown(void);
290 /* FIXME: need to add protocol type parameter */
291 EAPI Ecore_Ipc_Server *ecore_ipc_server_add(Ecore_Ipc_Type type, const char *name, int port, const void *data);
293 /* FIXME: need to add protocol type parameter */
294 EAPI Ecore_Ipc_Server *ecore_ipc_server_connect(Ecore_Ipc_Type type, char *name, int port, const void *data);
295 EAPI void *ecore_ipc_server_del(Ecore_Ipc_Server *svr);
296 EAPI void *ecore_ipc_server_data_get(Ecore_Ipc_Server *svr);
297 EAPI int ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr);
298 EAPI Eina_List *ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr);
299 /* FIXME: this needs to become an ipc message */
300 EAPI int ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size);
301 EAPI void ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients);
302 EAPI void ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *srv, int size);
303 EAPI int ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *srv);
304 EAPI const char *ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr);
305 EAPI void ecore_ipc_server_flush(Ecore_Ipc_Server *svr);
307 /* FIXME: this needs to become an ipc message */
308 EAPI int ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size);
309 EAPI Ecore_Ipc_Server *ecore_ipc_client_server_get(Ecore_Ipc_Client *cl);
310 EAPI void *ecore_ipc_client_del(Ecore_Ipc_Client *cl);
311 EAPI void ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data);
312 EAPI void *ecore_ipc_client_data_get(Ecore_Ipc_Client *cl);
313 EAPI void ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size);
314 EAPI int ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl);
315 EAPI const char *ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl);
316 EAPI void ecore_ipc_client_flush(Ecore_Ipc_Client *cl);
318 EAPI int ecore_ipc_ssl_available_get(void);
319 /* FIXME: need to add a callback to "ok" large ipc messages greater than */
320 /* a certain size (seurity/DOS attack safety) */