2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
9 /* by Azundris, with thanks to Corey Donohoe <atmos@atmos.org> */
15 #include <sys/types.h>
21 #include "ecore_private.h"
22 #include <Ecore_Ipc.h>
24 #include "ecore_config_ipc.h"
25 #include "ecore_config_util.h"
26 #include "ecore_config_private.h"
28 #include "Ecore_Config.h"
31 /*****************************************************************************/
34 _ecore_config_ipc_ecore_string_get(char **m, char **r)
40 return ECORE_CONFIG_ERR_NODATA;
42 return ECORE_CONFIG_ERR_FAIL;
45 return ECORE_CONFIG_ERR_TYPEMISMATCH;
52 WRN("IPC/eCore: got string-%d \"%s\"", l, *r);
53 return ECORE_CONFIG_ERR_SUCC;
57 _ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long serial __UNUSED__)
59 Ecore_Config_DB_File *db;
64 char buf[PATH_MAX], *p;
66 Ecore_Config_Type type;
69 s = estring_new(8192);
71 if ((p = getenv("HOME")))
73 snprintf(buf, sizeof(buf), "%s/.e/config.eet", p);
74 if (!(db = _ecore_config_db_open_read(buf)))
76 strcpy(buf, PACKAGE_DATA_DIR"/system.eet");
77 if (!(db = _ecore_config_db_open_read(buf)))
83 keys = _ecore_config_db_keys_get(db, &key_count);
86 for (x = 0; x < key_count; x++)
88 type = _ecore_config_db_key_type_get(db, keys[x]);
91 case ECORE_CONFIG_INT:
92 estring_appendf(s, "%s%s: integer", f ? "\n" : "", keys[x]);
94 case ECORE_CONFIG_BLN:
95 estring_appendf(s, "%s%s: boolean", f ? "\n" : "", keys[x]);
97 case ECORE_CONFIG_FLT:
98 estring_appendf(s, "%s%s: float", f ? "\n" : "", keys[x]);
100 case ECORE_CONFIG_STR:
101 estring_appendf(s, "%s%s: string", f ? "\n" : "", keys[x]);
103 case ECORE_CONFIG_RGB:
104 estring_appendf(s, "%s%s: colour", f ? "\n" : "", keys[x]);
106 case ECORE_CONFIG_THM:
107 estring_appendf(s, "%s%s: theme", f ? "\n" : "", keys[x]);
109 case ECORE_CONFIG_SCT:
110 estring_appendf(s, "%s%s: structure", f ? "\n" : "", keys[x]);
113 estring_appendf(s, "%s%s: unknown", f ? "\n" : "", keys[x]);
119 _ecore_config_db_close(db);
122 for (x = 0; x < key_count; x++)
129 return estring_disown(s);
132 /*****************************************************************************/
135 _ecore_config_ipc_ecore_send(Ecore_Ipc_Event_Client_Data * e, int code,
138 static int our_ref = 0;
139 int len = reply ? strlen(reply) + 1 : 0;
142 WRN("IPC/eCore: replying [0,0] %d IRT %d => %d {\"%s\":%d}", our_ref,
143 e->ref, code, reply ? reply : "", len);
144 return ecore_ipc_client_send(e->client, 0, 0, our_ref, e->ref, code, reply,
148 /*****************************************************************************/
151 _ecore_config_ipc_ecore_handle_request(Ecore_Ipc_Server * server,
152 Ecore_Ipc_Event_Client_Data * e)
154 Ecore_Config_Server *srv;
159 srv = _ecore_config_server_convert(server);
163 INF("IPC/eCore: client sent: [%d,%d] #%d (%d) @ %p", e->major, e->minor,
164 e->ref, e->size, server);
169 if (srv == __ecore_config_server_global)
170 r = _ecore_config_ipc_global_prop_list(srv, serial);
172 r = _ecore_config_ipc_prop_list(srv, serial);
175 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
176 r = _ecore_config_ipc_prop_desc(srv, serial, k);
179 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
180 r = _ecore_config_ipc_prop_get(srv, serial, k);
183 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
185 if (_ecore_config_ipc_ecore_string_get(&m, &v) ==
186 ECORE_CONFIG_ERR_SUCC)
187 return _ecore_config_ipc_ecore_send(e,
188 _ecore_config_ipc_prop_set
189 (srv, serial, k, v), NULL);
193 case IPC_BUNDLE_LIST:
194 r = _ecore_config_ipc_bundle_list(srv);
197 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
198 return _ecore_config_ipc_ecore_send(e,
200 _ecore_config_ipc_bundle_new(srv,
202 ECORE_CONFIG_ERR_FAIL, NULL);
204 case IPC_BUNDLE_LABEL_SET:
205 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
206 return _ecore_config_ipc_ecore_send(e,
208 _ecore_config_ipc_bundle_label_set
210 k) : ECORE_CONFIG_ERR_FAIL,
213 case IPC_BUNDLE_LABEL_FIND:
214 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
215 return _ecore_config_ipc_ecore_send(e,
216 _ecore_config_ipc_bundle_label_find
219 case IPC_BUNDLE_LABEL_GET:
220 r = _ecore_config_ipc_bundle_label_get(srv, serial);
225 _ecore_config_ipc_ecore_send(e,
226 r ? ECORE_CONFIG_ERR_SUCC :
227 ECORE_CONFIG_ERR_FAIL, r);
233 return ECORE_CONFIG_ERR_NOTFOUND;
236 /*****************************************************************************/
239 _ecore_config_ipc_client_add(void *data, int type __UNUSED__, void *event)
241 Ecore_Ipc_Server **server;
242 Ecore_Ipc_Event_Client_Data *e;
244 server = (Ecore_Ipc_Server **) data;
245 e = (Ecore_Ipc_Event_Client_Data *) event;
247 if (*server != ecore_ipc_client_server_get(e->client))
250 INF("IPC/eCore: Client connected. @ %p", server);
255 _ecore_config_ipc_client_del(void *data, int type __UNUSED__, void *event)
257 Ecore_Ipc_Server **server;
258 Ecore_Ipc_Event_Client_Data *e;
260 server = (Ecore_Ipc_Server **) data;
261 e = (Ecore_Ipc_Event_Client_Data *) event;
263 if (*server != ecore_ipc_client_server_get(e->client))
266 INF("IPC/eCore: Client disconnected. @ %p", server);
271 _ecore_config_ipc_client_sent(void *data, int type __UNUSED__, void *event)
273 Ecore_Ipc_Server **server;
274 Ecore_Ipc_Event_Client_Data *e;
276 server = (Ecore_Ipc_Server **) data;
277 e = (Ecore_Ipc_Event_Client_Data *) event;
279 if (*server != ecore_ipc_client_server_get(e->client))
282 _ecore_config_ipc_ecore_handle_request(*server, e);
286 /*****************************************************************************/
289 _ecore_config_ipc_ecore_init(const char *pipe_name, void **data)
291 Ecore_Ipc_Server **server;
295 char socket[PATH_MAX];
297 server = (Ecore_Ipc_Server **) data;
300 return ECORE_CONFIG_ERR_FAIL;
303 return ECORE_CONFIG_ERR_IGNORED; */
306 if (ecore_ipc_init() < 1)
307 return ECORE_CONFIG_ERR_FAIL;
309 if ((p = getenv("HOME")))
310 { /* debug-only ### FIXME */
316 snprintf(socket, PATH_MAX, "%s/.ecore/%s/%d", p, pipe_name, port);
318 if (!stat(socket, &st))
320 INF("IPC/eCore: pipe \"%s\" already exists!?", socket);
322 E(0,"IPC/eCore: could not remove pipe \"%s\": %d\n",buf,errno); }}*/
331 *server = ecore_ipc_server_add(ECORE_IPC_LOCAL_USER, pipe_name, port, NULL);
332 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
333 _ecore_config_ipc_client_add, server);
334 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
335 _ecore_config_ipc_client_del, server);
336 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
337 _ecore_config_ipc_client_sent, server);
341 INF("IPC/eCore: Server is listening on %s.", pipe_name);
344 return ECORE_CONFIG_ERR_SUCC;
348 _ecore_config_ipc_ecore_exit(void **data)
351 Ecore_Ipc_Server **server;
353 ret = ECORE_CONFIG_ERR_SUCC;
354 server = (Ecore_Ipc_Server **) data;
357 return ECORE_CONFIG_ERR_FAIL;
361 ecore_ipc_server_del(*server);
365 ecore_ipc_shutdown();
371 /*****************************************************************************/
374 _ecore_config_ipc_ecore_poll(void **data)
376 Ecore_Ipc_Server **server;
378 server = (Ecore_Ipc_Server **) data;
381 return ECORE_CONFIG_ERR_FAIL;
383 ecore_main_loop_iterate();
385 return ECORE_CONFIG_ERR_SUCC;
388 /*****************************************************************************/