diff options
author | Ben Chan <benchan@chromium.org> | 2012-08-24 09:12:42 -0700 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-28 17:15:18 +0200 |
commit | 667df5635c7ce947232d5071bed260668e843d7d (patch) | |
tree | 885159529012b7985760fd34ce90fdf4c5858766 /src | |
parent | 178de0e51d925f7b20aedcfc6b773e9d173d13a8 (diff) |
iface-modem: skip setting bands if target list equals to current list
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-iface-modem.c | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 6bb38224..dbd4b302 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -1551,7 +1551,9 @@ mm_iface_modem_set_bands (MMIfaceModem *self, { SetBandsContext *ctx; GArray *supported_bands_array; + GArray *current_bands_array; GError *error = NULL; + gchar *bands_string; /* If setting allowed bands is not implemented, report an error */ if (!MM_IFACE_MODEM_GET_INTERFACE (self)->set_bands || @@ -1565,6 +1567,9 @@ mm_iface_modem_set_bands (MMIfaceModem *self, return; } + bands_string = mm_common_build_bands_string ((MMModemBand *)bands_array->data, + bands_array->len); + /* Setup context */ ctx = g_new0 (SetBandsContext, 1); ctx->self = g_object_ref (self); @@ -1575,29 +1580,75 @@ mm_iface_modem_set_bands (MMIfaceModem *self, g_object_get (self, MM_IFACE_MODEM_DBUS_SKELETON, &ctx->skeleton, NULL); - ctx->bands_array = g_array_ref (bands_array); /* Get list of supported bands */ supported_bands_array = (mm_common_bands_variant_to_garray ( mm_gdbus_modem_get_supported_bands (ctx->skeleton))); + /* Set ctx->bands_array to target list of bands before comparing with current list + * of bands. If input list of bands contains only ANY, target list of bands is set + * to list of supported bands excluding ANY. */ + if (bands_array->len == 1 && + g_array_index (bands_array, MMModemBand, 0) == MM_MODEM_BAND_ANY) { + guint i; + ctx->bands_array = g_array_sized_new (FALSE, + FALSE, + sizeof (MMModemBand), + supported_bands_array->len); + for (i = 0; i < supported_bands_array->len; i++) { + MMModemBand band = g_array_index (supported_bands_array, MMModemBand, i); + if (band != MM_MODEM_BAND_ANY) + g_array_insert_val (ctx->bands_array, i, band); + } + } else { + ctx->bands_array = g_array_ref (bands_array); + } + + /* Simply return if target list of bands equals to current list of bands */ + current_bands_array = (mm_common_bands_variant_to_garray ( + mm_gdbus_modem_get_bands (ctx->skeleton))); + if (mm_common_bands_garray_cmp (ctx->bands_array, current_bands_array)) { + mm_dbg ("Requested list of bands (%s) is equal to the current ones, skipping re-set", + bands_string); + g_free (bands_string); + g_array_unref (supported_bands_array); + g_array_unref (current_bands_array); + g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); + set_bands_context_complete_and_free (ctx); + return; + } + + /* Done comparison with current list of bands. Always use input list of bands + * when setting bands */ + if (ctx->bands_array != bands_array) { + g_array_unref (ctx->bands_array); + ctx->bands_array = g_array_ref (bands_array); + } + /* Validate input list of bands */ if (!validate_bands (supported_bands_array, ctx->bands_array, &error)) { + mm_dbg ("Requested list of bands (%s) cannot be handled", + bands_string); + g_free (bands_string); g_array_unref (supported_bands_array); + g_array_unref (current_bands_array); g_simple_async_result_take_error (ctx->result, error); set_bands_context_complete_and_free (ctx); return; } + mm_dbg ("Setting new list of bands: '%s'", bands_string); MM_IFACE_MODEM_GET_INTERFACE (self)->set_bands ( self, - bands_array, + ctx->bands_array, (GAsyncReadyCallback)set_bands_ready, ctx); g_array_unref (supported_bands_array); + g_array_unref (current_bands_array); + g_free (bands_string); } typedef struct { |