Blame src/goa/goaclient.c

Packit 79f644
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
Packit 79f644
/*
Packit 79f644
 * Copyright © 2011 – 2017 Red Hat, Inc.
Packit 79f644
 *
Packit 79f644
 * This library is free software; you can redistribute it and/or
Packit 79f644
 * modify it under the terms of the GNU Lesser General Public
Packit 79f644
 * License as published by the Free Software Foundation; either
Packit 79f644
 * version 2 of the License, or (at your option) any later version.
Packit 79f644
 *
Packit 79f644
 * This library is distributed in the hope that it will be useful,
Packit 79f644
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 79f644
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 79f644
 * Lesser General Public License for more details.
Packit 79f644
 *
Packit 79f644
 * You should have received a copy of the GNU Lesser General
Packit 79f644
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit 79f644
 */
Packit 79f644
Packit 79f644
#include "config.h"
Packit 79f644
#include <glib/gi18n-lib.h>
Packit 79f644
Packit 79f644
#include "goaclient.h"
Packit 79f644
#include "goaerror.h"
Packit 79f644
Packit 79f644
G_LOCK_DEFINE_STATIC (init_lock);
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * SECTION:goaclient
Packit 79f644
 * @title: GoaClient
Packit 79f644
 * @short_description: Object for accessing account information
Packit 79f644
 *
Packit 79f644
 * #GoaClient is used for accessing the GNOME Online Accounts service
Packit 79f644
 * from a client program.
Packit 79f644
 */
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * GoaClient:
Packit 79f644
 *
Packit 79f644
 * The #GoaClient structure contains only private data and should
Packit 79f644
 * only be accessed using the provided API.
Packit 79f644
 */
Packit 79f644
struct _GoaClient
Packit 79f644
{
Packit 79f644
  GObject parent_instance;
Packit 79f644
Packit 79f644
  gboolean is_initialized;
Packit 79f644
  GError *initialization_error;
Packit 79f644
Packit 79f644
  GDBusObjectManager *object_manager;
Packit 79f644
};
Packit 79f644
Packit 79f644
enum
Packit 79f644
{
Packit 79f644
  PROP_0,
Packit 79f644
  PROP_OBJECT_MANAGER
Packit 79f644
};
Packit 79f644
Packit 79f644
enum
Packit 79f644
{
Packit 79f644
  ACCOUNT_ADDED_SIGNAL,
Packit 79f644
  ACCOUNT_REMOVED_SIGNAL,
Packit 79f644
  ACCOUNT_CHANGED_SIGNAL,
Packit 79f644
  LAST_SIGNAL
Packit 79f644
};
Packit 79f644
Packit 79f644
static guint signals[LAST_SIGNAL] = { 0 };
Packit 79f644
Packit 79f644
static void initable_iface_init       (GInitableIface      *initable_iface);
Packit 79f644
static void async_initable_iface_init (GAsyncInitableIface *async_initable_iface);
Packit 79f644
Packit 79f644
static void on_object_added (GDBusObjectManager   *manager,
Packit 79f644
                             GDBusObject          *object,
Packit 79f644
                             gpointer              user_data);
Packit 79f644
static void on_object_removed (GDBusObjectManager   *manager,
Packit 79f644
                               GDBusObject          *object,
Packit 79f644
                               gpointer              user_data);
Packit 79f644
static void on_interface_proxy_properties_changed (GDBusObjectManagerClient   *manager,
Packit 79f644
                                                   GDBusObjectProxy           *object_proxy,
Packit 79f644
                                                   GDBusProxy                 *interface_proxy,
Packit 79f644
                                                   GVariant                   *changed_properties,
Packit 79f644
                                                   const gchar* const         *invalidated_properties,
Packit 79f644
                                                   gpointer                    user_data);
Packit 79f644
static void on_interface_added (GDBusObjectManager   *manager,
Packit 79f644
                                GDBusObject          *object,
Packit 79f644
                                GDBusInterface       *interface,
Packit 79f644
                                gpointer              user_data);
Packit 79f644
static void on_interface_removed (GDBusObjectManager   *manager,
Packit 79f644
                                  GDBusObject          *object,
Packit 79f644
                                  GDBusInterface       *interface,
Packit 79f644
                                  gpointer              user_data);
Packit 79f644
Packit 79f644
G_DEFINE_TYPE_WITH_CODE (GoaClient, goa_client, G_TYPE_OBJECT,
Packit 79f644
                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init)
Packit 79f644
                         G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init)
Packit 79f644
                         );
