From bfa9ece0091f86870de99b6062d18d81ab2fcd5e Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Fri, 20 Jun 2014 11:20:24 +0200 Subject: Bug 652132 - Google Tasks support --- modules/cal-config-google/Makefile.am | 7 +- modules/cal-config-google/e-cal-config-google.c | 187 +++++++++++++++++++ modules/cal-config-google/e-cal-config-gtasks.c | 146 +++++++++++++++ .../evolution-cal-config-google.c | 198 --------------------- .../cal-config-google/module-cal-config-google.c | 45 +++++ .../cal-config-google/module-cal-config-google.h | 25 +++ 6 files changed, 408 insertions(+), 200 deletions(-) create mode 100644 modules/cal-config-google/e-cal-config-google.c create mode 100644 modules/cal-config-google/e-cal-config-gtasks.c delete mode 100644 modules/cal-config-google/evolution-cal-config-google.c create mode 100644 modules/cal-config-google/module-cal-config-google.c create mode 100644 modules/cal-config-google/module-cal-config-google.h (limited to 'modules') diff --git a/modules/cal-config-google/Makefile.am b/modules/cal-config-google/Makefile.am index 2f1a3defd6..bb83eb620c 100644 --- a/modules/cal-config-google/Makefile.am +++ b/modules/cal-config-google/Makefile.am @@ -11,13 +11,16 @@ module_cal_config_google_la_CPPFLAGS = \ $(NULL) module_cal_config_google_la_SOURCES = \ - evolution-cal-config-google.c \ + e-cal-config-google.c \ + e-cal-config-gtasks.c \ e-google-chooser-button.c \ e-google-chooser-button.h \ e-google-chooser-dialog.c \ e-google-chooser-dialog.h \ e-google-chooser.c \ - e-google-chooser.h + e-google-chooser.h \ + module-cal-config-google.c \ + module-cal-config-google.h module_cal_config_google_la_LIBADD = \ $(top_builddir)/e-util/libevolution-util.la \ diff --git a/modules/cal-config-google/e-cal-config-google.c b/modules/cal-config-google/e-cal-config-google.c new file mode 100644 index 0000000000..9cba60b0b3 --- /dev/null +++ b/modules/cal-config-google/e-cal-config-google.c @@ -0,0 +1,187 @@ +/* + * e-cal-config-google.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. + * + * 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 General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +#include + +#include + +#include "e-google-chooser-button.h" +#include "e-google-chooser-dialog.h" +#include "module-cal-config-google.h" + +typedef ESourceConfigBackend ECalConfigGoogle; +typedef ESourceConfigBackendClass ECalConfigGoogleClass; + +typedef struct _Context Context; + +struct _Context { + GtkWidget *google_button; +}; + +/* Forward Declarations */ +GType e_cal_config_google_get_type (void); + +G_DEFINE_DYNAMIC_TYPE ( + ECalConfigGoogle, + e_cal_config_google, + E_TYPE_SOURCE_CONFIG_BACKEND) + +static void +cal_config_google_context_free (Context *context) +{ + g_object_unref (context->google_button); + + g_slice_free (Context, context); +} + +static gboolean +cal_config_google_allow_creation (ESourceConfigBackend *backend) +{ + ESourceConfig *config; + ECalClientSourceType source_type; + + config = e_source_config_backend_get_config (backend); + + source_type = e_cal_source_config_get_source_type ( + E_CAL_SOURCE_CONFIG (config)); + + /* XXX Google's CalDAV interface doesn't support tasks. */ + return (source_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS); +} + +static void +cal_config_google_insert_widgets (ESourceConfigBackend *backend, + ESource *scratch_source) +{ + ESourceConfig *config; + GtkWidget *widget; + Context *context; + const gchar *uid; + + context = g_slice_new0 (Context); + uid = e_source_get_uid (scratch_source); + config = e_source_config_backend_get_config (backend); + + g_object_set_data_full ( + G_OBJECT (backend), uid, context, + (GDestroyNotify) cal_config_google_context_free); + + e_cal_source_config_add_offline_toggle ( + E_CAL_SOURCE_CONFIG (config), scratch_source); + + e_source_config_add_user_entry (config, scratch_source); + + widget = e_google_chooser_button_new (scratch_source); + e_source_config_insert_widget ( + config, scratch_source, _("Calendar:"), widget); + context->google_button = g_object_ref (widget); + gtk_widget_show (widget); + + e_source_config_add_refresh_interval (config, scratch_source); +} + +static void +cal_config_google_commit_changes (ESourceConfigBackend *backend, + ESource *scratch_source) +{ + ESourceBackend *calendar_extension; + ESourceWebdav *webdav_extension; + SoupURI *soup_uri; + + /* We need to hard-code a few settings. */ + + calendar_extension = e_source_get_extension ( + scratch_source, E_SOURCE_EXTENSION_CALENDAR); + + webdav_extension = e_source_get_extension ( + scratch_source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); + + /* The backend name is actually "caldav" even though the + * ESource is a child of the built-in "Google" source. */ + e_source_backend_set_backend_name (calendar_extension, "caldav"); + + soup_uri = e_source_webdav_dup_soup_uri (webdav_extension); + + if (!soup_uri->path || !*soup_uri->path || g_strcmp0 (soup_uri->path, "/") == 0) { + ESourceAuthentication *authentication_extension + = e_source_get_extension (scratch_source, E_SOURCE_EXTENSION_AUTHENTICATION); + + e_google_chooser_construct_default_uri ( + soup_uri, + e_source_authentication_get_user (authentication_extension)); + } + + /* The host name is fixed, obviously. */ + soup_uri_set_host (soup_uri, "www.google.com"); + + /* Google's CalDAV interface requires a secure connection. */ + soup_uri_set_scheme (soup_uri, SOUP_URI_SCHEME_HTTPS); + + e_source_webdav_set_soup_uri (webdav_extension, soup_uri); + + soup_uri_free (soup_uri); +} + +static gboolean +cal_config_google_check_complete (ESourceConfigBackend *backend, + ESource *scratch_source) +{ + ESourceAuthentication *extension; + const gchar *extension_name; + const gchar *user; + + extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; + extension = e_source_get_extension (scratch_source, extension_name); + user = e_source_authentication_get_user (extension); + + return (user != NULL); +} + +static void +e_cal_config_google_class_init (ESourceConfigBackendClass *class) +{ + EExtensionClass *extension_class; + + extension_class = E_EXTENSION_CLASS (class); + extension_class->extensible_type = E_TYPE_CAL_SOURCE_CONFIG; + + class->parent_uid = "google-stub"; + class->backend_name = "google"; + class->allow_creation = cal_config_google_allow_creation; + class->insert_widgets = cal_config_google_insert_widgets; + class->check_complete = cal_config_google_check_complete; + class->commit_changes = cal_config_google_commit_changes; +} + +static void +e_cal_config_google_class_finalize (ESourceConfigBackendClass *class) +{ +} + +static void +e_cal_config_google_init (ESourceConfigBackend *backend) +{ +} + +void +e_cal_config_google_type_register (GTypeModule *type_module) +{ + e_cal_config_google_register_type (type_module); +} diff --git a/modules/cal-config-google/e-cal-config-gtasks.c b/modules/cal-config-google/e-cal-config-gtasks.c new file mode 100644 index 0000000000..5de0d17f9f --- /dev/null +++ b/modules/cal-config-google/e-cal-config-gtasks.c @@ -0,0 +1,146 @@ +/* + * 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. + * + * 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 General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, see . + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#include + +#include "module-cal-config-google.h" + +typedef ESourceConfigBackend ECalConfigGTasks; +typedef ESourceConfigBackendClass ECalConfigGTasksClass; + +/* Forward Declarations */ +GType e_cal_config_gtasks_get_type (void); + +G_DEFINE_DYNAMIC_TYPE ( + ECalConfigGTasks, + e_cal_config_gtasks, + E_TYPE_SOURCE_CONFIG_BACKEND) + +static gboolean +cal_config_gtasks_allow_creation (ESourceConfigBackend *backend) +{ + ESourceConfig *config; + ESourceTaskList *task_list; + ESource *source; + + g_return_val_if_fail (E_IS_SOURCE_CONFIG_BACKEND (backend), FALSE); + + config = e_source_config_backend_get_config (backend); + + if (e_cal_source_config_get_source_type (E_CAL_SOURCE_CONFIG (config)) != E_CAL_CLIENT_SOURCE_TYPE_TASKS) + return FALSE; + + source = e_source_config_get_original_source (config); + if (!source || !e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST)) + return FALSE; + + task_list = e_source_get_extension (source, E_SOURCE_EXTENSION_TASK_LIST); + return g_strcmp0 (E_SOURCE_CONFIG_BACKEND_GET_CLASS (backend)->backend_name, + e_source_backend_get_backend_name (E_SOURCE_BACKEND (task_list))) == 0; +} + +static void +cal_config_gtasks_insert_widgets (ESourceConfigBackend *backend, + ESource *scratch_source) +{ + ESourceConfig *config; + + config = e_source_config_backend_get_config (backend); + + e_source_config_add_user_entry (config, scratch_source); + e_source_config_add_refresh_interval (config, scratch_source); +} + +static gboolean +cal_config_gtasks_check_complete (ESourceConfigBackend *backend, + ESource *scratch_source) +{ + ESourceAuthentication *extension; + const gchar *extension_name; + const gchar *user; + + extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; + extension = e_source_get_extension (scratch_source, extension_name); + user = e_source_authentication_get_user (extension); + + return user && *user; +} + +static void +cal_config_gtasks_commit_changes (ESourceConfigBackend *backend, + ESource *scratch_source) +{ + ESourceAuthentication *extension; + const gchar *extension_name; + const gchar *user; + + extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; + extension = e_source_get_extension (scratch_source, extension_name); + + e_source_authentication_set_host (extension, "www.google.com"); + e_source_authentication_set_method (extension, "OAuth2"); + + user = e_source_authentication_get_user (extension); + g_return_if_fail (user != NULL); + + /* A user name without a domain implies '@gmail.com'. */ + if (strchr (user, '@') == NULL) { + gchar *full_user; + + full_user = g_strconcat (user, "@gmail.com", NULL); + e_source_authentication_set_user (extension, full_user); + g_free (full_user); + } +} + +static void +e_cal_config_gtasks_class_init (ESourceConfigBackendClass *class) +{ + EExtensionClass *extension_class; + + extension_class = E_EXTENSION_CLASS (class); + extension_class->extensible_type = E_TYPE_CAL_SOURCE_CONFIG; + + class->parent_uid = "google-stub"; + class->backend_name = "gtasks"; + class->allow_creation = cal_config_gtasks_allow_creation; + class->insert_widgets = cal_config_gtasks_insert_widgets; + class->check_complete = cal_config_gtasks_check_complete; + class->commit_changes = cal_config_gtasks_commit_changes; +} + +static void +e_cal_config_gtasks_class_finalize (ESourceConfigBackendClass *class) +{ +} + +static void +e_cal_config_gtasks_init (ESourceConfigBackend *backend) +{ +} + +void +e_cal_config_gtasks_type_register (GTypeModule *type_module) +{ + e_cal_config_gtasks_register_type (type_module); +} diff --git a/modules/cal-config-google/evolution-cal-config-google.c b/modules/cal-config-google/evolution-cal-config-google.c deleted file mode 100644 index 57c8ee095a..0000000000 --- a/modules/cal-config-google/evolution-cal-config-google.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * evolution-cal-config-google.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. - * - * 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 General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, see . - * - */ - -#include -#include - -#include - -#include - -#include "e-google-chooser-button.h" -#include "e-google-chooser-dialog.h" - -typedef ESourceConfigBackend ECalConfigGoogle; -typedef ESourceConfigBackendClass ECalConfigGoogleClass; - -typedef struct _Context Context; - -struct _Context { - GtkWidget *google_button; -}; - -/* Module Entry Points */ -void e_module_load (GTypeModule *type_module); -void e_module_unload (GTypeModule *type_module); - -/* Forward Declarations */ -GType e_cal_config_google_get_type (void); - -G_DEFINE_DYNAMIC_TYPE ( - ECalConfigGoogle, - e_cal_config_google, - E_TYPE_SOURCE_CONFIG_BACKEND) - -static void -cal_config_google_context_free (Context *context) -{ - g_object_unref (context->google_button); - - g_slice_free (Context, context); -} - -static gboolean -cal_config_google_allow_creation (ESourceConfigBackend *backend) -{ - ESourceConfig *config; - ECalClientSourceType source_type; - - config = e_source_config_backend_get_config (backend); - - source_type = e_cal_source_config_get_source_type ( - E_CAL_SOURCE_CONFIG (config)); - - /* XXX Google's CalDAV interface doesn't support tasks. */ - return (source_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS); -} - -static void -cal_config_google_insert_widgets (ESourceConfigBackend *backend, - ESource *scratch_source) -{ - ESourceConfig *config; - GtkWidget *widget; - Context *context; - const gchar *uid; - - context = g_slice_new0 (Context); - uid = e_source_get_uid (scratch_source); - config = e_source_config_backend_get_config (backend); - - g_object_set_data_full ( - G_OBJECT (backend), uid, context, - (GDestroyNotify) cal_config_google_context_free); - - e_cal_source_config_add_offline_toggle ( - E_CAL_SOURCE_CONFIG (config), scratch_source); - - e_source_config_add_user_entry (config, scratch_source); - - widget = e_google_chooser_button_new (scratch_source); - e_source_config_insert_widget ( - config, scratch_source, _("Calendar:"), widget); - context->google_button = g_object_ref (widget); - gtk_widget_show (widget); - - e_source_config_add_refresh_interval (config, scratch_source); -} - -static void -cal_config_google_commit_changes (ESourceConfigBackend *backend, - ESource *scratch_source) -{ - ESourceBackend *calendar_extension; - ESourceWebdav *webdav_extension; - SoupURI *soup_uri; - - /* We need to hard-code a few settings. */ - - calendar_extension = e_source_get_extension ( - scratch_source, E_SOURCE_EXTENSION_CALENDAR); - - webdav_extension = e_source_get_extension ( - scratch_source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); - - /* The backend name is actually "caldav" even though the - * ESource is a child of the built-in "Google" source. */ - e_source_backend_set_backend_name (calendar_extension, "caldav"); - - soup_uri = e_source_webdav_dup_soup_uri (webdav_extension); - - if (!soup_uri->path || !*soup_uri->path || g_strcmp0 (soup_uri->path, "/") == 0) { - ESourceAuthentication *authentication_extension - = e_source_get_extension (scratch_source, E_SOURCE_EXTENSION_AUTHENTICATION); - - e_google_chooser_construct_default_uri ( - soup_uri, - e_source_authentication_get_user (authentication_extension)); - } - - /* The host name is fixed, obviously. */ - soup_uri_set_host (soup_uri, "www.google.com"); - - /* Google's CalDAV interface requires a secure connection. */ - soup_uri_set_scheme (soup_uri, SOUP_URI_SCHEME_HTTPS); - - e_source_webdav_set_soup_uri (webdav_extension, soup_uri); - - soup_uri_free (soup_uri); -} - -static gboolean -cal_config_google_check_complete (ESourceConfigBackend *backend, - ESource *scratch_source) -{ - ESourceAuthentication *extension; - const gchar *extension_name; - const gchar *user; - - extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; - extension = e_source_get_extension (scratch_source, extension_name); - user = e_source_authentication_get_user (extension); - - return (user != NULL); -} - -static void -e_cal_config_google_class_init (ESourceConfigBackendClass *class) -{ - EExtensionClass *extension_class; - - extension_class = E_EXTENSION_CLASS (class); - extension_class->extensible_type = E_TYPE_CAL_SOURCE_CONFIG; - - class->parent_uid = "google-stub"; - class->backend_name = "google"; - class->allow_creation = cal_config_google_allow_creation; - class->insert_widgets = cal_config_google_insert_widgets; - class->check_complete = cal_config_google_check_complete; - class->commit_changes = cal_config_google_commit_changes; -} - -static void -e_cal_config_google_class_finalize (ESourceConfigBackendClass *class) -{ -} - -static void -e_cal_config_google_init (ESourceConfigBackend *backend) -{ -} - -G_MODULE_EXPORT void -e_module_load (GTypeModule *type_module) -{ - e_google_chooser_type_register (type_module); - e_google_chooser_button_type_register (type_module); - e_google_chooser_dialog_type_register (type_module); - e_cal_config_google_register_type (type_module); -} - -G_MODULE_EXPORT void -e_module_unload (GTypeModule *type_module) -{ -} diff --git a/modules/cal-config-google/module-cal-config-google.c b/modules/cal-config-google/module-cal-config-google.c new file mode 100644 index 0000000000..94dc549653 --- /dev/null +++ b/modules/cal-config-google/module-cal-config-google.c @@ -0,0 +1,45 @@ +/* + * 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. + * + * 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 General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, see . + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "e-google-chooser-button.h" +#include "e-google-chooser-dialog.h" +#include "module-cal-config-google.h" + +/* Module Entry Points */ +void e_module_load (GTypeModule *type_module); +void e_module_unload (GTypeModule *type_module); + +G_MODULE_EXPORT void +e_module_load (GTypeModule *type_module) +{ + e_google_chooser_type_register (type_module); + e_google_chooser_button_type_register (type_module); + e_google_chooser_dialog_type_register (type_module); + e_cal_config_google_type_register (type_module); +#ifdef HAVE_GDATA_0_15_1 + e_cal_config_gtasks_type_register (type_module); +#endif +} + +G_MODULE_EXPORT void +e_module_unload (GTypeModule *type_module) +{ +} diff --git a/modules/cal-config-google/module-cal-config-google.h b/modules/cal-config-google/module-cal-config-google.h new file mode 100644 index 0000000000..89dc1c154d --- /dev/null +++ b/modules/cal-config-google/module-cal-config-google.h @@ -0,0 +1,25 @@ +/* + * 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. + * + * 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 General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, see . + * + */ + +#ifndef MODULE_CAL_CONFIG_GOOGLE_H +#define MODULE_CAL_CONFIG_GOOGLE_H + +#include +#include + +void e_cal_config_google_type_register (GTypeModule *type_module); +void e_cal_config_gtasks_type_register (GTypeModule *type_module); + +#endif /* MODULE_CAL_CONFIG_GOOGLE_H */ -- cgit v1.2.3