libnm: merge branch 'th/setting-compare-hook'

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/921
This commit is contained in:
Thomas Haller 2021-07-16 13:35:58 +02:00
commit 9fcf532df3
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
30 changed files with 1500 additions and 959 deletions

View file

@ -1090,20 +1090,15 @@ options_equal(NMSettingBond *s_bond, NMSettingBond *s_bond2, NMSettingCompareFla
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_options(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_BOND_OPTIONS)) {
return (!set_b || options_equal(NM_SETTING_BOND(set_a), NM_SETTING_BOND(set_b), flags));
}
return NM_SETTING_CLASS(nm_setting_bond_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return (!set_b || options_equal(NM_SETTING_BOND(set_a), NM_SETTING_BOND(set_b), flags));
}
/*****************************************************************************/
@ -1190,8 +1185,7 @@ nm_setting_bond_class_init(NMSettingBondClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->verify = verify;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
/**
* NMSettingBond:options: (type GHashTable(utf8,utf8)):
@ -1213,9 +1207,16 @@ nm_setting_bond_class_init(NMSettingBondClass *klass)
"",
G_TYPE_HASH_TABLE,
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[PROP_OPTIONS],
&nm_sett_info_propert_type_strdict);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_OPTIONS],
NM_SETT_INFO_PROPERT_TYPE_GPROP(NM_G_VARIANT_TYPE("a{ss}"),
.typdata_from_dbus.gprop_fcn = _nm_utils_strdict_from_dbus,
.typdata_to_dbus.gprop_type =
NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_STRDICT,
.compare_fcn = compare_fcn_options,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/* ---dbus---
* property: interface-name

View file

@ -368,35 +368,19 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_vlans(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingBridgePortPrivate *priv_a;
NMSettingBridgePortPrivate *priv_b;
guint i;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_BRIDGE_PORT_VLANS)) {
if (set_b) {
priv_a = NM_SETTING_BRIDGE_PORT_GET_PRIVATE(set_a);
priv_b = NM_SETTING_BRIDGE_PORT_GET_PRIVATE(set_b);
if (priv_a->vlans->len != priv_b->vlans->len)
return FALSE;
for (i = 0; i < priv_a->vlans->len; i++) {
if (nm_bridge_vlan_cmp(priv_a->vlans->pdata[i], priv_b->vlans->pdata[i]))
return FALSE;
}
}
return TRUE;
if (set_b) {
return _nm_utils_bridge_compare_vlans(NM_SETTING_BRIDGE_PORT_GET_PRIVATE(set_a)->vlans,
NM_SETTING_BRIDGE_PORT_GET_PRIVATE(set_b)->vlans);
}
return NM_SETTING_CLASS(nm_setting_bridge_port_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return TRUE;
}
/*****************************************************************************/
@ -504,8 +488,7 @@ nm_setting_bridge_port_class_init(NMSettingBridgePortClass *klass)
object_class->get_property = get_property;
object_class->set_property = set_property;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->verify = verify;
/**
* NMSettingBridgePort:priority:
@ -604,9 +587,13 @@ nm_setting_bridge_port_class_init(NMSettingBridgePortClass *klass)
G_TYPE_PTR_ARRAY,
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE
| G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[PROP_VLANS],
&nm_sett_info_propert_type_bridge_vlans);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_VLANS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.compare_fcn = compare_fcn_vlans,
.to_dbus_fcn = _nm_utils_bridge_vlans_to_dbus,
.from_dbus_fcn = _nm_utils_bridge_vlans_from_dbus, ));
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -1315,35 +1315,19 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_vlans(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingBridgePrivate *priv_a;
NMSettingBridgePrivate *priv_b;
guint i;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_BRIDGE_VLANS)) {
if (set_b) {
priv_a = NM_SETTING_BRIDGE_GET_PRIVATE(set_a);
priv_b = NM_SETTING_BRIDGE_GET_PRIVATE(set_b);
if (priv_a->vlans->len != priv_b->vlans->len)
return FALSE;
for (i = 0; i < priv_a->vlans->len; i++) {
if (nm_bridge_vlan_cmp(priv_a->vlans->pdata[i], priv_b->vlans->pdata[i]))
return FALSE;
}
}
return TRUE;
if (set_b) {
return _nm_utils_bridge_compare_vlans(NM_SETTING_BRIDGE_GET_PRIVATE(set_a)->vlans,
NM_SETTING_BRIDGE_GET_PRIVATE(set_b)->vlans);
}
return NM_SETTING_CLASS(nm_setting_bridge_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return TRUE;
}
/*****************************************************************************/
@ -1611,8 +1595,7 @@ nm_setting_bridge_class_init(NMSettingBridgeClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->verify = verify;
/**
* NMSettingBridge:mac-address:
@ -1914,9 +1897,13 @@ nm_setting_bridge_class_init(NMSettingBridgeClass *klass)
G_TYPE_PTR_ARRAY,
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE
| G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[PROP_VLANS],
&nm_sett_info_propert_type_bridge_vlans);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_VLANS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = _nm_utils_bridge_vlans_to_dbus,
.compare_fcn = compare_fcn_vlans,
.from_dbus_fcn = _nm_utils_bridge_vlans_from_dbus, ));
/* ---dbus---
* property: interface-name

View file

@ -622,7 +622,7 @@ nm_setting_connection_get_timestamp(NMSettingConnection *setting)
static GVariant *
_to_dbus_fcn_timestamp(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -1558,24 +1558,45 @@ nm_setting_connection_no_interface_name(NMSetting * setting,
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_id(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_ID)
&& nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_CONNECTION_ID))
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_ID))
return NM_TERNARY_DEFAULT;
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_TIMESTAMP)
&& nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_CONNECTION_TIMESTAMP))
return _nm_setting_property_compare_fcn_direct(sett_info,
property_info,
con_a,
set_a,
con_b,
set_b,
flags);
}
static NMTernary
compare_fcn_timestamp(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_TIMESTAMP))
return NM_TERNARY_DEFAULT;
return NM_SETTING_CLASS(nm_setting_connection_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return _nm_setting_property_compare_fcn_default(sett_info,
property_info,
con_a,
set_a,
con_b,
set_b,
flags);
}
/*****************************************************************************/
@ -1856,8 +1877,7 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->verify = verify;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
/**
* NMSettingConnection:id:
@ -1871,13 +1891,21 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
* description: User friendly name for the connection profile.
* ---end---
*/
_nm_setting_property_define_direct_string(properties_override,
obj_properties,
NM_SETTING_CONNECTION_ID,
PROP_ID,
NM_SETTING_PARAM_FUZZY_IGNORE,
NMSettingConnectionPrivate,
id);
_nm_setting_property_define_direct_string_full(
properties_override,
obj_properties,
NM_SETTING_CONNECTION_ID,
PROP_ID,
NM_SETTING_PARAM_FUZZY_IGNORE,
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_STRING,
.direct_type = NM_VALUE_TYPE_STRING,
.compare_fcn = compare_fcn_id,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE),
NMSettingConnectionPrivate,
id);
/**
* NMSettingConnection:uuid:
@ -1996,9 +2024,12 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
NM_SETTING_PARAM_INFERRABLE,
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_STRING,
.direct_type = NM_VALUE_TYPE_STRING,
.compare_fcn = _nm_setting_property_compare_fcn_direct,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct,
.missing_from_dbus_fcn =
nm_setting_connection_no_interface_name),
nm_setting_connection_no_interface_name,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE),
NMSettingConnectionPrivate,
interface_name);
@ -2196,7 +2227,10 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
properties_override,
obj_properties[PROP_TIMESTAMP],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_UINT64,
.to_dbus_fcn = _to_dbus_fcn_timestamp, ));
.compare_fcn = compare_fcn_timestamp,
.to_dbus_fcn = _to_dbus_fcn_timestamp,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/**
* NMSettingConnection:read-only:

View file

@ -757,8 +757,11 @@ _nm_setting_dcb_uint_array_from_dbus(GVariant *dbus_value, GValue *prop_value)
static const NMSettInfoPropertType nm_sett_info_propert_type_dcb_au =
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(
NM_G_VARIANT_TYPE("au"),
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_GARRAY_UINT,
.gprop_from_dbus_fcn = _nm_setting_dcb_uint_array_from_dbus, );
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_GARRAY_UINT,
.typdata_from_dbus.gprop_fcn = _nm_setting_dcb_uint_array_from_dbus,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
/*****************************************************************************/

View file

@ -4101,6 +4101,12 @@ nm_setting_ip_config_clear_dns(NMSettingIPConfig *setting)
}
}
GPtrArray *
_nm_setting_ip_config_get_dns_array(NMSettingIPConfig *setting)
{
return NM_SETTING_IP_CONFIG_GET_PRIVATE(setting)->dns;
}
/**
* nm_setting_ip_config_get_num_dns_searches:
* @setting: the #NMSettingIPConfig
@ -4944,7 +4950,7 @@ nm_setting_ip_config_clear_routing_rules(NMSettingIPConfig *setting)
static GVariant *
_routing_rules_dbus_only_synth(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -4979,12 +4985,13 @@ _routing_rules_dbus_only_synth(const NMSettInfoSetting * sett_info
}
static gboolean
_routing_rules_dbus_only_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
_routing_rules_dbus_only_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GVariantIter iter_rules;
GVariant * rule_var;
@ -5619,77 +5626,95 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
return TRUE;
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
NMTernary
_nm_setting_ip_config_compare_fcn_addresses(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingIPConfigPrivate *a_priv;
NMSettingIPConfigPrivate *b_priv;
guint i;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_IP_CONFIG_ADDRESSES)) {
if (set_b) {
a_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_a);
b_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_b);
if (set_b) {
a_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_a);
b_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_b);
if (a_priv->addresses->len != b_priv->addresses->len)
if (a_priv->addresses->len != b_priv->addresses->len)
return FALSE;
for (i = 0; i < a_priv->addresses->len; i++) {
if (nm_ip_address_cmp_full(a_priv->addresses->pdata[i],
b_priv->addresses->pdata[i],
NM_IP_ADDRESS_CMP_FLAGS_WITH_ATTRS)
!= 0)
return FALSE;
for (i = 0; i < a_priv->addresses->len; i++) {
if (nm_ip_address_cmp_full(a_priv->addresses->pdata[i],
b_priv->addresses->pdata[i],
NM_IP_ADDRESS_CMP_FLAGS_WITH_ATTRS)
!= 0)
return FALSE;
}
}
return TRUE;
}
return TRUE;
}
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_IP_CONFIG_ROUTES)) {
if (set_b) {
a_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_a);
b_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_b);
NMTernary
_nm_setting_ip_config_compare_fcn_routes(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingIPConfigPrivate *a_priv;
NMSettingIPConfigPrivate *b_priv;
guint i;
if (a_priv->routes->len != b_priv->routes->len)
if (set_b) {
a_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_a);
b_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_b);
if (a_priv->routes->len != b_priv->routes->len)
return FALSE;
for (i = 0; i < a_priv->routes->len; i++) {
if (!nm_ip_route_equal_full(a_priv->routes->pdata[i],
b_priv->routes->pdata[i],
NM_IP_ROUTE_EQUAL_CMP_FLAGS_WITH_ATTRS))
return FALSE;
for (i = 0; i < a_priv->routes->len; i++) {
if (!nm_ip_route_equal_full(a_priv->routes->pdata[i],
b_priv->routes->pdata[i],
NM_IP_ROUTE_EQUAL_CMP_FLAGS_WITH_ATTRS))
return FALSE;
}
}
return TRUE;
}
return TRUE;
}
if (nm_streq(sett_info->property_infos[property_idx].name,
NM_SETTING_IP_CONFIG_ROUTING_RULES)) {
if (set_b) {
guint n;
static NMTernary
compare_fcn_routing_rules(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingIPConfigPrivate *a_priv;
NMSettingIPConfigPrivate *b_priv;
guint i;
a_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_a);
b_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_b);
if (set_b) {
guint n;
n = (a_priv->routing_rules) ? a_priv->routing_rules->len : 0u;
if (n != (b_priv->routing_rules ? b_priv->routing_rules->len : 0u))
a_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_a);
b_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(set_b);
n = (a_priv->routing_rules) ? a_priv->routing_rules->len : 0u;
if (n != (b_priv->routing_rules ? b_priv->routing_rules->len : 0u))
return FALSE;
for (i = 0; i < n; i++) {
if (nm_ip_routing_rule_cmp(a_priv->routing_rules->pdata[i],
b_priv->routing_rules->pdata[i])
!= 0)
return FALSE;
for (i = 0; i < n; i++) {
if (nm_ip_routing_rule_cmp(a_priv->routing_rules->pdata[i],
b_priv->routing_rules->pdata[i])
!= 0)
return FALSE;
}
}
return TRUE;
}
return NM_SETTING_CLASS(nm_setting_ip_config_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return TRUE;
}
static void
@ -5751,12 +5776,13 @@ enumerate_values(const NMSettInfoProperty *property_info,
/*****************************************************************************/
static gboolean
ip_gateway_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip_gateway_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
/* FIXME: properly handle errors */
@ -5764,7 +5790,7 @@ ip_gateway_set(NMSetting * setting,
if (_nm_setting_use_legacy_property(setting, connection_dict, "addresses", "gateway"))
return TRUE;
g_object_set(setting, property, g_variant_get_string(value, NULL), NULL);
g_object_set(setting, property_info->name, g_variant_get_string(value, NULL), NULL);
return TRUE;
}
@ -5784,6 +5810,7 @@ _nm_sett_info_property_override_create_array_ip_config(void)
obj_properties[PROP_GATEWAY],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_STRING,
.direct_type = NM_VALUE_TYPE_STRING,
.compare_fcn = _nm_setting_property_compare_fcn_direct,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct,
.from_dbus_fcn = ip_gateway_set),
.direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, gateway),
@ -5814,6 +5841,7 @@ _nm_sett_info_property_override_create_array_ip_config(void)
NM_SETTING_IP_CONFIG_ROUTING_RULES,
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = _routing_rules_dbus_only_synth,
.compare_fcn = compare_fcn_routing_rules,
.from_dbus_fcn = _routing_rules_dbus_only_set, ));
_nm_properties_override_gobj(
@ -6113,7 +6141,6 @@ nm_setting_ip_config_class_init(NMSettingIPConfigClass *klass)
object_class->finalize = finalize;
setting_class->verify = verify;
setting_class->compare_property = compare_property;
setting_class->duplicate_copy_properties = duplicate_copy_properties;
setting_class->enumerate_values = enumerate_values;

View file

@ -8,6 +8,7 @@
#include "nm-setting-ip4-config.h"
#include "nm-setting-private.h"
#include "nm-utils-private.h"
/**
* SECTION:nm-setting-ip4-config
@ -321,9 +322,21 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static GVariant *
ip4_dns_to_dbus(const GValue *prop_value)
ip4_dns_to_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options)
{
return nm_utils_ip4_dns_to_variant(g_value_get_boxed(prop_value));
GPtrArray *dns;
dns = _nm_setting_ip_config_get_dns_array(NM_SETTING_IP_CONFIG(setting));
if (nm_g_ptr_array_len(dns) == 0)
return NULL;
return _nm_utils_ip4_dns_to_variant((const char *const *) dns->pdata, dns->len);
}
static void
@ -334,7 +347,7 @@ ip4_dns_from_dbus(GVariant *dbus_value, GValue *prop_value)
static GVariant *
ip4_addresses_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -349,12 +362,13 @@ ip4_addresses_get(const NMSettInfoSetting * sett_info,
}
static gboolean
ip4_addresses_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip4_addresses_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *addrs;
GVariant * s_ip4;
@ -394,7 +408,7 @@ ip4_addresses_set(NMSetting * setting,
static GVariant *
ip4_address_labels_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -438,7 +452,7 @@ ip4_address_labels_get(const NMSettInfoSetting * sett_info,
static GVariant *
ip4_address_data_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -454,12 +468,13 @@ ip4_address_data_get(const NMSettInfoSetting * sett_info,
}
static gboolean
ip4_address_data_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip4_address_data_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *addrs;
@ -477,7 +492,7 @@ ip4_address_data_set(NMSetting * setting,
static GVariant *
ip4_routes_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -490,12 +505,13 @@ ip4_routes_get(const NMSettInfoSetting * sett_info,
}
static gboolean
ip4_routes_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip4_routes_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *routes;
@ -505,14 +521,14 @@ ip4_routes_set(NMSetting * setting,
return TRUE;
routes = nm_utils_ip4_routes_from_variant(value);
g_object_set(setting, property, routes, NULL);
g_object_set(setting, property_info->name, routes, NULL);
g_ptr_array_unref(routes);
return TRUE;
}
static GVariant *
ip4_route_data_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -528,12 +544,13 @@ ip4_route_data_get(const NMSettInfoSetting * sett_info,
}
static gboolean
ip4_route_data_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip4_route_data_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *routes;
@ -955,9 +972,12 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
_nm_properties_override_gobj(
properties_override,
g_object_class_find_property(G_OBJECT_CLASS(setting_class), NM_SETTING_IP_CONFIG_DNS),
NM_SETT_INFO_PROPERT_TYPE_GPROP(NM_G_VARIANT_TYPE("au"),
.gprop_from_dbus_fcn = ip4_dns_from_dbus, ),
.to_dbus_data.gprop_to_dbus_fcn = ip4_dns_to_dbus);
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("au"),
.compare_fcn = _nm_setting_property_compare_fcn_default,
.to_dbus_fcn = ip4_dns_to_dbus,
.typdata_from_dbus.gprop_fcn = ip4_dns_from_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE), );
/* ---dbus---
* property: addresses
@ -986,12 +1006,14 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
g_object_class_find_property(G_OBJECT_CLASS(setting_class), NM_SETTING_IP_CONFIG_ADDRESSES),
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aau"),
.to_dbus_fcn = ip4_addresses_get,
.compare_fcn = _nm_setting_ip_config_compare_fcn_addresses,
.from_dbus_fcn = ip4_addresses_set, ));
_nm_properties_override_dbus(
properties_override,
"address-labels",
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_STRING_ARRAY,
.to_dbus_fcn = ip4_address_labels_get, ));
.to_dbus_fcn = ip4_address_labels_get,
.compare_fcn = _nm_setting_property_compare_fcn_ignore, ));
/* ---dbus---
* property: address-data
@ -1007,6 +1029,7 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
"address-data",
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = ip4_address_data_get,
.compare_fcn = _nm_setting_property_compare_fcn_ignore,
.from_dbus_fcn = ip4_address_data_set, ));
/* ---dbus---
@ -1040,6 +1063,7 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
g_object_class_find_property(G_OBJECT_CLASS(setting_class), NM_SETTING_IP_CONFIG_ROUTES),
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aau"),
.to_dbus_fcn = ip4_routes_get,
.compare_fcn = _nm_setting_ip_config_compare_fcn_routes,
.from_dbus_fcn = ip4_routes_set, ));
/* ---dbus---
@ -1060,6 +1084,7 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
"route-data",
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = ip4_route_data_get,
.compare_fcn = _nm_setting_property_compare_fcn_ignore,
.from_dbus_fcn = ip4_route_data_set, ));
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -10,6 +10,7 @@
#include <arpa/inet.h>
#include "nm-setting-private.h"
#include "nm-utils-private.h"
#include "nm-core-enum-types.h"
#include "libnm-core-intern/nm-core-internal.h"
@ -362,9 +363,21 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static GVariant *
ip6_dns_to_dbus(const GValue *prop_value)
ip6_dns_to_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options)
{
return nm_utils_ip6_dns_to_variant(g_value_get_boxed(prop_value));
GPtrArray *dns;
dns = _nm_setting_ip_config_get_dns_array(NM_SETTING_IP_CONFIG(setting));
if (nm_g_ptr_array_len(dns) == 0)
return NULL;
return _nm_utils_ip6_dns_to_variant((const char *const *) dns->pdata, dns->len);
}
static void
@ -375,7 +388,7 @@ ip6_dns_from_dbus(GVariant *dbus_value, GValue *prop_value)
static GVariant *
ip6_addresses_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -390,12 +403,13 @@ ip6_addresses_get(const NMSettInfoSetting * sett_info,
}
static gboolean
ip6_addresses_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip6_addresses_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *addrs;
char * gateway = NULL;
@ -420,7 +434,7 @@ ip6_addresses_set(NMSetting * setting,
static GVariant *
ip6_address_data_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -436,12 +450,13 @@ ip6_address_data_get(const NMSettInfoSetting * sett_info,
}
static gboolean
ip6_address_data_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip6_address_data_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *addrs;
@ -459,7 +474,7 @@ ip6_address_data_set(NMSetting * setting,
static GVariant *
ip6_routes_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -472,12 +487,13 @@ ip6_routes_get(const NMSettInfoSetting * sett_info,
}
static gboolean
ip6_routes_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip6_routes_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *routes;
@ -487,14 +503,14 @@ ip6_routes_set(NMSetting * setting,
return TRUE;
routes = nm_utils_ip6_routes_from_variant(value);
g_object_set(setting, property, routes, NULL);
g_object_set(setting, property_info->name, routes, NULL);
g_ptr_array_unref(routes);
return TRUE;
}
static GVariant *
ip6_route_data_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -510,12 +526,13 @@ ip6_route_data_get(const NMSettInfoSetting * sett_info,
}
static gboolean
ip6_route_data_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
ip6_route_data_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *routes;
@ -1021,9 +1038,12 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
_nm_properties_override_gobj(
properties_override,
g_object_class_find_property(G_OBJECT_CLASS(setting_class), NM_SETTING_IP_CONFIG_DNS),
NM_SETT_INFO_PROPERT_TYPE_GPROP(NM_G_VARIANT_TYPE("aay"),
.gprop_from_dbus_fcn = ip6_dns_from_dbus, ),
.to_dbus_data.gprop_to_dbus_fcn = ip6_dns_to_dbus);
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aay"),
.compare_fcn = _nm_setting_property_compare_fcn_default,
.to_dbus_fcn = ip6_dns_to_dbus,
.typdata_from_dbus.gprop_fcn = ip6_dns_from_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/* ---dbus---
* property: addresses
@ -1044,6 +1064,7 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
g_object_class_find_property(G_OBJECT_CLASS(setting_class), NM_SETTING_IP_CONFIG_ADDRESSES),
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("a(ayuay)"),
.to_dbus_fcn = ip6_addresses_get,
.compare_fcn = _nm_setting_ip_config_compare_fcn_addresses,
.from_dbus_fcn = ip6_addresses_set, ));
/* ---dbus---
@ -1060,6 +1081,7 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
"address-data",
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = ip6_address_data_get,
.compare_fcn = _nm_setting_property_compare_fcn_ignore,
.from_dbus_fcn = ip6_address_data_set, ));
/* ---dbus---
@ -1081,6 +1103,7 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
g_object_class_find_property(G_OBJECT_CLASS(setting_class), NM_SETTING_IP_CONFIG_ROUTES),
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("a(ayuayu)"),
.to_dbus_fcn = ip6_routes_get,
.compare_fcn = _nm_setting_ip_config_compare_fcn_routes,
.from_dbus_fcn = ip6_routes_set, ));
/* ---dbus---
@ -1101,6 +1124,7 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
"route-data",
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = ip6_route_data_get,
.compare_fcn = _nm_setting_property_compare_fcn_ignore,
.from_dbus_fcn = ip6_route_data_set, ));
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -387,31 +387,26 @@ connection_type_is_good:
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_data(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingOvsExternalIDsPrivate *priv;
NMSettingOvsExternalIDsPrivate *pri2;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_OVS_EXTERNAL_IDS_DATA)) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
if (!set_b)
return TRUE;
priv = NM_SETTING_OVS_EXTERNAL_IDS_GET_PRIVATE(NM_SETTING_OVS_EXTERNAL_IDS(set_a));
pri2 = NM_SETTING_OVS_EXTERNAL_IDS_GET_PRIVATE(NM_SETTING_OVS_EXTERNAL_IDS(set_b));
return nm_utils_hashtable_equal(priv->data, pri2->data, TRUE, g_str_equal);
}
return NM_SETTING_CLASS(nm_setting_ovs_external_ids_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
priv = NM_SETTING_OVS_EXTERNAL_IDS_GET_PRIVATE(NM_SETTING_OVS_EXTERNAL_IDS(set_a));
pri2 = NM_SETTING_OVS_EXTERNAL_IDS_GET_PRIVATE(NM_SETTING_OVS_EXTERNAL_IDS(set_b));
return nm_utils_hashtable_equal(priv->data, pri2->data, TRUE, g_str_equal);
}
/*****************************************************************************/
@ -523,8 +518,7 @@ nm_setting_ovs_external_ids_class_init(NMSettingOvsExternalIDsClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->verify = verify;
/**
* NMSettingOvsExternalIDs:data: (type GHashTable(utf8,utf8))
@ -538,9 +532,16 @@ nm_setting_ovs_external_ids_class_init(NMSettingOvsExternalIDsClass *klass)
"",
G_TYPE_HASH_TABLE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[PROP_DATA],
&nm_sett_info_propert_type_strdict);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_DATA],
NM_SETT_INFO_PROPERT_TYPE_GPROP(NM_G_VARIANT_TYPE("a{ss}"),
.typdata_from_dbus.gprop_fcn = _nm_utils_strdict_from_dbus,
.typdata_to_dbus.gprop_type =
NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_STRDICT,
.compare_fcn = compare_fcn_data,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -70,24 +70,12 @@ struct _NMSettingClass {
GError ** error);
gboolean (*clear_secrets)(const struct _NMSettInfoSetting *sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMSetting * setting,
NMSettingClearSecretsWithFlagsFn func,
gpointer user_data);
/* compare_property() returns a ternary, where DEFAULT means that the property should not
* be compared due to the compare @flags. A TRUE/FALSE result means that the property is
* equal/not-equal.
*
* @other may be %NULL, in which case the function only determines whether
* the setting should be compared (TRUE) or not (DEFAULT). */
NMTernary (*compare_property)(const struct _NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags);
void (*padding_1)(void);
void (*duplicate_copy_properties)(const struct _NMSettInfoSetting *sett_info,
NMSetting * src,
@ -292,6 +280,7 @@ gboolean _nm_setting_clear_secrets(NMSetting * setting,
*/
#define NM_SETTING_PARAM_TO_DBUS_IGNORE_FLAGS (1 << (7 + G_PARAM_USER_SHIFT))
extern const NMSettInfoPropertType nm_sett_info_propert_type_setting_name;
extern const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_interface_name;
extern const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_i;
extern const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_u;
@ -315,6 +304,35 @@ 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_compare_flags_check(const GParamSpec * param_spec,
NMSettingCompareFlags flags,
NMSetting * set_a,
NMSetting * set_b);
NMTernary _nm_setting_property_compare_fcn_ignore(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags);
NMTernary _nm_setting_property_compare_fcn_direct(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags);
NMTernary _nm_setting_property_compare_fcn_default(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags);
void _nm_setting_property_get_property_direct(GObject * object,
guint prop_id,
GValue * value,
@ -325,20 +343,43 @@ void _nm_setting_property_set_property_direct(GObject * object,
const GValue *value,
GParamSpec * pspec);
GVariant *_nm_setting_property_to_dbus_fcn_ignore(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options);
GVariant *_nm_setting_property_to_dbus_fcn_gprop(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options);
GVariant *_nm_setting_property_to_dbus_fcn_direct(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options);
gboolean _nm_setting_property_from_dbus_fcn_ignore(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error);
gboolean _nm_setting_property_from_dbus_fcn_gprop(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error);
GVariant *_nm_setting_to_dbus(NMSetting * setting,
NMConnection * connection,
NMConnectionSerializationFlags flags,
@ -397,11 +438,10 @@ void _nm_setting_class_commit(NMSettingClass * setting_class,
.dbus_type = _dbus_type, __VA_ARGS__ \
}
#define NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(_dbus_type, ...) \
{ \
.dbus_type = _dbus_type, .to_dbus_fcn = _nm_setting_property_to_dbus_fcn_gprop, \
__VA_ARGS__ \
}
#define NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(_dbus_type, ...) \
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(_dbus_type, \
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_gprop, \
__VA_ARGS__)
#define NM_SETT_INFO_PROPERT_TYPE(init) \
({ \
@ -620,6 +660,58 @@ gboolean _nm_setting_should_compare_secret_property(NMSetting * settin
NMBridgeVlan *_nm_bridge_vlan_dup(const NMBridgeVlan *vlan);
NMBridgeVlan *_nm_bridge_vlan_dup_and_seal(const NMBridgeVlan *vlan);
gboolean _nm_utils_bridge_vlans_from_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error);
GVariant *_nm_utils_bridge_vlans_to_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options);
NMTernary _nm_setting_ip_config_compare_fcn_addresses(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags);
NMTernary _nm_setting_ip_config_compare_fcn_routes(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags);
gboolean _nm_utils_hwaddr_cloned_not_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
NMSettingParseFlags parse_flags,
GError ** error);
GVariant *_nm_utils_hwaddr_cloned_get(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options);
gboolean _nm_utils_hwaddr_cloned_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error);
/*****************************************************************************/
#endif /* NM_SETTING_PRIVATE_H */

View file

@ -130,16 +130,23 @@ nm_setting_serial_get_send_delay(NMSettingSerial *setting)
}
static GVariant *
parity_to_dbus(const GValue *from)
parity_to_dbus_fcn(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options)
{
switch (g_value_get_enum(from)) {
switch (nm_setting_serial_get_parity(NM_SETTING_SERIAL(setting))) {
case NM_SETTING_SERIAL_PARITY_EVEN:
return g_variant_new_byte('E');
case NM_SETTING_SERIAL_PARITY_ODD:
return g_variant_new_byte('o');
case NM_SETTING_SERIAL_PARITY_NONE:
/* the default, serializes to NULL. */
return NULL;
default:
return g_variant_new_byte('n');
return NULL;
}
}
@ -311,9 +318,12 @@ nm_setting_serial_class_init(NMSettingSerialClass *klass)
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_PARITY],
NM_SETT_INFO_PROPERT_TYPE_GPROP(G_VARIANT_TYPE_BYTE,
.gprop_from_dbus_fcn = parity_from_dbus, ),
.to_dbus_data.gprop_to_dbus_fcn = parity_to_dbus, );
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_BYTE,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.to_dbus_fcn = parity_to_dbus_fcn,
.typdata_from_dbus.gprop_fcn = parity_from_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/**
* NMSettingSerial:stopbits:

View file

@ -876,7 +876,7 @@ _nm_setting_sriov_sort_vfs(NMSettingSriov *setting)
static GVariant *
vfs_to_dbus(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -956,12 +956,13 @@ vfs_to_dbus(const NMSettInfoSetting * sett_info,
}
static gboolean
vfs_from_dbus(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
vfs_from_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray * vfs;
GVariantIter vf_iter;
@ -1119,35 +1120,30 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_vfs(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingSriov *a;
NMSettingSriov *b;
guint i;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_SRIOV_VFS)) {
if (set_b) {
a = NM_SETTING_SRIOV(set_a);
b = NM_SETTING_SRIOV(set_b);
if (set_b) {
a = NM_SETTING_SRIOV(set_a);
b = NM_SETTING_SRIOV(set_b);
if (a->vfs->len != b->vfs->len)
if (a->vfs->len != b->vfs->len)
return FALSE;
for (i = 0; i < a->vfs->len; i++) {
if (!nm_sriov_vf_equal(a->vfs->pdata[i], b->vfs->pdata[i]))
return FALSE;
for (i = 0; i < a->vfs->len; i++) {
if (!nm_sriov_vf_equal(a->vfs->pdata[i], b->vfs->pdata[i]))
return FALSE;
}
}
return TRUE;
}
return NM_SETTING_CLASS(nm_setting_sriov_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return TRUE;
}
/*****************************************************************************/
@ -1246,8 +1242,7 @@ nm_setting_sriov_class_init(NMSettingSriovClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->verify = verify;
/**
* NMSettingSriov:total-vfs
@ -1327,6 +1322,7 @@ nm_setting_sriov_class_init(NMSettingSriovClass *klass)
obj_properties[PROP_VFS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = vfs_to_dbus,
.compare_fcn = compare_fcn_vfs,
.from_dbus_fcn = vfs_from_dbus, ));
/**

View file

@ -1314,46 +1314,52 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_qdiscs(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingTCConfig *a_tc_config = NM_SETTING_TC_CONFIG(set_a);
NMSettingTCConfig *b_tc_config = NM_SETTING_TC_CONFIG(set_b);
guint i;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_TC_CONFIG_QDISCS)) {
if (set_b) {
if (a_tc_config->qdiscs->len != b_tc_config->qdiscs->len)
if (set_b) {
if (a_tc_config->qdiscs->len != b_tc_config->qdiscs->len)
return FALSE;
for (i = 0; i < a_tc_config->qdiscs->len; i++) {
if (!nm_tc_qdisc_equal(a_tc_config->qdiscs->pdata[i], b_tc_config->qdiscs->pdata[i]))
return FALSE;
for (i = 0; i < a_tc_config->qdiscs->len; i++) {
if (!nm_tc_qdisc_equal(a_tc_config->qdiscs->pdata[i],
b_tc_config->qdiscs->pdata[i]))
return FALSE;
}
}
return TRUE;
}
return TRUE;
}
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_TC_CONFIG_TFILTERS)) {
if (set_b) {
if (a_tc_config->tfilters->len != b_tc_config->tfilters->len)
static NMTernary
compare_fcn_tfilter(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingTCConfig *a_tc_config = NM_SETTING_TC_CONFIG(set_a);
NMSettingTCConfig *b_tc_config = NM_SETTING_TC_CONFIG(set_b);
guint i;
if (set_b) {
if (a_tc_config->tfilters->len != b_tc_config->tfilters->len)
return FALSE;
for (i = 0; i < a_tc_config->tfilters->len; i++) {
if (!nm_tc_tfilter_equal(a_tc_config->tfilters->pdata[i],
b_tc_config->tfilters->pdata[i]))
return FALSE;
for (i = 0; i < a_tc_config->tfilters->len; i++) {
if (!nm_tc_tfilter_equal(a_tc_config->tfilters->pdata[i],
b_tc_config->tfilters->pdata[i]))
return FALSE;
}
}
return TRUE;
}
return NM_SETTING_CLASS(nm_setting_tc_config_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return TRUE;
}
/**
@ -1482,7 +1488,7 @@ next:
static GVariant *
tc_qdiscs_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -1495,12 +1501,13 @@ tc_qdiscs_get(const NMSettInfoSetting * sett_info,
}
static gboolean
tc_qdiscs_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
tc_qdiscs_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GPtrArray *qdiscs;
@ -1680,7 +1687,7 @@ next:
static GVariant *
tc_tfilters_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -1693,12 +1700,13 @@ tc_tfilters_get(const NMSettInfoSetting * sett_info,
}
static gboolean
tc_tfilters_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
tc_tfilters_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
gs_unref_ptrarray GPtrArray *tfilters = NULL;
@ -1803,8 +1811,7 @@ nm_setting_tc_config_class_init(NMSettingTCConfigClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->verify = verify;
/**
* NMSettingTCConfig:qdiscs: (type GPtrArray(NMTCQdisc))
@ -2116,6 +2123,7 @@ nm_setting_tc_config_class_init(NMSettingTCConfigClass *klass)
obj_properties[PROP_QDISCS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = tc_qdiscs_get,
.compare_fcn = compare_fcn_qdiscs,
.from_dbus_fcn = tc_qdiscs_set, ));
/**
@ -2254,6 +2262,7 @@ nm_setting_tc_config_class_init(NMSettingTCConfigClass *klass)
obj_properties[PROP_TFILTERS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = tc_tfilters_get,
.compare_fcn = compare_fcn_tfilter,
.from_dbus_fcn = tc_tfilters_set, ));
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -350,52 +350,57 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_link_watchers(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingTeamPortPrivate *a_priv;
NMSettingTeamPortPrivate *b_priv;
if (nm_streq(sett_info->property_infos[property_idx].name,
NM_SETTING_TEAM_PORT_LINK_WATCHERS)) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
a_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE(set_a);
b_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE(set_b);
return nm_team_link_watchers_equal(a_priv->team_setting->d.link_watchers,
b_priv->team_setting->d.link_watchers,
TRUE);
}
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
a_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE(set_a);
b_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE(set_b);
return nm_team_link_watchers_equal(a_priv->team_setting->d.link_watchers,
b_priv->team_setting->d.link_watchers,
TRUE);
}
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_TEAM_PORT_CONFIG)) {
if (set_b) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE)) {
/* If we are trying to match a connection in order to assume it (and thus
static NMTernary
compare_fcn_config(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingTeamPortPrivate *a_priv;
NMSettingTeamPortPrivate *b_priv;
if (set_b) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE)) {
/* If we are trying to match a connection in order to assume it (and thus
* @flags contains INFERRABLE), use the "relaxed" matching for team
* configuration. Otherwise, for all other purposes (including connection
* comparison before an update), resort to the default string comparison. */
return TRUE;
}
a_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE(set_a);
b_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE(set_b);
return nm_streq0(nm_team_setting_config_get(a_priv->team_setting),
nm_team_setting_config_get(b_priv->team_setting));
return TRUE;
}
return TRUE;
a_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE(set_a);
b_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE(set_b);
return nm_streq0(nm_team_setting_config_get(a_priv->team_setting),
nm_team_setting_config_get(b_priv->team_setting));
}
return NM_SETTING_CLASS(nm_setting_team_port_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return TRUE;
}
static void
@ -545,7 +550,6 @@ nm_setting_team_port_class_init(NMSettingTeamPortClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->duplicate_copy_properties = duplicate_copy_properties;
setting_class->init_from_dbus = init_from_dbus;
@ -570,9 +574,14 @@ nm_setting_team_port_class_init(NMSettingTeamPortClass *klass)
"",
NULL,
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[NM_TEAM_ATTRIBUTE_CONFIG],
&nm_sett_info_propert_type_team_s);
_nm_properties_override_gobj(
properties_override,
obj_properties[NM_TEAM_ATTRIBUTE_CONFIG],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_STRING,
.compare_fcn = compare_fcn_config,
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/**
* NMSettingTeamPort:queue-id:
@ -688,9 +697,16 @@ nm_setting_team_port_class_init(NMSettingTeamPortClass *klass)
"",
G_TYPE_PTR_ARRAY,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[NM_TEAM_ATTRIBUTE_LINK_WATCHERS],
&nm_sett_info_propert_type_team_link_watchers);
_nm_properties_override_gobj(
properties_override,
obj_properties[NM_TEAM_ATTRIBUTE_LINK_WATCHERS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.compare_fcn = compare_fcn_link_watchers,
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.typdata_from_dbus.gprop_fcn =
_nm_team_settings_property_from_dbus_link_watchers,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
g_object_class_install_properties(object_class, G_N_ELEMENTS(obj_properties), obj_properties);

View file

@ -1275,50 +1275,57 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_link_watchers(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingTeamPrivate *a_priv, *b_priv;
NMSettingTeamPrivate *a_priv;
NMSettingTeamPrivate *b_priv;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_TEAM_LINK_WATCHERS)) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
a_priv = NM_SETTING_TEAM_GET_PRIVATE(set_a);
b_priv = NM_SETTING_TEAM_GET_PRIVATE(set_b);
return nm_team_link_watchers_equal(a_priv->team_setting->d.link_watchers,
b_priv->team_setting->d.link_watchers,
TRUE);
}
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
a_priv = NM_SETTING_TEAM_GET_PRIVATE(set_a);
b_priv = NM_SETTING_TEAM_GET_PRIVATE(set_b);
return nm_team_link_watchers_equal(a_priv->team_setting->d.link_watchers,
b_priv->team_setting->d.link_watchers,
TRUE);
}
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_TEAM_CONFIG)) {
if (set_b) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE)) {
/* If we are trying to match a connection in order to assume it (and thus
static NMTernary
compare_fcn_config(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingTeamPrivate *a_priv;
NMSettingTeamPrivate *b_priv;
if (set_b) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE)) {
/* If we are trying to match a connection in order to assume it (and thus
* @flags contains INFERRABLE), use the "relaxed" matching for team
* configuration. Otherwise, for all other purposes (including connection
* comparison before an update), resort to the default string comparison. */
return TRUE;
}
a_priv = NM_SETTING_TEAM_GET_PRIVATE(set_a);
b_priv = NM_SETTING_TEAM_GET_PRIVATE(set_b);
return nm_streq0(nm_team_setting_config_get(a_priv->team_setting),
nm_team_setting_config_get(b_priv->team_setting));
return TRUE;
}
return TRUE;
a_priv = NM_SETTING_TEAM_GET_PRIVATE(set_a);
b_priv = NM_SETTING_TEAM_GET_PRIVATE(set_b);
return nm_streq0(nm_team_setting_config_get(a_priv->team_setting),
nm_team_setting_config_get(b_priv->team_setting));
}
return NM_SETTING_CLASS(nm_setting_team_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return TRUE;
}
static void
@ -1505,7 +1512,6 @@ nm_setting_team_class_init(NMSettingTeamClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->duplicate_copy_properties = duplicate_copy_properties;
setting_class->init_from_dbus = init_from_dbus;
@ -1530,9 +1536,14 @@ nm_setting_team_class_init(NMSettingTeamClass *klass)
"",
NULL,
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[NM_TEAM_ATTRIBUTE_CONFIG],
&nm_sett_info_propert_type_team_s);
_nm_properties_override_gobj(
properties_override,
obj_properties[NM_TEAM_ATTRIBUTE_CONFIG],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_STRING,
.compare_fcn = compare_fcn_config,
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/**
* NMSettingTeam:notify-peers-count:
@ -1809,9 +1820,16 @@ nm_setting_team_class_init(NMSettingTeamClass *klass)
"",
G_TYPE_PTR_ARRAY,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[NM_TEAM_ATTRIBUTE_LINK_WATCHERS],
&nm_sett_info_propert_type_team_link_watchers);
_nm_properties_override_gobj(
properties_override,
obj_properties[NM_TEAM_ATTRIBUTE_LINK_WATCHERS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.compare_fcn = compare_fcn_link_watchers,
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.typdata_from_dbus.gprop_fcn =
_nm_team_settings_property_from_dbus_link_watchers,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/* ---dbus---
* property: interface-name

View file

@ -397,34 +397,27 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_data(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingUserPrivate *priv, *pri2;
NMSettingUserPrivate *priv;
NMSettingUserPrivate *pri2;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_USER_DATA)) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
if (!set_b)
return TRUE;
priv = NM_SETTING_USER_GET_PRIVATE(NM_SETTING_USER(set_a));
pri2 = NM_SETTING_USER_GET_PRIVATE(NM_SETTING_USER(set_b));
return nm_utils_hashtable_equal(priv->data, pri2->data, TRUE, g_str_equal)
&& nm_utils_hashtable_equal(priv->data_invalid,
pri2->data_invalid,
TRUE,
g_str_equal);
}
return NM_SETTING_CLASS(nm_setting_user_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
priv = NM_SETTING_USER_GET_PRIVATE(NM_SETTING_USER(set_a));
pri2 = NM_SETTING_USER_GET_PRIVATE(NM_SETTING_USER(set_b));
return nm_utils_hashtable_equal(priv->data, pri2->data, TRUE, g_str_equal)
&& nm_utils_hashtable_equal(priv->data_invalid, pri2->data_invalid, TRUE, g_str_equal);
}
/*****************************************************************************/
@ -552,8 +545,7 @@ nm_setting_user_class_init(NMSettingUserClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->verify = verify;
/**
* NMSettingUser:data: (type GHashTable(utf8,utf8))
@ -581,9 +573,16 @@ nm_setting_user_class_init(NMSettingUserClass *klass)
"",
G_TYPE_HASH_TABLE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[PROP_DATA],
&nm_sett_info_propert_type_strdict);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_DATA],
NM_SETT_INFO_PROPERT_TYPE_GPROP(NM_G_VARIANT_TYPE("a{ss}"),
.typdata_from_dbus.gprop_fcn = _nm_utils_strdict_from_dbus,
.typdata_to_dbus.gprop_type =
NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_STRDICT,
.compare_fcn = compare_fcn_data,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -677,7 +677,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
static GVariant *
_override_flags_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -927,8 +927,11 @@ nm_setting_vlan_class_init(NMSettingVlanClass *klass)
properties_override,
obj_properties[PROP_FLAGS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_UINT32,
.to_dbus_fcn = _override_flags_get,
.missing_from_dbus_fcn = _override_flags_not_set, ));
.to_dbus_fcn = _override_flags_get,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.missing_from_dbus_fcn = _override_flags_not_set,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/**
* NMSettingVlan:ingress-priority-map:

View file

@ -851,41 +851,36 @@ compare_property_secrets(NMSettingVpn *a, NMSettingVpn *b, NMSettingCompareFlags
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_secrets(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_VPN_SECRETS)) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
return compare_property_secrets(NM_SETTING_VPN(set_a), NM_SETTING_VPN(set_b), flags);
}
return NM_SETTING_CLASS(nm_setting_vpn_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
return compare_property_secrets(NM_SETTING_VPN(set_a), NM_SETTING_VPN(set_b), flags);
}
static gboolean
clear_secrets(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMSetting * setting,
NMSettingClearSecretsWithFlagsFn func,
gpointer user_data)
{
NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE(setting);
GParamSpec * prop_spec = sett_info->property_infos[property_idx].param_spec;
NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE(setting);
GHashTableIter iter;
const char * secret;
gboolean changed = TRUE;
if (!prop_spec || !NM_FLAGS_HAS(prop_spec->flags, NM_SETTING_PARAM_SECRET))
if (!property_info->param_spec
|| !NM_FLAGS_HAS(property_info->param_spec->flags, NM_SETTING_PARAM_SECRET))
return FALSE;
nm_assert(nm_streq(prop_spec->name, NM_SETTING_VPN_SECRETS));
nm_assert(nm_streq(property_info->param_spec->name, NM_SETTING_VPN_SECRETS));
if (!priv->secrets)
return FALSE;
@ -914,12 +909,13 @@ clear_secrets(const NMSettInfoSetting * sett_info,
}
static gboolean
vpn_secrets_from_dbus(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
vpn_secrets_from_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
NMSettingVpn * self = NM_SETTING_VPN(setting);
NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE(self);
@ -943,7 +939,7 @@ vpn_secrets_from_dbus(NMSetting * setting,
static GVariant *
vpn_secrets_to_dbus(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -1131,7 +1127,6 @@ nm_setting_vpn_class_init(NMSettingVpnClass *klass)
setting_class->get_secret_flags = get_secret_flags;
setting_class->set_secret_flags = set_secret_flags;
setting_class->need_secrets = need_secrets;
setting_class->compare_property = compare_property;
setting_class->clear_secrets = clear_secrets;
setting_class->aggregate = aggregate;
@ -1231,6 +1226,7 @@ nm_setting_vpn_class_init(NMSettingVpnClass *klass)
obj_properties[PROP_SECRETS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("a{ss}"),
.to_dbus_fcn = vpn_secrets_to_dbus,
.compare_fcn = compare_fcn_secrets,
.from_dbus_fcn = vpn_secrets_from_dbus, ));
/**

View file

@ -976,23 +976,17 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_cloned_mac_address(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
if (nm_streq(sett_info->property_infos[property_idx].name,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS)) {
return !set_b
|| nm_streq0(NM_SETTING_WIRED_GET_PRIVATE(set_a)->cloned_mac_address,
NM_SETTING_WIRED_GET_PRIVATE(set_b)->cloned_mac_address);
}
return NM_SETTING_CLASS(nm_setting_wired_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return !set_b
|| nm_streq0(NM_SETTING_WIRED_GET_PRIVATE(set_a)->cloned_mac_address,
NM_SETTING_WIRED_GET_PRIVATE(set_b)->cloned_mac_address);
}
/*****************************************************************************/
@ -1274,8 +1268,7 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
setting_class->verify = verify;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
/**
* NMSettingWired:port:
@ -1390,7 +1383,7 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass)
NM_SETTING_PARAM_NONE,
NMSettingWiredPrivate,
auto_negotiate,
.to_dbus_data.including_default = TRUE);
.to_dbus_including_default = TRUE);
/**
* NMSettingWired:mac-address:
@ -1475,9 +1468,14 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass)
"",
NULL,
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[PROP_CLONED_MAC_ADDRESS],
&nm_sett_info_propert_type_cloned_mac_address);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_CLONED_MAC_ADDRESS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_BYTESTRING,
.compare_fcn = compare_fcn_cloned_mac_address,
.to_dbus_fcn = _nm_utils_hwaddr_cloned_get,
.from_dbus_fcn = _nm_utils_hwaddr_cloned_set,
.missing_from_dbus_fcn = _nm_utils_hwaddr_cloned_not_set, ));
/* ---dbus---
* property: assigned-mac-address

View file

@ -1461,7 +1461,7 @@ nm_setting_wireguard_clear_peers(NMSettingWireGuard *self)
static GVariant *
_peers_dbus_only_synth(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -1563,12 +1563,13 @@ _peers_dbus_only_synth(const NMSettInfoSetting * sett_info,
}
static gboolean
_peers_dbus_only_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
_peers_dbus_only_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
GVariantIter iter_peers;
GVariant * peer_var;
@ -1842,12 +1843,12 @@ need_secrets(NMSetting *setting)
static gboolean
clear_secrets(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMSetting * setting,
NMSettingClearSecretsWithFlagsFn func,
gpointer user_data)
{
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_WIREGUARD_PEERS)) {
if (nm_streq(property_info->name, NM_SETTING_WIREGUARD_PEERS)) {
NMSettingWireGuardPrivate *priv = NM_SETTING_WIREGUARD_GET_PRIVATE(setting);
gboolean peers_changed = FALSE;
guint i, j;
@ -1894,7 +1895,7 @@ clear_secrets(const NMSettInfoSetting * sett_info,
}
return NM_SETTING_CLASS(nm_setting_wireguard_parent_class)
->clear_secrets(sett_info, property_idx, setting, func, user_data);
->clear_secrets(sett_info, property_info, setting, func, user_data);
}
static int
@ -1997,43 +1998,38 @@ update_one_secret(NMSetting *setting, const char *key, GVariant *value, GError *
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_peers(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMSettingWireGuardPrivate *a_priv;
NMSettingWireGuardPrivate *b_priv;
guint i;
if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_WIREGUARD_PEERS)) {
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
a_priv = NM_SETTING_WIREGUARD_GET_PRIVATE(set_a);
b_priv = NM_SETTING_WIREGUARD_GET_PRIVATE(set_b);
if (a_priv->peers_arr->len != b_priv->peers_arr->len)
return FALSE;
for (i = 0; i < a_priv->peers_arr->len; i++) {
NMWireGuardPeer *a_peer = _peers_get(a_priv, i)->peer;
NMWireGuardPeer *b_peer = _peers_get(b_priv, i)->peer;
if (nm_wireguard_peer_cmp(a_peer, b_peer, flags) != 0)
return FALSE;
}
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
a_priv = NM_SETTING_WIREGUARD_GET_PRIVATE(set_a);
b_priv = NM_SETTING_WIREGUARD_GET_PRIVATE(set_b);
if (a_priv->peers_arr->len != b_priv->peers_arr->len)
return FALSE;
for (i = 0; i < a_priv->peers_arr->len; i++) {
NMWireGuardPeer *a_peer = _peers_get(a_priv, i)->peer;
NMWireGuardPeer *b_peer = _peers_get(b_priv, i)->peer;
if (nm_wireguard_peer_cmp(a_peer, b_peer, flags) != 0)
return FALSE;
}
return NM_SETTING_CLASS(nm_setting_wireguard_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
return TRUE;
}
static void
@ -2421,7 +2417,6 @@ nm_setting_wireguard_class_init(NMSettingWireGuardClass *klass)
setting_class->need_secrets = need_secrets;
setting_class->clear_secrets = clear_secrets;
setting_class->update_one_secret = update_one_secret;
setting_class->compare_property = compare_property;
setting_class->duplicate_copy_properties = duplicate_copy_properties;
setting_class->enumerate_values = enumerate_values;
setting_class->aggregate = aggregate;
@ -2597,6 +2592,7 @@ nm_setting_wireguard_class_init(NMSettingWireGuardClass *klass)
NM_SETTING_WIREGUARD_PEERS,
NM_SETT_INFO_PROPERT_TYPE_DBUS(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = _peers_dbus_only_synth,
.compare_fcn = compare_fcn_peers,
.from_dbus_fcn = _peers_dbus_only_set, ));
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -1290,13 +1290,24 @@ set_secret_flags(NMSetting * setting,
->set_secret_flags(setting, secret_name, flags, error);
}
/* NMSettingWirelessSecurity:wep-key-type is an enum, but needs to be marshalled
* as 'u', not 'i', for backward-compatibility.
*/
static GVariant *
wep_key_type_to_dbus(const GValue *from)
wep_key_type_to_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options)
{
return g_variant_new_uint32(g_value_get_enum(from));
NMWepKeyType t;
t = nm_setting_wireless_security_get_wep_key_type(NM_SETTING_WIRELESS_SECURITY(setting));
if (t == NM_WEP_KEY_TYPE_UNKNOWN)
return NULL;
/* NMSettingWirelessSecurity:wep-key-type is an enum, but needs to be marshalled
* as 'u', not 'i', for backward-compatibility.
*/
return g_variant_new_uint32(t);
}
/*****************************************************************************/
@ -1924,10 +1935,14 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
NM_TYPE_WEP_KEY_TYPE,
NM_WEP_KEY_TYPE_UNKNOWN,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[PROP_WEP_KEY_TYPE],
&nm_sett_info_propert_type_plain_u,
.to_dbus_data.gprop_to_dbus_fcn = wep_key_type_to_dbus, );
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_WEP_KEY_TYPE],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_UINT32,
.to_dbus_fcn = wep_key_type_to_dbus,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE));
/**
* NMSettingWirelessSecurity:wps-method:

View file

@ -744,7 +744,7 @@ nm_setting_wireless_get_seen_bssid(NMSettingWireless *setting, guint32 i)
static GVariant *
_to_dbus_fcn_seen_bssids(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -769,12 +769,13 @@ _to_dbus_fcn_seen_bssids(const NMSettInfoSetting * sett_info,
}
static gboolean
_from_dbus_fcn_seen_bssids(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
_from_dbus_fcn_seen_bssids(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
NMSettingWirelessPrivate *priv;
gs_free const char ** s = NULL;
@ -1102,36 +1103,39 @@ mac_addr_rand_ok:
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
compare_fcn_cloned_mac_address(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
if (sett_info->property_infos[property_idx].param_spec
== obj_properties[PROP_CLONED_MAC_ADDRESS]) {
return !set_b
|| nm_streq0(NM_SETTING_WIRELESS_GET_PRIVATE(set_a)->cloned_mac_address,
NM_SETTING_WIRELESS_GET_PRIVATE(set_b)->cloned_mac_address);
}
if (sett_info->property_infos[property_idx].param_spec == obj_properties[PROP_SEEN_BSSIDS]) {
return !set_b
|| (nm_strv_ptrarray_cmp(NM_SETTING_WIRELESS_GET_PRIVATE(set_a)->seen_bssids,
NM_SETTING_WIRELESS_GET_PRIVATE(set_b)->seen_bssids)
== 0);
}
return !set_b
|| nm_streq0(NM_SETTING_WIRELESS_GET_PRIVATE(set_a)->cloned_mac_address,
NM_SETTING_WIRELESS_GET_PRIVATE(set_b)->cloned_mac_address);
}
return NM_SETTING_CLASS(nm_setting_wireless_parent_class)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
static NMTernary
compare_fcn_seen_bssids(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
return !set_b
|| (nm_strv_ptrarray_cmp(NM_SETTING_WIRELESS_GET_PRIVATE(set_a)->seen_bssids,
NM_SETTING_WIRELESS_GET_PRIVATE(set_b)->seen_bssids)
== 0);
}
/*****************************************************************************/
static GVariant *
nm_setting_wireless_get_security(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -1419,8 +1423,7 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
object_class->get_property = get_property;
object_class->finalize = finalize;
setting_class->verify = verify;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
/**
* NMSettingWireless:ssid:
@ -1666,9 +1669,14 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
"",
NULL,
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE | G_PARAM_STATIC_STRINGS);
_nm_properties_override_gobj(properties_override,
obj_properties[PROP_CLONED_MAC_ADDRESS],
&nm_sett_info_propert_type_cloned_mac_address);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_CLONED_MAC_ADDRESS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_BYTESTRING,
.compare_fcn = compare_fcn_cloned_mac_address,
.to_dbus_fcn = _nm_utils_hwaddr_cloned_get,
.from_dbus_fcn = _nm_utils_hwaddr_cloned_set,
.missing_from_dbus_fcn = _nm_utils_hwaddr_cloned_not_set, ));
/* ---dbus---
* property: assigned-mac-address
@ -1786,7 +1794,8 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
obj_properties[PROP_SEEN_BSSIDS],
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_STRING_ARRAY,
.to_dbus_fcn = _to_dbus_fcn_seen_bssids,
.from_dbus_fcn = _from_dbus_fcn_seen_bssids, ));
.from_dbus_fcn = _from_dbus_fcn_seen_bssids,
.compare_fcn = compare_fcn_seen_bssids, ));
/**
* NMSettingWireless:mtu:
@ -1917,7 +1926,8 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
properties_override,
"security",
NM_SETT_INFO_PROPERT_TYPE_DBUS(G_VARIANT_TYPE_STRING,
.to_dbus_fcn = nm_setting_wireless_get_security, ));
.to_dbus_fcn = nm_setting_wireless_get_security,
.compare_fcn = _nm_setting_property_compare_fcn_ignore, ));
/**
* NMSettingWireless:wake-on-wlan:

View file

@ -54,6 +54,9 @@ G_DEFINE_ABSTRACT_TYPE(NMSetting, nm_setting, G_TYPE_OBJECT)
/*****************************************************************************/
static GenData *_gendata_hash(NMSetting *setting, gboolean create_if_necessary);
static gboolean set_property_from_dbus(const NMSettInfoProperty *property_info,
GVariant * src_value,
GValue * dst_value);
/*****************************************************************************/
@ -171,12 +174,15 @@ _nm_properties_override_assert(const NMSettInfoProperty *prop_info)
/* we always require a dbus_type. */
nm_assert(property_type->dbus_type);
/* from_dbus_fcn and gprop_from_dbus_fcn cannot both be set. */
nm_assert(!property_type->from_dbus_fcn || !property_type->gprop_from_dbus_fcn);
if (property_type->typdata_from_dbus.gprop_fcn)
nm_assert(property_type->from_dbus_fcn == _nm_setting_property_from_dbus_fcn_gprop);
if (property_type->from_dbus_fcn == _nm_setting_property_from_dbus_fcn_gprop)
nm_assert(prop_info->param_spec);
if (!prop_info->param_spec) {
/* if we don't have a param_spec, we cannot have gprop_from_dbus_fcn. */
nm_assert(property_type->from_dbus_fcn || !property_type->gprop_from_dbus_fcn);
/* if we don't have a param_spec, we cannot have typdata_from_dbus.gprop_fcn. */
nm_assert(property_type->from_dbus_fcn || !property_type->typdata_from_dbus.gprop_fcn);
}
}
#endif
@ -370,35 +376,78 @@ _nm_setting_class_commit(NMSettingClass * setting_class,
vtype = p->param_spec->value_type;
if (vtype == G_TYPE_BOOLEAN)
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(G_VARIANT_TYPE_BOOLEAN);
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_BOOLEAN,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
else if (vtype == G_TYPE_UCHAR)
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(G_VARIANT_TYPE_BYTE);
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_BYTE,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
else if (vtype == G_TYPE_INT)
p->property_type = &nm_sett_info_propert_type_plain_i;
else if (vtype == G_TYPE_UINT)
p->property_type = &nm_sett_info_propert_type_plain_u;
else if (vtype == G_TYPE_INT64)
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(G_VARIANT_TYPE_INT64);
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_INT64,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
else if (vtype == G_TYPE_UINT64)
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(G_VARIANT_TYPE_UINT64);
else if (vtype == G_TYPE_STRING)
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(G_VARIANT_TYPE_STRING);
else if (vtype == G_TYPE_DOUBLE)
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(G_VARIANT_TYPE_DOUBLE);
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_UINT64,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
else if (vtype == G_TYPE_STRING) {
nm_assert(nm_streq(p->name, NM_SETTING_NAME)
== (!NM_FLAGS_HAS(p->param_spec->flags, G_PARAM_WRITABLE)));
if (!NM_FLAGS_HAS(p->param_spec->flags, G_PARAM_WRITABLE))
p->property_type = &nm_sett_info_propert_type_setting_name;
else {
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_STRING,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
}
} else if (vtype == G_TYPE_DOUBLE)
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_DOUBLE,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
else if (vtype == G_TYPE_STRV)
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(G_VARIANT_TYPE_STRING_ARRAY);
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_STRING_ARRAY,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
else if (vtype == G_TYPE_BYTES) {
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_BYTESTRING,
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_BYTES);
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_BYTES,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
} else if (g_type_is_a(vtype, G_TYPE_ENUM)) {
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_INT32,
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_ENUM);
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_ENUM,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
} else if (g_type_is_a(vtype, G_TYPE_FLAGS)) {
p->property_type = NM_SETT_INFO_PROPERT_TYPE_GPROP(
G_VARIANT_TYPE_UINT32,
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_FLAGS);
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_FLAGS,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
} else
nm_assert_not_reached();
@ -471,7 +520,7 @@ const NMSettInfoProperty *
_nm_sett_info_setting_get_property_info(const NMSettInfoSetting *sett_info,
const char * property_name)
{
const NMSettInfoProperty *property;
const NMSettInfoProperty *property_info;
gssize idx;
nm_assert(property_name);
@ -490,13 +539,13 @@ _nm_sett_info_setting_get_property_info(const NMSettInfoSetting *sett_info,
if (idx < 0)
return NULL;
property = &sett_info->property_infos[idx];
property_info = &sett_info->property_infos[idx];
nm_assert(idx == 0 || strcmp(property[-1].name, property[0].name) < 0);
nm_assert(idx == 0 || strcmp(property_info[-1].name, property_info[0].name) < 0);
nm_assert(idx == sett_info->property_infos_len - 1
|| strcmp(property[0].name, property[1].name) < 0);
|| strcmp(property_info[0].name, property_info[1].name) < 0);
return property;
return property_info;
}
const NMSettInfoSetting *
@ -851,21 +900,19 @@ _finalize_direct(NMSetting *setting)
GVariant *
_nm_setting_property_to_dbus_fcn_direct(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options)
{
const NMSettInfoProperty *property_info = &sett_info->property_infos[property_idx];
switch (property_info->property_type->direct_type) {
case NM_VALUE_TYPE_BOOL:
{
gboolean val;
val = *((bool *) _nm_setting_get_private(setting, sett_info, property_info->direct_offset));
if (!property_info->to_dbus_data.including_default
if (!property_info->to_dbus_including_default
&& val == NM_G_PARAM_SPEC_GET_DEFAULT_BOOLEAN(property_info->param_spec))
return NULL;
return g_variant_ref(nm_g_variant_singleton_b(val));
@ -876,7 +923,7 @@ _nm_setting_property_to_dbus_fcn_direct(const NMSettInfoSetting *
val = *(
(guint32 *) _nm_setting_get_private(setting, sett_info, property_info->direct_offset));
if (!property_info->to_dbus_data.including_default
if (!property_info->to_dbus_including_default
&& val == NM_G_PARAM_SPEC_GET_DEFAULT_UINT(property_info->param_spec))
return NULL;
return g_variant_new_uint32(val);
@ -891,7 +938,7 @@ _nm_setting_property_to_dbus_fcn_direct(const NMSettInfoSetting *
* Setting "including_default" for a string makes no sense because a
* GVariant of type "s" cannot express NULL. */
nm_assert(!NM_G_PARAM_SPEC_GET_DEFAULT_STRING(property_info->param_spec));
nm_assert(!property_info->to_dbus_data.including_default);
nm_assert(!property_info->to_dbus_including_default);
val = *((const char *const *) _nm_setting_get_private(setting,
sett_info,
@ -907,40 +954,44 @@ _nm_setting_property_to_dbus_fcn_direct(const NMSettInfoSetting *
}
}
GVariant *
_nm_setting_property_to_dbus_fcn_ignore(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options)
{
return NULL;
}
GVariant *
_nm_setting_property_to_dbus_fcn_gprop(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options)
{
const NMSettInfoProperty *const property = &sett_info->property_infos[property_idx];
nm_auto_unset_gvalue GValue prop_value = {
nm_auto_unset_gvalue GValue prop_value = {
0,
};
GArray *tmp_array;
nm_assert(property->param_spec);
nm_assert(property->property_type->to_dbus_fcn == _nm_setting_property_to_dbus_fcn_gprop);
nm_assert(property->property_type->typdata_to_dbus.gprop_type
== NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_DEFAULT
|| !property->to_dbus_data.gprop_to_dbus_fcn);
nm_assert(property_info->param_spec);
nm_assert(property_info->property_type->to_dbus_fcn == _nm_setting_property_to_dbus_fcn_gprop);
g_value_init(&prop_value, property->param_spec->value_type);
g_value_init(&prop_value, property_info->param_spec->value_type);
g_object_get_property(G_OBJECT(setting), property->param_spec->name, &prop_value);
g_object_get_property(G_OBJECT(setting), property_info->param_spec->name, &prop_value);
if (!property->to_dbus_data.including_default
&& g_param_value_defaults(property->param_spec, &prop_value))
if (!property_info->to_dbus_including_default
&& g_param_value_defaults(property_info->param_spec, &prop_value))
return NULL;
switch (property->property_type->typdata_to_dbus.gprop_type) {
switch (property_info->property_type->typdata_to_dbus.gprop_type) {
case NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_DEFAULT:
if (property->to_dbus_data.gprop_to_dbus_fcn)
return property->to_dbus_data.gprop_to_dbus_fcn(&prop_value);
return g_dbus_gvalue_to_gvariant(&prop_value, property->property_type->dbus_type);
return g_dbus_gvalue_to_gvariant(&prop_value, property_info->property_type->dbus_type);
case NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_BYTES:
nm_assert(G_VALUE_HOLDS(&prop_value, G_TYPE_BYTES));
return nm_utils_gbytes_to_variant_ay(g_value_get_boxed(&prop_value));
@ -964,44 +1015,108 @@ _nm_setting_property_to_dbus_fcn_gprop(const NMSettInfoSetting * s
return nm_assert_unreachable_val(NULL);
}
gboolean
_nm_setting_property_from_dbus_fcn_ignore(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
return TRUE;
}
gboolean
_nm_setting_property_from_dbus_fcn_gprop(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
nm_auto_unset_gvalue GValue object_value = G_VALUE_INIT;
gs_free_error GError *local = NULL;
nm_assert(property_info->param_spec);
g_value_init(&object_value, property_info->param_spec->value_type);
if (!set_property_from_dbus(property_info, value, &object_value)) {
/* for backward behavior, fail unless best-effort is chosen. */
if (NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_BEST_EFFORT))
return TRUE;
g_set_error(error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
_("can't set property of type '%s' from value of type '%s'"),
property_info->property_type->dbus_type
? g_variant_type_peek_string(property_info->property_type->dbus_type)
: (property_info->param_spec
? g_type_name(property_info->param_spec->value_type)
: "(unknown)"),
g_variant_get_type_string(value));
g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name);
return FALSE;
}
if (!nm_g_object_set_property(G_OBJECT(setting),
property_info->param_spec->name,
&object_value,
&local)) {
if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT))
return TRUE;
g_set_error(error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
_("can not set property: %s"),
local->message);
g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name);
return FALSE;
}
return TRUE;
}
static GVariant *
property_to_dbus(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options,
gboolean ignore_flags)
{
const NMSettInfoProperty *property = &sett_info->property_infos[property_idx];
GVariant * variant;
GVariant *variant;
nm_assert(property->property_type->dbus_type);
nm_assert(property_info->property_type->dbus_type);
if (!property->property_type->to_dbus_fcn) {
nm_assert(!property->param_spec);
nm_assert(!property->to_dbus_data.none);
if (!property_info->property_type->to_dbus_fcn) {
nm_assert(!property_info->param_spec);
return NULL;
}
if (property->param_spec
&& (!ignore_flags
&& !NM_FLAGS_HAS(property->param_spec->flags, NM_SETTING_PARAM_TO_DBUS_IGNORE_FLAGS))) {
if (!NM_FLAGS_HAS(property->param_spec->flags, G_PARAM_WRITABLE))
return NULL;
nm_assert(!property_info->param_spec
|| NM_FLAGS_HAS(property_info->param_spec->flags, G_PARAM_WRITABLE)
|| property_info->property_type == &nm_sett_info_propert_type_setting_name);
if (NM_FLAGS_HAS(property->param_spec->flags, NM_SETTING_PARAM_LEGACY)
if (property_info->param_spec && !ignore_flags
&& !NM_FLAGS_HAS(property_info->param_spec->flags, NM_SETTING_PARAM_TO_DBUS_IGNORE_FLAGS)) {
if (NM_FLAGS_HAS(property_info->param_spec->flags, NM_SETTING_PARAM_LEGACY)
&& !_nm_utils_is_manager_process)
return NULL;
if (NM_FLAGS_HAS(property->param_spec->flags, NM_SETTING_PARAM_SECRET)) {
if (NM_FLAGS_HAS(property_info->param_spec->flags, NM_SETTING_PARAM_SECRET)) {
NMSettingSecretFlags f = NM_SETTING_SECRET_FLAG_NONE;
if (NM_FLAGS_ANY(flags,
NM_CONNECTION_SERIALIZE_WITH_SECRETS_AGENT_OWNED
| NM_CONNECTION_SERIALIZE_WITH_SECRETS_SYSTEM_OWNED
| NM_CONNECTION_SERIALIZE_WITH_SECRETS_NOT_SAVED)) {
if (!nm_setting_get_secret_flags(setting, property->param_spec->name, &f, NULL))
if (!nm_setting_get_secret_flags(setting,
property_info->param_spec->name,
&f,
NULL))
return NULL;
}
@ -1013,26 +1128,28 @@ property_to_dbus(const NMSettInfoSetting * sett_info,
}
}
variant = property->property_type
->to_dbus_fcn(sett_info, property_idx, connection, setting, flags, options);
variant = property_info->property_type
->to_dbus_fcn(sett_info, property_info, connection, setting, flags, options);
nm_g_variant_take_ref(variant);
nm_assert(!variant || g_variant_is_of_type(variant, property->property_type->dbus_type));
nm_assert(!variant || g_variant_is_of_type(variant, property_info->property_type->dbus_type));
return variant;
}
static gboolean
set_property_from_dbus(const NMSettInfoProperty *property, GVariant *src_value, GValue *dst_value)
set_property_from_dbus(const NMSettInfoProperty *property_info,
GVariant * src_value,
GValue * dst_value)
{
nm_assert(property->param_spec);
nm_assert(property->property_type->dbus_type);
nm_assert(property_info->param_spec);
nm_assert(property_info->property_type->dbus_type);
if (property->property_type->gprop_from_dbus_fcn) {
if (property_info->property_type->typdata_from_dbus.gprop_fcn) {
if (!g_variant_type_equal(g_variant_get_type(src_value),
property->property_type->dbus_type))
property_info->property_type->dbus_type))
return FALSE;
property->property_type->gprop_from_dbus_fcn(src_value, dst_value);
property_info->property_type->typdata_from_dbus.gprop_fcn(src_value, dst_value);
} else if (dst_value->g_type == G_TYPE_BYTES) {
if (!g_variant_is_of_type(src_value, G_VARIANT_TYPE_BYTESTRING))
return FALSE;
@ -1102,11 +1219,13 @@ _nm_setting_to_dbus(NMSetting * setting,
sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting));
for (j = 0; j < sett_info->property_infos_len; j++) {
gs_unref_variant GVariant *dbus_value = NULL;
const NMSettInfoProperty *property_info = &sett_info->property_infos[j];
gs_unref_variant GVariant *dbus_value = NULL;
dbus_value = property_to_dbus(sett_info, j, connection, setting, flags, options, FALSE);
dbus_value =
property_to_dbus(sett_info, property_info, connection, setting, flags, options, FALSE);
if (dbus_value) {
g_variant_builder_add(&builder, "{sv}", sett_info->property_infos[j].name, dbus_value);
g_variant_builder_add(&builder, "{sv}", property_info->name, dbus_value);
}
}
@ -1266,17 +1385,43 @@ init_from_dbus(NMSetting * setting,
gs_unref_variant GVariant *value = NULL;
gs_free_error GError *local = NULL;
if (property_info->param_spec && !(property_info->param_spec->flags & G_PARAM_WRITABLE))
if (property_info->property_type == &nm_sett_info_propert_type_setting_name)
continue;
nm_assert(!property_info->param_spec
|| NM_FLAGS_HAS(property_info->param_spec->flags, G_PARAM_WRITABLE));
value = g_variant_lookup_value(setting_dict, property_info->name, NULL);
if (value && keys)
if (!value) {
if (property_info->property_type->missing_from_dbus_fcn
&& !property_info->property_type->missing_from_dbus_fcn(setting,
connection_dict,
property_info->name,
parse_flags,
&local)) {
if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT))
continue;
g_set_error(error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
_("failed to set property: %s"),
local->message);
g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name);
return FALSE;
}
continue;
}
if (keys)
g_hash_table_remove(keys, property_info->name);
if (value && property_info->property_type->from_dbus_fcn) {
if (!g_variant_type_equal(g_variant_get_type(value),
property_info->property_type->dbus_type)) {
if (property_info->property_type->from_dbus_fcn) {
if (property_info->property_type->from_dbus_is_full) {
/* These hooks perform their own type checking, and can coerce/ignore
* a value regardless of the D-Bus type. */
} else if (!g_variant_type_equal(g_variant_get_type(value),
property_info->property_type->dbus_type)) {
/* for backward behavior, fail unless best-effort is chosen. */
if (NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_BEST_EFFORT))
continue;
@ -1294,13 +1439,17 @@ init_from_dbus(NMSetting * setting,
return FALSE;
}
if (!property_info->property_type->from_dbus_fcn(setting,
if (!property_info->property_type->from_dbus_fcn(sett_info,
property_info,
setting,
connection_dict,
property_info->name,
value,
parse_flags,
&local)) {
if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT))
if (property_info->property_type->from_dbus_is_full) {
/* the error we received from from_dbus_fcn() should be propagated, even
* in non-strict mode. */
} else if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT))
continue;
g_set_error(error,
NM_CONNECTION_ERROR,
@ -1310,60 +1459,10 @@ init_from_dbus(NMSetting * setting,
g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name);
return FALSE;
}
} else if (!value && property_info->property_type->missing_from_dbus_fcn) {
if (!property_info->property_type->missing_from_dbus_fcn(setting,
connection_dict,
property_info->name,
parse_flags,
&local)) {
if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT))
continue;
g_set_error(error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
_("failed to set property: %s"),
local->message);
g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name);
return FALSE;
}
} else if (value && property_info->param_spec) {
nm_auto_unset_gvalue GValue object_value = G_VALUE_INIT;
g_value_init(&object_value, property_info->param_spec->value_type);
if (!set_property_from_dbus(property_info, value, &object_value)) {
/* for backward behavior, fail unless best-effort is chosen. */
if (NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_BEST_EFFORT))
continue;
g_set_error(
error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
_("can't set property of type '%s' from value of type '%s'"),
property_info->property_type->dbus_type
? g_variant_type_peek_string(property_info->property_type->dbus_type)
: (property_info->param_spec
? g_type_name(property_info->param_spec->value_type)
: "(unknown)"),
g_variant_get_type_string(value));
g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name);
return FALSE;
}
if (!nm_g_object_set_property(G_OBJECT(setting),
property_info->param_spec->name,
&object_value,
&local)) {
if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT))
continue;
g_set_error(error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
_("can not set property: %s"),
local->message);
g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name);
return FALSE;
}
continue;
}
nm_assert(!property_info->param_spec);
}
return TRUE;
@ -1382,19 +1481,21 @@ init_from_dbus(NMSetting * setting,
const GVariantType *
nm_setting_get_dbus_property_type(NMSetting *setting, const char *property_name)
{
const NMSettInfoProperty *property;
const NMSettInfoProperty *property_info;
g_return_val_if_fail(NM_IS_SETTING(setting), NULL);
g_return_val_if_fail(property_name != NULL, NULL);
property = _nm_setting_class_get_property_info(NM_SETTING_GET_CLASS(setting), property_name);
property_info =
_nm_setting_class_get_property_info(NM_SETTING_GET_CLASS(setting), property_name);
g_return_val_if_fail(property != NULL, NULL);
g_return_val_if_fail(property_info != NULL, NULL);
nm_assert(property->property_type);
nm_assert(g_variant_type_string_is_valid((const char *) property->property_type->dbus_type));
nm_assert(property_info->property_type);
nm_assert(
g_variant_type_string_is_valid((const char *) property_info->property_type->dbus_type));
return property->property_type->dbus_type;
return property_info->property_type->dbus_type;
}
gboolean
@ -1476,21 +1577,23 @@ duplicate_copy_properties(const NMSettInfoSetting *sett_info, NMSetting *src, NM
for (i = 0; i < sett_info->property_infos_len; i++) {
const NMSettInfoProperty *property_info = &sett_info->property_infos[i];
if (property_info->param_spec) {
if ((property_info->param_spec->flags & (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY))
!= G_PARAM_WRITABLE)
continue;
if (!frozen) {
g_object_freeze_notify(G_OBJECT(dst));
frozen = TRUE;
}
_gobject_copy_property(G_OBJECT(src),
G_OBJECT(dst),
property_info->param_spec->name,
G_PARAM_SPEC_VALUE_TYPE(property_info->param_spec));
if (!property_info->param_spec)
continue;
nm_assert(!NM_FLAGS_HAS(property_info->param_spec->flags, G_PARAM_CONSTRUCT_ONLY));
if (property_info->property_type == &nm_sett_info_propert_type_setting_name)
continue;
nm_assert(NM_FLAGS_HAS(property_info->param_spec->flags, G_PARAM_WRITABLE));
if (!frozen) {
g_object_freeze_notify(G_OBJECT(dst));
frozen = TRUE;
}
_gobject_copy_property(G_OBJECT(src),
G_OBJECT(dst),
property_info->param_spec->name,
G_PARAM_SPEC_VALUE_TYPE(property_info->param_spec));
}
if (frozen)
@ -1689,110 +1792,163 @@ _nm_setting_should_compare_secret_property(NMSetting * setting,
return TRUE;
}
static NMTernary
compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
/*****************************************************************************/
gboolean
_nm_setting_compare_flags_check(const GParamSpec * param_spec,
NMSettingCompareFlags flags,
NMSetting * set_a,
NMSetting * set_b)
{
const NMSettInfoProperty *property_info = &sett_info->property_infos[property_idx];
const GParamSpec * param_spec = property_info->param_spec;
if (!param_spec)
return NM_TERNARY_DEFAULT;
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_FUZZY)
&& NM_FLAGS_ANY(param_spec->flags, NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_SECRET))
return NM_TERNARY_DEFAULT;
return FALSE;
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE)
&& !NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_INFERRABLE))
return NM_TERNARY_DEFAULT;
return FALSE;
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_REAPPLY_IMMEDIATELY)
&& NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_REAPPLY_IMMEDIATELY))
return NM_TERNARY_DEFAULT;
return FALSE;
if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS)
&& NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_SECRET))
return NM_TERNARY_DEFAULT;
if (nm_streq(param_spec->name, NM_SETTING_NAME))
return NM_TERNARY_DEFAULT;
return FALSE;
if (NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_SECRET)
&& !_nm_setting_should_compare_secret_property(set_a, set_b, param_spec->name, flags))
return FALSE;
return TRUE;
}
NMTernary
_nm_setting_property_compare_fcn_ignore(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
return NM_TERNARY_DEFAULT;
}
NMTernary
_nm_setting_property_compare_fcn_direct(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
gconstpointer p_a;
gconstpointer p_b;
nm_assert(property_info->property_type->to_dbus_fcn == _nm_setting_property_to_dbus_fcn_direct);
if (!property_info->param_spec)
return nm_assert_unreachable_val(NM_TERNARY_DEFAULT);
if (!_nm_setting_compare_flags_check(property_info->param_spec, flags, set_a, set_b))
return NM_TERNARY_DEFAULT;
if (set_b) {
if (!set_b)
return TRUE;
p_a = _nm_setting_get_private(set_a, sett_info, property_info->direct_offset);
p_b = _nm_setting_get_private(set_b, sett_info, property_info->direct_offset);
switch (property_info->property_type->direct_type) {
case NM_VALUE_TYPE_BOOL:
return *((const bool *) p_a) == *((const bool *) p_b);
case NM_VALUE_TYPE_UINT32:
return *((const guint32 *) p_a) == *((const guint32 *) p_b);
case NM_VALUE_TYPE_STRING:
return nm_streq0(*((const char *const *) p_a), *((const char *const *) p_b));
default:
return nm_assert_unreachable_val(TRUE);
}
}
NMTernary
_nm_setting_property_compare_fcn_default(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
nm_assert(property_info->property_type->direct_type == NM_VALUE_TYPE_NONE);
if (!property_info->param_spec)
return nm_assert_unreachable_val(NM_TERNARY_DEFAULT);
if (!_nm_setting_compare_flags_check(property_info->param_spec, flags, set_a, set_b))
return NM_TERNARY_DEFAULT;
if (!set_b)
return TRUE;
{
gs_unref_variant GVariant *value1 = NULL;
gs_unref_variant GVariant *value2 = NULL;
value1 = property_to_dbus(sett_info,
property_idx,
property_info,
con_a,
set_a,
NM_CONNECTION_SERIALIZE_ALL,
NULL,
TRUE);
value2 = property_to_dbus(sett_info,
property_idx,
property_info,
con_b,
set_b,
NM_CONNECTION_SERIALIZE_ALL,
NULL,
TRUE);
if (nm_property_compare(value1, value2) != 0)
return NM_TERNARY_FALSE;
return nm_property_compare(value1, value2) == 0;
}
return NM_TERNARY_TRUE;
}
static NMTernary
_compare_property(const NMSettInfoSetting *sett_info,
guint property_idx,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
_compare_property(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags)
{
NMTernary compare_result;
nm_assert(sett_info);
nm_assert(NM_IS_SETTING_CLASS(sett_info->setting_class));
nm_assert(property_idx < sett_info->property_infos_len);
nm_assert(property_info);
nm_assert(NM_SETTING_GET_CLASS(set_a) == sett_info->setting_class);
nm_assert(!set_b || NM_SETTING_GET_CLASS(set_b) == sett_info->setting_class);
compare_result =
NM_SETTING_GET_CLASS(set_a)
->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
compare_result = property_info->property_type
->compare_fcn(sett_info, property_info, con_a, set_a, con_b, set_b, flags);
nm_assert(NM_IN_SET(compare_result, NM_TERNARY_DEFAULT, NM_TERNARY_FALSE, NM_TERNARY_TRUE));
nm_assert_is_ternary(compare_result);
/* check that the inferable flag and the GObject property flag corresponds. */
nm_assert(!NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE)
|| !sett_info->property_infos[property_idx].param_spec
|| NM_FLAGS_HAS(sett_info->property_infos[property_idx].param_spec->flags,
NM_SETTING_PARAM_INFERRABLE)
nm_assert(!NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE) || !property_info->param_spec
|| NM_FLAGS_HAS(property_info->param_spec->flags, NM_SETTING_PARAM_INFERRABLE)
|| compare_result == NM_TERNARY_DEFAULT);
#if NM_MORE_ASSERTS > 10
/* assert that compare_property() is symeric. */
nm_assert(!set_b
|| compare_result
== NM_SETTING_GET_CLASS(set_a)->compare_property(sett_info,
property_idx,
con_b,
set_b,
con_a,
set_a,
flags));
/* assert that compare_fcn() is symeric. */
nm_assert(
!set_b
|| compare_result
== property_info->property_type
->compare_fcn(sett_info, property_info, con_b, set_b, con_a, set_a, flags));
#endif
return compare_result;
@ -1849,7 +2005,8 @@ _nm_setting_compare(NMConnection * con_a,
}
for (i = 0; i < sett_info->property_infos_len; i++) {
if (_compare_property(sett_info, i, con_a, a, con_b, b, flags) == NM_TERNARY_FALSE)
if (_compare_property(sett_info, &sett_info->property_infos[i], con_a, a, con_b, b, flags)
== NM_TERNARY_FALSE)
return FALSE;
}
@ -2005,12 +2162,12 @@ _nm_setting_diff(NMConnection * con_a,
}
} else {
for (i = 0; i < sett_info->property_infos_len; i++) {
NMSettingDiffResult r = NM_SETTING_DIFF_RESULT_UNKNOWN;
const NMSettInfoProperty *property_info;
NMSettingDiffResult r = NM_SETTING_DIFF_RESULT_UNKNOWN;
const NMSettInfoProperty *property_info = &sett_info->property_infos[i];
NMTernary compare_result;
GParamSpec * prop_spec;
compare_result = _compare_property(sett_info, i, con_a, a, con_b, b, flags);
compare_result = _compare_property(sett_info, property_info, con_a, a, con_b, b, flags);
if (compare_result == NM_TERNARY_DEFAULT)
continue;
@ -2031,15 +2188,14 @@ _nm_setting_diff(NMConnection * con_a,
*
* We need to double-check whether the property should be ignored by
* looking at @a alone. */
if (_compare_property(sett_info, i, con_a, a, NULL, NULL, flags)
if (_compare_property(sett_info, property_info, con_a, a, NULL, NULL, flags)
== NM_TERNARY_DEFAULT)
continue;
}
compared_any = TRUE;
property_info = &sett_info->property_infos[i];
prop_spec = property_info->param_spec;
prop_spec = property_info->param_spec;
if (b) {
if (compare_result == NM_TERNARY_FALSE) {
@ -2287,13 +2443,13 @@ _nm_setting_aggregate(NMSetting *setting, NMConnectionAggregateType type, gpoint
static gboolean
clear_secrets(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMSetting * setting,
NMSettingClearSecretsWithFlagsFn func,
gpointer user_data)
{
NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
GParamSpec * param_spec = sett_info->property_infos[property_idx].param_spec;
GParamSpec * param_spec = property_info->param_spec;
if (!param_spec)
return FALSE;
@ -2344,7 +2500,7 @@ _nm_setting_clear_secrets(NMSetting * setting,
gboolean changed = FALSE;
guint16 i;
gboolean (*my_clear_secrets)(const struct _NMSettInfoSetting *sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMSetting * setting,
NMSettingClearSecretsWithFlagsFn func,
gpointer user_data);
@ -2355,7 +2511,8 @@ _nm_setting_clear_secrets(NMSetting * setting,
sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting));
for (i = 0; i < sett_info->property_infos_len; i++) {
changed |= my_clear_secrets(sett_info, i, setting, func, user_data);
changed |=
my_clear_secrets(sett_info, &sett_info->property_infos[i], setting, func, user_data);
}
return changed;
}
@ -2689,7 +2846,7 @@ nm_setting_to_string(NMSetting *setting)
static GVariant *
_nm_setting_get_deprecated_virtual_interface_name(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -2712,41 +2869,64 @@ _nm_setting_get_deprecated_virtual_interface_name(const NMSettInfoSetting *
const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_interface_name =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_STRING,
.compare_fcn = _nm_setting_property_compare_fcn_ignore,
.to_dbus_fcn =
_nm_setting_get_deprecated_virtual_interface_name, );
const NMSettInfoPropertType nm_sett_info_propert_type_setting_name =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_STRING,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_ignore,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_ignore,
.from_dbus_is_full = TRUE,
.compare_fcn = _nm_setting_property_compare_fcn_ignore);
const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_i =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(
G_VARIANT_TYPE_INT32,
/* No functions set. This property type is to silently ignore the value on D-Bus. */
);
.compare_fcn = _nm_setting_property_compare_fcn_ignore);
const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_u =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(
G_VARIANT_TYPE_UINT32,
/* No functions set. This property type is to silently ignore the value on D-Bus. */
);
.compare_fcn = _nm_setting_property_compare_fcn_ignore);
const NMSettInfoPropertType nm_sett_info_propert_type_plain_i =
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(G_VARIANT_TYPE_INT32);
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(G_VARIANT_TYPE_INT32,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
const NMSettInfoPropertType nm_sett_info_propert_type_plain_u =
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(G_VARIANT_TYPE_UINT32);
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(G_VARIANT_TYPE_UINT32,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
const NMSettInfoPropertType nm_sett_info_propert_type_direct_boolean =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_BOOLEAN,
.direct_type = NM_VALUE_TYPE_BOOL,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct);
.direct_type = NM_VALUE_TYPE_BOOL,
.compare_fcn = _nm_setting_property_compare_fcn_direct,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
const NMSettInfoPropertType nm_sett_info_propert_type_direct_uint32 =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_UINT32,
.direct_type = NM_VALUE_TYPE_UINT32,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct);
.direct_type = NM_VALUE_TYPE_UINT32,
.compare_fcn = _nm_setting_property_compare_fcn_direct,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
const NMSettInfoPropertType nm_sett_info_propert_type_direct_string =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_STRING,
.direct_type = NM_VALUE_TYPE_STRING,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct);
.direct_type = NM_VALUE_TYPE_STRING,
.compare_fcn = _nm_setting_property_compare_fcn_direct,
.to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
/*****************************************************************************/
@ -3244,7 +3424,6 @@ nm_setting_class_init(NMSettingClass *setting_class)
setting_class->update_one_secret = update_one_secret;
setting_class->get_secret_flags = get_secret_flags;
setting_class->set_secret_flags = set_secret_flags;
setting_class->compare_property = compare_property;
setting_class->clear_secrets = clear_secrets;
setting_class->for_each_secret = for_each_secret;
setting_class->duplicate_copy_properties = duplicate_copy_properties;

View file

@ -2729,9 +2729,9 @@ _nm_setting_get_team_setting(struct _NMSetting *setting)
return _nm_setting_team_port_get_team_setting(NM_SETTING_TEAM_PORT(setting));
}
static GVariant *
GVariant *
_nm_team_settings_property_to_dbus(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -2739,8 +2739,7 @@ _nm_team_settings_property_to_dbus(const NMSettInfoSetting * sett_
{
NMTeamSetting * self = _nm_setting_get_team_setting(setting);
const TeamAttrData *attr_data =
_team_attr_data_get(self->d.is_port,
sett_info->property_infos[property_idx].param_spec->param_id);
_team_attr_data_get(self->d.is_port, property_info->param_spec->param_id);
if (attr_data->team_attr == NM_TEAM_ATTRIBUTE_CONFIG) {
const char *config;
@ -2779,7 +2778,7 @@ _nm_team_settings_property_to_dbus(const NMSettInfoSetting * sett_
return NULL;
}
static void
void
_nm_team_settings_property_from_dbus_link_watchers(GVariant *dbus_value, GValue *prop_value)
{
g_value_take_boxed(prop_value,
@ -2788,25 +2787,31 @@ _nm_team_settings_property_from_dbus_link_watchers(GVariant *dbus_value, GValue
const NMSettInfoPropertType nm_sett_info_propert_type_team_b =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_BOOLEAN,
.to_dbus_fcn = _nm_team_settings_property_to_dbus, );
.compare_fcn = _nm_setting_property_compare_fcn_default,
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
const NMSettInfoPropertType nm_sett_info_propert_type_team_i =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_INT32,
.to_dbus_fcn = _nm_team_settings_property_to_dbus, );
.compare_fcn = _nm_setting_property_compare_fcn_default,
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
const NMSettInfoPropertType nm_sett_info_propert_type_team_s =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_STRING,
.to_dbus_fcn = _nm_team_settings_property_to_dbus, );
.compare_fcn = _nm_setting_property_compare_fcn_default,
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
const NMSettInfoPropertType nm_sett_info_propert_type_team_as =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(NM_G_VARIANT_TYPE("as"),
.to_dbus_fcn = _nm_team_settings_property_to_dbus, );
const NMSettInfoPropertType nm_sett_info_propert_type_team_link_watchers =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.gprop_from_dbus_fcn =
_nm_team_settings_property_from_dbus_link_watchers, );
.compare_fcn = _nm_setting_property_compare_fcn_default,
.to_dbus_fcn = _nm_team_settings_property_to_dbus,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
/*****************************************************************************/

View file

@ -266,6 +266,5 @@ extern const NMSettInfoPropertType nm_sett_info_propert_type_team_b;
extern const NMSettInfoPropertType nm_sett_info_propert_type_team_i;
extern const NMSettInfoPropertType nm_sett_info_propert_type_team_s;
extern const NMSettInfoPropertType nm_sett_info_propert_type_team_as;
extern const NMSettInfoPropertType nm_sett_info_propert_type_team_link_watchers;
#endif /* __NM_TEAM_UITLS_H__ */

View file

@ -36,12 +36,8 @@ extern const NMSettInfoPropertType nm_sett_info_propert_type_strdict;
extern const NMSettInfoPropertType nm_sett_info_propert_type_mac_address;
extern const NMSettInfoPropertType nm_sett_info_propert_type_cloned_mac_address;
extern const NMSettInfoPropertType nm_sett_info_propert_type_assigned_mac_address;
extern const NMSettInfoPropertType nm_sett_info_propert_type_bridge_vlans;
void _nm_utils_strdict_from_dbus(GVariant *dbus_value, GValue *prop_value);
void _nm_utils_bytes_from_dbus(GVariant *dbus_value, GValue *prop_value);
@ -58,4 +54,18 @@ gboolean _nm_utils_bridge_vlan_verify_list(GPtrArray * vlans,
const char *setting,
const char *property);
NMTernary _nm_utils_bridge_compare_vlans(GPtrArray *vlans_a, GPtrArray *vlans_b);
GVariant *_nm_team_settings_property_to_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options);
void _nm_team_settings_property_from_dbus_link_watchers(GVariant *dbus_value, GValue *prop_value);
GVariant *_nm_utils_ip4_dns_to_variant(const char *const *dns, gssize len);
GVariant *_nm_utils_ip6_dns_to_variant(const char *const *dns, gssize len);
#endif

View file

@ -775,9 +775,12 @@ _nm_utils_strdict_from_dbus(GVariant *dbus_value, GValue *prop_value)
const NMSettInfoPropertType nm_sett_info_propert_type_strdict =
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(NM_G_VARIANT_TYPE("a{ss}"),
.gprop_from_dbus_fcn = _nm_utils_strdict_from_dbus,
.typdata_from_dbus.gprop_fcn = _nm_utils_strdict_from_dbus,
.typdata_to_dbus.gprop_type =
NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_STRDICT);
NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_STRDICT,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
GHashTable *
_nm_utils_copy_strdict(GHashTable *strdict)
@ -1282,19 +1285,29 @@ nm_utils_wpa_psk_valid(const char *psk)
**/
GVariant *
nm_utils_ip4_dns_to_variant(char **dns)
{
return _nm_utils_ip4_dns_to_variant(NM_CAST_STRV_CC(dns), -1);
}
GVariant *
_nm_utils_ip4_dns_to_variant(const char *const *dns, gssize len)
{
GVariantBuilder builder;
gsize l;
gsize i;
if (len < 0)
l = NM_PTRARRAY_LEN(dns);
else
l = len;
g_variant_builder_init(&builder, G_VARIANT_TYPE("au"));
if (dns) {
for (i = 0; dns[i]; i++) {
guint32 ip = 0;
for (i = 0; i < l; i++) {
in_addr_t ip;
inet_pton(AF_INET, dns[i], &ip);
if (inet_pton(AF_INET, dns[i], &ip) == 1)
g_variant_builder_add(&builder, "u", ip);
}
}
return g_variant_builder_end(&builder);
@ -1591,19 +1604,29 @@ nm_utils_ip4_get_default_prefix(guint32 ip)
**/
GVariant *
nm_utils_ip6_dns_to_variant(char **dns)
{
return _nm_utils_ip6_dns_to_variant(NM_CAST_STRV_CC(dns), -1);
}
GVariant *
_nm_utils_ip6_dns_to_variant(const char *const *dns, gssize len)
{
GVariantBuilder builder;
gsize i;
gsize l;
if (len < 0)
l = NM_PTRARRAY_LEN(dns);
else
l = len;
g_variant_builder_init(&builder, G_VARIANT_TYPE("aay"));
if (dns) {
for (i = 0; dns[i]; i++) {
struct in6_addr ip;
for (i = 0; i < l; i++) {
struct in6_addr ip;
if (inet_pton(AF_INET6, dns[i], &ip) != 1)
continue;
g_variant_builder_add(&builder, "@ay", nm_g_variant_new_ay_in6addr(&ip));
}
if (inet_pton(AF_INET6, dns[i], &ip) != 1)
continue;
g_variant_builder_add(&builder, "@ay", nm_g_variant_new_ay_in6addr(&ip));
}
return g_variant_builder_end(&builder);
}
@ -4002,9 +4025,9 @@ nm_utils_hwaddr_to_dbus(const char *str)
return nm_g_variant_new_ay(buf, len);
}
static GVariant *
GVariant *
_nm_utils_hwaddr_cloned_get(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -4012,25 +4035,26 @@ _nm_utils_hwaddr_cloned_get(const NMSettInfoSetting * sett_info,
{
gs_free char *addr = NULL;
nm_assert(nm_streq(sett_info->property_infos[property_idx].name, "cloned-mac-address"));
nm_assert(nm_streq(property_info->name, "cloned-mac-address"));
g_object_get(setting, "cloned-mac-address", &addr, NULL);
return nm_utils_hwaddr_to_dbus(addr);
}
static gboolean
_nm_utils_hwaddr_cloned_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
gboolean
_nm_utils_hwaddr_cloned_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
gsize length;
const guint8 *array;
char * str;
nm_assert(nm_streq0(property, "cloned-mac-address"));
nm_assert(nm_streq0(property_info->name, "cloned-mac-address"));
if (!_nm_setting_use_legacy_property(setting,
connection_dict,
@ -4050,7 +4074,7 @@ _nm_utils_hwaddr_cloned_set(NMSetting * setting,
return TRUE;
}
static gboolean
gboolean
_nm_utils_hwaddr_cloned_not_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
@ -4061,15 +4085,9 @@ _nm_utils_hwaddr_cloned_not_set(NMSetting * setting,
return TRUE;
}
const NMSettInfoPropertType nm_sett_info_propert_type_cloned_mac_address =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_BYTESTRING,
.to_dbus_fcn = _nm_utils_hwaddr_cloned_get,
.from_dbus_fcn = _nm_utils_hwaddr_cloned_set,
.missing_from_dbus_fcn = _nm_utils_hwaddr_cloned_not_set, );
static GVariant *
_nm_utils_hwaddr_cloned_data_synth(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -4080,7 +4098,7 @@ _nm_utils_hwaddr_cloned_data_synth(const NMSettInfoSetting * sett_
if (!_nm_connection_serialize_non_secret(flags))
return NULL;
nm_assert(nm_streq0(sett_info->property_infos[property_idx].name, "assigned-mac-address"));
nm_assert(nm_streq0(property_info->name, "assigned-mac-address"));
g_object_get(setting, "cloned-mac-address", &addr, NULL);
@ -4102,14 +4120,15 @@ _nm_utils_hwaddr_cloned_data_synth(const NMSettInfoSetting * sett_
}
static gboolean
_nm_utils_hwaddr_cloned_data_set(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
_nm_utils_hwaddr_cloned_data_set(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
nm_assert(nm_streq0(property, "assigned-mac-address"));
nm_assert(nm_streq0(property_info->name, "assigned-mac-address"));
if (_nm_setting_use_legacy_property(setting,
connection_dict,
@ -4126,6 +4145,7 @@ _nm_utils_hwaddr_cloned_data_set(NMSetting * setting,
const NMSettInfoPropertType nm_sett_info_propert_type_assigned_mac_address =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_STRING,
.compare_fcn = _nm_setting_property_compare_fcn_ignore,
.to_dbus_fcn = _nm_utils_hwaddr_cloned_data_synth,
.from_dbus_fcn = _nm_utils_hwaddr_cloned_data_set, );
@ -4141,10 +4161,13 @@ _nm_utils_hwaddr_from_dbus(GVariant *dbus_value, GValue *prop_value)
}
const NMSettInfoPropertType nm_sett_info_propert_type_mac_address =
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(
G_VARIANT_TYPE_BYTESTRING,
.gprop_from_dbus_fcn = _nm_utils_hwaddr_from_dbus,
.typdata_to_dbus.gprop_type = NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_MAC_ADDRESS);
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(G_VARIANT_TYPE_BYTESTRING,
.typdata_from_dbus.gprop_fcn = _nm_utils_hwaddr_from_dbus,
.typdata_to_dbus.gprop_type =
NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_MAC_ADDRESS,
.compare_fcn = _nm_setting_property_compare_fcn_default,
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_gprop,
.from_dbus_is_full = TRUE);
/*****************************************************************************/
@ -5445,9 +5468,9 @@ nm_utils_base64secret_normalize(const char *base64_key,
return TRUE;
}
static GVariant *
GVariant *
_nm_utils_bridge_vlans_to_dbus(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
@ -5456,7 +5479,7 @@ _nm_utils_bridge_vlans_to_dbus(const NMSettInfoSetting * sett_info
gs_unref_ptrarray GPtrArray *vlans = NULL;
GVariantBuilder builder;
guint i;
const char * property_name = sett_info->property_infos[property_idx].name;
const char * property_name = property_info->name;
nm_assert(property_name);
@ -5492,13 +5515,14 @@ _nm_utils_bridge_vlans_to_dbus(const NMSettInfoSetting * sett_info
return g_variant_builder_end(&builder);
}
static gboolean
_nm_utils_bridge_vlans_from_dbus(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
gboolean
_nm_utils_bridge_vlans_from_dbus(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error)
{
gs_unref_ptrarray GPtrArray *vlans = NULL;
GVariantIter vlan_iter;
@ -5539,15 +5563,25 @@ _nm_utils_bridge_vlans_from_dbus(NMSetting * setting,
g_ptr_array_add(vlans, vlan);
}
g_object_set(setting, property, vlans, NULL);
g_object_set(setting, property_info->name, vlans, NULL);
return TRUE;
}
const NMSettInfoPropertType nm_sett_info_propert_type_bridge_vlans =
NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(NM_G_VARIANT_TYPE("aa{sv}"),
.to_dbus_fcn = _nm_utils_bridge_vlans_to_dbus,
.from_dbus_fcn = _nm_utils_bridge_vlans_from_dbus, );
NMTernary
_nm_utils_bridge_compare_vlans(GPtrArray *vlans_a, GPtrArray *vlans_b)
{
guint l = nm_g_ptr_array_len(vlans_a);
guint i;
if (l != nm_g_ptr_array_len(vlans_b))
return FALSE;
for (i = 0; i < l; i++) {
if (nm_bridge_vlan_cmp(vlans_a->pdata[i], vlans_b->pdata[i]))
return FALSE;
}
return TRUE;
}
gboolean
_nm_utils_bridge_vlan_verify_list(GPtrArray * vlans,

View file

@ -3094,8 +3094,7 @@ test_setting_new_from_dbus_bad(void)
"i",
10););
conn = _connection_new_from_dbus(dict, &error);
g_assert(conn);
g_assert_no_error(error);
nmtst_assert_success(conn, error);
setting = nm_connection_get_setting(conn, NM_TYPE_SETTING_WIRELESS);
g_assert(setting);
g_assert_cmpint(nm_setting_wireless_get_rate(NM_SETTING_WIRELESS(setting)), ==, 10);

View file

@ -4480,9 +4480,8 @@ test_setting_metadata(void)
if (!sip->property_type->to_dbus_fcn) {
/* it's allowed to have no to_dbus_fcn(), to ignore a property. But such
* properties must not have a param_spec and no gprop_to_dbus_fcn. */
* properties must not have a param_spec. */
g_assert(!sip->param_spec);
g_assert(!sip->to_dbus_data.none);
} else if (sip->property_type->to_dbus_fcn == _nm_setting_property_to_dbus_fcn_gprop) {
g_assert(sip->param_spec);
switch (sip->property_type->typdata_to_dbus.gprop_type) {
@ -4509,21 +4508,58 @@ test_setting_metadata(void)
}
g_assert_not_reached();
check_done:;
if (sip->property_type->typdata_to_dbus.gprop_type
!= NM_SETTING_PROPERTY_TO_DBUS_FCN_GPROP_TYPE_DEFAULT)
g_assert(!sip->to_dbus_data.gprop_to_dbus_fcn);
can_set_including_default = TRUE;
}
if (!can_set_including_default)
g_assert(!sip->to_dbus_data.including_default);
g_assert(!sip->to_dbus_including_default);
g_assert(!sip->property_type->from_dbus_fcn
|| !sip->property_type->gprop_from_dbus_fcn);
g_assert(sip->property_type->from_dbus_fcn || !sip->param_spec);
if (sip->property_type->typdata_from_dbus.gprop_fcn) {
g_assert(sip->property_type->from_dbus_fcn
== _nm_setting_property_from_dbus_fcn_gprop);
}
if (sip->property_type->from_dbus_fcn == _nm_setting_property_from_dbus_fcn_gprop)
g_assert(sip->param_spec);
g_assert(sip->property_type->from_dbus_is_full
== NM_IN_SET(sip->property_type->from_dbus_fcn,
_nm_setting_property_from_dbus_fcn_gprop,
_nm_setting_property_from_dbus_fcn_ignore));
if (!g_hash_table_insert(h_properties, (char *) sip->name, sip->param_spec))
g_assert_not_reached();
if (sip->property_type->compare_fcn == _nm_setting_property_compare_fcn_default) {
g_assert(sip->param_spec);
g_assert_cmpstr(sip->name, !=, NM_SETTING_NAME);
} else if (sip->property_type->compare_fcn == _nm_setting_property_compare_fcn_direct) {
g_assert(sip->param_spec);
g_assert(sip->property_type->direct_type != NM_VALUE_TYPE_NONE);
g_assert(sip->property_type->to_dbus_fcn
== _nm_setting_property_to_dbus_fcn_direct);
} else if (sip->property_type->compare_fcn == _nm_setting_property_compare_fcn_ignore) {
if (NM_IN_SET(sip->property_type,
&nm_sett_info_propert_type_deprecated_ignore_i,
&nm_sett_info_propert_type_deprecated_ignore_u,
&nm_sett_info_propert_type_assigned_mac_address)) {
/* pass */
} else if (!sip->param_spec) {
/* pass */
} else if (nm_streq(sip->name, NM_SETTING_NAME)) {
/* pass */
} else {
/* ignoring a property for comparison make only sense in very specific cases. */
g_assert_not_reached();
}
} else if (sip->property_type->compare_fcn) {
/* pass */
} else {
g_assert_not_reached();
}
g_assert((sip->property_type->compare_fcn != _nm_setting_property_compare_fcn_direct)
|| (sip->property_type->direct_type != NM_VALUE_TYPE_NONE));
property_types_data = g_hash_table_lookup(h_property_types, sip->property_type);
if (!property_types_data) {
property_types_data = g_array_new(FALSE, FALSE, sizeof(guint));
@ -4540,6 +4576,11 @@ check_done:;
g_assert_cmpstr(sip->name, ==, sip->param_spec->name);
g_assert(NM_FLAGS_HAS(sip->param_spec->flags, G_PARAM_WRITABLE)
!= nm_streq(sip->name, NM_SETTING_NAME));
g_assert((sip->property_type == &nm_sett_info_propert_type_setting_name)
== nm_streq(sip->name, NM_SETTING_NAME));
g_value_init(&val, sip->param_spec->value_type);
g_object_get_property(G_OBJECT(setting), sip->name, &val);
@ -4675,8 +4716,12 @@ check_done:;
if (!g_variant_type_equal(pt->dbus_type, pt_2->dbus_type)
|| pt->direct_type != pt_2->direct_type || pt->to_dbus_fcn != pt_2->to_dbus_fcn
|| pt->from_dbus_fcn != pt_2->from_dbus_fcn
|| pt->compare_fcn != pt_2->compare_fcn
|| pt->missing_from_dbus_fcn != pt_2->missing_from_dbus_fcn
|| pt->gprop_from_dbus_fcn != pt_2->gprop_from_dbus_fcn
|| memcmp(&pt->typdata_from_dbus,
&pt_2->typdata_from_dbus,
sizeof(pt->typdata_from_dbus))
!= 0
|| memcmp(&pt->typdata_to_dbus,
&pt_2->typdata_to_dbus,
sizeof(pt->typdata_to_dbus))

View file

@ -651,23 +651,23 @@ typedef struct _NMSettInfoSetting NMSettInfoSetting;
typedef struct _NMSettInfoProperty NMSettInfoProperty;
typedef GVariant *(*NMSettInfoPropToDBusFcn)(const NMSettInfoSetting * sett_info,
guint property_idx,
const NMSettInfoProperty * property_info,
NMConnection * connection,
NMSetting * setting,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options);
typedef gboolean (*NMSettInfoPropFromDBusFcn)(NMSetting * setting,
GVariant * connection_dict,
const char * property,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error);
typedef gboolean (*NMSettInfoPropFromDBusFcn)(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMSetting * setting,
GVariant * connection_dict,
GVariant * value,
NMSettingParseFlags parse_flags,
GError ** error);
typedef gboolean (*NMSettInfoPropMissingFromDBusFcn)(NMSetting * setting,
GVariant * connection_dict,
const char * property,
NMSettingParseFlags parse_flags,
GError ** error);
typedef GVariant *(*NMSettInfoPropGPropToDBusFcn)(const GValue *from);
typedef void (*NMSettInfoPropGPropFromDBusFcn)(GVariant *from, GValue *to);
const NMSettInfoSetting *nmtst_sett_info_settings(void);
@ -693,13 +693,41 @@ typedef struct {
* to the property value. */
NMValueType direct_type;
/* Whether from_dbus_fcn() has special capabilities
*
* - whether the from_dbus_fcn expects to handle differences between
* the D-Bus types and can convert between them. Otherwise, the caller
* will already pre-validate that the D-Bus types match.
* - by default, with NM_SETTING_PARSE_FLAGS_BEST_EFFORT all errors from
* from_dbus_fcn() are ignored. If true, then error are propagated. */
bool from_dbus_is_full : 1;
/* compare_fcn() returns a ternary, where DEFAULT means that the property should not
* be compared due to the compare @flags. A TRUE/FALSE result means that the property is
* equal/not-equal.
*
* The "b" setting may be %NULL, in which case the function only determines whether
* the setting should be compared (TRUE) or not (DEFAULT). */
NMTernary (*compare_fcn)(const NMSettInfoSetting * sett_info,
const NMSettInfoProperty *property_info,
NMConnection * con_a,
NMSetting * set_a,
NMConnection * con_b,
NMSetting * set_b,
NMSettingCompareFlags flags);
NMSettInfoPropToDBusFcn to_dbus_fcn;
NMSettInfoPropFromDBusFcn from_dbus_fcn;
NMSettInfoPropMissingFromDBusFcn missing_from_dbus_fcn;
/* Simpler variants of @from_dbus_fcn that operate solely
* on the GValue value of the GObject property. */
NMSettInfoPropGPropFromDBusFcn gprop_from_dbus_fcn;
struct {
union {
/* If from_dbus_fcn is set to _nm_setting_property_from_dbus_fcn_gprop,
* then this is an optional handler for converting between GVariant and
* GValue. */
NMSettInfoPropGPropFromDBusFcn gprop_fcn;
};
} typdata_from_dbus;
struct {
union {
@ -731,18 +759,11 @@ struct _NMSettInfoProperty {
* except of marking those properties and serve as a reminder that special care needs to be taken. */
bool direct_has_special_setter : 1;
struct {
union {
gpointer none;
NMSettInfoPropGPropToDBusFcn gprop_to_dbus_fcn;
};
/* Usually, properties that are set to the default value for the GParamSpec
* are not serialized to GVariant (and NULL is returned by to_dbus_data().
* Set this flag to force always converting the property even if the value
* is the default. */
bool including_default : 1;
} to_dbus_data;
/* Usually, properties that are set to the default value for the GParamSpec
* are not serialized to GVariant (and NULL is returned by to_dbus_data().
* Set this flag to force always converting the property even if the value
* is the default. */
bool to_dbus_including_default : 1;
};
typedef struct {
@ -952,4 +973,6 @@ _nm_variant_attribute_spec_find_binary_search(const NMVariantAttributeSpec *cons
gboolean _nm_ip_tunnel_mode_is_layer2(NMIPTunnelMode mode);
GPtrArray *_nm_setting_ip_config_get_dns_array(NMSettingIPConfig *setting);
#endif