diff --git a/libnm/nm-client.c b/libnm/nm-client.c index 47f1548e24..75eaf3d192 100644 --- a/libnm/nm-client.c +++ b/libnm/nm-client.c @@ -2321,6 +2321,7 @@ typedef struct { GCancellable *cancellable; GSimpleAsyncResult *result; int pending_init; + guint idle_init_id; } NMClientInitData; static void @@ -2329,6 +2330,7 @@ init_async_complete (NMClientInitData *init_data) g_simple_async_result_complete (init_data->result); g_object_unref (init_data->result); g_clear_object (&init_data->cancellable); + nm_clear_g_source (&init_data->idle_init_id); g_slice_free (NMClientInitData, init_data); } @@ -2411,8 +2413,8 @@ new_object_manager (GObject *source_object, GAsyncResult *res, gpointer user_dat g_clear_object (&priv->new_object_manager_cancellable); } -static void -got_object_manager (GObject *object, GAsyncResult *result, gpointer user_data) +static gboolean +got_object_manager (gpointer user_data) { NMClientInitData *init_data = user_data; NMClient *client; @@ -2422,14 +2424,21 @@ got_object_manager (GObject *object, GAsyncResult *result, gpointer user_data) GError *error = NULL; GDBusObjectManager *object_manager; - object_manager = g_dbus_object_manager_client_new_for_bus_finish (result, &error); - if (object_manager == NULL) { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_simple_async_result_take_error (init_data->result, error); - init_async_complete (init_data); - } - return; - } + init_data->idle_init_id = 0; + + if (g_cancellable_set_error_if_cancelled (init_data->cancellable, + &error)) + goto out_take_error; + + object_manager = g_dbus_object_manager_client_new_for_bus_sync (_nm_dbus_bus_type (), + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START, + "org.freedesktop.NetworkManager", + "/org/freedesktop", + proxy_type, NULL, NULL, + init_data->cancellable, + &error); + if (!object_manager) + goto out_take_error; client = init_data->client; priv = NM_CLIENT_GET_PRIVATE (client); @@ -2438,11 +2447,8 @@ got_object_manager (GObject *object, GAsyncResult *result, gpointer user_data) name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (priv->object_manager)); if (name_owner) { g_free (name_owner); - if (!objects_created (client, priv->object_manager, &error)) { - g_simple_async_result_take_error (init_data->result, error); - init_async_complete (init_data); - return; - } + if (!objects_created (client, priv->object_manager, &error)) + goto out_take_error; objects = g_dbus_object_manager_get_objects (priv->object_manager); for (iter = objects; iter; iter = iter->next) { @@ -2464,6 +2470,12 @@ got_object_manager (GObject *object, GAsyncResult *result, gpointer user_data) g_signal_connect (priv->object_manager, "notify::name-owner", G_CALLBACK (name_owner_changed), client); + return G_SOURCE_REMOVE; + +out_take_error: + g_simple_async_result_take_error (init_data->result, error); + init_async_complete (init_data); + return G_SOURCE_REMOVE; } static void @@ -2481,14 +2493,7 @@ prepare_object_manager (NMClient *client, user_data, init_async); g_simple_async_result_set_op_res_gboolean (init_data->result, TRUE); - g_dbus_object_manager_client_new_for_bus (_nm_dbus_bus_type (), - G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START, - "org.freedesktop.NetworkManager", - "/org/freedesktop", - proxy_type, NULL, NULL, - init_data->cancellable, - got_object_manager, - init_data); + init_data->idle_init_id = g_idle_add (got_object_manager, init_data); } static void diff --git a/libnm/nm-object.c b/libnm/nm-object.c index 95346e06e9..6bf1d0636d 100644 --- a/libnm/nm-object.c +++ b/libnm/nm-object.c @@ -1233,12 +1233,6 @@ get_property (GObject *object, guint prop_id, case PROP_DBUS_CONNECTION: g_value_set_object (value, g_dbus_object_manager_client_get_connection (G_DBUS_OBJECT_MANAGER_CLIENT (priv->object_manager))); break; - case PROP_DBUS_OBJECT: - g_value_set_object (value, priv->object); - break; - case PROP_DBUS_OBJECT_MANAGER: - g_value_set_object (value, priv->object_manager); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1335,7 +1329,7 @@ nm_object_class_init (NMObjectClass *nm_object_class) (object_class, PROP_DBUS_OBJECT, g_param_spec_object (NM_OBJECT_DBUS_OBJECT, "", "", G_TYPE_DBUS_OBJECT, - G_PARAM_READWRITE | + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -1348,7 +1342,7 @@ nm_object_class_init (NMObjectClass *nm_object_class) (object_class, PROP_DBUS_OBJECT_MANAGER, g_param_spec_object (NM_OBJECT_DBUS_OBJECT_MANAGER, "", "", G_TYPE_DBUS_OBJECT_MANAGER, - G_PARAM_READWRITE | + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); }