From: Daniel Wagner <[email protected]>

Instead of using __connman_service_session_connect() for connecting
session.c uses __connman_service_connect() directly
(__connman_service_disconnect accordingly). Those two calls are using
their own glib callback source and can update the session state
accoring the return value from __connman_service_connect()/disconnect().
---
 src/connman.h |    2 -
 src/service.c |   51 ------------------------------------
 src/session.c |   80 ++++++++++++++++++++++++++++++++++++++++++++++----------
 3 files changed, 65 insertions(+), 68 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index feecdf0..d580faa 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -517,8 +517,6 @@ 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);
 
diff --git a/src/service.c b/src/service.c
index c3b288b..423af92 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2594,57 +2594,6 @@ 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) {
diff --git a/src/session.c b/src/session.c
index 2b29a1e..00344a8 100644
--- a/src/session.c
+++ b/src/session.c
@@ -588,11 +588,23 @@ static DBusMessage *destroy_session(DBusConnection *conn,
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
+static gboolean session_do_connect(gpointer user_data)
+{
+       struct connman_session *session = user_data;
+
+       __connman_service_connect(session->service);
+
+       service_changed(session);
+       return FALSE;
+}
+
 static DBusMessage *connect_session(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
        struct connman_session *session = user_data;
-       int err;
+       struct connman_service *service;
+       enum connman_service_state state;
+       GSequenceIter *iter;
 
        DBG("session %p", session);
 
@@ -604,35 +616,73 @@ static DBusMessage *connect_session(DBusConnection *conn,
 
        g_sequence_foreach(session->service_list, print_name, NULL);
 
-       err = __connman_service_session_connect(session->service_list,
-                                               &session->service);
-       if (err < 0)
-               return __connman_error_failed(msg, -err);
 
-       update_service(session);
-       g_timeout_add_seconds(0, service_changed, session);
+       iter = g_sequence_get_begin_iter(session->service_list);
+
+       while (g_sequence_iter_is_end(iter) == FALSE) {
+               service = g_sequence_get(iter);
+
+               if (__connman_service_is_pending(service)) {
+                       session->service = service;
+                       update_service(session);
+                       g_timeout_add_seconds(0, service_changed, session);
+                       break;
+               }
+
+               state = __connman_service_get_state(service);
+
+               switch (state) {
+               case CONNMAN_SERVICE_STATE_IDLE:
+                       session->service = service;
+                       update_service(session);
+                       g_timeout_add_seconds(0, session_do_connect, session);
+                       break;
+
+               case CONNMAN_SERVICE_STATE_ASSOCIATION:
+               case CONNMAN_SERVICE_STATE_CONFIGURATION:
+               case CONNMAN_SERVICE_STATE_READY:
+               case CONNMAN_SERVICE_STATE_ONLINE:
+                       session->service = service;
+                       update_service(session);
+                       g_timeout_add_seconds(0, service_changed, session);
+                       break;
+
+               case CONNMAN_SERVICE_STATE_DISCONNECT:
+               case CONNMAN_SERVICE_STATE_UNKNOWN:
+               case CONNMAN_SERVICE_STATE_FAILURE:
+                       continue;
+               }
+               iter = g_sequence_iter_next(iter);
+       }
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
+static gboolean session_do_disconnect(gpointer user_data)
+{
+       struct connman_session *session = user_data;
+
+       if (__connman_service_disconnect(session->service) < 0)
+               return FALSE;
+
+       session->service = NULL;
+       update_service(session);
+       service_changed(session);
+
+       return FALSE;
+}
+
 static DBusMessage *disconnect_session(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
        struct connman_session *session = user_data;
-       int err;
 
        DBG("session %p", session);
 
        if (session->service == NULL)
                return __connman_error_already_disabled(msg);
 
-       err = __connman_service_disconnect(session->service);
-       if (err < 0)
-               return __connman_error_failed(msg, -err);
-
-       session->service = NULL;
-       update_service(session);
-       g_timeout_add_seconds(0, service_changed, session);
+       g_timeout_add_seconds(0, session_do_disconnect, session);
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
-- 
1.7.4.2

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to