static gboolean
key_value_foreach (const gchar *key,
                   const gchar *value,
                   ParseKeyValueContext *ctx)
{
    return mm_bearer_properties_consume_string (ctx->properties,
                                                key,
                                                value,
                                                &ctx->error);
}
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_bearer_properties_consume_string (ctx->properties->priv->bearer_properties,
                                             key, value,
                                             NULL))
        return TRUE;

    if (g_str_equal (key, PROPERTY_PIN))
        mm_simple_connect_properties_set_pin (ctx->properties, value);
    else if (g_str_equal (key, PROPERTY_OPERATOR_ID))
        mm_simple_connect_properties_set_operator_id (ctx->properties, value);
    else if (g_str_equal (key, PROPERTY_BANDS)) {
        MMModemBand *bands = NULL;
        guint n_bands = 0;

        mm_common_get_bands_from_string (value, &bands, &n_bands, &ctx->error);
        if (!ctx->error) {
            mm_simple_connect_properties_set_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;
}