diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-iface-modem.c | 114 | ||||
-rw-r--r-- | src/mm-iface-modem.h | 10 |
2 files changed, 111 insertions, 13 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 3a3762bf..bb43c174 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -594,13 +594,48 @@ set_allowed_bands_ready (MMIfaceModem *self, g_object_unref (simple); } +static gboolean +validate_allowed_bands (GArray *bands_array, + GError **error) +{ + /* When the array has more than one element, there MUST NOT include ANY or + * UNKNOWN */ + if (bands_array->len > 1) { + guint i; + + for (i = 0; i < bands_array->len; i++) { + MMModemBand band; + + band = g_array_index (bands_array, MMModemBand, i); + if (band == MM_MODEM_BAND_UNKNOWN || + band == MM_MODEM_BAND_ANY) { + GEnumClass *enum_class; + GEnumValue *value; + + enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_MODEM_BAND)); + value = g_enum_get_value (enum_class, band); + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Wrong list of bands: " + "'%s' should have been the only element in the list", + value->value_nick); + g_type_class_unref (enum_class); + return FALSE; + } + } + } + return TRUE; +} + void mm_iface_modem_set_allowed_bands (MMIfaceModem *self, - MMModemBand bands, + GArray *bands_array, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *result; + GError *error = NULL; /* If setting allowed bands is not implemented, report an error */ if (!MM_IFACE_MODEM_GET_INTERFACE (self)->set_allowed_bands || @@ -614,12 +649,21 @@ mm_iface_modem_set_allowed_bands (MMIfaceModem *self, return; } + /* Validate input list of bands */ + if (!validate_allowed_bands (bands_array, &error)) { + g_simple_async_report_take_gerror_in_idle (G_OBJECT (self), + callback, + user_data, + error); + return; + } + result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, mm_iface_modem_set_allowed_bands); MM_IFACE_MODEM_GET_INTERFACE (self)->set_allowed_bands (self, - bands, + bands_array, (GAsyncReadyCallback)set_allowed_bands_ready, result); } @@ -644,7 +688,7 @@ handle_set_allowed_bands_ready (MMIfaceModem *self, static gboolean handle_set_allowed_bands (MmGdbusModem *skeleton, GDBusMethodInvocation *invocation, - guint64 bands, + GVariant *bands_variant, MMIfaceModem *self) { MMModemState modem_state = MM_MODEM_STATE_UNKNOWN; @@ -671,14 +715,19 @@ handle_set_allowed_bands (MmGdbusModem *skeleton, case MM_MODEM_STATE_REGISTERED: case MM_MODEM_STATE_DISCONNECTING: case MM_MODEM_STATE_CONNECTING: - case MM_MODEM_STATE_CONNECTED: + case MM_MODEM_STATE_CONNECTED: { + GArray *bands_array; + + bands_array = mm_common_bands_variant_to_garray (bands_variant); mm_iface_modem_set_allowed_bands (self, - bands, + bands_array, (GAsyncReadyCallback)handle_set_allowed_bands_ready, dbus_call_context_new (skeleton, invocation, self)); + g_array_unref (bands_array); break; + } } return TRUE; @@ -1789,7 +1838,34 @@ STR_REPLY_READY_FN (revision, "Revision") STR_REPLY_READY_FN (equipment_identifier, "Equipment Identifier") STR_REPLY_READY_FN (device_identifier, "Device Identifier") UINT_REPLY_READY_FN (supported_modes, "Supported Modes") -UINT_REPLY_READY_FN (supported_bands, "Supported Bands") + +static void +load_supported_bands_ready (MMIfaceModem *self, + GAsyncResult *res, + InitializationContext *ctx) +{ + GError *error = NULL; + GArray *bands_array; + + bands_array = MM_IFACE_MODEM_GET_INTERFACE (self)->load_supported_bands_finish (self, res, &error); + + /* We have the property in the interface bound to the property in the + * skeleton. */ + g_object_set (self, + MM_IFACE_MODEM_CURRENT_CAPABILITIES, + mm_common_bands_garray_to_variant (bands_array), + NULL); + g_array_unref (bands_array); + + if (error) { + mm_warn ("couldn't load Supported Bands: '%s'", error->message); + g_error_free (error); + } + + /* Go on to next step */ + ctx->step++; + interface_initialization_step (ctx); +} static void load_unlock_required_ready (MMIfaceModem *self, @@ -2198,6 +2274,28 @@ mm_iface_modem_initialize_finish (MMIfaceModem *self, return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); } +static GVariant * +build_bands_unknown (void) +{ + GVariantBuilder builder; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("au")); + g_variant_builder_add_value (&builder, + g_variant_new_uint32 (MM_MODEM_BAND_UNKNOWN)); + return g_variant_builder_end (&builder); +} + +static GVariant * +build_bands_any (void) +{ + GVariantBuilder builder; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("au")); + g_variant_builder_add_value (&builder, + g_variant_new_uint32 (MM_MODEM_BAND_ANY)); + return g_variant_builder_end (&builder); +} + void mm_iface_modem_initialize (MMIfaceModem *self, MMAtSerialPort *port, @@ -2235,8 +2333,8 @@ mm_iface_modem_initialize (MMIfaceModem *self, mm_gdbus_modem_set_supported_modes (skeleton, MM_MODEM_MODE_NONE); mm_gdbus_modem_set_allowed_modes (skeleton, MM_MODEM_MODE_ANY); mm_gdbus_modem_set_preferred_mode (skeleton, MM_MODEM_MODE_NONE); - mm_gdbus_modem_set_supported_bands (skeleton, MM_MODEM_BAND_UNKNOWN); - mm_gdbus_modem_set_allowed_bands (skeleton, MM_MODEM_BAND_ANY); + mm_gdbus_modem_set_supported_bands (skeleton, build_bands_unknown ()); + mm_gdbus_modem_set_allowed_bands (skeleton, build_bands_any ()); /* Bind our State property */ g_object_bind_property (self, MM_IFACE_MODEM_STATE, diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h index 5195497e..1afd166c 100644 --- a/src/mm-iface-modem.h +++ b/src/mm-iface-modem.h @@ -123,9 +123,9 @@ struct _MMIfaceModem { void (*load_supported_bands) (MMIfaceModem *self, GAsyncReadyCallback callback, gpointer user_data); - MMModemBand (*load_supported_bands_finish) (MMIfaceModem *self, - GAsyncResult *res, - GError **error); + GArray * (*load_supported_bands_finish) (MMIfaceModem *self, + GAsyncResult *res, + GError **error); /* Loading of the SignalQuality property */ void (*load_signal_quality) (MMIfaceModem *self, @@ -155,7 +155,7 @@ struct _MMIfaceModem { /* Asynchronous allowed band setting operation */ void (*set_allowed_bands) (MMIfaceModem *self, - MMModemBand bands, + GArray *bands_array, GAsyncReadyCallback callback, gpointer user_data); gboolean (*set_allowed_bands_finish) (MMIfaceModem *self, @@ -316,7 +316,7 @@ gboolean mm_iface_modem_set_allowed_modes_finish (MMIfaceModem *self, /* Allow setting allowed bands */ void mm_iface_modem_set_allowed_bands (MMIfaceModem *self, - MMModemBand bands, + GArray *bands_array, GAsyncReadyCallback callback, gpointer user_data); gboolean mm_iface_modem_set_allowed_bands_finish (MMIfaceModem *self, |