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=0e3fb4bc583cf6e1e514c369a2b9607a6d699e0f;hb=2bfe326976653cd35b6f4af943746df084a9dad2;hpb=2278e8e11be7614d15d8c1a081dc49e68e5924eb diff --git a/goa-mc-plugin/mcp-account-manager-goa.c b/goa-mc-plugin/mcp-account-manager-goa.c index 0e3fb4bc..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); } @@ -93,28 +102,6 @@ mcp_account_manager_goa_class_init (McpAccountManagerGoaClass *klass) sizeof (McpAccountManagerGoaPrivate)); } - -// static void -// _enable_chat_toggled (GConfClient *client, -// guint cnxn_id, -// GConfEntry *entry, -// gpointer user_data) -// { -// McpAccountStorage *self = MCP_ACCOUNT_STORAGE (user_data); -// McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self); -// gboolean enabled = gconf_value_get_bool (gconf_entry_get_value (entry)); -// -// DEBUG ("%s: %s", G_STRFUNC, enabled ? "enabled" : "disabled"); -// -// if (priv->ready && priv->facebook_available) -// { -// DEBUG ("Emitting toggled signal"); -// -// g_signal_emit_by_name (self, "toggled", FACEBOOK_ACCOUNT_NAME, enabled); -// } -// } - - static GHashTable * get_tp_parameters (GoaAccount *account) { @@ -124,9 +111,6 @@ get_tp_parameters (GoaAccount *account) #define PARAM(key, value) g_hash_table_insert (params, key, g_strdup (value)); - // { "param-account", "chat.facebook.com" }, - // { "param-server", "chat.facebook.com" }, - if (!tp_strdiff (type, "google")) { PARAM ("manager", "gabble"); @@ -143,16 +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; } /* generic properties */ PARAM ("DisplayName", goa_account_get_presentation_identity (account)); - PARAM ("ConnectAutomatically", "true"); #undef PARAM @@ -176,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, @@ -198,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, @@ -215,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); } @@ -243,7 +298,6 @@ _account_removed_cb (GoaClient *client, g_free (name); } - static void _goa_client_new_cb (GObject *obj, GAsyncResult *result, @@ -275,7 +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); - /* FIXME: do we need to support account-changed ? */ } @@ -337,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")) @@ -354,80 +428,87 @@ mcp_account_manager_goa_get (const McpAccountStorage *self, { /* get a specific key */ GHashTable *params = get_tp_parameters (account); + gchar *value; + + value = g_hash_table_lookup (params, key); - mcp_account_manager_set_value (am, acct, key, - g_hash_table_lookup (params, key)); + if (value == NULL) + value = g_key_file_get_value (priv->store, acct, key, NULL); + else + value = g_strdup (value); - g_hash_table_destroy (params); + 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; - // if (!tp_strdiff (acct, FACEBOOK_ACCOUNT_NAME)) - // { - // if (!tp_strdiff (key, "Enabled")) - // { - // gboolean enabled = !tp_strdiff (val, "true"); - - // DEBUG ("set Enabled to %s", enabled ? "enabled" : "disabled"); - - // gconf_client_set_bool (priv->gconf, BISHO_FB_GCONF_ENABLE_CHAT_KEY, - // enabled, &error); - // if (error != NULL) - // { - // g_warning ("Unable to save %s/Enable state in GConf: %s", - // acct, error->message); - // g_clear_error (&error); - // } - - // return TRUE; - // } - // else - // /* pretend we saved everything else */ - // return TRUE; - // } - // else - // { - // return FALSE; - // } } 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); - -// if (!tp_strdiff (acct, FACEBOOK_ACCOUNT_NAME)) -// { -// if (!tp_strdiff (key, "Enabled")) -// return TRUE; -// else -// /* pretend we deleted everything else */ -// return TRUE; -// } -// else -// { -// return FALSE; -// } + 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; } @@ -435,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; } @@ -456,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; }