5d6a18a077f3417221c85ded1966e4742091e77f
[framework/uifw/ecore.git] / src / lib / ecore_config / ecore_config_ipc_main.c
1 /* ############## bad */
2 #define HAVE_EVAS2
3
4 #include <signal.h>
5 #include <dlfcn.h>
6 #include <stdio.h>
7 #include <glob.h>
8 #include <sys/param.h>
9 #include <limits.h>
10 #include <string.h>
11 #include <stdlib.h>             /* malloc(), free() */
12
13 #include "Ecore.h"
14 #include "Ecore_Config.h"
15 #include "ecore_config_util.h"
16 #include "ecore_config_ipc.h"
17
18 #include "config.h"
19 #include "ecore_config_private.h"
20
21 static Ecore_Config_Server *__ecore_config_servers;
22 Ecore_Timer *ipc_timer = NULL;
23
24 Ecore_Config_Server *
25 _ecore_config_server_convert(void *srv)
26 {
27    Ecore_Config_Server *srv_tmp;
28
29    srv_tmp = __ecore_config_servers;
30    while (srv_tmp)
31      {
32         if (srv_tmp->server == srv)
33           return srv_tmp;
34         srv_tmp = srv_tmp->next;
35      }
36
37    return __ecore_config_server_global;
38 }
39
40 /*****************************************************************************/
41 /* INTERFACE FOR IPC MODULES */
42 /*****************************/
43
44 char               *
45 _ecore_config_ipc_prop_list(Ecore_Config_Server * srv, const long serial)
46 {
47    Ecore_Config_Bundle *theme;
48    Ecore_Config_Prop  *e;
49    estring            *s;
50    int                 f;
51
52    theme = ecore_config_bundle_by_serial_get(srv, serial);
53    e = theme ? theme->data : NULL;
54    s = estring_new(8192);
55    f = 0;
56    while (e)
57      {
58         /* ignore system properties in listings, unless they have been overridden */
59         if (e->flags & ECORE_CONFIG_FLAG_SYSTEM && !(e->flags & ECORE_CONFIG_FLAG_MODIFIED))
60           {
61              e = e->next;
62              continue;
63           }
64         estring_appendf(s, "%s%s: %s", f ? "\n" : "", e->key,
65                         ecore_config_type_get(e));
66         if (e->flags & ECORE_CONFIG_FLAG_BOUNDS)
67           {
68              if (e->type == ECORE_CONFIG_FLT)
69                 estring_appendf(s, ", range %le..%le",
70                                 (float)e->lo / ECORE_CONFIG_FLOAT_PRECISION,
71                                 (float)e->hi / ECORE_CONFIG_FLOAT_PRECISION);
72              else
73                 estring_appendf(s, ", range %d..%d", e->lo, e->hi);
74           }
75         if (e->type == ECORE_CONFIG_THM)
76            estring_appendf(s, ", group %s", e->data ? e->data : "Main");
77         f = 1;
78         e = e->next;
79      }
80
81    return estring_disown(s);
82 }
83
84 char               *
85 _ecore_config_ipc_prop_desc(Ecore_Config_Server * srv, const long serial,
86                             const char *key)
87 {
88 #ifdef HAVE_EVAS2
89    Ecore_Config_Bundle *theme;
90    Ecore_Config_Prop  *e;
91
92    theme = ecore_config_bundle_by_serial_get(srv, serial);
93    e = ecore_config_get(key);
94
95    if (e)
96      {
97         estring            *s = estring_new(512);
98
99         estring_appendf(s, "%s: %s", e->key, ecore_config_type_get(e));
100         if (e->flags & ECORE_CONFIG_FLAG_BOUNDS)
101            estring_appendf(s, ", range %d..%d", e->lo, e->hi);
102         return estring_disown(s);
103      }
104 #endif
105    return strdup("<undefined>");
106 }
107
108 char               *
109 _ecore_config_ipc_prop_get(Ecore_Config_Server * srv, const long serial,
110                            const char *key)
111 {
112 #ifdef HAVE_EVAS2
113    char               *ret;
114    Ecore_Config_Bundle *theme;
115
116    ret = NULL;
117    theme = ecore_config_bundle_by_serial_get(srv, serial);
118    if ((ret = ecore_config_as_string_get( /*theme, */ key)))
119       return ret;
120 #endif
121    return strdup("<undefined>");
122 }
123
124 int
125 _ecore_config_ipc_prop_set(Ecore_Config_Server * srv, const long serial,
126                            const char *key, const char *val)
127 {
128 #ifdef HAVE_EVAS2
129    int                 ret;
130    Ecore_Config_Bundle *theme;
131
132    theme = ecore_config_bundle_by_serial_get(srv, serial);
133    ret = ecore_config_set(key, (char *)val);
134    E(1, "ipc.prop.set(%s->%s,\"%s\") => %d\n", theme ? theme->identifier : "",
135      key, val, ret);
136    return ret;
137 #else
138    return ECORE_CONFIG_ERR_NOTSUPP;
139 #endif
140 }
141
142 /*****************************************************************************/
143
144 char               *
145 _ecore_config_ipc_bundle_list(Ecore_Config_Server * srv)
146 {
147    Ecore_Config_Bundle *ns;
148    estring            *s;
149    int                 f;
150
151    ns = ecore_config_bundle_1st_get(srv);
152    s = estring_new(8192);
153    f = 0;
154    if (!ns)
155       return strdup("<no_bundles_created>");
156
157    while (ns)
158      {
159         estring_appendf(s, "%s%d: %s", f ? "\n" : "",
160                         ecore_config_bundle_serial_get(ns),
161                         ecore_config_bundle_label_get(ns));
162         f = 1;
163         ns = ecore_config_bundle_next_get(ns);
164      }
165
166    return estring_disown(s);
167 }
168
169 int
170 _ecore_config_ipc_bundle_new(Ecore_Config_Server * srv, const char *label)
171 {
172    if (ecore_config_bundle_new(srv, label))
173       return ECORE_CONFIG_ERR_SUCC;
174    return ECORE_CONFIG_ERR_FAIL;
175 }
176
177 char               *
178 _ecore_config_ipc_bundle_label_get(Ecore_Config_Server * srv, const long serial)
179 {
180    Ecore_Config_Bundle *ns;
181    char               *label;
182
183    ns = ecore_config_bundle_by_serial_get(srv, serial);
184    label = ecore_config_bundle_label_get(ns);
185    return strdup(label ? label : "<no such bundle>");
186 }
187
188 int
189 _ecore_config_ipc_bundle_label_set(Ecore_Config_Server * srv, const long serial,
190                                    const char *label)
191 {
192    Ecore_Config_Bundle *ns;
193
194    ns = ecore_config_bundle_by_serial_get(srv, serial);
195    if (!(ns->identifier = malloc(sizeof(label))))
196       return ECORE_CONFIG_ERR_OOM;
197    memcpy(ns->identifier, label, sizeof(label));
198    return ECORE_CONFIG_ERR_SUCC;
199 }
200
201 long
202 _ecore_config_ipc_bundle_label_find(Ecore_Config_Server * srv,
203                                     const char *label)
204 {
205    Ecore_Config_Bundle *ns;
206
207    ns = ecore_config_bundle_by_label_get(srv, label);
208    return ns ? ecore_config_bundle_serial_get(ns) : -1;
209 }
210
211 static int
212 _ecore_config_ipc_poll(void *data __UNUSED__)
213 {
214    Ecore_Config_Server *s;
215
216    s = __ecore_config_servers;
217    while (s)
218      {
219         _ecore_config_ipc_ecore_poll(&s->server);
220         s = s->next;
221      }
222
223    return 1;
224 }
225
226 int
227 _ecore_config_ipc_exit(void)
228 {
229    Ecore_Config_Server *l;
230
231    if (ipc_timer)
232       ecore_timer_del(ipc_timer);
233
234    l = __ecore_config_servers;
235    while (l)
236      {
237         _ecore_config_ipc_ecore_exit(&l->server);
238         if (l->name)
239           free(l->name);
240         l = l->next;
241      }
242
243    return ECORE_CONFIG_ERR_SUCC;
244 }
245
246 Ecore_Config_Server *
247 _ecore_config_ipc_init(const char *pipe_name)
248 {
249    int                 ret;
250    Ecore_Config_Server *list;
251    Ecore_Config_Server *ret_srv;
252
253    list = NULL;
254    ret_srv = NULL;
255    list = NULL;
256
257    list = malloc(sizeof(Ecore_Config_Server));
258    memset(list, 0, sizeof(Ecore_Config_Server));
259    if ((ret = _ecore_config_ipc_ecore_init(pipe_name, &list->server)) != ECORE_CONFIG_ERR_SUCC)
260      {
261         E(2, "_ecore_config_ipc_init: failed to register %s, code %d\n",
262           pipe_name, ret);
263      }
264
265    E(2, "_ecore_config_ipc_init: registered \"%s\"...\n", pipe_name);
266
267    list->name = strdup(pipe_name);
268    list->next = __ecore_config_servers;
269
270    __ecore_config_servers = list;
271    if (!ret_srv)
272      ret_srv = list;
273
274    if (!ipc_timer)
275      ipc_timer = ecore_timer_add(100, _ecore_config_ipc_poll, NULL);
276    
277    return ret_srv;
278 }
279 /*****************************************************************************/