5 /* by Azundris, with thanks to Corey Donohoe <atmos@atmos.org> */
11 #include <sys/types.h>
17 #include "ecore_private.h"
18 #include <Ecore_Ipc.h>
20 #include "ecore_config_ipc.h"
21 #include "ecore_config_util.h"
22 #include "ecore_config_private.h"
24 #include "Ecore_Config.h"
27 /*****************************************************************************/
30 _ecore_config_ipc_ecore_string_get(char **m, char **r)
36 return ECORE_CONFIG_ERR_NODATA;
38 return ECORE_CONFIG_ERR_FAIL;
41 return ECORE_CONFIG_ERR_TYPEMISMATCH;
48 WRN("IPC/eCore: got string-%d \"%s\"", l, *r);
49 return ECORE_CONFIG_ERR_SUCC;
53 _ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long serial __UNUSED__)
55 Ecore_Config_DB_File *db;
60 char buf[PATH_MAX], *p;
62 Ecore_Config_Type type;
65 s = estring_new(8192);
67 if ((p = getenv("HOME")))
69 snprintf(buf, sizeof(buf), "%s/.e/config.eet", p);
70 if (!(db = _ecore_config_db_open_read(buf)))
72 strcpy(buf, PACKAGE_DATA_DIR"/system.eet");
73 if (!(db = _ecore_config_db_open_read(buf)))
79 keys = _ecore_config_db_keys_get(db, &key_count);
82 for (x = 0; x < key_count; x++)
84 type = _ecore_config_db_key_type_get(db, keys[x]);
87 case ECORE_CONFIG_INT:
88 estring_appendf(s, "%s%s: integer", f ? "\n" : "", keys[x]);
90 case ECORE_CONFIG_BLN:
91 estring_appendf(s, "%s%s: boolean", f ? "\n" : "", keys[x]);
93 case ECORE_CONFIG_FLT:
94 estring_appendf(s, "%s%s: float", f ? "\n" : "", keys[x]);
96 case ECORE_CONFIG_STR:
97 estring_appendf(s, "%s%s: string", f ? "\n" : "", keys[x]);
99 case ECORE_CONFIG_RGB:
100 estring_appendf(s, "%s%s: colour", f ? "\n" : "", keys[x]);
102 case ECORE_CONFIG_THM:
103 estring_appendf(s, "%s%s: theme", f ? "\n" : "", keys[x]);
105 case ECORE_CONFIG_SCT:
106 estring_appendf(s, "%s%s: structure", f ? "\n" : "", keys[x]);
109 estring_appendf(s, "%s%s: unknown", f ? "\n" : "", keys[x]);
115 _ecore_config_db_close(db);
118 for (x = 0; x < key_count; x++)
125 return estring_disown(s);
128 /*****************************************************************************/
131 _ecore_config_ipc_ecore_send(Ecore_Ipc_Event_Client_Data * e, int code,
134 static int our_ref = 0;
135 int len = reply ? strlen(reply) + 1 : 0;
138 WRN("IPC/eCore: replying [0,0] %d IRT %d => %d {\"%s\":%d}", our_ref,
139 e->ref, code, reply ? reply : "", len);
140 return ecore_ipc_client_send(e->client, 0, 0, our_ref, e->ref, code, reply,
144 /*****************************************************************************/
147 _ecore_config_ipc_ecore_handle_request(Ecore_Ipc_Server * server,
148 Ecore_Ipc_Event_Client_Data * e)
150 Ecore_Config_Server *srv;
155 srv = _ecore_config_server_convert(server);
159 INF("IPC/eCore: client sent: [%d,%d] #%d (%d) @ %p", e->major, e->minor,
160 e->ref, e->size, server);
165 if (srv == __ecore_config_server_global)
166 r = _ecore_config_ipc_global_prop_list(srv, serial);
168 r = _ecore_config_ipc_prop_list(srv, serial);
171 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
172 r = _ecore_config_ipc_prop_desc(srv, serial, k);
175 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
176 r = _ecore_config_ipc_prop_get(srv, serial, k);
179 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
181 if (_ecore_config_ipc_ecore_string_get(&m, &v) ==
182 ECORE_CONFIG_ERR_SUCC)
183 return _ecore_config_ipc_ecore_send(e,
184 _ecore_config_ipc_prop_set
185 (srv, serial, k, v), NULL);
189 case IPC_BUNDLE_LIST:
190 r = _ecore_config_ipc_bundle_list(srv);
193 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
194 return _ecore_config_ipc_ecore_send(e,
196 _ecore_config_ipc_bundle_new(srv,
198 ECORE_CONFIG_ERR_FAIL, NULL);
200 case IPC_BUNDLE_LABEL_SET:
201 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
202 return _ecore_config_ipc_ecore_send(e,
204 _ecore_config_ipc_bundle_label_set
206 k) : ECORE_CONFIG_ERR_FAIL,
209 case IPC_BUNDLE_LABEL_FIND:
210 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
211 return _ecore_config_ipc_ecore_send(e,
212 _ecore_config_ipc_bundle_label_find
215 case IPC_BUNDLE_LABEL_GET:
216 r = _ecore_config_ipc_bundle_label_get(srv, serial);
221 _ecore_config_ipc_ecore_send(e,
222 r ? ECORE_CONFIG_ERR_SUCC :
223 ECORE_CONFIG_ERR_FAIL, r);
229 return ECORE_CONFIG_ERR_NOTFOUND;
232 /*****************************************************************************/
235 _ecore_config_ipc_client_add(void *data, int type __UNUSED__, void *event)
237 Ecore_Ipc_Server **server;
238 Ecore_Ipc_Event_Client_Data *e;
240 server = (Ecore_Ipc_Server **) data;
241 e = (Ecore_Ipc_Event_Client_Data *) event;
243 if (*server != ecore_ipc_client_server_get(e->client))
246 INF("IPC/eCore: Client connected. @ %p", server);
251 _ecore_config_ipc_client_del(void *data, int type __UNUSED__, void *event)
253 Ecore_Ipc_Server **server;
254 Ecore_Ipc_Event_Client_Data *e;
256 server = (Ecore_Ipc_Server **) data;
257 e = (Ecore_Ipc_Event_Client_Data *) event;
259 if (*server != ecore_ipc_client_server_get(e->client))
262 INF("IPC/eCore: Client disconnected. @ %p", server);
267 _ecore_config_ipc_client_sent(void *data, int type __UNUSED__, void *event)
269 Ecore_Ipc_Server **server;
270 Ecore_Ipc_Event_Client_Data *e;
272 server = (Ecore_Ipc_Server **) data;
273 e = (Ecore_Ipc_Event_Client_Data *) event;
275 if (*server != ecore_ipc_client_server_get(e->client))
278 _ecore_config_ipc_ecore_handle_request(*server, e);
282 /*****************************************************************************/
285 _ecore_config_ipc_ecore_init(const char *pipe_name, void **data)
287 Ecore_Ipc_Server **server;
291 char socket[PATH_MAX];
293 server = (Ecore_Ipc_Server **) data;
296 return ECORE_CONFIG_ERR_FAIL;
299 return ECORE_CONFIG_ERR_IGNORED; */
302 if (ecore_ipc_init() < 1)
303 return ECORE_CONFIG_ERR_FAIL;
305 if ((p = getenv("HOME")))
306 { /* debug-only ### FIXME */
312 snprintf(socket, PATH_MAX, "%s/.ecore/%s/%d", p, pipe_name, port);
314 if (!stat(socket, &st))
316 INF("IPC/eCore: pipe \"%s\" already exists!?", socket);
318 E(0,"IPC/eCore: could not remove pipe \"%s\": %d\n",buf,errno); }}*/
327 *server = ecore_ipc_server_add(ECORE_IPC_LOCAL_USER, pipe_name, port, NULL);
328 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
329 _ecore_config_ipc_client_add, server);
330 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
331 _ecore_config_ipc_client_del, server);
332 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
333 _ecore_config_ipc_client_sent, server);
337 INF("IPC/eCore: Server is listening on %s.", pipe_name);
340 return ECORE_CONFIG_ERR_SUCC;
344 _ecore_config_ipc_ecore_exit(void **data)
347 Ecore_Ipc_Server **server;
349 ret = ECORE_CONFIG_ERR_SUCC;
350 server = (Ecore_Ipc_Server **) data;
353 return ECORE_CONFIG_ERR_FAIL;
357 ecore_ipc_server_del(*server);
361 ecore_ipc_shutdown();
367 /*****************************************************************************/
370 _ecore_config_ipc_ecore_poll(void **data)
372 Ecore_Ipc_Server **server;
374 server = (Ecore_Ipc_Server **) data;
377 return ECORE_CONFIG_ERR_FAIL;
379 ecore_main_loop_iterate();
381 return ECORE_CONFIG_ERR_SUCC;
384 /*****************************************************************************/