Introducing ConnectionType which lets the session selecting either:
- local connection: underlying service gets connected service state = ready,
only this value will affect session's state so it will be updated from
disconnected to connected.
- internet connection: underlying service gets connected and provide an
internet access. service state = online, only this value will affect
session's state so it will be updated from disconnected to online.
- any: both service state (ready/online) affects the session state which,
then, might change from disconnected to connected and/or online.
---
src/session.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 51 insertions(+), 3 deletions(-)
diff --git a/src/session.c b/src/session.c
index 4636129..d3ad900 100644
--- a/src/session.c
+++ b/src/session.c
@@ -59,6 +59,12 @@ enum connman_session_state {
CONNMAN_SESSION_STATE_ONLINE = 2,
};
+enum connman_session_type {
+ CONNMAN_SESSION_TYPE_ANY = 0,
+ CONNMAN_SESSION_TYPE_LOCAL = 1,
+ CONNMAN_SESSION_TYPE_INTERNET = 2,
+};
+
enum connman_session_roaming_policy {
CONNMAN_SESSION_ROAMING_POLICY_UNKNOWN = 0,
CONNMAN_SESSION_ROAMING_POLICY_DEFAULT = 1,
@@ -81,6 +87,7 @@ struct service_entry {
struct session_info {
enum connman_session_state state;
+ enum connman_session_type type;
connman_bool_t priority;
GSList *allowed_bearers;
connman_bool_t avoid_handover;
@@ -169,6 +176,30 @@ static const char *state2string(enum connman_session_state
state)
return NULL;
}
+static const char *type2string(enum connman_session_type type)
+{
+ switch (type) {
+ case CONNMAN_SESSION_TYPE_ANY:
+ return "";
+ case CONNMAN_SESSION_TYPE_LOCAL:
+ return "local";
+ case CONNMAN_SESSION_TYPE_INTERNET:
+ return "internet";
+ }
+
+ return NULL;
+}
+
+static enum connman_session_type string2type(const char *type)
+{
+ if (g_strcmp0(type, "local") == 0)
+ return CONNMAN_SESSION_TYPE_LOCAL;
+ else if (g_strcmp0(type, "internet") == 0)
+ return CONNMAN_SESSION_TYPE_INTERNET;
+
+ return CONNMAN_SESSION_TYPE_ANY;
+}
+
static const char *roamingpolicy2string(enum connman_session_roaming_policy
policy)
{
switch (policy) {
@@ -381,6 +412,15 @@ static void append_notify(DBusMessageIter *dict,
info_last->state = info->state;
}
+ if (session->append_all == TRUE || info->type != info_last->type) {
+ const char *type = type2string(info->type);
+
+ connman_dbus_dict_append_basic(dict, "ConnectionType",
+ DBUS_TYPE_STRING,
+ &type);
+ info_last->type = info->type;
+ }
+
if ((session->append_all == TRUE || info->entry != info_last->entry) &&
info->entry != NULL) {
struct connman_service *service = info->entry->service;
@@ -1305,6 +1345,7 @@ static DBusMessage *change_session(DBusConnection *conn,
struct session_info *info = session->info;
DBusMessageIter iter, value;
const char *name;
+ const char *val;
GSList *allowed_bearers;
DBG("session %p", session);
@@ -1367,8 +1408,10 @@ static DBusMessage *change_session(DBusConnection *conn,
}
break;
case DBUS_TYPE_STRING:
- if (g_str_equal(name, "RoamingPolicy") == TRUE) {
- const char *val;
+ if (g_str_equal(name, "ConnectionType") == TRUE) {
+ dbus_message_iter_get_basic(&value, &val);
+ info->type = string2type(val);
+ } else if (g_str_equal(name, "RoamingPolicy") == TRUE) {
dbus_message_iter_get_basic(&value, &val);
info->roaming_policy =
string2roamingpolicy(val);
@@ -1472,6 +1515,7 @@ int __connman_session_create(DBusMessage *msg)
struct connman_session *session = NULL;
struct session_info *info, *info_last;
+ enum connman_session_type type = CONNMAN_SESSION_TYPE_ANY;
connman_bool_t priority = FALSE, avoid_handover = FALSE;
connman_bool_t stay_connected = FALSE, ecall = FALSE;
enum connman_session_roaming_policy roaming_policy =
@@ -1546,7 +1590,10 @@ int __connman_session_create(DBusMessage *msg)
}
break;
case DBUS_TYPE_STRING:
- if (g_str_equal(key, "RoamingPolicy") == TRUE) {
+ if (g_str_equal(key, "ConnectionType") == TRUE) {
+ dbus_message_iter_get_basic(&value, &val);
+ type = string2type(val);
+ } else if (g_str_equal(key, "RoamingPolicy") == TRUE) {
dbus_message_iter_get_basic(&value, &val);
roaming_policy = string2roamingpolicy(val);
} else {
@@ -1606,6 +1653,7 @@ int __connman_session_create(DBusMessage *msg)
owner_disconnect, session, NULL);
info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
+ info->type = type;
info->priority = priority;
info->avoid_handover = avoid_handover;
info->stay_connected = stay_connected;
--
1.7.8.3
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman