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