summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-05-21 19:51:26 +0200
committerThomas Haller <thaller@redhat.com>2017-05-23 13:37:10 +0200
commite086cf1887c9ed27da1ad2fc31f4a6a007fc6721 (patch)
treec3eb8413ac0cc26afa3513a69fff6357e752c751
parentb6d9bdcee86fc6d52b2aa1bc8a0dcfa64bec86e8 (diff)
clients: add value_infos for int getter
This allows to implement a pretty alias for numbers, like "default" for 0.
-rw-r--r--clients/common/nm-meta-setting-desc.c89
-rw-r--r--clients/common/nm-meta-setting-desc.h6
2 files changed, 92 insertions, 3 deletions
diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c
index 9ef8f31fd1..f4a1440ae2 100644
--- a/clients/common/nm-meta-setting-desc.c
+++ b/clients/common/nm-meta-setting-desc.c
@@ -590,6 +590,64 @@ _get_fcn_gobject (ARGS_GET_FCN)
}
static gconstpointer
+_get_fcn_gobject_int_impl (const NMMetaPropertyInfo *property_info,
+ NMSetting *setting,
+ NMMetaAccessorGetType get_type,
+ const NMMetaUtilsIntValueInfo *value_infos,
+ gpointer *out_to_free)
+{
+ const GParamSpec *pspec;
+ nm_auto_unset_gvalue GValue gval = G_VALUE_INIT;
+ gint64 v;
+
+ RETURN_UNSUPPORTED_GET_TYPE ();
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (setting)), property_info->property_name);
+ if (!G_IS_PARAM_SPEC (pspec))
+ g_return_val_if_reached (FALSE);
+
+ g_value_init (&gval, pspec->value_type);
+ g_object_get_property (G_OBJECT (setting), property_info->property_name, &gval);
+ switch (pspec->value_type) {
+ case G_TYPE_INT:
+ v = g_value_get_int (&gval);
+ break;
+ case G_TYPE_UINT:
+ v = g_value_get_uint (&gval);
+ break;
+ case G_TYPE_INT64:
+ v = g_value_get_int64 (&gval);
+ break;
+ default:
+ g_return_val_if_reached (NULL);
+ break;
+ }
+
+ if ( get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY
+ && value_infos) {
+ for (; value_infos->nick; value_infos++) {
+ if (value_infos->value == v) {
+ RETURN_STR_TO_FREE (g_strdup_printf ("%lli (%s)",
+ (long long) v,
+ value_infos->nick));
+ }
+ }
+ }
+
+ RETURN_STR_TO_FREE (g_strdup_printf ("%"G_GINT64_FORMAT, v));
+}
+
+static gconstpointer
+_get_fcn_gobject_int (ARGS_GET_FCN)
+{
+ return _get_fcn_gobject_int_impl (property_info, setting, get_type,
+ property_info->property_typ_data
+ ? property_info->property_typ_data->subtype.gobject_int.value_infos
+ : NULL,
+ out_to_free);
+}
+
+static gconstpointer
_get_fcn_gobject_mtu (ARGS_GET_FCN)
{
guint32 mtu;
@@ -801,13 +859,35 @@ _set_fcn_gobject_int_impl (const NMMetaPropertyInfo *property_info,
int errsv;
const GParamSpec *pspec;
nm_auto_unset_gvalue GValue gval = G_VALUE_INIT;
- gint64 v;
+ gint64 v = 0;
gboolean has_minmax = FALSE;
gint64 min = G_MININT64;
gint64 max = G_MAXINT64;
guint base = 10;
+ const NMMetaUtilsIntValueInfo *value_infos = NULL;
+ gboolean has_value = FALSE;
if (property_info->property_typ_data) {
+
+ if ( value
+ && (value_infos = property_info->property_typ_data->subtype.gobject_int.value_infos)) {
+ gs_free char *vv_stripped = NULL;
+ const char *vv = nm_str_skip_leading_spaces (value);
+
+ if (vv[0] && g_ascii_isspace (vv[strlen (vv) - 1])) {
+ vv_stripped = g_strstrip (g_strdup (vv));
+ vv = vv_stripped;
+ }
+
+ for (; value_infos->nick; value_infos++) {
+ if (nm_streq (value_infos->nick, vv)) {
+ v = value_infos->value;
+ has_value = TRUE;
+ break;
+ }
+ }
+ }
+
if (property_info->property_typ_data->subtype.gobject_int.base > 0)
base = property_info->property_typ_data->subtype.gobject_int.base;
if ( property_info->property_typ_data->subtype.gobject_int.min
@@ -850,7 +930,9 @@ _set_fcn_gobject_int_impl (const NMMetaPropertyInfo *property_info,
g_return_val_if_reached (FALSE);
}
- v = _nm_utils_ascii_str_to_int64 (value, base, min, max, 0);
+ if (!has_value)
+ v = _nm_utils_ascii_str_to_int64 (value, base, min, max, 0);
+
if ((errsv = errno) != 0) {
if (errsv == ERANGE) {
g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
@@ -4418,7 +4500,7 @@ static const NMMetaPropertyType _pt_gobject_bool = {
};
static const NMMetaPropertyType _pt_gobject_int = {
- .get_fcn = _get_fcn_gobject,
+ .get_fcn = _get_fcn_gobject_int,
.set_fcn = _set_fcn_gobject_int,
};
@@ -4473,6 +4555,7 @@ static const NMMetaPropertyType _pt_gobject_devices = {
#define VALUES_STATIC(...) (((const char *[]) { __VA_ARGS__, NULL }))
#define ENUM_VALUE_INFOS(...) (((const NMUtilsEnumValueInfo []) { __VA_ARGS__, { 0 } }))
+#define INT_VALUE_INFOS(...) (((const NMMetaUtilsIntValueInfo []) { __VA_ARGS__, { 0 } }))
#define GET_FCN_WITH_DEFAULT(type, func) \
/* macro that returns @func as const (gboolean(*)(NMSetting*)) type, but checks
diff --git a/clients/common/nm-meta-setting-desc.h b/clients/common/nm-meta-setting-desc.h
index 2e0b03bd29..e3a3848255 100644
--- a/clients/common/nm-meta-setting-desc.h
+++ b/clients/common/nm-meta-setting-desc.h
@@ -225,6 +225,11 @@ struct _NMMetaPropertyType {
struct _NMUtilsEnumValueInfo;
+typedef struct {
+ const char *nick;
+ gint64 value;
+} NMMetaUtilsIntValueInfo;
+
struct _NMMetaPropertyTypData {
union {
struct {
@@ -240,6 +245,7 @@ struct _NMMetaPropertyTypData {
gint64 min;
gint64 max;
guint base;
+ const NMMetaUtilsIntValueInfo *value_infos;
} gobject_int;
struct {
const char *(*validate_fcn) (const char *value, char **out_to_free, GError **error);