diff options
-rw-r--r-- | libmm-glib/mm-manager.c | 2 | ||||
-rw-r--r-- | libmm-glib/mm-modem.c | 1333 | ||||
-rw-r--r-- | libmm-glib/mm-modem.h | 108 |
3 files changed, 1070 insertions, 373 deletions
diff --git a/libmm-glib/mm-manager.c b/libmm-glib/mm-manager.c index 5cd703a3..0de34bcc 100644 --- a/libmm-glib/mm-manager.c +++ b/libmm-glib/mm-manager.c @@ -72,7 +72,7 @@ get_proxy_type (GDBusObjectManagerClient *manager, if (g_once_init_enter (&once_init_value)) { lookup_hash = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem", GSIZE_TO_POINTER (MM_GDBUS_TYPE_MODEM_PROXY)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem", GSIZE_TO_POINTER (MM_TYPE_MODEM)); g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Messaging", GSIZE_TO_POINTER (MM_GDBUS_TYPE_MODEM_MESSAGING_PROXY)); g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Location", GSIZE_TO_POINTER (MM_GDBUS_TYPE_MODEM_LOCATION_PROXY)); g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Time", GSIZE_TO_POINTER (MM_GDBUS_TYPE_MODEM_TIME_PROXY)); diff --git a/libmm-glib/mm-modem.c b/libmm-glib/mm-modem.c index 6bbaf00f..4b5ac774 100644 --- a/libmm-glib/mm-modem.c +++ b/libmm-glib/mm-modem.c @@ -17,7 +17,8 @@ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. * - * Copyright (C) 2011 Aleksander Morgado <aleksander@gnu.org> + * Copyright (C) 2011 - 2012 Aleksander Morgado <aleksander@gnu.org> + * Copyright (C) 2012 Google, Inc. */ #include <gio/gio.h> @@ -28,17 +29,50 @@ #include "mm-modem.h" /** - * mm_modem_get_path: + * SECTION: mm-modem + * @title: MMModem + * @short_description: The Modem interface + * + * The #MMModem is an object providing access to the methods, signals and + * properties of the Modem interface. + * + * When the modem is exposed and available in the bus, it is ensured that at + * least this interface is also available. + */ + +G_DEFINE_TYPE (MMModem, mm_modem, MM_GDBUS_TYPE_MODEM_PROXY) + +struct _MMModemPrivate { + /* UnlockRetries */ + GMutex unlock_retries_mutex; + guint unlock_retries_id; + MMUnlockRetries *unlock_retries; + + /* Supported Bands */ + GMutex supported_bands_mutex; + guint supported_bands_id; + GArray *supported_bands; + + /* Bands */ + GMutex bands_mutex; + guint bands_id; + GArray *bands; +}; + +/*****************************************************************************/ + +/** + * mm_modem_get_path: (skip) * @self: A #MMModem. * * Gets the DBus path of the #MMObject which implements this interface. * - * Returns: (transfer none): The DBus path of the #MMObject object. + * Returns: (transfer none): The DBus path of the #MMObject object. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_path (MMModem *self) { - g_return_val_if_fail (G_IS_DBUS_PROXY (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_CONSTANT_STRING ( g_dbus_proxy_get_object_path (G_DBUS_PROXY (self))); @@ -57,7 +91,7 @@ mm_modem_dup_path (MMModem *self) { gchar *value; - g_return_val_if_fail (G_IS_DBUS_PROXY (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); g_object_get (G_OBJECT (self), "g-object-path", &value, @@ -66,22 +100,27 @@ mm_modem_dup_path (MMModem *self) RETURN_NON_EMPTY_STRING (value); } +/*****************************************************************************/ + /** - * mm_modem_get_sim_path: + * mm_modem_get_sim_path: (skip) * @self: A #MMModem. * * Gets the DBus path of the #MMSim handled in this #MMModem. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_sim_path() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_sim_path() if on another + * thread.</warning> * - * Returns: (transfer none): The DBus path of the #MMSim handled in this #MMModem, or %NULL if none available. + * Returns: (transfer none): The DBus path of the #MMSim handled in this #MMModem, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_sim_path (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); - RETURN_NON_EMPTY_CONSTANT_STRING (mm_gdbus_modem_get_sim (self)); + RETURN_NON_EMPTY_CONSTANT_STRING (mm_gdbus_modem_get_sim (MM_GDBUS_MODEM (self))); } /** @@ -95,12 +134,14 @@ mm_modem_get_sim_path (MMModem *self) gchar * mm_modem_dup_sim_path (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_STRING ( - mm_gdbus_modem_dup_sim (self)); + mm_gdbus_modem_dup_sim (MM_GDBUS_MODEM (self))); } +/*****************************************************************************/ + /** * mm_modem_get_modem_capabilities: * @self: A #MMModem. @@ -116,11 +157,13 @@ mm_modem_dup_sim_path (MMModem *self) MMModemCapability mm_modem_get_modem_capabilities (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), MM_MODEM_CAPABILITY_NONE); + g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_CAPABILITY_NONE); - return (MMModemCapability) mm_gdbus_modem_get_modem_capabilities (self); + return (MMModemCapability) mm_gdbus_modem_get_modem_capabilities (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** * mm_modem_get_current_capabilities: * @self: A #MMModem. @@ -133,11 +176,13 @@ mm_modem_get_modem_capabilities (MMModem *self) MMModemCapability mm_modem_get_current_capabilities (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), MM_MODEM_CAPABILITY_NONE); + g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_CAPABILITY_NONE); - return mm_gdbus_modem_get_current_capabilities (self); + return mm_gdbus_modem_get_current_capabilities (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** * mm_modem_get_max_bearers: * @self: a #MMModem. @@ -156,13 +201,15 @@ mm_modem_get_current_capabilities (MMModem *self) guint mm_modem_get_max_bearers (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), 0); + g_return_val_if_fail (MM_IS_MODEM (self), 0); - return mm_gdbus_modem_get_max_bearers (self); + return mm_gdbus_modem_get_max_bearers (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** - * mm_modem_get_max_bearers: + * mm_modem_get_max_active_bearers: * @self: a #MMModem. * * Gets the maximum number of active packet data bearers this #MMModem supports. @@ -176,28 +223,33 @@ mm_modem_get_max_bearers (MMModem *self) guint mm_modem_get_max_active_bearers (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), 0); + g_return_val_if_fail (MM_IS_MODEM (self), 0); - return mm_gdbus_modem_get_max_active_bearers (self); + return mm_gdbus_modem_get_max_active_bearers (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** * mm_modem_get_manufacturer: * @self: A #MMModem. * * Gets the equipment manufacturer, as reported by this #MMModem. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_manufacturer() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_manufacturer() if on another + * thread.</warning> * - * Returns: (transfer none): The equipment manufacturer, or %NULL if none available. + * Returns: (transfer none): The equipment manufacturer, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_manufacturer (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_CONSTANT_STRING ( - mm_gdbus_modem_get_manufacturer (self)); + mm_gdbus_modem_get_manufacturer (MM_GDBUS_MODEM (self))); } /** @@ -211,29 +263,34 @@ mm_modem_get_manufacturer (MMModem *self) gchar * mm_modem_dup_manufacturer (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_STRING ( - mm_gdbus_modem_dup_manufacturer (self)); + mm_gdbus_modem_dup_manufacturer (MM_GDBUS_MODEM (self))); } +/*****************************************************************************/ + /** * mm_modem_get_model: * @self: A #MMModem. * * Gets the equipment model, as reported by this #MMModem. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_model() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_model() if on another + * thread.</warning> * - * Returns: (transfer none): The equipment model, or %NULL if none available. + * Returns: (transfer none): The equipment model, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_model (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_CONSTANT_STRING ( - mm_gdbus_modem_get_model (self)); + mm_gdbus_modem_get_model (MM_GDBUS_MODEM (self))); } /** @@ -247,29 +304,34 @@ mm_modem_get_model (MMModem *self) gchar * mm_modem_dup_model (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_STRING ( - mm_gdbus_modem_dup_model (self)); + mm_gdbus_modem_dup_model (MM_GDBUS_MODEM (self))); } +/*****************************************************************************/ + /** * mm_modem_get_revision: * @self: A #MMModem. * * Gets the equipment revision, as reported by this #MMModem. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_revision() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_revision() if on another + * thread.</warning> * - * Returns: (transfer none): The equipment revision, or %NULL if none available. + * Returns: (transfer none): The equipment revision, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_revision (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_CONSTANT_STRING ( - mm_gdbus_modem_get_revision (self)); + mm_gdbus_modem_get_revision (MM_GDBUS_MODEM (self))); } /** @@ -283,12 +345,14 @@ mm_modem_get_revision (MMModem *self) gchar * mm_modem_dup_revision (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_STRING ( - mm_gdbus_modem_dup_revision (self)); + mm_gdbus_modem_dup_revision (MM_GDBUS_MODEM (self))); } +/*****************************************************************************/ + /** * mm_modem_get_device_identifier: * @self: A #MMModem. @@ -304,17 +368,20 @@ mm_modem_dup_revision (MMModem *self) * This is not the device's IMEI or ESN since those may not be available * before unlocking the device via a PIN. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_device_identifier() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_device_identifier() if on another + * thread.</warning> * - * Returns: (transfer none): The device identifier, or %NULL if none available. + * Returns: (transfer none): The device identifier, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_device_identifier (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_CONSTANT_STRING ( - mm_gdbus_modem_get_device_identifier (self)); + mm_gdbus_modem_get_device_identifier (MM_GDBUS_MODEM (self))); } /** @@ -337,12 +404,14 @@ mm_modem_get_device_identifier (MMModem *self) gchar * mm_modem_dup_device_identifier (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_STRING ( - mm_gdbus_modem_dup_device_identifier (self)); + mm_gdbus_modem_dup_device_identifier (MM_GDBUS_MODEM (self))); } +/*****************************************************************************/ + /** * mm_modem_get_device: * @self: A #MMModem. @@ -350,17 +419,20 @@ mm_modem_dup_device_identifier (MMModem *self) * Gets the physical modem device reference (ie, USB, PCI, PCMCIA device), which * may be dependent upon the operating system. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_device() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_device() if on another + * thread.</warning> * - * Returns: (transfer none): The device, or %NULL if none available. + * Returns: (transfer none): The device, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_device (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_CONSTANT_STRING ( - mm_gdbus_modem_get_device (self)); + mm_gdbus_modem_get_device (MM_GDBUS_MODEM (self))); } /** @@ -375,12 +447,14 @@ mm_modem_get_device (MMModem *self) gchar * mm_modem_dup_device (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_STRING ( - mm_gdbus_modem_dup_device (self)); + mm_gdbus_modem_dup_device (MM_GDBUS_MODEM (self))); } +/*****************************************************************************/ + /** * mm_modem_get_drivers: * @self: A #MMModem. @@ -388,16 +462,19 @@ mm_modem_dup_device (MMModem *self) * Gets the Operating System device drivers handling communication with the modem * hardware. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_driver() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_drivers() if on another + * thread.</warning> * - * Returns: (transfer none): The drivers, or %NULL if none available. + * Returns: (transfer none): The drivers, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * const * mm_modem_get_drivers (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); - return mm_gdbus_modem_get_drivers (self); + return mm_gdbus_modem_get_drivers (MM_GDBUS_MODEM (self)); } /** @@ -412,28 +489,33 @@ mm_modem_get_drivers (MMModem *self) gchar ** mm_modem_dup_drivers (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); - return mm_gdbus_modem_dup_drivers (self); + return mm_gdbus_modem_dup_drivers (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** * mm_modem_get_plugin: * @self: A #MMModem. * * Gets the name of the plugin handling this #MMModem. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_plugin() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_plugin() if on another + * thread.</warning> * - * Returns: (transfer none): The name of the plugin, or %NULL if none available. + * Returns: (transfer none): The name of the plugin, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_plugin (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_CONSTANT_STRING ( - mm_gdbus_modem_get_plugin (self)); + mm_gdbus_modem_get_plugin (MM_GDBUS_MODEM (self))); } /** @@ -447,12 +529,14 @@ mm_modem_get_plugin (MMModem *self) gchar * mm_modem_dup_plugin (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_STRING ( - mm_gdbus_modem_dup_plugin (self)); + mm_gdbus_modem_dup_plugin (MM_GDBUS_MODEM (self))); } +/*****************************************************************************/ + /** * mm_modem_get_equipment_identifier: * @self: A #MMModem. @@ -462,17 +546,20 @@ mm_modem_dup_plugin (MMModem *self) * This will be the IMEI number for GSM devices and the hex-format ESN/MEID * for CDMA devices. * - * <warning>It is only safe to use this function on the thread where @self was constructed. Use mm_modem_dup_equipment_identifier() if on another thread.</warning> + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_plugin() if on another + * thread.</warning> * - * Returns: (transfer none): The equipment identifier, or %NULL if none available. + * Returns: (transfer none): The equipment identifier, or %NULL if none available. Do not free the returned value, it belongs to @self. */ const gchar * mm_modem_get_equipment_identifier (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_CONSTANT_STRING ( - mm_gdbus_modem_get_equipment_identifier (self)); + mm_gdbus_modem_get_equipment_identifier (MM_GDBUS_MODEM (self))); } /** @@ -489,32 +576,57 @@ mm_modem_get_equipment_identifier (MMModem *self) gchar * mm_modem_dup_equipment_identifier (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); RETURN_NON_EMPTY_STRING ( - mm_gdbus_modem_dup_equipment_identifier (self)); + mm_gdbus_modem_dup_equipment_identifier (MM_GDBUS_MODEM (self))); } +/*****************************************************************************/ + +/** + * mm_modem_get_own_numbers: (skip) + * @self: A #MMModem. + * + * Gets the list of numbers (e.g. MSISDN in 3GPP) being currently handled by + * this modem. + * + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_dup_own_numbers() if on another + * thread.</warning> + * + * Returns: (transfer none): The list of own numbers or %NULL if none available. Do not free the returned value, it belongs to @self. + */ const gchar *const * mm_modem_get_own_numbers (MMModem *self) { const gchar *const *own; - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); - own = mm_gdbus_modem_get_own_numbers (self); + own = mm_gdbus_modem_get_own_numbers (MM_GDBUS_MODEM (self)); return (own && own[0] ? own : NULL); } +/** + * mm_modem_dup_own_numbers: + * @self: A #MMModem. + * + * Gets a copy of the list of numbers (e.g. MSISDN in 3GPP) being currently + * handled by this modem. + * + * Returns: (transfer full): The list of own numbers or %NULL if none is available. The returned value should be freed with g_strfreev(). + */ gchar ** mm_modem_dup_own_numbers (MMModem *self) { gchar **own; - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); - own = mm_gdbus_modem_dup_own_numbers (self); + own = mm_gdbus_modem_dup_own_numbers (MM_GDBUS_MODEM (self)); if (own && own[0]) return own; @@ -522,45 +634,130 @@ mm_modem_dup_own_numbers (MMModem *self) return NULL; } +/*****************************************************************************/ + /** * mm_modem_get_unlock_required: * @self: A #MMModem. * - * Gets current lock state of the #MMModemm. + * Gets current lock state of the #MMModem. * * Returns: A #MMModemLock value, specifying the current lock state. */ MMModemLock mm_modem_get_unlock_required (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), MM_MODEM_LOCK_UNKNOWN); + g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_LOCK_UNKNOWN); + + return (MMModemLock) mm_gdbus_modem_get_unlock_required (MM_GDBUS_MODEM (self)); +} + +/*****************************************************************************/ + +static void +unlock_retries_updated (MMModem *self, + GParamSpec *pspec) +{ + g_mutex_lock (&self->priv->unlock_retries_mutex); + { + GVariant *dictionary; + + g_clear_object (&self->priv->unlock_retries); + + /* TODO: update existing object instead of re-creating? */ + dictionary = mm_gdbus_modem_get_unlock_retries (MM_GDBUS_MODEM (self)); + if (dictionary) + self->priv->unlock_retries = mm_unlock_retries_new_from_dictionary (dictionary); + } + g_mutex_unlock (&self->priv->unlock_retries_mutex); +} - return (MMModemLock) mm_gdbus_modem_get_unlock_required (self); +static void +ensure_internal_unlock_retries (MMModem *self, + MMUnlockRetries **dup) +{ + g_mutex_lock (&self->priv->unlock_retries_mutex); + { + /* If this is the first time ever asking for the object, setup the + * update listener and the initial object, if any. */ + if (!self->priv->unlock_retries_id) { + GVariant *dictionary; + + dictionary = mm_gdbus_modem_dup_unlock_retries (MM_GDBUS_MODEM (self)); + if (dictionary) { + self->priv->unlock_retries = mm_unlock_retries_new_from_dictionary (dictionary); + g_variant_unref (dictionary); + } + + /* No need to clear this signal connection when freeing self */ + self->priv->unlock_retries_id = + g_signal_connect (self, + "notify::unlock-retries", + G_CALLBACK (unlock_retries_updated), + NULL); + } + + if (dup && self->priv->unlock_retries) + *dup = g_object_ref (self->priv->unlock_retries); + } + g_mutex_unlock (&self->priv->unlock_retries_mutex); } /** * mm_modem_get_unlock_retries: * @self: A #MMModem. * - * TODO + * Gets a #MMUnlockRetries object, which provides, for each + * <link linkend="MMModemLock">MMModemLock</link> handled by the modem, the + * number of PIN tries remaining before the code becomes blocked (requiring a PUK) + * or permanently blocked. * - * Returns: a new reference to a #MMUnlockRetries object. + * <warning>The values reported by @self are not updated when the values in the + * interface change. Instead, the client is expected to call + * mm_modem_get_unlock_retries() again to get a new #MMUnlockRetries with the + * new values.</warning> + * + * Returns: (transfer full) A #MMUnlockRetries that must be freed with g_object_unref() or %NULL if unknown. */ MMUnlockRetries * mm_modem_get_unlock_retries (MMModem *self) { - MMUnlockRetries *unlock_retries; - GVariant *dictionary; - - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + MMUnlockRetries *unlock_retries = NULL; - dictionary = mm_gdbus_modem_get_unlock_retries (self); - unlock_retries = mm_unlock_retries_new_from_dictionary (dictionary); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); + ensure_internal_unlock_retries (self, &unlock_retries); return unlock_retries; } /** + * mm_modem_peek_unlock_retries: + * @self: A #MMModem. + * + * Gets a #MMUnlockRetries object, which provides, for each + * <link linkend="MMModemLock">MMModemLock</link> handled by the modem, the + * number of PIN tries remaining before the code becomes blocked (requiring a PUK) + * or permanently blocked. + * + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_modem_get_unlock_retries() if on another + * thread.</warning> + * + * Returns: (transfer none) A #MMUnlockRetries. Do not free the returned value, it belongs to @self. + */ +MMUnlockRetries * +mm_modem_peek_unlock_retries (MMModem *self) +{ + g_return_val_if_fail (MM_IS_MODEM (self), NULL); + + ensure_internal_unlock_retries (self, NULL); + return self->priv->unlock_retries; +} + +/*****************************************************************************/ + +/** * mm_modem_get_state: * @self: A #MMModem. * @@ -571,11 +768,13 @@ mm_modem_get_unlock_retries (MMModem *self) MMModemState mm_modem_get_state (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), MM_MODEM_STATE_UNKNOWN); + g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_STATE_UNKNOWN); - return (MMModemState) mm_gdbus_modem_get_state (self); + return (MMModemState) mm_gdbus_modem_get_state (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** * mm_modem_get_access_technology: * @self: A #MMModem. @@ -588,11 +787,13 @@ mm_modem_get_state (MMModem *self) MMModemAccessTechnology mm_modem_get_access_technologies (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN); + g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN); - return (MMModemAccessTechnology) mm_gdbus_modem_get_access_technologies (self); + return (MMModemAccessTechnology) mm_gdbus_modem_get_access_technologies (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** * mm_modem_get_signal_quality: * @self: A #MMModem. @@ -613,14 +814,15 @@ mm_modem_get_signal_quality (MMModem *self, gboolean is_recent = FALSE; guint quality = 0; - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), 0); + g_return_val_if_fail (MM_IS_MODEM (self), 0); - variant = mm_gdbus_modem_get_signal_quality (self); + variant = mm_gdbus_modem_dup_signal_quality (MM_GDBUS_MODEM (self)); if (variant) { g_variant_get (variant, "(ub)", &quality, &is_recent); + g_variant_unref (variant); } if (recent) @@ -628,6 +830,8 @@ mm_modem_get_signal_quality (MMModem *self, return quality; } +/*****************************************************************************/ + /** * mm_modem_get_supported_modes: * @self: A #MMModem. @@ -641,11 +845,13 @@ mm_modem_get_signal_quality (MMModem *self, MMModemMode mm_modem_get_supported_modes (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), MM_MODEM_MODE_NONE); + g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_MODE_NONE); - return (MMModemMode) mm_gdbus_modem_get_supported_modes (self); + return (MMModemMode) mm_gdbus_modem_get_supported_modes (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** * mm_modem_get_allowed_modes: * @self: A #MMModem. @@ -660,11 +866,13 @@ mm_modem_get_supported_modes (MMModem *self) MMModemMode mm_modem_get_allowed_modes (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), MM_MODEM_MODE_NONE); + g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_MODE_NONE); - return (MMModemMode) mm_gdbus_modem_get_allowed_modes (self); + return (MMModemMode) mm_gdbus_modem_get_allowed_modes (MM_GDBUS_MODEM (self)); } +/*****************************************************************************/ + /** * mm_modem_get_preferred_mode: * @self: A #MMModem. @@ -677,95 +885,243 @@ mm_modem_get_allowed_modes (MMModem *self) MMModemMode mm_modem_get_preferred_mode (MMModem *self) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), MM_MODEM_MODE_NONE); + g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_MODE_NONE); + + return (MMModemMode) mm_gdbus_modem_get_preferred_mode (MM_GDBUS_MODEM (self)); +} + +/*****************************************************************************/ + +static void +supported_bands_updated (MMModem *self, + GParamSpec *pspec) +{ + g_mutex_lock (&self->priv->supported_bands_mutex); + { + GVariant *dictionary; + + if (self->priv->supported_bands) + g_array_unref (self->priv->supported_bands); - return (MMModemMode) mm_gdbus_modem_get_preferred_mode (self); + dictionary = mm_gdbus_modem_get_supported_bands (MM_GDBUS_MODEM (self)); + self->priv->supported_bands = (dictionary ? + mm_common_bands_variant_to_garray (dictionary) : + NULL); + } + g_mutex_unlock (&self->priv->supported_bands_mutex); +} + +static void +ensure_internal_supported_bands (MMModem *self, + GArray **dup) +{ + g_mutex_lock (&self->priv->supported_bands_mutex); + { + /* If this is the first time ever asking for the array, setup the + * update listener and the initial array, if any. */ + if (!self->priv->supported_bands_id) { + GVariant *dictionary; + + dictionary = mm_gdbus_modem_dup_supported_bands (MM_GDBUS_MODEM (self)); + if (dictionary) { + self->priv->supported_bands = mm_common_bands_variant_to_garray (dictionary); + g_variant_unref (dictionary); + } + + /* No need to clear this signal connection when freeing self */ + self->priv->supported_bands_id = + g_signal_connect (self, + "notify::supported-bands", + G_CALLBACK (supported_bands_updated), + NULL); + } + + if (dup && self->priv->supported_bands) + *dup = g_array_ref (self->priv->supported_bands); + } + g_mutex_unlock (&self->priv->supported_bands_mutex); } /** * mm_modem_get_supported_bands: * @self: A #MMModem. - * @bands: (out): Return location for the array of #MMModemBand values. + * @bands: (out) (array length=n_bands): Return location for the array of #MMModemBand values. The returned array should be freed with g_free() when no longer needed. * @n_bands: (out): Return location for the number of values in @bands. * * Gets the list of radio frequency and technology bands supported by the #MMModem. * * For POTS devices, only #MM_MODEM_BAND_ANY will be returned in @bands. + * + * Returns: %TRUE if @bands and @n_bands are set, %FALSE otherwise. */ -void +gboolean mm_modem_get_supported_bands (MMModem *self, MMModemBand **bands, guint *n_bands) { - GArray *array; + GArray *array = NULL; - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); - g_return_if_fail (bands != NULL); - g_return_if_fail (n_bands != NULL); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + g_return_val_if_fail (bands != NULL, FALSE); + g_return_val_if_fail (n_bands != NULL, FALSE); + + ensure_internal_supported_bands (self, &array); + if (!array) + return FALSE; - array = mm_common_bands_variant_to_garray (mm_gdbus_modem_get_supported_bands (self)); *n_bands = array->len; *bands = (MMModemBand *)g_array_free (array, FALSE); + return TRUE; +} + +/** + * mm_modem_peek_supported_bands: + * @self: A #MMModem. + * @bands: (out) (array length=n_bands): Return location for the array of #MMModemBand values. Do not free the returned array, it is owned by @self. + * @n_bands: (out): Return location for the number of values in @bands. + * + * Gets the list of radio frequency and technology bands supported by the #MMModem. + * + * For POTS devices, only #MM_MODEM_BAND_ANY will be returned in @bands. + * + * Returns: %TRUE if @bands and @n_bands are set, %FALSE otherwise. + */ +gboolean +mm_modem_peek_supported_bands (MMModem *self, + const MMModemBand **bands, + guint *n_bands) +{ + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + g_return_val_if_fail (bands != NULL, FALSE); + g_return_val_if_fail (n_bands != NULL, FALSE); + + ensure_internal_supported_bands (self, NULL); + if (!self->priv->supported_bands) + return FALSE; + + *n_bands = self->priv->supported_bands->len; + *bands = (MMModemBand *)self->priv->supported_bands->data; + return TRUE; +} + +/*****************************************************************************/ + +static void +bands_updated (MMModem *self, + GParamSpec *pspec) +{ + g_mutex_lock (&self->priv->bands_mutex); + { + GVariant *dictionary; + + if (self->priv->bands) + g_array_unref (self->priv->bands); + + dictionary = mm_gdbus_modem_get_bands (MM_GDBUS_MODEM (self)); + self->priv->bands = (dictionary ? + mm_common_bands_variant_to_garray (dictionary) : + NULL); + } + g_mutex_unlock (&self->priv->bands_mutex); +} + +static void +ensure_internal_bands (MMModem *self, + GArray **dup) +{ + g_mutex_lock (&self->priv->bands_mutex); + { + /* If this is the first time ever asking for the array, setup the + * update listener and the initial array, if any. */ + if (!self->priv->bands_id) { + GVariant *dictionary; + + dictionary = mm_gdbus_modem_dup_bands (MM_GDBUS_MODEM (self)); + if (dictionary) { + self->priv->bands = mm_common_bands_variant_to_garray (dictionary); + g_variant_unref (dictionary); + } + + /* No need to clear this signal connection when freeing self */ + self->priv->bands_id = + g_signal_connect (self, + "notify::bands", + G_CALLBACK (bands_updated), + NULL); + } + + if (dup && self->priv->bands) + *dup = g_array_ref (self->priv->bands); + } + g_mutex_unlock (&self->priv->bands_mutex); } /** * mm_modem_get_bands: * @self: A #MMModem. - * @bands: (out): Return location for the array of #MMModemBand values. + * @bands: (out) (array length=n_bands): Return location for the array of #MMModemBand values. The returned array should be freed with g_free() when no longer needed. * @n_bands: (out): Return location for the number of values in @bands. * * Gets the list of radio frequency and technology bands the #MMModem is currently * using when connecting to a network. * * For POTS devices, only the #MM_MODEM_BAND_ANY band is supported. + * + * Returns: %TRUE if @bands and @n_bands are set, %FALSE otherwise. */ -void +gboolean mm_modem_get_bands (MMModem *self, MMModemBand **bands, guint *n_bands) { - GArray *array; + GArray *array = NULL; + + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + g_return_val_if_fail (bands != NULL, FALSE); + g_return_val_if_fail (n_bands != NULL, FALSE); - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); - g_return_if_fail (bands != NULL); - g_return_if_fail (n_bands != NULL); + ensure_internal_bands (self, &array); + if (!array) + return FALSE; - array = mm_common_bands_variant_to_garray (mm_gdbus_modem_get_bands (self)); *n_bands = array->len; *bands = (MMModemBand *)g_array_free (array, FALSE); + return TRUE; } /** - * mm_modem_enable: + * mm_modem_peek_bands: * @self: A #MMModem. - * @cancellable: (allow-none): A #GCancellable or %NULL. - * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. - * @user_data: User data to pass to @callback. + * @bands: (out) (array length=n_storages): Return location for the array of #MMModemBand values. Do not free the returned value, it is owned by @self. + * @n_bands: (out): Return location for the number of values in @bands. * - * Asynchronously tries to enable the #MMModem. When enabled, the modem's radio is - * powered on and data sessions, voice calls, location services, and Short Message - * Service may be available. + * Gets the list of radio frequency and technology bands the #MMModem is currently + * using when connecting to a network. * - * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. - * You can then call mm_modem_enable_finish() to get the result of the operation. + * For POTS devices, only the #MM_MODEM_BAND_ANY band is supported. * - * See mm_modem_enable_sync() for the synchronous, blocking version of this method. + * Returns: %TRUE if @bands and @n_bands are set, %FALSE otherwise. */ -void -mm_modem_enable (MMModem *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) +gboolean +mm_modem_peek_bands (MMModem *self, + const MMModemBand **bands, + guint *n_bands) { - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + g_return_val_if_fail (bands != NULL, FALSE); + g_return_val_if_fail (n_bands != NULL, FALSE); + + ensure_internal_bands (self, NULL); + if (!self->priv->bands) + return FALSE; - mm_gdbus_modem_call_enable (self, - TRUE, - cancellable, - callback, - user_data); + *n_bands = self->priv->bands->len; + *bands = (MMModemBand *)self->priv->bands->data; + return TRUE; } +/*****************************************************************************/ + /** * mm_modem_enable_finish: * @self: A #MMModem. @@ -774,16 +1130,43 @@ mm_modem_enable (MMModem *self, * * Finishes an operation started with mm_modem_enable(). * - * Returns: (skip): %TRUE if the modem was properly enabled, %FALSE if @error is set. + * Returns: %TRUE if the modem was properly enabled, %FALSE if @error is set. */ gboolean mm_modem_enable_finish (MMModem *self, GAsyncResult *res, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + + return mm_gdbus_modem_call_enable_finish (MM_GDBUS_MODEM (self), res, error); +} + +/** + * mm_modem_enable: + * @self: A #MMModem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously tries to enable the #MMModem. When enabled, the modem's radio is + * powered on and data sessions, voice calls, location services, and Short Message + * Service may be available. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call mm_modem_enable_finish() to get the result of the operation. + * + * See mm_modem_enable_sync() for the synchronous, blocking version of this method. + */ +void +mm_modem_enable (MMModem *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM (self)); - return mm_gdbus_modem_call_enable_finish (self, res, error); + mm_gdbus_modem_call_enable (MM_GDBUS_MODEM (self), TRUE, cancellable, callback, user_data); } /** @@ -799,19 +1182,38 @@ mm_modem_enable_finish (MMModem *self, * The calling thread is blocked until a reply is received. See mm_modem_enable() * for the asynchronous version of this method. * - * Returns: (skip): %TRUE if the modem was properly enabled, %FALSE if @error is set. + * Returns: %TRUE if the modem was properly enabled, %FALSE if @error is set. */ gboolean mm_modem_enable_sync (MMModem *self, GCancellable *cancellable, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_enable_sync (self, - TRUE, - cancellable, - error); + return mm_gdbus_modem_call_enable_sync (MM_GDBUS_MODEM (self), TRUE, cancellable, error); +} + +/*****************************************************************************/ + +/** + * mm_modem_disable_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_disable(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_disable(). + * + * Returns: %TRUE if the modem was properly disabled, %FALSE if @error is set. + */ +gboolean +mm_modem_disable_finish (MMModem *self, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + + return mm_gdbus_modem_call_enable_finish (MM_GDBUS_MODEM (self), res, error); } /** @@ -835,33 +1237,9 @@ mm_modem_disable (MMModem *self, GAsyncReadyCallback callback, gpointer user_data) { - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); - mm_gdbus_modem_call_enable (self, - FALSE, - cancellable, - callback, - user_data); -} - -/** - * mm_modem_disable_finish: - * @self: A #MMModem. - * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_disable(). - * @error: Return location for error or %NULL. - * - * Finishes an operation started with mm_modem_disable(). - * - * Returns: (skip): %TRUE if the modem was properly disabled, %FALSE if @error is set. - */ -gboolean -mm_modem_disable_finish (MMModem *self, - GAsyncResult *res, - GError **error) -{ - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); - - return mm_gdbus_modem_call_enable_finish (self, res, error); + mm_gdbus_modem_call_enable (MM_GDBUS_MODEM (self), FALSE, cancellable, callback, user_data); } /** @@ -876,21 +1254,20 @@ mm_modem_disable_finish (MMModem *self, * The calling thread is blocked until a reply is received. See mm_modem_disable() * for the asynchronous version of this method. * - * Returns: (skip): %TRUE if the modem was properly disabled, %FALSE if @error is set. + * Returns: %TRUE if the modem was properly disabled, %FALSE if @error is set. */ gboolean mm_modem_disable_sync (MMModem *self, GCancellable *cancellable, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_enable_sync (self, - FALSE, - cancellable, - error); + return mm_gdbus_modem_call_enable_sync (MM_GDBUS_MODEM (self), FALSE, cancellable, error); } +/*****************************************************************************/ + typedef struct { MMModem *self; GSimpleAsyncResult *result; @@ -928,7 +1305,7 @@ list_bearers_context_complete_and_free (ListBearersContext *ctx) * * Finishes an operation started with mm_modem_list_bearers(). * - * Returns: (transfer-full): The list of #MMBearer objects, or %NULL if either none found or if @error is set. + * Returns: (transfer full): The list of #MMBearer objects, or %NULL if either none found or if @error is set. */ GList * mm_modem_list_bearers_finish (MMModem *self, @@ -937,7 +1314,7 @@ mm_modem_list_bearers_finish (MMModem *self, { GList *list; - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) return NULL; @@ -997,7 +1374,7 @@ modem_list_bearers_ready (MMModem *self, { GError *error = NULL; - mm_gdbus_modem_call_list_bearers_finish (self, &ctx->bearer_paths, res, &error); + mm_gdbus_modem_call_list_bearers_finish (MM_GDBUS_MODEM (self), &ctx->bearer_paths, res, &error); if (error) { g_simple_async_result_take_error (ctx->result, error); list_bearers_context_complete_and_free (ctx); @@ -1046,7 +1423,7 @@ mm_modem_list_bearers (MMModem *self, { ListBearersContext *ctx; - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); ctx = g_slice_new0 (ListBearersContext); ctx->self = g_object_ref (self); @@ -1057,7 +1434,7 @@ mm_modem_list_bearers (MMModem *self, if (cancellable) ctx->cancellable = g_object_ref (cancellable); - mm_gdbus_modem_call_list_bearers (self, + mm_gdbus_modem_call_list_bearers (MM_GDBUS_MODEM (self), cancellable, (GAsyncReadyCallback)modem_list_bearers_ready, ctx); @@ -1074,7 +1451,7 @@ mm_modem_list_bearers (MMModem *self, * The calling thread is blocked until a reply is received. See mm_modem_list_bearers() * for the asynchronous version of this method. * - * Returns: (transfer-full): The list of #MMBearer objects, or %NULL if either none found or if @error is set. + * Returns: (transfer full): The list of #MMBearer objects, or %NULL if either none found or if @error is set. */ GList * mm_modem_list_bearers_sync (MMModem *self, @@ -1085,9 +1462,9 @@ mm_modem_list_bearers_sync (MMModem *self, gchar **bearer_paths = NULL; guint i; - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); - if (!mm_gdbus_modem_call_list_bearers_sync (self, + if (!mm_gdbus_modem_call_list_bearers_sync (MM_GDBUS_MODEM (self), &bearer_paths, cancellable, error)) @@ -1123,6 +1500,8 @@ mm_modem_list_bearers_sync (MMModem *self, return bearer_objects; } +/*****************************************************************************/ + typedef struct { GSimpleAsyncResult *result; GCancellable *cancellable; @@ -1146,14 +1525,14 @@ create_bearer_context_complete_and_free (CreateBearerContext *ctx) * * Finishes an operation started with mm_modem_create_bearer(). * - * Returns: (transfer-full): A newly created #MMBearer, or %NULL if @error is set. + * Returns: (transfer full): A newly created #MMBearer, or %NULL if @error is set. */ MMBearer * mm_modem_create_bearer_finish (MMModem *self, GAsyncResult *res, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) return NULL; @@ -1188,7 +1567,7 @@ modem_create_bearer_ready (MMModem *self, GError *error = NULL; gchar *bearer_path = NULL; - if (!mm_gdbus_modem_call_create_bearer_finish (self, + if (!mm_gdbus_modem_call_create_bearer_finish (MM_GDBUS_MODEM (self), &bearer_path, res, &error)) { @@ -1213,7 +1592,7 @@ modem_create_bearer_ready (MMModem *self, /** * mm_modem_create_bearer: * @self: A #MMModem. - * @properties: A ##MMBearerProperties object with the properties to use. + * @properties: A #MMBearerProperties object with the properties to use. * @cancellable: (allow-none): A #GCancellable or %NULL. * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. * @user_data: User data to pass to @callback. @@ -1240,7 +1619,7 @@ mm_modem_create_bearer (MMModem *self, CreateBearerContext *ctx; GVariant *dictionary; - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); ctx = g_slice_new0 (CreateBearerContext); ctx->result = g_simple_async_result_new (G_OBJECT (self), @@ -1252,7 +1631,7 @@ mm_modem_create_bearer (MMModem *self, dictionary = mm_bearer_properties_get_dictionary (properties); mm_gdbus_modem_call_create_bearer ( - self, + MM_GDBUS_MODEM (self), dictionary, cancellable, (GAsyncReadyCallback)modem_create_bearer_ready, @@ -1264,7 +1643,7 @@ mm_modem_create_bearer (MMModem *self, /** * mm_modem_create_bearer_sync: * @self: A #MMModem. - * @properties: A ##MMBearerProperties object with the properties to use. + * @properties: A #MMBearerProperties object with the properties to use. * @cancellable: (allow-none): A #GCancellable or %NULL. * @error: Return location for error or %NULL. * @@ -1278,7 +1657,7 @@ mm_modem_create_bearer (MMModem *self, * The calling thread is blocked until a reply is received. See mm_modem_create_bearer() * for the asynchronous version of this method. * - * Returns: (transfer-full): A newly created #MMBearer, or %NULL if @error is set. + * Returns: (transfer full): A newly created #MMBearer, or %NULL if @error is set. */ MMBearer * mm_modem_create_bearer_sync (MMModem *self, @@ -1290,10 +1669,10 @@ mm_modem_create_bearer_sync (MMModem *self, gchar *bearer_path = NULL; GVariant *dictionary; - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); dictionary = mm_bearer_properties_get_dictionary (properties); - mm_gdbus_modem_call_create_bearer_sync (self, + mm_gdbus_modem_call_create_bearer_sync (MM_GDBUS_MODEM (self), dictionary, &bearer_path, cancellable, @@ -1315,6 +1694,28 @@ mm_modem_create_bearer_sync (MMModem *self, return bearer; } +/*****************************************************************************/ + +/** + * mm_modem_delete_bearer_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_delete_bearer(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_delete_bearer(). + * + * Returns: %TRUE if the bearer was deleted, %FALSE if @error is set. + */ +gboolean +mm_modem_delete_bearer_finish (MMModem *self, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + + return mm_gdbus_modem_call_delete_bearer_finish (MM_GDBUS_MODEM (self), res, error); +} + /** * mm_modem_delete_bearer: * @self: A #MMModem. @@ -1337,35 +1738,9 @@ mm_modem_delete_bearer (MMModem *self, GAsyncReadyCallback callback, gpointer user_data) { - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); - mm_gdbus_modem_call_delete_bearer (self, - bearer, - cancellable, - callback, - user_data); -} - -/** - * mm_modem_delete_bearer_finish: - * @self: A #MMModem. - * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_delete_bearer(). - * @error: Return location for error or %NULL. - * - * Finishes an operation started with mm_modem_delete_bearer(). - * - * Returns: (skip): %TRUE if the bearer was deleted, %FALSE if @error is set. - */ -gboolean -mm_modem_delete_bearer_finish (MMModem *self, - GAsyncResult *res, - GError **error) -{ - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); - - return mm_gdbus_modem_call_delete_bearer_finish (self, - res, - error); + mm_gdbus_modem_call_delete_bearer (MM_GDBUS_MODEM (self), bearer, cancellable, callback, user_data); } /** @@ -1380,7 +1755,7 @@ mm_modem_delete_bearer_finish (MMModem *self, * The calling thread is blocked until a reply is received. See mm_modem_delete_bearer() * for the asynchronous version of this method. * - * Returns: (skip): %TRUE if the bearer was deleted, %FALSE if @error is set. + * Returns: %TRUE if the bearer was deleted, %FALSE if @error is set. */ gboolean mm_modem_delete_bearer_sync (MMModem *self, @@ -1388,52 +1763,121 @@ mm_modem_delete_bearer_sync (MMModem *self, GCancellable *cancellable, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_delete_bearer_sync (self, - bearer, - cancellable, - error); + return mm_gdbus_modem_call_delete_bearer_sync (MM_GDBUS_MODEM (self), bearer, cancellable, error); +} + +/*****************************************************************************/ + +/** + * mm_modem_reset_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_reset(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_reset(). + * + * Returns: %TRUE if the reset was successful, %FALSE if @error is set. + */ +gboolean +mm_modem_reset_finish (MMModem *self, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + + return mm_gdbus_modem_call_reset_finish (MM_GDBUS_MODEM (self), res, error); } +/** + * mm_modem_reset: + * @self: A #MMModem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously clears non-persistent configuration and state, and returns the device to + * a newly-powered-on state. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call mm_modem_reset_finish() to get the result of the operation. + * + * See mm_modem_reset_sync() for the synchronous, blocking version of this method. + */ void mm_modem_reset (MMModem *self, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); - mm_gdbus_modem_call_reset (self, - cancellable, - callback, - user_data); + mm_gdbus_modem_call_reset (MM_GDBUS_MODEM (self), cancellable, callback, user_data); } +/** + * mm_modem_reset_sync: + * @self: A #MMModem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously clears non-persistent configuration and state, and returns the device to + * a newly-powered-on state. + * + * The calling thread is blocked until a reply is received. See mm_modem_reset() + * for the asynchronous version of this method. + * + * Returns: %TRUE if the reset was successful, %FALSE if @error is set. + */ gboolean -mm_modem_reset_finish (MMModem *self, - GAsyncResult *res, - GError **error) +mm_modem_reset_sync (MMModem *self, + GCancellable *cancellable, + GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_reset_finish (self, - res, - error); + return mm_gdbus_modem_call_reset_sync (MM_GDBUS_MODEM (self), cancellable, error); } +/*****************************************************************************/ + +/** + * mm_modem_factory_reset_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_factory_reset(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_factory_reset(). + * + * Returns: %TRUE if the factory_reset was successful, %FALSE if @error is set. + */ gboolean -mm_modem_reset_sync (MMModem *self, - GCancellable *cancellable, - GError **error) +mm_modem_factory_reset_finish (MMModem *self, + GAsyncResult *res, + GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_reset_sync (self, - cancellable, - error); + return mm_gdbus_modem_call_factory_reset_finish (MM_GDBUS_MODEM (self), res, error); } +/** + * mm_modem_factory_reset: + * @self: A #MMModem. + * @code: Carrier-supplied code required to reset the modem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously clears the modem's configuration (including persistent configuration and + * state), and returns the device to a factory-default state. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call mm_modem_factory_reset_finish() to get the result of the operation. + * + * See mm_modem_factory_reset_sync() for the synchronous, blocking version of this method. + */ void mm_modem_factory_reset (MMModem *self, const gchar *code, @@ -1441,42 +1885,80 @@ mm_modem_factory_reset (MMModem *self, GAsyncReadyCallback callback, gpointer user_data) { - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); - mm_gdbus_modem_call_factory_reset (self, - code, - cancellable, - callback, - user_data); -} - -gboolean -mm_modem_factory_reset_finish (MMModem *self, - GAsyncResult *res, - GError **error) -{ - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); - - return mm_gdbus_modem_call_factory_reset_finish (self, - res, - error); + mm_gdbus_modem_call_factory_reset (MM_GDBUS_MODEM (self), code, cancellable, callback, user_data); } +/** + * mm_modem_factory_reset_sync: + * @self: A #MMModem. + * @code: Carrier-supplied code required to reset the modem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously clears the modem's configuration (including persistent configuration and + * state), and returns the device to a factory-default state. + * + * The calling thread is blocked until a reply is received. See mm_modem_factory_reset() + * for the asynchronous version of this method. + * + * Returns: %TRUE if the factory reset was successful, %FALSE if @error is set. + */ gboolean mm_modem_factory_reset_sync (MMModem *self, const gchar *code, GCancellable *cancellable, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_factory_reset_sync (self, - code, - cancellable, - error); + return mm_gdbus_modem_call_factory_reset_sync (MM_GDBUS_MODEM (self), code, cancellable, error); } +/*****************************************************************************/ + +/** + * mm_modem_command_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_command(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_command(). + * + * Returns: (transfer full) A newly allocated string with the reply to the command, or #NULL if @error is set. The returned value should be freed with g_free(). + */ +gchar * +mm_modem_command_finish (MMModem *self, + GAsyncResult *res, + GError **error) +{ + gchar *result; + + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + if (!mm_gdbus_modem_call_command_finish (MM_GDBUS_MODEM (self), &result, res, error)) + return NULL; + + return result; +} + +/** + * mm_modem_command: + * @self: A #MMModem. + * @cmd: AT command to run. + * @timeout: Maximum time to wait for the response, in seconds. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously runs an AT command in the modem. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call mm_modem_command_finish() to get the result of the operation. + * + * See mm_modem_command_sync() for the synchronous, blocking version of this method. + */ void mm_modem_command (MMModem *self, const gchar *cmd, @@ -1486,36 +1968,28 @@ mm_modem_command (MMModem *self, gpointer user_data) { - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); if (g_dbus_proxy_get_default_timeout (G_DBUS_PROXY (self)) < timeout) g_warning ("Requested command timeout is shorter than the default DBus timeout"); - mm_gdbus_modem_call_command (self, - cmd, - timeout, - cancellable, - callback, - user_data); -} - -gchar * -mm_modem_command_finish (MMModem *self, - GAsyncResult *res, - GError **error) -{ - gchar *result; - - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); - - if (!mm_gdbus_modem_call_command_finish (self, - &result, - res, - error)) - return NULL; - - return result; + mm_gdbus_modem_call_command (MM_GDBUS_MODEM (self), cmd, timeout, cancellable, callback, user_data); } +/** + * mm_modem_command_sync: + * @self: A #MMModem. + * @cmd: AT command to run. + * @timeout: Maximum time to wait for the response, in seconds. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously runs an AT command in the modem. + * + * The calling thread is blocked until a reply is received. See mm_modem_command() + * for the asynchronous version of this method. + * + * Returns: (transfer full) A newly allocated string with the reply to the command, or #NULL if @error is set. The returned value should be freed with g_free(). + */ gchar * mm_modem_command_sync (MMModem *self, const gchar *cmd, @@ -1525,34 +1999,56 @@ mm_modem_command_sync (MMModem *self, { gchar *result; - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); if (g_dbus_proxy_get_default_timeout (G_DBUS_PROXY (self)) < timeout) g_warning ("Requested command timeout is shorter than the default DBus timeout"); - if (!mm_gdbus_modem_call_command_sync (self, - cmd, - timeout, - &result, - cancellable, - error)) + if (!mm_gdbus_modem_call_command_sync (MM_GDBUS_MODEM (self), cmd, timeout, &result, cancellable, error)) return NULL; return result; } +/*****************************************************************************/ + +/** + * mm_modem_set_allowed_modes_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_set_allowed_modes(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_set_allowed_modes(). + * + * Returns: %TRUE if the allowed modes were successfully set, %FALSE if @error is set. + */ gboolean mm_modem_set_allowed_modes_finish (MMModem *self, GAsyncResult *res, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_set_allowed_modes_finish (self, - res, - error); + return mm_gdbus_modem_call_set_allowed_modes_finish (MM_GDBUS_MODEM (self), res, error); } +/** + * mm_modem_set_allowed_modes: + * @self: A #MMModem. + * @modes: Mask of #MMModemMode values specifying which modes are allowed. + * @preferred: A #MMModemMode value specifying which of the modes given in @modes is the preferred one, or #MM_MODEM_MODE_NONE if none. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously sets the access technologies (e.g. 2G/3G/4G preference) the device is + * currently allowed to use when connecting to a network. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call mm_modem_set_allowed_modes_finish() to get the result of the operation. + * + * See mm_modem_set_allowed_modes_sync() for the synchronous, blocking version of this method. + */ void mm_modem_set_allowed_modes (MMModem *self, MMModemMode modes, @@ -1561,16 +2057,27 @@ mm_modem_set_allowed_modes (MMModem *self, GAsyncReadyCallback callback, gpointer user_data) { - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); - mm_gdbus_modem_call_set_allowed_modes (self, - modes, - preferred, - cancellable, - callback, - user_data); + mm_gdbus_modem_call_set_allowed_modes (MM_GDBUS_MODEM (self), modes, preferred, cancellable, callback, user_data); } +/** + * mm_modem_set_allowed_modes_sync: + * @self: A #MMModem. + * @modes: Mask of #MMModemMode values specifying which modes are allowed. + * @preferred: A #MMModemMode value specifying which of the modes given in @modes is the preferred one, or #MM_MODEM_MODE_NONE if none. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously sets the access technologies (e.g. 2G/3G/4G preference) the device is + * currently allowed to use when connecting to a network. + * + * The calling thread is blocked until a reply is received. See mm_modem_set_allowed_modes() + * for the asynchronous version of this method. + * + * Returns: %TRUE if the allowed modes were successfully set, %FALSE if @error is set. + */ gboolean mm_modem_set_allowed_modes_sync (MMModem *self, MMModemMode modes, @@ -1578,27 +2085,50 @@ mm_modem_set_allowed_modes_sync (MMModem *self, GCancellable *cancellable, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_set_allowed_modes_sync (self, - modes, - preferred, - cancellable, - error); + return mm_gdbus_modem_call_set_allowed_modes_sync (MM_GDBUS_MODEM (self), modes, preferred, cancellable, error); } +/*****************************************************************************/ + +/** + * mm_modem_set_bands_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_set_bands(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_set_bands(). + * + * Returns: %TRUE if the bands were successfully set, %FALSE if @error is set. + */ gboolean mm_modem_set_bands_finish (MMModem *self, GAsyncResult *res, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); - return mm_gdbus_modem_call_set_bands_finish (self, - res, - error); + return mm_gdbus_modem_call_set_bands_finish (MM_GDBUS_MODEM (self), res, error); } +/** + * mm_modem_set_bands: + * @self: A #MMModem. + * @bands: An array of #MMModemBand values specifying which bands are allowed. + * @n_bands: Number of elements in @bands. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously sets the radio frequency and technology bands the device is currently + * allowed to use when connecting to a network. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call mm_modem_set_bands_finish() to get the result of the operation. + * + * See mm_modem_set_bands_sync() for the synchronous, blocking version of this method. + */ void mm_modem_set_bands (MMModem *self, const MMModemBand *bands, @@ -1607,15 +2137,31 @@ mm_modem_set_bands (MMModem *self, GAsyncReadyCallback callback, gpointer user_data) { - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); - mm_gdbus_modem_call_set_bands (self, + mm_gdbus_modem_call_set_bands (MM_GDBUS_MODEM (self), mm_common_bands_array_to_variant (bands, n_bands), cancellable, callback, user_data); } +/** + * mm_modem_set_bands_sync: + * @self: A #MMModem. + * @bands: An array of #MMModemBand values specifying which bands are allowed. + * @n_bands: Number of elements in @bands. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously sets the radio frequency and technology bands the device is currently + * allowed to use when connecting to a network. + * + * The calling thread is blocked until a reply is received. See mm_modem_set_bands() + * for the asynchronous version of this method. + * + * Returns: %TRUE if the bands were successfully set, %FALSE if @error is set. + */ gboolean mm_modem_set_bands_sync (MMModem *self, const MMModemBand *bands, @@ -1623,15 +2169,43 @@ mm_modem_set_bands_sync (MMModem *self, GCancellable *cancellable, GError **error) { - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), FALSE); + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); return (mm_gdbus_modem_call_set_bands_sync ( - self, + MM_GDBUS_MODEM (self), mm_common_bands_array_to_variant (bands, n_bands), cancellable, error)); } +/*****************************************************************************/ + +/** + * mm_modem_get_sim_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_modem_get_sim(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_get_sim(). + * + * Returns: a #MMSim or #NULL if none available. The returned value should be freed with g_object_unref(). + */ +MMSim * +mm_modem_get_sim_finish (MMModem *self, + GAsyncResult *res, + GError **error) +{ + MMSim *sim; + + g_return_val_if_fail (MM_IS_MODEM (self), NULL); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) + return NULL; + + sim = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)); + return (sim ? (MMSim *)g_object_ref (sim) : NULL); +} + static void modem_get_sim_ready (GDBusConnection *connection, GAsyncResult *res, @@ -1652,6 +2226,20 @@ modem_get_sim_ready (GDBusConnection *connection, g_object_unref (simple); } +/** + * mm_modem_get_sim: + * @self: A #MMModem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Synchronously gets the #MMSim object managed by this #MMModem. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call mm_modem_get_sim_finish() to get the result of the operation. + * + * See mm_modem_get_sim_sync() for the synchronous, blocking version of this method. + */ void mm_modem_get_sim (MMModem *self, GCancellable *cancellable, @@ -1661,7 +2249,7 @@ mm_modem_get_sim (MMModem *self, GSimpleAsyncResult *result; const gchar *sim_path; - g_return_if_fail (MM_GDBUS_IS_MODEM (self)); + g_return_if_fail (MM_IS_MODEM (self)); result = g_simple_async_result_new (G_OBJECT (self), callback, @@ -1687,19 +2275,19 @@ mm_modem_get_sim (MMModem *self, result); } -MMSim * -mm_modem_get_sim_finish (MMModem *self, - GAsyncResult *res, - GError **error) -{ - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) - return NULL; - - return g_object_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res))); -} - +/** + * mm_modem_get_sim_sync: + * @self: A #MMModem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously gets the #MMSim object managed by this #MMModem. + * + * The calling thread is blocked until a reply is received. See mm_modem_get_sim() + * for the asynchronous version of this method. + * + * Returns: a #MMSim or #NULL if none available. The returned value should be freed with g_object_unref(). + */ MMSim * mm_modem_get_sim_sync (MMModem *self, GCancellable *cancellable, @@ -1707,18 +2295,71 @@ mm_modem_get_sim_sync (MMModem *self, { const gchar *sim_path; - g_return_val_if_fail (MM_GDBUS_IS_MODEM (self), NULL); + g_return_val_if_fail (MM_IS_MODEM (self), NULL); sim_path = mm_modem_get_sim_path (self); if (!sim_path) return NULL; - return (mm_gdbus_sim_proxy_new_sync ( - g_dbus_proxy_get_connection ( - G_DBUS_PROXY (self)), - G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, - MM_DBUS_SERVICE, - sim_path, - cancellable, - error)); + return (MMSim *)(mm_gdbus_sim_proxy_new_sync ( + g_dbus_proxy_get_connection ( + G_DBUS_PROXY (self)), + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, + MM_DBUS_SERVICE, + sim_path, + cancellable, + error)); +} + +/*****************************************************************************/ + +static void +mm_modem_init (MMModem *self) +{ + /* Setup private data */ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + MM_TYPE_MODEM, + MMModemPrivate); + g_mutex_init (&self->priv->unlock_retries_mutex); + g_mutex_init (&self->priv->supported_bands_mutex); + g_mutex_init (&self->priv->bands_mutex); +} + +static void +finalize (GObject *object) +{ + MMModem *self = MM_MODEM (object); + + g_mutex_clear (&self->priv->unlock_retries_mutex); + g_mutex_clear (&self->priv->supported_bands_mutex); + g_mutex_clear (&self->priv->bands_mutex); + + if (self->priv->supported_bands) + g_array_unref (self->priv->supported_bands); + if (self->priv->bands) + g_array_unref (self->priv->bands); + + G_OBJECT_CLASS (mm_modem_parent_class)->finalize (object); +} + +static void +dispose (GObject *object) +{ + MMModem *self = MM_MODEM (object); + + g_clear_object (&self->priv->unlock_retries); + + G_OBJECT_CLASS (mm_modem_parent_class)->dispose (object); +} + +static void +mm_modem_class_init (MMModemClass *modem_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (modem_class); + + g_type_class_add_private (object_class, sizeof (MMModemPrivate)); + + /* Virtual methods */ + object_class->dispose = dispose; + object_class->finalize = finalize; } diff --git a/libmm-glib/mm-modem.h b/libmm-glib/mm-modem.h index d9cfd748..78306522 100644 --- a/libmm-glib/mm-modem.h +++ b/libmm-glib/mm-modem.h @@ -17,7 +17,8 @@ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. * - * Copyright (C) 2011 Aleksander Morgado <aleksander@gnu.org> + * Copyright (C) 2011 - 2012 Aleksander Morgado <aleksander@gnu.org> + * Copyright (C) 2012 Google, Inc. */ #ifndef _MM_MODEM_H_ @@ -31,51 +32,106 @@ G_BEGIN_DECLS -typedef MmGdbusModem MMModem; -#define MM_TYPE_MODEM(o) MM_GDBUS_TYPE_MODEM (o) -#define MM_MODEM(o) MM_GDBUS_MODEM(o) -#define MM_IS_MODEM(o) MM_GDBUS_IS_MODEM(o) +#define MM_TYPE_MODEM (mm_modem_get_type ()) +#define MM_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_MODEM, MMModem)) +#define MM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MM_TYPE_MODEM, MMModemClass)) +#define MM_IS_MODEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_MODEM)) +#define MM_IS_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), MM_TYPE_MODEM)) +#define MM_MODEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_MODEM, MMModemClass)) + +typedef struct _MMModem MMModem; +typedef struct _MMModemClass MMModemClass; +typedef struct _MMModemPrivate MMModemPrivate; + +/** + * MMModem: + * + * The #MMModem structure contains private data and should only be accessed + * using the provided API. + */ +struct _MMModem { + /*< private >*/ + MmGdbusModemProxy parent; + MMModemPrivate *priv; +}; + +struct _MMModemClass { + /*< private >*/ + MmGdbusModemProxyClass parent; +}; + +GType mm_modem_get_type (void); const gchar *mm_modem_get_path (MMModem *self); gchar *mm_modem_dup_path (MMModem *self); const gchar *mm_modem_get_sim_path (MMModem *self); gchar *mm_modem_dup_sim_path (MMModem *self); + MMModemCapability mm_modem_get_modem_capabilities (MMModem *self); + MMModemCapability mm_modem_get_current_capabilities (MMModem *self); + guint mm_modem_get_max_bearers (MMModem *self); + guint mm_modem_get_max_active_bearers (MMModem *self); + const gchar *mm_modem_get_manufacturer (MMModem *self); gchar *mm_modem_dup_manufacturer (MMModem *self); + const gchar *mm_modem_get_model (MMModem *self); gchar *mm_modem_dup_model (MMModem *self); + const gchar *mm_modem_get_revision (MMModem *self); gchar *mm_modem_dup_revision (MMModem *self); + const gchar *mm_modem_get_device_identifier (MMModem *self); gchar *mm_modem_dup_device_identifier (MMModem *self); + const gchar *mm_modem_get_device (MMModem *self); gchar *mm_modem_dup_device (MMModem *self); -const gchar * const *mm_modem_get_drivers (MMModem *self); -gchar **mm_modem_dup_drivers (MMModem *self); + +const gchar * const *mm_modem_get_drivers (MMModem *self); +gchar **mm_modem_dup_drivers (MMModem *self); + const gchar *mm_modem_get_plugin (MMModem *self); gchar *mm_modem_dup_plugin (MMModem *self); + const gchar *mm_modem_get_equipment_identifier (MMModem *self); gchar *mm_modem_dup_equipment_identifier (MMModem *self); -const gchar *const *mm_modem_get_own_numbers (MMModem *self); -gchar **mm_modem_dup_own_numbers (MMModem *self); + +const gchar *const *mm_modem_get_own_numbers (MMModem *self); +gchar **mm_modem_dup_own_numbers (MMModem *self); + MMModemLock mm_modem_get_unlock_required (MMModem *self); + MMUnlockRetries *mm_modem_get_unlock_retries (MMModem *self); +MMUnlockRetries *mm_modem_peek_unlock_retries (MMModem *self); + MMModemState mm_modem_get_state (MMModem *self); + MMModemAccessTechnology mm_modem_get_access_technologies (MMModem *self); + guint mm_modem_get_signal_quality (MMModem *self, gboolean *recent); + MMModemMode mm_modem_get_supported_modes (MMModem *self); + MMModemMode mm_modem_get_allowed_modes (MMModem *self); + MMModemMode mm_modem_get_preferred_mode (MMModem *self); -void mm_modem_get_supported_bands (MMModem *self, + +gboolean mm_modem_peek_supported_bands (MMModem *self, + const MMModemBand **bands, + guint *n_bands); +gboolean mm_modem_get_supported_bands (MMModem *self, MMModemBand **bands, guint *n_bands); -void mm_modem_get_bands (MMModem *self, + +gboolean mm_modem_peek_bands (MMModem *self, + const MMModemBand **bands, + guint *n_bands); +gboolean mm_modem_get_bands (MMModem *self, MMModemBand **bands, guint *n_bands); @@ -158,24 +214,24 @@ gboolean mm_modem_factory_reset_finish (MMModem *self, GAsyncResult *res, GError **error); gboolean mm_modem_factory_reset_sync (MMModem *self, - const gchar *arg_code, + const gchar *code, GCancellable *cancellable, GError **error); -void mm_modem_command (MMModem *self, - const gchar *cmd, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -gchar *mm_modem_command_finish (MMModem *self, - GAsyncResult *res, - GError **error); -gchar *mm_modem_command_sync (MMModem *self, - const gchar *arg_cmd, - guint timeout, - GCancellable *cancellable, - GError **error); +void mm_modem_command (MMModem *self, + const gchar *cmd, + guint timeout, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gchar *mm_modem_command_finish (MMModem *self, + GAsyncResult *res, + GError **error); +gchar *mm_modem_command_sync (MMModem *self, + const gchar *cmd, + guint timeout, + GCancellable *cancellable, + GError **error); void mm_modem_set_allowed_modes (MMModem *self, MMModemMode modes, |