Packit 79f644
Packit 79f644
static void
Packit 79f644
goa_client_finalize (GObject *object)
Packit 79f644
{
Packit 79f644
  GoaClient *self = GOA_CLIENT (object);
Packit 79f644
Packit 79f644
  if (self->initialization_error != NULL)
Packit 79f644
    g_error_free (self->initialization_error);
Packit 79f644
Packit 79f644
  if (self->object_manager != NULL)
Packit 79f644
    {
Packit 79f644
      g_signal_handlers_disconnect_by_func (self->object_manager, G_CALLBACK (on_object_added), self);
Packit 79f644
      g_signal_handlers_disconnect_by_func (self->object_manager, G_CALLBACK (on_object_removed), self);
Packit 79f644
      g_signal_handlers_disconnect_by_func (self->object_manager, G_CALLBACK (on_interface_proxy_properties_changed), self);
Packit 79f644
      g_signal_handlers_disconnect_by_func (self->object_manager, G_CALLBACK (on_interface_added), self);
Packit 79f644
      g_signal_handlers_disconnect_by_func (self->object_manager, G_CALLBACK (on_interface_removed), self);
Packit 79f644
      g_object_unref (self->object_manager);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  G_OBJECT_CLASS (goa_client_parent_class)->finalize (object);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
goa_client_init (GoaClient *self)
Packit 79f644
{
Packit 79f644
  static volatile GQuark goa_error_domain = 0;
Packit 79f644
  /* this will force associating errors in the GOA_ERROR error domain
Packit 79f644
   * with org.freedesktop.Goa.Error.* errors via g_dbus_error_register_error_domain().
Packit 79f644
   */
Packit 79f644
  goa_error_domain = GOA_ERROR;
Packit 79f644
  goa_error_domain; /* shut up -Wunused-but-set-variable */
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
goa_client_get_property (GObject    *object,
Packit 79f644
                            guint       prop_id,
Packit 79f644
                            GValue     *value,
Packit 79f644
                            GParamSpec *pspec)
Packit 79f644
{
Packit 79f644
  GoaClient *self = GOA_CLIENT (object);
Packit 79f644
Packit 79f644
  switch (prop_id)
Packit 79f644
    {
Packit 79f644
    case PROP_OBJECT_MANAGER:
Packit 79f644
      g_value_set_object (value, goa_client_get_object_manager (self));
Packit 79f644
      break;
Packit 79f644
Packit 79f644
    default:
Packit 79f644
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 79f644
      break;
Packit 79f644
    }
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
goa_client_class_init (GoaClientClass *klass)
Packit 79f644
{
Packit 79f644
  GObjectClass *gobject_class;
Packit 79f644
Packit 79f644
  gobject_class = G_OBJECT_CLASS (klass);
Packit 79f644
  gobject_class->finalize     = goa_client_finalize;
Packit 79f644
  gobject_class->get_property = goa_client_get_property;
Packit 79f644
Packit 79f644
  /**
Packit 79f644
   * GoaClient:object-manager:
Packit 79f644
   *
Packit 79f644
   * The #GDBusObjectManager used by the #GoaClient instance.
Packit 79f644
   */
Packit 79f644
  g_object_class_install_property (gobject_class,
Packit 79f644
                                   PROP_OBJECT_MANAGER,
Packit 79f644
                                   g_param_spec_object ("object-manager",
Packit 79f644
                                                        "object manager",
Packit 79f644
                                                        "The GDBusObjectManager used by the GoaClient",
Packit 79f644
                                                        G_TYPE_DBUS_OBJECT_MANAGER,
Packit 79f644
                                                        G_PARAM_READABLE |
Packit 79f644
                                                        G_PARAM_STATIC_STRINGS));
Packit 79f644
Packit 79f644
  /**
Packit 79f644
   * GoaClient::account-added:
Packit 79f644
   * @client: The #GoaClient object emitting the signal.
Packit 79f644
   * @object: The #GoaObject for the added account.
Packit 79f644
   *
Packit 79f644
   * Emitted when @object has been added. See
Packit 79f644
   * goa_client_get_accounts() for information about how to use this
Packit 79f644
   * object.
Packit 79f644
   */
Packit 79f644
  signals[ACCOUNT_ADDED_SIGNAL] =
Packit 79f644
    g_signal_new ("account-added",
Packit 79f644
                  G_TYPE_FROM_CLASS (klass),
Packit 79f644
                  G_SIGNAL_RUN_LAST,
Packit 79f644
                  0,
Packit 79f644
                  NULL,
Packit 79f644
                  NULL,
Packit 79f644
                  g_cclosure_marshal_VOID__OBJECT,
Packit 79f644
                  G_TYPE_NONE,
Packit 79f644
                  1,
Packit 79f644
                  GOA_TYPE_OBJECT);
Packit 79f644
Packit 79f644
  /**
Packit 79f644
   * GoaClient::account-removed:
Packit 79f644
   * @client: The #GoaClient object emitting the signal.
Packit 79f644
   * @object: The #GoaObject for the removed account.
Packit 79f644
   *
Packit 79f644
   * Emitted when @object has been removed.
Packit 79f644
   */
Packit 79f644
  signals[ACCOUNT_REMOVED_SIGNAL] =
Packit 79f644
    g_signal_new ("account-removed",
Packit 79f644
                  G_TYPE_FROM_CLASS (klass),
Packit 79f644
                  G_SIGNAL_RUN_LAST,
Packit 79f644
                  0,
Packit 79f644
                  NULL,
Packit 79f644
                  NULL,
Packit 79f644
                  g_cclosure_marshal_VOID__OBJECT,
Packit 79f644
                  G_TYPE_NONE,
Packit 79f644
                  1,
Packit 79f644
                  GOA_TYPE_OBJECT);
Packit 79f644
Packit 79f644
  /**
Packit 79f644
   * GoaClient::account-changed:
Packit 79f644
   * @client: The #GoaClient object emitting the signal.
Packit 79f644
   * @object: The #GoaObject for the account with changes.
Packit 79f644
   *
Packit 79f644
   * Emitted when something on @object changes.
Packit 79f644
   */
Packit 79f644
  signals[ACCOUNT_CHANGED_SIGNAL] =
Packit 79f644
    g_signal_new ("account-changed",
Packit 79f644
                  G_TYPE_FROM_CLASS (klass),
Packit 79f644
                  G_SIGNAL_RUN_LAST,
Packit 79f644
                  0,
Packit 79f644
                  NULL,
Packit 79f644
                  NULL,
Packit 79f644
                  g_cclosure_marshal_VOID__OBJECT,
Packit 79f644
                  G_TYPE_NONE,
Packit 79f644
                  1,
Packit 79f644
                  GOA_TYPE_OBJECT);
Packit 79f644
Packit 79f644
}
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * goa_client_new:
Packit 79f644
 * @cancellable: A #GCancellable or %NULL.
Packit 79f644
 * @callback: Function that will be called when the result is ready.
Packit 79f644
 * @user_data: Data to pass to @callback.
Packit 79f644
 *
Packit 79f644
 * Asynchronously gets a #GoaClient. When the operation is
Packit 79f644
 * finished, @callback will be invoked in the 
Packit 79f644
 * linkend="g-main-context-push-thread-default">thread-default main
Packit 79f644
 * loop</link> of the thread you are calling this method from.
Packit 79f644
 */
Packit 79f644
void
Packit 79f644
goa_client_new (GCancellable        *cancellable,
Packit 79f644
                   GAsyncReadyCallback  callback,
Packit 79f644
                   gpointer             user_data)
Packit 79f644
{
Packit 79f644
  g_async_initable_new_async (GOA_TYPE_CLIENT,
Packit 79f644
                              G_PRIORITY_DEFAULT,
Packit 79f644
                              cancellable,
Packit 79f644
                              callback,
Packit 79f644
                              user_data,
Packit 79f644
                              NULL);
Packit 79f644
}
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * goa_client_new_finish:
Packit 79f644
 * @res: A #GAsyncResult.
Packit 79f644
 * @error: Return location for error or %NULL.
Packit 79f644
 *
Packit 79f644
 * Finishes an operation started with goa_client_new().
Packit 79f644
 *
Packit 79f644
 * Returns: A #GoaClient or %NULL if @error is set. Free with
Packit 79f644
 * g_object_unref() when done with it.
Packit 79f644
 */
Packit 79f644
GoaClient *
Packit 79f644
goa_client_new_finish (GAsyncResult        *res,
Packit 79f644
                       GError             **error)
Packit 79f644
{
Packit 79f644
  GObject *ret;
Packit 79f644
  GObject *source_object;
Packit 79f644
  source_object = g_async_result_get_source_object (res);
Packit 79f644
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
Packit 79f644
  g_object_unref (source_object);
Packit 79f644
  if (ret != NULL)
Packit 79f644
    return GOA_CLIENT (ret);
Packit 79f644
  else
Packit 79f644
    return NULL;
Packit 79f644
}
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * goa_client_new_sync:
Packit 79f644
 * @cancellable: (allow-none): A #GCancellable or %NULL.
Packit 79f644
 * @error: (allow-none): Return location for error or %NULL.
Packit 79f644
 *
Packit 79f644
 * Synchronously gets a #GoaClient for the local system.
Packit 79f644
 *
Packit 79f644
 * Returns: A #GoaClient or %NULL if @error is set. Free with
Packit 79f644
 * g_object_unref() when done with it.
Packit 79f644
 */
Packit 79f644
GoaClient *
Packit 79f644
goa_client_new_sync (GCancellable  *cancellable,
Packit 79f644
                        GError       **error)
Packit 79f644
{
Packit 79f644
  GInitable *ret;
Packit 79f644
  ret = g_initable_new (GOA_TYPE_CLIENT,
Packit 79f644
                        cancellable,
Packit 79f644
                        error,
Packit 79f644
                        NULL);
Packit 79f644
  if (ret != NULL)
Packit 79f644
    return GOA_CLIENT (ret);
Packit 79f644
  else
Packit 79f644
    return NULL;
Packit 79f644
}
Packit 79f644
Packit 79f644
/* ---------------------------------------------------------------------------------------------------- */
Packit 79f644
Packit 79f644
static gboolean
Packit 79f644
initable_init (GInitable     *initable,
Packit 79f644
               GCancellable  *cancellable,
Packit 79f644
               GError       **error)
Packit 79f644
{
Packit 79f644
  GoaClient *self = GOA_CLIENT (initable);
Packit 79f644
  gboolean ret = FALSE;
Packit 79f644
Packit 79f644
  /* This method needs to be idempotent to work with the singleton
Packit 79f644
   * pattern. See the docs for g_initable_init(). We implement this by
Packit 79f644
   * locking.
Packit 79f644
   */
Packit 79f644
  G_LOCK (init_lock);
Packit 79f644
  if (self->is_initialized)
Packit 79f644
    {
Packit 79f644
      if (self->object_manager != NULL)
Packit 79f644
        ret = TRUE;
Packit 79f644
      else
Packit 79f644
        g_assert (self->initialization_error != NULL);
Packit 79f644
      goto out;
Packit 79f644
    }
Packit 79f644
  g_assert (self->initialization_error == NULL);
Packit 79f644
Packit 79f644
  self->object_manager = goa_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION,
Packit 79f644
                                                                     G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
Packit 79f644
                                                                     "org.gnome.OnlineAccounts",
Packit 79f644
                                                                     "/org/gnome/OnlineAccounts",
Packit 79f644
                                                                     cancellable,
Packit 79f644
                                                                     &self->initialization_error);
Packit 79f644
  if (self->object_manager == NULL)
Packit 79f644
    goto out;
Packit 79f644
  g_signal_connect (self->object_manager,
Packit 79f644
                    "object-added",
Packit 79f644
                    G_CALLBACK (on_object_added),
Packit 79f644
                    self);
Packit 79f644
  g_signal_connect (self->object_manager,
Packit 79f644
                    "object-removed",
Packit 79f644
                    G_CALLBACK (on_object_removed),
Packit 79f644
                    self);
Packit 79f644
  g_signal_connect (self->object_manager,
Packit 79f644
                    "interface-proxy-properties-changed",
Packit 79f644
                    G_CALLBACK (on_interface_proxy_properties_changed),
Packit 79f644
                    self);
Packit 79f644
  g_signal_connect (self->object_manager,
Packit 79f644
                    "interface-added",
Packit 79f644
                    G_CALLBACK (on_interface_added),
Packit 79f644
                    self);
Packit 79f644
  g_signal_connect (self->object_manager,
Packit 79f644
                    "interface-removed",
Packit 79f644
                    G_CALLBACK (on_interface_removed),
Packit 79f644
                    self);
Packit 79f644
Packit 79f644
  ret = TRUE;
Packit 79f644
Packit 79f644
out:
Packit 79f644
  self->is_initialized = TRUE;
Packit 79f644
  if (!ret)
Packit 79f644
    {
Packit 79f644
      g_assert (self->initialization_error != NULL);
Packit 79f644
      g_propagate_error (error, g_error_copy (self->initialization_error));
Packit 79f644
    }
Packit 79f644
  G_UNLOCK (init_lock);
Packit 79f644
  return ret;
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
initable_iface_init (GInitableIface      *initable_iface)
Packit 79f644
{
Packit 79f644
  initable_iface->init = initable_init;
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
async_initable_iface_init (GAsyncInitableIface *async_initable_iface)
Packit 79f644
{
Packit 79f644
  /* Use default implementation (e.g. run GInitable code in a thread) */
Packit 79f644
}
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * goa_client_get_object_manager:
Packit 79f644
 * @self: A #GoaClient.
Packit 79f644
 *
Packit 79f644
 * Gets the #GDBusObjectManager used by @self.
Packit 79f644
 *
Packit 79f644
 * Returns: (transfer none): A #GDBusObjectManager. Do not free, the
Packit 79f644
 * instance is owned by @self.
Packit 79f644
 */
Packit 79f644
GDBusObjectManager *
Packit 79f644
goa_client_get_object_manager (GoaClient        *self)
Packit 79f644
{
Packit 79f644
  g_return_val_if_fail (GOA_IS_CLIENT (self), NULL);
Packit 79f644
  return self->object_manager;
Packit 79f644
}
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * goa_client_get_manager:
Packit 79f644
 * @self: A #GoaClient.
Packit 79f644
 *
Packit 79f644
 * Gets the #GoaManager for @self.
Packit 79f644
 *
Packit 79f644
 * Returns: (transfer none): A #GoaManager. Do not free, the returned
Packit 79f644
 * object belongs to @self.
Packit 79f644
 */
Packit 79f644
GoaManager *
Packit 79f644
goa_client_get_manager (GoaClient *self)
Packit 79f644
{
Packit 79f644
  GDBusObject *object;
Packit 79f644
  GoaManager *manager = NULL;
Packit 79f644
Packit 79f644
  object = g_dbus_object_manager_get_object (self->object_manager, "/org/gnome/OnlineAccounts/Manager");
Packit 79f644
  if (object == NULL)
Packit 79f644
    goto out;
Packit 79f644
Packit 79f644
  manager = goa_object_peek_manager (GOA_OBJECT (object));
Packit 79f644
Packit 79f644
 out:
Packit 79f644
  g_clear_object (&object);
Packit 79f644
  return manager;
Packit 79f644
}
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * goa_client_get_accounts:
Packit 79f644
 * @self: A #GoaClient.
Packit 79f644
 *
Packit 79f644
 * Gets all accounts that @self knows about. The result is a list of
Packit 79f644
 * #GoaObject instances where each object at least has an #GoaAccount
Packit 79f644
 * interface (that can be obtained via the goa_object_get_account()
Packit 79f644
 * method) but may also implement other interfaces such as
Packit 79f644
 * #GoaMail or #GoaFiles.
Packit 79f644
 *
Packit 79f644
 * Returns: (transfer full) (element-type GoaObject): A list of
Packit 79f644
 * #GoaObject instances that must be freed with g_list_free() after
Packit 79f644
 * each element has been freed with g_object_unref().
Packit 79f644
 */
Packit 79f644
GList *
Packit 79f644
goa_client_get_accounts (GoaClient *self)
Packit 79f644
{
Packit 79f644
  GList *ret = NULL;
Packit 79f644
  GList *objects;
Packit 79f644
  GList *l;
Packit 79f644
Packit 79f644
  g_return_val_if_fail (GOA_IS_CLIENT (self), NULL);
Packit 79f644
Packit 79f644
  objects = g_dbus_object_manager_get_objects (self->object_manager);
Packit 79f644
  for (l = objects; l != NULL; l = l->next)
Packit 79f644
    {
Packit 79f644
      GoaObject *object = GOA_OBJECT (l->data);
Packit 79f644
Packit 79f644
      if (goa_object_peek_account (object) != NULL)
Packit 79f644
        ret = g_list_prepend (ret, g_object_ref (object));
Packit 79f644
    }
Packit 79f644
  g_list_free_full (objects, g_object_unref);
Packit 79f644
Packit 79f644
  return ret;
Packit 79f644
}
Packit 79f644
Packit 79f644
/**
Packit 79f644
 * goa_client_lookup_by_id:
Packit 79f644
 * @self: A #GoaClient.
Packit 79f644
 * @id: The ID to look for.
Packit 79f644
 *
Packit 79f644
 * Finds and returns the #GoaObject instance whose
Packit 79f644
 * 
Packit 79f644
 * linkend="gdbus-property-org-gnome-OnlineAccounts-Account.Id">"Id"</link>
Packit 79f644
 * D-Bus property matches @id.
Packit 79f644
 *
Packit 79f644
 * Returns: (transfer full): A #GoaObject. Free the returned
Packit 79f644
 * object with g_object_unref().
Packit 79f644
 *
Packit 79f644
 * Since: 3.6
Packit 79f644
 */
Packit 79f644
GoaObject *
Packit 79f644
goa_client_lookup_by_id (GoaClient           *self,
Packit 79f644
                         const gchar         *id)
Packit 79f644
{
Packit 79f644
  GList *accounts;
Packit 79f644
  GList *l;
Packit 79f644
  GoaObject *ret = NULL;
Packit 79f644
Packit 79f644
  accounts = goa_client_get_accounts (self);
Packit 79f644
  for (l = accounts; l != NULL; l = g_list_next (l))
Packit 79f644
    {
Packit 79f644
      GoaAccount *account;
Packit 79f644
      GoaObject *object = GOA_OBJECT (l->data);
Packit 79f644
Packit 79f644
      account = goa_object_peek_account (object);
Packit 79f644
      if (account == NULL)
Packit 79f644
        continue;
Packit 79f644
Packit 79f644
      if (g_strcmp0 (goa_account_get_id (account), id) == 0)
Packit 79f644
        {
Packit 79f644
          ret = g_object_ref (object);
Packit 79f644
          break;
Packit 79f644
        }
Packit 79f644
    }
Packit 79f644
Packit 79f644
  g_list_free_full (accounts, g_object_unref);
Packit 79f644
  return ret;
Packit 79f644
}
Packit 79f644
Packit 79f644
/* ---------------------------------------------------------------------------------------------------- */
Packit 79f644
Packit 79f644
static void
Packit 79f644
on_object_added (GDBusObjectManager   *manager,
Packit 79f644
                 GDBusObject          *object,
Packit 79f644
                 gpointer              user_data)
Packit 79f644
{
Packit 79f644
  GoaClient *self = GOA_CLIENT (user_data);
Packit 79f644
  if (goa_object_peek_account (GOA_OBJECT (object)) != NULL)
Packit 79f644
    g_signal_emit (self, signals[ACCOUNT_ADDED_SIGNAL], 0, object);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
on_object_removed (GDBusObjectManager   *manager,
Packit 79f644
                   GDBusObject          *object,
Packit 79f644
                   gpointer              user_data)
Packit 79f644
{
Packit 79f644
  GoaClient *self = GOA_CLIENT (user_data);
Packit 79f644
  if (goa_object_peek_account (GOA_OBJECT (object)) != NULL)
Packit 79f644
    g_signal_emit (self, signals[ACCOUNT_REMOVED_SIGNAL], 0, object);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
on_interface_proxy_properties_changed (GDBusObjectManagerClient   *manager,
Packit 79f644
                                       GDBusObjectProxy           *object_proxy,
Packit 79f644
                                       GDBusProxy                 *interface_proxy,
Packit 79f644
                                       GVariant                   *changed_properties,
Packit 79f644
                                       const gchar* const         *invalidated_properties,
Packit 79f644
                                       gpointer                    user_data)
Packit 79f644
{
Packit 79f644
  GoaClient *self = GOA_CLIENT (user_data);
Packit 79f644
  if (goa_object_peek_account (GOA_OBJECT (object_proxy)) != NULL)
Packit 79f644
    g_signal_emit (self, signals[ACCOUNT_CHANGED_SIGNAL], 0, object_proxy);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
on_interface_added (GDBusObjectManager   *manager,
Packit 79f644
                    GDBusObject          *object,
Packit 79f644
                    GDBusInterface       *interface,
Packit 79f644
                    gpointer              user_data)
Packit 79f644
{
Packit 79f644
  GoaClient *self = GOA_CLIENT (user_data);
Packit 79f644
  if (goa_object_peek_account (GOA_OBJECT (object)) != NULL)
Packit 79f644
    g_signal_emit (self, signals[ACCOUNT_CHANGED_SIGNAL], 0, object);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
on_interface_removed (GDBusObjectManager   *manager,
Packit 79f644
                      GDBusObject          *object,
Packit 79f644
                      GDBusInterface       *interface,
Packit 79f644
                      gpointer              user_data)
Packit 79f644
{
Packit 79f644
  GoaClient *self = GOA_CLIENT (user_data);
Packit 79f644
  if (goa_object_peek_account (GOA_OBJECT (object)) != NULL)
Packit 79f644
    g_signal_emit (self, signals[ACCOUNT_CHANGED_SIGNAL], 0, object);
Packit 79f644
}