const gchar *,
gpointer);
static gboolean _handle_clear (GSignondDbusAuthServiceAdapter *, GDBusMethodInvocation *, gpointer);
+static void _on_identity_disposed (gpointer data, GObject *object);
static void
_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
static void
_identity_unref (gpointer data, gpointer user_data)
{
- if (data) g_object_unref (data);
+ if (data && GSIGNOND_IS_DBUS_IDENTITY_ADAPTER(data)) {
+ GObject *identity = G_OBJECT (data);
+ g_object_weak_unref (identity, _on_identity_disposed, user_data);
+ g_object_unref (identity);
+ }
}
static void
DBG("- unregistering dubs auth service. %d", G_OBJECT (self->priv->auth_service)->ref_count);
if (self->priv->identities) {
- g_list_foreach (self->priv->identities, _identity_unref, NULL);
+ g_list_foreach (self->priv->identities, _identity_unref, self);
}
if (self->priv->auth_service) {
static gboolean _handle_add_reference (GSignondDbusIdentityAdapter *, GDBusMethodInvocation *, const gchar *, gpointer);
static gboolean _handle_remove_reference (GSignondDbusIdentityAdapter *, GDBusMethodInvocation *, const gchar *, gpointer);
static void _emit_info_updated (GSignondIdentity *identity, GSignondIdentityChangeType change, gpointer userdata);
+static void _on_session_disposed (gpointer data, GObject *session);
static void
gsignond_dbus_identity_adapter_set_property (GObject *object,
static void
_destroy_session (gpointer data, gpointer user_data)
{
- (void)user_data;
- if (data) g_object_unref (G_OBJECT(data));
+ if (data && GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER (data)) {
+ GObject *dbus_session = G_OBJECT (data);
+ g_object_weak_unref (dbus_session, _on_session_disposed, user_data);
+ g_object_unref (dbus_session);
+ }
}
static void
{
GSignondDbusIdentityAdapter *self = GSIGNOND_DBUS_IDENTITY_ADAPTER (object);
+ if (self->priv->sessions) {
+ g_list_foreach (self->priv->sessions, _destroy_session, self);
+ }
+
if (self->priv->identity) {
if (self->priv->info_updated_handler_id) {
g_signal_handler_disconnect (self->priv->identity, self->priv->info_updated_handler_id);
self->priv->identity = NULL;
}
- if (self->priv->sessions) {
- g_list_foreach (self->priv->sessions, _destroy_session, NULL);
- }
-
if (self->priv->dbus_identity) {
GDBusInterfaceSkeleton *iface = G_DBUS_INTERFACE_SKELETON(self->priv->dbus_identity);
gsignond_dbus_identity_emit_unregistered (self->priv->dbus_identity);