diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2016-09-28 20:34:48 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2016-09-29 15:43:05 +0200 |
commit | ae9ede926a1747216b54e22398edde203ec9a03c (patch) | |
tree | c6d1c405982051497ed78fbbfc7cbb6a3f16e5e4 /src/mm-port.c | |
parent | c4a584416ab4af81b6cae653625c78f9158de1e6 (diff) |
core: use the kernel device object in the port object and the plugin interface
The mm_base_modem_grab_port() now receives a MMKernelDevice directly from the
plugin, which is then stored in the MMPort corresponding to the port.
This means that we have direct access to e.g. all properties set by udev rules
everywhere, and we don't need additional GUdevClient objects (e.g. like the one
used in the Huawei plugin to detect NDISDUP support during runtime).
For virtual ports (e.g. generated during unit tests), we have a new 'generic'
kernel device object which just provides the values from the kernel device
properties given during its creation.
Diffstat (limited to 'src/mm-port.c')
-rw-r--r-- | src/mm-port.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/src/mm-port.c b/src/mm-port.c index 0ee9a199..0156f6e7 100644 --- a/src/mm-port.c +++ b/src/mm-port.c @@ -29,8 +29,7 @@ enum { PROP_SUBSYS, PROP_TYPE, PROP_CONNECTED, - PROP_PARENT_PATH, - + PROP_KERNEL_DEVICE, LAST_PROP }; @@ -39,7 +38,7 @@ struct _MMPortPrivate { MMPortSubsys subsys; MMPortType ptype; gboolean connected; - gchar *parent_path; + MMKernelDevice *kernel_device; }; /*****************************************************************************/ @@ -96,12 +95,12 @@ mm_port_set_connected (MMPort *self, gboolean connected) } } -const gchar * -mm_port_get_parent_path (MMPort *self) +MMKernelDevice * +mm_port_peek_kernel_device (MMPort *self) { g_return_val_if_fail (MM_IS_PORT (self), NULL); - return self->priv->parent_path; + return self->priv->kernel_device; } /*****************************************************************************/ @@ -136,9 +135,10 @@ set_property (GObject *object, case PROP_CONNECTED: self->priv->connected = g_value_get_boolean (value); break; - case PROP_PARENT_PATH: - g_free (self->priv->parent_path); - self->priv->parent_path = g_value_dup_string (value); + case PROP_KERNEL_DEVICE: + /* Not construct only, but only set once */ + g_assert (!self->priv->kernel_device); + self->priv->kernel_device = g_value_dup_object (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -165,8 +165,8 @@ get_property (GObject *object, guint prop_id, case PROP_CONNECTED: g_value_set_boolean (value, self->priv->connected); break; - case PROP_PARENT_PATH: - g_value_set_string (value, self->priv->parent_path); + case PROP_KERNEL_DEVICE: + g_value_set_object (value, self->priv->kernel_device); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -180,12 +180,21 @@ finalize (GObject *object) MMPort *self = MM_PORT (object); g_free (self->priv->device); - g_free (self->priv->parent_path); G_OBJECT_CLASS (mm_port_parent_class)->finalize (object); } static void +dispose (GObject *object) +{ + MMPort *self = MM_PORT (object); + + g_clear_object (&self->priv->kernel_device); + + G_OBJECT_CLASS (mm_port_parent_class)->dispose (object); +} + +static void mm_port_class_init (MMPortClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -196,6 +205,7 @@ mm_port_class_init (MMPortClass *klass) object_class->set_property = set_property; object_class->get_property = get_property; object_class->finalize = finalize; + object_class->dispose = dispose; g_object_class_install_property (object_class, PROP_DEVICE, @@ -234,10 +244,10 @@ mm_port_class_init (MMPortClass *klass) G_PARAM_READWRITE)); g_object_class_install_property - (object_class, PROP_PARENT_PATH, - g_param_spec_string (MM_PORT_PARENT_PATH, - "Parent path", - "sysfs path of the parent device", - NULL, + (object_class, PROP_KERNEL_DEVICE, + g_param_spec_object (MM_PORT_KERNEL_DEVICE, + "Kernel device", + "kernel device object", + MM_TYPE_KERNEL_DEVICE, G_PARAM_READWRITE)); } |