e: small fixes to battery conversion to edbus

- const where it's due
 - reorder functions
 - break loop as soon as "Online" property is found on dict
 - add missing proxy unrefs
 - fix crash if upower reports a battery with technology known to it but
   unknown for us
 - refactor _bat_get_call_cb():  this could be much simpler if upower used
   the default signal for notifying property changes. Since it doesn't,
   at least decrease a little bit the amount of code.
 - use eina_stringshare_replace() instead of del() + add()
 - remove check for message signature. If it doesn't have the signature
   we are expecting, edbus_message_iter_arguments_get() will fail.
 - fix indentation using tab



SVN revision: 81976
This commit is contained in:
Lucas De Marchi 2013-01-02 13:14:48 +00:00
parent 71fa105fd8
commit 0313f186c5
1 changed files with 86 additions and 97 deletions

View File

@ -12,8 +12,33 @@ extern double init_time;
static EDBus_Connection *conn; static EDBus_Connection *conn;
static EDBus_Proxy *upower_proxy; static EDBus_Proxy *upower_proxy;
static void _battery_free(Battery *bat); static void
static void _ac_free(Ac_Adapter *ac); _battery_free(Battery *bat)
{
EDBus_Object *obj = edbus_proxy_object_get(bat->proxy);
edbus_proxy_unref(bat->proxy);
edbus_object_unref(obj);
device_batteries = eina_list_remove(device_batteries, bat);
eina_stringshare_del(bat->udi);
if (bat->model)
eina_stringshare_del(bat->model);
if (bat->vendor)
eina_stringshare_del(bat->vendor);
free(bat);
}
static void
_ac_free(Ac_Adapter *ac)
{
EDBus_Object *obj = edbus_proxy_object_get(ac->proxy);
edbus_proxy_unref(ac->proxy);
edbus_object_unref(obj);
device_ac_adapters = eina_list_remove(device_ac_adapters, ac);
eina_stringshare_del(ac->udi);
free(ac);
}
static void static void
_ac_get_all_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending __UNUSED__) _ac_get_all_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending __UNUSED__)
@ -21,20 +46,22 @@ _ac_get_all_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending __UN
Ac_Adapter *ac = data; Ac_Adapter *ac = data;
EDBus_Message_Iter *array, *dict, *variant; EDBus_Message_Iter *array, *dict, *variant;
if (edbus_message_error_get(msg, NULL, NULL))
return;
if (!edbus_message_arguments_get(msg, "a{sv}", &array)) if (!edbus_message_arguments_get(msg, "a{sv}", &array))
return; return;
while (edbus_message_iter_get_and_next(array, 'e', &dict)) while (edbus_message_iter_get_and_next(array, 'e', &dict))
{ {
char *key; const char *key;
if (!edbus_message_iter_arguments_get(dict, "sv", &key, &variant)) if (!edbus_message_iter_arguments_get(dict, "sv", &key, &variant))
continue; continue;
if (!strcmp(key, "Online")) if (!strcmp(key, "Online"))
{ {
Eina_Bool b; Eina_Bool b;
edbus_message_iter_arguments_get(variant, "b", &b); edbus_message_iter_arguments_get(variant, "b", &b);
ac->present = b; ac->present = b;
break;
} }
} }
_battery_device_update(); _battery_device_update();
@ -59,12 +86,14 @@ _process_ac(EDBus_Proxy *proxy)
edbus_proxy_signal_handler_add(proxy, "Changed", _ac_changed_cb, ac); edbus_proxy_signal_handler_add(proxy, "Changed", _ac_changed_cb, ac);
device_ac_adapters = eina_list_append(device_ac_adapters, ac); device_ac_adapters = eina_list_append(device_ac_adapters, ac);
return; return;
error: error:
edbus_object_unref(edbus_proxy_object_get(proxy)); edbus_object_unref(edbus_proxy_object_get(proxy));
edbus_proxy_unref(proxy);
return; return;
} }
static const char *bat_techologys[] = { static const char *bat_techologies[] = {
"Unknown", "Unknown",
"Lithium ion", "Lithium ion",
"Lithium polymer", "Lithium polymer",
@ -81,84 +110,81 @@ _bat_get_all_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending __U
EDBus_Message_Iter *array, *dict, *variant; EDBus_Message_Iter *array, *dict, *variant;
bat->got_prop = EINA_TRUE; bat->got_prop = EINA_TRUE;
if (edbus_message_error_get(msg, NULL, NULL))
return;
if (!edbus_message_arguments_get(msg, "a{sv}", &array)) if (!edbus_message_arguments_get(msg, "a{sv}", &array))
return; return;
while (edbus_message_iter_get_and_next(array, 'e', &dict)) while (edbus_message_iter_get_and_next(array, 'e', &dict))
{ {
char *key; const char *key;
union
{
Eina_Bool b;
int64_t i64;
unsigned u;
double d;
const char *s;
} val;
if (!edbus_message_iter_arguments_get(dict, "sv", &key, &variant)) if (!edbus_message_iter_arguments_get(dict, "sv", &key, &variant))
continue; continue;
if (!strcmp(key, "IsPresent")) if (!strcmp(key, "IsPresent"))
{ {
Eina_Bool b; edbus_message_iter_arguments_get(variant, "b", &val.b);
edbus_message_iter_arguments_get(variant, "b", &b); bat->present = val.b;
bat->present = b;
} }
else if (!strcmp(key, "TimeToEmpty")) else if (!strcmp(key, "TimeToEmpty"))
{ {
int64_t empty = 0; edbus_message_iter_arguments_get(variant, "x", &val.i64);
edbus_message_iter_arguments_get(variant, "x", &empty); bat->time_left = (int) val.i64;
bat->time_left = (int) empty; if (bat->time_left > 0)
if (empty > 0)
bat->charging = EINA_FALSE; bat->charging = EINA_FALSE;
else else
bat->charging = EINA_TRUE; bat->charging = EINA_TRUE;
} }
else if (!strcmp(key, "Percentage")) else if (!strcmp(key, "Percentage"))
{ {
double d; edbus_message_iter_arguments_get(variant, "d", &val.d);
edbus_message_iter_arguments_get(variant, "d", &d); bat->percent = (int) val.d;
bat->percent = (int) d;
} }
else if (!strcmp(key, "Energy")) else if (!strcmp(key, "Energy"))
{ {
double d; edbus_message_iter_arguments_get(variant, "d", &val.d);
edbus_message_iter_arguments_get(variant, "d", &d); bat->current_charge = (int) val.d;
bat->current_charge = (int) d;
} }
else if (!strcmp(key, "EnergyFullDesign")) else if (!strcmp(key, "EnergyFullDesign"))
{ {
double d; edbus_message_iter_arguments_get(variant, "d", &val.d);
edbus_message_iter_arguments_get(variant, "d", &d); bat->design_charge = (int) val.d;
bat->design_charge = (int) d;
} }
else if (!strcmp(key, "EnergyFull")) else if (!strcmp(key, "EnergyFull"))
{ {
double d; edbus_message_iter_arguments_get(variant, "d", &val.d);
edbus_message_iter_arguments_get(variant, "d", &d); bat->last_full_charge = (int) val.d;
bat->last_full_charge = (int) d;
} }
else if (!strcmp(key, "TimeToFull")) else if (!strcmp(key, "TimeToFull"))
{ {
int64_t full = 0; edbus_message_iter_arguments_get(variant, "x", &val.i64);
edbus_message_iter_arguments_get(variant, "x", &full); bat->time_full = (int) val.i64;
bat->time_full = (int) full;
} }
else if (!strcmp(key, "Technology")) else if (!strcmp(key, "Technology"))
{ {
uint32_t tec = 0; edbus_message_iter_arguments_get(variant, "u", &val.u);
edbus_message_iter_arguments_get(variant, "u", &tec); if (val.u > EINA_C_ARRAY_LENGTH(bat_techologies))
bat->technology = bat_techologys[tec]; val.u = 0;
bat->technology = bat_techologies[val.u];
} }
else if (!strcmp(key, "Model")) else if (!strcmp(key, "Model"))
{ {
char *txt; if (!edbus_message_iter_arguments_get(variant, "s", &val.s))
if (!edbus_message_iter_arguments_get(variant, "s", &txt))
continue; continue;
if (bat->model) eina_stringshare_replace(&bat->model, val.s);
eina_stringshare_del(bat->model);
bat->model = eina_stringshare_add(txt);
} }
else if (!strcmp(key, "Vendor")) else if (!strcmp(key, "Vendor"))
{ {
char *txt; if (!edbus_message_iter_arguments_get(variant, "s", &val.s))
if (!edbus_message_iter_arguments_get(variant, "s", &txt))
continue; continue;
if (bat->vendor) if (bat->vendor)
eina_stringshare_del(bat->vendor); eina_stringshare_del(bat->vendor);
bat->vendor = eina_stringshare_add(txt); bat->vendor = eina_stringshare_add(val.s);
} }
} }
_battery_device_update(); _battery_device_update();
@ -180,6 +206,7 @@ _process_battery(EDBus_Proxy *proxy)
if (!bat) if (!bat)
{ {
edbus_object_unref(edbus_proxy_object_get(proxy)); edbus_object_unref(edbus_proxy_object_get(proxy));
edbus_proxy_unref(proxy);
return; return;
} }
@ -197,19 +224,11 @@ _device_type_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending __U
EDBus_Proxy *proxy = data; EDBus_Proxy *proxy = data;
EDBus_Message_Iter *variant; EDBus_Message_Iter *variant;
EDBus_Object *obj; EDBus_Object *obj;
unsigned int type = 0; unsigned int type;
char *signature;
if (edbus_message_error_get(msg, NULL, NULL))
goto error;
if (!edbus_message_arguments_get(msg, "v", &variant)) if (!edbus_message_arguments_get(msg, "v", &variant))
goto error; goto error;
signature = edbus_message_iter_signature_get(variant);
if (!signature || signature[0] != 'u')
goto error;
edbus_message_iter_arguments_get(variant, "u", &type); edbus_message_iter_arguments_get(variant, "u", &type);
if (type == 1) if (type == 1)
_process_ac(proxy); _process_ac(proxy);
@ -219,6 +238,7 @@ _device_type_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending __U
goto error; goto error;
return; return;
error: error:
obj = edbus_proxy_object_get(proxy); obj = edbus_proxy_object_get(proxy);
edbus_proxy_unref(proxy); edbus_proxy_unref(proxy);
@ -227,14 +247,11 @@ error:
} }
static void static void
_process_enumerate_path(char *path) _process_enumerate_path(const char *path)
{ {
EDBus_Object *obj; EDBus_Object *obj;
EDBus_Proxy *proxy; EDBus_Proxy *proxy;
if (!path || !path[0])
return;
obj = edbus_object_get(conn, BUS, path); obj = edbus_object_get(conn, BUS, path);
EINA_SAFETY_ON_FALSE_RETURN(obj); EINA_SAFETY_ON_FALSE_RETURN(obj);
proxy = edbus_proxy_get(obj, "org.freedesktop.UPower.Device"); proxy = edbus_proxy_get(obj, "org.freedesktop.UPower.Device");
@ -244,10 +261,8 @@ _process_enumerate_path(char *path)
static void static void
_enumerate_cb(void *data __UNUSED__, const EDBus_Message *msg, EDBus_Pending *pending __UNUSED__) _enumerate_cb(void *data __UNUSED__, const EDBus_Message *msg, EDBus_Pending *pending __UNUSED__)
{ {
char *path; const char *path;
EDBus_Message_Iter *array; EDBus_Message_Iter *array;
if (edbus_message_error_get(msg, NULL, NULL))
return;
if (!edbus_message_arguments_get(msg, "ao", &array)) if (!edbus_message_arguments_get(msg, "ao", &array))
return; return;
@ -259,7 +274,8 @@ _enumerate_cb(void *data __UNUSED__, const EDBus_Message *msg, EDBus_Pending *pe
static void static void
_device_added_cb(void *data __UNUSED__, const EDBus_Message *msg) _device_added_cb(void *data __UNUSED__, const EDBus_Message *msg)
{ {
char *path; const char *path;
if (!edbus_message_arguments_get(msg, "o", &path)) if (!edbus_message_arguments_get(msg, "o", &path))
return; return;
_process_enumerate_path(path); _process_enumerate_path(path);
@ -270,7 +286,7 @@ _device_removed_cb(void *data __UNUSED__, const EDBus_Message *msg)
{ {
Battery *bat; Battery *bat;
Ac_Adapter *ac; Ac_Adapter *ac;
char *path; const char *path;
if (!edbus_message_arguments_get(msg, "o", &path)) if (!edbus_message_arguments_get(msg, "o", &path))
return; return;
@ -302,6 +318,7 @@ _battery_upower_start(void)
EINA_SAFETY_ON_NULL_GOTO(obj, obj_error); EINA_SAFETY_ON_NULL_GOTO(obj, obj_error);
upower_proxy = edbus_proxy_get(obj, IFACE); upower_proxy = edbus_proxy_get(obj, IFACE);
EINA_SAFETY_ON_NULL_GOTO(upower_proxy, proxy_error); EINA_SAFETY_ON_NULL_GOTO(upower_proxy, proxy_error);
edbus_proxy_call(upower_proxy, "EnumerateDevices", _enumerate_cb, NULL, -1, ""); edbus_proxy_call(upower_proxy, "EnumerateDevices", _enumerate_cb, NULL, -1, "");
edbus_proxy_signal_handler_add(upower_proxy, "DeviceAdded", _device_added_cb, NULL); edbus_proxy_signal_handler_add(upower_proxy, "DeviceAdded", _device_added_cb, NULL);
edbus_proxy_signal_handler_add(upower_proxy, "DeviceRemoved", _device_removed_cb, NULL); edbus_proxy_signal_handler_add(upower_proxy, "DeviceRemoved", _device_removed_cb, NULL);
@ -333,31 +350,3 @@ _battery_upower_stop(void)
edbus_connection_unref(conn); edbus_connection_unref(conn);
edbus_shutdown(); edbus_shutdown();
} }
static void
_battery_free(Battery *bat)
{
EDBus_Object *obj = edbus_proxy_object_get(bat->proxy);
edbus_proxy_unref(bat->proxy);
edbus_object_unref(obj);
device_batteries = eina_list_remove(device_batteries, bat);
eina_stringshare_del(bat->udi);
if (bat->model)
eina_stringshare_del(bat->model);
if (bat->vendor)
eina_stringshare_del(bat->vendor);
free(bat);
}
static void
_ac_free(Ac_Adapter *ac)
{
EDBus_Object *obj = edbus_proxy_object_get(ac->proxy);
edbus_proxy_unref(ac->proxy);
edbus_object_unref(obj);
device_ac_adapters = eina_list_remove(device_ac_adapters, ac);
eina_stringshare_del(ac->udi);
free(ac);
}