From: Samuel Ortiz Date: Thu, 1 Apr 2010 10:15:54 +0000 (+0200) Subject: Connect service based on service type X-Git-Tag: accepted/2.0alpha-wayland/20121110.002834~2798 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=06309b134249d56ceceeda90967ba4b3b0b76682;p=profile%2Fivi%2Fconnman.git 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. --- 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) {