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();
50 _battery_dbus_stop(void)
55 if (!e_dbus_conn) return;
57 if (battery_config->dbus.have)
59 dbus_pending_call_cancel(battery_config->dbus.have);
60 battery_config->dbus.have = NULL;
62 if (battery_config->dbus.dev_add)
64 e_dbus_signal_handler_del(e_dbus_conn, battery_config->dbus.dev_add);
65 battery_config->dbus.dev_add = NULL;
67 if (battery_config->dbus.dev_del)
69 e_dbus_signal_handler_del(e_dbus_conn, battery_config->dbus.dev_del);
70 battery_config->dbus.dev_del = NULL;
72 EINA_LIST_FREE(device_ac_adapters, ac)
74 e_dbus_signal_handler_del(e_dbus_conn, ac->prop_change);
75 eina_stringshare_del(ac->udi);
76 eina_stringshare_del(ac->product);
79 EINA_LIST_FREE(device_batteries, bat)
81 e_dbus_signal_handler_del(e_dbus_conn, bat->prop_change);
82 eina_stringshare_del(bat->udi);
83 eina_stringshare_del(bat->technology);
84 eina_stringshare_del(bat->type);
85 eina_stringshare_del(bat->charge_units);
86 eina_stringshare_del(bat->model);
87 eina_stringshare_del(bat->vendor);
90 e_dbus_connection_close(e_dbus_conn);
95 _battery_dbus_battery_props(void *data, void *reply_data, DBusError *error __UNUSED__)
97 E_Hal_Properties *ret = reply_data;
102 if (dbus_error_is_set(error))
104 dbus_error_free(error);
112 #define GET_BOOL(val, s) bat->val = e_hal_property_bool_get(ret, s, &err)
113 #define GET_INT(val, s) bat->val = e_hal_property_int_get(ret, s, &err)
114 #define GET_STR(val, s) \
115 if (bat->val) eina_stringshare_del(bat->val); \
117 str = e_hal_property_string_get(ret, s, &err); \
120 bat->val = eina_stringshare_ref(str); \
123 GET_BOOL(present, "battery.present");
124 GET_STR(technology, "battery.reporting.technology");
125 GET_STR(model, "battery.model");
126 GET_STR(vendor, "battery.vendor");
127 GET_STR(type, "battery.type");
128 GET_STR(charge_units, "battery.reporting.unit");
129 GET_INT(percent, "battery.charge_level.percentage");
130 GET_BOOL(can_charge, "battery.is_rechargeable");
131 GET_INT(current_charge, "battery.charge_level.current");
132 GET_INT(charge_rate, "battery.charge_level.rate");
133 GET_INT(design_charge, "battery.charge_level.design");
134 GET_INT(last_full_charge, "battery.charge_level.last_full");
135 if (e_hal_property_bool_get(ret, "battery.rechargeable.is_charging", &err))
138 GET_INT(time_full, "battery.remaining_time");
144 GET_INT(time_left, "battery.remaining_time");
148 _battery_device_update();
152 _battery_dbus_ac_adapter_props(void *data, void *reply_data, DBusError *error __UNUSED__)
154 E_Hal_Properties *ret = reply_data;
155 Ac_Adapter *ac = data;
159 if (dbus_error_is_set(error))
161 dbus_error_free(error);
168 #define GET_BOOL(val, s) ac->val = e_hal_property_bool_get(ret, s, &err)
169 #define GET_STR(val, s) \
170 if (ac->val) eina_stringshare_del(ac->val); \
172 str = e_hal_property_string_get(ret, s, &err); \
175 ac->val = eina_stringshare_ref(str); \
178 GET_BOOL(present, "ac_adapter.present");
179 GET_STR(product, "info.product");
180 _battery_device_update();
184 _battery_dbus_battery_property_changed(void *data, DBusMessage *msg __UNUSED__)
186 // FIXME: e_dbus doesn't allow us to track this pending call
187 e_hal_device_get_all_properties(e_dbus_conn, ((Battery *)data)->udi,
188 _battery_dbus_battery_props, data);
192 _battery_dbus_ac_adapter_property_changed(void *data, DBusMessage *msg __UNUSED__)
194 // FIXME: e_dbus doesn't allow us to track this pending call
195 e_hal_device_get_all_properties(e_dbus_conn, ((Ac_Adapter *)data)->udi,
196 _battery_dbus_ac_adapter_props, data);
200 _battery_dbus_battery_add(const char *udi)
204 bat = _battery_battery_find(udi);
207 bat = E_NEW(Battery, 1);
209 bat->udi = eina_stringshare_add(udi);
210 device_batteries = eina_list_append(device_batteries, bat);
212 e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER, udi,
213 E_HAL_DEVICE_INTERFACE, "PropertyModified",
214 _battery_dbus_battery_property_changed,
217 // FIXME: e_dbus doesn't allow us to track this pending call
218 e_hal_device_get_all_properties(e_dbus_conn, udi,
219 _battery_dbus_battery_props, bat);
221 _battery_device_update();
225 _battery_dbus_battery_del(const char *udi)
230 bat = _battery_battery_find(udi);
233 e_dbus_signal_handler_del(e_dbus_conn, bat->prop_change);
234 l = eina_list_data_find(device_batteries, bat);
235 eina_stringshare_del(bat->udi);
236 eina_stringshare_del(bat->technology);
237 eina_stringshare_del(bat->type);
238 eina_stringshare_del(bat->charge_units);
239 eina_stringshare_del(bat->model);
240 eina_stringshare_del(bat->vendor);
242 device_batteries = eina_list_remove_list(device_batteries, l);
245 _battery_device_update();
249 _battery_dbus_ac_adapter_add(const char *udi)
253 ac = E_NEW(Ac_Adapter, 1);
255 ac->udi = eina_stringshare_add(udi);
256 device_ac_adapters = eina_list_append(device_ac_adapters, ac);
258 e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER, udi,
259 E_HAL_DEVICE_INTERFACE, "PropertyModified",
260 _battery_dbus_ac_adapter_property_changed,
262 // FIXME: e_dbus doesn't allow us to track this pending call
263 e_hal_device_get_all_properties(e_dbus_conn, udi,
264 _battery_dbus_ac_adapter_props, ac);
265 _battery_device_update();
269 _battery_dbus_ac_adapter_del(const char *udi)
274 ac = _battery_ac_adapter_find(udi);
277 e_dbus_signal_handler_del(e_dbus_conn, ac->prop_change);
278 l = eina_list_data_find(device_ac_adapters, ac);
279 eina_stringshare_del(ac->udi);
280 eina_stringshare_del(ac->product);
282 device_ac_adapters = eina_list_remove_list(device_ac_adapters, l);
285 _battery_device_update();
289 _battery_dbus_find_battery(void *user_data __UNUSED__, void *reply_data, DBusError *err __UNUSED__)
293 E_Hal_Manager_Find_Device_By_Capability_Return *ret;
296 if (dbus_error_is_set(err))
298 dbus_error_free(err);
303 if (eina_list_count(ret->strings) < 1) return;
304 EINA_LIST_FOREACH(ret->strings, l, device)
305 _battery_dbus_battery_add(device);
309 _battery_dbus_find_ac(void *user_data __UNUSED__, void *reply_data, DBusError *err __UNUSED__)
313 E_Hal_Manager_Find_Device_By_Capability_Return *ret;
317 if (dbus_error_is_set(err))
319 dbus_error_free(err);
324 if (eina_list_count(ret->strings) < 1) return;
325 EINA_LIST_FOREACH(ret->strings, l, device)
326 _battery_dbus_ac_adapter_add(device);
331 _battery_dbus_is_battery(void *user_data, void *reply_data, DBusError *err)
333 char *udi = user_data;
334 E_Hal_Device_Query_Capability_Return *ret;
338 if (dbus_error_is_set(err))
340 dbus_error_free(err);
343 if (!ret) goto error;
345 _battery_dbus_battery_add(udi);
347 eina_stringshare_del(udi);
351 _battery_dbus_is_ac_adapter(void *user_data, void *reply_data, DBusError *err)
353 char *udi = user_data;
354 E_Hal_Device_Query_Capability_Return *ret;
358 if (dbus_error_is_set(err))
360 dbus_error_free(err);
363 if (!ret) goto error;
366 _battery_dbus_ac_adapter_add(udi);
368 eina_stringshare_del(udi);
372 _battery_dbus_dev_add(void *data __UNUSED__, DBusMessage *msg)
377 dbus_error_init(&err);
378 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
380 // FIXME: e_dbus doesn't allow us to track this pending call
381 e_hal_device_query_capability(e_dbus_conn, udi, "battery",
382 _battery_dbus_is_battery, (void*)eina_stringshare_add(udi));
383 e_hal_device_query_capability(e_dbus_conn, udi, "ac_adapter",
384 _battery_dbus_is_ac_adapter, (void*)eina_stringshare_add(udi));
388 _battery_dbus_dev_del(void *data __UNUSED__, DBusMessage *msg)
393 dbus_error_init(&err);
394 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
396 _battery_dbus_battery_del(udi);
397 _battery_dbus_ac_adapter_del(udi);