diff options
-rw-r--r-- | libmm-common/mm-common-bearer-properties.c | 143 | ||||
-rw-r--r-- | libmm-common/mm-common-bearer-properties.h | 10 | ||||
-rw-r--r-- | libmm-common/mm-common-connect-properties.c | 267 | ||||
-rw-r--r-- | libmm-common/mm-common-connect-properties.h | 5 |
4 files changed, 206 insertions, 219 deletions
diff --git a/libmm-common/mm-common-bearer-properties.c b/libmm-common/mm-common-bearer-properties.c index 5f397e21..b70bf492 100644 --- a/libmm-common/mm-common-bearer-properties.c +++ b/libmm-common/mm-common-bearer-properties.c @@ -186,6 +186,44 @@ mm_common_bearer_properties_get_dictionary (MMCommonBearerProperties *self) /*****************************************************************************/ +gboolean +mm_common_bearer_properties_consume_string (MMCommonBearerProperties *self, + const gchar *key, + const gchar *value, + GError **error) +{ + if (g_str_equal (key, PROPERTY_APN)) + mm_common_bearer_properties_set_apn (self, value); + else if (g_str_equal (key, PROPERTY_USER)) + mm_common_bearer_properties_set_user (self, value); + else if (g_str_equal (key, PROPERTY_PASSWORD)) + mm_common_bearer_properties_set_password (self, value); + else if (g_str_equal (key, PROPERTY_IP_TYPE)) + mm_common_bearer_properties_set_ip_type (self, value); + else if (g_str_equal (key, PROPERTY_ALLOW_ROAMING)) { + GError *inner_error = NULL; + gboolean allow_roaming; + + allow_roaming = mm_common_get_boolean_from_string (value, &inner_error); + if (inner_error) { + g_propagate_error (error, inner_error); + return FALSE; + } + mm_common_bearer_properties_set_allow_roaming (self, allow_roaming); + } else if (g_str_equal (key, PROPERTY_NUMBER)) + mm_common_bearer_properties_set_number (self, value); + else { + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Invalid properties string, unexpected key '%s'", + key); + return FALSE; + } + + return TRUE; +} + MMCommonBearerProperties * mm_common_bearer_properties_new_from_string (const gchar *str, GError **error) @@ -220,29 +258,11 @@ mm_common_bearer_properties_new_from_string (const gchar *str, break; } - if (g_str_equal (key, PROPERTY_APN)) - mm_common_bearer_properties_set_apn (properties, value); - else if (g_str_equal (key, PROPERTY_USER)) - mm_common_bearer_properties_set_user (properties, value); - else if (g_str_equal (key, PROPERTY_PASSWORD)) - mm_common_bearer_properties_set_password (properties, value); - else if (g_str_equal (key, PROPERTY_IP_TYPE)) - mm_common_bearer_properties_set_ip_type (properties, value); - else if (g_str_equal (key, PROPERTY_ALLOW_ROAMING)) { - gboolean allow_roaming; - - allow_roaming = mm_common_get_boolean_from_string (value, &inner_error); - if (!inner_error) - mm_common_bearer_properties_set_allow_roaming (properties, allow_roaming); - } else if (g_str_equal (key, PROPERTY_NUMBER)) - mm_common_bearer_properties_set_number (properties, value); - else { - inner_error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Invalid properties string, unexpected key '%s'", - key); + if (!mm_common_bearer_properties_consume_string (properties, + key, + value, + &inner_error)) break; - } key = words[++i]; } @@ -260,6 +280,49 @@ mm_common_bearer_properties_new_from_string (const gchar *str, /*****************************************************************************/ +gboolean +mm_common_bearer_properties_consume_variant (MMCommonBearerProperties *properties, + const gchar *key, + GVariant *value, + GError **error) +{ + if (g_str_equal (key, PROPERTY_APN)) + mm_common_bearer_properties_set_apn ( + properties, + g_variant_get_string (value, NULL)); + else if (g_str_equal (key, PROPERTY_USER)) + mm_common_bearer_properties_set_user ( + properties, + g_variant_get_string (value, NULL)); + else if (g_str_equal (key, PROPERTY_PASSWORD)) + mm_common_bearer_properties_set_password ( + properties, + g_variant_get_string (value, NULL)); + else if (g_str_equal (key, PROPERTY_IP_TYPE)) + mm_common_bearer_properties_set_ip_type ( + properties, + g_variant_get_string (value, NULL)); + else if (g_str_equal (key, PROPERTY_NUMBER)) + mm_common_bearer_properties_set_number ( + properties, + g_variant_get_string (value, NULL)); + else if (g_str_equal (key, PROPERTY_ALLOW_ROAMING)) + mm_common_bearer_properties_set_allow_roaming ( + properties, + g_variant_get_boolean (value)); + else { + /* Set error */ + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Invalid properties dictionary, unexpected key '%s'", + key); + return FALSE; + } + + return TRUE; +} + MMCommonBearerProperties * mm_common_bearer_properties_new_from_dictionary (GVariant *dictionary, GError **error) @@ -277,38 +340,10 @@ mm_common_bearer_properties_new_from_dictionary (GVariant *dictionary, g_variant_iter_init (&iter, dictionary); while (!inner_error && g_variant_iter_next (&iter, "{sv}", &key, &value)) { - if (g_str_equal (key, PROPERTY_APN)) - mm_common_bearer_properties_set_apn ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_USER)) - mm_common_bearer_properties_set_user ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_PASSWORD)) - mm_common_bearer_properties_set_password ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_IP_TYPE)) - mm_common_bearer_properties_set_ip_type ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_NUMBER)) - mm_common_bearer_properties_set_number ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_ALLOW_ROAMING)) - mm_common_bearer_properties_set_allow_roaming ( - properties, - g_variant_get_boolean (value)); - else { - /* Set inner error, will stop the loop */ - inner_error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Invalid properties dictionary, unexpected key '%s'", - key); - } - + mm_common_bearer_properties_consume_variant (properties, + key, + value, + &inner_error); g_free (key); g_variant_unref (value); } diff --git a/libmm-common/mm-common-bearer-properties.h b/libmm-common/mm-common-bearer-properties.h index 474446de..32449a29 100644 --- a/libmm-common/mm-common-bearer-properties.h +++ b/libmm-common/mm-common-bearer-properties.h @@ -83,6 +83,16 @@ gboolean mm_common_bearer_properties_get_allow_roaming ( const gchar *mm_common_bearer_properties_get_number ( MMCommonBearerProperties *properties); +gboolean mm_common_bearer_properties_consume_string (MMCommonBearerProperties *self, + const gchar *key, + const gchar *value, + GError **error); + +gboolean mm_common_bearer_properties_consume_variant (MMCommonBearerProperties *self, + const gchar *key, + GVariant *value, + GError **error); + GVariant *mm_common_bearer_properties_get_dictionary (MMCommonBearerProperties *self); G_END_DECLS diff --git a/libmm-common/mm-common-connect-properties.c b/libmm-common/mm-common-connect-properties.c index 35381ab0..4aa5d87c 100644 --- a/libmm-common/mm-common-connect-properties.c +++ b/libmm-common/mm-common-connect-properties.c @@ -26,12 +26,6 @@ G_DEFINE_TYPE (MMCommonConnectProperties, mm_common_connect_properties, G_TYPE_O #define PROPERTY_ALLOWED_BANDS "allowed-bands" #define PROPERTY_ALLOWED_MODES "allowed-modes" #define PROPERTY_PREFERRED_MODE "preferred-mode" -#define PROPERTY_APN "apn" -#define PROPERTY_USER "user" -#define PROPERTY_PASSWORD "password" -#define PROPERTY_IP_TYPE "ip-type" -#define PROPERTY_NUMBER "number" -#define PROPERTY_ALLOW_ROAMING "allow-roaming" struct _MMCommonConnectPropertiesPrivate { /* PIN */ @@ -45,19 +39,8 @@ struct _MMCommonConnectPropertiesPrivate { gboolean allowed_modes_set; MMModemMode allowed_modes; MMModemMode preferred_mode; - /* APN */ - gchar *apn; - /* User */ - gchar *user; - /* Password */ - gchar *password; - /* IP type */ - gchar *ip_type; - /* Number */ - gchar *number; - /* Roaming allowance */ - gboolean allow_roaming_set; - gboolean allow_roaming; + /* Bearer properties */ + MMCommonBearerProperties *bearer_properties; }; /*****************************************************************************/ @@ -105,56 +88,62 @@ void mm_common_connect_properties_set_apn (MMCommonConnectProperties *self, const gchar *apn) { - g_free (self->priv->apn); - self->priv->apn = g_strdup (apn); + mm_common_bearer_properties_set_apn (self->priv->bearer_properties, + apn); } void mm_common_connect_properties_set_user (MMCommonConnectProperties *self, const gchar *user) { - g_free (self->priv->user); - self->priv->user = g_strdup (user); + mm_common_bearer_properties_set_user (self->priv->bearer_properties, + user); } void mm_common_connect_properties_set_password (MMCommonConnectProperties *self, const gchar *password) { - g_free (self->priv->password); - self->priv->password = g_strdup (password); + mm_common_bearer_properties_set_password (self->priv->bearer_properties, + password); } void mm_common_connect_properties_set_ip_type (MMCommonConnectProperties *self, const gchar *ip_type) { - g_free (self->priv->ip_type); - self->priv->ip_type = g_strdup (ip_type); + mm_common_bearer_properties_set_ip_type (self->priv->bearer_properties, + ip_type); } void mm_common_connect_properties_set_allow_roaming (MMCommonConnectProperties *self, gboolean allow_roaming) { - self->priv->allow_roaming = allow_roaming; - self->priv->allow_roaming_set = TRUE; + mm_common_bearer_properties_set_allow_roaming (self->priv->bearer_properties, + allow_roaming); } void mm_common_connect_properties_set_number (MMCommonConnectProperties *self, const gchar *number) { - g_free (self->priv->number); - self->priv->number = g_strdup (number); + mm_common_bearer_properties_set_number (self->priv->bearer_properties, + number); } /*****************************************************************************/ +MMCommonBearerProperties * +mm_common_connect_properties_get_bearer_properties (MMCommonConnectProperties *self) +{ + return g_object_ref (self->priv->bearer_properties); +} + const gchar * mm_common_connect_properties_get_pin (MMCommonConnectProperties *self) { - return self->priv->apn; + return self->priv->pin; } const gchar * @@ -184,37 +173,37 @@ mm_common_connect_properties_get_allowed_modes (MMCommonConnectProperties *self, const gchar * mm_common_connect_properties_get_apn (MMCommonConnectProperties *self) { - return self->priv->apn; + return mm_common_bearer_properties_get_apn (self->priv->bearer_properties); } const gchar * mm_common_connect_properties_get_user (MMCommonConnectProperties *self) { - return self->priv->user; + return mm_common_bearer_properties_get_user (self->priv->bearer_properties); } const gchar * mm_common_connect_properties_get_password (MMCommonConnectProperties *self) { - return self->priv->password; + return mm_common_bearer_properties_get_password (self->priv->bearer_properties); } const gchar * mm_common_connect_properties_get_ip_type (MMCommonConnectProperties *self) { - return self->priv->ip_type; + return mm_common_bearer_properties_get_ip_type (self->priv->bearer_properties); } gboolean mm_common_connect_properties_get_allow_roaming (MMCommonConnectProperties *self) { - return self->priv->allow_roaming; + return mm_common_bearer_properties_get_allow_roaming (self->priv->bearer_properties); } const gchar * mm_common_connect_properties_get_number (MMCommonConnectProperties *self) { - return self->priv->number; + return mm_common_bearer_properties_get_number (self->priv->bearer_properties); } /*****************************************************************************/ @@ -223,6 +212,10 @@ GVariant * mm_common_connect_properties_get_dictionary (MMCommonConnectProperties *self) { GVariantBuilder builder; + GVariantIter iter; + gchar *key; + GVariant *value; + GVariant *bearer_properties_dictionary; /* We do allow NULL */ if (!self) @@ -260,41 +253,18 @@ mm_common_connect_properties_get_dictionary (MMCommonConnectProperties *self) g_variant_new_uint32 (self->priv->preferred_mode)); } - if (self->priv->apn) - g_variant_builder_add (&builder, - "{sv}", - PROPERTY_APN, - g_variant_new_string (self->priv->apn)); - - if (self->priv->user) - g_variant_builder_add (&builder, - "{sv}", - PROPERTY_USER, - g_variant_new_string (self->priv->user)); - - if (self->priv->password) - g_variant_builder_add (&builder, - "{sv}", - PROPERTY_PASSWORD, - g_variant_new_string (self->priv->password)); - - if (self->priv->ip_type) - g_variant_builder_add (&builder, - "{sv}", - PROPERTY_IP_TYPE, - g_variant_new_string (self->priv->ip_type)); - - if (self->priv->number) - g_variant_builder_add (&builder, - "{sv}", - PROPERTY_NUMBER, - g_variant_new_string (self->priv->number)); - - if (self->priv->allow_roaming_set) + /* Merge dictionaries */ + bearer_properties_dictionary = mm_common_bearer_properties_get_dictionary (self->priv->bearer_properties); + g_variant_iter_init (&iter, bearer_properties_dictionary); + while (g_variant_iter_next (&iter, "{sv}", &key, &value)) { g_variant_builder_add (&builder, "{sv}", - PROPERTY_ALLOW_ROAMING, - g_variant_new_boolean (self->priv->allow_roaming)); + key, + value); + g_variant_unref (value); + g_free (key); + } + g_variant_unref (bearer_properties_dictionary); return g_variant_ref_sink (g_variant_builder_end (&builder)); } @@ -337,44 +307,33 @@ mm_common_connect_properties_new_from_string (const gchar *str, break; } - if (g_str_equal (key, PROPERTY_PIN)) - mm_common_connect_properties_set_pin (properties, value); - else if (g_str_equal (key, PROPERTY_OPERATOR_ID)) - mm_common_connect_properties_set_operator_id (properties, value); - else if (g_str_equal (key, PROPERTY_APN)) - mm_common_connect_properties_set_apn (properties, value); - else if (g_str_equal (key, PROPERTY_USER)) - mm_common_connect_properties_set_user (properties, value); - else if (g_str_equal (key, PROPERTY_PASSWORD)) - mm_common_connect_properties_set_password (properties, value); - else if (g_str_equal (key, PROPERTY_IP_TYPE)) - mm_common_connect_properties_set_ip_type (properties, value); - else if (g_str_equal (key, PROPERTY_ALLOW_ROAMING)) { - gboolean allow_roaming; - - allow_roaming = mm_common_get_boolean_from_string (value, &inner_error); - if (!inner_error) - mm_common_connect_properties_set_allow_roaming (properties, allow_roaming); - } else if (g_str_equal (key, PROPERTY_NUMBER)) - mm_common_connect_properties_set_number (properties, value); - else if (g_str_equal (key, PROPERTY_ALLOWED_BANDS)) { - MMModemBand *bands = NULL; - guint n_bands = 0; - - mm_common_get_bands_from_string (value, &bands, &n_bands, &inner_error); - if (!inner_error) - mm_common_connect_properties_set_allowed_bands (properties, bands, n_bands); - g_free (bands); - } else if (g_str_equal (key, PROPERTY_ALLOWED_MODES)) { - allowed_modes_str = value; - } else if (g_str_equal (key, PROPERTY_PREFERRED_MODE)) { - preferred_mode_str = value; - } else { - inner_error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Invalid properties string, unexpected key '%s'", - key); - break; + /* First, check if we can consume this as bearer properties */ + if (!mm_common_bearer_properties_consume_string (properties->priv->bearer_properties, + key, value, + NULL)) { + if (g_str_equal (key, PROPERTY_PIN)) + mm_common_connect_properties_set_pin (properties, value); + else if (g_str_equal (key, PROPERTY_OPERATOR_ID)) + mm_common_connect_properties_set_operator_id (properties, value); + else if (g_str_equal (key, PROPERTY_ALLOWED_BANDS)) { + MMModemBand *bands = NULL; + guint n_bands = 0; + + mm_common_get_bands_from_string (value, &bands, &n_bands, &inner_error); + if (!inner_error) + mm_common_connect_properties_set_allowed_bands (properties, bands, n_bands); + g_free (bands); + } else if (g_str_equal (key, PROPERTY_ALLOWED_MODES)) { + allowed_modes_str = value; + } else if (g_str_equal (key, PROPERTY_PREFERRED_MODE)) { + preferred_mode_str = value; + } else { + inner_error = g_error_new (MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Invalid properties string, unexpected key '%s'", + key); + break; + } } key = words[++i]; @@ -438,57 +397,39 @@ mm_common_connect_properties_new_from_dictionary (GVariant *dictionary, g_variant_iter_init (&iter, dictionary); while (!inner_error && g_variant_iter_next (&iter, "{sv}", &key, &value)) { - if (g_str_equal (key, PROPERTY_PIN)) - mm_common_connect_properties_set_pin ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_OPERATOR_ID)) - mm_common_connect_properties_set_operator_id ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_ALLOWED_BANDS)) { - GArray *array; - array = mm_common_bands_variant_to_garray (value); - mm_common_connect_properties_set_allowed_bands ( - properties, - (MMModemBand *)array->data, - array->len); - g_array_unref (array); - } else if (g_str_equal (key, PROPERTY_ALLOWED_MODES)) - allowed_modes_variant = g_variant_ref (value); - else if (g_str_equal (key, PROPERTY_PREFERRED_MODE)) - preferred_mode_variant = g_variant_ref (value); - else if (g_str_equal (key, PROPERTY_APN)) - mm_common_connect_properties_set_apn ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_USER)) - mm_common_connect_properties_set_user ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_PASSWORD)) - mm_common_connect_properties_set_password ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_IP_TYPE)) - mm_common_connect_properties_set_ip_type ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_NUMBER)) - mm_common_connect_properties_set_number ( - properties, - g_variant_get_string (value, NULL)); - else if (g_str_equal (key, PROPERTY_ALLOW_ROAMING)) - mm_common_connect_properties_set_allow_roaming ( - properties, - g_variant_get_boolean (value)); - else { - /* Set inner error, will stop the loop */ - inner_error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Invalid properties dictionary, unexpected key '%s'", - key); + /* First, check if we can consume this as bearer properties */ + if (!mm_common_bearer_properties_consume_variant (properties->priv->bearer_properties, + key, value, + NULL)) { + if (g_str_equal (key, PROPERTY_PIN)) + mm_common_connect_properties_set_pin ( + properties, + g_variant_get_string (value, NULL)); + else if (g_str_equal (key, PROPERTY_OPERATOR_ID)) + mm_common_connect_properties_set_operator_id ( + properties, + g_variant_get_string (value, NULL)); + else if (g_str_equal (key, PROPERTY_ALLOWED_BANDS)) { + GArray *array; + + array = mm_common_bands_variant_to_garray (value); + mm_common_connect_properties_set_allowed_bands ( + properties, + (MMModemBand *)array->data, + array->len); + g_array_unref (array); + } else if (g_str_equal (key, PROPERTY_ALLOWED_MODES)) + allowed_modes_variant = g_variant_ref (value); + else if (g_str_equal (key, PROPERTY_PREFERRED_MODE)) + preferred_mode_variant = g_variant_ref (value); + else { + /* Set inner error, will stop the loop */ + inner_error = g_error_new (MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Invalid properties dictionary, unexpected key '%s'", + key); + } } g_free (key); @@ -544,7 +485,7 @@ mm_common_connect_properties_init (MMCommonConnectProperties *self) MMCommonConnectPropertiesPrivate); /* Some defaults */ - self->priv->allow_roaming = TRUE; + self->priv->bearer_properties = mm_common_bearer_properties_new (); self->priv->allowed_modes = MM_MODEM_MODE_ANY; self->priv->preferred_mode = MM_MODEM_MODE_NONE; self->priv->allowed_bands = g_new (MMModemBand, 1); @@ -560,11 +501,7 @@ finalize (GObject *object) g_free (self->priv->pin); g_free (self->priv->operator_id); g_free (self->priv->allowed_bands); - g_free (self->priv->apn); - g_free (self->priv->user); - g_free (self->priv->password); - g_free (self->priv->ip_type); - g_free (self->priv->number); + g_object_unref (self->priv->bearer_properties); G_OBJECT_CLASS (mm_common_connect_properties_parent_class)->finalize (object); } diff --git a/libmm-common/mm-common-connect-properties.h b/libmm-common/mm-common-connect-properties.h index a4de48bc..e117ff0f 100644 --- a/libmm-common/mm-common-connect-properties.h +++ b/libmm-common/mm-common-connect-properties.h @@ -19,6 +19,8 @@ #include <ModemManager.h> #include <glib-object.h> +#include "mm-common-bearer-properties.h" + G_BEGIN_DECLS #define MM_TYPE_COMMON_CONNECT_PROPERTIES (mm_common_connect_properties_get_type ()) @@ -109,6 +111,9 @@ gboolean mm_common_connect_properties_get_allow_roaming ( const gchar *mm_common_connect_properties_get_number ( MMCommonConnectProperties *properties); +MMCommonBearerProperties *mm_common_connect_properties_get_bearer_properties ( + MMCommonConnectProperties *properties); + GVariant *mm_common_connect_properties_get_dictionary (MMCommonConnectProperties *self); G_END_DECLS |