update for beta release
[framework/uifw/e17.git] / src / bin / e_msgbus.c
1 #include "e.h"
2
3 /* local subsystem functions */
4 static void _e_msgbus_request_name_cb(void        *data,
5                                       DBusMessage *msg,
6                                       DBusError   *err);
7
8 static DBusMessage *_e_msgbus_core_restart_cb(E_DBus_Object *obj,
9                                               DBusMessage   *msg);
10 static DBusMessage *_e_msgbus_core_shutdown_cb(E_DBus_Object *obj,
11                                                DBusMessage   *msg);
12
13 static DBusMessage *_e_msgbus_module_load_cb(E_DBus_Object *obj,
14                                              DBusMessage   *msg);
15 static DBusMessage *_e_msgbus_module_unload_cb(E_DBus_Object *obj,
16                                                DBusMessage   *msg);
17 static DBusMessage *_e_msgbus_module_enable_cb(E_DBus_Object *obj,
18                                                DBusMessage   *msg);
19 static DBusMessage *_e_msgbus_module_disable_cb(E_DBus_Object *obj,
20                                                 DBusMessage   *msg);
21 static DBusMessage *_e_msgbus_module_list_cb(E_DBus_Object *obj,
22                                              DBusMessage   *msg);
23
24 static DBusMessage *_e_msgbus_profile_set_cb(E_DBus_Object *obj,
25                                              DBusMessage   *msg);
26 static DBusMessage *_e_msgbus_profile_get_cb(E_DBus_Object *obj,
27                                              DBusMessage   *msg);
28 static DBusMessage *_e_msgbus_profile_list_cb(E_DBus_Object *obj,
29                                               DBusMessage   *msg);
30 static DBusMessage *_e_msgbus_profile_add_cb(E_DBus_Object *obj,
31                                              DBusMessage   *msg);
32 static DBusMessage *_e_msgbus_profile_delete_cb(E_DBus_Object *obj,
33                                                 DBusMessage   *msg);
34
35 /* local subsystem globals */
36 static E_Msgbus_Data *_e_msgbus_data = NULL;
37
38 /* externally accessible functions */
39 EINTERN int
40 e_msgbus_init(void)
41 {
42    E_DBus_Interface *iface;
43
44    _e_msgbus_data = E_NEW(E_Msgbus_Data, 1);
45
46    e_dbus_init();
47 #ifdef HAVE_HAL
48    e_hal_init();
49 #endif
50
51    _e_msgbus_data->conn = e_dbus_bus_get(DBUS_BUS_SESSION);
52    if (!_e_msgbus_data->conn)
53      {
54         printf("WARNING: Cannot get DBUS_BUS_SESSION\n");
55         return 0;
56      }
57    e_dbus_request_name(_e_msgbus_data->conn, "org.enlightenment.wm.service", 0, _e_msgbus_request_name_cb, NULL);
58    _e_msgbus_data->obj = e_dbus_object_add(_e_msgbus_data->conn, "/org/enlightenment/wm/RemoteObject", NULL);
59
60    iface = e_dbus_interface_new("org.enlightenment.wm.Core");
61    if (!iface)
62      {
63         printf("WARNING: Cannot add org.enlightenment.wm.Core interface\n");
64         return 0;
65      }
66    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
67    e_dbus_interface_unref(iface);
68
69    /* Hardcore methods */
70    e_dbus_interface_method_add(iface, "Restart", "", "", _e_msgbus_core_restart_cb);
71    e_dbus_interface_method_add(iface, "Shutdown", "", "", _e_msgbus_core_shutdown_cb);
72
73    iface = e_dbus_interface_new("org.enlightenment.wm.Module");
74    if (!iface)
75      {
76         printf("WARNING: Cannot add org.enlightenment.wm.Module interface\n");
77         return 0;
78      }
79    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
80    e_dbus_interface_unref(iface);
81
82    /* Module methods */
83    e_dbus_interface_method_add(iface, "Load", "s", "", _e_msgbus_module_load_cb);
84    e_dbus_interface_method_add(iface, "Unload", "s", "", _e_msgbus_module_unload_cb);
85    e_dbus_interface_method_add(iface, "Enable", "s", "", _e_msgbus_module_enable_cb);
86    e_dbus_interface_method_add(iface, "Disable", "s", "", _e_msgbus_module_disable_cb);
87    e_dbus_interface_method_add(iface, "List", "", "a(si)", _e_msgbus_module_list_cb);
88
89    iface = e_dbus_interface_new("org.enlightenment.wm.Profile");
90    if (!iface)
91      {
92         printf("WARNING: Cannot add org.enlightenment.wm.Profile interface\n");
93         return 0;
94      }
95    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
96    e_dbus_interface_unref(iface);
97
98    /* Profile methods */
99    e_dbus_interface_method_add(iface, "Set", "s", "", _e_msgbus_profile_set_cb);
100    e_dbus_interface_method_add(iface, "Get", "", "s", _e_msgbus_profile_get_cb);
101    e_dbus_interface_method_add(iface, "List", "", "as", _e_msgbus_profile_list_cb);
102    e_dbus_interface_method_add(iface, "Add", "s", "", _e_msgbus_profile_add_cb);
103    e_dbus_interface_method_add(iface, "Delete", "s", "", _e_msgbus_profile_delete_cb);
104
105    return 1;
106 }
107
108 EINTERN int
109 e_msgbus_shutdown(void)
110 {
111    if (_e_msgbus_data->obj)
112      {
113         e_dbus_object_free(_e_msgbus_data->obj);
114      }
115    if (_e_msgbus_data->conn)
116      {
117         e_dbus_connection_close(_e_msgbus_data->conn);
118      }
119 #ifdef HAVE_HAL
120    e_hal_shutdown();
121 #endif
122    e_dbus_shutdown();
123
124    E_FREE(_e_msgbus_data);
125    _e_msgbus_data = NULL;
126    return 1;
127 }
128
129 EAPI void
130 e_msgbus_interface_attach(E_DBus_Interface *iface)
131 {
132    if (!_e_msgbus_data->obj) return;
133    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
134 }
135
136 EAPI void
137 e_msgbus_interface_detach(E_DBus_Interface *iface)
138 {
139    if (!_e_msgbus_data->obj) return;
140    e_dbus_object_interface_detach(_e_msgbus_data->obj, iface);
141 }
142
143 static void
144 _e_msgbus_request_name_cb(void        *data __UNUSED__,
145                           DBusMessage *msg __UNUSED__,
146                           DBusError   *err __UNUSED__)
147 {
148 //TODO Handle Errors
149 }
150
151 /* Core Handlers */
152 static DBusMessage *
153 _e_msgbus_core_restart_cb(E_DBus_Object *obj __UNUSED__,
154                           DBusMessage   *msg)
155 {
156    e_sys_action_do(E_SYS_RESTART, NULL);
157    return dbus_message_new_method_return(msg);
158 }
159
160 static DBusMessage *
161 _e_msgbus_core_shutdown_cb(E_DBus_Object *obj __UNUSED__,
162                            DBusMessage   *msg)
163 {
164    e_sys_action_do(E_SYS_EXIT, NULL);
165    return dbus_message_new_method_return(msg);
166 }
167
168 /* Modules Handlers */
169 static DBusMessage *
170 _e_msgbus_module_load_cb(E_DBus_Object *obj __UNUSED__,
171                          DBusMessage   *msg)
172 {
173    DBusMessageIter iter;
174    char *module;
175
176    dbus_message_iter_init(msg, &iter);
177    dbus_message_iter_get_basic(&iter, &module);
178
179    if (!e_module_find(module))
180      {
181         e_module_new(module);
182         e_config_save_queue();
183      }
184
185    return dbus_message_new_method_return(msg);
186 }
187
188 static DBusMessage *
189 _e_msgbus_module_unload_cb(E_DBus_Object *obj __UNUSED__,
190                            DBusMessage   *msg)
191 {
192    DBusMessageIter iter;
193    char *module;
194    E_Module *m;
195
196    dbus_message_iter_init(msg, &iter);
197    dbus_message_iter_get_basic(&iter, &module);
198
199    if ((m = e_module_find(module)))
200      {
201         e_module_disable(m);
202         e_object_del(E_OBJECT(m));
203         e_config_save_queue();
204      }
205
206    return dbus_message_new_method_return(msg);
207 }
208
209 static DBusMessage *
210 _e_msgbus_module_enable_cb(E_DBus_Object *obj __UNUSED__,
211                            DBusMessage   *msg)
212 {
213    DBusMessageIter iter;
214    char *module;
215    E_Module *m;
216
217    dbus_message_iter_init(msg, &iter);
218    dbus_message_iter_get_basic(&iter, &module);
219
220    if ((m = e_module_find(module)))
221      {
222         e_module_enable(m);
223         e_config_save_queue();
224      }
225
226    return dbus_message_new_method_return(msg);
227 }
228
229 static DBusMessage *
230 _e_msgbus_module_disable_cb(E_DBus_Object *obj __UNUSED__,
231                             DBusMessage   *msg)
232 {
233    DBusMessageIter iter;
234    char *module;
235    E_Module *m;
236
237    dbus_message_iter_init(msg, &iter);
238    dbus_message_iter_get_basic(&iter, &module);
239
240    if ((m = e_module_find(module)))
241      {
242         e_module_disable(m);
243         e_config_save_queue();
244      }
245
246    return dbus_message_new_method_return(msg);
247 }
248
249 static DBusMessage *
250 _e_msgbus_module_list_cb(E_DBus_Object *obj __UNUSED__,
251                          DBusMessage   *msg)
252 {
253    Eina_List *l;
254    E_Module *mod;
255    DBusMessage *reply;
256    DBusMessageIter iter;
257    DBusMessageIter arr;
258
259    reply = dbus_message_new_method_return(msg);
260    dbus_message_iter_init_append(reply, &iter);
261    dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(si)", &arr);
262
263    EINA_LIST_FOREACH(e_module_list(), l, mod)
264      {
265         DBusMessageIter sub;
266         const char *name;
267         int enabled;
268
269         name = mod->name;
270         enabled = mod->enabled;
271         dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &sub);
272         dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &(name));
273         dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(enabled));
274         dbus_message_iter_close_container(&arr, &sub);
275      }
276    dbus_message_iter_close_container(&iter, &arr);
277
278    return reply;
279 }
280
281 /* Profile Handlers */
282 static DBusMessage *
283 _e_msgbus_profile_set_cb(E_DBus_Object *obj __UNUSED__,
284                          DBusMessage   *msg)
285 {
286    DBusMessageIter iter;
287    char *profile;
288
289    dbus_message_iter_init(msg, &iter);
290    dbus_message_iter_get_basic(&iter, &profile);
291
292    e_config_save_flush();
293    e_config_profile_set(profile);
294    e_config_profile_save();
295    e_config_save_block_set(1);
296    e_sys_action_do(E_SYS_RESTART, NULL);
297
298    return dbus_message_new_method_return(msg);
299 }
300
301 static DBusMessage *
302 _e_msgbus_profile_get_cb(E_DBus_Object *obj __UNUSED__,
303                          DBusMessage   *msg)
304 {
305    DBusMessageIter iter;
306    DBusMessage *reply;
307    const char *profile;
308
309    profile = e_config_profile_get();
310
311    reply = dbus_message_new_method_return(msg);
312    dbus_message_iter_init_append(reply, &iter);
313    dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &profile);
314
315    return reply;
316 }
317
318 static DBusMessage *
319 _e_msgbus_profile_list_cb(E_DBus_Object *obj __UNUSED__,
320                           DBusMessage   *msg)
321 {
322    Eina_List *l;
323    const char *name;
324    DBusMessage *reply;
325    DBusMessageIter iter;
326    DBusMessageIter arr;
327
328    reply = dbus_message_new_method_return(msg);
329    dbus_message_iter_init_append(reply, &iter);
330    dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &arr);
331
332    EINA_LIST_FOREACH(e_config_profile_list(), l, name)
333      {
334         dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &name);
335      }
336    dbus_message_iter_close_container(&iter, &arr);
337
338    return reply;
339 }
340
341 static DBusMessage *
342 _e_msgbus_profile_add_cb(E_DBus_Object *obj __UNUSED__,
343                          DBusMessage   *msg)
344 {
345    DBusMessageIter iter;
346    char *profile;
347
348    dbus_message_iter_init(msg, &iter);
349    dbus_message_iter_get_basic(&iter, &profile);
350
351    e_config_profile_add(profile);
352
353    return dbus_message_new_method_return(msg);
354 }
355
356 static DBusMessage *
357 _e_msgbus_profile_delete_cb(E_DBus_Object *obj __UNUSED__,
358                             DBusMessage   *msg)
359 {
360    DBusMessageIter iter;
361    char *profile;
362
363    dbus_message_iter_init(msg, &iter);
364    dbus_message_iter_get_basic(&iter, &profile);
365    if (!strcmp(e_config_profile_get(), profile))
366      {
367         DBusMessage *ret;
368
369         ret = dbus_message_new_error(msg, "org.enlightenment.DBus.InvalidArgument",
370                                      "Can't delete active profile");
371         return ret;
372      }
373    e_config_profile_del(profile);
374
375    return dbus_message_new_method_return(msg);
376 }