---
 src/session.c |   39 ++++++++++++++++++++++++++++++++++++---
 1 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/src/session.c b/src/session.c
index d3ad900..7c58ce8 100644
--- a/src/session.c
+++ b/src/session.c
@@ -532,6 +532,27 @@ static void append_notify(DBusMessageIter *dict,
        session->append_all = FALSE;
 }
 
+static connman_bool_t is_type_matching_state(enum connman_session_state state,
+                                               enum connman_session_type type)
+{
+       switch (type) {
+       case CONNMAN_SESSION_TYPE_ANY:
+               return TRUE;
+       case CONNMAN_SESSION_TYPE_LOCAL:
+               if (state == CONNMAN_SESSION_STATE_CONNECTED)
+                       return TRUE;
+               break;
+       case CONNMAN_SESSION_TYPE_INTERNET:
+               if (state == CONNMAN_SESSION_STATE_ONLINE)
+                       return TRUE;
+               break;
+       default:
+               break;
+       }
+
+       return FALSE;
+}
+
 static connman_bool_t compute_notifiable_changes(struct connman_session 
*session)
 {
        struct session_info *info_last = session->info_last;
@@ -990,7 +1011,13 @@ static void deselect_and_disconnect(struct 
connman_session *session,
 static void select_connected_service(struct session_info *info,
                                        struct service_entry *entry)
 {
-       info->state = service_to_session_state(entry->state);
+       enum connman_session_state state;
+
+       state = service_to_session_state(entry->state);
+       if (is_type_matching_state(state, info->type) == FALSE)
+               return;
+
+       info->state = state;
 
        info->entry = entry;
        info->entry->reason = info->reason;
@@ -1150,8 +1177,14 @@ static void session_changed(struct connman_session 
*session,
        DBG("session %p trigger %s reason %s", session, trigger2string(trigger),
                                                reason2string(info->reason));
 
-       if (info->entry != NULL)
-               info->state = service_to_session_state(info->entry->state);
+       if (info->entry != NULL) {
+               enum connman_session_state state;
+
+               state = service_to_session_state(info->entry->state);
+
+               if (is_type_matching_state(state, info->type) == TRUE)
+                       info->state = state;
+       }
 
        switch (trigger) {
        case CONNMAN_SESSION_TRIGGER_UNKNOWN:
-- 
1.7.8.3

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

Reply via email to