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

Reply via email to