[Libosinfo] [libosinfo PATCH 1/7] firmware: Add OsinfoFirmware

Fabiano Fidêncio fidencio at redhat.com
Tue May 7 13:16:47 UTC 2019


OsinfoFirmware has been created in order to represent the firmware types
supported by an OS.

The schema representation of this object is:
<firmware arch="arch name" type="bios|efi"/>

Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
 docs/reference/Libosinfo-docs.xml |   1 +
 osinfo/Makefile.am                |   2 +
 osinfo/libosinfo.syms             |   4 +
 osinfo/osinfo.h                   |   1 +
 osinfo/osinfo_firmware.c          | 202 ++++++++++++++++++++++++++++++
 osinfo/osinfo_firmware.h          |  73 +++++++++++
 po/POTFILES.in                    |   1 +
 7 files changed, 284 insertions(+)
 create mode 100644 osinfo/osinfo_firmware.c
 create mode 100644 osinfo/osinfo_firmware.h

diff --git a/docs/reference/Libosinfo-docs.xml b/docs/reference/Libosinfo-docs.xml
index c21efc5..df8dd36 100644
--- a/docs/reference/Libosinfo-docs.xml
+++ b/docs/reference/Libosinfo-docs.xml
@@ -31,6 +31,7 @@
     <xi:include href="xml/osinfo_entity.xml"/>
     <xi:include href="xml/osinfo_enum_types.xml"/>
     <xi:include href="xml/osinfo_filter.xml"/>
+    <xi:include href="xml/osinfo_firmware.xml"/>
     <xi:include href="xml/osinfo_image.xml"/>
     <xi:include href="xml/osinfo_imagelist.xml"/>
     <xi:include href="xml/osinfo_install_config.xml"/>
diff --git a/osinfo/Makefile.am b/osinfo/Makefile.am
index cb1df8f..c722757 100644
--- a/osinfo/Makefile.am
+++ b/osinfo/Makefile.am
@@ -81,6 +81,7 @@ libosinfo_impl_include_HEADERS =		\
   osinfo_device_driverlist.h		\
   osinfo_entity.h			\
   osinfo_filter.h			\
+  osinfo_firmware.h			\
   osinfo_install_config.h		\
   osinfo_install_config_param.h		\
   osinfo_install_config_paramlist.h	\
@@ -119,6 +120,7 @@ libosinfo_c_files =		\
   osinfo_datamaplist.c			\
   osinfo_entity.c			\
   osinfo_filter.c			\
+  osinfo_firmware.c			\
   osinfo_list.c				\
   osinfo_device.c			\
   osinfo_devicelink.c			\
diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index 853acf5..cacaf71 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -570,6 +570,10 @@ LIBOSINFO_1.4.0 {
 
 LIBOSINFO_1.5.0 {
     global:
+	osinfo_firmware_get_architecture;
+	osinfo_firmware_get_firmware_type;
+	osinfo_firmware_get_type;
+
 	osinfo_image_get_os;
 	osinfo_image_get_os_variants;
 	osinfo_image_set_os;
diff --git a/osinfo/osinfo.h b/osinfo/osinfo.h
index 20a8f3a..2063c73 100644
--- a/osinfo/osinfo.h
+++ b/osinfo/osinfo.h
@@ -40,6 +40,7 @@
 #include <osinfo/osinfo_devicelist.h>
 #include <osinfo/osinfo_devicelinklist.h>
 #include <osinfo/osinfo_devicelinkfilter.h>
+#include <osinfo/osinfo_firmware.h>
 #include <osinfo/osinfo_install_config.h>
 #include <osinfo/osinfo_install_config_param.h>
 #include <osinfo/osinfo_install_config_paramlist.h>
diff --git a/osinfo/osinfo_firmware.c b/osinfo/osinfo_firmware.c
new file mode 100644
index 0000000..c0476c4
--- /dev/null
+++ b/osinfo/osinfo_firmware.c
@@ -0,0 +1,202 @@
+/*
+ * libosinfo: A firmware representation for a (guest) OS
+ *
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <osinfo/osinfo.h>
+#include <gio/gio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib/gi18n-lib.h>
+
+G_DEFINE_TYPE(OsinfoFirmware, osinfo_firmware, OSINFO_TYPE_ENTITY);
+
+#define OSINFO_FIRMWARE_GET_PRIVATE(obj)                    \
+    (G_TYPE_INSTANCE_GET_PRIVATE((obj),                \
+                                  OSINFO_TYPE_FIRMWARE,     \
+                                  OsinfoFirmwarePrivate))
+
+/**
+ * SECTION:osinfo_firmware
+ * @short_description: A firmware representation for a (guest) OS
+ * @see_also: #OsinfoOs
+ *
+ * #OsinfoFirmware is an entity representing a firmware used to boot
+ * a (guest) operating system.
+ */
+
+struct _OsinfoFirmwarePrivate
+{
+    gboolean unused;
+};
+
+enum {
+    PROP_0,
+
+    PROP_ARCHITECTURE,
+    PROP_FIRMWARE_TYPE,
+};
+
+static void
+osinfo_firmware_get_property(GObject *object,
+                             guint property_id,
+                             GValue *value,
+                             GParamSpec *pspec)
+{
+    OsinfoFirmware *firmware = OSINFO_FIRMWARE(object);
+
+    switch (property_id) {
+    case PROP_ARCHITECTURE:
+        g_value_set_string(value, osinfo_firmware_get_architecture(firmware));
+        break;
+
+    case PROP_FIRMWARE_TYPE:
+        g_value_set_string(value, osinfo_firmware_get_firmware_type(firmware));
+        break;
+
+    default:
+        /* We don't have any other property... */
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+osinfo_firmware_set_property(GObject      *object,
+                             guint         property_id,
+                             const GValue *value,
+                             GParamSpec   *pspec)
+{
+    OsinfoFirmware *firmware = OSINFO_FIRMWARE(object);
+
+    switch (property_id) {
+    case PROP_ARCHITECTURE:
+        osinfo_entity_set_param(OSINFO_ENTITY(firmware),
+                                OSINFO_FIRMWARE_PROP_ARCHITECTURE,
+                                g_value_get_string(value));
+        break;
+
+    case PROP_FIRMWARE_TYPE:
+        osinfo_entity_set_param(OSINFO_ENTITY(firmware),
+                                OSINFO_FIRMWARE_PROP_TYPE,
+                                g_value_get_string(value));
+        break;
+
+    default:
+        /* We don't have any other property... */
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+osinfo_firmware_finalize(GObject *object)
+{
+    /* Chain up to the parent class */
+    G_OBJECT_CLASS(osinfo_firmware_parent_class)->finalize(object);
+}
+
+/* Init functions */
+static void
+osinfo_firmware_class_init(OsinfoFirmwareClass *klass)
+{
+    GObjectClass *g_klass = G_OBJECT_CLASS(klass);
+    GParamSpec *pspec;
+
+    g_klass->finalize = osinfo_firmware_finalize;
+    g_klass->get_property = osinfo_firmware_get_property;
+    g_klass->set_property = osinfo_firmware_set_property;
+    g_type_class_add_private(klass, sizeof(OsinfoFirmwarePrivate));
+
+    /**
+     * OsinfoFirmware:architecture:
+     *
+     * The target hardware architecture of this firmware.
+     */
+    pspec = g_param_spec_string("architecture",
+                                "ARCHITECTURE",
+                                _("CPU Architecture"),
+                                NULL /* default value */,
+                                G_PARAM_READWRITE |
+                                G_PARAM_STATIC_STRINGS);
+    g_object_class_install_property(g_klass, PROP_ARCHITECTURE, pspec);
+
+    /**
+     * OsinfoFirmware:firmware-type:
+     *
+     * The firmware type.
+     */
+    pspec = g_param_spec_string("type",
+                                "TYPE",
+                                _("The firmware type"),
+                                NULL /* default value */,
+                                G_PARAM_READWRITE |
+                                G_PARAM_STATIC_STRINGS);
+    g_object_class_install_property(g_klass, PROP_FIRMWARE_TYPE, pspec);
+}
+
+static void
+osinfo_firmware_init(OsinfoFirmware *firmware)
+{
+    firmware->priv = OSINFO_FIRMWARE_GET_PRIVATE(firmware);
+}
+
+OsinfoFirmware *osinfo_firmware_new(const gchar *id,
+                                    const gchar *architecture,
+                                    const gchar *type)
+{
+    OsinfoFirmware *firmware;
+
+    firmware = g_object_new(OSINFO_TYPE_FIRMWARE,
+                            "id", id,
+                            OSINFO_FIRMWARE_PROP_ARCHITECTURE, architecture,
+                            OSINFO_FIRMWARE_PROP_TYPE, type,
+                            NULL);
+
+    return firmware;
+}
+
+/**
+ * osinfo_firmware_get_architecture:
+ * @firmware: an #OsinfoFirmware instance
+ *
+ * Retrieves the target hardware architecture of the OS @firmware provides.
+ *
+ * Returns: (transfer none): the hardware architecture, or NULL
+ */
+const gchar *osinfo_firmware_get_architecture(OsinfoFirmware *firmware)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(firmware),
+                                         OSINFO_FIRMWARE_PROP_ARCHITECTURE);
+}
+
+/**
+ * osinfo_firmware_get_format:
+ * @firmware: an #OsinfoFirmware instance
+ *
+ * The format of the @firmware
+ *
+ * Returns: (transfer none): the format, or NULL
+ */
+const gchar *osinfo_firmware_get_firmware_type(OsinfoFirmware *firmware)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(firmware),
+                                         OSINFO_FIRMWARE_PROP_TYPE);
+}
diff --git a/osinfo/osinfo_firmware.h b/osinfo/osinfo_firmware.h
new file mode 100644
index 0000000..c085e22
--- /dev/null
+++ b/osinfo/osinfo_firmware.h
@@ -0,0 +1,73 @@
+/*
+ * libosinfo: A firmware representation for a (guest) OS
+ *
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <osinfo/osinfo_entity.h>
+
+#ifndef __OSINFO_FIRMWARE_H__
+#define __OSINFO_FIRMWARE_H__
+
+/*
+ * Type macros.
+ */
+#define OSINFO_TYPE_FIRMWARE                  (osinfo_firmware_get_type ())
+#define OSINFO_FIRMWARE(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), OSINFO_TYPE_FIRMWARE, OsinfoFirmware))
+#define OSINFO_IS_FIRMWARE(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OSINFO_TYPE_FIRMWARE))
+#define OSINFO_FIRMWARE_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), OSINFO_TYPE_FIRMWARE, OsinfoFirmwareClass))
+#define OSINFO_IS_FIRMWARE_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), OSINFO_TYPE_FIRMWARE))
+#define OSINFO_FIRMWARE_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), OSINFO_TYPE_FIRMWARE, OsinfoFirmwareClass))
+
+#define OSINFO_FIRMWARE_PROP_ARCHITECTURE   "architecture"
+#define OSINFO_FIRMWARE_PROP_TYPE           "type"
+#define OSINFO_FIRMWARE_PROP_SUPPORTED      "supported"
+
+typedef struct _OsinfoFirmware          OsinfoFirmware;
+typedef struct _OsinfoFirmwareClass     OsinfoFirmwareClass;
+typedef struct _OsinfoFirmwarePrivate   OsinfoFirmwarePrivate;
+
+/* object */
+struct _OsinfoFirmware
+{
+    OsinfoEntity parent_instance;
+
+    /* public */
+
+    /* private */
+    OsinfoFirmwarePrivate *priv;
+};
+
+/* class */
+struct _OsinfoFirmwareClass
+{
+    /*< private >*/
+    OsinfoEntityClass parent_class;
+
+    /* class members */
+};
+
+GType osinfo_firmware_get_type(void);
+
+OsinfoFirmware *osinfo_firmware_new(const gchar *id, const gchar *architecture, const gchar *type);
+const gchar *osinfo_firmware_get_architecture(OsinfoFirmware *firmware);
+const gchar *osinfo_firmware_get_firmware_type(OsinfoFirmware *firmware);
+gboolean osinfo_firmware_is_supported(OsinfoFirmware *firmware);
+
+#endif /* __OSINFO_FIRMWARE_H__ */
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 2a714df..3d9660e 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -3,6 +3,7 @@ osinfo/osinfo_deployment.c
 osinfo/osinfo_devicelink.c
 osinfo/osinfo_devicelinkfilter.c
 osinfo/osinfo_entity.c
+osinfo/osinfo_firmware.c
 osinfo/osinfo_image.c
 osinfo/osinfo_install_config_param.c
 osinfo/osinfo_install_script.c
-- 
2.21.0




More information about the Libosinfo mailing list