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