#include "mcp-account-manager-uoa.h"
#include <telepathy-glib/telepathy-glib.h>
-
#include <libaccounts-glib/ag-account.h>
#include <libaccounts-glib/ag-account-service.h>
#include <libaccounts-glib/ag-manager.h>
#include <libaccounts-glib/ag-service.h>
-
#include <string.h>
#include <ctype.h>
+#include "empathy-webcredentials-monitor.h"
+
#define PLUGIN_NAME "uoa"
#define PLUGIN_PRIORITY (MCP_ACCOUNT_STORAGE_PLUGIN_PRIO_KEYRING + 10)
#define PLUGIN_DESCRIPTION "Provide Telepathy Accounts from UOA via libaccounts-glib"
McpAccountManager *am;
AgManager *manager;
+ EmpathyWebcredentialsMonitor *monitor;
/* alloc'ed string -> ref'ed AgAccountService
* The key is the account_name, an MC unique identifier.
const gchar *key)
{
gchar *real_key = g_strdup_printf (KEY_PREFIX "%s", key);
- GValue value = { 0, };
- gchar *ret;
+ GVariant *value;
- g_value_init (&value, G_TYPE_STRING);
- ag_account_service_get_value (service, real_key, &value);
- ret = g_value_dup_string (&value);
- g_value_unset (&value);
+ value = ag_account_service_get_variant (service, real_key, NULL);
+ g_free (real_key);
+ if (value == NULL)
+ return NULL;
- return ret;
+ return g_variant_dup_string (value, NULL);
}
static void
if (value != NULL)
{
- GValue gvalue = { 0, };
-
- g_value_init (&gvalue, G_TYPE_STRING);
- g_value_set_string (&gvalue, value);
- ag_account_service_set_value (service, real_key, &gvalue);
- g_value_unset (&gvalue);
- g_free (real_key);
+ GVariant *gvariant = g_variant_new_string (value);
+ ag_account_service_set_variant (service, real_key, gvariant);
}
else
{
- ag_account_service_set_value (service, real_key, NULL);
+ ag_account_service_set_variant (service, real_key, NULL);
}
+ g_free (real_key);
}
/* Returns NULL if the account never has been imported into MC before */
}
static void
-_account_stored_cb (AgAccount *account,
- const GError *error,
+_account_stored_cb (GObject *source_object,
+ GAsyncResult *res,
gpointer user_data)
{
- if (error != NULL)
+ AgAccount *account = AG_ACCOUNT(source_object);
+ GError *error = NULL;
+
+ if (!ag_account_store_finish (account, res, &error))
{
+ g_assert (error != NULL);
DEBUG ("Error storing UOA account '%s': %s",
ag_account_get_display_name (account),
error->message);
+ g_error_free (error);
}
}
cm_name, protocol_name, params);
_service_set_tp_account_name (service, account_name);
- ag_account_store (account, _account_stored_cb, self);
+ ag_account_store_async (account, NULL, _account_stored_cb, self);
g_hash_table_unref (params);
}
tp_clear_object (&self->priv->am);
tp_clear_object (&self->priv->manager);
tp_clear_pointer (&self->priv->accounts, g_hash_table_unref);
+ tp_clear_object (&self->priv->monitor);
G_OBJECT_CLASS (mcp_account_manager_uoa_parent_class)->dispose (object);
}
self->priv->pending_signals = g_queue_new ();
self->priv->manager = ag_manager_new_for_service_type (SERVICE_TYPE);
+ g_return_if_fail (self->priv->manager != NULL);
g_signal_connect (self->priv->manager, "account-created",
G_CALLBACK (_account_created_cb), self);
g_signal_connect (self->priv->manager, "account-deleted",
G_CALLBACK (_account_deleted_cb), self);
+
+ self->priv->monitor = empathy_webcredentials_monitor_new (
+ self->priv->manager);
}
static void
DEBUG (G_STRFUNC);
+ g_return_val_if_fail (self->priv->manager != NULL, NULL);
+
_ensure_loaded (self);
g_hash_table_iter_init (&iter, self->priv->accounts);
AgService *s;
gboolean handled = FALSE;
+ g_return_val_if_fail (self->priv->manager != NULL, FALSE);
+
service = g_hash_table_lookup (self->priv->accounts, account_name);
if (service == NULL)
return FALSE;
{
AgAccountSettingIter iter;
const gchar *k;
- const GValue *v;
+ GVariant *v;
ag_account_service_settings_iter_init (service, &iter, KEY_PREFIX);
- while (ag_account_service_settings_iter_next (&iter, &k, &v))
+ while (ag_account_settings_iter_get_next (&iter, &k, &v))
{
- if (!G_VALUE_HOLDS_STRING (v))
+ if (!g_variant_is_of_type (v, G_VARIANT_TYPE_STRING))
continue;
mcp_account_manager_set_value (am, account_name,
- k, g_value_get_string (v));
+ k, g_variant_get_string (v, NULL));
}
}
AgAccountService *service;
AgAccount *account;
+ g_return_val_if_fail (self->priv->manager != NULL, FALSE);
+
service = g_hash_table_lookup (self->priv->accounts, account_name);
if (service == NULL)
return FALSE;
AgAccountService *service;
GList *l;
+ g_return_val_if_fail (self->priv->manager != NULL, NULL);
+
if (!self->priv->ready)
{
g_set_error (error, TP_ERROR, TP_ERROR_INVALID_ARGUMENT,
AgAccountService *service;
AgAccount *account;
+ g_return_val_if_fail (self->priv->manager != NULL, FALSE);
+
service = g_hash_table_lookup (self->priv->accounts, account_name);
if (service == NULL)
return FALSE;
DEBUG (G_STRFUNC);
+ g_return_val_if_fail (self->priv->manager != NULL, FALSE);
+
g_hash_table_iter_init (&iter, self->priv->accounts);
while (g_hash_table_iter_next (&iter, NULL, &value))
{
AgAccountService *service = value;
AgAccount *account = ag_account_service_get_account (service);
- ag_account_store (account, _account_stored_cb, self);
+ ag_account_store_async (account, NULL, _account_stored_cb, self);
}
return TRUE;
}
+static void
+failure_removed_cb (EmpathyWebcredentialsMonitor *monitor,
+ AgAccount *account,
+ McpAccountManagerUoa *self)
+{
+ GList *l;
+
+ DEBUG ("Account '%u' is not failing any more", account->id);
+
+ l = ag_account_list_services_by_type (account, SERVICE_TYPE);
+ while (l != NULL)
+ {
+ AgAccountService *service = ag_account_service_new (account, l->data);
+ gchar *account_name = _service_dup_tp_account_name (service);
+
+ if (account_name != NULL)
+ {
+ DEBUG ("Reconnect account %s", account_name);
+
+ mcp_account_storage_emit_reconnect (MCP_ACCOUNT_STORAGE (self),
+ account_name);
+ }
+
+ g_free (account_name);
+ g_object_unref (service);
+ ag_service_unref (l->data);
+ l = g_list_delete_link (l, l);
+ }
+}
+
static void
account_manager_uoa_ready (const McpAccountStorage *storage,
const McpAccountManager *am)
McpAccountManagerUoa *self = (McpAccountManagerUoa *) storage;
DelayedSignalData *data;
+ g_return_if_fail (self->priv->manager != NULL);
+
if (self->priv->ready)
return;
g_queue_free (self->priv->pending_signals);
self->priv->pending_signals = NULL;
+
+ g_signal_connect (self->priv->monitor, "failure-removed",
+ G_CALLBACK (failure_removed_cb), self);
}
static void
AgAccountService *service;
AgAccount *account;
+ g_return_if_fail (self->priv->manager != NULL);
+
service = g_hash_table_lookup (self->priv->accounts, account_name);
if (service == NULL)
return;
McpAccountManagerUoa *self = (McpAccountManagerUoa *) storage;
AgAccountService *service;
guint restrictions = TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_SERVICE;
- GValue value = G_VALUE_INIT;
+ GVariant *value;
+
+ g_return_val_if_fail (self->priv->manager != NULL, 0);
/* If we don't know this account, we cannot do anything */
service = g_hash_table_lookup (self->priv->accounts, account_name);
if (service == NULL)
return G_MAXUINT;
- g_value_init (&value, G_TYPE_BOOLEAN);
- ag_account_service_get_value (service,
- KEY_PREFIX KEY_READONLY_PARAMS, &value);
+ value = ag_account_service_get_variant (service,
+ KEY_PREFIX KEY_READONLY_PARAMS, NULL);
- if (g_value_get_boolean (&value))
+ if (value != NULL && g_variant_get_boolean (value))
restrictions |= TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS;
- g_value_unset (&value);
-
/* FIXME: We can't set Icon either, but there is no flag for that */
return restrictions;
}