From: Daniel Wagner <daniel.wag...@bmw-carit.de>

Service will now be able to add or remove a service from a session.
---
 src/connman.h |  5 ++++
 src/session.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 77 insertions(+), 12 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 74ff797..2b30d5b 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -831,6 +831,11 @@ int __connman_rtnl_send(const void *buf, size_t len);
 bool __connman_session_mode();
 void __connman_session_set_mode(bool enable);
 
+void __connman_session_add_service(struct connman_session *session,
+                                       struct connman_service *service);
+void __connman_session_remove_service(struct connman_session *session,
+                                       struct connman_service *service);
+
 int __connman_session_create(DBusMessage *msg);
 int __connman_session_destroy(DBusMessage *msg);
 
diff --git a/src/session.c b/src/session.c
index 7ed5d08..d32a9a8 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1571,6 +1571,67 @@ int __connman_session_destroy(DBusMessage *msg)
        return 0;
 }
 
+
+static enum connman_session_state service_to_session_state(
+                                       enum connman_service_state state)
+{
+       switch (state) {
+       case CONNMAN_SERVICE_STATE_UNKNOWN:
+       case CONNMAN_SERVICE_STATE_IDLE:
+       case CONNMAN_SERVICE_STATE_ASSOCIATION:
+       case CONNMAN_SERVICE_STATE_CONFIGURATION:
+       case CONNMAN_SERVICE_STATE_DISCONNECT:
+       case CONNMAN_SERVICE_STATE_FAILURE:
+               break;
+       case CONNMAN_SERVICE_STATE_READY:
+               return CONNMAN_SESSION_STATE_CONNECTED;
+       case CONNMAN_SERVICE_STATE_ONLINE:
+               return CONNMAN_SESSION_STATE_ONLINE;
+       }
+
+       return CONNMAN_SESSION_STATE_DISCONNECTED;
+}
+
+static void update_session_state(struct connman_session *session)
+{
+       enum connman_service_state service_state;
+       enum connman_session_state state;
+
+       if (session->service) {
+               service_state = __connman_service_get_state(session->service);
+               state = service_to_session_state(service_state);
+               session->info->state = state;
+       } else {
+               session->info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
+       }
+
+       DBG("session %p state %s", session, state2string(state));
+
+       update_routing_table(session);
+       session_notify(session);
+}
+
+void __connman_session_add_service(struct connman_session *session,
+                                       struct connman_service *service)
+{
+       DBG("session %p service %p", session, service);
+
+       session->service = service;
+       update_session_state(session);
+}
+
+void __connman_session_remove_service(struct connman_session *session,
+                                       struct connman_service *service)
+{
+       DBG("session %p service %p", session, service);
+
+       if (session->service != service)
+               return;
+
+       session->service = NULL;
+       update_session_state(session);
+}
+
 static void service_state_changed(struct connman_service *service,
                                enum connman_service_state state)
 {
@@ -1583,30 +1644,29 @@ static void ipconfig_changed(struct connman_service 
*service,
        GHashTableIter iter;
        gpointer key, value;
        struct connman_session *session;
-       struct session_info *info;
        enum connman_ipconfig_type type;
 
        DBG("service %p ipconfig %p", service, ipconfig);
 
-       type = __connman_ipconfig_get_config_type(ipconfig);
-
        g_hash_table_iter_init(&iter, session_hash);
 
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                session = value;
-               info = session->info;
 
-               if (info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
+               if (session->info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
                        continue;
 
-               if (session->service && session->service == service) {
-                       update_routing_table(session);
+               if (session->service != service)
+                       continue;
 
-                       if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
-                               ipconfig_ipv4_changed(session);
-                       else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
-                               ipconfig_ipv6_changed(session);
-               }
+               type = __connman_ipconfig_get_config_type(ipconfig);
+
+               if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
+                       ipconfig_ipv4_changed(session);
+               else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
+                       ipconfig_ipv6_changed(session);
+
+               update_session_state(session);
        }
 }
 
-- 
1.8.5.3

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to