|
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 |
}
|