Coverage Report

Created: 2026-09-03 07:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fwupd/libfwupd/fwupd-variant.c
Line
Count
Source
1
/*
2
 * Copyright 2017 Richard Hughes <richard@hughsie.com>
3
 *
4
 * SPDX-License-Identifier: LGPL-2.1-or-later
5
 */
6
7
#include "config.h"
8
9
#include "fwupd-variant.h"
10
11
/**
12
 * fwupd_variant_from_hash_kv: (skip):
13
 **/
14
GVariant *
15
fwupd_variant_from_hash_kv(GHashTable *hash)
16
0
{
17
0
  GVariantBuilder builder;
18
0
  g_autoptr(GList) keys = g_list_sort(g_hash_table_get_keys(hash), (GCompareFunc)g_strcmp0);
19
0
  g_variant_builder_init(&builder, G_VARIANT_TYPE("a{ss}"));
20
0
  for (GList *l = keys; l != NULL; l = l->next) {
21
0
    const gchar *key = l->data;
22
0
    const gchar *value = g_hash_table_lookup(hash, key);
23
0
    g_variant_builder_add(&builder, "{ss}", key, value);
24
0
  }
25
0
  return g_variant_builder_end(&builder);
26
0
}
27
28
/**
29
 * fwupd_variant_to_hash_kv: (skip):
30
 **/
31
GHashTable *
32
fwupd_variant_to_hash_kv(GVariant *dict)
33
0
{
34
0
  GVariantIter iter;
35
0
  const gchar *key;
36
0
  const gchar *value;
37
0
  g_autoptr(GHashTable) hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
38
39
0
  g_return_val_if_fail(dict != NULL, NULL);
40
41
  /* sanity check */
42
0
  if (!g_variant_is_of_type(dict, G_VARIANT_TYPE("a{ss}")))
43
0
    return NULL;
44
45
0
  g_variant_iter_init(&iter, dict);
46
0
  while (g_variant_iter_loop(&iter, "{&s&s}", &key, &value))
47
0
    g_hash_table_insert(hash, g_strdup(key), g_strdup(value));
48
0
  return g_steal_pointer(&hash);
49
0
}
50
51
/**
52
 * fwupd_variant_get_uint32:
53
 * @value: a #GVariant
54
 *
55
 * Gets an unsigned integer from a variant, handling both 'u' and 'i' types.
56
 *
57
 * Returns: integer, or 0 if not valid
58
 *
59
 * Since: 2.1.4
60
 **/
61
guint32
62
fwupd_variant_get_uint32(GVariant *value)
63
0
{
64
0
  g_return_val_if_fail(value != NULL, 0);
65
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_INT32))
66
0
    return (guint32)MAX(g_variant_get_int32(value), 0); /* nocheck:blocked */
67
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32))
68
0
    return g_variant_get_uint32(value);
69
0
  return 0;
70
0
}
71
72
/**
73
 * fwupd_variant_get_int32:
74
 * @value: a #GVariant
75
 *
76
 * Gets an signed integer from a variant.
77
 *
78
 * Returns: integer, or 0 if not valid
79
 *
80
 * Since: 2.1.4
81
 **/
82
gint32
83
fwupd_variant_get_int32(GVariant *value)
84
0
{
85
0
  g_return_val_if_fail(value != NULL, 0);
86
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_INT32))
87
0
    return g_variant_get_int32(value); /* nocheck:blocked */
88
0
  return 0;
89
0
}
90
91
/**
92
 * fwupd_variant_get_uint64:
93
 * @value: a #GVariant
94
 *
95
 * Gets an unsigned integer from a variant, handling both 't' and 'x' types.
96
 *
97
 * Returns: integer, or 0 if not valid
98
 *
99
 * Since: 2.1.4
100
 **/
101
guint64
102
fwupd_variant_get_uint64(GVariant *value)
103
0
{
104
0
  g_return_val_if_fail(value != NULL, 0);
105
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_INT64))
106
0
    return (guint64)MAX(g_variant_get_int64(value), 0); /* nocheck:blocked */
107
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_UINT64))
108
0
    return g_variant_get_uint64(value);
109
0
  return 0;
110
0
}
111
112
/**
113
 * fwupd_variant_get_string:
114
 * @value: a #GVariant
115
 *
116
 * Gets a string value from a variant.
117
 *
118
 * Returns: string, or %NULL if not valid
119
 *
120
 * Since: 2.1.4
121
 **/
122
const gchar *
123
fwupd_variant_get_string(GVariant *value)
124
0
{
125
0
  g_return_val_if_fail(value != NULL, NULL);
126
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING) ||
127
0
      g_variant_is_of_type(value, G_VARIANT_TYPE_OBJECT_PATH) ||
128
0
      g_variant_is_of_type(value, G_VARIANT_TYPE_SIGNATURE))
129
0
    return g_variant_get_string(value, NULL); /* nocheck:blocked */
130
0
  return NULL;
131
0
}
132
133
/**
134
 * fwupd_variant_get_boolean:
135
 * @value: a #GVariant
136
 *
137
 * Gets a boolean value from a variant.
138
 *
139
 * Returns: boolean, or %FALSE if not valid
140
 *
141
 * Since: 2.1.4
142
 **/
143
gboolean
144
fwupd_variant_get_boolean(GVariant *value)
145
0
{
146
0
  g_return_val_if_fail(value != NULL, FALSE);
147
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN))
148
0
    return g_variant_get_boolean(value); /* nocheck:blocked */
149
0
  return FALSE;
150
0
}
151
152
/**
153
 * fwupd_variant_get_strv:
154
 * @value: a #GVariant
155
 *
156
 * Gets an array of strings from a variant.
157
 *
158
 * Returns: (transfer container): An array of constant strings
159
 *
160
 * Since: 2.1.4
161
 **/
162
const gchar **
163
fwupd_variant_get_strv(GVariant *value)
164
0
{
165
0
  g_return_val_if_fail(value != NULL, NULL);
166
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING_ARRAY))
167
0
    return g_variant_get_strv(value, NULL); /* nocheck:blocked */
168
0
  return NULL;
169
0
}
170
171
/**
172
 * fwupd_variant_get_double:
173
 * @value: a #GVariant
174
 *
175
 * Gets a double from a variant.
176
 *
177
 * Returns: double, or -1.0 if not valid
178
 *
179
 * Since: 2.1.4
180
 **/
181
gdouble
182
fwupd_variant_get_double(GVariant *value)
183
0
{
184
0
  g_return_val_if_fail(value != NULL, -1.0);
185
0
  if (g_variant_is_of_type(value, G_VARIANT_TYPE_DOUBLE))
186
0
    return g_variant_get_double(value); /* nocheck:blocked */
187
0
  return -1.0;
188
0
}