static void connection_get_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { Client *client = user_data; client->connection = g_bus_get_finish (res, NULL); if (client->connection == NULL) { call_lost_handler (client); goto out; } /* No need to schedule this in idle as we're already in the thread * that the user called g_bus_own_name() from. This is because * g_bus_get() guarantees that. * * Also, we need to ensure that the handler is invoked *before* * we call RequestName(). Otherwise there is a race. */ if (client->bus_acquired_handler != NULL) { client->bus_acquired_handler (client->connection, client->name, client->user_data); } has_connection (client); out: client_unref (client); }
static void on_connection_disconnected (GDBusConnection *connection, gboolean remote_peer_vanished, GError *error, gpointer user_data) { Client *client = user_data; if (client->disconnected_signal_handler_id > 0) g_signal_handler_disconnect (client->connection, client->disconnected_signal_handler_id); if (client->name_acquired_subscription_id > 0) g_dbus_connection_signal_unsubscribe (client->connection, client->name_acquired_subscription_id); if (client->name_lost_subscription_id > 0) g_dbus_connection_signal_unsubscribe (client->connection, client->name_lost_subscription_id); g_object_unref (client->connection); client->disconnected_signal_handler_id = 0; client->name_acquired_subscription_id = 0; client->name_lost_subscription_id = 0; client->connection = NULL; call_lost_handler (client); }
static void on_name_lost_or_acquired (GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data) { Client *client = user_data; const gchar *name; if (g_strcmp0 (object_path, "/org/freedesktop/DBus") != 0 || g_strcmp0 (interface_name, "org.freedesktop.DBus") != 0 || g_strcmp0 (sender_name, "org.freedesktop.DBus") != 0) goto out; if (g_strcmp0 (signal_name, "NameLost") == 0) { g_variant_get (parameters, "(&s)", &name); if (g_strcmp0 (name, client->name) == 0) { call_lost_handler (client); } } else if (g_strcmp0 (signal_name, "NameAcquired") == 0) { g_variant_get (parameters, "(&s)", &name); if (g_strcmp0 (name, client->name) == 0) { call_acquired_handler (client); } } out: ; }
static void request_name_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { Client *client = user_data; GVariant *result; guint32 request_name_reply; gboolean subscribe; request_name_reply = 0; result = NULL; /* don't use client->connection - it may be NULL already */ result = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), res, NULL); if (result != NULL) { g_variant_get (result, "(u)", &request_name_reply); g_variant_unref (result); } subscribe = FALSE; switch (request_name_reply) { case 1: /* DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER */ /* We got the name - now listen for NameLost and NameAcquired */ call_acquired_handler (client); subscribe = TRUE; client->needs_release = TRUE; break; case 2: /* DBUS_REQUEST_NAME_REPLY_IN_QUEUE */ /* Waiting in line - listen for NameLost and NameAcquired */ call_lost_handler (client); subscribe = TRUE; client->needs_release = TRUE; break; default: /* assume we couldn't get the name - explicit fallthrough */ case 3: /* DBUS_REQUEST_NAME_REPLY_EXISTS */ case 4: /* DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER */ /* Some other part of the process is already owning the name */ call_lost_handler (client); break; } if (subscribe) { GDBusConnection *connection = NULL; /* if cancelled, there is no point in subscribing to signals - if not, make sure * we use a known good Connection object since it may be set to NULL at any point * after being cancelled */ G_LOCK (lock); if (!client->cancelled) connection = g_object_ref (client->connection); G_UNLOCK (lock); /* start listening to NameLost and NameAcquired messages */ if (connection != NULL) { client->name_lost_subscription_id = g_dbus_connection_signal_subscribe (connection, "org.freedesktop.DBus", "org.freedesktop.DBus", "NameLost", "/org/freedesktop/DBus", client->name, G_DBUS_SIGNAL_FLAGS_NONE, on_name_lost_or_acquired, client, NULL); client->name_acquired_subscription_id = g_dbus_connection_signal_subscribe (connection, "org.freedesktop.DBus", "org.freedesktop.DBus", "NameAcquired", "/org/freedesktop/DBus", client->name, G_DBUS_SIGNAL_FLAGS_NONE, on_name_lost_or_acquired, client, NULL); g_object_unref (connection); } } client_unref (client); }
static void request_name_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { Client *client = user_data; GVariant *result; guint32 request_name_reply; gboolean subscribe; request_name_reply = 0; result = NULL; result = g_dbus_connection_call_finish (client->connection, res, NULL); if (result != NULL) { g_variant_get (result, "(u)", &request_name_reply); g_variant_unref (result); } subscribe = FALSE; switch (request_name_reply) { case 1: /* DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER */ /* We got the name - now listen for NameLost and NameAcquired */ call_acquired_handler (client); subscribe = TRUE; client->needs_release = TRUE; break; case 2: /* DBUS_REQUEST_NAME_REPLY_IN_QUEUE */ /* Waiting in line - listen for NameLost and NameAcquired */ call_lost_handler (client); subscribe = TRUE; client->needs_release = TRUE; break; default: /* assume we couldn't get the name - explicit fallthrough */ case 3: /* DBUS_REQUEST_NAME_REPLY_EXISTS */ case 4: /* DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER */ /* Some other part of the process is already owning the name */ call_lost_handler (client); break; } if (subscribe) { /* start listening to NameLost and NameAcquired messages */ client->name_lost_subscription_id = g_dbus_connection_signal_subscribe (client->connection, "org.freedesktop.DBus", "org.freedesktop.DBus", "NameLost", "/org/freedesktop/DBus", client->name, on_name_lost_or_acquired, client, NULL); client->name_acquired_subscription_id = g_dbus_connection_signal_subscribe (client->connection, "org.freedesktop.DBus", "org.freedesktop.DBus", "NameAcquired", "/org/freedesktop/DBus", client->name, on_name_lost_or_acquired, client, NULL); } client_unref (client); }