|
Packit Service |
87a54e |
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
Packit |
5756e2 |
/*
|
|
Packit |
5756e2 |
* Copyright (C) 2019 Red Hat, Inc.
|
|
Packit |
5756e2 |
*/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#ifndef __NM_VALUE_TYPE_H__
|
|
Packit |
5756e2 |
#define __NM_VALUE_TYPE_H__
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
typedef enum {
|
|
Packit Service |
a1bd4f |
NM_VALUE_TYPE_UNSPEC = 1,
|
|
Packit Service |
a1bd4f |
NM_VALUE_TYPE_BOOL = 2,
|
|
Packit Service |
a1bd4f |
NM_VALUE_TYPE_INT32 = 3,
|
|
Packit Service |
a1bd4f |
NM_VALUE_TYPE_INT = 4,
|
|
Packit Service |
a1bd4f |
NM_VALUE_TYPE_STRING = 5,
|
|
Packit |
5756e2 |
} NMValueType;
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#ifdef NM_VALUE_TYPE_DEFINE_FUNCTIONS
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
typedef union {
|
|
Packit Service |
a1bd4f |
bool v_bool;
|
|
Packit Service |
a1bd4f |
gint32 v_int32;
|
|
Packit Service |
a1bd4f |
int v_int;
|
|
Packit Service |
a1bd4f |
const char *v_string;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* for convenience, also let the union contain other pointer types. These are
|
|
Packit Service |
a1bd4f |
* for NM_VALUE_TYPE_UNSPEC. */
|
|
Packit Service |
a1bd4f |
gconstpointer * v_ptr;
|
|
Packit Service |
a1bd4f |
const GPtrArray *v_ptrarray;
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
} NMValueTypUnion;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* Set the NMValueTypUnion. You can also assign the member directly.
|
|
Packit |
5756e2 |
* The only purpose of this is that it also returns a pointer to the
|
|
Packit |
5756e2 |
* union. So, you can do
|
|
Packit |
5756e2 |
*
|
|
Packit |
5756e2 |
* ptr = NM_VALUE_TYP_UNION_SET (&value_typ_union_storage, v_bool, TRUE);
|
|
Packit |
5756e2 |
*/
|
|
Packit Service |
a1bd4f |
#define NM_VALUE_TYP_UNION_SET(_arg, _type, _val) \
|
|
Packit Service |
a1bd4f |
({ \
|
|
Packit Service |
a1bd4f |
NMValueTypUnion *const _arg2 = (_arg); \
|
|
Packit Service |
a1bd4f |
\
|
|
Packit Service |
a1bd4f |
*_arg2 = (NMValueTypUnion){ \
|
|
Packit Service |
a1bd4f |
._type = (_val), \
|
|
Packit Service |
a1bd4f |
}; \
|
|
Packit Service |
a1bd4f |
_arg2; \
|
|
Packit Service |
a1bd4f |
})
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
typedef struct {
|
|
Packit Service |
a1bd4f |
bool has;
|
|
Packit Service |
a1bd4f |
NMValueTypUnion val;
|
|
Packit |
5756e2 |
} NMValueTypUnioMaybe;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
#define NM_VALUE_TYP_UNIO_MAYBE_SET(_arg, _type, _val) \
|
|
Packit Service |
a1bd4f |
({ \
|
|
Packit Service |
a1bd4f |
NMValueTypUnioMaybe *const _arg2 = (_arg); \
|
|
Packit Service |
a1bd4f |
\
|
|
Packit Service |
a1bd4f |
*_arg2 = (NMValueTypUnioMaybe){ \
|
|
Packit Service |
a1bd4f |
.has = TRUE, \
|
|
Packit Service |
a1bd4f |
.val._type = (_val), \
|
|
Packit Service |
a1bd4f |
}; \
|
|
Packit Service |
a1bd4f |
_arg2; \
|
|
Packit Service |
a1bd4f |
})
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline int
|
|
Packit Service |
a1bd4f |
nm_value_type_cmp(NMValueType value_type, gconstpointer p_a, gconstpointer p_b)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
switch (value_type) {
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_BOOL:
|
|
Packit Service |
a1bd4f |
NM_CMP_DIRECT(*((const bool *) p_a), *((const bool *) p_b));
|
|
Packit Service |
a1bd4f |
return 0;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT32:
|
|
Packit Service |
a1bd4f |
NM_CMP_DIRECT(*((const gint32 *) p_a), *((const gint32 *) p_b));
|
|
Packit Service |
a1bd4f |
return 0;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT:
|
|
Packit Service |
a1bd4f |
NM_CMP_DIRECT(*((const int *) p_a), *((const int *) p_b));
|
|
Packit Service |
a1bd4f |
return 0;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_STRING:
|
|
Packit Service |
a1bd4f |
return nm_strcmp0(*((const char *const *) p_a), *((const char *const *) p_b));
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_UNSPEC:
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
nm_assert_not_reached();
|
|
Packit Service |
a1bd4f |
return 0;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline gboolean
|
|
Packit Service |
a1bd4f |
nm_value_type_equal(NMValueType value_type, gconstpointer p_a, gconstpointer p_b)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
return nm_value_type_cmp(value_type, p_a, p_b) == 0;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void
|
|
Packit Service |
a1bd4f |
nm_value_type_copy(NMValueType value_type, gpointer dst, gconstpointer src)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
switch (value_type) {
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_BOOL:
|
|
Packit Service |
a1bd4f |
(*((bool *) dst) = *((const bool *) src));
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT32:
|
|
Packit Service |
a1bd4f |
(*((gint32 *) dst) = *((const gint32 *) src));
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT:
|
|
Packit Service |
a1bd4f |
(*((int *) dst) = *((const int *) src));
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_STRING:
|
|
Packit Service |
a1bd4f |
/* self assignment safe! */
|
|
Packit Service |
a1bd4f |
if (*((char **) dst) != *((const char *const *) src)) {
|
|
Packit Service |
a1bd4f |
g_free(*((char **) dst));
|
|
Packit Service |
a1bd4f |
*((char **) dst) = g_strdup(*((const char *const *) src));
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_UNSPEC:
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
nm_assert_not_reached();
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void
|
|
Packit Service |
a1bd4f |
nm_value_type_get_from_variant(NMValueType value_type,
|
|
Packit Service |
a1bd4f |
gpointer dst,
|
|
Packit Service |
a1bd4f |
GVariant * variant,
|
|
Packit Service |
a1bd4f |
gboolean clone)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
switch (value_type) {
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_BOOL:
|
|
Packit Service |
a1bd4f |
*((bool *) dst) = g_variant_get_boolean(variant);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT32:
|
|
Packit Service |
a1bd4f |
*((gint32 *) dst) = g_variant_get_int32(variant);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_STRING:
|
|
Packit Service |
a1bd4f |
if (clone) {
|
|
Packit Service |
a1bd4f |
g_free(*((char **) dst));
|
|
Packit Service |
a1bd4f |
*((char **) dst) = g_variant_dup_string(variant, NULL);
|
|
Packit Service |
a1bd4f |
} else {
|
|
Packit Service |
a1bd4f |
/* we don't clone the string, nor free the previous value. */
|
|
Packit Service |
a1bd4f |
*((const char **) dst) = g_variant_get_string(variant, NULL);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT:
|
|
Packit Service |
a1bd4f |
/* "int" also does not have a define variant type, because it's not
|
|
Packit Service |
a1bd4f |
* clear how many bits we would need. */
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* fall-through */
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_UNSPEC:
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
nm_assert_not_reached();
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline GVariant *
|
|
Packit Service |
a1bd4f |
nm_value_type_to_variant(NMValueType value_type, gconstpointer src)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
const char *v_string;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
switch (value_type) {
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_BOOL:
|
|
Packit Service |
a1bd4f |
return g_variant_new_boolean(*((const bool *) src));
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT32:
|
|
Packit Service |
a1bd4f |
return g_variant_new_int32(*((const gint32 *) src));
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_STRING:
|
|
Packit Service |
a1bd4f |
v_string = *((const char *const *) src);
|
|
Packit Service |
a1bd4f |
return v_string ? g_variant_new_string(v_string) : NULL;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT:
|
|
Packit Service |
a1bd4f |
/* "int" also does not have a define variant type, because it's not
|
|
Packit Service |
a1bd4f |
* clear how many bits we would need. */
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* fall-through */
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_UNSPEC:
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
nm_assert_not_reached();
|
|
Packit Service |
a1bd4f |
return NULL;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline const GVariantType *
|
|
Packit Service |
a1bd4f |
nm_value_type_get_variant_type(NMValueType value_type)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
switch (value_type) {
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_BOOL:
|
|
Packit Service |
a1bd4f |
return G_VARIANT_TYPE_BOOLEAN;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT32:
|
|
Packit Service |
a1bd4f |
return G_VARIANT_TYPE_INT32;
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_STRING:
|
|
Packit Service |
a1bd4f |
return G_VARIANT_TYPE_STRING;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_INT:
|
|
Packit Service |
a1bd4f |
/* "int" also does not have a define variant type, because it's not
|
|
Packit Service |
a1bd4f |
* clear how many bits we would need. */
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* fall-through */
|
|
Packit Service |
a1bd4f |
case NM_VALUE_TYPE_UNSPEC:
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
nm_assert_not_reached();
|
|
Packit Service |
a1bd4f |
return NULL;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#endif /* NM_VALUE_TYPE_DEFINE_FUNCTIONS */
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
#endif /* __NM_VALUE_TYPE_H__ */
|