trivial: Add a FuDevice:incorporate() vfunc

This allows classes that inherit from FuDevice to copy across private data.
This commit is contained in:
Richard Hughes 2018-09-04 10:32:26 +01:00 committed by Mario Limonciello
parent 6cfd3f21f5
commit 90479d54c8
4 changed files with 31 additions and 1 deletions

View File

@ -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

View File

@ -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];
};
/**

View File

@ -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",

View File

@ -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,