blob: ed6cfe6f89589afd9f9f92e30db866e51e6f5019 [file] [log] [blame]
/*
* Copyright 2022 Mario Limonciello <mario.limonciello@amd.com>
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#define G_LOG_DOMAIN "FuMain"
#include "config.h"
#include <glib/gi18n.h>
#include "fu-bios-settings-private.h"
#include "fu-util-bios-setting.h"
#include "fu-util-common.h"
static void
fu_util_bios_setting_update_description(FwupdBiosSetting *setting)
{
const gchar *new = NULL;
/* try to look it up from translations */
new = gettext(fwupd_bios_setting_get_description(setting));
if (new != NULL)
fwupd_bios_setting_set_description(setting, new);
}
static const gchar *
fu_util_bios_setting_kind_to_string(FwupdBiosSettingKind kind)
{
if (kind == FWUPD_BIOS_SETTING_KIND_ENUMERATION) {
/* TRANSLATORS: The BIOS setting can only be changed to fixed values */
return _("Enumeration");
}
if (kind == FWUPD_BIOS_SETTING_KIND_INTEGER) {
/* TRANSLATORS: The BIOS setting only accepts integers in a fixed range */
return _("Integer");
}
if (kind == FWUPD_BIOS_SETTING_KIND_STRING) {
/* TRANSLATORS: The BIOS setting accepts strings */
return _("String");
}
return NULL;
}
gboolean
fu_util_bios_setting_matches_args(FwupdBiosSetting *setting, gchar **values)
{
const gchar *name;
/* no arguments set */
if (g_strv_length(values) == 0)
return TRUE;
name = fwupd_bios_setting_get_name(setting);
/* check all arguments */
for (guint j = 0; j < g_strv_length(values); j++) {
if (g_strcmp0(name, values[j]) == 0)
return TRUE;
}
return FALSE;
}
gboolean
fu_util_bios_setting_console_print(FuConsole *console,
gchar **values,
GPtrArray *settings,
GError **error)
{
g_autoptr(JsonBuilder) builder = json_builder_new();
json_builder_begin_object(builder);
json_builder_set_member_name(builder, "BiosSettings");
json_builder_begin_array(builder);
for (guint i = 0; i < settings->len; i++) {
FwupdBiosSetting *setting = g_ptr_array_index(settings, i);
if (fu_util_bios_setting_matches_args(setting, values)) {
fu_util_bios_setting_update_description(setting);
json_builder_begin_object(builder);
fwupd_codec_to_json(FWUPD_CODEC(setting), builder, FWUPD_CODEC_FLAG_NONE);
json_builder_end_object(builder);
}
}
json_builder_end_array(builder);
json_builder_end_object(builder);
return fu_util_print_builder(console, builder, error);
}
gchar *
fu_util_bios_setting_to_string(FwupdBiosSetting *setting, guint idt)
{
const gchar *tmp;
FwupdBiosSettingKind type;
g_autofree gchar *debug_str = NULL;
g_autofree gchar *current_value = NULL;
g_autoptr(GString) str = g_string_new(NULL);
debug_str = fwupd_codec_to_string(FWUPD_CODEC(setting));
g_debug("%s", debug_str);
tmp = fwupd_bios_setting_get_name(setting);
fwupd_codec_string_append(str, idt, tmp, "");
type = fwupd_bios_setting_get_kind(setting);
fwupd_codec_string_append(str,
idt + 1,
/* TRANSLATORS: type of BIOS setting */
_("Setting type"),
fu_util_bios_setting_kind_to_string(type));
tmp = fwupd_bios_setting_get_current_value(setting);
if (tmp != NULL) {
current_value = g_strdup(tmp);
} else {
/* TRANSLATORS: tell a user how to get information */
current_value = g_strdup_printf(_("Run without '%s' to see"), "--no-authenticate");
}
/* TRANSLATORS: current value of a BIOS setting */
fwupd_codec_string_append(str, idt + 1, _("Current Value"), current_value);
fu_util_bios_setting_update_description(setting);
fwupd_codec_string_append(str,
idt + 1,
/* TRANSLATORS: description of BIOS setting */
_("Description"),
fwupd_bios_setting_get_description(setting));
if (fwupd_bios_setting_get_read_only(setting)) {
/* TRANSLATORS: item is TRUE */
tmp = _("True");
} else {
/* TRANSLATORS: item is FALSE */
tmp = _("False");
}
/* TRANSLATORS: BIOS setting is read only */
fwupd_codec_string_append(str, idt + 1, _("Read Only"), tmp);
if (type == FWUPD_BIOS_SETTING_KIND_INTEGER || type == FWUPD_BIOS_SETTING_KIND_STRING) {
g_autofree gchar *lower =
g_strdup_printf("%" G_GUINT64_FORMAT,
fwupd_bios_setting_get_lower_bound(setting));
g_autofree gchar *upper =
g_strdup_printf("%" G_GUINT64_FORMAT,
fwupd_bios_setting_get_upper_bound(setting));
if (type == FWUPD_BIOS_SETTING_KIND_INTEGER) {
g_autofree gchar *scalar =
g_strdup_printf("%" G_GUINT64_FORMAT,
fwupd_bios_setting_get_scalar_increment(setting));
/* TRANSLATORS: Lowest valid integer for BIOS setting */
fwupd_codec_string_append(str, idt + 1, _("Minimum value"), lower);
/* TRANSLATORS: Highest valid integer for BIOS setting */
fwupd_codec_string_append(str, idt + 1, _("Maximum value"), upper);
fwupd_codec_string_append(
str,
idt + 1,
/* TRANSLATORS: Scalar increment for integer BIOS setting */
_("Scalar Increment"),
scalar);
} else {
/* TRANSLATORS: Shortest valid string for BIOS setting */
fwupd_codec_string_append(str, idt + 1, _("Minimum length"), lower);
/* TRANSLATORS: Longest valid string for BIOS setting */
fwupd_codec_string_append(str, idt + 1, _("Maximum length"), upper);
}
} else if (type == FWUPD_BIOS_SETTING_KIND_ENUMERATION) {
GPtrArray *values = fwupd_bios_setting_get_possible_values(setting);
if (values != NULL && values->len > 0) {
/* TRANSLATORS: Possible values for a bios setting */
fwupd_codec_string_append(str, idt + 1, _("Possible Values"), NULL);
for (guint i = 0; i < values->len; i++) {
const gchar *possible = g_ptr_array_index(values, i);
g_autofree gchar *index = g_strdup_printf("%u", i);
fwupd_codec_string_append(str, idt + 2, index, possible);
}
}
}
return g_string_free(g_steal_pointer(&str), FALSE);
}
GHashTable *
fu_util_bios_settings_parse_argv(gchar **input, GError **error)
{
GHashTable *bios_settings;
/* json input */
if (g_strv_length(input) == 1) {
g_autofree gchar *data = NULL;
g_autoptr(FuBiosSettings) new_bios_settings = fu_bios_settings_new();
if (!g_file_get_contents(input[0], &data, NULL, error))
return NULL;
if (!fwupd_codec_from_json_string(FWUPD_CODEC(new_bios_settings), data, error))
return NULL;
return fu_bios_settings_to_hash_kv(new_bios_settings);
}
if (g_strv_length(input) == 0 || g_strv_length(input) % 2) {
g_set_error_literal(error,
FWUPD_ERROR,
FWUPD_ERROR_INVALID_ARGS,
/* TRANSLATORS: error message */
_("Invalid arguments"));
return NULL;
}
bios_settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
for (guint i = 0; i < g_strv_length(input); i += 2)
g_hash_table_insert(bios_settings, g_strdup(input[i]), g_strdup(input[i + 1]));
return bios_settings;
}