From 90479d54c81d81ca9980643cebd941ecbaa79df7 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Tue, 4 Sep 2018 10:32:26 +0100 Subject: [PATCH] trivial: Add a FuDevice:incorporate() vfunc This allows classes that inherit from FuDevice to copy across private data. --- src/fu-device.c | 8 ++++++++ src/fu-device.h | 4 +++- src/fu-udev-device.c | 10 ++++++++++ src/fu-usb-device.c | 10 ++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/fu-device.c b/src/fu-device.c index 87000758b..adc844ba9 100644 --- a/src/fu-device.c +++ b/src/fu-device.c @@ -1766,11 +1766,15 @@ fu_device_probe_invalidate (FuDevice *device) void fu_device_incorporate (FuDevice *self, FuDevice *donor) { + FuDeviceClass *klass = FU_DEVICE_GET_CLASS (self); FuDevicePrivate *priv = GET_PRIVATE (self); FuDevicePrivate *priv_donor = GET_PRIVATE (donor); GPtrArray *parent_guids = fu_device_get_parent_guids (donor); g_autoptr(GList) metadata_keys = NULL; + g_return_if_fail (FU_IS_DEVICE (self)); + g_return_if_fail (FU_IS_DEVICE (donor)); + /* copy from donor FuDevice if has not already been set */ if (priv->alternate_id == NULL) fu_device_set_alternate_id (self, fu_device_get_alternate_id (donor)); @@ -1791,6 +1795,10 @@ fu_device_incorporate (FuDevice *self, FuDevice *donor) /* now the base class, where all the interesting bits are */ fwupd_device_incorporate (FWUPD_DEVICE (self), FWUPD_DEVICE (donor)); + + /* optional subclass */ + if (klass->incorporate != NULL) + klass->incorporate (self, donor); } static void diff --git a/src/fu-device.h b/src/fu-device.h index 33b625c70..3119bd94b 100644 --- a/src/fu-device.h +++ b/src/fu-device.h @@ -46,8 +46,10 @@ struct _FuDeviceClass GError **error); gboolean (*setup) (FuDevice *device, GError **error); + void (*incorporate) (FuDevice *device, + FuDevice *donor); /*< private >*/ - gpointer padding[22]; + gpointer padding[21]; }; /** diff --git a/src/fu-udev-device.c b/src/fu-udev-device.c index 7bd29250c..edf5def20 100644 --- a/src/fu-udev-device.c +++ b/src/fu-udev-device.c @@ -192,6 +192,15 @@ fu_udev_device_set_dev (FuUdevDevice *self, GUdevDevice *udev_device) } +static void +fu_udev_device_incorporate (FuDevice *self, FuDevice *donor) +{ + g_return_if_fail (FU_IS_UDEV_DEVICE (self)); + g_return_if_fail (FU_IS_UDEV_DEVICE (donor)); + fu_udev_device_set_dev (FU_UDEV_DEVICE (self), + fu_udev_device_get_dev (FU_UDEV_DEVICE (donor))); +} + /** * fu_udev_device_get_dev: * @self: A #FuUdevDevice @@ -341,6 +350,7 @@ fu_udev_device_class_init (FuUdevDeviceClass *klass) object_class->get_property = fu_udev_device_get_property; object_class->set_property = fu_udev_device_set_property; device_class->probe = fu_udev_device_probe; + device_class->incorporate = fu_udev_device_incorporate; signals[SIGNAL_CHANGED] = g_signal_new ("changed", diff --git a/src/fu-usb-device.c b/src/fu-usb-device.c index aab2be5cd..17bf7998d 100644 --- a/src/fu-usb-device.c +++ b/src/fu-usb-device.c @@ -322,6 +322,15 @@ fu_usb_device_get_dev (FuUsbDevice *device) return priv->usb_device; } +static void +fu_usb_device_incorporate (FuDevice *self, FuDevice *donor) +{ + g_return_if_fail (FU_IS_USB_DEVICE (self)); + g_return_if_fail (FU_IS_USB_DEVICE (donor)); + fu_usb_device_set_dev (FU_USB_DEVICE (self), + fu_usb_device_get_dev (FU_USB_DEVICE (donor))); +} + /** * fu_usb_device_new: * @usb_device: A #GUsbDevice @@ -353,6 +362,7 @@ fu_usb_device_class_init (FuUsbDeviceClass *klass) device_class->open = fu_usb_device_open; device_class->close = fu_usb_device_close; device_class->probe = fu_usb_device_probe; + device_class->incorporate = fu_usb_device_incorporate; pspec = g_param_spec_object ("usb-device", NULL, NULL, G_USB_TYPE_DEVICE,