summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-01-24 17:10:34 +0100
committerThomas Haller <thaller@redhat.com>2022-02-10 22:30:27 +0100
commit61ff2b03df1be3917057d99e63558a6121a22267 (patch)
tree777a571ef5977c0c9b5ce6ba46c386818bb396a6
parentf0c565a79fb67e4590f860f83f9abed155e33a4d (diff)
downloadNetworkManager-61ff2b03df1be3917057d99e63558a6121a22267.tar.gz
libnm: add direct strv type for NMSetting and use it for "match.interface-name"
G_TYPE_STRV is the last property type in NMSetting that is implemented by directly accessing the GObect property. Note that we have lots of override, non-default implementations that still use GObject properties, but I am talking here about properties that don't have a special implementation and use a G_TYPE_STRV GObject property. Add a "direct" implementation also for strv arrays. The advantage is that we no longer call g_value_get() for various operations, which requires a deep-copy of the strv array. The other advantage is that we will get a unified approach for implementing strv properties. In particular strv arrays need a lot of code to implement, and most settings do it differently. By adding a general mechanism, this code (and behavior) can be unified. Showcase it on "match.interface-name".
-rw-r--r--src/libnm-core-impl/nm-setting-match.c74
-rw-r--r--src/libnm-core-impl/nm-setting-private.h45
-rw-r--r--src/libnm-core-impl/nm-setting.c83
-rw-r--r--src/libnm-core-impl/tests/test-setting.c13
-rw-r--r--src/libnm-glib-aux/nm-json-aux.h5
-rw-r--r--src/libnm-glib-aux/nm-value-type.h66
6 files changed, 216 insertions, 70 deletions
diff --git a/src/libnm-core-impl/nm-setting-match.c b/src/libnm-core-impl/nm-setting-match.c
index 0ddffee582..6457c3da61 100644
--- a/src/libnm-core-impl/nm-setting-match.c
+++ b/src/libnm-core-impl/nm-setting-match.c
@@ -32,11 +32,11 @@ NM_GOBJECT_PROPERTIES_DEFINE(NMSettingMatch,
* Since: 1.14
*/
struct _NMSettingMatch {
- NMSetting parent;
- GArray *interface_name;
- GArray *kernel_command_line;
- GArray *driver;
- GArray *path;
+ NMSetting parent;
+ NMValueStrv interface_name;
+ GArray *kernel_command_line;
+ GArray *driver;
+ GArray *path;
};
struct _NMSettingMatchClass {
@@ -60,7 +60,7 @@ nm_setting_match_get_num_interface_names(NMSettingMatch *setting)
{
g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), 0);
- return nm_g_array_len(setting->interface_name);
+ return nm_g_array_len(setting->interface_name.arr);
}
/**
@@ -77,10 +77,11 @@ nm_setting_match_get_interface_name(NMSettingMatch *setting, int idx)
{
g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL);
- g_return_val_if_fail(setting->interface_name && idx >= 0 && idx < setting->interface_name->len,
+ g_return_val_if_fail(setting->interface_name.arr && idx >= 0
+ && idx < setting->interface_name.arr->len,
NULL);
- return nm_strvarray_get_idx(setting->interface_name, idx);
+ return nm_strvarray_get_idx(setting->interface_name.arr, idx);
}
/**
@@ -98,7 +99,7 @@ nm_setting_match_add_interface_name(NMSettingMatch *setting, const char *interfa
g_return_if_fail(NM_IS_SETTING_MATCH(setting));
g_return_if_fail(interface_name);
- nm_strvarray_add(nm_strvarray_ensure(&setting->interface_name), interface_name);
+ nm_strvarray_add(nm_strvarray_ensure(&setting->interface_name.arr), interface_name);
_notify(setting, PROP_INTERFACE_NAME);
}
@@ -116,9 +117,10 @@ nm_setting_match_remove_interface_name(NMSettingMatch *setting, int idx)
{
g_return_if_fail(NM_IS_SETTING_MATCH(setting));
- g_return_if_fail(setting->interface_name && idx >= 0 && idx < setting->interface_name->len);
+ g_return_if_fail(setting->interface_name.arr && idx >= 0
+ && idx < setting->interface_name.arr->len);
- g_array_remove_index(setting->interface_name, idx);
+ g_array_remove_index(setting->interface_name.arr, idx);
_notify(setting, PROP_INTERFACE_NAME);
}
@@ -139,7 +141,7 @@ nm_setting_match_remove_interface_name_by_value(NMSettingMatch *setting, const c
g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), FALSE);
g_return_val_if_fail(interface_name, FALSE);
- if (nm_strvarray_remove_first(setting->interface_name, interface_name)) {
+ if (nm_strvarray_remove_first(setting->interface_name.arr, interface_name)) {
_notify(setting, PROP_INTERFACE_NAME);
return TRUE;
}
@@ -160,8 +162,8 @@ nm_setting_match_clear_interface_names(NMSettingMatch *setting)
{
g_return_if_fail(NM_IS_SETTING_MATCH(setting));
- if (nm_g_array_len(setting->interface_name) != 0) {
- nm_clear_pointer(&setting->interface_name, g_array_unref);
+ if (nm_g_array_len(setting->interface_name.arr) != 0) {
+ nm_clear_pointer(&setting->interface_name.arr, g_array_unref);
_notify(setting, PROP_INTERFACE_NAME);
}
}
@@ -185,7 +187,7 @@ nm_setting_match_get_interface_names(NMSettingMatch *setting, guint *length)
{
g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL);
- return nm_strvarray_get_strv(&setting->interface_name, length);
+ return nm_strvarray_get_strv(&setting->interface_name.arr, length);
}
/*****************************************************************************/
@@ -615,9 +617,6 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
NMSettingMatch *self = NM_SETTING_MATCH(object);
switch (prop_id) {
- case PROP_INTERFACE_NAME:
- g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(self->interface_name, NULL));
- break;
case PROP_KERNEL_COMMAND_LINE:
g_value_take_boxed(value,
nm_strvarray_get_strv_non_empty_dup(self->kernel_command_line, NULL));
@@ -629,7 +628,7 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(self->path, NULL));
break;
default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ _nm_setting_property_get_property_direct(object, prop_id, value, pspec);
break;
}
}
@@ -640,9 +639,6 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps
NMSettingMatch *self = NM_SETTING_MATCH(object);
switch (prop_id) {
- case PROP_INTERFACE_NAME:
- nm_strvarray_set_strv(&self->interface_name, g_value_get_boxed(value));
- break;
case PROP_KERNEL_COMMAND_LINE:
nm_strvarray_set_strv(&self->kernel_command_line, g_value_get_boxed(value));
break;
@@ -653,7 +649,7 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps
nm_strvarray_set_strv(&self->path, g_value_get_boxed(value));
break;
default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ _nm_setting_property_set_property_direct(object, prop_id, value, pspec);
break;
}
}
@@ -698,9 +694,9 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
NMSettingMatch *self = NM_SETTING_MATCH(setting);
guint i;
- if (self->interface_name) {
- for (i = 0; i < self->interface_name->len; i++) {
- if (nm_str_is_empty(nm_strvarray_get_idx(self->interface_name, i))) {
+ if (self->interface_name.arr) {
+ for (i = 0; i < self->interface_name.arr->len; i++) {
+ if (nm_str_is_empty(nm_strvarray_get_idx(self->interface_name.arr, i))) {
g_set_error(error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
@@ -770,7 +766,7 @@ finalize(GObject *object)
{
NMSettingMatch *self = NM_SETTING_MATCH(object);
- nm_clear_pointer(&self->interface_name, g_array_unref);
+ nm_clear_pointer(&self->interface_name.arr, g_array_unref);
nm_clear_pointer(&self->kernel_command_line, g_array_unref);
nm_clear_pointer(&self->driver, g_array_unref);
nm_clear_pointer(&self->path, g_array_unref);
@@ -781,8 +777,9 @@ finalize(GObject *object)
static void
nm_setting_match_class_init(NMSettingMatchClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS(klass);
- NMSettingClass *setting_class = NM_SETTING_CLASS(klass);
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ NMSettingClass *setting_class = NM_SETTING_CLASS(klass);
+ GArray *properties_override = _nm_sett_info_property_override_create_array();
object_class->get_property = get_property;
object_class->set_property = set_property;
@@ -810,12 +807,13 @@ nm_setting_match_class_init(NMSettingMatchClass *klass)
*
* Since: 1.14
**/
- obj_properties[PROP_INTERFACE_NAME] = g_param_spec_boxed(
- NM_SETTING_MATCH_INTERFACE_NAME,
- "",
- "",
- G_TYPE_STRV,
- NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ _nm_setting_property_define_direct_strv(properties_override,
+ obj_properties,
+ NM_SETTING_MATCH_INTERFACE_NAME,
+ PROP_INTERFACE_NAME,
+ NM_SETTING_PARAM_FUZZY_IGNORE,
+ NMSettingMatch,
+ interface_name);
/**
* NMSettingMatch:kernel-command-line
@@ -901,5 +899,9 @@ nm_setting_match_class_init(NMSettingMatchClass *klass)
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
- _nm_setting_class_commit(setting_class, NM_META_SETTING_TYPE_MATCH, NULL, NULL, 0);
+ _nm_setting_class_commit(setting_class,
+ NM_META_SETTING_TYPE_MATCH,
+ NULL,
+ properties_override,
+ 0);
}
diff --git a/src/libnm-core-impl/nm-setting-private.h b/src/libnm-core-impl/nm-setting-private.h
index 7483eaedda..38b233e92a 100644
--- a/src/libnm-core-impl/nm-setting-private.h
+++ b/src/libnm-core-impl/nm-setting-private.h
@@ -232,6 +232,14 @@ gboolean _nm_setting_clear_secrets(NMSetting *setting,
/*****************************************************************************/
+/* This holds a property of type NM_VALUE_TYPE_STRV. You probably want
+ * to use nm_strvarray_*() API with this. */
+typedef struct {
+ GArray *arr;
+} NMValueStrv;
+
+/*****************************************************************************/
+
#define NM_SETTING_PARAM_NONE 0
/* The property of the #NMSetting should be considered during comparisons that
@@ -277,6 +285,7 @@ extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_int64;
extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_uint64;
extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_string;
extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_bytes;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_strv;
extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_enum;
extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_flags;
extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_mac_address;
@@ -774,6 +783,42 @@ _nm_properties_override(GArray *properties_override, const NMSettInfoProperty *p
/*****************************************************************************/
+#define _nm_setting_property_define_direct_strv(properties_override, \
+ obj_properties, \
+ prop_name, \
+ prop_id, \
+ param_flags, \
+ private_struct_type, \
+ private_struct_field, \
+ ... /* extra NMSettInfoProperty fields */) \
+ G_STMT_START \
+ { \
+ GParamSpec *_param_spec; \
+ \
+ G_STATIC_ASSERT(!NM_FLAGS_ANY((param_flags), ~(NM_SETTING_PARAM_FUZZY_IGNORE))); \
+ \
+ _param_spec = \
+ g_param_spec_boxed("" prop_name "", \
+ "", \
+ "", \
+ G_TYPE_STRV, \
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags)); \
+ \
+ (obj_properties)[(prop_id)] = _param_spec; \
+ \
+ _nm_properties_override_gobj((properties_override), \
+ _param_spec, \
+ &nm_sett_info_propert_type_direct_strv, \
+ .direct_offset = \
+ NM_STRUCT_OFFSET_ENSURE_TYPE(NMValueStrv, \
+ private_struct_type, \
+ private_struct_field), \
+ __VA_ARGS__); \
+ } \
+ G_STMT_END
+
+/*****************************************************************************/
+
#define _nm_setting_property_define_direct_enum(properties_override, \
obj_properties, \
prop_name, \
diff --git a/src/libnm-core-impl/nm-setting.c b/src/libnm-core-impl/nm-setting.c
index be88effb88..e65e75e736 100644
--- a/src/libnm-core-impl/nm-setting.c
+++ b/src/libnm-core-impl/nm-setting.c
@@ -774,6 +774,13 @@ _nm_setting_property_get_property_direct(GObject *object,
g_value_set_boxed(value, *p_val);
return;
}
+ case NM_VALUE_TYPE_STRV:
+ {
+ const NMValueStrv *p_val = _nm_setting_get_private_field(setting, sett_info, property_info);
+
+ g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(p_val->arr, NULL));
+ return;
+ }
default:
goto out_fail;
}
@@ -909,6 +916,18 @@ _nm_setting_property_set_property_direct(GObject *object,
*p_val = v ? g_bytes_ref(v) : NULL;
goto out_notify;
}
+ case NM_VALUE_TYPE_STRV:
+ {
+ NMValueStrv *p_val = _nm_setting_get_private_field(setting, sett_info, property_info);
+ const char *const *v;
+
+ v = g_value_get_boxed(value);
+ if (nm_strvarray_equal_strv(p_val->arr, v, -1))
+ return;
+
+ nm_strvarray_set_strv(&p_val->arr, v);
+ goto out_notify;
+ }
default:
goto out_fail;
}
@@ -1026,6 +1045,11 @@ _init_direct(NMSetting *setting)
nm_assert(!(*((const GBytes *const *)
_nm_setting_get_private_field(setting, sett_info, property_info))));
break;
+ case NM_VALUE_TYPE_STRV:
+ nm_assert(!((const NMValueStrv *)
+ _nm_setting_get_private_field(setting, sett_info, property_info))
+ ->arr);
+ break;
default:
nm_assert_not_reached();
break;
@@ -1081,6 +1105,13 @@ _finalize_direct(NMSetting *setting)
nm_clear_pointer(p_val, g_bytes_unref);
break;
}
+ case NM_VALUE_TYPE_STRV:
+ {
+ NMValueStrv *p_val = _nm_setting_get_private_field(setting, sett_info, property_info);
+
+ nm_clear_pointer(&p_val->arr, g_array_unref);
+ break;
+ }
default:
nm_assert_not_reached();
break;
@@ -1199,6 +1230,20 @@ _nm_setting_property_to_dbus_fcn_direct(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_
return NULL;
return nm_g_bytes_to_variant_ay(val);
}
+ case NM_VALUE_TYPE_STRV:
+ {
+ const NMValueStrv *val;
+
+ /* Strv properties have always NULL as default. Setting "including_default" has no defined meaning
+ * (but it could have). */
+ nm_assert(!property_info->to_dbus_including_default);
+
+ val =
+ (const NMValueStrv *) _nm_setting_get_private_field(setting, sett_info, property_info);
+ if (!val->arr)
+ return NULL;
+ return g_variant_new_strv((const char *const *) val->arr->data, val->arr->len);
+ }
default:
return nm_assert_unreachable_val(NULL);
}
@@ -1545,6 +1590,8 @@ _nm_setting_property_from_dbus_fcn_direct(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS
gs_unref_bytes GBytes *v = NULL;
GBytes **p_val;
+ nm_assert(!property_info->property_type->from_dbus_direct_allow_transform);
+
if (!g_variant_is_of_type(value, G_VARIANT_TYPE_BYTESTRING))
goto out_error_wrong_dbus_type;
@@ -1557,6 +1604,28 @@ _nm_setting_property_from_dbus_fcn_direct(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS
NM_SWAP(p_val, &v);
goto out_notify;
}
+ case NM_VALUE_TYPE_STRV:
+ {
+ NMValueStrv *p_val;
+ gs_free const char **ss = NULL;
+ gsize ss_len;
+
+ nm_assert(!property_info->property_type->from_dbus_direct_allow_transform);
+
+ if (!g_variant_is_of_type(value, G_VARIANT_TYPE_STRING_ARRAY))
+ goto out_error_wrong_dbus_type;
+
+ ss = g_variant_get_strv(value, &ss_len);
+ nm_assert(ss_len <= G_MAXUINT);
+
+ p_val = _nm_setting_get_private_field(setting, sett_info, property_info);
+
+ if (nm_strvarray_equal_strv(p_val->arr, ss, ss_len))
+ goto out_unchanged;
+
+ nm_strvarray_set_strv(&p_val->arr, ss);
+ goto out_notify;
+ }
default:
break;
}
@@ -2465,6 +2534,9 @@ _nm_setting_property_compare_fcn_direct(_NM_SETT_INFO_PROP_COMPARE_FCN_ARGS _nm_
return nm_streq0(*((const char *const *) p_a), *((const char *const *) p_b));
case NM_VALUE_TYPE_BYTES:
return nm_g_bytes_equal0(*((const GBytes *const *) p_a), *((const GBytes *const *) p_b));
+ case NM_VALUE_TYPE_STRV:
+ return nm_strvarray_equal(((const NMValueStrv *) p_a)->arr,
+ ((const NMValueStrv *) p_b)->arr);
default:
return nm_assert_unreachable_val(TRUE);
}
@@ -3529,8 +3601,15 @@ const NMSettInfoPropertType nm_sett_info_propert_type_direct_bytes =
.compare_fcn = _nm_setting_property_compare_fcn_direct,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_direct,
- .from_dbus_is_full = TRUE,
- .from_dbus_direct_allow_transform = TRUE);
+ .from_dbus_is_full = TRUE);
+
+const NMSettInfoPropertType nm_sett_info_propert_type_direct_strv =
+ NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_STRING_ARRAY,
+ .direct_type = NM_VALUE_TYPE_STRV,
+ .compare_fcn = _nm_setting_property_compare_fcn_direct,
+ .to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct,
+ .from_dbus_fcn = _nm_setting_property_from_dbus_fcn_direct,
+ .from_dbus_is_full = TRUE);
const NMSettInfoPropertType nm_sett_info_propert_type_direct_enum =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_INT32,
diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c
index d6ac37b495..8e8d1a89e1 100644
--- a/src/libnm-core-impl/tests/test-setting.c
+++ b/src/libnm-core-impl/tests/test-setting.c
@@ -4583,6 +4583,12 @@ test_setting_metadata(void)
== _nm_setting_property_to_dbus_fcn_direct);
g_assert(sip->param_spec);
g_assert(sip->param_spec->value_type == G_TYPE_BYTES);
+ } else if (sip->property_type->direct_type == NM_VALUE_TYPE_STRV) {
+ g_assert(g_variant_type_equal(sip->property_type->dbus_type, "as"));
+ g_assert(sip->property_type->to_dbus_fcn
+ == _nm_setting_property_to_dbus_fcn_direct);
+ g_assert(sip->param_spec);
+ g_assert(sip->param_spec->value_type == G_TYPE_STRV);
} else
g_assert_not_reached();
@@ -4671,7 +4677,12 @@ check_done:;
}
if (sip->property_type->from_dbus_fcn == _nm_setting_property_from_dbus_fcn_direct) {
/* for the moment, all direct properties allow transformation. */
- g_assert(sip->property_type->from_dbus_direct_allow_transform);
+ if (NM_IN_SET(sip->property_type->direct_type,
+ NM_VALUE_TYPE_BYTES,
+ NM_VALUE_TYPE_STRV))
+ g_assert(!sip->property_type->from_dbus_direct_allow_transform);
+ else
+ g_assert(sip->property_type->from_dbus_direct_allow_transform);
}
if (sip->property_type->from_dbus_fcn == _nm_setting_property_from_dbus_fcn_gprop)
diff --git a/src/libnm-glib-aux/nm-json-aux.h b/src/libnm-glib-aux/nm-json-aux.h
index 275ed7709a..3054b1f944 100644
--- a/src/libnm-glib-aux/nm-json-aux.h
+++ b/src/libnm-glib-aux/nm-json-aux.h
@@ -391,6 +391,7 @@ nm_value_type_to_json(NMValueType value_type, GString *gstr, gconstpointer p_fie
nm_json_gstr_append_string(gstr, *((const char *const *) p_field));
return;
case NM_VALUE_TYPE_BYTES:
+ case NM_VALUE_TYPE_STRV:
case NM_VALUE_TYPE_NONE:
case NM_VALUE_TYPE_UNSPEC:
break;
@@ -428,12 +429,12 @@ nm_value_type_from_json(const NMJsonVt *vt,
return (nm_jansson_json_as_string(vt, elem, out_val) > 0);
case NM_VALUE_TYPE_BYTES:
+ case NM_VALUE_TYPE_STRV:
case NM_VALUE_TYPE_NONE:
case NM_VALUE_TYPE_UNSPEC:
break;
}
- nm_assert_not_reached();
- return FALSE;
+ return nm_assert_unreachable_val(FALSE);
}
#endif /* NM_VALUE_TYPE_DEFINE_FUNCTIONS */
diff --git a/src/libnm-glib-aux/nm-value-type.h b/src/libnm-glib-aux/nm-value-type.h
index d774e12072..771021da4c 100644
--- a/src/libnm-glib-aux/nm-value-type.h
+++ b/src/libnm-glib-aux/nm-value-type.h
@@ -9,25 +9,26 @@
typedef enum _nm_packed {
NM_VALUE_TYPE_NONE = 0,
NM_VALUE_TYPE_UNSPEC = 1,
- NM_VALUE_TYPE_BOOL = 2,
- NM_VALUE_TYPE_INT32 = 3,
- NM_VALUE_TYPE_INT = 4,
- NM_VALUE_TYPE_INT64 = 5,
- NM_VALUE_TYPE_UINT32 = 6,
- NM_VALUE_TYPE_UINT = 7,
- NM_VALUE_TYPE_UINT64 = 8,
+
+ NM_VALUE_TYPE_BOOL,
+ NM_VALUE_TYPE_INT32,
+ NM_VALUE_TYPE_INT,
+ NM_VALUE_TYPE_INT64,
+ NM_VALUE_TYPE_UINT32,
+ NM_VALUE_TYPE_UINT,
+ NM_VALUE_TYPE_UINT64,
/* Flags are for G_TYPE_FLAGS. That is, internally they are tracked
* as a guint, they have a g_param_spec_flags() property and they are
* serialized on D-Bus as "u". */
- NM_VALUE_TYPE_FLAGS = 9,
+ NM_VALUE_TYPE_FLAGS,
/* G_TYPE_ENUM */
- NM_VALUE_TYPE_ENUM = 10,
-
- NM_VALUE_TYPE_STRING = 11,
+ NM_VALUE_TYPE_ENUM,
- NM_VALUE_TYPE_BYTES = 12,
+ NM_VALUE_TYPE_STRING,
+ NM_VALUE_TYPE_BYTES,
+ NM_VALUE_TYPE_STRV,
} NMValueType;
/*****************************************************************************/
@@ -112,14 +113,17 @@ nm_value_type_cmp(NMValueType value_type, gconstpointer p_a, gconstpointer p_b)
return 0;
case NM_VALUE_TYPE_STRING:
return nm_strcmp0(*((const char *const *) p_a), *((const char *const *) p_b));
+
case NM_VALUE_TYPE_BYTES:
- return nm_g_bytes_equal0(*((const GBytes *const *) p_a), *((const GBytes *const *) p_b));
+ case NM_VALUE_TYPE_STRV:
+ /* These types have implementation define memory representations. */
+ break;
+
case NM_VALUE_TYPE_NONE:
case NM_VALUE_TYPE_UNSPEC:
break;
}
- nm_assert_not_reached();
- return 0;
+ return nm_assert_unreachable_val(0);
}
static inline gboolean
@@ -163,14 +167,12 @@ nm_value_type_copy(NMValueType value_type, gpointer dst, gconstpointer src)
*((char **) dst) = g_strdup(*((const char *const *) src));
}
return;
+
case NM_VALUE_TYPE_BYTES:
- /* self assignment safe! */
- if (*((GBytes **) dst) != *((const GBytes *const *) src)) {
- _nm_unused gs_unref_bytes GBytes *old = *((GBytes **) dst);
+ case NM_VALUE_TYPE_STRV:
+ /* These types have implementation define memory representations. */
+ break;
- *((GBytes **) dst) = g_bytes_ref(*((GBytes *const *) src));
- }
- return;
case NM_VALUE_TYPE_NONE:
case NM_VALUE_TYPE_UNSPEC:
break;
@@ -212,14 +214,18 @@ nm_value_type_get_from_variant(NMValueType value_type,
return;
case NM_VALUE_TYPE_BYTES:
+ case NM_VALUE_TYPE_STRV:
+ /* These types have implementation define memory representations. */
+ break;
+
case NM_VALUE_TYPE_INT:
case NM_VALUE_TYPE_UINT:
case NM_VALUE_TYPE_ENUM:
case NM_VALUE_TYPE_FLAGS:
/* These types don't have a defined variant type, because it's not
* clear how many bits we would need or how to handle the type. */
+ break;
- /* fall-through */
case NM_VALUE_TYPE_NONE:
case NM_VALUE_TYPE_UNSPEC:
break;
@@ -230,8 +236,7 @@ nm_value_type_get_from_variant(NMValueType value_type,
static inline GVariant *
nm_value_type_to_variant(NMValueType value_type, gconstpointer src)
{
- const char *v_string;
- const GBytes *v_bytes;
+ const char *v_string;
switch (value_type) {
case NM_VALUE_TYPE_BOOL:
@@ -247,9 +252,11 @@ nm_value_type_to_variant(NMValueType value_type, gconstpointer src)
case NM_VALUE_TYPE_STRING:
v_string = *((const char *const *) src);
return v_string ? g_variant_new_string(v_string) : NULL;
+
case NM_VALUE_TYPE_BYTES:
- v_bytes = *((const GBytes *const *) src);
- return v_bytes ? nm_g_bytes_to_variant_ay(v_bytes) : NULL;
+ case NM_VALUE_TYPE_STRV:
+ /* These types have implementation define memory representations. */
+ break;
case NM_VALUE_TYPE_INT:
case NM_VALUE_TYPE_UINT:
@@ -257,14 +264,13 @@ nm_value_type_to_variant(NMValueType value_type, gconstpointer src)
case NM_VALUE_TYPE_FLAGS:
/* These types don't have a defined variant type, because it's not
* clear how many bits we would need or how to handle the type. */
+ break;
- /* fall-through */
case NM_VALUE_TYPE_NONE:
case NM_VALUE_TYPE_UNSPEC:
break;
}
- nm_assert_not_reached();
- return NULL;
+ return nm_assert_unreachable_val(NULL);
}
static inline const GVariantType *
@@ -285,6 +291,8 @@ nm_value_type_get_variant_type(NMValueType value_type)
return G_VARIANT_TYPE_STRING;
case NM_VALUE_TYPE_BYTES:
return G_VARIANT_TYPE_BYTESTRING;
+ case NM_VALUE_TYPE_STRV:
+ return G_VARIANT_TYPE_STRING_ARRAY;
case NM_VALUE_TYPE_INT:
case NM_VALUE_TYPE_UINT: