mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-09 11:48:06 +02:00
libnm: add generic GObject property getter/setter
If we only have simple, direct properties, then we have all the information we need for a generic get_property()/set_property() implmenentation.
This commit is contained in:
parent
f1cb07e438
commit
69db8a462a
3 changed files with 119 additions and 37 deletions
|
|
@ -128,41 +128,6 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void
|
|
||||||
get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
NMSetting6Lowpan * setting = NM_SETTING_6LOWPAN(object);
|
|
||||||
NMSetting6LowpanPrivate *priv = NM_SETTING_6LOWPAN_GET_PRIVATE(setting);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_PARENT:
|
|
||||||
g_value_set_string(value, priv->parent);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
NMSetting6Lowpan * setting = NM_SETTING_6LOWPAN(object);
|
|
||||||
NMSetting6LowpanPrivate *priv = NM_SETTING_6LOWPAN_GET_PRIVATE(setting);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_PARENT:
|
|
||||||
g_free(priv->parent);
|
|
||||||
priv->parent = g_value_dup_string(value);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nm_setting_6lowpan_init(NMSetting6Lowpan *setting)
|
nm_setting_6lowpan_init(NMSetting6Lowpan *setting)
|
||||||
{}
|
{}
|
||||||
|
|
@ -202,8 +167,8 @@ nm_setting_6lowpan_class_init(NMSetting6LowpanClass *klass)
|
||||||
|
|
||||||
g_type_class_add_private(klass, sizeof(NMSetting6LowpanPrivate));
|
g_type_class_add_private(klass, sizeof(NMSetting6LowpanPrivate));
|
||||||
|
|
||||||
object_class->get_property = get_property;
|
object_class->get_property = _nm_setting_property_get_property_direct;
|
||||||
object_class->set_property = set_property;
|
object_class->set_property = _nm_setting_property_set_property_direct;
|
||||||
object_class->finalize = finalize;
|
object_class->finalize = finalize;
|
||||||
|
|
||||||
setting_class->verify = verify;
|
setting_class->verify = verify;
|
||||||
|
|
|
||||||
|
|
@ -301,6 +301,16 @@ gboolean _nm_setting_aggregate(NMSetting *setting, NMConnectionAggregateType typ
|
||||||
|
|
||||||
gboolean _nm_setting_slave_type_is_valid(const char *slave_type, const char **out_port_type);
|
gboolean _nm_setting_slave_type_is_valid(const char *slave_type, const char **out_port_type);
|
||||||
|
|
||||||
|
void _nm_setting_property_get_property_direct(GObject * object,
|
||||||
|
guint prop_id,
|
||||||
|
GValue * value,
|
||||||
|
GParamSpec *pspec);
|
||||||
|
|
||||||
|
void _nm_setting_property_set_property_direct(GObject * object,
|
||||||
|
guint prop_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec * pspec);
|
||||||
|
|
||||||
GVariant *_nm_setting_property_to_dbus_fcn_gprop(const NMSettInfoSetting * sett_info,
|
GVariant *_nm_setting_property_to_dbus_fcn_gprop(const NMSettInfoSetting * sett_info,
|
||||||
guint property_idx,
|
guint property_idx,
|
||||||
NMConnection * connection,
|
NMConnection * connection,
|
||||||
|
|
|
||||||
|
|
@ -623,6 +623,113 @@ _nm_setting_use_legacy_property(NMSetting * setting,
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
|
_nm_setting_property_get_property_direct(GObject * object,
|
||||||
|
guint prop_id,
|
||||||
|
GValue * value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
NMSetting * setting = NM_SETTING(object);
|
||||||
|
const NMSettInfoSetting * sett_info;
|
||||||
|
const NMSettInfoProperty *property_info;
|
||||||
|
|
||||||
|
sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting));
|
||||||
|
nm_assert(sett_info);
|
||||||
|
|
||||||
|
property_info = _nm_sett_info_property_lookup_by_param_spec(sett_info, pspec);
|
||||||
|
if (!property_info)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
|
nm_assert(property_info->param_spec == pspec);
|
||||||
|
|
||||||
|
switch (property_info->property_type->direct_type) {
|
||||||
|
case NM_VALUE_TYPE_BOOL:
|
||||||
|
{
|
||||||
|
const bool *p_val =
|
||||||
|
_nm_setting_get_private(setting, sett_info, property_info->direct_offset);
|
||||||
|
|
||||||
|
g_value_set_boolean(value, *p_val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case NM_VALUE_TYPE_STRING:
|
||||||
|
{
|
||||||
|
const char *const *p_val =
|
||||||
|
_nm_setting_get_private(setting, sett_info, property_info->direct_offset);
|
||||||
|
|
||||||
|
g_value_set_string(value, *p_val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
goto out_fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
out_fail:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_nm_setting_property_set_property_direct(GObject * object,
|
||||||
|
guint prop_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec * pspec)
|
||||||
|
{
|
||||||
|
NMSetting * setting = NM_SETTING(object);
|
||||||
|
const NMSettInfoSetting * sett_info;
|
||||||
|
const NMSettInfoProperty *property_info;
|
||||||
|
|
||||||
|
sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting));
|
||||||
|
nm_assert(sett_info);
|
||||||
|
|
||||||
|
property_info = _nm_sett_info_property_lookup_by_param_spec(sett_info, pspec);
|
||||||
|
if (!property_info)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
|
nm_assert(property_info->param_spec == pspec);
|
||||||
|
|
||||||
|
/* properties with special setters are not yet implemented! */
|
||||||
|
nm_assert(!property_info->direct_has_special_setter);
|
||||||
|
|
||||||
|
switch (property_info->property_type->direct_type) {
|
||||||
|
case NM_VALUE_TYPE_BOOL:
|
||||||
|
{
|
||||||
|
bool * p_val = _nm_setting_get_private(setting, sett_info, property_info->direct_offset);
|
||||||
|
gboolean v;
|
||||||
|
|
||||||
|
v = g_value_get_boolean(value);
|
||||||
|
if (*p_val == v)
|
||||||
|
return;
|
||||||
|
*p_val = v;
|
||||||
|
goto out_notify;
|
||||||
|
}
|
||||||
|
case NM_VALUE_TYPE_STRING:
|
||||||
|
{
|
||||||
|
char **p_val = _nm_setting_get_private(setting, sett_info, property_info->direct_offset);
|
||||||
|
|
||||||
|
if (!nm_utils_strdup_reset(p_val, g_value_get_string(value)))
|
||||||
|
return;
|
||||||
|
goto out_notify;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
goto out_fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
out_notify:
|
||||||
|
/* If explicit-notify would be set, we would need to emit g_object_notify_by_pspec().
|
||||||
|
*
|
||||||
|
* Currently we never set that, also because we still support glib 2.40. */
|
||||||
|
nm_assert(!NM_FLAGS_HAS(pspec->flags, 1 << 30 /* G_PARAM_EXPLICIT_NOTIFY */));
|
||||||
|
return;
|
||||||
|
|
||||||
|
out_fail:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
GVariant *
|
GVariant *
|
||||||
_nm_setting_property_to_dbus_fcn_direct(const NMSettInfoSetting * sett_info,
|
_nm_setting_property_to_dbus_fcn_direct(const NMSettInfoSetting * sett_info,
|
||||||
guint property_idx,
|
guint property_idx,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue