clients: fix error message for setting flags enums

The min/max for flags must be unsigned. We need to keep track of
whether we have flags or an enum, and adjust min/max.
This commit is contained in:
Thomas Haller
2017-05-23 11:24:01 +02:00
parent cfc9f5a9fd
commit d6bdf6d9dc

View File

@@ -1071,6 +1071,7 @@ _set_fcn_gobject_enum (ARGS_SET_FCN)
gboolean has_gtype = FALSE; gboolean has_gtype = FALSE;
nm_auto_unset_gvalue GValue gval = G_VALUE_INIT; nm_auto_unset_gvalue GValue gval = G_VALUE_INIT;
nm_auto_unref_gtypeclass GTypeClass *gtype_class = NULL; nm_auto_unref_gtypeclass GTypeClass *gtype_class = NULL;
gboolean is_flags;
int v; int v;
if (property_info->property_typ_data) { if (property_info->property_typ_data) {
@@ -1082,21 +1083,24 @@ _set_fcn_gobject_enum (ARGS_SET_FCN)
gtype_prop = _gobject_property_get_gtype (G_OBJECT (setting), property_info->property_name); gtype_prop = _gobject_property_get_gtype (G_OBJECT (setting), property_info->property_name);
if ( gtype_prop == G_TYPE_INT if ( has_gtype
|| gtype_prop == G_TYPE_UINT) { && NM_IN_SET (gtype_prop,
if (!has_gtype) G_TYPE_INT,
g_return_val_if_reached (FALSE); G_TYPE_UINT)
} else if (G_TYPE_IS_CLASSED (gtype_prop)) { && G_TYPE_IS_CLASSED (gtype)
gtype_class = g_type_class_ref (gtype_prop); && (gtype_class = g_type_class_ref (gtype))
if ( !G_IS_ENUM_CLASS (gtype_class) && ( (is_flags = G_IS_FLAGS_CLASS (gtype_class))
&& !G_IS_FLAGS_CLASS (gtype_class)) || G_IS_ENUM_CLASS (gtype_class))) {
g_return_val_if_reached (FALSE); /* valid */
} else if ( !has_gtype
&& G_TYPE_IS_CLASSED (gtype_prop)
&& (gtype_class = g_type_class_ref (gtype_prop))
&& ( (is_flags = G_IS_FLAGS_CLASS (gtype_class))
|| G_IS_ENUM_CLASS (gtype_class))) {
gtype = gtype_prop;
} else } else
g_return_val_if_reached (FALSE); g_return_val_if_reached (FALSE);
if (!has_gtype)
gtype = gtype_prop;
if (!_nm_utils_enum_from_str_full (gtype, value, &v, NULL, if (!_nm_utils_enum_from_str_full (gtype, value, &v, NULL,
property_info->property_typ_data property_info->property_typ_data
? property_info->property_typ_data->subtype.gobject_enum.value_infos ? property_info->property_typ_data->subtype.gobject_enum.value_infos
@@ -1124,6 +1128,7 @@ fail:
if (error) { if (error) {
gs_free const char **valid_all = NULL; gs_free const char **valid_all = NULL;
gs_free const char *valid_str = NULL; gs_free const char *valid_str = NULL;
gboolean has_minmax = FALSE;
int min = G_MININT; int min = G_MININT;
int max = G_MAXINT; int max = G_MAXINT;
@@ -1132,15 +1137,29 @@ fail:
|| property_info->property_typ_data->subtype.gobject_enum.max) { || property_info->property_typ_data->subtype.gobject_enum.max) {
min = property_info->property_typ_data->subtype.gobject_enum.min; min = property_info->property_typ_data->subtype.gobject_enum.min;
max = property_info->property_typ_data->subtype.gobject_enum.max; max = property_info->property_typ_data->subtype.gobject_enum.max;
has_minmax = TRUE;
} }
} }
if (!has_minmax && is_flags) {
min = 0;
max = (gint) G_MAXUINT;
}
valid_all = nm_utils_enum_get_values (gtype, min, max); valid_all = nm_utils_enum_get_values (gtype, min, max);
valid_str = g_strjoinv (",", (char **) valid_all); valid_str = g_strjoinv (",", (char **) valid_all);
if (is_flags) {
g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
_("invalid option '%s', use a combination of [%s]"),
value,
valid_str);
} else {
g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT, g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
_("invalid option '%s', use one of [%s]"), _("invalid option '%s', use one of [%s]"),
value, value,
valid_str); valid_str);
} }
}
return FALSE; return FALSE;
} }