File: fu-logitech-tap-plugin.c

package info (click to toggle)
fwupd 2.0.20-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 32,504 kB
  • sloc: ansic: 277,388; python: 11,485; xml: 9,493; sh: 1,625; makefile: 167; cpp: 19; asm: 11; javascript: 9
file content (110 lines) | stat: -rw-r--r-- 3,515 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 * Copyright 1999-2023 Logitech, Inc.
 *
 * SPDX-License-Identifier: LGPL-2.1-or-later
 */

#include "config.h"

#include "fu-logitech-tap-hdmi-device.h"
#include "fu-logitech-tap-plugin.h"
#include "fu-logitech-tap-sensor-device.h"
#include "fu-logitech-tap-touch-device.h"

struct _FuLogitechTapPlugin {
	FuPlugin parent_instance;
	FuDevice *hdmi_device;	 /* ref */
	FuDevice *sensor_device; /* ref */
	FuDevice *touch_device;	 /* ref */
};

G_DEFINE_TYPE(FuLogitechTapPlugin, fu_logitech_tap_plugin, FU_TYPE_PLUGIN)

static gboolean
fu_logitech_tap_plugin_composite_cleanup(FuPlugin *plugin, GPtrArray *devices, GError **error)
{
	FuLogitechTapPlugin *self = FU_LOGITECH_TAP_PLUGIN(plugin);

	/* check if HDMI firmware successfully upgraded and signal for SENSOR to trigger composite
	 * reboot is set */
	for (guint i = 0; i < devices->len; i++) {
		FuDevice *dev = g_ptr_array_index(devices, i);

		if ((g_strcmp0(fu_device_get_plugin(dev), "logitech_tap") == 0) &&
		    (FU_IS_LOGITECH_TAP_HDMI_DEVICE(dev)) &&
		    (fu_device_has_private_flag(
			dev,
			FU_LOGITECH_TAP_HDMI_DEVICE_FLAG_SENSOR_NEEDS_REBOOT)) &&
		    self->hdmi_device != NULL) {
			FuLogitechTapSensorDevice *proxy;
			g_debug("device needs reboot");
			proxy = FU_LOGITECH_TAP_SENSOR_DEVICE(fu_device_get_proxy(dev, error));
			if (proxy == NULL)
				return FALSE;
			if (!fu_logitech_tap_sensor_device_reboot_device(proxy, error))
				return FALSE;
			fu_device_add_flag(dev, FWUPD_DEVICE_FLAG_WAIT_FOR_REPLUG);
			break;
		}
	}
	return TRUE;
}

static void
fu_logitech_tap_plugin_init(FuLogitechTapPlugin *self)
{
}

static void
fu_logitech_tap_plugin_constructed(GObject *obj)
{
	FuPlugin *plugin = FU_PLUGIN(obj);
	fu_plugin_add_udev_subsystem(plugin, "video4linux");
	fu_plugin_add_udev_subsystem(plugin, "hidraw");
	fu_plugin_add_device_gtype(plugin, FU_TYPE_LOGITECH_TAP_HDMI_DEVICE);
	fu_plugin_add_device_gtype(plugin, FU_TYPE_LOGITECH_TAP_SENSOR_DEVICE);
	fu_plugin_add_device_gtype(plugin, FU_TYPE_LOGITECH_TAP_TOUCH_DEVICE);
}

static void
fu_logitech_tap_plugin_device_registered(FuPlugin *plugin, FuDevice *device)
{
	FuLogitechTapPlugin *self = FU_LOGITECH_TAP_PLUGIN(plugin);
	if (g_strcmp0(fu_device_get_plugin(device), "logitech_tap") != 0)
		return;
	if (FU_IS_LOGITECH_TAP_HDMI_DEVICE(device)) {
		g_set_object(&self->hdmi_device, device);
		if (self->sensor_device != NULL)
			fu_device_set_proxy(self->hdmi_device, self->sensor_device);
	}
	if (FU_IS_LOGITECH_TAP_SENSOR_DEVICE(device)) {
		g_set_object(&self->sensor_device, device);
		if (self->hdmi_device != NULL)
			fu_device_set_proxy(self->hdmi_device, self->sensor_device);
	}
}

static void
fu_logitech_tap_plugin_finalize(GObject *obj)
{
	FuLogitechTapPlugin *self = FU_LOGITECH_TAP_PLUGIN(obj);
	if (self->hdmi_device != NULL)
		g_object_unref(self->hdmi_device);
	if (self->sensor_device != NULL)
		g_object_unref(self->sensor_device);
	if (self->touch_device != NULL)
		g_object_unref(self->touch_device);
	G_OBJECT_CLASS(fu_logitech_tap_plugin_parent_class)->finalize(obj);
}

static void
fu_logitech_tap_plugin_class_init(FuLogitechTapPluginClass *klass)
{
	FuPluginClass *plugin_class = FU_PLUGIN_CLASS(klass);
	GObjectClass *object_class = G_OBJECT_CLASS(klass);

	object_class->finalize = fu_logitech_tap_plugin_finalize;
	plugin_class->constructed = fu_logitech_tap_plugin_constructed;
	plugin_class->device_registered = fu_logitech_tap_plugin_device_registered;
	plugin_class->composite_cleanup = fu_logitech_tap_plugin_composite_cleanup;
}