aboutsummaryrefslogtreecommitdiff
path: root/libmm-glib/mm-modem.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-06-20 23:45:12 +0200
committerAleksander Morgado <aleksander@lanedo.com>2013-06-24 19:44:57 +0200
commit3206e9566392e8a9678bbd49e0de9bb21ed75291 (patch)
tree20c5321317ccf6968b9de0c50a7fd7b8df853c65 /libmm-glib/mm-modem.c
parent30fe6eab4844966a9ad99599aeac910fd9898798 (diff)
api,introspection: new 'Ports' property in the Modem interface
We will expose a new 'Ports' property listing all ports currently known by a given modem. Ports which are not used but are detected as being part of the modem will be listed with an 'unknown' port type. This change uses the new 'MMModemPortType' enum and the new 'MMModemPortInfo' helper struct to handle these values in libmm-glib. The already available 'MMPortType' enum hasn't been re-used for the interface because it contains values that we don't need (e.g. IGNORED). The port list is now also included in the modem information command of mmcli: $ sudo mmcli -m 0 /org/freedesktop/ModemManager1/Modem/0 (device id '97b7b99e3e2bea103880545b619fb05a3cc81b26') ------------------------- System | device: '/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4' | drivers: 'qcserial, qmi_wwan' | plugin: 'Gobi' | primary port: 'cdc-wdm0' | ports: 'ttyUSB0 (qcdm), ttyUSB1 (at), cdc-wdm0 (qmi), wwp0s29u1u4 (net)' https://bugzilla.gnome.org/show_bug.cgi?id=702678
Diffstat (limited to 'libmm-glib/mm-modem.c')
-rw-r--r--libmm-glib/mm-modem.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/libmm-glib/mm-modem.c b/libmm-glib/mm-modem.c
index 95685e68..410b5593 100644
--- a/libmm-glib/mm-modem.c
+++ b/libmm-glib/mm-modem.c
@@ -44,6 +44,11 @@
G_DEFINE_TYPE (MMModem, mm_modem, MM_GDBUS_TYPE_MODEM_PROXY)
struct _MMModemPrivate {
+ /* Ports */
+ GMutex ports_mutex;
+ guint ports_id;
+ GArray *ports;
+
/* UnlockRetries */
GMutex unlock_retries_mutex;
guint unlock_retries_id;
@@ -683,6 +688,124 @@ mm_modem_dup_primary_port (MMModem *self)
/*****************************************************************************/
+static void
+ports_updated (MMModem *self,
+ GParamSpec *pspec)
+{
+ g_mutex_lock (&self->priv->ports_mutex);
+ {
+ GVariant *dictionary;
+
+ if (self->priv->ports)
+ g_array_unref (self->priv->ports);
+
+ dictionary = mm_gdbus_modem_get_ports (MM_GDBUS_MODEM (self));
+ self->priv->ports = (dictionary ?
+ mm_common_ports_variant_to_garray (dictionary) :
+ NULL);
+ }
+ g_mutex_unlock (&self->priv->ports_mutex);
+}
+
+static gboolean
+ensure_internal_ports (MMModem *self,
+ MMModemPortInfo **dup_ports,
+ guint *dup_ports_n)
+{
+ gboolean ret;
+
+ g_mutex_lock (&self->priv->ports_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->ports_id) {
+ GVariant *dictionary;
+
+ dictionary = mm_gdbus_modem_dup_ports (MM_GDBUS_MODEM (self));
+ if (dictionary) {
+ self->priv->ports = mm_common_ports_variant_to_garray (dictionary);
+ g_variant_unref (dictionary);
+ }
+
+ /* No need to clear this signal connection when freeing self */
+ self->priv->ports_id =
+ g_signal_connect (self,
+ "notify::ports",
+ G_CALLBACK (ports_updated),
+ NULL);
+ }
+
+ if (!self->priv->ports)
+ ret = FALSE;
+ else {
+ ret = TRUE;
+
+ if (dup_ports && dup_ports_n) {
+ *dup_ports_n = self->priv->ports->len;
+ if (self->priv->ports->len > 0) {
+ *dup_ports = g_malloc (sizeof (MMModemPortInfo) * self->priv->ports->len);
+ memcpy (*dup_ports, self->priv->ports->data, sizeof (MMModemPortInfo) * self->priv->ports->len);
+ } else
+ *dup_ports = NULL;
+ }
+ }
+ }
+ g_mutex_unlock (&self->priv->ports_mutex);
+
+ return ret;
+}
+
+/**
+ * mm_modem_peek_current_ports:
+ * @self: A #MMModem.
+ * @ports: (out) (array length=n_ports): Return location for the array of #MMModemPortInfo values. Do not free the returned value, it is owned by @self.
+ * @n_ports: (out): Return location for the number of values in @ports.
+ *
+ * Gets the list of ports in the modem.
+ *
+ * Returns: %TRUE if @ports and @n_ports are set, %FALSE otherwise.
+ */
+gboolean
+mm_modem_peek_ports (MMModem *self,
+ const MMModemPortInfo **ports,
+ guint *n_ports)
+{
+ g_return_val_if_fail (MM_IS_MODEM (self), FALSE);
+ g_return_val_if_fail (ports != NULL, FALSE);
+ g_return_val_if_fail (n_ports != NULL, FALSE);
+
+ if (!ensure_internal_ports (self, NULL, NULL))
+ return FALSE;
+
+ *n_ports = self->priv->ports->len;
+ *ports = (MMModemPortInfo *)self->priv->ports->data;
+ return TRUE;
+}
+
+/**
+ * mm_modem_get_ports:
+ * @self: A #MMModem.
+ * @ports: (out) (array length=n_ports): Return location for the array of #MMModemPortInfo values. The returned array should be freed with mm_modem_port_info_array_free() when no longer needed.
+ * @n_ports: (out): Return location for the number of values in @ports.
+ *
+ * Gets the list of ports in the modem.
+ *
+ * Returns: %TRUE if @ports and @n_ports are set, %FALSE otherwise.
+ */
+gboolean
+mm_modem_get_ports (MMModem *self,
+ MMModemPortInfo **ports,
+ guint *n_ports)
+{
+ g_return_val_if_fail (MM_IS_MODEM (self), FALSE);
+ g_return_val_if_fail (ports != NULL, FALSE);
+ g_return_val_if_fail (n_ports != NULL, FALSE);
+
+ return ensure_internal_ports (self, ports, n_ports);
+}
+
+/*****************************************************************************/
+
/**
* mm_modem_get_equipment_identifier:
* @self: A #MMModem.