X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=goa-mc-plugin%2Fmcp-account-manager-goa.c;h=fd3942eaf359df2be0f1cb553828cc9b7ac9cbe1;hp=a0a8b3f50c6cff92dcc1b376cba2b2b1879e6206;hb=2bfe326976653cd35b6f4af943746df084a9dad2;hpb=2d217cf1e80cfa1437f9f08e124b0c6f1fbe247c diff --git a/goa-mc-plugin/mcp-account-manager-goa.c b/goa-mc-plugin/mcp-account-manager-goa.c index a0a8b3f5..fd3942ea 100644 --- a/goa-mc-plugin/mcp-account-manager-goa.c +++ b/goa-mc-plugin/mcp-account-manager-goa.c @@ -23,6 +23,8 @@ * Danielle Madeley */ +#include "config.h" + #include #include @@ -40,7 +42,9 @@ #define PLUGIN_NAME "goa" #define PLUGIN_PRIORITY (MCP_ACCOUNT_STORAGE_PLUGIN_PRIO_KEYRING + 10) #define PLUGIN_DESCRIPTION "Provide Telepathy Accounts from GOA" -#define PLUGIN_PROVIDER "org.gnome.OnlineAccounts" +#define PLUGIN_PROVIDER EMPATHY_GOA_PROVIDER + +#define INITIAL_COMMENT "Parameters of GOA Telepathy accounts" static void account_storage_iface_init (McpAccountStorageIface *iface); @@ -56,6 +60,9 @@ struct _McpAccountManagerGoaPrivate GoaClient *client; GHashTable *accounts; /* alloc'ed string -> ref'ed GoaObject */ + + GKeyFile *store; + gchar *filename; }; @@ -75,7 +82,9 @@ mcp_account_manager_goa_finalize (GObject *self) { McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self); - g_hash_table_destroy (priv->accounts); + g_hash_table_unref (priv->accounts); + g_key_file_free (priv->store); + g_free (priv->filename); G_OBJECT_CLASS (mcp_account_manager_goa_parent_class)->finalize (self); } @@ -118,18 +127,35 @@ get_tp_parameters (GoaAccount *account) PARAM ("param-extra-certificate-identities", "talk.google.com"); PARAM ("param-require-encryption", "true"); } + else if (!tp_strdiff (type, "facebook")) + { + PARAM ("manager", "gabble"); + PARAM ("protocol", "jabber"); + PARAM ("Icon", "im-facebook"); + PARAM ("Service", "facebook"); + + PARAM ("param-account", "chat.facebook.com"); + PARAM ("param-require-encryption", "true"); + } + else if (!tp_strdiff (type, "windows_live")) + { + PARAM ("manager", "gabble"); + PARAM ("protocol", "jabber"); + PARAM ("Icon", "im-msn"); + PARAM ("Service", "windows-live"); + + PARAM ("param-account", "messenger.live.com"); + PARAM ("param-require-encryption", "true"); + } else { - /* unknown account type */ - g_hash_table_destroy (params); + DEBUG ("Unknown account type %s", type); + g_hash_table_unref (params); return NULL; } - /* TODO: add Facebook support */ - /* generic properties */ PARAM ("DisplayName", goa_account_get_presentation_identity (account)); - PARAM ("ConnectAutomatically", "true"); #undef PARAM @@ -153,11 +179,27 @@ get_tp_account_name (GoaAccount *account) (char *) g_hash_table_lookup (params, "protocol"), type, id); - g_hash_table_destroy (params); + g_hash_table_unref (params); return name; } +static void +object_chat_changed_cb (GoaObject *object, + GParamSpec *spec, + McpAccountManagerGoa *self) +{ + GoaAccount *account = goa_object_peek_account (object); + char *name = get_tp_account_name (account); + gboolean enabled; + + enabled = (goa_object_peek_chat (object) != NULL); + + DEBUG ("%s %s", name, enabled ? "enabled" : "disabled"); + + if (self->priv->ready) + g_signal_emit_by_name (self, "toggled", name, enabled); +} static void _new_account (McpAccountManagerGoa *self, @@ -175,14 +217,43 @@ _new_account (McpAccountManagerGoa *self, if (self->priv->ready) g_signal_emit_by_name (self, "created", account_name); + + tp_g_signal_connect_object (object, "notify::chat", + G_CALLBACK (object_chat_changed_cb), self, 0); } DECLARE_GASYNC_CALLBACK (_goa_client_new_cb); +static void +load_store (McpAccountManagerGoa *self) +{ + GError *error = NULL; + + if (!g_key_file_load_from_file (self->priv->store, self->priv->filename, + G_KEY_FILE_KEEP_COMMENTS, &error)) + { + gchar *dir; + + DEBUG ("Failed to load keyfile, creating a new one: %s", error->message); + + dir = g_path_get_dirname (self->priv->filename); + + g_mkdir_with_parents (dir, 0700); + g_free (dir); + + g_key_file_set_comment (self->priv->store, NULL, NULL, INITIAL_COMMENT, + NULL); + + g_error_free (error); + } +} + static void mcp_account_manager_goa_init (McpAccountManagerGoa *self) { + gchar *path; + DEBUG ("GOA MC plugin initialised"); self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, @@ -192,6 +263,13 @@ mcp_account_manager_goa_init (McpAccountManagerGoa *self) g_free, g_object_unref); goa_client_new (NULL, _goa_client_new_cb, self); + + /* key file store */ + self->priv->store = g_key_file_new (); + self->priv->filename = g_build_filename (g_get_user_data_dir (), "telepathy", + "mission-control", "accounts-goa.cfg", NULL); + + load_store (self); } @@ -220,23 +298,6 @@ _account_removed_cb (GoaClient *client, g_free (name); } -static void -_account_changed_cb (GoaClient *client, - GoaObject *object, - McpAccountManagerGoa *self) -{ - GoaAccount *account = goa_object_peek_account (object); - char *name = get_tp_account_name (account); - gboolean enabled; - - enabled = (goa_object_peek_chat (object) != NULL); - - DEBUG ("%s %s", name, enabled ? "enabled" : "disabled"); - - if (self->priv->ready) - g_signal_emit_by_name (self, "toggled", name, enabled); -} - static void _goa_client_new_cb (GObject *obj, GAsyncResult *result, @@ -268,8 +329,6 @@ _goa_client_new_cb (GObject *obj, G_CALLBACK (_account_added_cb), self); g_signal_connect (self->priv->client, "account-removed", G_CALLBACK (_account_removed_cb), self); - g_signal_connect (self->priv->client, "account-changed", - G_CALLBACK (_account_changed_cb), self); } @@ -331,13 +390,34 @@ mcp_account_manager_goa_get (const McpAccountStorage *self, GHashTable *params = get_tp_parameters (account); GHashTableIter iter; gpointer key, value; + GStrv keys; + guint i; + gssize nkeys = 0; + /* Properties from GOA */ g_hash_table_iter_init (&iter, params); while (g_hash_table_iter_next (&iter, &key, &value)) mcp_account_manager_set_value (am, acct, key, value); - g_hash_table_destroy (params); + g_hash_table_unref (params); + + /* Stored properties */ + keys = g_key_file_get_keys (priv->store, acct, &nkeys, NULL); + + for (i = 0; i < nkeys; i++) + { + gchar *v = g_key_file_get_value (priv->store, acct, keys[i], NULL); + + if (v != NULL) + { + mcp_account_manager_set_value (am, acct, keys[i], v); + g_free (v); + } + } + + g_strfreev (keys); + /* Enabled */ get_enabled (self, am, acct, object); } else if (!tp_strdiff (key, "Enabled")) @@ -348,27 +428,57 @@ mcp_account_manager_goa_get (const McpAccountStorage *self, { /* get a specific key */ GHashTable *params = get_tp_parameters (account); + gchar *value; - mcp_account_manager_set_value (am, acct, key, - g_hash_table_lookup (params, key)); + value = g_hash_table_lookup (params, key); - g_hash_table_destroy (params); + if (value == NULL) + value = g_key_file_get_value (priv->store, acct, key, NULL); + else + value = g_strdup (value); + + mcp_account_manager_set_value (am, acct, key, value); + + g_hash_table_unref (params); + g_free (value); } return TRUE; } +static gboolean +account_is_in_goa (const McpAccountStorage *self, + const gchar *account) +{ + McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self); + + return (g_hash_table_lookup (priv->accounts, acct) != NULL); +} static gboolean mcp_account_manager_goa_set (const McpAccountStorage *self, const McpAccountManager *am, - const gchar *acct, + const gchar *account, const gchar *key, const gchar *val) { + McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self); GError *error = NULL; - DEBUG ("%s: (%s, %s, %s)", G_STRFUNC, acct, key, val); + if (!account_is_in_goa (self, account)) + return FALSE; + + /* No need to save Enabled, it's up to the GOA configuration if the account + * is configured or not. */ + if (!tp_strdiff (key, "Enabled")) + return TRUE; + + DEBUG ("%s: (%s, %s, %s)", G_STRFUNC, account, key, val); + + if (val != NULL) + g_key_file_set_value (priv->store, account, key, val); + else + g_key_file_remove_key (priv->store, account, key, NULL); /* Pretend we save everything so MC won't save this in accounts.cfg */ return TRUE; @@ -378,10 +488,24 @@ mcp_account_manager_goa_set (const McpAccountStorage *self, static gboolean mcp_account_manager_goa_delete (const McpAccountStorage *self, const McpAccountManager *am, - const gchar *acct, + const gchar *account, const gchar *key) { - DEBUG ("%s: (%s, %s)", G_STRFUNC, acct, key); + McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self); + + if (!account_is_in_goa (self, account)) + return FALSE; + + DEBUG ("%s: (%s, %s)", G_STRFUNC, account, key); + + if (key == NULL) + { + g_key_file_remove_group (priv->store, account, NULL); + } + else + { + g_key_file_remove_key (priv->store, account, key, NULL); + } /* Pretend we deleted everything */ return TRUE; @@ -392,7 +516,32 @@ static gboolean mcp_account_manager_goa_commit (const McpAccountStorage *self, const McpAccountManager *am) { - DEBUG ("%s", G_STRFUNC); + McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self); + gchar *data; + gsize len; + GError *error = NULL; + + DEBUG ("Save config to %s", priv->filename); + + data = g_key_file_to_data (priv->store, &len, &error); + if (data == NULL) + { + DEBUG ("Failed to get data from store: %s", error->message); + + g_error_free (error); + return FALSE; + } + + if (!g_file_set_contents (priv->filename, data, len, &error)) + { + DEBUG ("Failed to write file: %s", error->message); + + g_free (data); + g_error_free (error); + return FALSE; + } + + g_free (data); return TRUE; } @@ -413,7 +562,8 @@ mcp_account_manager_goa_get_restrictions (const McpAccountStorage *self, const gchar *account) { return TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS | - TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_SERVICE; + TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_SERVICE | + TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_ENABLED; }