From 836075a8d9279ffadccfb1f5c3c0cf56f51d1a95 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 6 Apr 2009 09:01:37 +0200 Subject: [PATCH] Add support for handling carrier updates from devices --- src/connman.h | 2 ++ src/device.c | 2 ++ src/profile.c | 42 +++++++++++++++++++++++++++++++----------- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/connman.h b/src/connman.h index 220eb05..2299c49 100644 --- a/src/connman.h +++ b/src/connman.h @@ -186,6 +186,8 @@ int __connman_device_set_offlinemode(connman_bool_t offlinemode); int __connman_profile_add_device(struct connman_device *device); int __connman_profile_remove_device(struct connman_device *device); +int __connman_profile_set_carrier(struct connman_device *device, + connman_bool_t carrier); #include diff --git a/src/device.c b/src/device.c index b52fb7e..e36aa6d 100644 --- a/src/device.c +++ b/src/device.c @@ -161,6 +161,8 @@ static enum connman_device_policy string2policy(const char *policy) static int set_carrier(struct connman_device *device, connman_bool_t carrier) { + __connman_profile_set_carrier(device, carrier); + if (carrier == TRUE) { enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN; struct connman_element *element; diff --git a/src/profile.c b/src/profile.c index 86b78f1..abb2d23 100644 --- a/src/profile.c +++ b/src/profile.c @@ -313,13 +313,6 @@ static gint compare_group(gconstpointer a, gconstpointer b, gpointer user_data) return (gint) group_b->strength - (gint) group_a->strength; } -static gint search_group(gconstpointer a, gconstpointer b, gpointer user_data) -{ - struct connman_group *group = (void *) a; - - return g_strcmp0(group->id, user_data); -} - static struct connman_group *lookup_group(const char *name) { GSequenceIter *iter; @@ -330,11 +323,11 @@ static struct connman_group *lookup_group(const char *name) if (name == NULL) return NULL; - iter = g_sequence_search(groups, NULL, search_group, (char *) name); - if (g_sequence_iter_is_begin(iter) == FALSE && - g_sequence_iter_is_end(iter) == FALSE) { + iter = g_sequence_get_begin_iter(groups); + while (g_sequence_iter_is_end(iter) == FALSE) { group = g_sequence_get(iter); - if (group != NULL) + + if (g_strcmp0(group->id, name) == 0) goto done; } @@ -434,6 +427,33 @@ int __connman_profile_remove_device(struct connman_device *device) return 0; } +int __connman_profile_set_carrier(struct connman_device *device, + connman_bool_t carrier) +{ + struct connman_group *group; + char *name; + + DBG("device %p carrier %d", device, carrier); + + name = g_strdup_printf("%s_%d", __connman_device_get_type(device), + connman_device_get_index(device)); + group = lookup_group(name); + g_free(name); + + if (group == NULL) + return -EINVAL; + + if (group->favorite == carrier) + return -EALREADY; + + group->favorite = carrier; + + g_sequence_sort_changed(group->iter, compare_group, NULL); + emit_services_signal(); + + return 0; +} + static enum connman_service_type convert_network_type(struct connman_network *network) { enum connman_network_type type = connman_network_get_type(network); -- 1.7.9.5