2 #include "e_mod_main.h"
4 static void _battery_dbus_battery_props(void *data, void *reply_data, DBusError *error);
5 static void _battery_dbus_ac_adapter_props(void *data, void *reply_data, DBusError *error);
6 static void _battery_dbus_battery_property_changed(void *data, DBusMessage *msg);
7 static void _battery_dbus_battery_add(const char *udi);
8 static void _battery_dbus_battery_del(const char *udi);
9 static void _battery_dbus_ac_adapter_add(const char *udi);
10 static void _battery_dbus_ac_adapter_del(const char *udi);
11 static void _battery_dbus_find_battery(void *user_data, void *reply_data, DBusError *err);
12 static void _battery_dbus_find_ac(void *user_data, void *reply_data, DBusError *err);
13 static void _battery_dbus_is_battery(void *user_data, void *reply_data, DBusError *err);
14 static void _battery_dbus_is_ac_adapter(void *user_data, void *reply_data, DBusError *err);
15 static void _battery_dbus_dev_add(void *data, DBusMessage *msg);
16 static void _battery_dbus_dev_del(void *data, DBusMessage *msg);
18 extern Eina_List *device_batteries;
19 extern Eina_List *device_ac_adapters;
20 extern double init_time;
22 static E_DBus_Connection *e_dbus_conn = NULL;
25 _battery_dbus_start(void)
27 e_dbus_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
28 if (!e_dbus_conn) return 0;
29 // FIXME: e_dbus doesn't allow us to track this pending call
30 e_hal_manager_find_device_by_capability
31 (e_dbus_conn, "battery", _battery_dbus_find_battery, NULL);
32 e_hal_manager_find_device_by_capability
33 (e_dbus_conn, "ac_adapter", _battery_dbus_find_ac, NULL);
34 battery_config->dbus.dev_add =
35 e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER,
37 E_HAL_MANAGER_INTERFACE,
38 "DeviceAdded", _battery_dbus_dev_add, NULL);
39 battery_config->dbus.dev_del =
40 e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER,
42 E_HAL_MANAGER_INTERFACE,
43 "DeviceRemoved", _battery_dbus_dev_del, NULL);
44 init_time = ecore_time_get();
49 _battery_dbus_stop(void)
54 if (!e_dbus_conn) return;
56 if (battery_config->dbus.have)
58 dbus_pending_call_cancel(battery_config->dbus.have);
59 battery_config->dbus.have = NULL;
61 if (battery_config->dbus.dev_add)
63 e_dbus_signal_handler_del(e_dbus_conn, battery_config->dbus.dev_add);
64 battery_config->dbus.dev_add = NULL;
66 if (battery_config->dbus.dev_del)
68 e_dbus_signal_handler_del(e_dbus_conn, battery_config->dbus.dev_del);
69 battery_config->dbus.dev_del = NULL;
71 EINA_LIST_FREE(device_ac_adapters, ac)
73 e_dbus_signal_handler_del(e_dbus_conn, ac->prop_change);
74 eina_stringshare_del(ac->udi);
75 eina_stringshare_del(ac->product);
78 EINA_LIST_FREE(device_batteries, bat)
80 e_dbus_signal_handler_del(e_dbus_conn, bat->prop_change);
81 eina_stringshare_del(bat->udi);
82 eina_stringshare_del(bat->technology);
83 eina_stringshare_del(bat->type);
84 eina_stringshare_del(bat->charge_units);
85 eina_stringshare_del(bat->model);
86 eina_stringshare_del(bat->vendor);
89 e_dbus_connection_close(e_dbus_conn);
94 _battery_dbus_battery_props(void *data, void *reply_data, DBusError *error __UNUSED__)
96 E_Hal_Properties *ret = reply_data;
101 if (dbus_error_is_set(error))
103 dbus_error_free(error);
111 #define GET_BOOL(val, s) bat->val = e_hal_property_bool_get(ret, s, &err)
112 #define GET_INT(val, s) bat->val = e_hal_property_int_get(ret, s, &err)
113 #define GET_STR(val, s) \
114 if (bat->val) eina_stringshare_del(bat->val); \
116 str = e_hal_property_string_get(ret, s, &err); \
119 bat->val = eina_stringshare_ref(str); \
122 GET_BOOL(present, "battery.present");
123 GET_STR(technology, "battery.reporting.technology");
124 GET_STR(model, "battery.model");
125 GET_STR(vendor, "battery.vendor");
126 GET_STR(type, "battery.type");
127 GET_STR(charge_units, "battery.reporting.unit");
128 GET_INT(percent, "battery.charge_level.percentage");
129 GET_BOOL(can_charge, "battery.is_rechargeable");
130 GET_INT(current_charge, "battery.charge_level.current");
131 GET_INT(charge_rate, "battery.charge_level.rate");
132 GET_INT(design_charge, "battery.charge_level.design");
133 GET_INT(last_full_charge, "battery.charge_level.last_full");
134 if (e_hal_property_bool_get(ret, "battery.rechargeable.is_charging", &err))
137 GET_INT(time_full, "battery.remaining_time");
143 GET_INT(time_left, "battery.remaining_time");
147 _battery_device_update();
151 _battery_dbus_ac_adapter_props(void *data, void *reply_data, DBusError *error __UNUSED__)
153 E_Hal_Properties *ret = reply_data;
154 Ac_Adapter *ac = data;
158 if (dbus_error_is_set(error))
160 dbus_error_free(error);
167 #define GET_BOOL(val, s) ac->val = e_hal_property_bool_get(ret, s, &err)
168 #define GET_STR(val, s) \
169 if (ac->val) eina_stringshare_del(ac->val); \
171 str = e_hal_property_string_get(ret, s, &err); \
174 ac->val = eina_stringshare_ref(str); \
177 GET_BOOL(present, "ac_adapter.present");
178 GET_STR(product, "info.product");
179 _battery_device_update();
183 _battery_dbus_battery_property_changed(void *data, DBusMessage *msg __UNUSED__)
185 // FIXME: e_dbus doesn't allow us to track this pending call
186 e_hal_device_get_all_properties(e_dbus_conn, ((Battery *)data)->udi,
187 _battery_dbus_battery_props, data);
191 _battery_dbus_ac_adapter_property_changed(void *data, DBusMessage *msg __UNUSED__)
193 // FIXME: e_dbus doesn't allow us to track this pending call
194 e_hal_device_get_all_properties(e_dbus_conn, ((Ac_Adapter *)data)->udi,
195 _battery_dbus_ac_adapter_props, data);
199 _battery_dbus_battery_add(const char *udi)
203 bat = _battery_battery_find(udi);
206 bat = E_NEW(Battery, 1);
208 bat->udi = eina_stringshare_add(udi);
209 device_batteries = eina_list_append(device_batteries, bat);
211 e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER, udi,
212 E_HAL_DEVICE_INTERFACE, "PropertyModified",
213 _battery_dbus_battery_property_changed,
216 // FIXME: e_dbus doesn't allow us to track this pending call
217 e_hal_device_get_all_properties(e_dbus_conn, udi,
218 _battery_dbus_battery_props, bat);
220 _battery_device_update();
224 _battery_dbus_battery_del(const char *udi)
228 bat = _battery_battery_find(udi);
231 e_dbus_signal_handler_del(e_dbus_conn, bat->prop_change);
232 device_batteries = eina_list_remove(device_batteries, bat);
233 eina_stringshare_del(bat->udi);
234 eina_stringshare_del(bat->technology);
235 eina_stringshare_del(bat->type);
236 eina_stringshare_del(bat->charge_units);
237 eina_stringshare_del(bat->model);
238 eina_stringshare_del(bat->vendor);
242 _battery_device_update();
246 _battery_dbus_ac_adapter_add(const char *udi)
250 ac = E_NEW(Ac_Adapter, 1);
252 ac->udi = eina_stringshare_add(udi);
253 device_ac_adapters = eina_list_append(device_ac_adapters, ac);
255 e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER, udi,
256 E_HAL_DEVICE_INTERFACE, "PropertyModified",
257 _battery_dbus_ac_adapter_property_changed,
259 // FIXME: e_dbus doesn't allow us to track this pending call
260 e_hal_device_get_all_properties(e_dbus_conn, udi,
261 _battery_dbus_ac_adapter_props, ac);
262 _battery_device_update();
266 _battery_dbus_ac_adapter_del(const char *udi)
270 ac = _battery_ac_adapter_find(udi);
273 e_dbus_signal_handler_del(e_dbus_conn, ac->prop_change);
274 device_ac_adapters = eina_list_remove(device_ac_adapters, ac);
275 eina_stringshare_del(ac->udi);
276 eina_stringshare_del(ac->product);
280 _battery_device_update();
284 _battery_dbus_find_battery(void *user_data __UNUSED__, void *reply_data, DBusError *err __UNUSED__)
288 E_Hal_Manager_Find_Device_By_Capability_Return *ret;
291 if (dbus_error_is_set(err))
293 dbus_error_free(err);
298 if (eina_list_count(ret->strings) < 1) return;
299 EINA_LIST_FOREACH(ret->strings, l, device)
300 _battery_dbus_battery_add(device);
304 _battery_dbus_find_ac(void *user_data __UNUSED__, void *reply_data, DBusError *err __UNUSED__)
308 E_Hal_Manager_Find_Device_By_Capability_Return *ret;
311 if (dbus_error_is_set(err))
313 dbus_error_free(err);
318 if (eina_list_count(ret->strings) < 1) return;
319 EINA_LIST_FOREACH(ret->strings, l, device)
320 _battery_dbus_ac_adapter_add(device);
324 _battery_dbus_is_battery(void *user_data, void *reply_data, DBusError *err)
326 char *udi = user_data;
327 E_Hal_Device_Query_Capability_Return *ret;
330 if (dbus_error_is_set(err))
332 dbus_error_free(err);
335 if (!ret) goto error;
337 _battery_dbus_battery_add(udi);
339 eina_stringshare_del(udi);
343 _battery_dbus_is_ac_adapter(void *user_data, void *reply_data, DBusError *err)
345 char *udi = user_data;
346 E_Hal_Device_Query_Capability_Return *ret;
349 if (dbus_error_is_set(err))
351 dbus_error_free(err);
354 if (!ret) goto error;
357 _battery_dbus_ac_adapter_add(udi);
359 eina_stringshare_del(udi);
363 _battery_dbus_dev_add(void *data __UNUSED__, DBusMessage *msg)
368 dbus_error_init(&err);
369 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
371 // FIXME: e_dbus doesn't allow us to track this pending call
372 e_hal_device_query_capability(e_dbus_conn, udi, "battery",
373 _battery_dbus_is_battery, (void *)eina_stringshare_add(udi));
374 e_hal_device_query_capability(e_dbus_conn, udi, "ac_adapter",
375 _battery_dbus_is_ac_adapter, (void *)eina_stringshare_add(udi));
379 _battery_dbus_dev_del(void *data __UNUSED__, DBusMessage *msg)
384 dbus_error_init(&err);
385 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
387 _battery_dbus_battery_del(udi);
388 _battery_dbus_ac_adapter_del(udi);