diff options
author | Dan Winship <danw@gnome.org> | 2014-08-26 08:31:04 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-09-04 09:21:04 -0400 |
commit | 074c2093b6a733c3d5712a7c58386e1e652a8903 (patch) | |
tree | 37c48864a54e5596ad7775f7368cad98dba6ce55 | |
parent | 20dc44bda9e07222e46675507731b1532b4b20f2 (diff) | |
download | NetworkManager-074c2093b6a733c3d5712a7c58386e1e652a8903.tar.gz |
libnm: drop NM_TYPE_OBJECT_ARRAY, use G_TYPE_PTR_ARRAY
Use G_TYPE_PTR_ARRAY for GPtrArray-of-NMObject-valued properties,
because it has better introspection/bindings support.
As with the strdict change in libnm-core, we need to manually copy the
array in get_property() implementations, to preserve the standard
semantics that get_property() returns a copy, not the internal array.
(This patch also changes those properties so that they are always
non-NULL until dispose(); previously some of them could be either NULL
or 0-length at different times.)
-rw-r--r-- | libnm-core/nm-core-internal.h | 5 | ||||
-rw-r--r-- | libnm-core/nm-utils.c | 20 | ||||
-rw-r--r-- | libnm/libnm.ver | 1 | ||||
-rw-r--r-- | libnm/nm-active-connection.c | 18 | ||||
-rw-r--r-- | libnm/nm-client.c | 54 | ||||
-rw-r--r-- | libnm/nm-device-bond.c | 16 | ||||
-rw-r--r-- | libnm/nm-device-bridge.c | 16 | ||||
-rw-r--r-- | libnm/nm-device-team.c | 16 | ||||
-rw-r--r-- | libnm/nm-device-wifi.c | 38 | ||||
-rw-r--r-- | libnm/nm-device-wimax.c | 26 | ||||
-rw-r--r-- | libnm/nm-device.c | 19 | ||||
-rw-r--r-- | libnm/nm-object.c | 8 | ||||
-rw-r--r-- | libnm/nm-remote-settings.c | 46 | ||||
-rw-r--r-- | libnm/nm-types-private.h | 4 | ||||
-rw-r--r-- | libnm/nm-types.c | 82 | ||||
-rw-r--r-- | libnm/nm-types.h | 3 |
16 files changed, 148 insertions, 224 deletions
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index d5e85e1475..c7f31f1957 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -73,4 +73,9 @@ GPtrArray *_nm_utils_copy_slist_to_array (const GSList *list, GSList *_nm_utils_copy_array_to_slist (const GPtrArray *array, NMUtilsCopyFunc copy_func); +GPtrArray *_nm_utils_copy_array (const GPtrArray *array, + NMUtilsCopyFunc copy_func, + GDestroyNotify free_func); +GPtrArray *_nm_utils_copy_object_array (const GPtrArray *array); + #endif diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 06261b0d25..591b1e1d52 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -626,6 +626,26 @@ _nm_utils_copy_array_to_slist (const GPtrArray *array, return g_slist_reverse (slist); } +GPtrArray * +_nm_utils_copy_array (const GPtrArray *array, + NMUtilsCopyFunc copy_func, + GDestroyNotify free_func) +{ + GPtrArray *copy; + int i; + + copy = g_ptr_array_new_full (array->len, free_func); + for (i = 0; i < array->len; i++) + g_ptr_array_add (copy, copy_func (array->pdata[i])); + return copy; +} + +GPtrArray * +_nm_utils_copy_object_array (const GPtrArray *array) +{ + return _nm_utils_copy_array (array, g_object_ref, g_object_unref); +} + void _nm_utils_bytes_to_dbus (const GValue *prop_value, GValue *dbus_value) diff --git a/libnm/libnm.ver b/libnm/libnm.ver index 948eb058fe..d2dd6b8e4a 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -337,7 +337,6 @@ global: nm_ip6_route_set_next_hop; nm_ip6_route_set_prefix; nm_ip6_route_unref; - nm_object_array_get_type; nm_object_error_get_type; nm_object_error_quark; nm_object_get_dbus_connection; diff --git a/libnm/nm-active-connection.c b/libnm/nm-active-connection.c index 6491cd2c8b..659b820d82 100644 --- a/libnm/nm-active-connection.c +++ b/libnm/nm-active-connection.c @@ -24,7 +24,7 @@ #include "nm-dbus-interface.h" #include "nm-active-connection.h" #include "nm-object-private.h" -#include "nm-types-private.h" +#include "nm-core-internal.h" #include "nm-device.h" #include "nm-device-private.h" #include "nm-connection.h" @@ -454,11 +454,7 @@ dispose (GObject *object) { NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object); - if (priv->devices) { - g_ptr_array_set_free_func (priv->devices, g_object_unref); - g_ptr_array_free (priv->devices, TRUE); - priv->devices = NULL; - } + g_clear_pointer (&priv->devices, g_ptr_array_unref); g_clear_object (&priv->ip4_config); g_clear_object (&priv->dhcp4_config); @@ -510,7 +506,7 @@ get_property (GObject *object, g_value_set_boxed (value, nm_active_connection_get_specific_object (self)); break; case PROP_DEVICES: - g_value_set_boxed (value, nm_active_connection_get_devices (self)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_active_connection_get_devices (self))); break; case PROP_STATE: g_value_set_uint (value, nm_active_connection_get_state (self)); @@ -656,14 +652,16 @@ nm_active_connection_class_init (NMActiveConnectionClass *ap_class) G_PARAM_STATIC_STRINGS)); /** - * NMActiveConnection:device: + * NMActiveConnection:devices: + * + * The devices of the active connection. * - * The devices (#NMDevice) of the active connection. + * Element-type: NMDevice **/ g_object_class_install_property (object_class, PROP_DEVICES, g_param_spec_boxed (NM_ACTIVE_CONNECTION_DEVICES, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/libnm/nm-client.c b/libnm/nm-client.c index c7a61e76cc..fdbaed38b7 100644 --- a/libnm/nm-client.c +++ b/libnm/nm-client.c @@ -27,7 +27,7 @@ #include "nm-device-ethernet.h" #include "nm-device-wifi.h" #include "nm-device-private.h" -#include "nm-types-private.h" +#include "nm-core-internal.h" #include "nm-object-private.h" #include "nm-active-connection.h" #include "nm-vpn-connection.h" @@ -152,7 +152,7 @@ poke_wireless_devices_with_rf_status (NMClient *client) NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); int i; - for (i = 0; priv->devices && (i < priv->devices->len); i++) { + for (i = 0; i < priv->devices->len; i++) { NMDevice *device = g_ptr_array_index (priv->devices, i); if (NM_IS_DEVICE_WIFI (device)) @@ -1243,7 +1243,7 @@ nm_client_get_activating_connection (NMClient *client) /****************************************************************/ static void -free_devices (NMClient *client, gboolean emit_signals) +free_devices (NMClient *client, gboolean in_dispose) { NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); GPtrArray *devices; @@ -1254,18 +1254,23 @@ free_devices (NMClient *client, gboolean emit_signals) return; devices = priv->devices; - priv->devices = NULL; - for (i = 0; i < devices->len; i++) { - device = devices->pdata[i]; - if (emit_signals) + + if (in_dispose) + priv->devices = NULL; + else { + priv->devices = g_ptr_array_new (); + + for (i = 0; i < devices->len; i++) { + device = devices->pdata[i]; g_signal_emit (client, signals[DEVICE_REMOVED], 0, device); - g_object_unref (device); + } } - g_ptr_array_free (devices, TRUE); + + g_ptr_array_unref (devices); } static void -free_active_connections (NMClient *client, gboolean emit_signals) +free_active_connections (NMClient *client, gboolean in_dispose) { NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); GPtrArray *active_connections; @@ -1277,16 +1282,18 @@ free_active_connections (NMClient *client, gboolean emit_signals) active_connections = priv->active_connections; priv->active_connections = NULL; + for (i = 0; i < active_connections->len; i++) { active_connection = active_connections->pdata[i]; /* Break circular refs */ g_object_run_dispose (G_OBJECT (active_connection)); - g_object_unref (active_connection); } - g_ptr_array_free (active_connections, TRUE); + g_ptr_array_unref (active_connections); - if (emit_signals) + if (!in_dispose) { + priv->active_connections = g_ptr_array_new (); g_object_notify (G_OBJECT (client), NM_CLIENT_ACTIVE_CONNECTIONS); + } } static void @@ -1317,8 +1324,8 @@ nm_running_changed_cb (GObject *object, _nm_object_queue_notify (NM_OBJECT (client), NM_CLIENT_NM_RUNNING); _nm_object_suppress_property_updates (NM_OBJECT (client), TRUE); poke_wireless_devices_with_rf_status (client); - free_devices (client, TRUE); - free_active_connections (client, TRUE); + free_devices (client, FALSE); + free_active_connections (client, FALSE); update_permissions (client, NULL); priv->wireless_enabled = FALSE; priv->wireless_hw_enabled = FALSE; @@ -1817,8 +1824,8 @@ dispose (GObject *object) g_clear_object (&priv->client_proxy); - free_devices (client, FALSE); - free_active_connections (client, FALSE); + free_devices (client, TRUE); + free_active_connections (client, TRUE); g_clear_object (&priv->primary_connection); g_clear_object (&priv->activating_connection); @@ -1927,7 +1934,7 @@ get_property (GObject *object, g_value_set_boolean (value, priv->wimax_hw_enabled); break; case PROP_ACTIVE_CONNECTIONS: - g_value_set_boxed (value, nm_client_get_active_connections (self)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_client_get_active_connections (self))); break; case PROP_CONNECTIVITY: g_value_set_uint (value, priv->connectivity); @@ -1939,7 +1946,7 @@ get_property (GObject *object, g_value_set_object (value, priv->activating_connection); break; case PROP_DEVICES: - g_value_set_boxed (value, nm_client_get_devices (self)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_client_get_devices (self))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -2103,12 +2110,13 @@ nm_client_class_init (NMClientClass *client_class) * NMClient:active-connections: * * The active connections. - * Type: GLib.PtrArray + * + * Element-type: NMActiveConnection **/ g_object_class_install_property (object_class, PROP_ACTIVE_CONNECTIONS, g_param_spec_boxed (NM_CLIENT_ACTIVE_CONNECTIONS, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -2154,11 +2162,13 @@ nm_client_class_init (NMClientClass *client_class) * NMClient:devices: * * List of known network devices. + * + * Element-type: NMDevice **/ g_object_class_install_property (object_class, PROP_DEVICES, g_param_spec_boxed (NM_CLIENT_DEVICES, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/libnm/nm-device-bond.c b/libnm/nm-device-bond.c index 03eb4161ea..d0a3e94a82 100644 --- a/libnm/nm-device-bond.c +++ b/libnm/nm-device-bond.c @@ -30,7 +30,7 @@ #include "nm-device-bond.h" #include "nm-device-private.h" #include "nm-object-private.h" -#include "nm-types.h" +#include "nm-core-internal.h" G_DEFINE_TYPE (NMDeviceBond, nm_device_bond, NM_TYPE_DEVICE) @@ -204,11 +204,7 @@ dispose (GObject *object) g_clear_object (&priv->proxy); - if (priv->slaves) { - g_ptr_array_set_free_func (priv->slaves, g_object_unref); - g_ptr_array_free (priv->slaves, TRUE); - priv->slaves = NULL; - } + g_clear_pointer (&priv->slaves, g_ptr_array_unref); G_OBJECT_CLASS (nm_device_bond_parent_class)->dispose (object); } @@ -239,7 +235,7 @@ get_property (GObject *object, g_value_set_boolean (value, nm_device_bond_get_carrier (device)); break; case PROP_SLAVES: - g_value_set_boxed (value, nm_device_bond_get_slaves (device)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_device_bond_get_slaves (device))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -296,12 +292,14 @@ nm_device_bond_class_init (NMDeviceBondClass *bond_class) /** * NMDeviceBond:slaves: * - * The devices (#NMDevice) slaved to the bond device. + * The devices slaved to the bond device. + * + * Element-type: NMDevice **/ g_object_class_install_property (object_class, PROP_SLAVES, g_param_spec_boxed (NM_DEVICE_BOND_SLAVES, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } diff --git a/libnm/nm-device-bridge.c b/libnm/nm-device-bridge.c index d25a30a960..1a17196656 100644 --- a/libnm/nm-device-bridge.c +++ b/libnm/nm-device-bridge.c @@ -30,7 +30,7 @@ #include "nm-device-bridge.h" #include "nm-device-private.h" #include "nm-object-private.h" -#include "nm-types.h" +#include "nm-core-internal.h" G_DEFINE_TYPE (NMDeviceBridge, nm_device_bridge, NM_TYPE_DEVICE) @@ -204,11 +204,7 @@ dispose (GObject *object) g_clear_object (&priv->proxy); - if (priv->slaves) { - g_ptr_array_set_free_func (priv->slaves, g_object_unref); - g_ptr_array_free (priv->slaves, TRUE); - priv->slaves = NULL; - } + g_clear_pointer (&priv->slaves, g_ptr_array_unref); G_OBJECT_CLASS (nm_device_bridge_parent_class)->dispose (object); } @@ -239,7 +235,7 @@ get_property (GObject *object, g_value_set_boolean (value, nm_device_bridge_get_carrier (device)); break; case PROP_SLAVES: - g_value_set_boxed (value, nm_device_bridge_get_slaves (device)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_device_bridge_get_slaves (device))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -296,12 +292,14 @@ nm_device_bridge_class_init (NMDeviceBridgeClass *bridge_class) /** * NMDeviceBridge:slaves: * - * The devices (#NMDevice) slaved to the bridge device. + * The devices slaved to the bridge device. + * + * Element-type: NMDevice **/ g_object_class_install_property (object_class, PROP_SLAVES, g_param_spec_boxed (NM_DEVICE_BRIDGE_SLAVES, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } diff --git a/libnm/nm-device-team.c b/libnm/nm-device-team.c index 0a6fed379a..0aeda17039 100644 --- a/libnm/nm-device-team.c +++ b/libnm/nm-device-team.c @@ -30,7 +30,7 @@ #include "nm-device-team.h" #include "nm-device-private.h" #include "nm-object-private.h" -#include "nm-types.h" +#include "nm-core-internal.h" G_DEFINE_TYPE (NMDeviceTeam, nm_device_team, NM_TYPE_DEVICE) @@ -204,11 +204,7 @@ dispose (GObject *object) g_clear_object (&priv->proxy); - if (priv->slaves) { - g_ptr_array_set_free_func (priv->slaves, g_object_unref); - g_ptr_array_free (priv->slaves, TRUE); - priv->slaves = NULL; - } + g_clear_pointer (&priv->slaves, g_ptr_array_unref); G_OBJECT_CLASS (nm_device_team_parent_class)->dispose (object); } @@ -239,7 +235,7 @@ get_property (GObject *object, g_value_set_boolean (value, nm_device_team_get_carrier (device)); break; case PROP_SLAVES: - g_value_set_boxed (value, nm_device_team_get_slaves (device)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_device_team_get_slaves (device))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -296,12 +292,14 @@ nm_device_team_class_init (NMDeviceTeamClass *team_class) /** * NMDeviceTeam:slaves: * - * The devices (#NMDevice) enslaved to the team device. + * The devices enslaved to the team device. + * + * Element-type: NMDevice **/ g_object_class_install_property (object_class, PROP_SLAVES, g_param_spec_boxed (NM_DEVICE_TEAM_SLAVES, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } diff --git a/libnm/nm-device-wifi.c b/libnm/nm-device-wifi.c index f06232c374..6a41ccc218 100644 --- a/libnm/nm-device-wifi.c +++ b/libnm/nm-device-wifi.c @@ -34,7 +34,7 @@ #include "nm-object-private.h" #include "nm-object-cache.h" #include "nm-dbus-glib-types.h" -#include "nm-types-private.h" +#include "nm-core-internal.h" G_DEFINE_TYPE (NMDeviceWifi, nm_device_wifi, NM_TYPE_DEVICE) @@ -348,9 +348,11 @@ nm_device_wifi_request_scan_simple (NMDeviceWifi *device, } static void -clean_up_aps (NMDeviceWifi *self, gboolean notify) +clean_up_aps (NMDeviceWifi *self, gboolean in_dispose) { NMDeviceWifiPrivate *priv; + GPtrArray *aps; + int i; g_return_if_fail (NM_IS_DEVICE_WIFI (self)); @@ -361,18 +363,21 @@ clean_up_aps (NMDeviceWifi *self, gboolean notify) priv->active_ap = NULL; } - if (priv->aps) { - while (priv->aps->len) { - NMAccessPoint *ap = NM_ACCESS_POINT (g_ptr_array_index (priv->aps, 0)); + aps = priv->aps; - if (notify) - g_signal_emit (self, signals[ACCESS_POINT_REMOVED], 0, ap); - g_ptr_array_remove (priv->aps, ap); - g_object_unref (ap); - } - g_ptr_array_free (priv->aps, TRUE); + if (in_dispose) priv->aps = NULL; + else { + priv->aps = g_ptr_array_new (); + + for (i = 0; i < aps->len; i++) { + NMAccessPoint *ap = NM_ACCESS_POINT (g_ptr_array_index (aps, i)); + + g_signal_emit (self, signals[ACCESS_POINT_REMOVED], 0, ap); + } } + + g_ptr_array_unref (aps); } /** @@ -389,7 +394,7 @@ _nm_device_wifi_set_wireless_enabled (NMDeviceWifi *device, g_return_if_fail (NM_IS_DEVICE_WIFI (device)); if (!enabled) - clean_up_aps (device, TRUE); + clean_up_aps (device, FALSE); } #define WPA_CAPS (NM_WIFI_DEVICE_CAP_CIPHER_TKIP | \ @@ -538,7 +543,7 @@ get_property (GObject *object, g_value_set_uint (value, nm_device_wifi_get_capabilities (self)); break; case PROP_ACCESS_POINTS: - g_value_set_boxed (value, nm_device_wifi_get_access_points (self)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_device_wifi_get_access_points (self))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -631,7 +636,8 @@ dispose (GObject *object) priv->scan_call = NULL; } - clean_up_aps (NM_DEVICE_WIFI (object), FALSE); + if (priv->aps) + clean_up_aps (NM_DEVICE_WIFI (object), TRUE); g_clear_object (&priv->proxy); G_OBJECT_CLASS (nm_device_wifi_parent_class)->dispose (object); @@ -748,11 +754,13 @@ nm_device_wifi_class_init (NMDeviceWifiClass *wifi_class) * NMDeviceWifi:access-points: * * List of all Wi-Fi access points the device can see. + * + * Element-type: NMAccessPoint **/ g_object_class_install_property (object_class, PROP_ACCESS_POINTS, g_param_spec_boxed (NM_DEVICE_WIFI_ACCESS_POINTS, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/libnm/nm-device-wimax.c b/libnm/nm-device-wimax.c index 72b25c2b6d..5f190ea3f0 100644 --- a/libnm/nm-device-wimax.c +++ b/libnm/nm-device-wimax.c @@ -32,7 +32,7 @@ #include "nm-object-private.h" #include "nm-object-cache.h" #include "nm-dbus-glib-types.h" -#include "nm-types-private.h" +#include "nm-core-internal.h" #include "nm-device-private.h" G_DEFINE_TYPE (NMDeviceWimax, nm_device_wimax, NM_TYPE_DEVICE) @@ -200,7 +200,7 @@ nm_device_wimax_get_nsp_by_path (NMDeviceWimax *wimax, } static void -clean_up_nsps (NMDeviceWimax *self, gboolean notify) +clean_up_nsps (NMDeviceWimax *self) { NMDeviceWimaxPrivate *priv; @@ -213,18 +213,7 @@ clean_up_nsps (NMDeviceWimax *self, gboolean notify) priv->active_nsp = NULL; } - if (priv->nsps) { - while (priv->nsps->len) { - NMWimaxNsp *nsp = NM_WIMAX_NSP (g_ptr_array_index (priv->nsps, 0)); - - if (notify) - g_signal_emit (self, signals[NSP_REMOVED], 0, nsp); - g_ptr_array_remove (priv->nsps, nsp); - g_object_unref (nsp); - } - g_ptr_array_free (priv->nsps, TRUE); - priv->nsps = NULL; - } + g_clear_pointer (&priv->nsps, g_ptr_array_unref); } /** @@ -416,7 +405,7 @@ get_property (GObject *object, g_value_set_string (value, nm_device_wimax_get_bsid (self)); break; case PROP_NSPS: - g_value_set_boxed (value, nm_device_wimax_get_nsps (self)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_device_wimax_get_nsps (self))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -539,7 +528,8 @@ dispose (GObject *object) priv->bsid = NULL; } - clean_up_nsps (NM_DEVICE_WIMAX (object), FALSE); + if (priv->nsps) + clean_up_nsps (NM_DEVICE_WIMAX (object)); g_clear_object (&priv->proxy); G_OBJECT_CLASS (nm_device_wimax_parent_class)->dispose (object); @@ -666,11 +656,13 @@ nm_device_wimax_class_init (NMDeviceWimaxClass *wimax_class) * NMDeviceWimax:nsps: * * List of all WiMAX Network Service Providers the device can see. + * + * Element-type: NMWimaxNsp **/ g_object_class_install_property (object_class, PROP_NSPS, g_param_spec_boxed (NM_DEVICE_WIMAX_NSPS, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/libnm/nm-device.c b/libnm/nm-device.c index 88d8514f4e..3e67f09472 100644 --- a/libnm/nm-device.c +++ b/libnm/nm-device.c @@ -43,7 +43,7 @@ #include "nm-object-private.h" #include "nm-object-cache.h" #include "nm-remote-connection.h" -#include "nm-types.h" +#include "nm-core-internal.h" #include "nm-dbus-glib-types.h" #include "nm-glib-compat.h" #include "nm-utils.h" @@ -375,14 +375,7 @@ dispose (GObject *object) g_clear_object (&priv->client); g_clear_object (&priv->active_connection); - if (priv->available_connections) { - int i; - - for (i = 0; i < priv->available_connections->len; i++) - g_object_unref (priv->available_connections->pdata[i]); - g_ptr_array_free (priv->available_connections, TRUE); - priv->available_connections = NULL; - } + g_clear_pointer (&priv->available_connections, g_ptr_array_unref); G_OBJECT_CLASS (nm_device_parent_class)->dispose (object); } @@ -474,7 +467,7 @@ get_property (GObject *object, g_value_set_object (value, nm_device_get_active_connection (device)); break; case PROP_AVAILABLE_CONNECTIONS: - g_value_set_boxed (value, nm_device_get_available_connections (device)); + g_value_take_boxed (value, _nm_utils_copy_object_array (nm_device_get_available_connections (device))); break; case PROP_PRODUCT: g_value_set_string (value, nm_device_get_product (device)); @@ -766,12 +759,14 @@ nm_device_class_init (NMDeviceClass *device_class) /** * NMDevice:available-connections: * - * The available connections (#NMRemoteConnection) of the device + * The available connections of the device + * + * Element-type: NMRemoteConnection **/ g_object_class_install_property (object_class, PROP_AVAILABLE_CONNECTIONS, g_param_spec_boxed (NM_DEVICE_AVAILABLE_CONNECTIONS, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/libnm/nm-object.c b/libnm/nm-object.c index 842643910b..4b08d95f9b 100644 --- a/libnm/nm-object.c +++ b/libnm/nm-object.c @@ -806,7 +806,7 @@ object_property_complete (ObjectCreatedData *odata) int i; /* Build up new array */ - new = g_ptr_array_sized_new (odata->length); + new = g_ptr_array_new_full (odata->length, g_object_unref); for (i = 0; i < odata->length; i++) add_to_object_array_unique (new, odata->objects[i]); @@ -843,8 +843,8 @@ object_property_complete (ObjectCreatedData *odata) } different = removed->len || added->len; - g_ptr_array_free (added, TRUE); - g_ptr_array_free (removed, TRUE); + g_ptr_array_unref (added); + g_ptr_array_unref (removed); } else { /* No added/removed signals to send, just replace the property with * the new values. @@ -857,7 +857,7 @@ object_property_complete (ObjectCreatedData *odata) * any objects in the 'removed' array. */ if (old) - g_boxed_free (NM_TYPE_OBJECT_ARRAY, old); + g_ptr_array_unref (old); } else { GObject **obj_p = pi->field; diff --git a/libnm/nm-remote-settings.c b/libnm/nm-remote-settings.c index 3a5810d35e..8c570f2062 100644 --- a/libnm/nm-remote-settings.c +++ b/libnm/nm-remote-settings.c @@ -30,7 +30,7 @@ #include "nm-dbus-helpers-private.h" #include "nm-glib-compat.h" #include "nm-object-private.h" -#include "nm-types.h" +#include "nm-core-internal.h" /** * SECTION:nm-remote-settings @@ -333,12 +333,10 @@ connection_removed (NMRemoteSettings *self, int i; /* Check if the connection was actually removed or if it just turned invisible. */ - if (priv->all_connections) { - for (i = 0; i < priv->all_connections->len; i++) { - if (remote == priv->all_connections->pdata[i]) { - still_exists = TRUE; - break; - } + for (i = 0; i < priv->all_connections->len; i++) { + if (remote == priv->all_connections->pdata[i]) { + still_exists = TRUE; + break; } } @@ -743,19 +741,15 @@ nm_running_changed (GObject *object, g_object_freeze_notify (object); if (!_nm_object_get_nm_running (NM_OBJECT (self))) { - if (priv->all_connections) { - GPtrArray *connections; - int i; - - connections = priv->all_connections; - priv->all_connections = NULL; + GPtrArray *connections; + int i; - for (i = 0; i < connections->len; i++) { - g_signal_emit (self, signals[CONNECTION_REMOVED], 0, connections->pdata[i]); - g_object_unref (connections->pdata[i]); - } - g_ptr_array_unref (connections); - } + /* Clear connections */ + connections = priv->all_connections; + priv->all_connections = g_ptr_array_new (); + for (i = 0; i < connections->len; i++) + g_signal_emit (self, signals[CONNECTION_REMOVED], 0, connections->pdata[i]); + g_ptr_array_unref (connections); /* Clear properties */ if (priv->hostname) { @@ -912,19 +906,17 @@ dispose (GObject *object) { NMRemoteSettings *self = NM_REMOTE_SETTINGS (object); NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); + int i; while (g_slist_length (priv->add_list)) add_connection_info_dispose (self, (AddConnectionInfo *) priv->add_list->data); if (priv->all_connections) { - int i; - - for (i = 0; i < priv->all_connections->len; i++) { + for (i = 0; i < priv->all_connections->len; i++) cleanup_connection (self, priv->all_connections->pdata[i]); - g_object_unref (priv->all_connections->pdata[i]); - } g_clear_pointer (&priv->all_connections, g_ptr_array_unref); } + g_clear_pointer (&priv->visible_connections, g_ptr_array_unref); g_clear_pointer (&priv->hostname, g_free); g_clear_object (&priv->proxy); @@ -943,7 +935,7 @@ get_property (GObject *object, guint prop_id, g_value_set_boolean (value, _nm_object_get_nm_running (NM_OBJECT (object))); break; case PROP_CONNECTIONS: - g_value_set_boxed (value, priv->visible_connections); + g_value_take_boxed (value, _nm_utils_copy_object_array (priv->visible_connections)); break; case PROP_HOSTNAME: g_value_set_string (value, priv->hostname); @@ -998,12 +990,12 @@ nm_remote_settings_class_init (NMRemoteSettingsClass *class) * contain the object paths of connections that the user does not have * permission to read the details of.) * - * Type: GPtrArray + * Element-type: NMRemoteConnection */ g_object_class_install_property (object_class, PROP_CONNECTIONS, g_param_spec_boxed (NM_REMOTE_SETTINGS_CONNECTIONS, "", "", - NM_TYPE_OBJECT_ARRAY, + G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/libnm/nm-types-private.h b/libnm/nm-types-private.h index f95364c7ea..72c41b6920 100644 --- a/libnm/nm-types-private.h +++ b/libnm/nm-types-private.h @@ -26,10 +26,6 @@ #include "nm-object-private.h" gboolean _nm_uint_array_demarshal (GValue *value, GArray **dest); -gboolean _nm_object_array_demarshal (GValue *value, - GPtrArray **dest, - DBusGConnection *connection, - NMObjectCreatorFunc func); gboolean _nm_ip6_address_array_demarshal (GValue *value, GSList **dest); #endif /* __NM_TYPES_PRIVATE_H__ */ diff --git a/libnm/nm-types.c b/libnm/nm-types.c index ad1a6c2f79..6ca32b3b24 100644 --- a/libnm/nm-types.c +++ b/libnm/nm-types.c @@ -81,88 +81,6 @@ _nm_uint_array_demarshal (GValue *value, GArray **dest) /*****************************/ static gpointer -_nm_object_array_copy (GPtrArray *src) -{ - GPtrArray *dest; - int i; - - dest = g_ptr_array_sized_new (src->len); - for (i = 0; i < src->len; i++) - g_ptr_array_add (dest, g_object_ref (g_ptr_array_index (src, i))); - return dest; -} - -static void -_nm_object_array_free (GPtrArray *array) -{ - int i; - - for (i = 0; i < array->len; i++) - g_object_unref (g_ptr_array_index (array, i)); - g_ptr_array_free (array, TRUE); -} - -GType -nm_object_array_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (g_intern_static_string ("NMObjectArray"), - (GBoxedCopyFunc) _nm_object_array_copy, - (GBoxedFreeFunc) _nm_object_array_free); - return our_type; -} - -gboolean -_nm_object_array_demarshal (GValue *value, - GPtrArray **dest, - DBusGConnection *connection, - NMObjectCreatorFunc func) -{ - GPtrArray *temp = NULL; - GPtrArray *array; - - if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH)) - return FALSE; - - array = (GPtrArray *) g_value_get_boxed (value); - if (array && array->len) { - int i; - - temp = g_ptr_array_sized_new (array->len); - for (i = 0; i < array->len; i++) { - const char *path; - GObject *object; - - path = g_ptr_array_index (array, i); - object = G_OBJECT (_nm_object_cache_get (path)); - if (object) - g_ptr_array_add (temp, object); - else { - object = (*func) (connection, path); - if (object) - g_ptr_array_add (temp, object); - else - g_warning ("%s: couldn't create object for %s", __func__, path); - } - } - } else - temp = g_ptr_array_new (); - - /* Deallocate after to ensure that an object that might already - * be in the array doesn't get destroyed due to refcounting. - */ - if (*dest) - g_boxed_free (NM_TYPE_OBJECT_ARRAY, *dest); - *dest = temp; - - return TRUE; -} - -/*****************************/ - -static gpointer _nm_ip6_address_object_array_copy (GPtrArray *src) { GPtrArray *dest; diff --git a/libnm/nm-types.h b/libnm/nm-types.h index 140bc451fd..c55edf82be 100644 --- a/libnm/nm-types.h +++ b/libnm/nm-types.h @@ -35,9 +35,6 @@ G_BEGIN_DECLS #define NM_TYPE_UINT_ARRAY (nm_uint_array_get_type ()) GType nm_uint_array_get_type (void) G_GNUC_CONST; -#define NM_TYPE_OBJECT_ARRAY (nm_object_array_get_type ()) -GType nm_object_array_get_type (void) G_GNUC_CONST; - #define NM_TYPE_IP6_ADDRESS_OBJECT_ARRAY (nm_ip6_address_object_array_get_type ()) GType nm_ip6_address_object_array_get_type (void) G_GNUC_CONST; |