fwupd/plugins/uefi-capsule/fu-uefi-backend.c
Richard Hughes 3747e245e5 uefi-capsule: Add support for CapsuleOnDisk
Based on a patch by Ilias Apalodimas <ilias.apalodimas@linaro.org>,
many thanks.

Fixes https://github.com/fwupd/fwupd/issues/2900
2021-07-28 17:11:39 +01:00

84 lines
2.1 KiB
C

/*
* Copyright (C) 2021 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#include "config.h"
#include "fu-uefi-backend.h"
#include "fu-uefi-nvram-device.h"
typedef struct {
GType device_gtype;
} FuUefiBackendPrivate;
G_DEFINE_TYPE_WITH_PRIVATE(FuUefiBackend, fu_uefi_backend, FU_TYPE_BACKEND)
#define GET_PRIVATE(o) (fu_uefi_backend_get_instance_private(o))
void
fu_uefi_backend_set_device_gtype(FuUefiBackend *self, GType device_gtype)
{
FuUefiBackendPrivate *priv = GET_PRIVATE(self);
priv->device_gtype = device_gtype;
}
GType
fu_uefi_backend_get_device_gtype(FuUefiBackend *self)
{
FuUefiBackendPrivate *priv = GET_PRIVATE(self);
return priv->device_gtype;
}
/* create virtual object not backed by an ESRT entry */
FuUefiDevice *
fu_uefi_backend_device_new_from_dev(FuUefiBackend *self, FuDevice *dev)
{
FuUefiDevice *device;
FuUefiBackendPrivate *priv = GET_PRIVATE(self);
const gchar *tmp;
g_return_val_if_fail(fu_device_get_guid_default(dev) != NULL, NULL);
tmp = fu_device_get_metadata(dev, FU_DEVICE_METADATA_UEFI_DEVICE_KIND);
device =
g_object_new(priv->device_gtype,
"fw-class",
fu_device_get_guid_default(dev),
"kind",
fu_uefi_device_kind_from_string(tmp),
"capsule-flags",
fu_device_get_metadata_integer(dev, FU_DEVICE_METADATA_UEFI_CAPSULE_FLAGS),
"fw-version",
fu_device_get_metadata_integer(dev, FU_DEVICE_METADATA_UEFI_FW_VERSION),
NULL);
fu_device_incorporate(FU_DEVICE(device), dev);
return device;
}
FuUefiDevice *
fu_uefi_backend_device_new_from_guid(FuUefiBackend *self, const gchar *guid)
{
FuUefiDevice *device;
FuUefiBackendPrivate *priv = GET_PRIVATE(self);
g_return_val_if_fail(guid != NULL, NULL);
device = g_object_new(priv->device_gtype, "fw-class", guid, NULL);
fu_device_set_version_format(FU_DEVICE(device), FWUPD_VERSION_FORMAT_NUMBER);
return device;
}
static void
fu_uefi_backend_init(FuUefiBackend *self)
{
FuUefiBackendPrivate *priv = GET_PRIVATE(self);
priv->device_gtype = FU_TYPE_UEFI_NVRAM_DEVICE;
}
static void
fu_uefi_backend_class_init(FuUefiBackendClass *klass)
{
}