fwupd/libfwupdplugin/fu-plugin.h
Richard Hughes 2b0f92506b Refactor the hwids functionality
This refactors the code as it was getting very confusing; before FuSmbios was
reading both SMBIOS and the kernel-provided DT -- and various things were
injecting overrides in three different place. To properly support FDT remove
one layer of indirection.

This also lets us use the compatible strings to enable plugins specifying the
flag _REQUIRE_HWID -- which means we only load the plugin if it's got a chance
of working. e.g.

    [aspeed,ast2500]
2023-01-18 07:04:44 +00:00

454 lines
12 KiB
C

/*
* Copyright (C) 2015 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#pragma once
#include <gio/gio.h>
#ifdef HAVE_GUSB
#include <gusb.h>
#endif
#include "fu-bluez-device.h"
#include "fu-common-guid.h"
#include "fu-common.h"
#include "fu-context.h"
#include "fu-device-locker.h"
#include "fu-device.h"
#include "fu-plugin.h"
#include "fu-quirks.h"
#include "fu-security-attrs.h"
#include "fu-usb-device.h"
#include "fu-version-common.h"
//#include "fu-hid-device.h"
#ifdef HAVE_GUDEV
#include "fu-udev-device.h"
#endif
#include <libfwupd/fwupd-common.h>
#include <libfwupd/fwupd-plugin.h>
/* only until HSI is declared stable */
#include "fwupd-security-attr-private.h"
#define FU_TYPE_PLUGIN (fu_plugin_get_type())
G_DECLARE_DERIVABLE_TYPE(FuPlugin, fu_plugin, FU, PLUGIN, FwupdPlugin)
#define fu_plugin_get_flags(p) fwupd_plugin_get_flags(FWUPD_PLUGIN(p))
#define fu_plugin_has_flag(p, f) fwupd_plugin_has_flag(FWUPD_PLUGIN(p), f)
#define fu_plugin_add_flag(p, f) fwupd_plugin_add_flag(FWUPD_PLUGIN(p), f)
#define fu_plugin_remove_flag(p, f) fwupd_plugin_remove_flag(FWUPD_PLUGIN(p), f)
/**
* FuPluginVerifyFlags:
* @FU_PLUGIN_VERIFY_FLAG_NONE: No flags set
*
* Flags used when verifying, currently unused.
**/
typedef enum {
FU_PLUGIN_VERIFY_FLAG_NONE = 0,
/*< private >*/
FU_PLUGIN_VERIFY_FLAG_LAST
} FuPluginVerifyFlags;
struct _FuPluginClass {
FwupdPluginClass parent_class;
/* signals */
void (*_device_added)(FuPlugin *self, FuDevice *device);
void (*_device_removed)(FuPlugin *self, FuDevice *device);
void (*_status_changed)(FuPlugin *self, FwupdStatus status);
void (*_percentage_changed)(FuPlugin *self, guint percentage);
void (*_device_register)(FuPlugin *self, FuDevice *device);
gboolean (*_check_supported)(FuPlugin *self, const gchar *guid);
void (*_rules_changed)(FuPlugin *self);
void (*_config_changed)(FuPlugin *self);
/* vfuncs */
/**
* init:
* @self: A #FuPlugin
*
* Initializes the modular plugin.
* Sets up any static data structures for the plugin.
*
* Since: 1.7.2
**/
void (*constructed)(GObject *obj);
/**
* finalize:
* @self: a plugin
*
* Destroys the modular plugin.
* Any allocated memory should be freed here.
*
* Since: 1.7.2
**/
void (*finalize)(GObject *obj);
/**
* startup:
* @self: a #FuPlugin
* @progress: a #FuProgress
* @error: (nullable): optional return location for an error
*
* Tries to start the plugin.
* Returns: TRUE for success or FALSE for failure.
*
* Any plugins not intended for the system or that have failure communicating
* with the device should return FALSE.
* Any allocated memory should be freed here.
*
* Since: 1.7.2
**/
gboolean (*startup)(FuPlugin *self, FuProgress *progress, GError **error);
/**
* coldplug:
* @self: a #FuPlugin
* @progress: a #FuProgress
* @error: (nullable): optional return location for an error
*
* Probes for devices.
*
* Since: 1.7.2
**/
gboolean (*coldplug)(FuPlugin *self, FuProgress *progress, GError **error);
/**
* device_created
* @self: a #FuPlugin
* @dev: a device
* @error: (nullable): optional return location for an error
*
* Function run when the subclassed device has been created.
*
* Since: 1.7.2
**/
gboolean (*device_created)(FuPlugin *self, FuDevice *device, GError **error);
/**
* device_registered
* @self: a #FuPlugin
* @dev: a device
*
* Function run when device registered from another plugin.
*
* Since: 1.7.2
**/
void (*device_registered)(FuPlugin *self, FuDevice *device);
/**
* device_added
* @self: a #FuPlugin
* @dev: a device
*
* Function run when the subclassed device has been added.
*
* Since: 1.7.2
**/
void (*device_added)(FuPlugin *self, FuDevice *device);
/**
* verify:
* @self: a #FuPlugin
* @dev: a device
* @progress: a #FuProgress
* @flags: verify flags
* @error: (nullable): optional return location for an error
*
* Verifies the firmware on the device matches the value stored in the database
*
* Since: 1.7.2
**/
gboolean (*verify)(FuPlugin *self,
FuDevice *device,
FuProgress *progress,
FuPluginVerifyFlags flags,
GError **error);
/**
* get_results:
* @self: a #FuPlugin
* @dev: a device
* @error: (nullable): optional return location for an error
*
* Obtains historical update results for the device.
*
* Since: 1.7.2
**/
gboolean (*get_results)(FuPlugin *self, FuDevice *device, GError **error);
/**
* clear_results:
* @self: a #FuPlugin
* @dev: a device
* @error: (nullable): optional return location for an error
*
* Clears stored update results for the device.
*
* Since: 1.7.2
**/
gboolean (*clear_results)(FuPlugin *self, FuDevice *device, GError **error);
/**
* backend_device_added
* @self: a #FuPlugin
* @device: a device
* @error: (nullable): optional return location for an error
*
* Function to run after a device is added by a backend, e.g. by USB or Udev.
*
* Since: 1.7.2
**/
gboolean (*backend_device_added)(FuPlugin *self, FuDevice *device, GError **error);
/**
* backend_device_changed
* @self: a #FuPlugin
* @device: a device
* @error: (nullable): optional return location for an error
*
* Function run when the device changed.
*
* Since: 1.7.2
**/
gboolean (*backend_device_changed)(FuPlugin *self, FuDevice *device, GError **error);
/**
* backend_device_removed
* @self: a #FuPlugin
* @device: a device
* @error: (nullable): optional return location for an error
*
* Function to run when device is physically removed.
*
* Since: 1.7.2
**/
gboolean (*backend_device_removed)(FuPlugin *self, FuDevice *device, GError **error);
/**
* add_security_attrs
* @self: a #FuPlugin
* @attrs: a security attribute
*
* Function that asks plugins to add Host Security Attributes.
*
* Since: 1.7.2
**/
void (*add_security_attrs)(FuPlugin *self, FuSecurityAttrs *attrs);
/**
* write_firmware:
* @self: a #FuPlugin
* @dev: a device
* @blob_fw: a data blob
* @progress: a #FuProgress
* @flags: install flags
* @error: (nullable): optional return location for an error
*
* Updates the firmware on the device with blob_fw
*
* Since: 1.7.2
**/
gboolean (*write_firmware)(FuPlugin *self,
FuDevice *device,
GBytes *blob_fw,
FuProgress *progress,
FwupdInstallFlags flags,
GError **error);
/**
* unlock:
* @self: a #FuPlugin
* @dev: a device
* @error: (nullable): optional return location for an error
*
* Unlocks the device for writes.
*
* Since: 1.7.2
**/
gboolean (*unlock)(FuPlugin *self, FuDevice *device, GError **error);
/**
* activate:
* @self: a #FuPlugin
* @dev: a device
* @error: (nullable): optional return location for an error
*
* Activates the new firmware on the device.
*
* This is intended for devices that it is not safe to immediately activate
* the firmware. It may be called at a more convenient time instead.
*
* Since: 1.7.2
**/
gboolean (*activate)(FuPlugin *self,
FuDevice *device,
FuProgress *progress,
GError **error);
/**
* attach:
* @self: a #FuPlugin
* @dev: a device
* @error: (nullable): optional return location for an error
*
* Swaps the device from bootloader mode to runtime mode.
*
* Since: 1.7.2
**/
gboolean (*attach)(FuPlugin *self, FuDevice *device, FuProgress *progress, GError **error);
/**
* detach:
* @self: a #FuPlugin
* @dev: a device
* @error: (nullable): optional return location for an error
*
* Swaps the device from runtime mode to bootloader mode.
*
* Since: 1.7.2
**/
gboolean (*detach)(FuPlugin *self, FuDevice *device, FuProgress *progress, GError **error);
/**
* prepare:
* @self: a #FuPlugin
* @device: a device
* @progress: a #FuProgress
* @flags: install flags
* @error: (nullable): optional return location for an error
*
* Prepares the device to receive an update.
*
* Since: 1.7.2
**/
gboolean (*prepare)(FuPlugin *self,
FuDevice *device,
FuProgress *progress,
FwupdInstallFlags flags,
GError **error);
/**
* cleanup
* @self: a #FuPlugin
* @device: a device
* @progress: a #FuProgress
* @flags: install flags
* @error: (nullable): optional return location for an error
*
* Cleans up the device after receiving an update.
*
* Since: 1.7.2
**/
gboolean (*cleanup)(FuPlugin *self,
FuDevice *device,
FuProgress *progress,
FwupdInstallFlags flags,
GError **error);
/**
* composite_prepare
* @self: a #FuPlugin
* @devices: (element-type FuDevice): array of devices
* @error: (nullable): optional return location for an error
*
* Function run before updating group of composite devices.
*
* Since: 1.7.2
**/
gboolean (*composite_prepare)(FuPlugin *self, GPtrArray *devices, GError **error);
/**
* composite_cleanup
* @self: a #FuPlugin
* @devices: (element-type FuDevice): array of devices
* @error: (nullable): optional return location for an error
*
* Function run after updating group of composite devices.
*
* Since: 1.7.2
**/
gboolean (*composite_cleanup)(FuPlugin *self, GPtrArray *devices, GError **error);
/**
* load
* @ctx: a #FuContext
*
* Function to register context attributes, run during early startup even on plugins which
* will be later disabled.
*
* Since: 1.8.1
**/
void (*load)(FuContext *ctx);
/**
* to_string:
* @self: A #FuPlugin
*
* Prints plugin private data to the console.
*
* Since: 1.8.4
**/
void (*to_string)(FuPlugin *self, guint idt, GString *str);
};
/**
* FuPluginVfuncs:
*
* A subset of virtual functions that are implemented by modular plugins.
**/
typedef struct _FuPluginClass FuPluginVfuncs;
/**
* FuPluginRule:
* @FU_PLUGIN_RULE_CONFLICTS: The plugin conflicts with another
* @FU_PLUGIN_RULE_RUN_AFTER: Order the plugin after another
* @FU_PLUGIN_RULE_RUN_BEFORE: Order the plugin before another
* @FU_PLUGIN_RULE_BETTER_THAN: Is better than another plugin
* @FU_PLUGIN_RULE_INHIBITS_IDLE: The plugin inhibits the idle shutdown
* @FU_PLUGIN_RULE_METADATA_SOURCE: Uses another plugin as a source of report metadata
*
* The rules used for ordering plugins.
* Plugins are expected to add rules in fu_plugin_initialize().
**/
typedef enum {
FU_PLUGIN_RULE_CONFLICTS,
FU_PLUGIN_RULE_RUN_AFTER,
FU_PLUGIN_RULE_RUN_BEFORE,
FU_PLUGIN_RULE_BETTER_THAN,
FU_PLUGIN_RULE_INHIBITS_IDLE,
FU_PLUGIN_RULE_METADATA_SOURCE, /* Since: 1.3.6 */
/*< private >*/
FU_PLUGIN_RULE_LAST
} FuPluginRule;
/**
* FuPluginData:
*
* The plugin-allocated private data.
**/
typedef struct FuPluginData FuPluginData;
/* for plugins to use */
const gchar *
fu_plugin_get_name(FuPlugin *self);
void
fu_plugin_set_name(FuPlugin *self, const gchar *name);
FuPluginData *
fu_plugin_get_data(FuPlugin *self);
FuPluginData *
fu_plugin_alloc_data(FuPlugin *self, gsize data_sz);
FuContext *
fu_plugin_get_context(FuPlugin *self);
void
fu_plugin_device_add(FuPlugin *self, FuDevice *device);
void
fu_plugin_device_remove(FuPlugin *self, FuDevice *device);
void
fu_plugin_device_register(FuPlugin *self, FuDevice *device);
void
fu_plugin_add_device_gtype(FuPlugin *self, GType device_gtype);
void
fu_plugin_add_firmware_gtype(FuPlugin *self, const gchar *id, GType gtype);
void
fu_plugin_add_udev_subsystem(FuPlugin *self, const gchar *subsystem);
gpointer
fu_plugin_cache_lookup(FuPlugin *self, const gchar *id);
void
fu_plugin_cache_remove(FuPlugin *self, const gchar *id);
void
fu_plugin_cache_add(FuPlugin *self, const gchar *id, gpointer dev);
GPtrArray *
fu_plugin_get_devices(FuPlugin *self);
void
fu_plugin_add_rule(FuPlugin *self, FuPluginRule rule, const gchar *name);
void
fu_plugin_add_report_metadata(FuPlugin *self, const gchar *key, const gchar *value);
gchar *
fu_plugin_get_config_value(FuPlugin *self, const gchar *key);
gboolean
fu_plugin_get_config_value_boolean(FuPlugin *self, const gchar *key);
gboolean
fu_plugin_set_config_value(FuPlugin *self, const gchar *key, const gchar *value, GError **error);
FwupdSecurityAttr *
fu_plugin_security_attr_new(FuPlugin *self, const gchar *appstream_id);