libmm-common: use the new key/value parser in the common connect properties builder
This commit is contained in:
@@ -271,109 +271,104 @@ mm_common_connect_properties_get_dictionary (MMCommonConnectProperties *self)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
MMCommonConnectProperties *properties;
|
||||||
|
GError *error;
|
||||||
|
gchar *allowed_modes_str;
|
||||||
|
gchar *preferred_mode_str;
|
||||||
|
} ParseKeyValueContext;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
key_value_foreach (const gchar *key,
|
||||||
|
const gchar *value,
|
||||||
|
ParseKeyValueContext *ctx)
|
||||||
|
{
|
||||||
|
/* First, check if we can consume this as bearer properties */
|
||||||
|
if (mm_common_bearer_properties_consume_string (ctx->properties->priv->bearer_properties,
|
||||||
|
key, value,
|
||||||
|
NULL))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (g_str_equal (key, PROPERTY_PIN))
|
||||||
|
mm_common_connect_properties_set_pin (ctx->properties, value);
|
||||||
|
else if (g_str_equal (key, PROPERTY_OPERATOR_ID))
|
||||||
|
mm_common_connect_properties_set_operator_id (ctx->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, &ctx->error);
|
||||||
|
if (!ctx->error) {
|
||||||
|
mm_common_connect_properties_set_allowed_bands (ctx->properties, bands, n_bands);
|
||||||
|
g_free (bands);
|
||||||
|
}
|
||||||
|
} else if (g_str_equal (key, PROPERTY_ALLOWED_MODES)) {
|
||||||
|
ctx->allowed_modes_str = g_strdup (value);
|
||||||
|
} else if (g_str_equal (key, PROPERTY_PREFERRED_MODE)) {
|
||||||
|
ctx->preferred_mode_str = g_strdup (value);
|
||||||
|
} else {
|
||||||
|
ctx->error = g_error_new (MM_CORE_ERROR,
|
||||||
|
MM_CORE_ERROR_INVALID_ARGS,
|
||||||
|
"Invalid properties string, unexpected key '%s'",
|
||||||
|
key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return !ctx->error;
|
||||||
|
}
|
||||||
|
|
||||||
MMCommonConnectProperties *
|
MMCommonConnectProperties *
|
||||||
mm_common_connect_properties_new_from_string (const gchar *str,
|
mm_common_connect_properties_new_from_string (const gchar *str,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
GError *inner_error = NULL;
|
ParseKeyValueContext ctx;
|
||||||
MMCommonConnectProperties *properties;
|
|
||||||
gchar **words;
|
|
||||||
gchar *key;
|
|
||||||
gchar *value;
|
|
||||||
guint i;
|
|
||||||
const gchar *allowed_modes_str = NULL;
|
|
||||||
const gchar *preferred_mode_str = NULL;
|
|
||||||
|
|
||||||
properties = mm_common_connect_properties_new ();
|
ctx.error = NULL;
|
||||||
|
ctx.allowed_modes_str = NULL;
|
||||||
|
ctx.preferred_mode_str = NULL;
|
||||||
|
ctx.properties = mm_common_connect_properties_new ();
|
||||||
|
|
||||||
/* Expecting input as:
|
mm_common_parse_key_value_string (str,
|
||||||
* key1=string,key2=true,key3=false...
|
&ctx.error,
|
||||||
* */
|
(MMParseKeyValueForeachFn)key_value_foreach,
|
||||||
|
&ctx);
|
||||||
words = g_strsplit_set (str, ",= ", -1);
|
|
||||||
if (!words)
|
|
||||||
return properties;
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
key = words[i];
|
|
||||||
while (key) {
|
|
||||||
value = words[++i];
|
|
||||||
|
|
||||||
if (!value) {
|
|
||||||
inner_error = g_error_new (MM_CORE_ERROR,
|
|
||||||
MM_CORE_ERROR_INVALID_ARGS,
|
|
||||||
"Invalid properties string, no value for 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];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If error, destroy the object */
|
/* If error, destroy the object */
|
||||||
if (inner_error) {
|
if (ctx.error) {
|
||||||
g_propagate_error (error, inner_error);
|
g_propagate_error (error, ctx.error);
|
||||||
g_object_unref (properties);
|
g_object_unref (ctx.properties);
|
||||||
properties = NULL;
|
ctx.properties = NULL;
|
||||||
}
|
}
|
||||||
else if (allowed_modes_str || preferred_mode_str) {
|
else if (ctx.allowed_modes_str || ctx.preferred_mode_str) {
|
||||||
MMModemMode allowed_modes;
|
MMModemMode allowed_modes;
|
||||||
MMModemMode preferred_mode;
|
MMModemMode preferred_mode;
|
||||||
|
|
||||||
allowed_modes = (allowed_modes_str ?
|
allowed_modes = (ctx.allowed_modes_str ?
|
||||||
mm_common_get_modes_from_string (allowed_modes_str,
|
mm_common_get_modes_from_string (ctx.allowed_modes_str,
|
||||||
&inner_error) :
|
&ctx.error) :
|
||||||
MM_MODEM_MODE_ANY);
|
MM_MODEM_MODE_ANY);
|
||||||
if (!inner_error) {
|
if (!ctx.error) {
|
||||||
preferred_mode = (preferred_mode_str ?
|
preferred_mode = (ctx.preferred_mode_str ?
|
||||||
mm_common_get_modes_from_string (preferred_mode_str,
|
mm_common_get_modes_from_string (ctx.preferred_mode_str,
|
||||||
&inner_error) :
|
&ctx.error) :
|
||||||
MM_MODEM_MODE_NONE);
|
MM_MODEM_MODE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inner_error) {
|
if (ctx.error) {
|
||||||
g_propagate_error (error, inner_error);
|
g_propagate_error (error, ctx.error);
|
||||||
g_object_unref (properties);
|
g_object_unref (ctx.properties);
|
||||||
properties = NULL;
|
ctx.properties = NULL;
|
||||||
} else {
|
} else {
|
||||||
mm_common_connect_properties_set_allowed_modes (
|
mm_common_connect_properties_set_allowed_modes (
|
||||||
properties,
|
ctx.properties,
|
||||||
allowed_modes,
|
allowed_modes,
|
||||||
preferred_mode);
|
preferred_mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_strfreev (words);
|
g_free (ctx.allowed_modes_str);
|
||||||
return properties;
|
g_free (ctx.preferred_mode_str);
|
||||||
|
|
||||||
|
return ctx.properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
Reference in New Issue
Block a user