aboutsummaryrefslogtreecommitdiffstats
path: root/modules/mail-config
diff options
context:
space:
mode:
Diffstat (limited to 'modules/mail-config')
-rw-r--r--modules/mail-config/e-mail-config-google-summary.c370
-rw-r--r--modules/mail-config/e-mail-config-yahoo-summary.c349
2 files changed, 719 insertions, 0 deletions
diff --git a/modules/mail-config/e-mail-config-google-summary.c b/modules/mail-config/e-mail-config-google-summary.c
new file mode 100644
index 0000000000..c53202f68f
--- /dev/null
+++ b/modules/mail-config/e-mail-config-google-summary.c
@@ -0,0 +1,370 @@
+/*
+ * e-mail-config-google-summary.c
+ *
+ * This program 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) version 3.
+ *
+ * This program 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 the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#include "e-mail-config-google-summary.h"
+
+#include <config.h>
+#include <glib/gi18n-lib.h>
+
+#include <libedataserver/e-data-server-util.h>
+#include <libedataserver/e-source-authentication.h>
+#include <libedataserver/e-source-collection.h>
+#include <libedataserver/e-source-mail-identity.h>
+
+#include <mail/e-mail-config-summary-page.h>
+
+#define E_MAIL_CONFIG_GOOGLE_SUMMARY_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_MAIL_CONFIG_GOOGLE_SUMMARY, EMailConfigGoogleSummaryPrivate))
+
+#define GOOGLE_HELP_URI \
+ "http://support.google.com/mail/bin/answer.py?hl=en&answer=77695"
+
+struct _EMailConfigGoogleSummaryPrivate {
+ ESource *collection_source;
+
+ /* Widgets (not referenced) */
+ GtkWidget *calendar_toggle;
+ GtkWidget *contacts_toggle;
+
+ gboolean applicable;
+};
+
+enum {
+ PROP_0,
+ PROP_APPLICABLE
+};
+
+G_DEFINE_DYNAMIC_TYPE (
+ EMailConfigGoogleSummary,
+ e_mail_config_google_summary,
+ E_TYPE_EXTENSION)
+
+static EMailConfigSummaryPage *
+mail_config_google_summary_get_summary_page (EMailConfigGoogleSummary *extension)
+{
+ EExtensible *extensible;
+
+ extensible = e_extension_get_extensible (E_EXTENSION (extension));
+
+ return E_MAIL_CONFIG_SUMMARY_PAGE (extensible);
+}
+
+static gboolean
+mail_config_google_summary_is_applicable (EMailConfigSummaryPage *page)
+{
+ ESource *source;
+ const gchar *extension_name;
+ const gchar *host = NULL;
+
+ /* FIXME We should tie this into EMailAutoconfig to avoid
+ * hard-coding Google domain names. Maybe retain the
+ * <emailProvider id="..."> it matched so we can just
+ * check for, in this case, "googlemail.com".
+ *
+ * Source:
+ * http://api.gnome.org/evolution/autoconfig/1.1/google.com
+ */
+
+ source = e_mail_config_summary_page_get_account_source (page);
+
+ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
+ if (e_source_has_extension (source, extension_name)) {
+ ESourceAuthentication *extension;
+ extension = e_source_get_extension (source, extension_name);
+ host = e_source_authentication_get_host (extension);
+ }
+
+ if (host == NULL)
+ return FALSE;
+
+ if (e_util_utf8_strstrcase (host, "gmail.com") != NULL)
+ return TRUE;
+
+ if (e_util_utf8_strstrcase (host, "googlemail.com") != NULL)
+ return TRUE;
+
+ return FALSE;
+}
+
+static void
+mail_config_google_summary_refresh_cb (EMailConfigSummaryPage *page,
+ EMailConfigGoogleSummary *extension)
+{
+ extension->priv->applicable =
+ mail_config_google_summary_is_applicable (page);
+
+ g_object_notify (G_OBJECT (extension), "applicable");
+}
+
+static void
+mail_config_google_summary_commit_changes_cb (EMailConfigSummaryPage *page,
+ GQueue *source_queue,
+ EMailConfigGoogleSummary *extension)
+{
+ ESource *source;
+ ESourceCollection *collection_extension;
+ ESourceMailIdentity *identity_extension;
+ GtkToggleButton *toggle_button;
+ GList *head, *link;
+ const gchar *address;
+ const gchar *parent_uid;
+ const gchar *extension_name;
+ gboolean calendar_active;
+ gboolean contacts_active;
+
+ /* If this is not a Google account, do nothing (obviously). */
+ if (!e_mail_config_google_summary_get_applicable (extension))
+ return;
+
+ toggle_button = GTK_TOGGLE_BUTTON (extension->priv->calendar_toggle);
+ calendar_active = gtk_toggle_button_get_active (toggle_button);
+
+ toggle_button = GTK_TOGGLE_BUTTON (extension->priv->contacts_toggle);
+ contacts_active = gtk_toggle_button_get_active (toggle_button);
+
+ /* If the user declined both Calendar and Contacts, do nothing. */
+ if (!calendar_active && !contacts_active)
+ return;
+
+ /* The collection identity is the user's email address. */
+ source = e_mail_config_summary_page_get_identity_source (page);
+ extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
+ identity_extension = e_source_get_extension (source, extension_name);
+ address = e_source_mail_identity_get_address (identity_extension);
+
+ source = extension->priv->collection_source;
+ extension_name = E_SOURCE_EXTENSION_COLLECTION;
+ collection_extension = e_source_get_extension (source, extension_name);
+ e_source_collection_set_identity (collection_extension, address);
+
+ /* All queued sources become children of the collection source. */
+ parent_uid = e_source_get_uid (source);
+ head = g_queue_peek_head_link (source_queue);
+ for (link = head; link != NULL; link = g_list_next (link))
+ e_source_set_parent (E_SOURCE (link->data), parent_uid);
+
+ /* Push this AFTER iterating over the source queue. */
+ g_queue_push_head (source_queue, g_object_ref (source));
+
+ /* The "google-backend" module in E-D-S will handle the rest. */
+}
+
+static void
+mail_config_google_summary_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_APPLICABLE:
+ g_value_set_boolean (
+ value,
+ e_mail_config_google_summary_get_applicable (
+ E_MAIL_CONFIG_GOOGLE_SUMMARY (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_google_summary_dispose (GObject *object)
+{
+ EMailConfigGoogleSummaryPrivate *priv;
+
+ priv = E_MAIL_CONFIG_GOOGLE_SUMMARY_GET_PRIVATE (object);
+
+ if (priv->collection_source != NULL) {
+ g_object_unref (priv->collection_source);
+ priv->collection_source = NULL;
+ }
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (e_mail_config_google_summary_parent_class)->
+ dispose (object);
+}
+
+static void
+mail_config_google_summary_constructed (GObject *object)
+{
+ EMailConfigGoogleSummary *extension;
+ EMailConfigSummaryPage *page;
+ ESourceCollection *collection_extension;
+ ESource *source;
+ GtkWidget *container;
+ GtkWidget *widget;
+ const gchar *extension_name;
+ const gchar *text;
+ gchar *markup;
+
+ extension = E_MAIL_CONFIG_GOOGLE_SUMMARY (object);
+
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (e_mail_config_google_summary_parent_class)->
+ constructed (object);
+
+ page = mail_config_google_summary_get_summary_page (extension);
+
+ /* Use g_signal_connect_after() so the EMailConfigSummaryPage
+ * class methods run first. They make changes to the sources
+ * the we either want to utilize or override. */
+
+ g_signal_connect_after (
+ page, "refresh",
+ G_CALLBACK (mail_config_google_summary_refresh_cb),
+ extension);
+
+ g_signal_connect_after (
+ page, "commit-changes",
+ G_CALLBACK (mail_config_google_summary_commit_changes_cb),
+ extension);
+
+ container = GTK_WIDGET (page);
+
+ widget = gtk_grid_new ();
+ gtk_grid_set_row_spacing (GTK_GRID (widget), 6);
+ gtk_grid_set_column_spacing (GTK_GRID (widget), 6);
+ gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+
+ g_object_bind_property (
+ extension, "applicable",
+ widget, "visible",
+ G_BINDING_SYNC_CREATE);
+
+ container = widget;
+
+ text = _("Google Features");
+ markup = g_markup_printf_escaped ("<b>%s</b>", text);
+ widget = gtk_label_new (markup);
+ gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 0, 1, 1);
+ gtk_widget_show (widget);
+ g_free (markup);
+
+ text = _("Add Google Ca_lendar to this account");
+ widget = gtk_check_button_new_with_mnemonic (text);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 1, 1, 1);
+ extension->priv->calendar_toggle = widget; /* not referenced */
+ gtk_widget_show (widget);
+
+ text = _("Add Google Con_tacts to this account");
+ widget = gtk_check_button_new_with_mnemonic (text);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 2, 1, 1);
+ extension->priv->contacts_toggle = widget; /* not referenced */
+ gtk_widget_show (widget);
+
+ text = _("You may need to enable IMAP access");
+ widget = gtk_link_button_new_with_label (GOOGLE_HELP_URI, text);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 3, 1, 1);
+ gtk_widget_show (widget);
+
+ source = extension->priv->collection_source;
+ extension_name = E_SOURCE_EXTENSION_COLLECTION;
+ collection_extension = e_source_get_extension (source, extension_name);
+
+ g_object_bind_property (
+ page, "account-name",
+ source, "display-name",
+ G_BINDING_SYNC_CREATE);
+
+ g_object_bind_property (
+ extension->priv->calendar_toggle, "active",
+ collection_extension, "calendar-enabled",
+ G_BINDING_SYNC_CREATE);
+
+ g_object_bind_property (
+ extension->priv->contacts_toggle, "active",
+ collection_extension, "contacts-enabled",
+ G_BINDING_SYNC_CREATE);
+}
+
+static void
+e_mail_config_google_summary_class_init (EMailConfigGoogleSummaryClass *class)
+{
+ GObjectClass *object_class;
+ EExtensionClass *extension_class;
+
+ g_type_class_add_private (
+ class, sizeof (EMailConfigGoogleSummaryPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->get_property = mail_config_google_summary_get_property;
+ object_class->dispose = mail_config_google_summary_dispose;
+ object_class->constructed = mail_config_google_summary_constructed;
+
+ extension_class = E_EXTENSION_CLASS (class);
+ extension_class->extensible_type = E_TYPE_MAIL_CONFIG_SUMMARY_PAGE;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_APPLICABLE,
+ g_param_spec_boolean (
+ "applicable",
+ "Applicable",
+ "Whether this extension is applicable "
+ "to the current mail account settings",
+ FALSE,
+ G_PARAM_READABLE));
+}
+
+static void
+e_mail_config_google_summary_class_finalize (EMailConfigGoogleSummaryClass *class)
+{
+}
+
+static void
+e_mail_config_google_summary_init (EMailConfigGoogleSummary *extension)
+{
+ ESource *source;
+ ESourceBackend *backend_extension;
+ const gchar *extension_name;
+
+ extension->priv = E_MAIL_CONFIG_GOOGLE_SUMMARY_GET_PRIVATE (extension);
+
+ source = e_source_new (NULL, NULL, NULL);
+ extension_name = E_SOURCE_EXTENSION_COLLECTION;
+ backend_extension = e_source_get_extension (source, extension_name);
+ e_source_backend_set_backend_name (backend_extension, "google");
+ extension->priv->collection_source = source;
+}
+
+void
+e_mail_config_google_summary_type_register (GTypeModule *type_module)
+{
+ /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
+ * function, so we have to wrap it with a public function in
+ * order to register types from a separate compilation unit. */
+ e_mail_config_google_summary_register_type (type_module);
+}
+
+gboolean
+e_mail_config_google_summary_get_applicable (EMailConfigGoogleSummary *extension)
+{
+ g_return_val_if_fail (
+ E_IS_MAIL_CONFIG_GOOGLE_SUMMARY (extension), FALSE);
+
+ return extension->priv->applicable;
+}
+
diff --git a/modules/mail-config/e-mail-config-yahoo-summary.c b/modules/mail-config/e-mail-config-yahoo-summary.c
new file mode 100644
index 0000000000..c97585d9f8
--- /dev/null
+++ b/modules/mail-config/e-mail-config-yahoo-summary.c
@@ -0,0 +1,349 @@
+/*
+ * e-mail-config-yahoo-summary.c
+ *
+ * This program 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) version 3.
+ *
+ * This program 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 the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#include "e-mail-config-yahoo-summary.h"
+
+#include <config.h>
+#include <glib/gi18n-lib.h>
+
+#include <libedataserver/e-data-server-util.h>
+#include <libedataserver/e-source-authentication.h>
+#include <libedataserver/e-source-collection.h>
+#include <libedataserver/e-source-mail-identity.h>
+
+#include <mail/e-mail-config-summary-page.h>
+
+#define E_MAIL_CONFIG_YAHOO_SUMMARY_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_MAIL_CONFIG_YAHOO_SUMMARY, EMailConfigYahooSummaryPrivate))
+
+struct _EMailConfigYahooSummaryPrivate {
+ ESource *collection_source;
+
+ /* Widgets (not referenced) */
+ GtkWidget *calendar_toggle;
+
+ gboolean applicable;
+};
+
+enum {
+ PROP_0,
+ PROP_APPLICABLE
+};
+
+G_DEFINE_DYNAMIC_TYPE (
+ EMailConfigYahooSummary,
+ e_mail_config_yahoo_summary,
+ E_TYPE_EXTENSION)
+
+static EMailConfigSummaryPage *
+mail_config_yahoo_summary_get_summary_page (EMailConfigYahooSummary *extension)
+{
+ EExtensible *extensible;
+
+ extensible = e_extension_get_extensible (E_EXTENSION (extension));
+
+ return E_MAIL_CONFIG_SUMMARY_PAGE (extensible);
+}
+
+static gboolean
+mail_config_yahoo_summary_is_applicable (EMailConfigSummaryPage *page)
+{
+ ESource *source;
+ const gchar *extension_name;
+ const gchar *host = NULL;
+
+ /* FIXME We should tie this into EMailAutoconfig to avoid
+ * hard-coding Yahoo domain names. Maybe retain the
+ * <emailProvider id="..."> it matched so we can just
+ * check for, in this case, "yahoo.com".
+ *
+ * Source:
+ * http://api.gnome.org/evolution/autoconfig/1.1/yahoo.com
+ */
+
+ source = e_mail_config_summary_page_get_account_source (page);
+
+ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
+ if (e_source_has_extension (source, extension_name)) {
+ ESourceAuthentication *extension;
+ extension = e_source_get_extension (source, extension_name);
+ host = e_source_authentication_get_host (extension);
+ }
+
+ if (host == NULL)
+ return FALSE;
+
+ if (e_util_utf8_strstrcase (host, "yahoo.com") != NULL)
+ return TRUE;
+
+ if (e_util_utf8_strstrcase (host, "ymail.com") != NULL)
+ return TRUE;
+
+ if (e_util_utf8_strstrcase (host, "rocketmail.com") != NULL)
+ return TRUE;
+
+ return FALSE;
+}
+
+static void
+mail_config_yahoo_summary_refresh_cb (EMailConfigSummaryPage *page,
+ EMailConfigYahooSummary *extension)
+{
+ extension->priv->applicable =
+ mail_config_yahoo_summary_is_applicable (page);
+
+ g_object_notify (G_OBJECT (extension), "applicable");
+}
+
+static void
+mail_config_yahoo_summary_commit_changes_cb (EMailConfigSummaryPage *page,
+ GQueue *source_queue,
+ EMailConfigYahooSummary *extension)
+{
+ ESource *source;
+ ESourceCollection *collection_extension;
+ ESourceMailIdentity *identity_extension;
+ GtkToggleButton *toggle_button;
+ GList *head, *link;
+ const gchar *address;
+ const gchar *parent_uid;
+ const gchar *extension_name;
+ gboolean calendar_active;
+
+ /* If this is not a Yahoo! account, do nothing (obviously). */
+ if (!e_mail_config_yahoo_summary_get_applicable (extension))
+ return;
+
+ toggle_button = GTK_TOGGLE_BUTTON (extension->priv->calendar_toggle);
+ calendar_active = gtk_toggle_button_get_active (toggle_button);
+
+ /* If the user declined to add a Calendar, do nothing. */
+ if (!calendar_active)
+ return;
+
+ /* The collection identity is the user's email address. */
+ source = e_mail_config_summary_page_get_identity_source (page);
+ extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
+ identity_extension = e_source_get_extension (source, extension_name);
+ address = e_source_mail_identity_get_address (identity_extension);
+
+ source = extension->priv->collection_source;
+ extension_name = E_SOURCE_EXTENSION_COLLECTION;
+ collection_extension = e_source_get_extension (source, extension_name);
+ e_source_collection_set_identity (collection_extension, address);
+
+ /* All queued sources become children of the collection source. */
+ parent_uid = e_source_get_uid (source);
+ head = g_queue_peek_head_link (source_queue);
+ for (link = head; link != NULL; link = g_list_next (link))
+ e_source_set_parent (E_SOURCE (link->data), parent_uid);
+
+ /* Push this AFTER iterating over the source queue. */
+ g_queue_push_head (source_queue, g_object_ref (source));
+
+ /* The "yahoo-backend" module in E-D-S will handle the rest. */
+}
+
+static void
+mail_config_yahoo_summary_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_APPLICABLE:
+ g_value_set_boolean (
+ value,
+ e_mail_config_yahoo_summary_get_applicable (
+ E_MAIL_CONFIG_YAHOO_SUMMARY (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_yahoo_summary_dispose (GObject *object)
+{
+ EMailConfigYahooSummaryPrivate *priv;
+
+ priv = E_MAIL_CONFIG_YAHOO_SUMMARY_GET_PRIVATE (object);
+
+ if (priv->collection_source != NULL) {
+ g_object_unref (priv->collection_source);
+ priv->collection_source = NULL;
+ }
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (e_mail_config_yahoo_summary_parent_class)->
+ dispose (object);
+}
+
+static void
+mail_config_yahoo_summary_constructed (GObject *object)
+{
+ EMailConfigYahooSummary *extension;
+ EMailConfigSummaryPage *page;
+ ESourceCollection *collection_extension;
+ ESource *source;
+ GtkWidget *container;
+ GtkWidget *widget;
+ const gchar *extension_name;
+ const gchar *text;
+ gchar *markup;
+
+ extension = E_MAIL_CONFIG_YAHOO_SUMMARY (object);
+
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (e_mail_config_yahoo_summary_parent_class)->
+ constructed (object);
+
+ page = mail_config_yahoo_summary_get_summary_page (extension);
+
+ /* Use g_signal_connect_after() so the EMailConfigSummaryPage
+ * class methods run first. They make changes to the sources
+ * that we either want to utilize or override. */
+
+ g_signal_connect_after (
+ page, "refresh",
+ G_CALLBACK (mail_config_yahoo_summary_refresh_cb),
+ extension);
+
+ g_signal_connect_after (
+ page, "commit-changes",
+ G_CALLBACK (mail_config_yahoo_summary_commit_changes_cb),
+ extension);
+
+ container = GTK_WIDGET (page);
+
+ widget = gtk_grid_new ();
+ gtk_grid_set_row_spacing (GTK_GRID (widget), 6);
+ gtk_grid_set_column_spacing (GTK_GRID (widget), 6);
+ gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+
+ g_object_bind_property (
+ extension, "applicable",
+ widget, "visible",
+ G_BINDING_SYNC_CREATE);
+
+ container = widget;
+
+ text = _("Yahoo! Features");
+ markup = g_markup_printf_escaped ("<b>%s</b>", text);
+ widget = gtk_label_new (markup);
+ gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 0, 2, 1);
+ gtk_widget_show (widget);
+ g_free (markup);
+
+ text = _("Add Yahoo! Ca_lendar to this account");
+ widget = gtk_check_button_new_with_mnemonic (text);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
+ gtk_widget_set_margin_left (widget, 12);
+ gtk_grid_attach (GTK_GRID (container), widget, 0, 1, 2, 1);
+ extension->priv->calendar_toggle = widget; /* not referenced */
+ gtk_widget_show (widget);
+
+ source = extension->priv->collection_source;
+ extension_name = E_SOURCE_EXTENSION_COLLECTION;
+ collection_extension = e_source_get_extension (source, extension_name);
+
+ g_object_bind_property (
+ page, "account-name",
+ source, "display-name",
+ G_BINDING_SYNC_CREATE);
+
+ g_object_bind_property (
+ extension->priv->calendar_toggle, "active",
+ collection_extension, "calendar-enabled",
+ G_BINDING_SYNC_CREATE);
+}
+
+static void
+e_mail_config_yahoo_summary_class_init (EMailConfigYahooSummaryClass *class)
+{
+ GObjectClass *object_class;
+ EExtensionClass *extension_class;
+
+ g_type_class_add_private (
+ class, sizeof (EMailConfigYahooSummaryPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->get_property = mail_config_yahoo_summary_get_property;
+ object_class->dispose = mail_config_yahoo_summary_dispose;
+ object_class->constructed = mail_config_yahoo_summary_constructed;
+
+ extension_class = E_EXTENSION_CLASS (class);
+ extension_class->extensible_type = E_TYPE_MAIL_CONFIG_SUMMARY_PAGE;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_APPLICABLE,
+ g_param_spec_boolean (
+ "applicable",
+ "Applicable",
+ "Whether this extension is applicable "
+ "to the current mail account settings",
+ FALSE,
+ G_PARAM_READABLE));
+}
+
+static void
+e_mail_config_yahoo_summary_class_finalize (EMailConfigYahooSummaryClass *class)
+{
+}
+
+static void
+e_mail_config_yahoo_summary_init (EMailConfigYahooSummary *extension)
+{
+ ESource *source;
+ ESourceBackend *backend_extension;
+ const gchar *extension_name;
+
+ extension->priv = E_MAIL_CONFIG_YAHOO_SUMMARY_GET_PRIVATE (extension);
+
+ source = e_source_new (NULL, NULL, NULL);
+ extension_name = E_SOURCE_EXTENSION_COLLECTION;
+ backend_extension = e_source_get_extension (source, extension_name);
+ e_source_backend_set_backend_name (backend_extension, "yahoo");
+ extension->priv->collection_source = source;
+
+ /* XXX No CardDAV support yet, sadly. */
+ e_source_collection_set_contacts_enabled (
+ E_SOURCE_COLLECTION (backend_extension), FALSE);
+}
+
+void
+e_mail_config_yahoo_summary_type_register (GTypeModule *type_module)
+{
+ /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
+ * function, so we have to wrap it with a public function in
+ * order to register types from a separate compilation unit. */
+ e_mail_config_yahoo_summary_register_type (type_module);
+}
+
+gboolean
+e_mail_config_yahoo_summary_get_applicable (EMailConfigYahooSummary *extension)
+{
+ g_return_val_if_fail (
+ E_IS_MAIL_CONFIG_YAHOO_SUMMARY (extension), FALSE);
+
+ return extension->priv->applicable;
+}