cli: implement nmc_setting_reset_property() based on nmc_setting_set_property()

"reset" is just a special case of "set". We can keep nmc_setting_reset_property() as a convenience
function, but it must be implemented based on nmc_setting_set_property().

Also, reset only used nmc_property_set_default_value(), which only works
with GObject based properties. It's wrong to assume that all properties
are GObject based. By implementing it based via nmc_setting_set_property()
we can fix this (later).
This commit is contained in:
Thomas Haller 2019-03-18 10:09:24 +01:00
parent cb5a81399a
commit 7b5d514aef
3 changed files with 45 additions and 69 deletions

View file

@ -3988,7 +3988,7 @@ set_property (NMClient *client,
* so make a copy if we are going to free it.
*/
value = value_free = g_strdup (value);
nmc_setting_reset_property (setting, property_name, NULL);
nmc_setting_reset_property (client, setting, property_name, NULL);
}
if (!nmc_setting_set_property (client, setting, property_name, value, &local)) {
g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
@ -4013,7 +4013,7 @@ set_property (NMClient *client,
return FALSE;
}
} else
nmc_setting_reset_property (setting, property_name, NULL);
nmc_setting_reset_property (client, setting, property_name, NULL);
}
/* Don't ask for this property in interactive mode. */
@ -6999,7 +6999,7 @@ property_edit_submenu (NmCli *nmc,
g_clear_error (&tmp_err);
}
} else {
if (!nmc_setting_reset_property (curr_setting, prop_name, &tmp_err)) {
if (!nmc_setting_reset_property (nmc->client, curr_setting, prop_name, &tmp_err)) {
g_print (_("Error: failed to remove value of '%s': %s\n"), prop_name,
tmp_err->message);
g_clear_error (&tmp_err);
@ -7513,8 +7513,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
if (!prop_name)
break;
/* Delete property value */
if (!nmc_setting_reset_property (menu_ctx.curr_setting, prop_name, &tmp_err)) {
if (!nmc_setting_reset_property (nmc->client, menu_ctx.curr_setting, prop_name, &tmp_err)) {
g_print (_("Error: failed to remove value of '%s': %s\n"), prop_name,
tmp_err->message);
g_clear_error (&tmp_err);
@ -7564,8 +7563,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
prop_name = is_property_valid (ss, cmd_arg_p, &tmp_err);
if (prop_name) {
/* Delete property value */
if (!nmc_setting_reset_property (ss, prop_name, &tmp_err)) {
if (!nmc_setting_reset_property (nmc->client, ss, prop_name, &tmp_err)) {
g_print (_("Error: failed to remove value of '%s': %s\n"), prop_name,
tmp_err->message);
g_clear_error (&tmp_err);

View file

@ -539,40 +539,39 @@ nmc_setting_set_property (NMClient *client, NMSetting *setting, const char *prop
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if ((property_info = nm_meta_property_info_find_by_setting (setting, prop))) {
if (!(property_info = nm_meta_property_info_find_by_setting (setting, prop)))
goto out_fail_read_only;
if (!value) {
/* No value argument sets default value */
nmc_property_set_default_value (setting, prop);
return TRUE;
}
if (property_info->property_type->set_fcn) {
switch (property_info->setting_info->general->meta_type) {
case NM_META_SETTING_TYPE_CONNECTION:
if (nm_streq (property_info->property_name, NM_SETTING_CONNECTION_SECONDARIES)) {
gs_free char *value_coerced = NULL;
if (!_set_fcn_precheck_connection_secondaries (client, value, &value_coerced, error))
return FALSE;
return _set_fcn_call (property_info,
setting,
value_coerced ?: value,
error);
}
break;
default:
break;
}
return _set_fcn_call (property_info,
setting,
value,
error);
}
if (!value) {
/* No value argument sets default value */
nmc_property_set_default_value (setting, prop);
return TRUE;
}
g_set_error_literal (error, 1, 0, _("the property can't be changed"));
if (property_info->property_type->set_fcn) {
gs_free char *value_to_free = NULL;
switch (property_info->setting_info->general->meta_type) {
case NM_META_SETTING_TYPE_CONNECTION:
if (nm_streq (property_info->property_name, NM_SETTING_CONNECTION_SECONDARIES)) {
if (!_set_fcn_precheck_connection_secondaries (client, value, &value_to_free, error))
return FALSE;
if (value_to_free)
value = value_to_free;
}
break;
default:
break;
}
return _set_fcn_call (property_info,
setting,
value,
error);
}
out_fail_read_only:
nm_utils_error_set (error, NM_UTILS_ERROR_UNKNOWN, _("the property can't be changed"));
return FALSE;
}
@ -590,34 +589,6 @@ nmc_property_set_default_value (NMSetting *setting, const char *prop)
}
}
/*
* Generic function for resetting (single value) properties.
*
* The function resets the property value to the default one. It respects
* nmcli restrictions for changing properties. So if 'set_func' is NULL,
* resetting the value is denied.
*
* Returns: TRUE on success; FALSE on failure and sets error
*/
gboolean
nmc_setting_reset_property (NMSetting *setting, const char *prop, GError **error)
{
const NMMetaPropertyInfo *property_info;
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if ((property_info = nm_meta_property_info_find_by_setting (setting, prop))) {
if (property_info->property_type->set_fcn) {
nmc_property_set_default_value (setting, prop);
return TRUE;
}
}
g_set_error_literal (error, 1, 0, _("the property can't be changed"));
return FALSE;
}
gboolean
nmc_setting_remove_property_option (NMSetting *setting,
const char *prop,

View file

@ -47,13 +47,20 @@ gboolean nmc_setting_set_property (NMClient *client,
const char *prop,
const char *val,
GError **error);
gboolean nmc_setting_reset_property (NMSetting *setting,
const char *prop,
GError **error);
static inline gboolean
nmc_setting_reset_property (NMClient *client,
NMSetting *setting,
const char *prop,
GError **error)
{
return nmc_setting_set_property (client, setting, prop, NULL, error);
}
gboolean nmc_setting_remove_property_option (NMSetting *setting,
const char *prop,
const char *value,
GError **error);
void nmc_property_set_default_value (NMSetting *setting, const char *prop);
gboolean nmc_property_get_gvalue (NMSetting *setting, const char *prop, GValue *value);