summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDebarshi Ray <debarshir@gnome.org>2018-04-17 10:27:52 +0200
committerDebarshi Ray <debarshir@gnome.org>2018-04-17 15:25:38 +0200
commitd44f89f8b9891593ff0fe1b428e1a1253a4667af (patch)
treed79bcc9b8ddc5c11e080a14b395826f897c8d155
parent18b3a968fe99f1e7bb77b100d3264276b814e3f7 (diff)
downloadgnome-online-accounts-d44f89f8b9891593ff0fe1b428e1a1253a4667af.tar.gz
Remove Telepathy support
The Empathy / Telepathy stack is no longer as strongly maintained as it used to be, and the consensus in GNOME is to deprecate it. Moreover, the Telepathy integration in GOA doesn't actually buy the user any benefits. The original plan was to disable Empathy's own account management UI (ie. empathy-accounts), but that never happened. So, we ended up with two UIs, which at times had slightly divergent behaviour - Microsoft account added via OAuth2 / XMPP versus raw passwords / legacy pre-XMPP protocol. These days we have Polari, which also has its own accounts UI, which is in keeping with its status as a non-core application. https://bugzilla.gnome.org/show_bug.cgi?id=795322
-rw-r--r--.gitmodules3
-rw-r--r--Makefile.am12
-rwxr-xr-xautogen.sh6
-rw-r--r--configure.ac40
-rw-r--r--po/POTFILES.in1
-rw-r--r--po/POTFILES.skip2
-rw-r--r--src/goabackend/Makefile.am8
-rw-r--r--src/goabackend/goagoogleprovider.c19
-rw-r--r--src/goabackend/goaobjectskeletonutils.c28
-rw-r--r--src/goabackend/goaobjectskeletonutils.h3
-rw-r--r--src/goabackend/goaprovider.c4
-rw-r--r--src/goabackend/goatelepathyfactory.c151
-rw-r--r--src/goabackend/goatelepathyfactory.h55
-rw-r--r--src/goabackend/goatelepathyprovider.c1137
-rw-r--r--src/goabackend/goatelepathyprovider.h45
-rw-r--r--src/goabackend/goatpaccountlinker.c669
-rw-r--r--src/goabackend/goatpaccountlinker.h64
-rw-r--r--src/goabackend/goautils.c40
-rw-r--r--src/goabackend/goautils.h2
m---------telepathy-account-widgets0
20 files changed, 2 insertions, 2287 deletions
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 25b960e..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "telepathy-account-widgets"]
- path = telepathy-account-widgets
- url = https://git.gnome.org/browse/telepathy-account-widgets
diff --git a/Makefile.am b/Makefile.am
index 6e3abc9..fad8631 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,15 +1,7 @@
NULL =
-SUBDIRS = data
-
-if BUILD_BACKEND
-if BUILD_TELEPATHY
-SUBDIRS += telepathy-account-widgets
-endif
-endif
-
-SUBDIRS += src
+SUBDIRS = data src
if BUILD_BACKEND
SUBDIRS += doc
@@ -19,7 +11,7 @@ SUBDIRS += po
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
-DISTCHECK_CONFIGURE_FLAGS=--enable-introspection --enable-gtk-doc --enable-telepathy
+DISTCHECK_CONFIGURE_FLAGS=--enable-introspection --enable-gtk-doc
MAINTAINERCLEANFILES = \
$(GITIGNORE_MAINTAINERCLEANFILES_TOPLEVEL) \
diff --git a/autogen.sh b/autogen.sh
index 55bd198..e209906 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -22,12 +22,6 @@ if [ "$#" = 0 -a "x$NOCONFIGURE" = "x" ]; then
echo "" >&2
fi
-git submodule update --init --recursive || exit 1
-
-cd $srcdir/telepathy-account-widgets
-NOCONFIGURE=1 sh autogen.sh
-cd ..
-
aclocal --install || exit 1
gtkdocize --copy || exit 1
autoreconf --verbose --force --install || exit 1
diff --git a/configure.ac b/configure.ac
index 2574c27..456ab67 100644
--- a/configure.ac
+++ b/configure.ac
@@ -98,18 +98,6 @@ GOBJECT_INTROSPECTION_CHECK([0.6.2])
VAPIGEN_CHECK()
-# Telepathy
-AC_DEFINE(GOA_TELEPATHY_NAME, ["telepathy"], [ProviderType and extension point name])
-AC_ARG_ENABLE([telepathy],
- [AS_HELP_STRING([--enable-telepathy],
- [Enable Telepathy IM provider])],
- [],
- [enable_telepathy=no])
-if test "$enable_telepathy" != "no"; then
- AC_DEFINE(GOA_TELEPATHY_ENABLED, 1, [Enable Telepathy data provider])
-fi
-AM_CONDITIONAL(BUILD_TELEPATHY, [test x$enable_telepathy != xno])
-
AC_ARG_ENABLE([backend],
[AS_HELP_STRING([--enable-backend],
[Enable goabackend library])],
@@ -147,33 +135,6 @@ if test "$enable_backend" != "no"; then
PKG_CHECK_MODULES(LIBXML, [libxml-2.0])
AC_SUBST(LIBXML_CFLAGS)
AC_SUBST(LIBXML_LIBS)
-
- if test "$enable_telepathy" != "no"; then
- PKG_CHECK_MODULES(TP, [telepathy-glib])
- AC_SUBST(TP_CFLAGS)
- AC_SUBST(TP_LIBS)
-
- # telepathy-account-widgets
- prev_top_build_prefix=$ac_top_build_prefix
- prev_ac_configure_args=$ac_configure_args
- ac_configure_args="$ac_configure_args --with-cheese=no --disable-gudev --enable-ubuntu-online-accounts=no"
- # install the data together with the rest of GOA's data
- ac_configure_args="$ac_configure_args --with-pkgdatadir=${datadir}/gnome-online-accounts"
- # GOA ships its icons directly in ${datadir}/icons (usually /usr/share/icons/) and not
- # in its own data directory
- ac_configure_args="$ac_configure_args --with-icondir=${datadir}/icons"
- # Change the name of tpaw's .mo files to avoid conflicts with other packages using tp-aw
- ac_configure_args="$ac_configure_args --with-gettext-package=gnome-online-accounts-tpaw"
- # Disable the installation of the GSettings schema to avoid multiple components shipping
- # the same file. See https://bugzilla.gnome.org/show_bug.cgi?id=706803
- ac_configure_args="$ac_configure_args --disable-schemas-compile --disable-settings"
- AX_CONFIG_DIR([telepathy-account-widgets])
- ac_top_build_prefix=$prev_top_build_prefix
- ac_configure_args=$prev_ac_configure_args
-
- export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:"$ac_top_build_prefix"telepathy-account-widgets/
- PKG_CHECK_MODULES(TPAW, telepathy-account-widgets)
- fi
fi
AC_ARG_ENABLE([inspector],
@@ -612,7 +573,6 @@ echo "
Facebook provider: ${enable_facebook} (OAuth 2.0, id:${with_facebook_client_id})
Todoist provider: ${enable_todoist} (OAuth 2.0, id:${with_todoist_client_id} secret:${with_todoist_client_secret})
Windows Live provider: ${enable_windows_live} (OAuth 2.0, id:${with_windows_live_client_id})
- Telepathy provider: ${enable_telepathy}
Pocket provider: ${enable_pocket} (id:${with_pocket_client_id})
Last.fm provider: ${enable_lastfm} (id:${with_lastfm_client_id} secret:${with_lastfm_client_secret})
diff --git a/po/POTFILES.in b/po/POTFILES.in
index b65650c..8139479 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -19,7 +19,6 @@ src/goabackend/goaowncloudprovider.c
src/goabackend/goapocketprovider.c
src/goabackend/goaprovider.c
src/goabackend/goasmtpauth.c
-src/goabackend/goatelepathyprovider.c
src/goabackend/goatodoistprovider.c
src/goabackend/goautils.c
src/goabackend/goawebview.c
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index 2638b4d..2053be6 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -1,5 +1,3 @@
# List of files where to skip translations.
# Please keep this file sorted alphabetically.
data/goa-daemon.desktop.in
-
-telepathy-account-widgets
diff --git a/src/goabackend/Makefile.am b/src/goabackend/Makefile.am
index c254594..2c9e5cc 100644
--- a/src/goabackend/Makefile.am
+++ b/src/goabackend/Makefile.am
@@ -110,14 +110,6 @@ libgoa_backend_1_0_la_SOURCES += \
goakerberosprovider.h goakerberosprovider.c
endif
-if BUILD_TELEPATHY
-libgoa_backend_1_0_la_SOURCES += \
- goatelepathyfactory.h goatelepathyfactory.c \
- goatelepathyprovider.h goatelepathyprovider.c \
- goatpaccountlinker.h goatpaccountlinker.c \
- $(NULL)
-endif
-
libgoa_backend_1_0_la_CFLAGS = \
$(WEBKIT_GTK_CFLAGS) \
$(JSON_GLIB_CFLAGS) \
diff --git a/src/goabackend/goagoogleprovider.c b/src/goabackend/goagoogleprovider.c
index e27c6d2..cc9a8f8 100644
--- a/src/goabackend/goagoogleprovider.c
+++ b/src/goabackend/goagoogleprovider.c
@@ -69,9 +69,6 @@ get_provider_features (GoaProvider *provider)
GOA_PROVIDER_FEATURE_MAIL |
GOA_PROVIDER_FEATURE_CALENDAR |
GOA_PROVIDER_FEATURE_CONTACTS |
-#ifdef GOA_TELEPATHY_ENABLED
- GOA_PROVIDER_FEATURE_CHAT |
-#endif
GOA_PROVIDER_FEATURE_DOCUMENTS |
GOA_PROVIDER_FEATURE_PHOTOS |
GOA_PROVIDER_FEATURE_FILES |
@@ -130,11 +127,6 @@ get_scope (GoaOAuth2Provider *oauth2_provider)
/* Google Cloud Print */
"https://www.googleapis.com/auth/cloudprint "
-#ifdef GOA_TELEPATHY_ENABLED
- /* Google Talk */
- "https://www.googleapis.com/auth/googletalk "
-#endif
-
/* Google Tasks - undocumented */
"https://www.googleapis.com/auth/tasks";
}
@@ -288,7 +280,6 @@ build_object (GoaProvider *provider,
gboolean mail_enabled;
gboolean calendar_enabled;
gboolean contacts_enabled;
- gboolean chat_enabled;
gboolean documents_enabled;
gboolean files_enabled;
gboolean photos_enabled;
@@ -352,10 +343,6 @@ build_object (GoaProvider *provider,
contacts_enabled,
FALSE);
- /* Chat */
- chat_enabled = g_key_file_get_boolean (key_file, group, "ChatEnabled", NULL);
- goa_object_skeleton_attach_chat (object, chat_enabled);
-
/* Documents */
documents_enabled = g_key_file_get_boolean (key_file, group, "DocumentsEnabled", NULL);
goa_object_skeleton_attach_documents (object, documents_enabled);
@@ -379,7 +366,6 @@ build_object (GoaProvider *provider,
goa_account_set_mail_disabled (account, !mail_enabled);
goa_account_set_calendar_disabled (account, !calendar_enabled);
goa_account_set_contacts_disabled (account, !contacts_enabled);
- goa_account_set_chat_disabled (account, !chat_enabled);
goa_account_set_documents_disabled (account, !documents_enabled);
goa_account_set_photos_disabled (account, !photos_enabled);
goa_account_set_files_disabled (account, !files_enabled);
@@ -398,10 +384,6 @@ build_object (GoaProvider *provider,
G_CALLBACK (goa_util_account_notify_property_cb),
(gpointer) "ContactsEnabled");
g_signal_connect (account,
- "notify::chat-disabled",
- G_CALLBACK (goa_util_account_notify_property_cb),
- (gpointer) "ChatEnabled");
- g_signal_connect (account,
"notify::documents-disabled",
G_CALLBACK (goa_util_account_notify_property_cb),
(gpointer) "DocumentsEnabled");
@@ -436,7 +418,6 @@ add_account_key_values (GoaOAuth2Provider *oauth2_provider,
g_variant_builder_add (builder, "{ss}", "MailEnabled", "true");
g_variant_builder_add (builder, "{ss}", "CalendarEnabled", "true");
g_variant_builder_add (builder, "{ss}", "ContactsEnabled", "true");
- g_variant_builder_add (builder, "{ss}", "ChatEnabled", "true");
g_variant_builder_add (builder, "{ss}", "DocumentsEnabled", "true");
g_variant_builder_add (builder, "{ss}", "PhotosEnabled", "true");
g_variant_builder_add (builder, "{ss}", "FilesEnabled", "true");
diff --git a/src/goabackend/goaobjectskeletonutils.c b/src/goabackend/goaobjectskeletonutils.c
index 6004441..8737be2 100644
--- a/src/goabackend/goaobjectskeletonutils.c
+++ b/src/goabackend/goaobjectskeletonutils.c
@@ -133,34 +133,6 @@ goa_object_skeleton_attach_documents (GoaObjectSkeleton *object,
}
void
-goa_object_skeleton_attach_chat (GoaObjectSkeleton *object,
- gboolean chat_enabled)
-{
-#ifdef GOA_TELEPATHY_ENABLED
- GoaChat *chat;
-
- chat = goa_object_get_chat (GOA_OBJECT (object));
- if (chat_enabled)
- {
- if (chat == NULL)
- {
- chat = goa_chat_skeleton_new ();
- goa_object_skeleton_set_chat (object, chat);
- }
- }
- else
- {
- if (chat != NULL)
- goa_object_skeleton_set_chat (object, NULL);
- }
- g_clear_object (&chat);
-#else
- g_debug("Compiled without Telepathy support, chat is disabled");
- goa_object_skeleton_set_chat (object, NULL);
-#endif
-}
-
-void
goa_object_skeleton_attach_photos (GoaObjectSkeleton *object,
gboolean photos_enabled)
{
diff --git a/src/goabackend/goaobjectskeletonutils.h b/src/goabackend/goaobjectskeletonutils.h
index 2ea2ce9..124d12b 100644
--- a/src/goabackend/goaobjectskeletonutils.h
+++ b/src/goabackend/goaobjectskeletonutils.h
@@ -33,9 +33,6 @@ void goa_object_skeleton_attach_calendar (GoaObjectSkeleton *o
gboolean calendar_enabled,
gboolean accept_ssl_errors);
-void goa_object_skeleton_attach_chat (GoaObjectSkeleton *object,
- gboolean chat_enabled);
-
void goa_object_skeleton_attach_contacts (GoaObjectSkeleton *object,
const gchar *uri,
gboolean contacts_enabled,
diff --git a/src/goabackend/goaprovider.c b/src/goabackend/goaprovider.c
index c8f7f0d..4a79c28 100644
--- a/src/goabackend/goaprovider.c
+++ b/src/goabackend/goaprovider.c
@@ -31,7 +31,6 @@
#include "goaflickrprovider.h"
#include "goafoursquareprovider.h"
#include "goawindowsliveprovider.h"
-#include "goatelepathyfactory.h"
#include "goapocketprovider.h"
#include "goamediaserverprovider.h"
#include "goalastfmprovider.h"
@@ -995,9 +994,6 @@ static struct
#ifdef GOA_MEDIA_SERVER_ENABLED
{ GOA_MEDIA_SERVER_NAME, goa_media_server_provider_get_type },
#endif
-#ifdef GOA_TELEPATHY_ENABLED
- { GOA_TELEPATHY_NAME, goa_telepathy_factory_get_type },
-#endif
{ NULL, NULL }
};
diff --git a/src/goabackend/goatelepathyfactory.c b/src/goabackend/goatelepathyfactory.c
deleted file mode 100644
index 130c243..0000000
--- a/src/goabackend/goatelepathyfactory.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/*
- * Copyright © 2013 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include <tp-account-widgets/tpaw-protocol.h>
-
-#include "goatelepathyfactory.h"
-#include "goaprovider-priv.h"
-#include "goatelepathyprovider.h"
-
-/*
- * SECTION:goatelepathyfactory
- * @title: GoaTelepathyFactory
- * @short_description: Factory for #GoaTelepathyProvider instances
- *
- * #GoaTelepathyFactory dynamically creates instances of #GoaTelepathyProvider
- * based on the protocols available through Telepathy.
- *
- * It accepts the protocol names from the Telepathy specification as
- * @provider_name in goa_provider_factory_get_provider().
- */
-
-G_DEFINE_TYPE_WITH_CODE (GoaTelepathyFactory, goa_telepathy_factory, GOA_TYPE_PROVIDER_FACTORY,
- goa_provider_ensure_extension_points_registered ();
- g_io_extension_point_implement (GOA_PROVIDER_FACTORY_EXTENSION_POINT_NAME,
- g_define_type_id,
- GOA_TELEPATHY_NAME,
- 0));
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static GoaProvider *
-get_provider (GoaProviderFactory *factory,
- const gchar *provider_name)
-{
- g_return_val_if_fail (GOA_IS_TELEPATHY_FACTORY (factory), NULL);
-
- return GOA_PROVIDER (goa_telepathy_provider_new_from_protocol_name (provider_name));
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static void
-free_list_and_unref (gpointer data)
-{
- g_list_free_full (data, g_object_unref);
-}
-
-static void
-get_protocols_cb (GObject *source,
- GAsyncResult *res,
- gpointer user_data)
-{
- GTask *outer_task = user_data;
- GList *protocols = NULL;
- GList *ret;
- GList *l;
- GError *error = NULL;
- GQuark facebook_quark;
-
-#if GOA_GOOGLE_ENABLED
- GQuark google_talk_quark;
-#endif
-
- if (!tpaw_protocol_get_all_finish (&protocols, res, &error))
- {
- g_task_return_error (outer_task, error);
- g_object_unref (outer_task);
- return;
- }
-
- facebook_quark = g_quark_from_static_string ("facebook");
-
-#if GOA_GOOGLE_ENABLED
- google_talk_quark = g_quark_from_static_string ("google-talk");
-#endif
-
- ret = NULL;
- for (l = protocols; l != NULL; l = l->next)
- {
- TpawProtocol *protocol = l->data;
- const gchar *service_name = tpaw_protocol_get_service_name (protocol);
- GQuark service_quark = g_quark_try_string (service_name);
- GoaTelepathyProvider *provider;
-
- /* This service does not exist anymore, so skip it. */
- if (service_quark == facebook_quark)
- continue;
-
- /* If the service is handled natively by GOA, so we don't allow
- * the creation of a Telepathy-only account. */
-#if GOA_GOOGLE_ENABLED
- if (service_quark == google_talk_quark)
- continue;
-#endif
-
- provider = goa_telepathy_provider_new_from_protocol (protocol);
- ret = g_list_prepend (ret, provider);
- }
- ret = g_list_reverse (ret);
- g_list_free_full (protocols, g_object_unref);
-
- g_task_return_pointer (outer_task, ret, free_list_and_unref);
- g_object_unref (outer_task);
-}
-
-static void
-get_providers (GoaProviderFactory *factory,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GTask *task;
-
- g_return_if_fail (GOA_IS_TELEPATHY_FACTORY (factory));
-
- task = g_task_new (factory, NULL, callback, user_data);
- tpaw_protocol_get_all_async (get_protocols_cb, task);
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static void
-goa_telepathy_factory_init (GoaTelepathyFactory *provider)
-{
-}
-
-static void
-goa_telepathy_factory_class_init (GoaTelepathyFactoryClass *klass)
-{
- GoaProviderFactoryClass *factory_class;
-
- factory_class = GOA_PROVIDER_FACTORY_CLASS (klass);
- factory_class->get_provider = get_provider;
- factory_class->get_providers = get_providers;
-}
diff --git a/src/goabackend/goatelepathyfactory.h b/src/goabackend/goatelepathyfactory.h
deleted file mode 100644
index f910ccc..0000000
--- a/src/goabackend/goatelepathyfactory.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/*
- * Copyright © 2013 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GOA_BACKEND_INSIDE_GOA_BACKEND_H__) && !defined (GOA_BACKEND_COMPILATION)
-#error "Only <goabackend/goabackend.h> can be included directly."
-#endif
-
-#ifndef __GOA_TELEPATHY_FACTORY_H__
-#define __GOA_TELEPATHY_FACTORY_H__
-
-#include "goaproviderfactory.h"
-
-G_BEGIN_DECLS
-
-#define GOA_TYPE_TELEPATHY_FACTORY (goa_telepathy_factory_get_type ())
-#define GOA_TELEPATHY_FACTORY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GOA_TYPE_TELEPATHY_FACTORY, GoaTelepathyFactory))
-#define GOA_TELEPATHY_FACTORY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GOA_TYPE_TELEPATHY_FACTORY, GoaTelepathyFactoryClass))
-#define GOA_TELEPATHY_FACTORY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GOA_TYPE_TELEPATHY_FACTORY, GoaTelepathyFactoryClass))
-#define GOA_IS_TELEPATHY_FACTORY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GOA_TYPE_TELEPATHY_FACTORY))
-#define GOA_IS_TELEPATHY_FACTORY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GOA_TYPE_TELEPATHY_FACTORY))
-
-typedef struct _GoaTelepathyFactory GoaTelepathyFactory;
-typedef struct _GoaTelepathyFactoryClass GoaTelepathyFactoryClass;
-
-struct _GoaTelepathyFactory
-{
- /*< private >*/
- GoaProviderFactory parent_instance;
-};
-
-struct _GoaTelepathyFactoryClass
-{
- GoaProviderFactoryClass parent_class;
-};
-
-GType goa_telepathy_factory_get_type (void) G_GNUC_CONST;
-
-G_END_DECLS
-
-#endif /* __GOA_TELEPATHY_FACTORY_H__ */
diff --git a/src/goabackend/goatelepathyprovider.c b/src/goabackend/goatelepathyprovider.c
deleted file mode 100644
index 188d2be..0000000
--- a/src/goabackend/goatelepathyprovider.c
+++ /dev/null
@@ -1,1137 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/*
- * Copyright © 2012 – 2017 Red Hat, Inc.
- * Copyright © 2013 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-#include <glib/gi18n-lib.h>
-#include <tp-account-widgets/tpaw-account-widget.h>
-#include <tp-account-widgets/tpaw-user-info.h>
-#include <tp-account-widgets/tpaw-utils.h>
-
-#include "goaprovider.h"
-#include "goaprovider-priv.h"
-#include "goatelepathyprovider.h"
-#include "goatpaccountlinker.h"
-#include "goaobjectskeletonutils.h"
-#include "goautils.h"
-
-typedef struct _GoaTelepathyProviderPrivate GoaTelepathyProviderPrivate;
-
-struct _GoaTelepathyProviderPrivate
-{
- TpawProtocol *protocol;
- gchar *protocol_name;
- gchar *provider_type;
-};
-
-enum {
- PROP_0,
- PROP_PROTOCOL,
- PROP_PROTOCOL_NAME,
- NUM_PROPERTIES
-};
-
-static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
-
-struct _GoaTelepathyProvider
-{
- GoaProvider parent_instance;
- GoaTelepathyProviderPrivate *priv;
-};
-
-typedef struct _GoaTelepathyProviderClass GoaTelepathyProviderClass;
-
-struct _GoaTelepathyProviderClass
-{
- GoaProviderClass parent_class;
-};
-
-G_DEFINE_TYPE (GoaTelepathyProvider, goa_telepathy_provider, GOA_TYPE_PROVIDER);
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static GoaTpAccountLinker *tp_linker = NULL;
-static guint name_watcher_id = 0;
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-/* Telepathy / telepathy-account widgets utility functions. */
-
-static void
-account_settings_ready_cb (TpawAccountSettings *settings,
- GParamSpec *pspec,
- gpointer user_data)
-{
- GMainLoop *loop = user_data;
-
- g_main_loop_quit (loop);
-}
-
-static void
-wait_for_account_settings_ready (TpawAccountSettings *settings,
- GMainLoop *loop)
-{
- if (!tpaw_account_settings_is_ready (settings))
- {
- g_signal_connect (settings, "notify::ready",
- G_CALLBACK (account_settings_ready_cb), loop);
- g_main_loop_run (loop);
- }
-}
-
-typedef struct
-{
- GMainLoop *loop;
- GError *error;
- gboolean ret;
-} PrepareTpProxyData;
-
-static void
-proxy_prepared_cb (GObject *object,
- GAsyncResult *res,
- gpointer user_data)
-{
- PrepareTpProxyData *data = user_data;
-
- data->ret = tp_proxy_prepare_finish (object, res, &data->error);
- g_main_loop_quit (data->loop);
-}
-
-static gboolean
-prepare_tp_proxy (gpointer proxy,
- const GQuark *features,
- GMainLoop *loop,
- GError **error)
-{
- PrepareTpProxyData data = { NULL, };
-
- data.loop = loop;
-
- tp_proxy_prepare_async (proxy, features, proxy_prepared_cb, &data);
- g_main_loop_run (data.loop);
-
- if (data.error != NULL)
- {
- g_propagate_error (error, data.error);
- g_clear_error (&data.error);
- }
-
- return data.ret;
-}
-
-static TpAccount *
-find_tp_account (GoaObject *goa_object,
- GMainLoop *loop,
- GError **out_error)
-{
- GoaAccount *goa_account = NULL;
- const gchar *id = NULL;
- TpAccountManager *account_manager;
- GList *tp_accounts = NULL;
- GList *l = NULL;
- TpAccount *tp_account = NULL;
- GError *error = NULL;
-
- goa_account = goa_object_peek_account (goa_object);
- id = goa_account_get_identity (goa_account);
-
- account_manager = tp_account_manager_dup ();
- if (!prepare_tp_proxy (account_manager, NULL, loop, &error))
- goto out;
-
- tp_accounts = tp_account_manager_dup_valid_accounts (account_manager);
- for (l = tp_accounts; l != NULL; l = l->next)
- {
- if (g_strcmp0 (tp_proxy_get_object_path (l->data), id) == 0)
- {
- tp_account = g_object_ref (l->data);
- break;
- }
- }
-
- if (tp_account == NULL)
- {
- g_set_error (&error,
- GOA_ERROR,
- GOA_ERROR_FAILED,
- _("Telepathy chat account not found"));
- goto out;
- }
-
-out:
- if (error != NULL)
- g_propagate_error (out_error, error);
-
- g_clear_error (&error);
- g_clear_object (&account_manager);
- g_list_free_full (tp_accounts, g_object_unref);
-
- return tp_account;
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static const gchar *
-get_provider_type (GoaProvider *provider)
-{
- GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (provider)->priv;
- return priv->provider_type;
-}
-
-static gchar *
-get_provider_name (GoaProvider *provider,
- GoaObject *object)
-{
- GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (provider)->priv;
-
- return g_strdup (tpaw_protocol_name_to_display_name (priv->protocol_name));
-}
-
-static GIcon *
-get_provider_icon (GoaProvider *provider,
- GoaObject *object)
-{
- GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (provider)->priv;
- const gchar *icon_names[3];
- gchar *icon_name;
- GIcon *icon;
-
- /* Use symbolic icons for generic protocols. Use icons for the
- * branded ones if it matches their visual identity. Otherwise do
- * not use an icon.
- */
- if (g_strcmp0 (priv->protocol_name, "irc") == 0
- || g_strcmp0 (priv->protocol_name, "jabber") == 0
- || g_strcmp0 (priv->protocol_name, "local-xmpp") == 0
- || g_strcmp0 (priv->protocol_name, "sip") == 0)
- {
- icon_name = g_strdup ("user-available-symbolic");
- }
- else if (g_strcmp0 (priv->protocol_name, "aim") == 0
- || g_strcmp0 (priv->protocol_name, "gadugadu") == 0
- || g_strcmp0 (priv->protocol_name, "silc") == 0)
- {
- icon_name = tpaw_protocol_icon_name (priv->protocol_name);
- }
- else
- {
- icon_name = g_strdup ("goa-account");
- }
-
- icon_names[0] = icon_name;
- /* If the icon doesn't exist, just try with the default icon. */
- icon_names[1] = "goa-account";
- icon_names[2] = NULL;
- icon = g_themed_icon_new_from_names ((gchar **) icon_names, -1);
-
- g_free (icon_name);
-
- return icon;
-}
-
-static GoaProviderGroup
-get_provider_group (GoaProvider *provider)
-{
- return GOA_PROVIDER_GROUP_CHAT;
-}
-
-static GoaProviderFeatures
-get_provider_features (GoaProvider *provider)
-{
- return GOA_PROVIDER_FEATURE_CHAT;
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static void
-on_name_acquired (GDBusConnection *connection,
- const gchar *name,
- const gchar *name_owner,
- gpointer user_data)
-{
- tp_linker = goa_tp_account_linker_new ();
- g_bus_unwatch_name (name_watcher_id);
- name_watcher_id = 0;
-}
-
-static void
-initialize (GoaProvider *provider)
-{
- static gsize once_init_value = 0;
-
- if (g_once_init_enter (&once_init_value))
- {
- name_watcher_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
- "org.gnome.OnlineAccounts",
- G_BUS_NAME_WATCHER_FLAGS_NONE,
- on_name_acquired,
- NULL,
- NULL,
- NULL);
-
- g_once_init_leave (&once_init_value, 1);
- }
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-typedef struct
-{
- GMainLoop *loop;
- GoaObject *ret;
- GError *error;
-
- GoaTelepathyProvider *provider;
- GtkDialog *dialog;
- GtkBox *vbox;
- gboolean close_received;
-
- TpAccount *tp_account;
-
- GoaClient *goa_client;
- guint goa_account_added_id;
-} AddAccountData;
-
-static void
-quit_main_loop_if_finished (AddAccountData *data)
-{
- if (data->ret != NULL && data->close_received)
- g_main_loop_quit (data->loop);
-}
-
-static void
-run_main_loop_if_needed (AddAccountData *data)
-{
- if (data->ret == NULL || !data->close_received)
- g_main_loop_run (data->loop);
-}
-
-static gboolean
-check_goa_object_match (AddAccountData *data,
- GoaObject *goa_object)
-{
- GoaTelepathyProviderPrivate *priv = data->provider->priv;
- GoaAccount *goa_account = NULL;
- const gchar *provider_type = NULL;
- const gchar *goa_id = NULL;
- const gchar *tp_id = NULL;
-
- if (data->tp_account == NULL)
- {
- /* Still waiting for the creation of the TpAccount */
- return FALSE;
- }
-
- goa_account = goa_object_peek_account (goa_object);
- provider_type = goa_account_get_provider_type (goa_account);
- if (g_strcmp0 (provider_type, priv->provider_type) != 0)
- return FALSE;
-
- /* The backend-specific identity is set to the object path of the
- * corresponding Telepathy account object. */
- goa_id = goa_account_get_identity (goa_account);
- tp_id = tp_proxy_get_object_path (TP_PROXY (data->tp_account));
- if (g_strcmp0 (goa_id, tp_id) == 0)
- {
- /* Found it! */
- data->ret = g_object_ref (goa_object);
- quit_main_loop_if_finished (data);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-check_existing_goa_accounts (AddAccountData *data)
-{
- GList *goa_accounts = NULL;
- GList *l = NULL;
- gboolean found = FALSE;
-
- if (data->tp_account == NULL)
- return FALSE;
-
- goa_accounts = goa_client_get_accounts (data->goa_client);
- for (l = goa_accounts; l != NULL; l = l->next)
- {
- if (check_goa_object_match (data, l->data))
- {
- found = TRUE;
- break;
- }
- }
- g_list_free_full (goa_accounts, g_object_unref);
-
- return found;
-}
-
-static void
-tp_account_created_cb (TpawAccountWidget *widget,
- TpAccount *tp_account,
- AddAccountData *data)
-{
- g_assert (data->tp_account == NULL);
- data->tp_account = g_object_ref (tp_account);
-
- check_existing_goa_accounts (data);
-}
-
-static void
-goa_account_added_cb (GoaClient *client,
- GoaObject *goa_object,
- gpointer user_data)
-{
- AddAccountData *data = user_data;
-
- check_goa_object_match (data, goa_object);
-}
-
-static void
-account_widget_close_cb (TpawAccountWidget *widget,
- GtkResponseType response,
- AddAccountData *data)
-{
- data->close_received = TRUE;
- quit_main_loop_if_finished (data);
-}
-
-static GoaObject *
-add_account (GoaProvider *provider,
- GoaClient *client,
- GtkDialog *dialog,
- GtkBox *vbox,
- GError **error)
-{
- GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (provider)->priv;
- AddAccountData data;
- TpawAccountSettings *settings = NULL;
- TpawAccountWidget *account_widget = NULL;
- gint response;
- gint width;
-
- settings = tpaw_protocol_create_account_settings (priv->protocol);
- if (settings == NULL)
- {
- g_set_error (&data.error,
- GOA_ERROR,
- GOA_ERROR_FAILED,
- _("Failed to create a user interface for %s"),
- priv->protocol != NULL ?
- tpaw_protocol_get_protocol_name (priv->protocol) :
- "(null)");
- return NULL;
- }
-
- memset (&data, 0, sizeof (AddAccountData));
- data.loop = g_main_loop_new (NULL, FALSE);
- data.error = NULL;
- data.provider = GOA_TELEPATHY_PROVIDER (provider);
- data.dialog = dialog;
- data.vbox = vbox;
-
- data.goa_client = client;
- data.goa_account_added_id = g_signal_connect (data.goa_client,
- "account-added", G_CALLBACK (goa_account_added_cb), &data);
-
- wait_for_account_settings_ready (settings, data.loop);
-
- account_widget = tpaw_account_widget_new_for_protocol (settings,
- dialog, TRUE);
- gtk_container_add (GTK_CONTAINER (vbox), GTK_WIDGET (account_widget));
- gtk_widget_show (GTK_WIDGET (account_widget));
- g_signal_connect (account_widget, "account-created",
- G_CALLBACK (tp_account_created_cb), &data);
- g_signal_connect (account_widget, "close",
- G_CALLBACK (account_widget_close_cb), &data);
-
- /* The dialog now contains a lot of empty space between the account widget
- * and the buttons. We force it's vertical size to be just right to fit the
- * widget. */
- gtk_window_get_size (GTK_WINDOW (dialog), &width, NULL);
- gtk_window_set_default_size (GTK_WINDOW (dialog), width, -1);
-
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- if (response != GTK_RESPONSE_OK && response != GTK_RESPONSE_APPLY)
- {
- g_set_error (&data.error,
- GOA_ERROR,
- GOA_ERROR_DIALOG_DISMISSED,
- _("Dialog was dismissed"));
- goto out;
- }
-
- if (data.error != NULL)
- {
- /* An error could have been set by a callback */
- goto out;
- }
-
- /* We wait for the account to be created */
- run_main_loop_if_needed (&data);
-
-out:
- if (data.error != NULL)
- g_propagate_error (error, data.error);
- else
- g_assert (data.ret != NULL);
-
- if (data.goa_account_added_id)
- g_signal_handler_disconnect (data.goa_client, data.goa_account_added_id);
-
- g_clear_pointer (&data.loop, g_main_loop_unref);
- g_clear_object (&data.tp_account);
-
- return data.ret;
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static void
-account_dialog_widget_cancelled_cb (TpawAccountWidget *account_widget,
- gpointer user_data)
-{
- GError **error = user_data;
-
- g_set_error (error,
- GOA_ERROR,
- GOA_ERROR_DIALOG_DISMISSED,
- _("Dialog was dismissed"));
-}
-
-static gboolean
-edit_connection_parameters (GoaObject *goa_object,
- GtkWindow *parent,
- GError **out_error)
-{
- GMainLoop *loop = NULL;
- TpAccount *tp_account = NULL;
- TpawAccountSettings *settings = NULL;
- GtkWidget *dialog = NULL;
- TpawAccountWidget *account_widget = NULL;
- GtkWidget *content_area = NULL;
- gboolean ret;
- GError *error = NULL;
-
- loop = g_main_loop_new (NULL, FALSE);
-
- tp_account = find_tp_account (goa_object, loop, &error);
- if (tp_account == NULL)
- goto out;
-
- settings = tpaw_account_settings_new_for_account (tp_account);
- wait_for_account_settings_ready (settings, loop);
-
- dialog = gtk_dialog_new_with_buttons (_("Connection Settings"),
- parent,
- GTK_DIALOG_MODAL
- | GTK_DIALOG_DESTROY_WITH_PARENT
- | GTK_DIALOG_USE_HEADER_BAR,
- NULL, NULL);
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
-
- account_widget = tpaw_account_widget_new_for_protocol (settings,
- GTK_DIALOG (dialog), FALSE);
- gtk_widget_set_margin_end (GTK_WIDGET (account_widget), 6);
- gtk_widget_set_margin_start (GTK_WIDGET (account_widget), 6);
- gtk_widget_set_margin_top (GTK_WIDGET (account_widget), 6);
- g_signal_connect (account_widget, "cancelled",
- G_CALLBACK (account_dialog_widget_cancelled_cb), &error);
- g_signal_connect_swapped (account_widget, "close",
- G_CALLBACK (g_main_loop_quit), loop);
-
- content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
- gtk_box_pack_start (GTK_BOX (content_area), GTK_WIDGET (account_widget),
- TRUE, TRUE, 0);
-
- gtk_widget_show (GTK_WIDGET (account_widget));
- gtk_widget_show (dialog);
-
- /* Wait for the dialog to be dismissed */
- g_main_loop_run (loop);
-
- gtk_widget_destroy (dialog);
-
-out:
- if (error != NULL)
- {
- g_propagate_error (out_error, error);
- ret = FALSE;
- }
- else
- {
- ret = TRUE;
- }
-
- g_clear_object (&settings);
- g_clear_object (&tp_account);
- g_clear_pointer (&loop, g_main_loop_unref);
-
- return ret;
-}
-
-static gboolean
-refresh_account (GoaProvider *provider,
- GoaClient *client,
- GoaObject *object,
- GtkWindow *parent,
- GError **error)
-{
- return edit_connection_parameters (object, parent, error);
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-typedef struct
-{
- GMainLoop *loop;
- GError *error;
-} EditPersonalDetailsData;
-
-static void
-user_info_apply_cb (GObject *object,
- GAsyncResult *res,
- gpointer user_data)
-{
- EditPersonalDetailsData *data = user_data;
-
- tpaw_user_info_apply_finish (TPAW_USER_INFO (object), res, &data->error);
- g_main_loop_quit (data->loop);
-}
-
-static gboolean
-personal_details_timeout_cb (gpointer user_data)
-{
- EditPersonalDetailsData *data = user_data;
-
- g_main_loop_quit (data->loop);
- return G_SOURCE_REMOVE;
-}
-
-static gboolean
-edit_personal_details (GoaObject *goa_object,
- GtkWindow *parent,
- GError **error)
-{
- EditPersonalDetailsData data;
- TpAccount *tp_account = NULL;
- GtkWidget *dialog = NULL;
- GtkWidget *user_info = NULL;
- GtkWidget *content_area = NULL;
- gint response;
- gboolean ret = FALSE;
-
- memset (&data, 0, sizeof (EditPersonalDetailsData));
- data.loop = g_main_loop_new (NULL, FALSE);
-
- tp_account = find_tp_account (goa_object, data.loop, &data.error);
- if (tp_account == NULL)
- goto out;
-
- dialog = gtk_dialog_new_with_buttons (_("Personal Details"),
- parent,
- GTK_DIALOG_MODAL
- | GTK_DIALOG_DESTROY_WITH_PARENT
- | GTK_DIALOG_USE_HEADER_BAR,
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- _("_OK"), GTK_RESPONSE_OK,
- NULL);
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
-
- user_info = tpaw_user_info_new (tp_account);
- gtk_widget_set_margin_end (user_info, 6);
- gtk_widget_set_margin_start (user_info, 6);
- gtk_widget_set_margin_top (user_info, 6);
- gtk_widget_show (user_info);
-
- content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
- gtk_box_pack_start (GTK_BOX (content_area), user_info, TRUE, TRUE, 0);
-
- g_timeout_add (100, personal_details_timeout_cb, &data);
- g_main_loop_run (data.loop);
-
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- if (response == GTK_RESPONSE_OK)
- {
- tpaw_user_info_apply_async (TPAW_USER_INFO (user_info),
- user_info_apply_cb, &data);
- g_main_loop_run (data.loop);
- if (data.error != NULL)
- goto out;
- }
- else
- {
- g_set_error (&data.error,
- GOA_ERROR,
- GOA_ERROR_DIALOG_DISMISSED,
- _("Dialog was dismissed"));
- goto out;
- }
-
- ret = TRUE;
-
-out:
- if (data.error != NULL)
- {
- g_propagate_error (error, data.error);
- }
-
- g_clear_pointer (&dialog, gtk_widget_destroy);
- g_clear_object (&tp_account);
- g_clear_pointer (&data.loop, g_main_loop_unref);
-
- return ret;
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static gboolean
-build_object (GoaProvider *provider,
- GoaObjectSkeleton *object,
- GKeyFile *key_file,
- const gchar *group,
- GDBusConnection *connection,
- gboolean just_added,
- GError **error)
-{
- GoaAccount *account;
- gboolean chat_enabled;
- gboolean ret;
-
- account = NULL;
- ret = FALSE;
-
- /* Chain up */
- if (!GOA_PROVIDER_CLASS (goa_telepathy_provider_parent_class)->build_object (provider,
- object,
- key_file,
- group,
- connection,
- just_added,
- error))
- goto out;
-
- account = goa_object_get_account (GOA_OBJECT (object));
-
- /* Chat */
- chat_enabled = g_key_file_get_boolean (key_file, group, "ChatEnabled", NULL);
- goa_object_skeleton_attach_chat (object, chat_enabled);
-
- if (just_added)
- {
- goa_account_set_chat_disabled (account, !chat_enabled);
- g_signal_connect (account,
- "notify::chat-disabled",
- G_CALLBACK (goa_util_account_notify_property_cb),
- (gpointer) "ChatEnabled");
- }
-
- ret = TRUE;
-
-out:
- g_clear_object (&account);
- return ret;
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static void
-remove_account_remove_tp_account_cb (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
-{
- GError *error;
- GTask *task = G_TASK (user_data);
-
- error = NULL;
- if (!goa_tp_account_linker_remove_tp_account_finish (tp_linker, res, &error))
- {
- g_task_return_error (task, error);
- goto out;
- }
-
- g_task_return_boolean (task, TRUE);
-
- out:
- g_object_unref (task);
-}
-
-static void
-remove_account (GoaProvider *provider,
- GoaObject *object,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GoaTelepathyProvider *self = GOA_TELEPATHY_PROVIDER (provider);
- GTask *task;
-
- task = g_task_new (self, cancellable, callback, user_data);
- g_task_set_source_tag (task, remove_account);
-
- goa_tp_account_linker_remove_tp_account (tp_linker,
- object,
- cancellable,
- remove_account_remove_tp_account_cb,
- g_object_ref (task));
-
- g_object_unref (task);
-}
-
-static gboolean
-remove_account_finish (GoaProvider *provider,
- GAsyncResult *res,
- GError **error)
-{
- GoaTelepathyProvider *self = GOA_TELEPATHY_PROVIDER (provider);
- GTask *task;
-
- g_return_val_if_fail (g_task_is_valid (res, self), FALSE);
- task = G_TASK (res);
-
- g_return_val_if_fail (g_task_get_source_tag (task) == remove_account, FALSE);
-
- return g_task_propagate_boolean (task, error);
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-typedef struct
-{
- guint ref_count;
- GoaObject *object;
- GtkWindow *parent;
-} EditData;
-
-static EditData *
-edit_data_new (GoaObject *object,
- GtkWindow *parent)
-{
- EditData *data;
-
- data = g_slice_new0 (EditData);
- data->ref_count = 1;
- data->object = g_object_ref (object);
- data->parent = parent;
-
- return data;
-}
-
-static void
-edit_data_unref (EditData *data)
-{
- data->ref_count--;
- if (data->ref_count >= 1)
- return;
-
- g_object_unref (data->object);
- g_slice_free (EditData, data);
-}
-
-static void
-edit_button_destroy_cb (GtkWidget *button,
- gpointer user_data)
-{
- EditData *data = user_data;
-
- edit_data_unref (data);
-}
-
-static void
-edit_data_handle_button (EditData *data,
- GtkWidget *button,
- GCallback cb)
-{
- g_return_if_fail (GTK_IS_BUTTON (button));
-
- g_signal_connect (button, "clicked", cb, data);
- g_signal_connect (button, "destroy", G_CALLBACK (edit_button_destroy_cb), data);
-
- data->ref_count++;
-}
-
-static void
-maybe_show_error (GtkWindow *parent,
- GError *error,
- const gchar *msg)
-{
- GtkWidget *dialog;
-
- if (error->domain == GOA_ERROR && error->code == GOA_ERROR_DIALOG_DISMISSED)
- return;
-
- dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s: %s (%s, %d)",
- msg,
- error->message,
- g_quark_to_string (error->domain),
- error->code);
- g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
- gtk_dialog_run (GTK_DIALOG (dialog));
-}
-
-static void
-edit_parameters_clicked_cb (GtkButton *button,
- gpointer user_data)
-{
- EditData *data = user_data;
- GError *error = NULL;
-
- if (!edit_connection_parameters (data->object, data->parent, &error))
- maybe_show_error (data->parent, error, _("Cannot save the connection parameters"));
- g_clear_error (&error);
-}
-
-static void
-edit_personal_details_clicked_cb (GtkButton *button,
- gpointer user_data)
-{
- EditData *data = user_data;
- GError *error = NULL;
-
- if (!edit_personal_details (data->object, data->parent, &error))
- maybe_show_error (data->parent, error,
- _("Cannot save your personal information on the server"));
- g_clear_error (&error);
-}
-
-static void
-show_account (GoaProvider *provider,
- GoaClient *client,
- GoaObject *object,
- GtkBox *vbox,
- G_GNUC_UNUSED GtkGrid *dummy1,
- G_GNUC_UNUSED GtkGrid *dummy2)
-{
- EditData *data = NULL;
- GtkWidget *grid;
- GtkWidget *params_button = NULL;
- GtkWidget *details_button = NULL;
- GtkWidget *button_box = NULL;
- gint row = 0;
-
- goa_utils_account_add_attention_needed (client, object, provider, vbox);
-
- grid = gtk_grid_new ();
- gtk_widget_set_halign (grid, GTK_ALIGN_CENTER);
- gtk_widget_set_hexpand (grid, TRUE);
- gtk_widget_set_margin_end (grid, 72);
- gtk_widget_set_margin_start (grid, 72);
- gtk_widget_set_margin_top (grid, 24);
- gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
- gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
- gtk_container_add (GTK_CONTAINER (vbox), grid);
-
- goa_utils_account_add_header (object, GTK_GRID (grid), row++);
-
- goa_util_add_row_switch_from_keyfile_with_blurb (GTK_GRID (grid),
- row++,
- object,
- /* Translators: This is a label for a series of
- * options switches. For example: “Use for Mail”. */
- _("Use for"),
- "chat-disabled",
- _("C_hat"));
-
- data = edit_data_new (object, tpaw_get_toplevel_window (GTK_WIDGET (vbox)));
-
- /* Connection Settings button */
- params_button = gtk_button_new_with_mnemonic (_("_Connection Settings"));
- edit_data_handle_button (data, params_button, G_CALLBACK (edit_parameters_clicked_cb));
-
- /* Edit Personal Information button */
- details_button = gtk_button_new_with_mnemonic (_("_Personal Details"));
- edit_data_handle_button (data, details_button, G_CALLBACK (edit_personal_details_clicked_cb));
-
- /* Box containing the buttons */
- button_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_box_pack_start (GTK_BOX (button_box), params_button,
- FALSE, FALSE, 12);
- gtk_container_add (GTK_CONTAINER (button_box), details_button);
-
- goa_util_add_row_widget (GTK_GRID (grid), row++, NULL, button_box);
-
- edit_data_unref (data);
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-GoaTelepathyProvider *
-goa_telepathy_provider_new_from_protocol_name (const gchar *protocol_name)
-{
- g_return_val_if_fail (protocol_name != NULL, NULL);
-
- return g_object_new (GOA_TYPE_TELEPATHY_PROVIDER,
- "protocol-name", protocol_name,
- NULL);
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-GoaTelepathyProvider *
-goa_telepathy_provider_new_from_protocol (TpawProtocol *protocol)
-{
- g_return_val_if_fail (TPAW_IS_PROTOCOL (protocol), NULL);
-
- return g_object_new (GOA_TYPE_TELEPATHY_PROVIDER,
- "protocol", protocol,
- NULL);
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static void
-goa_telepathy_provider_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (object)->priv;
-
- switch (property_id) {
- case PROP_PROTOCOL:
- g_value_set_object (value, priv->protocol);
- break;
- case PROP_PROTOCOL_NAME:
- g_value_set_string (value, priv->protocol_name);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-goa_telepathy_provider_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (object)->priv;
-
- switch (property_id) {
- case PROP_PROTOCOL:
- priv->protocol = g_value_dup_object (value);
- break;
- case PROP_PROTOCOL_NAME:
- priv->protocol_name = g_value_dup_string (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-goa_telepathy_provider_init (GoaTelepathyProvider *self)
-{
- self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
- GOA_TYPE_TELEPATHY_PROVIDER, GoaTelepathyProviderPrivate);
-}
-
-static void
-goa_telepathy_provider_constructed (GObject *object)
-{
- GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (object)->priv;
-
- G_OBJECT_CLASS (goa_telepathy_provider_parent_class)->constructed (object);
-
- if (priv->protocol != NULL)
- {
- if (priv->protocol_name != NULL)
- g_error ("You cannot set \"protocol-name\" if you set \"protocol\"");
- priv->protocol_name = g_strdup (tpaw_protocol_get_protocol_name (priv->protocol));
- }
- else
- {
- if (priv->protocol_name == NULL)
- g_error ("You must set \"protocol-name\" or \"protocol\" on GoaTelepathyProvider");
- }
-
- priv->provider_type = g_strdup_printf ("%s/%s",
- GOA_TELEPATHY_NAME, priv->protocol_name);
-}
-
-static void
-goa_telepathy_provider_finalize (GObject *object)
-{
- GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (object)->priv;
-
- g_clear_object (&priv->protocol);
- g_free (priv->protocol_name);
- g_free (priv->provider_type);
-
- (G_OBJECT_CLASS (goa_telepathy_provider_parent_class)->finalize) (object);
-}
-
-static void
-goa_telepathy_provider_class_init (GoaTelepathyProviderClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GoaProviderClass *provider_class = GOA_PROVIDER_CLASS (klass);
-
- goa_utils_initialize_client_factory ();
-
- object_class->constructed = goa_telepathy_provider_constructed;
- object_class->finalize = goa_telepathy_provider_finalize;
- object_class->get_property = goa_telepathy_provider_get_property;
- object_class->set_property = goa_telepathy_provider_set_property;
-
- provider_class->get_provider_type = get_provider_type;
- provider_class->get_provider_name = get_provider_name;
- provider_class->get_provider_icon = get_provider_icon;
- provider_class->get_provider_group = get_provider_group;
- provider_class->get_provider_features = get_provider_features;
- provider_class->initialize = initialize;
- provider_class->add_account = add_account;
- provider_class->refresh_account = refresh_account;
- provider_class->build_object = build_object;
- provider_class->remove_account = remove_account;
- provider_class->remove_account_finish = remove_account_finish;
- provider_class->show_account = show_account;
-
- g_type_class_add_private (object_class, sizeof (GoaTelepathyProviderPrivate));
-
- /**
- * GoaTelepathyProvider:protocol
- *
- * A #TpawProtocol associated to this provider (or NULL).
- */
- properties[PROP_PROTOCOL] =
- g_param_spec_object ("protocol",
- "Protocol",
- "A #TpawProtocol associated to the provider (or NULL)",
- TPAW_TYPE_PROTOCOL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
-
- /**
- * GoaTelepathyProvider:protocol-name
- *
- * The name of the protocol associated to the provider.
- */
- properties[PROP_PROTOCOL_NAME] =
- g_param_spec_string ("protocol-name",
- "Protocol name",
- "The name of the protocol associated to the provider",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
-
- g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
-}
diff --git a/src/goabackend/goatelepathyprovider.h b/src/goabackend/goatelepathyprovider.h
deleted file mode 100644
index 1b44018..0000000
--- a/src/goabackend/goatelepathyprovider.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/*
- * Copyright © 2012 – 2017 Red Hat, Inc.
- * Copyright © 2013 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GOA_BACKEND_INSIDE_GOA_BACKEND_H__) && !defined (GOA_BACKEND_COMPILATION)
-#error "Only <goabackend/goabackend.h> can be included directly."
-#endif
-
-#ifndef __GOA_TELEPATHY_PROVIDER_H__
-#define __GOA_TELEPATHY_PROVIDER_H__
-
-#include <glib-object.h>
-#include <tp-account-widgets/tpaw-protocol.h>
-
-G_BEGIN_DECLS
-
-#define GOA_TYPE_TELEPATHY_PROVIDER (goa_telepathy_provider_get_type ())
-#define GOA_TELEPATHY_PROVIDER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GOA_TYPE_TELEPATHY_PROVIDER, GoaTelepathyProvider))
-#define GOA_IS_TELEPATHY_PROVIDER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GOA_TYPE_TELEPATHY_PROVIDER))
-
-typedef struct _GoaTelepathyProvider GoaTelepathyProvider;
-
-GType goa_telepathy_provider_get_type (void) G_GNUC_CONST;
-
-GoaTelepathyProvider *goa_telepathy_provider_new_from_protocol_name (const gchar *protocol_name);
-GoaTelepathyProvider *goa_telepathy_provider_new_from_protocol (TpawProtocol *protocol);
-
-G_END_DECLS
-
-#endif /* __GOA_TELEPATHY_PROVIDER_H__ */
diff --git a/src/goabackend/goatpaccountlinker.c b/src/goabackend/goatpaccountlinker.c
deleted file mode 100644
index b31cfef..0000000
--- a/src/goabackend/goatpaccountlinker.c
+++ /dev/null
@@ -1,669 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/*
- * Copyright © 2010 – 2013 Collabora Ltd.
- * Copyright © 2013 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-/* This class makes sure we have a GOA account for each Telepathy account
- * configured in the system.
- * Note that this handles only plain Telepathy accounts; the ones with
- * multiple capabilities (e.g. Facebook) are handled differently. */
-
-#include "config.h"
-
-#include <gio/gio.h>
-#include <telepathy-glib/telepathy-glib.h>
-
-#include "goatpaccountlinker.h"
-#include "goabackend/goautils.h"
-
-#define GOA_TP_ACCOUNT_LINKER_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GOA_TYPE_TP_ACCOUNT_LINKER, \
- GoaTpAccountLinkerPrivate))
-
-G_DEFINE_TYPE (GoaTpAccountLinker, goa_tp_account_linker, G_TYPE_OBJECT)
-
-struct _GoaTpAccountLinkerPrivate
-{
- TpAccountManager *account_manager;
- GoaClient *goa_client;
-
- GHashTable *tp_accounts; /* owned gchar *id -> reffed TpAccount * */
- GHashTable *goa_accounts; /* owned gchar *id -> reffed GoaObject * */
-
- GQueue *remove_tp_account_queue;
-};
-
-/* The path of the Telepathy account is used as common identifier between
- * GOA and Telepathy */
-static const gchar *
-get_id_from_tp_account (TpAccount *tp_account)
-{
- return tp_proxy_get_object_path (tp_account);
-}
-
-static const gchar *
-get_id_from_goa_account (GoaAccount *goa_account)
-{
- return goa_account_get_identity (goa_account);
-}
-
-static gboolean
-is_telepathy_account (GoaAccount *goa_account)
-{
- const gchar *type = goa_account_get_provider_type (goa_account);
- return g_str_has_prefix (type, "telepathy/");
-}
-
-static void
-tp_account_removed_by_us_cb (GObject *object,
- GAsyncResult *res,
- gpointer user_data)
-{
- TpAccount *tp_account = TP_ACCOUNT (object);
- GError *error = NULL;
- GTask *task = G_TASK (user_data);
-
- if (!tp_account_remove_finish (tp_account, res, &error))
- {
- g_critical ("Error removing Telepathy account %s: %s (%s, %d)",
- get_id_from_tp_account (tp_account),
- error->message,
- g_quark_to_string (error->domain),
- error->code);
- g_task_return_error (task, error);
- goto out;
- }
-
- g_task_return_boolean (task, TRUE);
-
- out:
- g_object_unref (task);
-}
-
-static void
-remove_tp_account_queue_check (GoaTpAccountLinker *self)
-{
- GoaTpAccountLinkerPrivate *priv = self->priv;
- GList *l;
-
- if (priv->goa_client == NULL ||
- priv->account_manager == NULL ||
- !tp_proxy_is_prepared (priv->account_manager, TP_ACCOUNT_MANAGER_FEATURE_CORE))
- {
- /* Not everything is ready yet */
- return;
- }
-
- if (priv->remove_tp_account_queue->length == 0)
- return;
-
- for (l = priv->remove_tp_account_queue->head; l != NULL; l = l->next)
- {
- GTask *task = G_TASK (l->data);
- GoaAccount *goa_account;
- GoaObject *goa_object;
- TpAccount *tp_account;
- const gchar *id;
-
- goa_object = GOA_OBJECT (g_task_get_task_data (task));
- goa_account = goa_object_peek_account (goa_object);
-
- id = get_id_from_goa_account (goa_account);
- if (!g_hash_table_remove (priv->goa_accounts, id))
- {
- /* 1 - The user removes the Telepathy account (but not the GOA one)
- * 2 - We delete the corresponding GOA account and remove it
- * from priv->goa_accounts
- * 3 - The Telepathy provider again tries to remove the
- * corresponding Telepathy account
- */
- g_debug ("Ignoring removal of GOA account we asked to remove "
- "(%s, Telepathy object path: %s)",
- goa_account_get_id (goa_account),
- id);
- g_task_return_boolean (task, TRUE);
- continue;
- }
-
- g_info ("GOA account %s for Telepathy account %s removed, "
- "removing Telepathy account",
- goa_account_get_id (goa_account), id);
-
- tp_account = g_hash_table_lookup (priv->tp_accounts, id);
- if (tp_account == NULL)
- {
- g_critical ("There is no Telepathy account for removed GOA "
- "account %s (Telepathy object path: %s)",
- goa_account_get_id (goa_account), id);
- g_task_return_boolean (task, TRUE);
- continue;
- }
- tp_account_remove_async (tp_account, tp_account_removed_by_us_cb, g_object_ref (task));
- g_hash_table_remove (priv->tp_accounts, id);
- }
-
- g_queue_foreach (priv->remove_tp_account_queue, (GFunc) g_object_unref, NULL);
- g_queue_clear (priv->remove_tp_account_queue);
-}
-
-static void
-goa_account_chat_disabled_changed_cb (GoaAccount *goa_account,
- GParamSpec *spec,
- GoaTpAccountLinker *self)
-{
- GoaTpAccountLinkerPrivate *priv = self->priv;
- const gchar *id;
- TpAccount *tp_account;
- gboolean tp_enabled;
- gboolean goa_enabled;
-
- id = get_id_from_goa_account (goa_account);
- tp_account = g_hash_table_lookup (priv->tp_accounts, id);
- if (tp_account == NULL)
- return;
-
- goa_enabled = !goa_account_get_chat_disabled (goa_account);
- tp_enabled = tp_account_is_enabled (tp_account);
- if (tp_enabled != goa_enabled)
- {
- g_info ("The GOA account %s (Telepathy object path: %s) has been %s, "
- "propagating to Telepathy",
- goa_account_get_id (goa_account), id,
- goa_enabled ? "enabled" : "disabled");
- tp_account_set_enabled_async (tp_account, goa_enabled, NULL, NULL);
- }
-}
-
-static void
-tp_account_chat_enabled_changed_cb (TpAccount *tp_account,
- GParamSpec *spec,
- GoaTpAccountLinker *self)
-{
- GoaTpAccountLinkerPrivate *priv = self->priv;
- const gchar *id;
- GoaObject *goa_object;
- GoaAccount *goa_account;
- gboolean tp_enabled;
- gboolean goa_enabled;
-
- id = get_id_from_tp_account (tp_account);
- goa_object = g_hash_table_lookup (priv->goa_accounts, id);
- if (goa_object == NULL)
- return;
-
- goa_account = goa_object_peek_account (goa_object);
- goa_enabled = !goa_account_get_chat_disabled (goa_account);
- tp_enabled = tp_account_is_enabled (tp_account);
- if (tp_enabled != goa_enabled)
- {
- g_info ("The Telepathy account %s has been %s, propagating to GOA",
- id, tp_enabled ? "enabled" : "disabled");
- /* When we set this property, the autogenerated code emits a notify
- * signal immediately even if the property hasn't changed, so
- * goa_account_chat_disabled_changed_cb() thinks that the property
- * changed back to the old value and a cycle starts.
- * The right notify signal will be emitted later when the property is
- * actually changed. */
- g_signal_handlers_block_by_func (goa_account,
- goa_account_chat_disabled_changed_cb, self);
- goa_account_set_chat_disabled (goa_account, !tp_enabled);
- g_signal_handlers_unblock_by_func (goa_account,
- goa_account_chat_disabled_changed_cb, self);
- }
-}
-
-static void
-goa_account_created_cb (GoaManager *manager,
- GAsyncResult *res,
- gpointer user_data)
-{
- TpAccount *tp_account = user_data;
- gchar *goa_account_object_path = NULL;
- GError *error = NULL;
-
- if (!goa_manager_call_add_account_finish (manager,
- &goa_account_object_path, res, &error))
- {
- g_critical ("Failed to create a GOA account for %s: %s (%s, %d)",
- get_id_from_tp_account (tp_account),
- error->message,
- g_quark_to_string (error->domain),
- error->code);
- g_error_free (error);
- goto out;
- }
-
- g_info ("Created new %s GOA account for Telepathy account %s",
- goa_account_object_path, get_id_from_tp_account (tp_account));
-
- out:
- g_object_unref (tp_account);
-}
-
-static void
-create_goa_account (GoaTpAccountLinker *self,
- TpAccount *tp_account)
-{
- GoaTpAccountLinkerPrivate *priv = self->priv;
- GVariantBuilder credentials;
- GVariantBuilder details;
- gchar *provider;
-
- g_info ("Creating new GOA account for Telepathy account %s",
- get_id_from_tp_account (tp_account));
-
- g_variant_builder_init (&credentials, G_VARIANT_TYPE_VARDICT);
-
- g_variant_builder_init (&details, G_VARIANT_TYPE ("a{ss}"));
- g_variant_builder_add (&details, "{ss}", "ChatEnabled",
- tp_account_is_enabled (tp_account) ? "true" : "false");
-
- provider = g_strdup_printf ("telepathy/%s",
- tp_account_get_protocol_name (tp_account));
-
- goa_manager_call_add_account (goa_client_get_manager (priv->goa_client),
- provider,
- get_id_from_tp_account (tp_account),
- tp_account_get_display_name (tp_account),
- g_variant_builder_end (&credentials),
- g_variant_builder_end (&details),
- NULL, /* GCancellable* */
- (GAsyncReadyCallback) goa_account_created_cb,
- g_object_ref (tp_account));
-
- g_free (provider);
-}
-
-static gboolean
-is_account_filtered (TpAccount *tp_account)
-{
- const gchar *env;
- const gchar *id;
-
- env = g_getenv ("GOA_TELEPATHY_DEBUG_ACCOUNT_FILTER");
- if (env == NULL || env[0] == '\0')
- return FALSE;
-
- id = get_id_from_tp_account (tp_account);
- if (g_strstr_len (id, -1, env) != NULL)
- return FALSE; /* "env" is contained in "id" */
- else
- return TRUE;
-}
-
-static void
-tp_account_added (GoaTpAccountLinker *self,
- TpAccount *tp_account)
-{
- GoaTpAccountLinkerPrivate *priv = self->priv;
- const gchar *id = get_id_from_tp_account (tp_account);
- GoaObject *goa_object = NULL;
-
- if (g_strcmp0 (tp_account_get_storage_provider (tp_account),
- "org.gnome.OnlineAccounts") == 0)
- {
- g_debug ("Skipping Telepathy account %s as it's handled directly by GOA", id);
- return;
- }
-
- if (is_account_filtered (tp_account))
- {
- g_debug ("The account %s is ignored for debugging reasons", id);
- return;
- }
-
- g_debug ("Telepathy account found: %s", id);
-
- g_hash_table_replace (priv->tp_accounts, g_strdup (id),
- g_object_ref (tp_account));
-
- g_signal_connect_object (tp_account, "notify::enabled",
- G_CALLBACK (tp_account_chat_enabled_changed_cb),
- self, 0);
-
- goa_object = g_hash_table_lookup (priv->goa_accounts, id);
- if (goa_object == NULL)
- {
- g_debug ("Found a Telepathy account with no corresponding "
- "GOA account: %s", id);
- create_goa_account (self, tp_account);
- }
- else
- {
- g_debug ("Found a Telepathy account with a matching "
- "GOA account: %s", id);
- /* Make sure the initial state is synced. */
- tp_account_chat_enabled_changed_cb (tp_account, NULL, self);
- }
-}
-
-static void
-goa_account_removed_by_us_cb (GObject *object,
- GAsyncResult *res,
- gpointer user_data)
-{
- /* This callback is only used for debugging */
- GoaAccount *goa_account = GOA_ACCOUNT (object);
- GError *error = NULL;
-
- if (!goa_account_call_remove_finish (goa_account, res, &error))
- {
- g_critical ("Error removing GOA account %s (Telepathy object path: %s): "
- "%s (%s, %d)",
- goa_account_get_id (goa_account),
- get_id_from_goa_account (goa_account),
- error->message,
- g_quark_to_string (error->domain),
- error->code);
- g_error_free (error);
- }
-}
-
-static void
-tp_account_removed_cb (TpAccountManager *manager,
- TpAccount *tp_account,
- gpointer user_data)
-{
- GoaTpAccountLinker *self = user_data;
- GoaTpAccountLinkerPrivate *priv = self->priv;
- const gchar *id = get_id_from_tp_account (tp_account);
- GoaObject *goa_object = NULL;
-
- if (!g_hash_table_remove (priv->tp_accounts, id))
- {
- /* 1 - The user removes the GOA account
- * 2 - We delete the corresponding Telepathy account and remove it
- * from priv->tp_accounts
- * 3 - "account-removed" is emitted by the account manager
- * 4 - tp_account_removed_cb is called for an unknown account
- */
- g_debug ("Ignoring removal of Telepathy account we asked to "
- "remove (%s)", id);
- return;
- }
-
- g_info ("Telepathy account %s removed, removing corresponding "
- "GOA account", id);
-
- goa_object = g_hash_table_lookup (priv->goa_accounts, id);
- if (goa_object == NULL)
- {
- g_critical ("There is no GOA account for removed Telepathy "
- "account %s", id);
- return;
- }
- goa_account_call_remove (goa_object_peek_account (goa_object),
- NULL, /* cancellable */
- goa_account_removed_by_us_cb, NULL);
- g_hash_table_remove (priv->goa_accounts, id);
-}
-
-static void
-tp_account_validity_changed_cb (TpAccountManager *manager,
- TpAccount *tp_account,
- gboolean valid,
- gpointer user_data)
-{
- GoaTpAccountLinker *self = user_data;
-
- if (valid)
- tp_account_added (self, tp_account);
-}
-
-static void
-goa_account_added_cb (GoaClient *client,
- GoaObject *goa_object,
- gpointer user_data)
-{
- GoaTpAccountLinker *self = user_data;
- GoaTpAccountLinkerPrivate *priv = self->priv;
- GoaAccount *goa_account = goa_object_peek_account (goa_object);
- const gchar *id = NULL;
- TpAccount *tp_account;
-
- if (!is_telepathy_account (goa_account))
- return;
-
- id = get_id_from_goa_account (goa_account);
- g_debug ("GOA account %s for Telepathy account %s added",
- goa_account_get_id (goa_account), id);
-
- g_signal_connect_object (goa_account, "notify::chat-disabled",
- G_CALLBACK (goa_account_chat_disabled_changed_cb), self, 0);
-
- g_hash_table_insert (priv->goa_accounts, g_strdup (id),
- g_object_ref (goa_object));
-
- tp_account = g_hash_table_lookup (priv->tp_accounts, id);
- if (tp_account != NULL)
- {
- /* The chat enabled status may have changed during the creation of the
- * GOA account, so we need to make sure it's synced. */
- tp_account_chat_enabled_changed_cb (tp_account, NULL, self);
- }
-}
-
-static void
-start_if_ready (GoaTpAccountLinker *self)
-{
- GoaTpAccountLinkerPrivate *priv = self->priv;
- GList *goa_accounts = NULL;
- GList *tp_accounts = NULL;
- GList *l = NULL;
- GHashTableIter iter;
- gpointer key, value;
-
- if (priv->goa_client == NULL ||
- priv->account_manager == NULL ||
- !tp_proxy_is_prepared (priv->account_manager,
- TP_ACCOUNT_MANAGER_FEATURE_CORE))
- {
- /* Not everything is ready yet */
- return;
- }
-
- g_debug ("Both GOA and Tp are ready, starting tracking of accounts");
-
- /* GOA */
- goa_accounts = goa_client_get_accounts (priv->goa_client);
- for (l = goa_accounts; l != NULL; l = l->next)
- goa_account_added_cb (priv->goa_client, l->data, self);
- g_list_free_full (goa_accounts, g_object_unref);
-
- g_signal_connect_object (priv->goa_client, "account-added",
- G_CALLBACK (goa_account_added_cb), self, 0);
-
- /* Telepathy */
- tp_accounts = tp_account_manager_dup_valid_accounts (priv->account_manager);
- for (l = tp_accounts; l != NULL; l = l->next)
- tp_account_added (self, l->data);
- g_list_free_full (tp_accounts, g_object_unref);
-
- g_signal_connect_object (priv->account_manager, "account-validity-changed",
- G_CALLBACK (tp_account_validity_changed_cb), self, 0);
- g_signal_connect_object (priv->account_manager, "account-removed",
- G_CALLBACK (tp_account_removed_cb), self, 0);
-
- /* Now we check if any Telepathy account was deleted while goa-daemon
- * was not running. */
- g_hash_table_iter_init (&iter, priv->goa_accounts);
- while (g_hash_table_iter_next (&iter, &key, &value))
- {
- const gchar *id = key;
- GoaObject *goa_object = value;
-
- if (!g_hash_table_lookup (priv->tp_accounts, id))
- {
- g_warning ("The Telepathy account %s was removed while the daemon "
- "was not running, removing the corresponding GOA account", id);
- goa_account_call_remove (goa_object_peek_account (goa_object),
- NULL, /* cancellable */
- goa_account_removed_by_us_cb,
- NULL); /* user data */
- }
- }
-
- remove_tp_account_queue_check (self);
-}
-
-static void
-account_manager_prepared_cb (GObject *object,
- GAsyncResult *res,
- gpointer user_data)
-{
- GoaTpAccountLinker *self = user_data;
- GError *error = NULL;
-
- if (!tp_proxy_prepare_finish (object, res, &error))
- {
- g_critical ("Error preparing AM: %s", error->message);
- g_clear_error (&error);
- return;
- }
-
- g_debug("Telepathy account manager prepared");
- start_if_ready (self);
-}
-
-static void
-goa_client_new_cb (GObject *object,
- GAsyncResult *result,
- gpointer user_data)
-{
- GoaTpAccountLinker *self = user_data;
- GoaTpAccountLinkerPrivate *priv = self->priv;
- GError *error = NULL;
-
- priv->goa_client = goa_client_new_finish (result, &error);
- if (priv->goa_client == NULL)
- {
- g_critical ("Error connecting to GOA: %s", error->message);
- g_clear_error (&error);
- return;
- }
-
- g_debug("GOA client ready");
- start_if_ready (self);
-}
-
-static void
-goa_tp_account_linker_dispose (GObject *object)
-{
- GoaTpAccountLinker *self = GOA_TP_ACCOUNT_LINKER (object);
- GoaTpAccountLinkerPrivate *priv = self->priv;
-
- if (priv->remove_tp_account_queue != NULL)
- {
- g_queue_free_full (priv->remove_tp_account_queue, g_object_unref);
- priv->remove_tp_account_queue = NULL;
- }
-
- g_clear_object (&priv->account_manager);
- g_clear_object (&priv->goa_client);
-
- g_clear_pointer (&priv->goa_accounts, g_hash_table_unref);
- g_clear_pointer (&priv->tp_accounts, g_hash_table_unref);
-
- G_OBJECT_CLASS (goa_tp_account_linker_parent_class)->dispose (object);
-}
-
-static void
-goa_tp_account_linker_init (GoaTpAccountLinker *self)
-{
- GoaTpAccountLinkerPrivate *priv;
-
- g_debug ("Starting GOA <-> Telepathy account linker");
-
- self->priv = GOA_TP_ACCOUNT_LINKER_GET_PRIVATE (self);
- priv = self->priv;
-
- priv->goa_accounts = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_object_unref);
- priv->tp_accounts = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_object_unref);
-
- priv->remove_tp_account_queue = g_queue_new ();
-
- priv->account_manager = tp_account_manager_dup ();
- tp_proxy_prepare_async (priv->account_manager, NULL,
- account_manager_prepared_cb, self);
-
- goa_client_new (NULL, goa_client_new_cb, self);
-}
-
-static void
-goa_tp_account_linker_class_init (GoaTpAccountLinkerClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- goa_utils_initialize_client_factory ();
-
- g_type_class_add_private (gobject_class,
- sizeof (GoaTpAccountLinkerPrivate));
-
- gobject_class->dispose = goa_tp_account_linker_dispose;
-}
-
-GoaTpAccountLinker *
-goa_tp_account_linker_new (void)
-{
- return g_object_new (GOA_TYPE_TP_ACCOUNT_LINKER, NULL);
-}
-
-void
-goa_tp_account_linker_remove_tp_account (GoaTpAccountLinker *self,
- GoaObject *object,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GoaTpAccountLinkerPrivate *priv;
- GTask *task;
-
- g_return_if_fail (GOA_IS_TP_ACCOUNT_LINKER (self));
- priv = self->priv;
-
- g_return_if_fail (GOA_IS_OBJECT (object));
- g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
-
- task = g_task_new (self, cancellable, callback, user_data);
- g_task_set_source_tag (task, goa_tp_account_linker_remove_tp_account);
- g_task_set_task_data (task, g_object_ref (object), g_object_unref);
- g_queue_push_tail (priv->remove_tp_account_queue, g_object_ref (task));
-
- remove_tp_account_queue_check (self);
-
- g_object_unref (task);
-}
-
-gboolean
-goa_tp_account_linker_remove_tp_account_finish (GoaTpAccountLinker *self,
- GAsyncResult *res,
- GError **error)
-{
- GTask *task;
-
- g_return_val_if_fail (GOA_IS_TP_ACCOUNT_LINKER (self), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
- g_return_val_if_fail (g_task_is_valid (res, self), FALSE);
- task = G_TASK (res);
-
- g_return_val_if_fail (g_task_get_source_tag (task) == goa_tp_account_linker_remove_tp_account, FALSE);
-
- return g_task_propagate_boolean (task, error);
-}
diff --git a/src/goabackend/goatpaccountlinker.h b/src/goabackend/goatpaccountlinker.h
deleted file mode 100644
index d8b34a7..0000000
--- a/src/goabackend/goatpaccountlinker.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/*
- * Copyright © 2010 – 2013 Collabora Ltd.
- * Copyright © 2013 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GOA_TP_ACCOUNT_LINKER_H__
-#define __GOA_TP_ACCOUNT_LINKER_H__
-
-#include <glib-object.h>
-
-#include "goa/goa.h"
-
-G_BEGIN_DECLS
-
-#define GOA_TYPE_TP_ACCOUNT_LINKER (goa_tp_account_linker_get_type ())
-#define GOA_TP_ACCOUNT_LINKER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GOA_TYPE_TP_ACCOUNT_LINKER, GoaTpAccountLinker))
-#define GOA_TP_ACCOUNT_LINKER_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GOA_TYPE_TP_ACCOUNT_LINKER, GoaTpAccountLinkerClass))
-#define GOA_IS_TP_ACCOUNT_LINKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GOA_TYPE_TP_ACCOUNT_LINKER))
-#define GOA_IS_TP_ACCOUNT_LINKER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GOA_TYPE_TP_ACCOUNT_LINKER))
-#define GOA_TP_ACCOUNT_LINKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GOA_TYPE_TP_ACCOUNT_LINKER, GoaTpAccountLinkerClass))
-
-typedef struct _GoaTpAccountLinker GoaTpAccountLinker;
-typedef struct _GoaTpAccountLinkerClass GoaTpAccountLinkerClass;
-typedef struct _GoaTpAccountLinkerPrivate GoaTpAccountLinkerPrivate;
-
-struct _GoaTpAccountLinker
-{
- GObject parent_instance;
- GoaTpAccountLinkerPrivate *priv;
-};
-
-struct _GoaTpAccountLinkerClass
-{
- GObjectClass parent_class;
-};
-
-GType goa_tp_account_linker_get_type (void) G_GNUC_CONST;
-GoaTpAccountLinker *goa_tp_account_linker_new (void);
-void goa_tp_account_linker_remove_tp_account (GoaTpAccountLinker *self,
- GoaObject *object,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-gboolean goa_tp_account_linker_remove_tp_account_finish (GoaTpAccountLinker *self,
- GAsyncResult *res,
- GError **error);
-
-G_END_DECLS
-
-#endif
diff --git a/src/goabackend/goautils.c b/src/goabackend/goautils.c
index 9b00449..8c01d10 100644
--- a/src/goabackend/goautils.c
+++ b/src/goabackend/goautils.c
@@ -21,10 +21,6 @@
#include <glib/gi18n-lib.h>
#include <libsecret/secret.h>
-#ifdef GOA_TELEPATHY_ENABLED
-#include <telepathy-glib/telepathy-glib.h>
-#endif
-
#include "goautils.h"
static const SecretSchema secret_password_schema =
@@ -199,42 +195,6 @@ goa_utils_account_add_header (GoaObject *object, GtkGrid *grid, gint row)
gtk_grid_attach (grid, label, 1, row, 3, 1);
}
-void
-goa_utils_initialize_client_factory (void)
-{
- static gsize once_init_value = 0;
-
- if (g_once_init_enter (&once_init_value))
- {
-#ifdef GOA_TELEPATHY_ENABLED
- TpSimpleClientFactory *factory;
- TpAccountManager *account_manager;
- GQuark account_features[] = {TP_ACCOUNT_FEATURE_ADDRESSING,
- TP_ACCOUNT_FEATURE_STORAGE,
- TP_ACCOUNT_FEATURE_CONNECTION,
- 0};
- GQuark connection_features[] = {TP_CONNECTION_FEATURE_AVATAR_REQUIREMENTS,
- TP_CONNECTION_FEATURE_CONTACT_INFO,
- 0};
-
- /* We make sure that new instances of Telepathy objects will have all
- * the features we need.
- */
- factory = tp_simple_client_factory_new (NULL);
- tp_simple_client_factory_add_account_features (factory, account_features);
- tp_simple_client_factory_add_connection_features (factory, connection_features);
-
- account_manager = tp_account_manager_new_with_factory (factory);
- tp_account_manager_set_default (account_manager);
-
- g_object_unref (account_manager);
- g_object_unref (factory);
-#endif
-
- g_once_init_leave (&once_init_value, 1);
- }
-}
-
gboolean
goa_utils_check_duplicate (GoaClient *client,
const gchar *identity,
diff --git a/src/goabackend/goautils.h b/src/goabackend/goautils.h
index 757318d..8b1a455 100644
--- a/src/goabackend/goautils.h
+++ b/src/goabackend/goautils.h
@@ -46,8 +46,6 @@ void goa_utils_account_add_attention_needed (GoaClient *client,
void goa_utils_account_add_header (GoaObject *object, GtkGrid *grid, gint row);
-void goa_utils_initialize_client_factory (void);
-
gboolean goa_utils_check_duplicate (GoaClient *client,
const gchar *identity,
const gchar *presentation_identity,
diff --git a/telepathy-account-widgets b/telepathy-account-widgets
deleted file mode 160000
-Subproject 7d944b79961dfb6291110ceb27597a224d329b3