diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-06-20 23:45:12 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-06-24 19:44:57 +0200 |
commit | 3206e9566392e8a9678bbd49e0de9bb21ed75291 (patch) | |
tree | 20c5321317ccf6968b9de0c50a7fd7b8df853c65 /src | |
parent | 30fe6eab4844966a9ad99599aeac910fd9898798 (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 'src')
-rw-r--r-- | src/mm-base-modem.c | 47 | ||||
-rw-r--r-- | src/mm-base-modem.h | 6 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 9 |
3 files changed, 62 insertions, 0 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index c4133932..b348abaa 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -968,6 +968,53 @@ mm_base_modem_has_at_port (MMBaseModem *self) return FALSE; } +MMModemPortInfo * +mm_base_modem_get_port_infos (MMBaseModem *self, + guint *n_port_infos) +{ + GHashTableIter iter; + MMModemPortInfo *port_infos; + MMPort *port; + guint i; + + *n_port_infos = g_hash_table_size (self->priv->ports); + port_infos = g_new (MMModemPortInfo, *n_port_infos); + g_hash_table_iter_init (&iter, self->priv->ports); + i = 0; + while (g_hash_table_iter_next (&iter, NULL, (gpointer)&port)) { + port_infos[i].name = g_strdup (mm_port_get_device (port)); + switch (mm_port_get_port_type (port)) { + case MM_PORT_TYPE_NET: + port_infos[i].type = MM_MODEM_PORT_TYPE_NET; + break; + case MM_PORT_TYPE_AT: + port_infos[i].type = MM_MODEM_PORT_TYPE_AT; + break; + case MM_PORT_TYPE_QCDM: + port_infos[i].type = MM_MODEM_PORT_TYPE_QCDM; + break; + case MM_PORT_TYPE_GPS: + port_infos[i].type = MM_MODEM_PORT_TYPE_GPS; + break; + case MM_PORT_TYPE_QMI: + port_infos[i].type = MM_MODEM_PORT_TYPE_QMI; + break; + case MM_PORT_TYPE_MBIM: + port_infos[i].type = MM_MODEM_PORT_TYPE_MBIM; + break; + case MM_PORT_TYPE_UNKNOWN: + case MM_PORT_TYPE_IGNORED: + default: + port_infos[i].type = MM_MODEM_PORT_TYPE_UNKNOWN; + break; + } + + i++; + } + + return port_infos; +} + static void initialize_ready (MMBaseModem *self, GAsyncResult *res) diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h index 6eeed44b..2c3bd96a 100644 --- a/src/mm-base-modem.h +++ b/src/mm-base-modem.h @@ -23,6 +23,9 @@ #include <glib.h> #include <glib-object.h> +#define _LIBMM_INSIDE_MM +#include <libmm-glib.h> + #include <mm-gdbus-modem.h> #include "mm-auth.h" @@ -155,6 +158,9 @@ MMAtSerialPort *mm_base_modem_get_best_at_port (MMBaseModem *self, GError MMPort *mm_base_modem_get_best_data_port (MMBaseModem *self, MMPortType type); GList *mm_base_modem_get_data_ports (MMBaseModem *self); +MMModemPortInfo *mm_base_modem_get_port_infos (MMBaseModem *self, + guint *n_port_infos); + void mm_base_modem_set_hotplugged (MMBaseModem *self, gboolean hotplugged); gboolean mm_base_modem_get_hotplugged (MMBaseModem *self); diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index e4103ffe..cbee740e 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -4019,6 +4019,15 @@ interface_initialization_step (InitializationContext *ctx) g_assert (primary != NULL); mm_gdbus_modem_set_primary_port (ctx->skeleton, mm_port_get_device (primary)); } + /* Load ports if not done before */ + if (!mm_gdbus_modem_get_ports (ctx->skeleton)) { + MMModemPortInfo *port_infos; + guint n_port_infos; + + port_infos = mm_base_modem_get_port_infos (MM_BASE_MODEM (ctx->self), &n_port_infos); + mm_gdbus_modem_set_ports (ctx->skeleton, mm_common_ports_array_to_variant (port_infos, n_port_infos)); + mm_modem_port_info_array_free (port_infos, n_port_infos); + } /* Fall down to next step */ ctx->step++; |