1 /* by Azundris, with thanks to Corey Donohoe <atmos@atmos.org> */
13 #include <Ecore_Ipc.h>
15 #include "ecore_private.h"
16 #include "ecore_config_ipc.h"
17 #include "ecore_config_util.h"
18 #include "ecore_config_private.h"
20 #include "Ecore_Config.h"
24 /*****************************************************************************/
27 _ecore_config_ipc_ecore_string_get(char **m, char **r)
33 return ECORE_CONFIG_ERR_NODATA;
35 return ECORE_CONFIG_ERR_FAIL;
38 return ECORE_CONFIG_ERR_TYPEMISMATCH;
45 E(1, "IPC/eCore: got string-%d \"%s\"\n", l, *r);
46 return ECORE_CONFIG_ERR_SUCC;
50 _ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long serial __UNUSED__)
52 Ecore_Config_DB_File *db;
57 char buf[PATH_MAX], *p;
59 Ecore_Config_Type type;
62 s = estring_new(8192);
64 if ((p = getenv("HOME")))
66 snprintf(buf, sizeof(buf), "%s/.e/config.eet", p);
67 if (!(db = _ecore_config_db_open_read(buf)))
69 strcpy(buf, PACKAGE_DATA_DIR"/system.eet");
70 if (!(db = _ecore_config_db_open_read(buf)))
76 keys = _ecore_config_db_keys_get(db, &key_count);
79 for (x = 0; x < key_count; x++)
81 type = _ecore_config_db_key_type_get(db, keys[x]);
84 case ECORE_CONFIG_INT:
85 estring_appendf(s, "%s%s: integer", f ? "\n" : "", keys[x]);
87 case ECORE_CONFIG_BLN:
88 estring_appendf(s, "%s%s: boolean", f ? "\n" : "", keys[x]);
90 case ECORE_CONFIG_FLT:
91 estring_appendf(s, "%s%s: float", f ? "\n" : "", keys[x]);
93 case ECORE_CONFIG_STR:
94 estring_appendf(s, "%s%s: string", f ? "\n" : "", keys[x]);
96 case ECORE_CONFIG_RGB:
97 estring_appendf(s, "%s%s: colour", f ? "\n" : "", keys[x]);
99 case ECORE_CONFIG_THM:
100 estring_appendf(s, "%s%s: theme", f ? "\n" : "", keys[x]);
102 case ECORE_CONFIG_SCT:
103 estring_appendf(s, "%s%s: structure", f ? "\n" : "", keys[x]);
106 estring_appendf(s, "%s%s: unknown", f ? "\n" : "", keys[x]);
112 _ecore_config_db_close(db);
115 for (x = 0; x < key_count; x++)
122 return estring_disown(s);
125 /*****************************************************************************/
128 _ecore_config_ipc_ecore_send(Ecore_Ipc_Event_Client_Data * e, int code,
131 static int our_ref = 0;
132 int len = reply ? strlen(reply) + 1 : 0;
135 E(1, "IPC/eCore: replying [0,0] %d IRT %d => %d {\"%s\":%d}\n", our_ref,
136 e->ref, code, reply ? reply : "", len);
137 return ecore_ipc_client_send(e->client, 0, 0, our_ref, e->ref, code, reply,
141 /*****************************************************************************/
144 _ecore_config_ipc_ecore_handle_request(Ecore_Ipc_Server * server,
145 Ecore_Ipc_Event_Client_Data * e)
147 Ecore_Config_Server *srv;
152 srv = _ecore_config_server_convert(server);
154 ret = ECORE_CONFIG_ERR_FAIL;
157 E(1, "IPC/eCore: client sent: [%d,%d] #%d (%d) @ %p\n", e->major, e->minor,
158 e->ref, e->size, server);
163 if (srv == __ecore_config_server_global)
164 r = _ecore_config_ipc_global_prop_list(srv, serial);
166 r = _ecore_config_ipc_prop_list(srv, serial);
169 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
170 r = _ecore_config_ipc_prop_desc(srv, serial, k);
173 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
174 r = _ecore_config_ipc_prop_get(srv, serial, k);
177 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
179 if (_ecore_config_ipc_ecore_string_get(&m, &v) ==
180 ECORE_CONFIG_ERR_SUCC)
181 return _ecore_config_ipc_ecore_send(e,
182 _ecore_config_ipc_prop_set
183 (srv, serial, k, v), NULL);
187 case IPC_BUNDLE_LIST:
188 r = _ecore_config_ipc_bundle_list(srv);
191 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
192 return _ecore_config_ipc_ecore_send(e,
194 _ecore_config_ipc_bundle_new(srv,
196 ECORE_CONFIG_ERR_FAIL, NULL);
198 case IPC_BUNDLE_LABEL_SET:
199 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
200 return _ecore_config_ipc_ecore_send(e,
202 _ecore_config_ipc_bundle_label_set
204 k) : ECORE_CONFIG_ERR_FAIL,
207 case IPC_BUNDLE_LABEL_FIND:
208 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
209 return _ecore_config_ipc_ecore_send(e,
210 _ecore_config_ipc_bundle_label_find
213 case IPC_BUNDLE_LABEL_GET:
214 r = _ecore_config_ipc_bundle_label_get(srv, serial);
219 _ecore_config_ipc_ecore_send(e,
220 r ? ECORE_CONFIG_ERR_SUCC :
221 ECORE_CONFIG_ERR_FAIL, r);
227 return ECORE_CONFIG_ERR_NOTFOUND;
230 /*****************************************************************************/
233 _ecore_config_ipc_client_add(void *data, int type __UNUSED__, void *event)
235 Ecore_Ipc_Server **server;
236 Ecore_Ipc_Event_Client_Data *e;
238 server = (Ecore_Ipc_Server **) data;
239 e = (Ecore_Ipc_Event_Client_Data *) event;
241 if (*server != ecore_ipc_client_server_get(e->client))
244 E(1, "IPC/eCore: Client connected. @ %p\n", server);
249 _ecore_config_ipc_client_del(void *data, int type __UNUSED__, void *event)
251 Ecore_Ipc_Server **server;
252 Ecore_Ipc_Event_Client_Data *e;
254 server = (Ecore_Ipc_Server **) data;
255 e = (Ecore_Ipc_Event_Client_Data *) event;
257 if (*server != ecore_ipc_client_server_get(e->client))
260 E(1, "IPC/eCore: Client disconnected. @ %p\n", server);
265 _ecore_config_ipc_client_sent(void *data, int type __UNUSED__, void *event)
267 Ecore_Ipc_Server **server;
268 Ecore_Ipc_Event_Client_Data *e;
270 server = (Ecore_Ipc_Server **) data;
271 e = (Ecore_Ipc_Event_Client_Data *) event;
273 if (*server != ecore_ipc_client_server_get(e->client))
276 _ecore_config_ipc_ecore_handle_request(*server, e);
280 /*****************************************************************************/
283 _ecore_config_ipc_ecore_init(const char *pipe_name, void **data)
285 Ecore_Ipc_Server **server;
289 char socket[PATH_MAX];
291 server = (Ecore_Ipc_Server **) data;
294 return ECORE_CONFIG_ERR_FAIL;
297 return ECORE_CONFIG_ERR_IGNORED; */
300 if (ecore_ipc_init() < 1)
301 return ECORE_CONFIG_ERR_FAIL;
303 if ((p = getenv("HOME")))
304 { /* debug-only ### FIXME */
310 snprintf(socket, PATH_MAX, "%s/.ecore/%s/%d", p, pipe_name, port);
312 if (!stat(socket, &st))
314 E(0, "IPC/eCore: pipe \"%s\" already exists!?\n", socket);
316 E(0,"IPC/eCore: could not remove pipe \"%s\": %d\n",buf,errno); }}*/
325 *server = ecore_ipc_server_add(ECORE_IPC_LOCAL_USER, pipe_name, port, NULL);
326 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
327 _ecore_config_ipc_client_add, server);
328 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
329 _ecore_config_ipc_client_del, server);
330 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
331 _ecore_config_ipc_client_sent, server);
335 E(1, "IPC/eCore: Server is listening on %s.\n", pipe_name);
338 return ECORE_CONFIG_ERR_SUCC;
342 _ecore_config_ipc_ecore_exit(void **data)
345 Ecore_Ipc_Server **server;
347 ret = ECORE_CONFIG_ERR_SUCC;
348 server = (Ecore_Ipc_Server **) data;
351 return ECORE_CONFIG_ERR_FAIL;
355 ecore_ipc_server_del(*server);
359 ecore_ipc_shutdown();
364 /*****************************************************************************/
367 _ecore_config_ipc_ecore_poll(void **data)
369 Ecore_Ipc_Server **server;
371 server = (Ecore_Ipc_Server **) data;
374 return ECORE_CONFIG_ERR_FAIL;
376 ecore_main_loop_iterate();
378 return ECORE_CONFIG_ERR_SUCC;
381 /*****************************************************************************/