From 06309b134249d56ceceeda90967ba4b3b0b76682 Mon Sep 17 00:00:00 2001 From: Samuel Ortiz Date: Thu, 1 Apr 2010 12:15:54 +0200 Subject: [PATCH] Connect service based on service type __connman_service_connect_type() tries to find the appropriate service based on the service_type argument, and connect it. If the argument is CONNMAN_SERVICE_TYPE_UNKNOWN, the first available service is picked. --- src/connman.h | 1 + src/service.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/connman.h b/src/connman.h index af53a68..af24250 100644 --- a/src/connman.h +++ b/src/connman.h @@ -415,6 +415,7 @@ int __connman_service_connect(struct connman_service *service); int __connman_service_disconnect(struct connman_service *service); int __connman_service_create_and_connect(DBusMessage *msg); void __connman_service_auto_connect(void); +struct connman_service *__connman_service_connect_type(enum connman_service_type type); const char *__connman_service_type2string(enum connman_service_type type); diff --git a/src/service.c b/src/service.c index 38ee18d..e0e363e 100644 --- a/src/service.c +++ b/src/service.c @@ -999,6 +999,64 @@ static connman_bool_t get_reconnect_state(struct connman_service *service) return __connman_device_get_reconnect(device); } +struct connman_service * +__connman_service_connect_type(enum connman_service_type type) +{ + struct connman_service *service; + GSequenceIter *iter; + int err; + + DBG("type %d", type); + + /* + * We go through the already sorted service list. + * We pick the first one matching our type, or just + * the first available one if we have no type. + */ + iter = g_sequence_get_begin_iter(service_list); + service = g_sequence_get(iter); + + /* + * If the first service is connected or about to be + * connected, we return it, regardless of the type. + */ + if ((g_sequence_iter_is_end(iter) == FALSE) && + (is_connecting(service) == TRUE || + is_connected(service) == TRUE)) + return service; + + while (g_sequence_iter_is_end(iter) == FALSE) { + if (service->type == type || + type == CONNMAN_SERVICE_TYPE_UNKNOWN) + break; + + iter = g_sequence_iter_next(iter); + service = g_sequence_get(iter); + } + + if (g_sequence_iter_is_end(iter)) + return NULL; + + service->ignore = FALSE; + + service->userconnect = TRUE; + + set_reconnect_state(service, FALSE); + + err = __connman_service_connect(service); + if (err < 0) { + if (err == -ENOKEY) + if (__connman_agent_request_passphrase(service, + NULL, NULL)) + return service; + + if (err != -EINPROGRESS) + return NULL; + } + + return service; +} + static DBusMessage *connect_service(DBusConnection *conn, DBusMessage *msg, void *user_data) { -- 2.7.4