From: Daniel Wagner <[email protected]>

Since we can ask for the service state, let's drop the 'state'
member in struct service_entry.
---
 src/session.c | 58 +++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 35 insertions(+), 23 deletions(-)

diff --git a/src/session.c b/src/session.c
index 509acd6..b9e57e0 100644
--- a/src/session.c
+++ b/src/session.c
@@ -64,7 +64,6 @@ enum connman_session_state {
 struct service_entry {
        /* track why this service was selected */
        enum connman_session_reason reason;
-       enum connman_service_state state;
        struct connman_service *service;
 };
 
@@ -1246,9 +1245,11 @@ static void select_connected_service(struct 
connman_session *session,
                                        struct service_entry *entry)
 {
        struct session_info *info = session->info;
+       enum connman_service_state service_state;
        enum connman_session_state state;
 
-       state = service_to_session_state(entry->state);
+       service_state = __connman_service_get_state(entry->service);
+       state = service_to_session_state(service_state);
        if (!is_type_matching_state(&state, info->config.type))
                return;
 
@@ -1262,11 +1263,13 @@ static void select_offline_service(struct 
connman_session *session,
                                        struct service_entry *entry)
 {
        struct session_info *info = session->info;
+       enum connman_service_state service_state;
 
        if (!explicit_connect(info->reason))
                return;
 
-       info->state = service_to_session_state(entry->state);
+       service_state = __connman_service_get_state(entry->service);
+       info->state = service_to_session_state(service_state);
 
        session->entry = entry;
        entry->reason = info->reason;
@@ -1275,9 +1278,12 @@ static void select_offline_service(struct 
connman_session *session,
 static void select_service(struct connman_session *session,
                                struct service_entry *entry)
 {
+       enum connman_service_state service_state;
+
        DBG("service %p", entry->service);
 
-       if (is_connected(entry->state))
+       service_state = __connman_service_get_state(entry->service);
+       if (is_connected(service_state))
                select_connected_service(session, entry);
        else
                select_offline_service(session, entry);
@@ -1288,6 +1294,7 @@ static void select_and_connect(struct connman_session 
*session,
 {
        struct session_info *info = session->info;
        struct service_entry *entry = NULL;
+       enum connman_service_state service_state;
        GList *list;
 
        DBG("session %p reason %s", session, reason2string(reason));
@@ -1305,7 +1312,8 @@ static void select_and_connect(struct connman_session 
*session,
        for (list = session->service_list; list; list = list->next) {
                entry = list->data;
 
-               switch (entry->state) {
+               service_state = __connman_service_get_state(entry->service);
+               switch (service_state) {
                case CONNMAN_SERVICE_STATE_ASSOCIATION:
                case CONNMAN_SERVICE_STATE_CONFIGURATION:
                case CONNMAN_SERVICE_STATE_READY:
@@ -1324,8 +1332,7 @@ static void select_and_connect(struct connman_session 
*session,
 
 static struct service_entry *create_service_entry(
                                        struct connman_session * session,
-                                       struct connman_service *service,
-                                       enum connman_service_state state)
+                                       struct connman_service *service)
 {
        struct service_entry *entry;
 
@@ -1334,7 +1341,6 @@ static struct service_entry *create_service_entry(
                return entry;
 
        entry->reason = CONNMAN_SESSION_REASON_UNKNOWN;
-       entry->state = state;
        entry->service = service;
 
        g_hash_table_replace(entry_hash, entry, session);
@@ -1355,7 +1361,7 @@ static void iterate_service_cb(struct connman_service 
*service,
        if (!service_match(session, service))
                return;
 
-       entry = create_service_entry(session, service, state);
+       entry = create_service_entry(session, service);
        if (!entry)
                return;
 
@@ -1410,6 +1416,7 @@ static void session_changed(struct connman_session 
*session,
        struct session_info *info_last = session->info_last;
        struct connman_service *service;
        struct service_entry *entry = NULL, *entry_last = NULL;
+       enum connman_service_state service_state;
        GHashTable *service_hash_last;
 
        /*
@@ -1423,7 +1430,9 @@ static void session_changed(struct connman_session 
*session,
        if (session->entry) {
                enum connman_session_state state;
 
-               state = service_to_session_state(session->entry->state);
+               service_state = __connman_service_get_state(
+                                       session->entry->service);
+               state = service_to_session_state(service_state);
 
                if (is_type_matching_state(&state, info->config.type))
                        info->state = state;
@@ -1493,8 +1502,12 @@ static void session_changed(struct connman_session 
*session,
                        break;
                }
 
-               if (session->entry && is_connecting(session->entry->state))
-                       break;
+               if (session->entry) {
+                       service_state = __connman_service_get_state(
+                                               session->entry->service);
+                       if (is_connecting(service_state))
+                               break;
+               }
 
                select_and_connect(session, CONNMAN_SESSION_REASON_CONNECT);
 
@@ -1504,10 +1517,13 @@ static void session_changed(struct connman_session 
*session,
 
                break;
        case CONNMAN_SESSION_TRIGGER_SERVICE:
-               if (session->entry &&
-                       (is_connecting(session->entry->state) ||
-                               is_connected(session->entry->state)))
-                       break;
+               if (session->entry) {
+                       service_state = __connman_service_get_state(
+                                               session->entry->service);
+                       if (is_connecting(service_state) ||
+                                       is_connected(service_state))
+                               break;
+               }
 
                select_and_connect(session, info->reason);
 
@@ -2151,8 +2167,7 @@ int __connman_session_destroy(DBusMessage *msg)
        return 0;
 }
 
-static void service_add(struct connman_service *service,
-               enum connman_service_state state, const char *name)
+static void service_add(struct connman_service *service, const char *name)
 {
        GHashTableIter iter;
        gpointer key, value;
@@ -2171,14 +2186,12 @@ static void service_add(struct connman_service *service,
 
                entry = g_hash_table_lookup(session->service_hash, service);
                if (entry) {
-                       entry->state = state;
-
                        session->service_list =
                                g_list_sort_with_data(session->service_list,
                                                sort_services, session);
 
                } else {
-                       entry = create_service_entry(session, service, state);
+                       entry = create_service_entry(session, service);
 
                        if (!entry)
                                continue;
@@ -2231,8 +2244,7 @@ static void service_state_changed(struct connman_service 
*service,
        DBG("service %p state %d", service, state);
 
        if (is_connected(state))
-               service_add(service, state,
-                               __connman_service_get_name(service));
+               service_add(service, __connman_service_get_name(service));
        else if (is_disconnected(state))
                service_remove(service);
 }
-- 
1.8.4.rc0.1.g8f6a3e5

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

Reply via email to