MMBearerProperties * mm_bearer_properties_new_from_dictionary (GVariant *dictionary, GError **error) { GError *inner_error = NULL; GVariantIter iter; gchar *key; GVariant *value; MMBearerProperties *properties; properties = mm_bearer_properties_new (); if (!dictionary) return properties; if (!g_variant_is_of_type (dictionary, G_VARIANT_TYPE ("a{sv}"))) { g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS, "Cannot create Bearer properties from dictionary: " "invalid variant type received"); g_object_unref (properties); return NULL; } g_variant_iter_init (&iter, dictionary); while (!inner_error && g_variant_iter_next (&iter, "{sv}", &key, &value)) { mm_bearer_properties_consume_variant (properties, key, value, &inner_error); g_free (key); g_variant_unref (value); } /* If error, destroy the object */ if (inner_error) { g_propagate_error (error, inner_error); g_object_unref (properties); properties = NULL; } return properties; }
MMSimpleConnectProperties * mm_simple_connect_properties_new_from_dictionary (GVariant *dictionary, GError **error) { GError *inner_error = NULL; GVariantIter iter; gchar *key; GVariant *value; MMSimpleConnectProperties *properties; GVariant *allowed_modes_variant = NULL; GVariant *preferred_mode_variant = NULL; properties = mm_simple_connect_properties_new (); if (!dictionary) return properties; if (!g_variant_is_of_type (dictionary, G_VARIANT_TYPE ("a{sv}"))) { g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS, "Cannot create Simple Connect properties from dictionary: " "invalid variant type received"); g_object_unref (properties); return NULL; } g_variant_iter_init (&iter, dictionary); while (!inner_error && g_variant_iter_next (&iter, "{sv}", &key, &value)) { /* First, check if we can consume this as bearer properties */ if (!mm_bearer_properties_consume_variant (properties->priv->bearer_properties, key, value, NULL)) { if (g_str_equal (key, PROPERTY_PIN)) mm_simple_connect_properties_set_pin ( properties, g_variant_get_string (value, NULL)); else if (g_str_equal (key, PROPERTY_OPERATOR_ID)) mm_simple_connect_properties_set_operator_id ( properties, g_variant_get_string (value, NULL)); else if (g_str_equal (key, PROPERTY_BANDS)) { GArray *array; array = mm_common_bands_variant_to_garray (value); mm_simple_connect_properties_set_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); g_variant_unref (value); } /* If error, destroy the object */ if (inner_error) { g_propagate_error (error, inner_error); g_object_unref (properties); properties = NULL; } /* If we got allowed modes variant, check if we got preferred mode */ else if (allowed_modes_variant) { mm_simple_connect_properties_set_allowed_modes ( properties, g_variant_get_uint32 (allowed_modes_variant), (preferred_mode_variant ? g_variant_get_uint32 (preferred_mode_variant) : MM_MODEM_MODE_NONE)); } /* If we only got preferred mode, assume allowed is ANY */ else if (preferred_mode_variant) { mm_simple_connect_properties_set_allowed_modes ( properties, MM_MODEM_MODE_ANY, g_variant_get_uint32 (preferred_mode_variant)); } /* Cleanup last things before exiting */ if (allowed_modes_variant) g_variant_unref (allowed_modes_variant); if (preferred_mode_variant) g_variant_unref (preferred_mode_variant); return properties; }