cleanup battery module

- Only open one connection to dbus (e_dbus_bus_get) and then close it on
  shutdown.
- Fix autodetection of backend.

SVN revision: 51764
This commit is contained in:
Sebastian Dransfeld 2010-08-30 19:57:36 +00:00
parent 6ad79e964f
commit d1b854b9c1
4 changed files with 51 additions and 93 deletions

View File

@ -19,43 +19,41 @@ extern Eina_List *device_batteries;
extern Eina_List *device_ac_adapters; extern Eina_List *device_ac_adapters;
extern double init_time; extern double init_time;
static E_DBus_Connection *e_dbus_conn = NULL;
void int
_battery_dbus_start(void) _battery_dbus_start(void)
{ {
E_DBus_Connection *conn; e_dbus_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!e_dbus_conn) return 0;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!conn) return;
// FIXME: e_dbus doesnt allow us to track this pending call // FIXME: e_dbus doesnt allow us to track this pending call
e_hal_manager_find_device_by_capability e_hal_manager_find_device_by_capability
(conn, "battery", _battery_dbus_find_battery, NULL); (e_dbus_conn, "battery", _battery_dbus_find_battery, NULL);
e_hal_manager_find_device_by_capability e_hal_manager_find_device_by_capability
(conn, "ac_adapter", _battery_dbus_find_ac, NULL); (e_dbus_conn, "ac_adapter", _battery_dbus_find_ac, NULL);
battery_config->dbus.dev_add = battery_config->dbus.dev_add =
e_dbus_signal_handler_add(conn, E_HAL_SENDER, e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER,
E_HAL_MANAGER_PATH, E_HAL_MANAGER_PATH,
E_HAL_MANAGER_INTERFACE, E_HAL_MANAGER_INTERFACE,
"DeviceAdded", _battery_dbus_dev_add, NULL); "DeviceAdded", _battery_dbus_dev_add, NULL);
battery_config->dbus.dev_del = battery_config->dbus.dev_del =
e_dbus_signal_handler_add(conn, E_HAL_SENDER, e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER,
E_HAL_MANAGER_PATH, E_HAL_MANAGER_PATH,
E_HAL_MANAGER_INTERFACE, E_HAL_MANAGER_INTERFACE,
"DeviceRemoved", _battery_dbus_dev_del, NULL); "DeviceRemoved", _battery_dbus_dev_del, NULL);
init_time = ecore_time_get(); init_time = ecore_time_get();
return 1;
} }
void void
_battery_dbus_stop(void) _battery_dbus_stop(void)
{ {
E_DBus_Connection *conn;
Ac_Adapter *ac; Ac_Adapter *ac;
Battery *bat; Battery *bat;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); if (!e_dbus_conn) return;
if (!conn) return;
if (battery_config->dbus.have) if (battery_config->dbus.have)
{ {
dbus_pending_call_cancel(battery_config->dbus.have); dbus_pending_call_cancel(battery_config->dbus.have);
@ -63,24 +61,24 @@ _battery_dbus_stop(void)
} }
if (battery_config->dbus.dev_add) if (battery_config->dbus.dev_add)
{ {
e_dbus_signal_handler_del(conn, battery_config->dbus.dev_add); e_dbus_signal_handler_del(e_dbus_conn, battery_config->dbus.dev_add);
battery_config->dbus.dev_add = NULL; battery_config->dbus.dev_add = NULL;
} }
if (battery_config->dbus.dev_del) if (battery_config->dbus.dev_del)
{ {
e_dbus_signal_handler_del(conn, battery_config->dbus.dev_del); e_dbus_signal_handler_del(e_dbus_conn, battery_config->dbus.dev_del);
battery_config->dbus.dev_del = NULL; battery_config->dbus.dev_del = NULL;
} }
EINA_LIST_FREE(device_ac_adapters, ac) EINA_LIST_FREE(device_ac_adapters, ac)
{ {
e_dbus_signal_handler_del(conn, ac->prop_change); e_dbus_signal_handler_del(e_dbus_conn, ac->prop_change);
eina_stringshare_del(ac->udi); eina_stringshare_del(ac->udi);
eina_stringshare_del(ac->product); eina_stringshare_del(ac->product);
free(ac); free(ac);
} }
EINA_LIST_FREE(device_batteries, bat) EINA_LIST_FREE(device_batteries, bat)
{ {
e_dbus_signal_handler_del(conn, bat->prop_change); e_dbus_signal_handler_del(e_dbus_conn, bat->prop_change);
eina_stringshare_del(bat->udi); eina_stringshare_del(bat->udi);
eina_stringshare_del(bat->technology); eina_stringshare_del(bat->technology);
eina_stringshare_del(bat->type); eina_stringshare_del(bat->type);
@ -89,6 +87,8 @@ _battery_dbus_stop(void)
eina_stringshare_del(bat->vendor); eina_stringshare_del(bat->vendor);
free(bat); free(bat);
} }
e_dbus_connection_close(e_dbus_conn);
e_dbus_conn = NULL;
} }
static void static void
@ -183,36 +183,25 @@ _battery_dbus_ac_adapter_props(void *data, void *reply_data, DBusError *error __
static void static void
_battery_dbus_battery_property_changed(void *data, DBusMessage *msg __UNUSED__) _battery_dbus_battery_property_changed(void *data, DBusMessage *msg __UNUSED__)
{ {
E_DBus_Connection *conn;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!conn) return;
// FIXME: e_dbus doesnt allow us to track this pending call // FIXME: e_dbus doesnt allow us to track this pending call
e_hal_device_get_all_properties(conn, ((Battery *)data)->udi, e_hal_device_get_all_properties(e_dbus_conn, ((Battery *)data)->udi,
_battery_dbus_battery_props, data); _battery_dbus_battery_props, data);
} }
static void static void
_battery_dbus_ac_adapter_property_changed(void *data, DBusMessage *msg __UNUSED__) _battery_dbus_ac_adapter_property_changed(void *data, DBusMessage *msg __UNUSED__)
{ {
E_DBus_Connection *conn;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!conn) return;
// FIXME: e_dbus doesnt allow us to track this pending call // FIXME: e_dbus doesnt allow us to track this pending call
e_hal_device_get_all_properties(conn, ((Ac_Adapter *)data)->udi, e_hal_device_get_all_properties(e_dbus_conn, ((Ac_Adapter *)data)->udi,
_battery_dbus_ac_adapter_props, data); _battery_dbus_ac_adapter_props, data);
} }
static void static void
_battery_dbus_battery_add(const char *udi) _battery_dbus_battery_add(const char *udi)
{ {
E_DBus_Connection *conn;
Battery *bat; Battery *bat;
bat = _battery_battery_find(udi); bat = _battery_battery_find(udi);
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!conn) return;
if (!bat) if (!bat)
{ {
bat = E_NEW(Battery, 1); bat = E_NEW(Battery, 1);
@ -220,13 +209,13 @@ _battery_dbus_battery_add(const char *udi)
bat->udi = eina_stringshare_add(udi); bat->udi = eina_stringshare_add(udi);
device_batteries = eina_list_append(device_batteries, bat); device_batteries = eina_list_append(device_batteries, bat);
bat->prop_change = bat->prop_change =
e_dbus_signal_handler_add(conn, E_HAL_SENDER, udi, e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER, udi,
E_HAL_DEVICE_INTERFACE, "PropertyModified", E_HAL_DEVICE_INTERFACE, "PropertyModified",
_battery_dbus_battery_property_changed, _battery_dbus_battery_property_changed,
bat); bat);
} }
// FIXME: e_dbus doesnt allow us to track this pending call // FIXME: e_dbus doesnt allow us to track this pending call
e_hal_device_get_all_properties(conn, udi, e_hal_device_get_all_properties(e_dbus_conn, udi,
_battery_dbus_battery_props, bat); _battery_dbus_battery_props, bat);
_battery_device_update(); _battery_device_update();
@ -235,16 +224,13 @@ _battery_dbus_battery_add(const char *udi)
static void static void
_battery_dbus_battery_del(const char *udi) _battery_dbus_battery_del(const char *udi)
{ {
E_DBus_Connection *conn;
Eina_List *l; Eina_List *l;
Battery *bat; Battery *bat;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!conn) return;
bat = _battery_battery_find(udi); bat = _battery_battery_find(udi);
if (bat) if (bat)
{ {
e_dbus_signal_handler_del(conn, bat->prop_change); e_dbus_signal_handler_del(e_dbus_conn, bat->prop_change);
l = eina_list_data_find(device_batteries, bat); l = eina_list_data_find(device_batteries, bat);
eina_stringshare_del(bat->udi); eina_stringshare_del(bat->udi);
eina_stringshare_del(bat->technology); eina_stringshare_del(bat->technology);
@ -262,22 +248,19 @@ _battery_dbus_battery_del(const char *udi)
static void static void
_battery_dbus_ac_adapter_add(const char *udi) _battery_dbus_ac_adapter_add(const char *udi)
{ {
E_DBus_Connection *conn;
Ac_Adapter *ac; Ac_Adapter *ac;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!conn) return;
ac = E_NEW(Ac_Adapter, 1); ac = E_NEW(Ac_Adapter, 1);
if (!ac) return; if (!ac) return;
ac->udi = eina_stringshare_add(udi); ac->udi = eina_stringshare_add(udi);
device_ac_adapters = eina_list_append(device_ac_adapters, ac); device_ac_adapters = eina_list_append(device_ac_adapters, ac);
ac->prop_change = ac->prop_change =
e_dbus_signal_handler_add(conn, E_HAL_SENDER, udi, e_dbus_signal_handler_add(e_dbus_conn, E_HAL_SENDER, udi,
E_HAL_DEVICE_INTERFACE, "PropertyModified", E_HAL_DEVICE_INTERFACE, "PropertyModified",
_battery_dbus_ac_adapter_property_changed, _battery_dbus_ac_adapter_property_changed,
ac); ac);
// FIXME: e_dbus doesnt allow us to track this pending call // FIXME: e_dbus doesnt allow us to track this pending call
e_hal_device_get_all_properties(conn, udi, e_hal_device_get_all_properties(e_dbus_conn, udi,
_battery_dbus_ac_adapter_props, ac); _battery_dbus_ac_adapter_props, ac);
_battery_device_update(); _battery_device_update();
} }
@ -285,16 +268,13 @@ _battery_dbus_ac_adapter_add(const char *udi)
static void static void
_battery_dbus_ac_adapter_del(const char *udi) _battery_dbus_ac_adapter_del(const char *udi)
{ {
E_DBus_Connection *conn;
Eina_List *l; Eina_List *l;
Ac_Adapter *ac; Ac_Adapter *ac;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!conn) return;
ac = _battery_ac_adapter_find(udi); ac = _battery_ac_adapter_find(udi);
if (ac) if (ac)
{ {
e_dbus_signal_handler_del(conn, ac->prop_change); e_dbus_signal_handler_del(e_dbus_conn, ac->prop_change);
l = eina_list_data_find(device_ac_adapters, ac); l = eina_list_data_find(device_ac_adapters, ac);
eina_stringshare_del(ac->udi); eina_stringshare_del(ac->udi);
eina_stringshare_del(ac->product); eina_stringshare_del(ac->product);
@ -393,17 +373,14 @@ _battery_dbus_dev_add(void *data __UNUSED__, DBusMessage *msg)
{ {
DBusError err; DBusError err;
char *udi = NULL; char *udi = NULL;
E_DBus_Connection *conn;
dbus_error_init(&err); dbus_error_init(&err);
dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID); dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
if (!udi) return; if (!udi) return;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!conn) return;
// FIXME: e_dbus doesnt allow us to track this pending call // FIXME: e_dbus doesnt allow us to track this pending call
e_hal_device_query_capability(conn, udi, "battery", e_hal_device_query_capability(e_dbus_conn, udi, "battery",
_battery_dbus_is_battery, (void*)eina_stringshare_add(udi)); _battery_dbus_is_battery, (void*)eina_stringshare_add(udi));
e_hal_device_query_capability(conn, udi, "ac_adapter", e_hal_device_query_capability(e_dbus_conn, udi, "ac_adapter",
_battery_dbus_is_ac_adapter, (void*)eina_stringshare_add(udi)); _battery_dbus_is_ac_adapter, (void*)eina_stringshare_add(udi));
} }

View File

@ -344,6 +344,7 @@ _battery_config_updated(void)
Eina_List *l; Eina_List *l;
Instance *inst; Instance *inst;
char buf[4096]; char buf[4096];
int ok = 0;
if (!battery_config) return; if (!battery_config) return;
@ -352,24 +353,27 @@ _battery_config_updated(void)
EINA_LIST_FOREACH(battery_config->instances, l, inst) EINA_LIST_FOREACH(battery_config->instances, l, inst)
_battery_warning_popup_destroy(inst); _battery_warning_popup_destroy(inst);
} }
if (battery_config->have_subsystem == UNKNOWN)
{
#ifdef HAVE_EEZE
battery_config->have_subsystem = SUBSYSTEM;
#else
if (!e_dbus_bus_get(DBUS_BUS_SYSTEM))
battery_config->have_subsystem = NOSUBSYSTEM;
#endif
}
if ((battery_config->have_subsystem == NOSUBSYSTEM) ||
(battery_config->force_mode == NOSUBSYSTEM))
{
if (battery_config->batget_exe) if (battery_config->batget_exe)
{ {
ecore_exe_terminate(battery_config->batget_exe); ecore_exe_terminate(battery_config->batget_exe);
ecore_exe_free(battery_config->batget_exe); ecore_exe_free(battery_config->batget_exe);
battery_config->batget_exe = NULL;
} }
if ((battery_config->force_mode == UNKNOWN) ||
(battery_config->force_mode == SUBSYSTEM))
{
#ifdef HAVE_EEZE
ok = _battery_udev_start();
#else
ok = _battery_dbus_start();
#endif
}
if (ok) return;
if ((battery_config->force_mode == UNKNOWN) ||
(battery_config->force_mode == NOSUBSYSTEM))
{
snprintf(buf, sizeof(buf), "%s/%s/batget %i", snprintf(buf, sizeof(buf), "%s/%s/batget %i",
e_module_dir_get(battery_config->module), MODULE_ARCH, e_module_dir_get(battery_config->module), MODULE_ARCH,
battery_config->poll_interval); battery_config->poll_interval);
@ -379,29 +383,6 @@ _battery_config_updated(void)
ECORE_EXE_PIPE_READ_LINE_BUFFERED | ECORE_EXE_PIPE_READ_LINE_BUFFERED |
ECORE_EXE_NOT_LEADER, NULL); ECORE_EXE_NOT_LEADER, NULL);
} }
else if ((battery_config->have_subsystem == UNKNOWN) ||
(battery_config->force_mode == SUBSYSTEM))
{
if (battery_config->batget_exe)
{
ecore_exe_terminate(battery_config->batget_exe);
ecore_exe_free(battery_config->batget_exe);
battery_config->batget_exe = NULL;
}
#ifdef HAVE_EEZE
_battery_udev_start();
#else
E_DBus_Connection *conn;
conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (conn)
{
battery_config->have_subsystem = SUBSYSTEM;
_battery_dbus_start();
}
else
battery_config->have_subsystem = NOSUBSYSTEM;
#endif
}
} }
static Eina_Bool static Eina_Bool

