summaryrefslogtreecommitdiff
path: root/src/notifier.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-01-05 05:14:29 -0800
committerMarcel Holtmann <marcel@holtmann.org>2010-01-05 05:14:29 -0800
commitcec31fbcdf1be94f060ba4e02db074b6a654afbd (patch)
treec06cd7ab95a03c9f75f5b0a817945a13028f42fb /src/notifier.c
parentf5d476e9d5ecaa45e22823b2a21a1e2fad775aff (diff)
downloadconnman-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.c56
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)