+static McpAccountStorageSetResult
+mcp_account_manager_goa_set_enabled (McpAccountStorage *self,
+ const gchar *account,
+ gboolean enabled)
+{
+ McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self);
+ GoaObject *object;
+ GoaAccount *acc;
+
+ object = g_hash_table_lookup (priv->accounts, account);
+
+ if (object == NULL)
+ return MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED;
+
+ acc = goa_object_peek_account (object);
+
+ if (acc == NULL)
+ return MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED;
+
+ if (goa_account_get_chat_disabled (acc) == !enabled)
+ return MCP_ACCOUNT_STORAGE_SET_RESULT_UNCHANGED;
+
+ goa_account_set_chat_disabled (acc, !enabled);
+ return MCP_ACCOUNT_STORAGE_SET_RESULT_CHANGED;
+}
+
+#ifdef MCP_API_VERSION_5_18
+
+static McpAccountStorageSetResult
+mcp_account_manager_goa_set_attribute (McpAccountStorage *storage,
+ McpAccountManager *am,
+ const gchar *account_name,
+ const gchar *attribute,
+ GVariant *value,
+ McpAttributeFlags flags)
+{
+ McpAccountManagerGoaPrivate *priv = GET_PRIVATE (storage);
+ McpAccountStorageSetResult ret = MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED;
+
+ g_return_val_if_fail (account_is_in_goa (storage, account_name),
+ MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED);
+
+ if (!tp_strdiff (attribute, "Enabled"))
+ {
+ g_return_val_if_fail (
+ g_variant_classify (value) == G_VARIANT_CLASS_BOOLEAN,
+ MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED);
+
+ return mcp_account_manager_goa_set_enabled (storage, account_name,
+ g_variant_get_boolean (value));
+ }
+ /* FIXME: filter out manager, protocol, Icon, Service? */
+ else if (value != NULL)
+ {
+ gchar *esc = mcp_account_manager_escape_variant_for_keyfile (am,
+ value);
+ gchar *old;
+
+ if (esc == NULL)
+ return MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED;
+
+ old = g_key_file_get_value (priv->store, account_name, attribute, NULL);
+
+ if (tp_strdiff (old, esc))
+ {
+ g_key_file_set_value (priv->store, account_name, attribute, esc);
+ ret = MCP_ACCOUNT_STORAGE_SET_RESULT_CHANGED;
+ }
+ else
+ {
+ ret = MCP_ACCOUNT_STORAGE_SET_RESULT_UNCHANGED;
+ }
+
+ g_free (esc);
+ g_free (old);
+ }
+ else
+ {
+ if (g_key_file_has_key (priv->store, account_name, attribute, NULL))
+ {
+ g_key_file_remove_key (priv->store, account_name, attribute, NULL);
+ ret = MCP_ACCOUNT_STORAGE_SET_RESULT_CHANGED;
+ }
+ else
+ {
+ ret = MCP_ACCOUNT_STORAGE_SET_RESULT_UNCHANGED;
+ }
+ }
+
+ return ret;
+}
+
+static McpAccountStorageSetResult
+mcp_account_manager_goa_set_parameter (McpAccountStorage *storage,
+ McpAccountManager *am,
+ const gchar *account_name,
+ const gchar *parameter,
+ GVariant *value,
+ McpParameterFlags flags)
+{
+ McpAccountManagerGoaPrivate *priv = GET_PRIVATE (storage);
+ McpAccountStorageSetResult ret = MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED;
+ gchar *key = NULL;
+ gchar *esc = NULL;
+ gchar *old = NULL;
+
+ g_return_val_if_fail (account_is_in_goa (storage, account_name),
+ MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED);
+
+ key = g_strdup_printf ("param-%s", parameter);
+
+ /* FIXME: filter out reserved keys for this account? */
+ if (value != NULL)
+ {
+ esc = mcp_account_manager_escape_variant_for_keyfile (am,
+ value);
+
+ if (esc == NULL)
+ goto out;
+
+ old = g_key_file_get_value (priv->store, account_name, key, NULL);
+
+ if (tp_strdiff (esc, old))
+ {
+ g_key_file_set_value (priv->store, account_name, key, esc);
+ ret = MCP_ACCOUNT_STORAGE_SET_RESULT_CHANGED;
+ }
+ else
+ {
+ ret = MCP_ACCOUNT_STORAGE_SET_RESULT_UNCHANGED;
+ }
+ }
+ else
+ {
+ if (g_key_file_has_key (priv->store, account_name, key, NULL))
+ {
+ g_key_file_remove_key (priv->store, account_name, key, NULL);
+ ret = MCP_ACCOUNT_STORAGE_SET_RESULT_CHANGED;
+ }
+ else
+ {
+ ret = MCP_ACCOUNT_STORAGE_SET_RESULT_UNCHANGED;
+ }
+
+ }
+
+out:
+ g_free (key);
+ g_free (esc);
+ g_free (old);
+ return ret;
+}
+
+#else /* MC 5.16 or older */
+