View File

@ -37,7 +37,6 @@ struct _Config
int time_full; int time_full;
int have_battery; int have_battery;
int have_power; int have_power;
int have_subsystem;
#ifdef HAVE_EEZE #ifdef HAVE_EEZE
Eeze_Udev_Watch *acwatch; Eeze_Udev_Watch *acwatch;
Eeze_Udev_Watch *batwatch; Eeze_Udev_Watch *batwatch;
@ -110,12 +109,12 @@ Ac_Adapter *_battery_ac_adapter_find(const char *udi);
void _battery_device_update(void); void _battery_device_update(void);
#ifdef HAVE_EEZE #ifdef HAVE_EEZE
/* in e_mod_udev.c */ /* in e_mod_udev.c */
void _battery_udev_start(void); int _battery_udev_start(void);
void _battery_udev_stop(void); void _battery_udev_stop(void);
/* end e_mod_udev.c */ /* end e_mod_udev.c */
#else #else
/* in e_mod_dbus.c */ /* in e_mod_dbus.c */
void _battery_dbus_start(void); int _battery_dbus_start(void);
void _battery_dbus_stop(void); void _battery_dbus_stop(void);
/* end e_mod_dbus.c */ /* end e_mod_dbus.c */
#endif #endif

View File

@ -15,7 +15,7 @@ extern Eina_List *device_batteries;
extern Eina_List *device_ac_adapters; extern Eina_List *device_ac_adapters;
extern double init_time; extern double init_time;
void int
_battery_udev_start(void) _battery_udev_start(void)
{ {
Eina_List *devices; Eina_List *devices;
@ -35,6 +35,7 @@ _battery_udev_start(void)
battery_config->acwatch = eeze_udev_watch_add(EEZE_UDEV_TYPE_POWER_AC, EEZE_UDEV_EVENT_NONE, _battery_udev_event_ac, NULL); battery_config->acwatch = eeze_udev_watch_add(EEZE_UDEV_TYPE_POWER_AC, EEZE_UDEV_EVENT_NONE, _battery_udev_event_ac, NULL);
init_time = ecore_time_get(); init_time = ecore_time_get();
return 1;
} }
void void