diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2009-04-25 22:07:44 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2009-04-25 22:07:44 +0800 |
commit | 86fdd3a1cba7c156cfa127322e258f5636b45a99 (patch) | |
tree | e49802fd9008a59587fca1cafb1801b8b3bf0db6 /plugins/publish-calendar | |
parent | c2119e513bc7482fc0150287af8502a5ff67191a (diff) | |
parent | 23df769955ea54f756a579c19964df87ae6fd5c8 (diff) | |
download | gsoc2013-evolution-86fdd3a1cba7c156cfa127322e258f5636b45a99.tar gsoc2013-evolution-86fdd3a1cba7c156cfa127322e258f5636b45a99.tar.gz gsoc2013-evolution-86fdd3a1cba7c156cfa127322e258f5636b45a99.tar.bz2 gsoc2013-evolution-86fdd3a1cba7c156cfa127322e258f5636b45a99.tar.lz gsoc2013-evolution-86fdd3a1cba7c156cfa127322e258f5636b45a99.tar.xz gsoc2013-evolution-86fdd3a1cba7c156cfa127322e258f5636b45a99.tar.zst gsoc2013-evolution-86fdd3a1cba7c156cfa127322e258f5636b45a99.zip |
Merge branch 'master' into kill-bonobo
This was a particularly messy merge. Watch out for regressions!
Conflicts:
ChangeLog
NEWS
a11y/ChangeLog
a11y/widgets/ea-combo-button.c
a11y/widgets/ea-combo-button.h
a11y/widgets/ea-widgets.c
addressbook/ChangeLog
addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in
addressbook/gui/component/addressbook-component.c
addressbook/gui/component/addressbook-component.h
addressbook/gui/component/addressbook-config.c
addressbook/gui/component/addressbook-migrate.h
addressbook/gui/component/addressbook-view.c
addressbook/gui/component/addressbook-view.h
addressbook/gui/component/addressbook.h
addressbook/gui/component/autocompletion-config.c
addressbook/gui/component/autocompletion-config.h
addressbook/gui/component/component-factory.c
addressbook/gui/component/e-book-shell-module-migrate.c
addressbook/gui/component/ldap-config.glade
addressbook/gui/contact-editor/Makefile.am
addressbook/gui/contact-editor/contact-editor.glade
addressbook/gui/contact-editor/e-contact-editor-address.c
addressbook/gui/contact-editor/e-contact-editor-address.h
addressbook/gui/contact-editor/e-contact-editor-im.c
addressbook/gui/contact-editor/e-contact-editor-im.h
addressbook/gui/contact-editor/e-contact-editor.c
addressbook/gui/contact-editor/e-contact-editor.h
addressbook/gui/contact-editor/eab-editor.c
addressbook/gui/contact-editor/eab-editor.h
addressbook/gui/contact-editor/test-editor.c
addressbook/gui/contact-list-editor/Makefile.am
addressbook/gui/widgets/Makefile.am
addressbook/gui/widgets/e-addressbook-model.c
addressbook/gui/widgets/e-addressbook-model.h
addressbook/gui/widgets/e-addressbook-reflow-adapter.c
addressbook/gui/widgets/e-addressbook-view.c
addressbook/gui/widgets/e-addressbook-view.h
addressbook/gui/widgets/e-minicard-view.c
addressbook/gui/widgets/eab-contact-display.c
addressbook/gui/widgets/eab-gui-util.c
addressbook/gui/widgets/eab-menu.c
addressbook/gui/widgets/eab-menu.h
addressbook/gui/widgets/eab-popup-control.c
addressbook/gui/widgets/eab-popup-control.h
addressbook/gui/widgets/eab-popup.c
addressbook/gui/widgets/eab-popup.h
addressbook/gui/widgets/eab-vcard-control.c
addressbook/gui/widgets/eab-vcard-control.h
addressbook/gui/widgets/gal-view-minicard.c
addressbook/gui/widgets/gal-view-minicard.h
addressbook/printing/e-contact-print-style-editor.c
addressbook/printing/e-contact-print-style-editor.h
addressbook/printing/e-contact-print.glade
addressbook/printing/test-contact-print-style-editor.c
addressbook/tools/evolution-addressbook-export.c
addressbook/util/Makefile.am
calendar/ChangeLog
calendar/gui/Makefile.am
calendar/gui/apps_evolution_calendar.schemas.in
calendar/gui/calendar-component.c
calendar/gui/calendar-component.h
calendar/gui/calendar-config.c
calendar/gui/comp-editor-factory.c
calendar/gui/comp-editor-factory.h
calendar/gui/comp-util.c
calendar/gui/comp-util.h
calendar/gui/control-factory.c
calendar/gui/control-factory.h
calendar/gui/dialogs/alarm-dialog.c
calendar/gui/dialogs/cal-prefs-dialog.c
calendar/gui/dialogs/cal-prefs-dialog.glade
calendar/gui/dialogs/cal-prefs-dialog.h
calendar/gui/dialogs/comp-editor.c
calendar/gui/dialogs/comp-editor.h
calendar/gui/dialogs/event-editor.c
calendar/gui/dialogs/event-page.c
calendar/gui/dialogs/memo-editor.c
calendar/gui/dialogs/memo-page.c
calendar/gui/dialogs/recurrence-page.c
calendar/gui/dialogs/task-details-page.c
calendar/gui/dialogs/task-details-page.glade
calendar/gui/dialogs/task-editor.c
calendar/gui/dialogs/task-page.c
calendar/gui/e-cal-component-memo-preview.c
calendar/gui/e-cal-component-memo-preview.h
calendar/gui/e-cal-component-preview.c
calendar/gui/e-cal-component-preview.h
calendar/gui/e-cal-event.h
calendar/gui/e-cal-model.c
calendar/gui/e-cal-popup.c
calendar/gui/e-calendar-table.c
calendar/gui/e-calendar-view.c
calendar/gui/e-day-view.c
calendar/gui/e-itip-control.c
calendar/gui/e-memo-table.c
calendar/gui/e-memos.c
calendar/gui/e-memos.h
calendar/gui/e-tasks.c
calendar/gui/e-tasks.h
calendar/gui/e-week-view.c
calendar/gui/gnome-cal.c
calendar/gui/goto.c
calendar/gui/itip-bonobo-control.c
calendar/gui/itip-bonobo-control.h
calendar/gui/itip-utils.c
calendar/gui/itip-utils.h
calendar/gui/main.c
calendar/gui/memos-component.c
calendar/gui/memos-control.c
calendar/gui/memos-control.h
calendar/gui/migration.c
calendar/gui/migration.h
calendar/gui/tasks-component.c
calendar/gui/tasks-control.c
calendar/importers/main.c
composer/ChangeLog
composer/e-composer-actions.c
composer/e-composer-private.c
composer/e-msg-composer.c
composer/e-msg-composer.h
composer/evolution-composer.ui
configure.in
doc/reference/shell/eshell-overrides.txt
e-util/ChangeLog
e-util/Makefile.am
e-util/e-corba-utils.c
e-util/e-corba-utils.h
e-util/e-gui-utils.c
e-util/e-gui-utils.h
e-util/e-logger.c
e-util/e-non-intrusive-error-dialog.c
e-util/e-non-intrusive-error-dialog.h
e-util/e-plugin-ui.c
e-util/e-util-labels.c
e-util/e-util-labels.h
e-util/e-util.c
e-util/e-util.h
filter/ChangeLog
filter/filter-option.c
help/C/evolution.xml
help/ChangeLog
help/Makefile.am
help/cs/cs.po
help/de/de.po
help/es/es.po
help/eu/figures/Screenshot-Free-Busy.png
help/eu/figures/evo_blink.png
help/eu/figures/evo_dialog-info.png
help/eu/figures/evo_dialog-warning.png
help/eu/figures/evo_email_a.png
help/eu/figures/evo_flag_follow_up_a.png
help/eu/figures/evo_proxyadd_a.png
help/eu/figures/evo_shd_memo_a.png
help/eu/figures/exchange-delegation.png
help/eu/figures/exchange-identity.png
help/eu/figures/exchange-receive-options.png
help/eu/figures/exchange-receive.png
help/eu/figures/exchg-identity.png
help/eu/figures/exchng-identity.png
help/eu/figures/exchng-rec-mail.png
help/eu/figures/exchng-rec-option.png
help/eu/figures/exchng-rec-options.png
help/eu/figures/free_busy.png
help/eu/figures/full-1.png
help/eu/figures/full-2.png
help/eu/figures/full-3.png
help/eu/figures/full-4.png
help/eu/figures/full-5.png
help/eu/figures/full-6.png
help/eu/figures/full-7.png
help/eu/figures/mail-druid-pic.png
help/eu/figures/mail-inbox.png
help/eu/figures/mail-threaded.png
help/eu/figures/mainwindow-pic.png
help/eu/figures/minus.png
help/eu/figures/plus.png
help/eu/figures/proxy-cal.png
help/eu/figures/proxy-login.png
help/eu/figures/schedule.png
help/eu/figures/stock_search.png
help/eu/figures/sub-others-folder.png
help/eu/figures/sub-pub-fold.png
help/eu/figures/vfolder-createrule-fig.png
help/quickref/Makefile.am
mail/ChangeLog
mail/Makefile.am
mail/default/Makefile.am
mail/e-mail-shell-module-migrate.c
mail/e-searching-tokenizer.c
mail/em-account-editor.c
mail/em-account-prefs.h
mail/em-composer-prefs.c
mail/em-composer-prefs.h
mail/em-composer-utils.c
mail/em-filter-folder-element.c
mail/em-folder-browser.c
mail/em-folder-selection-button.h
mail/em-folder-selector.c
mail/em-folder-tree-model.c
mail/em-folder-tree-model.h
mail/em-folder-tree.c
mail/em-folder-tree.h
mail/em-folder-utils.c
mail/em-folder-utils.h
mail/em-folder-view.c
mail/em-format-html-display.c
mail/em-format-html-print.c
mail/em-format-html-print.h
mail/em-format-html.c
mail/em-format-quote.h
mail/em-format.c
mail/em-format.h
mail/em-html-stream.h
mail/em-mailer-prefs.c
mail/em-mailer-prefs.h
mail/em-message-browser.c
mail/em-message-browser.h
mail/em-migrate.h
mail/em-network-prefs.h
mail/em-popup.c
mail/em-search-context.h
mail/em-subscribe-editor.c
mail/em-utils.c
mail/em-utils.h
mail/filtertypes.xml
mail/mail-component-factory.c
mail/mail-component.c
mail/mail-config-factory.c
mail/mail-config-factory.h
mail/mail-config.c
mail/mail-config.glade
mail/mail-crypto.c
mail/mail-crypto.h
mail/mail-dialogs.glade
mail/mail-folder-cache.c
mail/mail-mt.c
mail/mail-send-recv.c
mail/mail-send-recv.h
mail/mail-session.c
mail/mail-session.h
mail/mail-types.h
mail/mail-vfolder.c
mail/message-list.c
mail/message-tag-followup.c
mail/searchtypes.xml
mail/vfoldertypes.xml
plugins/attachment-reminder/Makefile.am
plugins/audio-inline/org-gnome-audio-inline.eplug.xml
plugins/caldav/ChangeLog
plugins/caldav/caldav-source.c
plugins/calendar-http/ChangeLog
plugins/calendar-weather/ChangeLog
plugins/calendar-weather/calendar-weather.c
plugins/email-custom-header/ChangeLog
plugins/email-custom-header/email-custom-header.c
plugins/exchange-operations/ChangeLog
plugins/google-account-setup/ChangeLog
plugins/google-account-setup/Makefile.am
plugins/google-account-setup/google-contacts-source.c
plugins/google-account-setup/google-source.c
plugins/import-ics-attachments/ChangeLog
plugins/import-ics-attachments/Makefile.am
plugins/import-ics-attachments/icsimporter.c
plugins/itip-formatter/ChangeLog
plugins/itip-formatter/itip-view.c
plugins/mail-account-disable/ChangeLog
plugins/mail-account-disable/mail-account-disable.c
plugins/mail-notification/ChangeLog
plugins/mail-notification/mail-notification.c
plugins/mail-to-meeting/ChangeLog
plugins/mail-to-task/ChangeLog
plugins/mark-all-read/mark-all-read.c
plugins/publish-calendar/ChangeLog
plugins/publish-calendar/publish-format-fb.c
plugins/publish-calendar/publish-format-ical.c
plugins/save-attachments/ChangeLog
plugins/save-attachments/Makefile.am
plugins/save-attachments/save-attachments.c
plugins/select-one-source/ChangeLog
plugins/select-one-source/Makefile.am
plugins/select-one-source/select-one-source.c
plugins/startup-wizard/ChangeLog
plugins/startup-wizard/startup-wizard.c
plugins/webdav-account-setup/ChangeLog
plugins/webdav-account-setup/Makefile.am
plugins/webdav-account-setup/webdav-contacts-source.c
po/ChangeLog
po/POTFILES.in
po/ar.po
po/bg.po
po/bn_IN.po
po/ca.po
po/cs.po
po/da.po
po/de.po
po/el.po
po/en_GB.po
po/es.po
po/et.po
po/fr.po
po/gl.po
po/gu.po
po/hi.po
po/hu.po
po/it.po
po/ja.po
po/kn.po
po/ko.po
po/lt.po
po/ml.po
po/mr.po
po/nb.po
po/nl.po
po/pa.po
po/pl.po
po/pt.po
po/ru.po
po/sl.po
po/sr.po
po/sr@latin.po
po/sv.po
po/ta.po
po/te.po
po/th.po
po/tr.po
po/zh_HK.po
po/zh_TW.po
shell/ChangeLog
shell/Evolution-Component.idl
shell/Makefile.am
shell/apps_evolution_shell.schemas.in
shell/e-component-registry.c
shell/e-component-registry.h
shell/e-component-view.c
shell/e-component-view.h
shell/e-corba-config-page.c
shell/e-corba-config-page.h
shell/e-shell-constants.h
shell/e-shell-importer.c
shell/e-shell-importer.h
shell/e-shell-nm.c
shell/e-shell-settings-dialog.c
shell/e-shell-settings-dialog.h
shell/e-shell-view.c
shell/e-shell-view.h
shell/e-shell-window-commands.c
shell/e-shell-window-commands.h
shell/e-shell-window.c
shell/e-shell-window.h
shell/e-shell.c
shell/e-shell.h
shell/e-sidebar.c
shell/e-sidebar.h
shell/e-user-creatable-items-handler.c
shell/e-user-creatable-items-handler.h
shell/es-menu.c
shell/es-menu.h
shell/evolution-component.c
shell/evolution-component.h
shell/evolution-config-control.c
shell/evolution-config-control.h
shell/evolution-listener.c
shell/evolution-listener.h
shell/evolution-shell-component-utils.c
shell/evolution-shell-component-utils.h
shell/importer/evolution-importer-client.c
shell/importer/evolution-importer-client.h
shell/importer/evolution-importer-listener.c
shell/importer/evolution-importer-listener.h
shell/importer/evolution-importer.c
shell/importer/evolution-importer.h
shell/importer/evolution-intelligent-importer.c
shell/importer/evolution-intelligent-importer.h
shell/importer/import.glade
shell/importer/intelligent.c
shell/importer/intelligent.h
shell/main.c
shell/shell.error.xml
shell/test/evolution-test-component.c
shell/test/evolution-test-component.h
smime/ChangeLog
smime/lib/Makefile.am
ui/Makefile.am
ui/evolution-addressbook.xml
ui/evolution-calendar.xml
widgets/ChangeLog
widgets/menus/gal-view-menus.c
widgets/menus/gal-view-menus.h
widgets/misc/ChangeLog
widgets/misc/Makefile.am
widgets/misc/e-activity-handler.c
widgets/misc/e-activity-handler.h
widgets/misc/e-attachment-bar.c
widgets/misc/e-attachment-bar.h
widgets/misc/e-attachment.c
widgets/misc/e-attachment.h
widgets/misc/e-calendar-item.c
widgets/misc/e-charset-picker.c
widgets/misc/e-combo-button.c
widgets/misc/e-combo-button.h
widgets/misc/e-config-page.c
widgets/misc/e-config-page.h
widgets/misc/e-dropdown-button.c
widgets/misc/e-dropdown-button.h
widgets/misc/e-filter-bar.h
widgets/misc/e-info-label.c
widgets/misc/e-info-label.h
widgets/misc/e-multi-config-dialog.c
widgets/misc/e-multi-config-dialog.h
widgets/misc/e-online-button.c
widgets/misc/e-search-bar.c
widgets/misc/e-search-bar.h
widgets/misc/e-signature-combo-box.c
widgets/misc/e-signature-combo-box.h
widgets/misc/e-signature-editor.c
widgets/misc/e-signature-editor.h
widgets/misc/e-task-bar.c
widgets/misc/e-task-bar.h
widgets/misc/e-task-widget.c
widgets/misc/e-task-widget.h
widgets/misc/test-dropdown-button.c
widgets/misc/test-info-label.c
widgets/misc/test-multi-config-dialog.c
widgets/table/ChangeLog
widgets/table/e-cell-date.c
widgets/table/e-table-group-container.c
widgets/table/e-table-group-leaf.c
widgets/table/e-table-group.c
widgets/table/e-table-group.h
widgets/table/e-table.c
widgets/table/e-table.h
Diffstat (limited to 'plugins/publish-calendar')
-rw-r--r-- | plugins/publish-calendar/ChangeLog | 15 | ||||
-rw-r--r-- | plugins/publish-calendar/publish-calendar.c | 166 | ||||
-rw-r--r-- | plugins/publish-calendar/publish-format-fb.c | 29 | ||||
-rw-r--r-- | plugins/publish-calendar/publish-format-fb.h | 2 | ||||
-rw-r--r-- | plugins/publish-calendar/publish-format-ical.c | 27 | ||||
-rw-r--r-- | plugins/publish-calendar/publish-format-ical.h | 2 |
6 files changed, 169 insertions, 72 deletions
diff --git a/plugins/publish-calendar/ChangeLog b/plugins/publish-calendar/ChangeLog index afafa7790c..15ae0b036d 100644 --- a/plugins/publish-calendar/ChangeLog +++ b/plugins/publish-calendar/ChangeLog @@ -1,3 +1,18 @@ +2009-04-24 Milan Crha <mcrha@redhat.com> + + ** Fix for bug #340783 + + * publish-format-fb.h: (publish_calendar_as_fb): + * publish-format-fb.c: (write_calendar), (publish_calendar_as_fb): + * publish-format-ical.h: (publish_calendar_as_ical): + * publish-format-ical.c: (write_calendar), (publish_calendar_as_ical): + * publish-calendar.c: (publish), (publish_no_succ_info), + (publish_uri_async), (publish_online), (mount_ready_cb), + (mount_first), (add_timeout), (add_offset_timeout), + (online_state_changed), (publish_urls), (action_publish), + (error_queue_show_idle), (error_queue_add): + Show error or success to user in a UI. + 2009-01-21 Suman Manjunath <msuman@novell.com> ** Fix for bug #541209 diff --git a/plugins/publish-calendar/publish-calendar.c b/plugins/publish-calendar/publish-calendar.c index 98371345b5..4adbe0d726 100644 --- a/plugins/publish-calendar/publish-calendar.c +++ b/plugins/publish-calendar/publish-calendar.c @@ -33,6 +33,7 @@ #include <calendar/gui/e-cal-menu.h> #include <shell/es-event.h> #include <e-util/e-util-private.h> +#include <e-util/e-dialog-utils.h> #include "url-editor-dialog.h" #include "publish-format-fb.h" #include "publish-format-ical.h" @@ -43,13 +44,24 @@ static GSList *publish_uris = NULL; static GSList *queued_publishes = NULL; static gint online = 0; +static GSList *error_queue = NULL; +static GStaticMutex error_queue_lock = G_STATIC_MUTEX_INIT; +static guint error_queue_show_idle_id = 0; +static void error_queue_add (char *descriptions, GError *error); + int e_plugin_lib_enable (EPlugin *ep, int enable); void action_publish (EPlugin *ep, ECalMenuTargetSelect *t); void online_state_changed (EPlugin *ep, ESEventTargetState *target); void publish_calendar_context_activate (EPlugin *ep, ECalPopupTargetSource *target); GtkWidget *publish_calendar_locations (EPlugin *epl, EConfigHookItemFactoryData *data); static void update_timestamp (EPublishUri *uri); -static void publish (EPublishUri *uri); +static void publish (EPublishUri *uri, gboolean can_report_success); + +static void +publish_no_succ_info (EPublishUri *uri) +{ + publish (uri, FALSE); +} static void publish_uri_async (EPublishUri *uri) @@ -57,7 +69,7 @@ publish_uri_async (EPublishUri *uri) GThread *thread = NULL; GError *error = NULL; - thread = g_thread_create ((GThreadFunc) publish, uri, FALSE, &error); + thread = g_thread_create ((GThreadFunc) publish_no_succ_info, uri, FALSE, &error); if (!thread) { g_warning (G_STRLOC ": %s", error->message); g_error_free (error); @@ -65,7 +77,7 @@ publish_uri_async (EPublishUri *uri) } static void -publish_online (EPublishUri *uri, GFile *file, GError **perror) +publish_online (EPublishUri *uri, GFile *file, GError **perror, gboolean can_report_success) { GOutputStream *stream; GError *error = NULL; @@ -79,20 +91,20 @@ publish_online (EPublishUri *uri, GFile *file, GError **perror) if (perror) { *perror = error; } else if (error) { - g_warning ("Couldn't open %s: %s", uri->location, error->message); - g_error_free (error); + + error_queue_add (g_strdup_printf (_("Could not open %s:"), uri->location), error); } else { - g_warning ("Couldn't open %s: Unknown error", uri->location); + error_queue_add (g_strdup_printf (_("Could not open %s: Unknown error"), uri->location), NULL); } return; } switch (uri->publish_format) { case URI_PUBLISH_AS_ICAL: - publish_calendar_as_ical (stream, uri); + publish_calendar_as_ical (stream, uri, &error); break; case URI_PUBLISH_AS_FB: - publish_calendar_as_fb (stream, uri); + publish_calendar_as_fb (stream, uri, &error); break; /* case URI_PUBLISH_AS_HTML: @@ -101,6 +113,11 @@ publish_online (EPublishUri *uri, GFile *file, GError **perror) */ } + if (error) + error_queue_add (g_strdup_printf (_("There was an error while publishing to %s:"), uri->location), error); + else if (can_report_success) + error_queue_add (g_strdup_printf (_("Publishing to %s finished successfully"), uri->location), NULL); + update_timestamp (uri); g_output_stream_close (stream, NULL, NULL); @@ -126,6 +143,7 @@ struct mnt_struct { EPublishUri *uri; GFile *file; GMountOperation *mount_op; + gboolean can_report_success; }; static void @@ -138,10 +156,9 @@ mount_ready_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) g_file_mount_enclosing_volume_finish (G_FILE (source_object), res, &error); if (error) { - if (error->code != G_IO_ERROR_CANCELLED) - g_warning ("Mount of %s failed: %s", ms->uri->location, error->message); + + error_queue_add (g_strdup_printf (_("Mount of %s failed:"), ms->uri->location), error); - g_error_free (error); if (ms) g_object_unref (ms->mount_op); g_free (ms); @@ -153,7 +170,7 @@ mount_ready_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) g_return_if_fail (ms != NULL); - publish_online (ms->uri, ms->file, NULL); + publish_online (ms->uri, ms->file, NULL, ms->can_report_success); g_object_unref (ms->mount_op); g_free (ms); @@ -267,13 +284,14 @@ ask_question (GMountOperation *op, const char *message, const char *choices[]) } static void -mount_first (EPublishUri *uri, GFile *file) +mount_first (EPublishUri *uri, GFile *file, gboolean can_report_success) { struct mnt_struct *ms = g_malloc (sizeof (struct mnt_struct)); ms->uri = uri; ms->file = g_object_ref (file); ms->mount_op = g_mount_operation_new (); + ms->can_report_success = can_report_success; g_signal_connect (ms->mount_op, "ask-password", G_CALLBACK (ask_password), ms); g_signal_connect (ms->mount_op, "ask-question", G_CALLBACK (ask_question), ms); @@ -282,7 +300,7 @@ mount_first (EPublishUri *uri, GFile *file) } static void -publish (EPublishUri *uri) +publish (EPublishUri *uri, gboolean can_report_success) { if (online) { GError *error = NULL; @@ -298,19 +316,17 @@ publish (EPublishUri *uri) g_return_if_fail (file != NULL); - publish_online (uri, file, &error); + publish_online (uri, file, &error, can_report_success); if (error && error->domain == G_IO_ERROR && error->code == G_IO_ERROR_NOT_MOUNTED) { g_error_free (error); error = NULL; - mount_first (uri, file); + mount_first (uri, file, can_report_success); } - if (error) { - g_warning ("Couldn't open %s: %s", uri->location, error->message); - g_error_free (error); - } + if (error) + error_queue_add (g_strdup_printf (_("Could not open %s:"), uri->location), error); g_object_unref (file); } else { @@ -336,11 +352,11 @@ add_timeout (EPublishUri *uri) /* Set the timeout for now+frequency */ switch (uri->publish_frequency) { case URI_PUBLISH_DAILY: - id = g_timeout_add (24 * 60 * 60 * 1000, (GSourceFunc) publish, uri); + id = g_timeout_add (24 * 60 * 60 * 1000, (GSourceFunc) publish_no_succ_info, uri); g_hash_table_insert (uri_timeouts, uri, GUINT_TO_POINTER (id)); break; case URI_PUBLISH_WEEKLY: - id = g_timeout_add (7 * 24 * 60 * 60 * 1000, (GSourceFunc) publish, uri); + id = g_timeout_add (7 * 24 * 60 * 60 * 1000, (GSourceFunc) publish_no_succ_info, uri); g_hash_table_insert (uri_timeouts, uri, GUINT_TO_POINTER (id)); break; } @@ -400,20 +416,20 @@ add_offset_timeout (EPublishUri *uri) switch (uri->publish_frequency) { case URI_PUBLISH_DAILY: if (elapsed > 24 * 60 * 60) { - publish (uri); + publish (uri, FALSE); add_timeout (uri); } else { - id = g_timeout_add (((24 * 60 * 60) - elapsed) * 1000, (GSourceFunc) publish, uri); + id = g_timeout_add (((24 * 60 * 60) - elapsed) * 1000, (GSourceFunc) publish_no_succ_info, uri); g_hash_table_insert (uri_timeouts, uri, GUINT_TO_POINTER (id)); break; } break; case URI_PUBLISH_WEEKLY: if (elapsed > 7 * 24 * 60 * 60) { - publish (uri); + publish (uri, FALSE); add_timeout (uri); } else { - id = g_timeout_add (((7 * 24 * 60 * 60) - elapsed) * 1000, (GSourceFunc) publish, uri); + id = g_timeout_add (((7 * 24 * 60 * 60) - elapsed) * 1000, (GSourceFunc) publish_no_succ_info, uri); g_hash_table_insert (uri_timeouts, uri, GUINT_TO_POINTER (id)); break; } @@ -655,7 +671,7 @@ online_state_changed (EPlugin *ep, ESEventTargetState *target) online = target->state; if (online) while (queued_publishes) - publish (queued_publishes->data); + publish (queued_publishes->data, FALSE); } GtkWidget * @@ -743,7 +759,7 @@ publish_urls (gpointer data) for (l = publish_uris; l; l = g_slist_next (l)) { EPublishUri *uri = l->data; - publish (uri); + publish (uri, TRUE); } return GINT_TO_POINTER (0); @@ -756,11 +772,8 @@ action_publish (EPlugin *ep, ECalMenuTargetSelect *t) GError *error = NULL; thread = g_thread_create ((GThreadFunc) publish_urls, NULL, FALSE, &error); - if (!thread) { - g_warning (G_STRLOC ": %s", error->message); - g_error_free (error); - } - + if (!thread) + error_queue_add (g_strdup (_("Could not create publish thread.")), error); } static void @@ -816,3 +829,90 @@ e_plugin_lib_enable (EPlugin *ep, int enable) return 0; } + +struct eq_data { + char *description; + GError *error; +}; + +static gboolean +error_queue_show_idle (gpointer user_data) +{ + GString *info = NULL; + GSList *l; + gboolean has_error = FALSE, has_info = FALSE; + + g_static_mutex_lock (&error_queue_lock); + + for (l = error_queue; l; l = l->next) { + struct eq_data *data = l->data; + + if (data) { + if (data->description) { + if (!info) { + info = g_string_new (data->description); + } else { + g_string_append (info, "\n\n"); + g_string_append (info, data->description); + } + + g_free (data->description); + } + + if (data->error) { + has_error = TRUE; + if (!info) { + info = g_string_new (data->error->message); + } else if (data->description) { + g_string_append (info, " "); + g_string_append (info, data->error->message); + } else { + g_string_append (info, "\n\n"); + g_string_append (info, data->error->message); + } + + g_error_free (data->error); + } else if (data->description) { + has_info = TRUE; + } + + g_free (data); + } + } + + g_slist_free (error_queue); + + error_queue = NULL; + error_queue_show_idle_id = 0; + + g_static_mutex_unlock (&error_queue_lock); + + if (info) { + e_notice (NULL, + has_error && has_info ? GTK_MESSAGE_WARNING : has_error ? GTK_MESSAGE_ERROR : GTK_MESSAGE_INFO, + "%s", info->str, NULL); + + g_string_free (info, TRUE); + } + + return FALSE; +} + +void +error_queue_add (char *description, GError *error) +{ + struct eq_data *data; + + if (!error && !description) + return; + + data = g_new0 (struct eq_data, 1); + data->description = description; + data->error = error; + + g_static_mutex_lock (&error_queue_lock); + error_queue = g_slist_append (error_queue, data); + if (error_queue_show_idle_id == 0) + error_queue_show_idle_id = g_idle_add (error_queue_show_idle, NULL); + g_static_mutex_unlock (&error_queue_lock); +} diff --git a/plugins/publish-calendar/publish-format-fb.c b/plugins/publish-calendar/publish-format-fb.c index 40d0258f8a..5956b0ff8d 100644 --- a/plugins/publish-calendar/publish-format-fb.c +++ b/plugins/publish-calendar/publish-format-fb.c @@ -22,6 +22,7 @@ #include <string.h> #include <time.h> +#include <glib/gi18n.h> #include <gconf/gconf-client.h> #include <libedataserver/e-source.h> #include <libedataserver/e-source-list.h> @@ -32,11 +33,10 @@ #include "publish-format-fb.h" static gboolean -write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream) +write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, GError **error) { ESource *source; ECal *client = NULL; - GError *error = NULL; GList *objects; icaltimezone *utc; time_t start = time(NULL), end; @@ -53,28 +53,24 @@ write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream) if (source) client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT); if (!client) { - g_warning (G_STRLOC ": Could not publish calendar: Calendar backend no longer exists"); + if (error) + *error = g_error_new (e_calendar_error_quark (), E_CALENDAR_STATUS_NO_SUCH_CALENDAR, _("Could not publish calendar: Calendar backend no longer exists")); return FALSE; } - if (!e_cal_open (client, TRUE, &error)) { - if (error) { - g_warning ("%s", error->message); - g_error_free (error); - } + if (!e_cal_open (client, TRUE, error)) { g_object_unref (client); return FALSE; } - if (e_cal_get_cal_address (client, &email, &error)) { + if (e_cal_get_cal_address (client, &email, NULL)) { if (email && *email) users = g_list_append (users, email); } top_level = e_cal_util_new_top_level (); - error = NULL; - if (e_cal_get_free_busy (client, users, start, end, &objects, &error)) { + if (e_cal_get_free_busy (client, users, start, end, &objects, error)) { char *ical_string; while (objects) { @@ -85,7 +81,7 @@ write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream) } ical_string = icalcomponent_as_ical_string_r (top_level); - res = g_output_stream_write_all (stream, ical_string, strlen (ical_string), NULL, NULL, &error); + res = g_output_stream_write_all (stream, ical_string, strlen (ical_string), NULL, NULL, error); g_free (ical_string); } @@ -96,16 +92,11 @@ write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream) g_free (email); g_object_unref (client); - if (error) { - g_warning ("%s", error->message); - g_error_free (error); - } - return res; } void -publish_calendar_as_fb (GOutputStream *stream, EPublishUri *uri) +publish_calendar_as_fb (GOutputStream *stream, EPublishUri *uri, GError **error) { GSList *l; ESourceList *source_list; @@ -118,7 +109,7 @@ publish_calendar_as_fb (GOutputStream *stream, EPublishUri *uri) l = uri->events; while (l) { gchar *uid = l->data; - if (!write_calendar (uid, source_list, stream)) + if (!write_calendar (uid, source_list, stream, error)) break; l = g_slist_next (l); } diff --git a/plugins/publish-calendar/publish-format-fb.h b/plugins/publish-calendar/publish-format-fb.h index bd0ff7c31a..4975aa107d 100644 --- a/plugins/publish-calendar/publish-format-fb.h +++ b/plugins/publish-calendar/publish-format-fb.h @@ -27,6 +27,6 @@ #ifndef PUBLISH_FORMAT_FB_H #define PUBLISH_FORMAT_FB_H -void publish_calendar_as_fb (GOutputStream *stream, EPublishUri *uri); +void publish_calendar_as_fb (GOutputStream *stream, EPublishUri *uri, GError **error); #endif diff --git a/plugins/publish-calendar/publish-format-ical.c b/plugins/publish-calendar/publish-format-ical.c index f6dcc461c9..13962fc849 100644 --- a/plugins/publish-calendar/publish-format-ical.c +++ b/plugins/publish-calendar/publish-format-ical.c @@ -21,6 +21,7 @@ */ #include <string.h> +#include <glib/gi18n.h> #include <gconf/gconf-client.h> #include <libedataserver/e-source.h> #include <libedataserver/e-source-list.h> @@ -65,11 +66,10 @@ append_tz_to_comp (gpointer key, gpointer value, icalcomponent *toplevel) } static gboolean -write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream) +write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, GError **error) { ESource *source; ECal *client = NULL; - GError *error = NULL; GList *objects; icalcomponent *top_level; gboolean res = FALSE; @@ -78,23 +78,19 @@ write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream) if (source) client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT); if (!client) { - g_warning (G_STRLOC ": Could not publish calendar: Calendar backend no longer exists"); + if (error) + *error = g_error_new (e_calendar_error_quark (), E_CALENDAR_STATUS_NO_SUCH_CALENDAR, _("Could not publish calendar: Calendar backend no longer exists")); return FALSE; } - if (!e_cal_open (client, TRUE, &error)) { - if (error) { - g_warning ("%s", error->message); - g_error_free (error); - } + if (!e_cal_open (client, TRUE, error)) { g_object_unref (client); return FALSE; } top_level = e_cal_util_new_top_level (); - error = NULL; - if (e_cal_get_object_list (client, "#t", &objects, &error)) { + if (e_cal_get_object_list (client, "#t", &objects, error)) { char *ical_string; CompTzData tdata; @@ -114,22 +110,17 @@ write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream) tdata.zones = NULL; ical_string = icalcomponent_as_ical_string_r (top_level); - res = g_output_stream_write_all (stream, ical_string, strlen (ical_string), NULL, NULL, &error); + res = g_output_stream_write_all (stream, ical_string, strlen (ical_string), NULL, NULL, error); g_free (ical_string); } g_object_unref (client); - if (error) { - g_warning ("%s", error->message); - g_error_free (error); - } - return res; } void -publish_calendar_as_ical (GOutputStream *stream, EPublishUri *uri) +publish_calendar_as_ical (GOutputStream *stream, EPublishUri *uri, GError **error) { GSList *l; ESourceList *source_list; @@ -142,7 +133,7 @@ publish_calendar_as_ical (GOutputStream *stream, EPublishUri *uri) l = uri->events; while (l) { gchar *uid = l->data; - if (!write_calendar (uid, source_list, stream)) + if (!write_calendar (uid, source_list, stream, error)) break; l = g_slist_next (l); } diff --git a/plugins/publish-calendar/publish-format-ical.h b/plugins/publish-calendar/publish-format-ical.h index 6cfff1011a..4c32310b99 100644 --- a/plugins/publish-calendar/publish-format-ical.h +++ b/plugins/publish-calendar/publish-format-ical.h @@ -27,6 +27,6 @@ #ifndef PUBLISH_FORMAT_ICAL_H #define PUBLISH_FORMAT_ICAL_H -void publish_calendar_as_ical (GOutputStream *stream, EPublishUri *uri); +void publish_calendar_as_ical (GOutputStream *stream, EPublishUri *uri, GError **error); #endif |