service: Add __connman_service_connect_session()
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Thu, 31 Mar 2011 08:02:32 +0000 (10:02 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Thu, 31 Mar 2011 10:37:43 +0000 (12:37 +0200)
src/connman.h
src/service.c

index 893475d..c16059c 100644 (file)
@@ -520,6 +520,8 @@ int __connman_service_disconnect(struct connman_service *service);
 int __connman_service_disconnect_all(void);
 int __connman_service_create_and_connect(DBusMessage *msg);
 void __connman_service_auto_connect(void);
+int __connman_service_session_connect(GSequence *service_list,
+                                       struct connman_service **service);
 
 const char *__connman_service_type2string(enum connman_service_type type);
 
index 63b5df9..91e0a61 100644 (file)
@@ -2562,6 +2562,57 @@ void __connman_service_auto_connect(void)
        }
 }
 
+static connman_bool_t session_is_ignore(struct connman_service *service)
+{
+       if (combine_state(service->state_ipv4, service->state_ipv6) ==
+                                               CONNMAN_SERVICE_STATE_FAILURE)
+               return TRUE;
+
+       return FALSE;
+}
+
+int __connman_service_session_connect(GSequence *list,
+                                       struct connman_service **ret_service)
+{
+       struct connman_service *service;
+       GSequenceIter *iter;
+
+       DBG("list %p", list);
+
+       iter = g_sequence_get_begin_iter(list);
+
+       while (g_sequence_iter_is_end(iter) == FALSE) {
+               service = g_sequence_get(iter);
+
+               if (service->pending != NULL)
+                       return -EINPROGRESS;
+
+               if (is_connected(service) == TRUE)
+                       return -EISCONN;
+
+               if (is_connecting(service) == TRUE)
+                       return -EALREADY;
+
+               if (session_is_ignore(service) == FALSE &&
+                       combine_state(service->state_ipv4,
+                                       service->state_ipv6) ==
+                                               CONNMAN_SERVICE_STATE_IDLE)
+                       break;
+
+               service = NULL;
+
+               iter = g_sequence_iter_next(iter);
+       }
+
+       if (service == NULL)
+               return -EINVAL;
+
+
+       *ret_service = service;
+
+       return __connman_service_connect(service);
+}
+
 static void remove_timeout(struct connman_service *service)
 {
        if (service->timeout > 0) {