summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-04-01 12:15:54 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-04-03 02:01:34 +0200
commit06309b134249d56ceceeda90967ba4b3b0b76682 (patch)
tree9c64d2ecb1ed7a830c1027d95df1a36db8999611
parent59a8daa319192cb43524d3d79851afa8116060de (diff)
downloadconnman-06309b134249d56ceceeda90967ba4b3b0b76682.tar.gz
connman-06309b134249d56ceceeda90967ba4b3b0b76682.tar.bz2
connman-06309b134249d56ceceeda90967ba4b3b0b76682.zip
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.
-rw-r--r--src/connman.h1
-rw-r--r--src/service.c58
2 files changed, 59 insertions, 0 deletions
diff --git a/src/connman.h b/src/connman.h
index af53a683..af242509 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 38ee18dd..e0e363eb 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)
{