diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-01-05 05:14:29 -0800 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-01-05 05:14:29 -0800 |
commit | cec31fbcdf1be94f060ba4e02db074b6a654afbd (patch) | |
tree | c06cd7ab95a03c9f75f5b0a817945a13028f42fb /src/notifier.c | |
parent | f5d476e9d5ecaa45e22823b2a21a1e2fad775aff (diff) | |
download | connman-cec31fbcdf1be94f060ba4e02db074b6a654afbd.tar.gz connman-cec31fbcdf1be94f060ba4e02db074b6a654afbd.tar.bz2 connman-cec31fbcdf1be94f060ba4e02db074b6a654afbd.zip |
Move online/offline state handling into notifier framework
Diffstat (limited to 'src/notifier.c')
-rw-r--r-- | src/notifier.c | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/src/notifier.c b/src/notifier.c index d2d33428..d001cfc7 100644 --- a/src/notifier.c +++ b/src/notifier.c @@ -80,7 +80,7 @@ void __connman_notifier_list_registered(DBusMessageIter *iter, void *user_data) { int i; - for (i = 0; i < 10; i++) { + for (i = 0; i < MAX_TECHNOLOGIES; i++) { const char *type = __connman_service_type2string(i); if (type == NULL) @@ -96,7 +96,7 @@ void __connman_notifier_list_enabled(DBusMessageIter *iter, void *user_data) { int i; - for (i = 0; i < 10; i++) { + for (i = 0; i < MAX_TECHNOLOGIES; i++) { const char *type = __connman_service_type2string(i); if (type == NULL) @@ -112,7 +112,7 @@ void __connman_notifier_list_connected(DBusMessageIter *iter, void *user_data) { int i; - for (i = 0; i < 10; i++) { + for (i = 0; i < MAX_TECHNOLOGIES; i++) { const char *type = __connman_service_type2string(i); if (type == NULL) @@ -153,6 +153,54 @@ static void technology_enabled(enum connman_service_type type, } } +unsigned int __connman_notifier_count_connected(void) +{ + unsigned int i, count = 0; + + for (i = 0; i < MAX_TECHNOLOGIES; i++) { + if (g_atomic_int_get(&connected[i]) > 0) + count++; + } + + return count; +} + +const char *__connman_notifier_get_state(void) +{ + unsigned int count = __connman_notifier_count_connected(); + + if (count > 0) + return "online"; + + return "offline"; +} + +static void state_changed(void) +{ + unsigned int count = __connman_notifier_count_connected(); + char *state = "offline"; + DBusMessage *signal; + + if (count > 1) + return; + + if (count > 0) + state = "online"; + + connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, "State", + DBUS_TYPE_STRING, &state); + + signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, "StateChanged"); + if (signal == NULL) + return; + + dbus_message_append_args(signal, DBUS_TYPE_STRING, &state, NULL); + + g_dbus_send_message(connection, signal); +} + static void technology_connected(enum connman_service_type type, connman_bool_t connected) { @@ -161,6 +209,8 @@ static void technology_connected(enum connman_service_type type, connman_dbus_property_changed_array(CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, "ConnectedTechnologies", DBUS_TYPE_STRING, __connman_notifier_list_connected, NULL); + + state_changed(); } void __connman_notifier_register(enum connman_service_type type) |