On ons, 2012-10-17 at 14:42 +0200, Daniel Wagner wrote: > From: Daniel Wagner <daniel.wag...@bmw-carit.de> > > --- > include/session.h | 4 +++ > src/session.c | 76 > +++++++++++++++++++++++++++++++++++++------------------ > 2 files changed, 56 insertions(+), 24 deletions(-) > > diff --git a/include/session.h b/include/session.h > index afad9fb..9b5a1f0 100644 > --- a/include/session.h > +++ b/include/session.h > @@ -87,6 +87,10 @@ GSList *connman_session_allowed_bearers_any(void); > void connman_session_free_bearers(GSList *bearers); > struct connman_session_config *connman_session_create_default_config(void); > > +enum connman_session_roaming_policy > connman_session_parse_roaming_policy(const char *policy); > +enum connman_session_type connman_session_parse_connection_type(const char > *type); > +int connman_session_parse_allowed_bearers(const char *token, GSList **list);
Functionality for connman_session_parse_allowed_bearers already exists in src/main.c as the function parse_service_types(), but that one does not interpret the '*' wildcard. > + > const char *connman_session_get_owner(struct connman_session *session); > > #ifdef __cplusplus > diff --git a/src/session.c b/src/session.c > index b39dd0a..d13c26b 100644 > --- a/src/session.c > +++ b/src/session.c > @@ -160,7 +160,23 @@ static const char *type2string(enum connman_session_type > type) > return NULL; > } > > -static enum connman_session_type string2type(const char *type) > +enum connman_session_roaming_policy > connman_session_parse_roaming_policy(const char *policy) > +{ > + if (g_strcmp0(policy, "default") == 0) > + return CONNMAN_SESSION_ROAMING_POLICY_DEFAULT; > + else if (g_strcmp0(policy, "always") == 0) > + return CONNMAN_SESSION_ROAMING_POLICY_ALWAYS; > + else if (g_strcmp0(policy, "forbidden") == 0) > + return CONNMAN_SESSION_ROAMING_POLICY_FORBIDDEN; > + else if (g_strcmp0(policy, "national") == 0) > + return CONNMAN_SESSION_ROAMING_POLICY_NATIONAL; > + else if (g_strcmp0(policy, "international") == 0) > + return CONNMAN_SESSION_ROAMING_POLICY_INTERNATIONAL; > + else > + return CONNMAN_SESSION_ROAMING_POLICY_UNKNOWN; > +} > + > +enum connman_session_type connman_session_parse_connection_type(const char > *type) > { > if (g_strcmp0(type, "any") == 0) > return CONNMAN_SESSION_TYPE_ANY; Hmm, a service is 'ready' or 'online' while a session is 'local' or 'internet'. Maybe that should be fixed to reduce confusion... Especially when it involves humans an text files. > @@ -388,38 +404,49 @@ void connman_session_free_bearers(GSList *bearers) > g_slist_free_full(bearers, cleanup_bearer); > } > > +int connman_session_parse_allowed_bearers(const char *token, GSList **list) > +{ > + struct connman_session_bearer *info; > + > + info = g_try_new0(struct connman_session_bearer, 1); > + if (info == NULL) { > + connman_session_free_bearers(*list); > + *list = NULL; > + return -ENOMEM; > + } > + > + info->name = g_strdup(token); > + info->service_type = bearer2service(info->name); > + > + if (info->service_type == CONNMAN_SERVICE_TYPE_UNKNOWN && > + g_strcmp0(info->name, "*") == 0) { > + info->match_all = TRUE; > + } else { > + info->match_all = FALSE; > + } > + > + *list = g_slist_append(*list, info); > + > + return 0; > +} > + > static int session_parse_allowed_bearers(DBusMessageIter *iter, GSList > **list) > { > - struct connman_session_bearer *bearer; > DBusMessageIter array; > + int err; > > dbus_message_iter_recurse(iter, &array); > > *list = NULL; > > while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_STRING) { > - char *bearer_name = NULL; > - > - dbus_message_iter_get_basic(&array, &bearer_name); > - > - bearer = g_try_new0(struct connman_session_bearer, 1); > - if (bearer == NULL) { > - connman_session_free_bearers(*list); > - *list = NULL; > - return -ENOMEM; > - } > + char *bearer = NULL; > > - bearer->name = g_strdup(bearer_name); > - bearer->service_type = bearer2service(bearer->name); > + dbus_message_iter_get_basic(&array, &bearer); > > - if (bearer->service_type == CONNMAN_SERVICE_TYPE_UNKNOWN && > - g_strcmp0(bearer->name, "*") == 0) { > - bearer->match_all = TRUE; > - } else { > - bearer->match_all = FALSE; > - } > - > - *list = g_slist_append(*list, bearer); > + err = connman_session_parse_allowed_bearers(bearer, list); > + if (err < 0) > + return err; > > dbus_message_iter_next(&array); > } > @@ -1535,7 +1562,7 @@ static DBusMessage *change_session(DBusConnection *conn, > dbus_message_iter_get_basic(&value, &val); > info->config.type = apply_policy_on_type( > session->policy_config->type, > - string2type(val)); > + connman_session_parse_connection_type(val)); > } else { > goto err; > } > @@ -1794,7 +1821,8 @@ int __connman_session_create(DBusMessage *msg) > case DBUS_TYPE_STRING: > if (g_str_equal(key, "ConnectionType") == TRUE) { > dbus_message_iter_get_basic(&value, &val); > - config->type = string2type(val); > + config->type = > + > connman_session_parse_connection_type(val); > config->type_valid = TRUE; > } else { > err = -EINVAL; _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman