Blame src/modules/mail-config/e-mail-config-yahoo-summary.c

Packit Service de44cd
/*
Packit Service de44cd
 * e-mail-config-yahoo-summary.c
Packit Service de44cd
 *
Packit Service de44cd
 * This program is free software; you can redistribute it and/or modify it
Packit Service de44cd
 * under the terms of the GNU Lesser General Public License as published by
Packit Service de44cd
 * the Free Software Foundation.
Packit Service de44cd
 *
Packit Service de44cd
 * This program is distributed in the hope that it will be useful, but
Packit Service de44cd
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit Service de44cd
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit Service de44cd
 * for more details.
Packit Service de44cd
 *
Packit Service de44cd
 * You should have received a copy of the GNU Lesser General Public License
Packit Service de44cd
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service de44cd
 *
Packit Service de44cd
 */
Packit Service de44cd
Packit Service de44cd
#include "evolution-config.h"
Packit Service de44cd
Packit Service de44cd
#include <glib/gi18n-lib.h>
Packit Service de44cd
Packit Service de44cd
#include <mail/e-mail-config-summary-page.h>
Packit Service de44cd
Packit Service de44cd
#include "e-mail-config-yahoo-summary.h"
Packit Service de44cd
Packit Service de44cd
#define E_MAIL_CONFIG_YAHOO_SUMMARY_GET_PRIVATE(obj) \
Packit Service de44cd
	(G_TYPE_INSTANCE_GET_PRIVATE \
Packit Service de44cd
	((obj), E_TYPE_MAIL_CONFIG_YAHOO_SUMMARY, EMailConfigYahooSummaryPrivate))
Packit Service de44cd
Packit Service de44cd
struct _EMailConfigYahooSummaryPrivate {
Packit Service de44cd
	ESource *collection_source;
Packit Service de44cd
Packit Service de44cd
	/* Widgets (not referenced) */
Packit Service de44cd
	GtkWidget *calendar_toggle;
Packit Service de44cd
Packit Service de44cd
	gboolean applicable;
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
enum {
Packit Service de44cd
	PROP_0,
Packit Service de44cd
	PROP_APPLICABLE
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
G_DEFINE_DYNAMIC_TYPE (
Packit Service de44cd
	EMailConfigYahooSummary,
Packit Service de44cd
	e_mail_config_yahoo_summary,
Packit Service de44cd
	E_TYPE_EXTENSION)
Packit Service de44cd
Packit Service de44cd
static EMailConfigSummaryPage *
Packit Service de44cd
mail_config_yahoo_summary_get_summary_page (EMailConfigYahooSummary *extension)
Packit Service de44cd
{
Packit Service de44cd
	EExtensible *extensible;
Packit Service de44cd
Packit Service de44cd
	extensible = e_extension_get_extensible (E_EXTENSION (extension));
Packit Service de44cd
Packit Service de44cd
	return E_MAIL_CONFIG_SUMMARY_PAGE (extensible);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
mail_config_yahoo_summary_is_applicable (EMailConfigSummaryPage *page)
Packit Service de44cd
{
Packit Service de44cd
	ESource *source;
Packit Service de44cd
	const gchar *extension_name;
Packit Service de44cd
	const gchar *host = NULL;
Packit Service de44cd
Packit Service de44cd
	/* FIXME We should tie this into EMailAutoconfig to avoid
Packit Service de44cd
	 *       hard-coding Yahoo domain names.  Maybe retain the
Packit Service de44cd
	 *       <emailProvider id="..."> it matched so we can just
Packit Service de44cd
	 *       check for, in this case, "yahoo.com".
Packit Service de44cd
	 *
Packit Service de44cd
	 *       Source:
Packit Service de44cd
	 *       http://api.gnome.org/evolution/autoconfig/1.1/yahoo.com
Packit Service de44cd
	 */
Packit Service de44cd
Packit Service de44cd
	source = e_mail_config_summary_page_get_account_source (page);
Packit Service de44cd
Packit Service de44cd
	extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
Packit Service de44cd
	if (e_source_has_extension (source, extension_name)) {
Packit Service de44cd
		ESourceAuthentication *extension;
Packit Service de44cd
		extension = e_source_get_extension (source, extension_name);
Packit Service de44cd
		host = e_source_authentication_get_host (extension);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (host == NULL)
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	if (e_util_utf8_strstrcase (host, "yahoo.com") != NULL)
Packit Service de44cd
		return TRUE;
Packit Service de44cd
Packit Service de44cd
	if (e_util_utf8_strstrcase (host, "ymail.com") != NULL)
Packit Service de44cd
		return TRUE;
Packit Service de44cd
Packit Service de44cd
	if (e_util_utf8_strstrcase (host, "rocketmail.com") != NULL)
Packit Service de44cd
		return TRUE;
Packit Service de44cd
Packit Service de44cd
	return FALSE;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
mail_config_yahoo_summary_refresh_cb (EMailConfigSummaryPage *page,
Packit Service de44cd
                                      EMailConfigYahooSummary *extension)
Packit Service de44cd
{
Packit Service de44cd
	extension->priv->applicable =
Packit Service de44cd
		mail_config_yahoo_summary_is_applicable (page);
Packit Service de44cd
Packit Service de44cd
	g_object_notify (G_OBJECT (extension), "applicable");
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
mail_config_yahoo_summary_commit_changes_cb (EMailConfigSummaryPage *page,
Packit Service de44cd
                                             GQueue *source_queue,
Packit Service de44cd
                                             EMailConfigYahooSummary *extension)
Packit Service de44cd
{
Packit Service de44cd
	ESource *source;
Packit Service de44cd
	ESourceCollection *collection_extension;
Packit Service de44cd
	ESourceMailIdentity *identity_extension;
Packit Service de44cd
	ESourceAuthentication *auth_extension;
Packit Service de44cd
	GtkToggleButton *toggle_button;
Packit Service de44cd
	GList *head, *link;
Packit Service de44cd
	const gchar *address;
Packit Service de44cd
	const gchar *parent_uid;
Packit Service de44cd
	const gchar *display_name;
Packit Service de44cd
	const gchar *extension_name;
Packit Service de44cd
	gboolean calendar_active;
Packit Service de44cd
Packit Service de44cd
	/* If this is not a Yahoo! account, do nothing (obviously). */
Packit Service de44cd
	if (!e_mail_config_yahoo_summary_get_applicable (extension))
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	toggle_button = GTK_TOGGLE_BUTTON (extension->priv->calendar_toggle);
Packit Service de44cd
	calendar_active = gtk_toggle_button_get_active (toggle_button);
Packit Service de44cd
Packit Service de44cd
	/* If the user declined to add a Calendar, do nothing. */
Packit Service de44cd
	if (!calendar_active)
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	source = e_mail_config_summary_page_get_identity_source (page);
Packit Service de44cd
	display_name = e_source_get_display_name (source);
Packit Service de44cd
Packit Service de44cd
	/* The collection identity is the user's email address. */
Packit Service de44cd
	extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
Packit Service de44cd
	identity_extension = e_source_get_extension (source, extension_name);
Packit Service de44cd
	address = e_source_mail_identity_get_address (identity_extension);
Packit Service de44cd
Packit Service de44cd
	source = extension->priv->collection_source;
Packit Service de44cd
	e_source_set_display_name (source, display_name);
Packit Service de44cd
Packit Service de44cd
	extension_name = E_SOURCE_EXTENSION_COLLECTION;
Packit Service de44cd
	collection_extension = e_source_get_extension (source, extension_name);
Packit Service de44cd
	e_source_collection_set_identity (collection_extension, address);
Packit Service de44cd
Packit Service de44cd
	/* Always create the Authentication extension, thus the collection source
Packit Service de44cd
	   can be used for the credentials prompt. */
Packit Service de44cd
	auth_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION);
Packit Service de44cd
	e_source_authentication_set_host (auth_extension, "");
Packit Service de44cd
Packit Service de44cd
	/* All queued sources become children of the collection source. */
Packit Service de44cd
	parent_uid = e_source_get_uid (source);
Packit Service de44cd
	head = g_queue_peek_head_link (source_queue);
Packit Service de44cd
	for (link = head; link != NULL; link = g_list_next (link))
Packit Service de44cd
		e_source_set_parent (E_SOURCE (link->data), parent_uid);
Packit Service de44cd
Packit Service de44cd
	/* Push this AFTER iterating over the source queue. */
Packit Service de44cd
	g_queue_push_head (source_queue, g_object_ref (source));
Packit Service de44cd
Packit Service de44cd
	/* The "yahoo-backend" module in E-D-S will handle the rest. */
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
mail_config_yahoo_summary_get_property (GObject *object,
Packit Service de44cd
                                        guint property_id,
Packit Service de44cd
                                        GValue *value,
Packit Service de44cd
                                        GParamSpec *pspec)
Packit Service de44cd
{
Packit Service de44cd
	switch (property_id) {
Packit Service de44cd
		case PROP_APPLICABLE:
Packit Service de44cd
			g_value_set_boolean (
Packit Service de44cd
				value,
Packit Service de44cd
				e_mail_config_yahoo_summary_get_applicable (
Packit Service de44cd
				E_MAIL_CONFIG_YAHOO_SUMMARY (object)));
Packit Service de44cd
			return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
mail_config_yahoo_summary_dispose (GObject *object)
Packit Service de44cd
{
Packit Service de44cd
	EMailConfigYahooSummaryPrivate *priv;
Packit Service de44cd
Packit Service de44cd
	priv = E_MAIL_CONFIG_YAHOO_SUMMARY_GET_PRIVATE (object);
Packit Service de44cd
Packit Service de44cd
	if (priv->collection_source != NULL) {
Packit Service de44cd
		g_object_unref (priv->collection_source);
Packit Service de44cd
		priv->collection_source = NULL;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	/* Chain up to parent's dispose() method. */
Packit Service de44cd
	G_OBJECT_CLASS (e_mail_config_yahoo_summary_parent_class)->
Packit Service de44cd
		dispose (object);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
mail_config_yahoo_summary_constructed (GObject *object)
Packit Service de44cd
{
Packit Service de44cd
	EMailConfigYahooSummary *extension;
Packit Service de44cd
	EMailConfigSummaryPage *page;
Packit Service de44cd
	ESourceCollection *collection_extension;
Packit Service de44cd
	ESource *source;
Packit Service de44cd
	GtkWidget *container;
Packit Service de44cd
	GtkWidget *widget;
Packit Service de44cd
	GtkBox *main_box;
Packit Service de44cd
	const gchar *extension_name;
Packit Service de44cd
	const gchar *text;
Packit Service de44cd
	gchar *markup;
Packit Service de44cd
Packit Service de44cd
	extension = E_MAIL_CONFIG_YAHOO_SUMMARY (object);
Packit Service de44cd
Packit Service de44cd
	/* Chain up to parent's constructed() method. */
Packit Service de44cd
	G_OBJECT_CLASS (e_mail_config_yahoo_summary_parent_class)->constructed (object);
Packit Service de44cd
Packit Service de44cd
	page = mail_config_yahoo_summary_get_summary_page (extension);
Packit Service de44cd
	main_box = e_mail_config_summary_page_get_internal_box (page);
Packit Service de44cd
Packit Service de44cd
	/* Use g_signal_connect_after() so the EMailConfigSummaryPage
Packit Service de44cd
	 * class methods run first.  They make changes to the sources
Packit Service de44cd
	 * that we either want to utilize or override. */
Packit Service de44cd
Packit Service de44cd
	g_signal_connect_after (
Packit Service de44cd
		page, "refresh",
Packit Service de44cd
		G_CALLBACK (mail_config_yahoo_summary_refresh_cb),
Packit Service de44cd
		extension);
Packit Service de44cd
Packit Service de44cd
	g_signal_connect_after (
Packit Service de44cd
		page, "commit-changes",
Packit Service de44cd
		G_CALLBACK (mail_config_yahoo_summary_commit_changes_cb),
Packit Service de44cd
		extension);
Packit Service de44cd
Packit Service de44cd
	widget = gtk_grid_new ();
Packit Service de44cd
	gtk_grid_set_row_spacing (GTK_GRID (widget), 6);
Packit Service de44cd
	gtk_grid_set_column_spacing (GTK_GRID (widget), 6);
Packit Service de44cd
	gtk_box_pack_start (main_box, widget, FALSE, FALSE, 0);
Packit Service de44cd
Packit Service de44cd
	e_binding_bind_property (
Packit Service de44cd
		extension, "applicable",
Packit Service de44cd
		widget, "visible",
Packit Service de44cd
		G_BINDING_SYNC_CREATE);
Packit Service de44cd
Packit Service de44cd
	container = widget;
Packit Service de44cd
Packit Service de44cd
	text = _("Yahoo! Features");
Packit Service de44cd
	markup = g_markup_printf_escaped ("%s", text);
Packit Service de44cd
	widget = gtk_label_new (markup);
Packit Service de44cd
	gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
Packit Service de44cd
	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
Packit Service de44cd
	gtk_grid_attach (GTK_GRID (container), widget, 0, 0, 2, 1);
Packit Service de44cd
	gtk_widget_show (widget);
Packit Service de44cd
	g_free (markup);
Packit Service de44cd
Packit Service de44cd
	text = _("Add Yahoo! Ca_lendar and Tasks to this account");
Packit Service de44cd
	widget = gtk_check_button_new_with_mnemonic (text);
Packit Service de44cd
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
Packit Service de44cd
	gtk_widget_set_margin_left (widget, 12);
Packit Service de44cd
	gtk_grid_attach (GTK_GRID (container), widget, 0, 1, 2, 1);
Packit Service de44cd
	extension->priv->calendar_toggle = widget;  /* not referenced */
Packit Service de44cd
	gtk_widget_show (widget);
Packit Service de44cd
Packit Service de44cd
	source = extension->priv->collection_source;
Packit Service de44cd
	extension_name = E_SOURCE_EXTENSION_COLLECTION;
Packit Service de44cd
	collection_extension = e_source_get_extension (source, extension_name);
Packit Service de44cd
Packit Service de44cd
	/* Can't bind the collection's display name here because
Packit Service de44cd
	 * the Summary Page has no sources yet.  Set the display
Packit Service de44cd
	 * name while committing instead. */
Packit Service de44cd
Packit Service de44cd
	e_binding_bind_property (
Packit Service de44cd
		extension->priv->calendar_toggle, "active",
Packit Service de44cd
		collection_extension, "calendar-enabled",
Packit Service de44cd
		G_BINDING_SYNC_CREATE);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_mail_config_yahoo_summary_class_init (EMailConfigYahooSummaryClass *class)
Packit Service de44cd
{
Packit Service de44cd
	GObjectClass *object_class;
Packit Service de44cd
	EExtensionClass *extension_class;
Packit Service de44cd
Packit Service de44cd
	g_type_class_add_private (
Packit Service de44cd
		class, sizeof (EMailConfigYahooSummaryPrivate));
Packit Service de44cd
Packit Service de44cd
	object_class = G_OBJECT_CLASS (class);
Packit Service de44cd
	object_class->get_property = mail_config_yahoo_summary_get_property;
Packit Service de44cd
	object_class->dispose = mail_config_yahoo_summary_dispose;
Packit Service de44cd
	object_class->constructed = mail_config_yahoo_summary_constructed;
Packit Service de44cd
Packit Service de44cd
	extension_class = E_EXTENSION_CLASS (class);
Packit Service de44cd
	extension_class->extensible_type = E_TYPE_MAIL_CONFIG_SUMMARY_PAGE;
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_APPLICABLE,
Packit Service de44cd
		g_param_spec_boolean (
Packit Service de44cd
			"applicable",
Packit Service de44cd
			"Applicable",
Packit Service de44cd
			"Whether this extension is applicable "
Packit Service de44cd
			"to the current mail account settings",
Packit Service de44cd
			FALSE,
Packit Service de44cd
			G_PARAM_READABLE));
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_mail_config_yahoo_summary_class_finalize (EMailConfigYahooSummaryClass *class)
Packit Service de44cd
{
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_mail_config_yahoo_summary_init (EMailConfigYahooSummary *extension)
Packit Service de44cd
{
Packit Service de44cd
	ESource *source;
Packit Service de44cd
	ESourceBackend *backend_extension;
Packit Service de44cd
	const gchar *extension_name;
Packit Service de44cd
Packit Service de44cd
	extension->priv = E_MAIL_CONFIG_YAHOO_SUMMARY_GET_PRIVATE (extension);
Packit Service de44cd
Packit Service de44cd
	source = e_source_new (NULL, NULL, NULL);
Packit Service de44cd
	extension_name = E_SOURCE_EXTENSION_COLLECTION;
Packit Service de44cd
	backend_extension = e_source_get_extension (source, extension_name);
Packit Service de44cd
	e_source_backend_set_backend_name (backend_extension, "yahoo");
Packit Service de44cd
	extension->priv->collection_source = source;
Packit Service de44cd
Packit Service de44cd
	/* XXX No CardDAV support yet, sadly. */
Packit Service de44cd
	e_source_collection_set_contacts_enabled (
Packit Service de44cd
		E_SOURCE_COLLECTION (backend_extension), FALSE);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_mail_config_yahoo_summary_type_register (GTypeModule *type_module)
Packit Service de44cd
{
Packit Service de44cd
	/* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
Packit Service de44cd
	 *     function, so we have to wrap it with a public function in
Packit Service de44cd
	 *     order to register types from a separate compilation unit. */
Packit Service de44cd
	e_mail_config_yahoo_summary_register_type (type_module);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
gboolean
Packit Service de44cd
e_mail_config_yahoo_summary_get_applicable (EMailConfigYahooSummary *extension)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (
Packit Service de44cd
		E_IS_MAIL_CONFIG_YAHOO_SUMMARY (extension), FALSE);
Packit Service de44cd
Packit Service de44cd
	return extension->priv->applicable;
Packit Service de44cd
}