aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2009-06-25 00:59:33 +0800
committerMatthew Barnes <mbarnes@redhat.com>2009-06-25 06:29:22 +0800
commitf0d3f3afdfa314e1e8cd7d8da790878008a46aad (patch)
tree7116e2a18c7bd50633b2f8de42b5377af1e8172a /mail
parent94302ea73cde0b470faad653f752406f19f202d7 (diff)
downloadgsoc2013-evolution-f0d3f3afdfa314e1e8cd7d8da790878008a46aad.tar
gsoc2013-evolution-f0d3f3afdfa314e1e8cd7d8da790878008a46aad.tar.gz
gsoc2013-evolution-f0d3f3afdfa314e1e8cd7d8da790878008a46aad.tar.bz2
gsoc2013-evolution-f0d3f3afdfa314e1e8cd7d8da790878008a46aad.tar.lz
gsoc2013-evolution-f0d3f3afdfa314e1e8cd7d8da790878008a46aad.tar.xz
gsoc2013-evolution-f0d3f3afdfa314e1e8cd7d8da790878008a46aad.tar.zst
gsoc2013-evolution-f0d3f3afdfa314e1e8cd7d8da790878008a46aad.zip
Radically reorganize source code.
- Collect all shell modules into a new top-level 'modules' directory: $(top_srcdir)/modules/addressbook $(top_srcdir)/modules/calendar $(top_srcdir)/modules/mail Nothing is allowed to link to these, not plugins nor other modules. THIS SOLVES BUG #571275 AND OPENS THE DOOR TO PORTING TO MAC OS X. - Mimic the libevolution-mail-shared library from master (except drop the "shared" suffix) and have libevolution-mail-importers and all mail-related plugins link to it. - Discard the a11y subdirectories and have the files live alongside their counterpart widgets.
Diffstat (limited to 'mail')
-rw-r--r--mail/Makefile.am175
-rw-r--r--mail/e-attachment-handler-mail.c524
-rw-r--r--mail/e-attachment-handler-mail.h65
-rw-r--r--mail/e-mail-browser.c8
-rw-r--r--mail/e-mail-browser.h4
-rw-r--r--mail/e-mail-reader-utils.c8
-rw-r--r--mail/e-mail-reader.c59
-rw-r--r--mail/e-mail-reader.h32
-rw-r--r--mail/e-mail-shell-backend.c766
-rw-r--r--mail/e-mail-shell-backend.h82
-rw-r--r--mail/e-mail-shell-content.c1053
-rw-r--r--mail/e-mail-shell-content.h94
-rw-r--r--mail/e-mail-shell-migrate.c3104
-rw-r--r--mail/e-mail-shell-migrate.h38
-rw-r--r--mail/e-mail-shell-settings.c521
-rw-r--r--mail/e-mail-shell-settings.h33
-rw-r--r--mail/e-mail-shell-sidebar.c644
-rw-r--r--mail/e-mail-shell-sidebar.h81
-rw-r--r--mail/e-mail-shell-view-actions.c1806
-rw-r--r--mail/e-mail-shell-view-actions.h257
-rw-r--r--mail/e-mail-shell-view-private.c905
-rw-r--r--mail/e-mail-shell-view-private.h173
-rw-r--r--mail/e-mail-shell-view.c260
-rw-r--r--mail/e-mail-shell-view.h72
-rw-r--r--mail/em-account-editor.c3114
-rw-r--r--mail/em-account-editor.h86
-rw-r--r--mail/em-account-prefs.c323
-rw-r--r--mail/em-account-prefs.h69
-rw-r--r--mail/em-composer-prefs.c621
-rw-r--r--mail/em-composer-prefs.h93
-rw-r--r--mail/em-folder-tree.h1
-rw-r--r--mail/em-mailer-prefs.c1332
-rw-r--r--mail/em-mailer-prefs.h141
-rw-r--r--mail/em-network-prefs.c499
-rw-r--r--mail/em-network-prefs.h102
-rw-r--r--mail/em-utils.c104
-rw-r--r--mail/em-utils.h6
-rw-r--r--mail/evolution-module-mail.c59
-rw-r--r--mail/importers/Makefile.am33
-rw-r--r--mail/importers/evolution-mbox-importer.c1
-rw-r--r--mail/importers/mail-importer.c14
-rw-r--r--mail/mail-autofilter.c17
-rw-r--r--mail/mail-config.c12
-rw-r--r--mail/mail-folder-cache.c5
-rw-r--r--mail/mail-mt.c11
-rw-r--r--mail/mail-ops.c14
-rw-r--r--mail/mail-send-recv.c1
-rw-r--r--mail/mail-session.c12
-rw-r--r--mail/mail-session.h4
-rw-r--r--mail/mail-tools.c6
-rw-r--r--mail/mail-vfolder.c43
51 files changed, 229 insertions, 17258 deletions
diff --git a/mail/Makefile.am b/mail/Makefile.am
index 5e9a7b9781..8b7a123994 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = default
+SUBDIRS = . default importers
mailincludedir = $(privincludedir)/mail
@@ -31,158 +31,125 @@ INCLUDES = \
-DPREFIX=\""$(prefix)"\" \
-DG_LOG_DOMAIN=\"evolution-mail\"
-module_LTLIBRARIES = \
- libevolution-module-mail.la
+privsolib_LTLIBRARIES = libevolution-mail.la
-libevolution_module_mail_la_SOURCES = \
- evolution-module-mail.c \
- e-attachment-handler-mail.c \
- e-attachment-handler-mail.h \
- e-mail-attachment-bar.c \
+mailinclude_HEADERS = \
e-mail-attachment-bar.h \
- e-mail-browser.c \
e-mail-browser.h \
- e-mail-display.c \
e-mail-display.h \
- e-mail-label-dialog.c \
e-mail-label-dialog.h \
- e-mail-label-list-store.c \
e-mail-label-list-store.h \
- e-mail-label-manager.c \
e-mail-label-manager.h \
- e-mail-label-tree-view.c \
e-mail-label-tree-view.h \
- e-mail-local.c \
e-mail-local.h \
- e-mail-reader.c \
e-mail-reader.h \
- e-mail-reader-utils.c \
e-mail-reader-utils.h \
- e-mail-search-bar.c \
e-mail-search-bar.h \
- e-mail-shell-backend.c \
- e-mail-shell-backend.h \
- e-mail-shell-content.c \
- e-mail-shell-content.h \
- e-mail-shell-migrate.c \
- e-mail-shell-migrate.h \
- e-mail-shell-settings.c \
- e-mail-shell-settings.h \
- e-mail-shell-sidebar.c \
- e-mail-shell-sidebar.h \
- e-mail-shell-view.c \
- e-mail-shell-view.h \
- e-mail-shell-view-actions.c \
- e-mail-shell-view-actions.h \
- e-mail-shell-view-private.c \
- e-mail-shell-view-private.h \
- e-mail-store.c \
e-mail-store.h \
- e-searching-tokenizer.c \
e-searching-tokenizer.h \
- em-account-editor.c \
- em-account-editor.h \
- em-account-prefs.c \
- em-account-prefs.h \
- em-composer-prefs.c \
- em-composer-prefs.h \
- em-composer-utils.c \
em-composer-utils.h \
- em-config.c \
em-config.h \
- em-event.c \
em-event.h \
- em-filter-context.c \
em-filter-context.h \
- em-filter-editor.c \
em-filter-editor.h \
- em-filter-folder-element.c \
em-filter-folder-element.h \
- em-filter-rule.c \
em-filter-rule.h \
- em-filter-source-element.c \
em-filter-source-element.h \
- em-folder-properties.c \
em-folder-properties.h \
- em-folder-selection.c \
em-folder-selection.h \
- em-folder-selector.c \
em-folder-selector.h \
- em-folder-selection-button.c \
em-folder-selection-button.h \
- em-folder-tree.c \
em-folder-tree.h \
- em-folder-tree-model.c \
em-folder-tree-model.h \
- em-folder-utils.c \
em-folder-utils.h \
- em-format-hook.c \
em-format-hook.h \
- em-format-html.c \
em-format-html.h \
- em-format-html-display.c \
em-format-html-display.h \
- em-format-html-print.c \
em-format-html-print.h \
- em-html-stream.c \
em-html-stream.h \
- em-icon-stream.c \
em-icon-stream.h \
- em-inline-filter.c \
em-inline-filter.h \
- em-junk-hook.c \
em-junk-hook.h \
- em-mailer-prefs.c \
- em-mailer-prefs.h \
- em-menu.c \
em-menu.h \
- em-network-prefs.c \
- em-network-prefs.h \
- em-popup.c \
em-popup.h \
- em-search-context.c \
em-search-context.h \
- em-subscribe-editor.c \
em-subscribe-editor.h \
- em-sync-stream.c \
em-sync-stream.h \
- em-utils.c \
em-utils.h \
- em-vfolder-context.c \
em-vfolder-context.h \
- em-vfolder-editor.c \
em-vfolder-editor.h \
- em-vfolder-rule.c \
em-vfolder-rule.h \
- mail-autofilter.c \
mail-autofilter.h \
- mail-config.c \
mail-config.h \
- mail-folder-cache.c \
mail-folder-cache.h \
- mail-mt.c \
mail-mt.h \
- mail-ops.c \
mail-ops.h \
- mail-send-recv.c \
mail-send-recv.h \
- mail-session.c \
mail-session.h \
- mail-tools.c \
mail-tools.h \
- mail-vfolder.c \
mail-vfolder.h \
- message-list.c \
message-list.h \
- message-tag-editor.c \
message-tag-editor.h \
- message-tag-followup.c \
- message-tag-followup.h \
- importers/mail-importer.c \
- importers/mail-importer.h \
- importers/elm-importer.c \
- importers/pine-importer.c \
- importers/evolution-mbox-importer.c
+ message-tag-followup.h
+
+libevolution_mail_la_SOURCES = \
+ e-mail-attachment-bar.c \
+ e-mail-browser.c \
+ e-mail-display.c \
+ e-mail-label-dialog.c \
+ e-mail-label-list-store.c \
+ e-mail-label-manager.c \
+ e-mail-label-tree-view.c \
+ e-mail-local.c \
+ e-mail-reader.c \
+ e-mail-reader-utils.c \
+ e-mail-search-bar.c \
+ e-mail-store.c \
+ e-searching-tokenizer.c \
+ em-composer-utils.c \
+ em-config.c \
+ em-event.c \
+ em-filter-context.c \
+ em-filter-editor.c \
+ em-filter-folder-element.c \
+ em-filter-rule.c \
+ em-filter-source-element.c \
+ em-folder-properties.c \
+ em-folder-selection.c \
+ em-folder-selector.c \
+ em-folder-selection-button.c \
+ em-folder-tree.c \
+ em-folder-tree-model.c \
+ em-folder-utils.c \
+ em-format-hook.c \
+ em-format-html.c \
+ em-format-html-display.c \
+ em-format-html-print.c \
+ em-html-stream.c \
+ em-icon-stream.c \
+ em-inline-filter.c \
+ em-junk-hook.c \
+ em-menu.c \
+ em-popup.c \
+ em-search-context.c \
+ em-subscribe-editor.c \
+ em-sync-stream.c \
+ em-utils.c \
+ em-vfolder-context.c \
+ em-vfolder-editor.c \
+ em-vfolder-rule.c \
+ mail-autofilter.c \
+ mail-config.c \
+ mail-folder-cache.c \
+ mail-mt.c \
+ mail-ops.c \
+ mail-send-recv.c \
+ mail-session.c \
+ mail-tools.c \
+ mail-vfolder.c \
+ message-list.c \
+ message-tag-editor.c \
+ message-tag-followup.c
if ENABLE_SMIME
SMIME_LIBS = \
@@ -190,7 +157,7 @@ SMIME_LIBS = \
$(top_builddir)/smime/gui/libevolution-smime.la
endif
-libevolution_module_mail_la_LIBADD = \
+libevolution_mail_la_LIBADD = \
$(top_builddir)/e-util/libeutil.la \
$(top_builddir)/shell/libeshell.la \
$(top_builddir)/composer/libcomposer.la \
@@ -199,20 +166,10 @@ libevolution_module_mail_la_LIBADD = \
$(top_builddir)/widgets/misc/libemiscwidgets.la \
$(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.la \
$(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \
+ $(GTKHTML_LIBS) \
$(SMIME_LIBS)
-#libevolution_mail_la_LIBADD = \
-# $(top_builddir)/widgets/misc/libefilterbar.la \
-# $(top_builddir)/filter/libfilter.la \
-# $(top_builddir)/widgets/menus/libmenus.la \
-# $(top_builddir)/addressbook/util/libeabutil.la \
-# $(EVOLUTION_MAIL_LIBS) \
-# $(GTKHTML_LIBS) \
-# $(REGEX_LIBS) \
-# $(THREADS_LIBS)
-
-libevolution_module_mail_la_LDFLAGS = \
- -avoid-version -module $(NO_UNDEFINED)
+libevolution_mail_la_LDFLAGS = $(NO_UNDEFINED)
libevolution_mail_la_DEPENDENCIES = em-filter-i18n.h
diff --git a/mail/e-attachment-handler-mail.c b/mail/e-attachment-handler-mail.c
deleted file mode 100644
index c17c97d8ca..0000000000
--- a/mail/e-attachment-handler-mail.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * e-attachment-handler-mail.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-attachment-handler-mail.h"
-
-#include <glib/gi18n.h>
-#include <camel/camel-folder.h>
-#include <camel/camel-stream-mem.h>
-
-#include "e-util/e-error.h"
-#include "mail/em-composer-utils.h"
-#include "mail/mail-tools.h"
-
-#define E_ATTACHMENT_HANDLER_MAIL_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE \
- ((obj), E_TYPE_ATTACHMENT_HANDLER_MAIL, EAttachmentHandlerMailPrivate))
-
-struct _EAttachmentHandlerMailPrivate {
- gint placeholder;
-};
-
-static gpointer parent_class;
-
-static const gchar *ui =
-"<ui>"
-" <popup name='context'>"
-" <placeholder name='custom-actions'>"
-" <menuitem action='mail-reply-sender'/>"
-" <menuitem action='mail-reply-all'/>"
-" <menuitem action='mail-forward'/>"
-" </placeholder>"
-" </popup>"
-"</ui>";
-
-/* Note: Do not use the info field. */
-static GtkTargetEntry target_table[] = {
- { (gchar *) "message/rfc822", 0, 0 },
- { (gchar *) "x-uid-list", 0, 0 }
-};
-
-static void
-attachment_handler_mail_forward (GtkAction *action,
- EAttachmentView *view)
-{
- EAttachment *attachment;
- CamelMimePart *mime_part;
- CamelDataWrapper *wrapper;
- GList *selected;
-
- selected = e_attachment_view_get_selected_attachments (view);
- g_return_if_fail (g_list_length (selected) == 1);
-
- attachment = E_ATTACHMENT (selected->data);
- mime_part = e_attachment_get_mime_part (attachment);
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- em_utils_forward_message (CAMEL_MIME_MESSAGE (wrapper), NULL);
-
- g_list_foreach (selected, (GFunc) g_object_unref, NULL);
- g_list_free (selected);
-}
-
-static void
-attachment_handler_mail_reply_all (GtkAction *action,
- EAttachmentView *view)
-{
- EAttachment *attachment;
- CamelMimePart *mime_part;
- CamelDataWrapper *wrapper;
- GList *selected;
-
- selected = e_attachment_view_get_selected_attachments (view);
- g_return_if_fail (g_list_length (selected) == 1);
-
- attachment = E_ATTACHMENT (selected->data);
- mime_part = e_attachment_get_mime_part (attachment);
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- em_utils_reply_to_message (
- NULL, NULL, CAMEL_MIME_MESSAGE (wrapper),
- REPLY_MODE_ALL, NULL);
-
- g_list_foreach (selected, (GFunc) g_object_unref, NULL);
- g_list_free (selected);
-}
-
-static void
-attachment_handler_mail_reply_sender (GtkAction *action,
- EAttachmentView *view)
-{
- EAttachment *attachment;
- CamelMimePart *mime_part;
- CamelDataWrapper *wrapper;
- GList *selected;
-
- selected = e_attachment_view_get_selected_attachments (view);
- g_return_if_fail (g_list_length (selected) == 1);
-
- attachment = E_ATTACHMENT (selected->data);
- mime_part = e_attachment_get_mime_part (attachment);
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- em_utils_reply_to_message (
- NULL, NULL, CAMEL_MIME_MESSAGE (wrapper),
- REPLY_MODE_SENDER, NULL);
-
- g_list_foreach (selected, (GFunc) g_object_unref, NULL);
- g_list_free (selected);
-}
-
-static GtkActionEntry standard_entries[] = {
-
- { "mail-forward",
- "mail-forward",
- N_("_Forward"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (attachment_handler_mail_forward) },
-
- { "mail-reply-all",
- "mail-reply-all",
- N_("Reply to _All"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (attachment_handler_mail_reply_all) },
-
- { "mail-reply-sender",
- "mail-reply-sender",
- N_("_Reply to Sender"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (attachment_handler_mail_reply_sender) }
-};
-
-static void
-attachment_handler_mail_message_rfc822 (EAttachmentView *view,
- GdkDragContext *drag_context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time)
-{
- static GdkAtom atom = GDK_NONE;
- EAttachmentStore *store;
- EAttachment *attachment;
- CamelMimeMessage *message;
- CamelDataWrapper *wrapper;
- CamelStream *stream;
- const gchar *data;
- gboolean success = FALSE;
- gpointer parent;
- gint length;
-
- if (G_UNLIKELY (atom == GDK_NONE))
- atom = gdk_atom_intern_static_string ("message/rfc822");
-
- if (gtk_selection_data_get_target (selection_data) != atom)
- return;
-
- g_signal_stop_emission_by_name (view, "drag-data-received");
-
- data = (const gchar *) gtk_selection_data_get_data (selection_data);
- length = gtk_selection_data_get_length (selection_data);
-
- stream = camel_stream_mem_new ();
- camel_stream_write (stream, data, length);
- camel_stream_reset (stream);
-
- message = camel_mime_message_new ();
- wrapper = CAMEL_DATA_WRAPPER (message);
-
- if (camel_data_wrapper_construct_from_stream (wrapper, stream) == -1)
- goto exit;
-
- store = e_attachment_view_get_store (view);
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (view));
- parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
-
- attachment = e_attachment_new_for_message (message);
- e_attachment_store_add_attachment (store, attachment);
- e_attachment_load_async (
- attachment, (GAsyncReadyCallback)
- e_attachment_load_handle_error, parent);
- g_object_unref (attachment);
-
- success = TRUE;
-
-exit:
- camel_object_unref (message);
- camel_object_unref (stream);
-
- gtk_drag_finish (drag_context, success, FALSE, time);
-}
-
-static void
-attachment_handler_mail_x_uid_list (EAttachmentView *view,
- GdkDragContext *drag_context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time)
-{
- static GdkAtom atom = GDK_NONE;
- CamelException ex = CAMEL_EXCEPTION_INITIALISER;
- CamelDataWrapper *wrapper;
- CamelMimeMessage *message;
- CamelMultipart *multipart;
- CamelMimePart *mime_part;
- CamelFolder *folder = NULL;
- EAttachment *attachment;
- EAttachmentStore *store;
- GPtrArray *uids;
- const gchar *data;
- const gchar *cp, *end;
- gchar *description;
- gpointer parent;
- gint length;
- guint ii;
-
- if (G_UNLIKELY (atom == GDK_NONE))
- atom = gdk_atom_intern_static_string ("x-uid-list");
-
- if (gtk_selection_data_get_target (selection_data) != atom)
- return;
-
- store = e_attachment_view_get_store (view);
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (view));
- parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
-
- uids = g_ptr_array_new ();
-
- data = (const gchar *) gtk_selection_data_get_data (selection_data);
- length = gtk_selection_data_get_length (selection_data);
-
- /* The UID list is delimited by NUL characters.
- * Brilliant. So we can't use g_strsplit(). */
-
- cp = data;
- end = data + length;
-
- while (cp < end) {
- const gchar *start = cp;
-
- while (cp < end && *cp != '\0')
- cp++;
-
- /* Skip the first string. */
- if (start > data)
- g_ptr_array_add (uids, g_strndup (start, cp - start));
-
- cp++;
- }
-
- if (uids->len == 0)
- goto exit;
-
- /* The first string is the folder URI. */
- folder = mail_tool_uri_to_folder (data, 0, &ex);
- if (folder == NULL)
- goto exit;
-
- /* Handle one message. */
- if (uids->len == 1) {
- message = camel_folder_get_message (
- folder, uids->pdata[0], &ex);
- if (message == NULL)
- goto exit;
-
- attachment = e_attachment_new_for_message (message);
- e_attachment_store_add_attachment (store, attachment);
- e_attachment_load_async (
- attachment, (GAsyncReadyCallback)
- e_attachment_load_handle_error, parent);
- g_object_unref (attachment);
-
- camel_object_unref (message);
- goto exit;
- }
-
- /* Build a multipart/digest message out of the UIDs. */
-
- multipart = camel_multipart_new ();
- wrapper = CAMEL_DATA_WRAPPER (multipart);
- camel_data_wrapper_set_mime_type (wrapper, "multipart/digest");
- camel_multipart_set_boundary (multipart, NULL);
-
- for (ii = 0; ii < uids->len; ii++) {
- message = camel_folder_get_message (
- folder, uids->pdata[ii], &ex);
- if (message == NULL) {
- camel_object_unref (multipart);
- goto exit;
- }
-
- mime_part = camel_mime_part_new ();
- wrapper = CAMEL_DATA_WRAPPER (message);
- camel_mime_part_set_disposition (mime_part, "inline");
- camel_medium_set_content_object (
- CAMEL_MEDIUM (mime_part), wrapper);
- camel_mime_part_set_content_type (mime_part, "message/rfc822");
- camel_multipart_add_part (multipart, mime_part);
- camel_object_unref (mime_part);
-
- camel_object_unref (message);
- }
-
- mime_part = camel_mime_part_new ();
- wrapper = CAMEL_DATA_WRAPPER (multipart);
- camel_medium_set_content_object (CAMEL_MEDIUM (mime_part), wrapper);
-
- /* Translators: This is only for multiple messages. */
- description = g_strdup_printf (_("%d attached messages"), uids->len);
- camel_mime_part_set_description (mime_part, description);
- g_free (description);
-
- attachment = e_attachment_new ();
- e_attachment_set_mime_part (attachment, mime_part);
- e_attachment_store_add_attachment (store, attachment);
- e_attachment_load_async (
- attachment, (GAsyncReadyCallback)
- e_attachment_load_handle_error, parent);
- g_object_unref (attachment);
-
- camel_object_unref (mime_part);
- camel_object_unref (multipart);
-
-exit:
- if (camel_exception_is_set (&ex)) {
- gchar *folder_name;
-
- if (folder != NULL)
- camel_object_get (
- folder, NULL, CAMEL_FOLDER_NAME,
- &folder_name, NULL);
- else
- folder_name = g_strdup (data);
-
- e_error_run (
- parent, "mail-composer:attach-nomessages",
- folder_name, camel_exception_get_description (&ex),
- NULL);
-
- if (folder != NULL)
- camel_object_free (
- folder, CAMEL_FOLDER_NAME, folder_name);
- else
- g_free (folder_name);
-
- camel_exception_clear (&ex);
- }
-
- if (folder != NULL)
- camel_object_unref (folder);
-
- g_ptr_array_free (uids, TRUE);
-
- g_signal_stop_emission_by_name (view, "drag-data-received");
-}
-
-static void
-attachment_handler_mail_update_actions (EAttachmentView *view)
-{
- EAttachment *attachment;
- CamelMimePart *mime_part;
- CamelDataWrapper *wrapper;
- GtkActionGroup *action_group;
- GList *selected;
- gboolean visible = FALSE;
-
- selected = e_attachment_view_get_selected_attachments (view);
-
- if (g_list_length (selected) != 1)
- goto exit;
-
- attachment = E_ATTACHMENT (selected->data);
- mime_part = e_attachment_get_mime_part (attachment);
-
- if (!CAMEL_IS_MIME_PART (mime_part))
- goto exit;
-
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- visible = CAMEL_IS_MIME_MESSAGE (wrapper);
-
-exit:
- action_group = e_attachment_view_get_action_group (view, "mail");
- gtk_action_group_set_visible (action_group, visible);
-
- g_list_foreach (selected, (GFunc) g_object_unref, NULL);
- g_list_free (selected);
-}
-
-static void
-attachment_handler_mail_constructed (GObject *object)
-{
- EAttachmentHandler *handler;
- EAttachmentView *view;
- GtkActionGroup *action_group;
- GtkUIManager *ui_manager;
- GError *error = NULL;
-
- handler = E_ATTACHMENT_HANDLER (object);
-
- /* Chain up to parent's constructed() method. */
- G_OBJECT_CLASS (parent_class)->constructed (object);
-
- view = e_attachment_handler_get_view (handler);
-
- action_group = e_attachment_view_add_action_group (view, "mail");
- gtk_action_group_add_actions (
- action_group, standard_entries,
- G_N_ELEMENTS (standard_entries), view);
-
- ui_manager = e_attachment_view_get_ui_manager (view);
- gtk_ui_manager_add_ui_from_string (ui_manager, ui, -1, &error);
-
- if (error != NULL) {
- g_warning ("%s", error->message);
- g_error_free (error);
- }
-
- g_signal_connect (
- view, "update-actions",
- G_CALLBACK (attachment_handler_mail_update_actions),
- NULL);
-
- g_signal_connect (
- view, "drag-data-received",
- G_CALLBACK (attachment_handler_mail_message_rfc822),
- NULL);
-
- g_signal_connect (
- view, "drag-data-received",
- G_CALLBACK (attachment_handler_mail_x_uid_list),
- NULL);
-}
-
-static GdkDragAction
-attachment_handler_mail_get_drag_actions (EAttachmentHandler *handler)
-{
- return GDK_ACTION_COPY;
-}
-
-static const GtkTargetEntry *
-attachment_handler_mail_get_target_table (EAttachmentHandler *handler,
- guint *n_targets)
-{
- if (n_targets != NULL)
- *n_targets = G_N_ELEMENTS (target_table);
-
- return target_table;
-}
-
-static void
-attachment_handler_mail_class_init (EAttachmentHandlerMailClass *class)
-{
- GObjectClass *object_class;
- EAttachmentHandlerClass *handler_class;
-
- parent_class = g_type_class_peek_parent (class);
- g_type_class_add_private (class, sizeof (EAttachmentHandlerMailPrivate));
-
- object_class = G_OBJECT_CLASS (class);
- object_class->constructed = attachment_handler_mail_constructed;
-
- handler_class = E_ATTACHMENT_HANDLER_CLASS (class);
- handler_class->get_drag_actions = attachment_handler_mail_get_drag_actions;
- handler_class->get_target_table = attachment_handler_mail_get_target_table;
-}
-
-static void
-attachment_handler_mail_init (EAttachmentHandlerMail *handler)
-{
- handler->priv = E_ATTACHMENT_HANDLER_MAIL_GET_PRIVATE (handler);
-}
-
-GType
-e_attachment_handler_mail_get_type (void)
-{
- static GType type = 0;
-
- if (G_UNLIKELY (type == 0)) {
- static const GTypeInfo type_info = {
- sizeof (EAttachmentHandlerMailClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) attachment_handler_mail_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EAttachmentHandlerMail),
- 0, /* n_preallocs */
- (GInstanceInitFunc) attachment_handler_mail_init,
- NULL /* value_table */
- };
-
- type = g_type_register_static (
- E_TYPE_ATTACHMENT_HANDLER,
- "EAttachmentHandlerMail", &type_info, 0);
- }
-
- return type;
-}
diff --git a/mail/e-attachment-handler-mail.h b/mail/e-attachment-handler-mail.h
deleted file mode 100644
index c62ea99cab..0000000000
--- a/mail/e-attachment-handler-mail.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * e-attachment-handler-mail.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_ATTACHMENT_HANDLER_MAIL_H
-#define E_ATTACHMENT_HANDLER_MAIL_H
-
-#include <widgets/misc/e-attachment-handler.h>
-
-/* Standard GObject macros */
-#define E_TYPE_ATTACHMENT_HANDLER_MAIL \
- (e_attachment_handler_mail_get_type ())
-#define E_ATTACHMENT_HANDLER_MAIL(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), E_TYPE_ATTACHMENT_HANDLER_MAIL, EAttachmentHandlerMail))
-#define E_ATTACHMENT_HANDLER_MAIL_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), E_TYPE_ATTACHMENT_HANDLER_MAIL, EAttachmentHandlerMailClass))
-#define E_IS_ATTACHMENT_HANDLER_MAIL(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), E_TYPE_ATTACHMENT_HANDLER_MAIL))
-#define E_IS_ATTACHMENT_HANDLER_MAIL_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_TYPE \
- ((cls), E_TYPE_ATTACHMENT_HANDLER_MAIL))
-#define E_ATTACHMENT_HANDLER_MAIL_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS \
- ((obj), E_TYPE_ATTACHMENT_HANDLER_MAIL, EAttachmentHandlerMailClass))
-
-G_BEGIN_DECLS
-
-typedef struct _EAttachmentHandlerMail EAttachmentHandlerMail;
-typedef struct _EAttachmentHandlerMailClass EAttachmentHandlerMailClass;
-typedef struct _EAttachmentHandlerMailPrivate EAttachmentHandlerMailPrivate;
-
-struct _EAttachmentHandlerMail {
- EAttachmentHandler parent;
- EAttachmentHandlerMailPrivate *priv;
-};
-
-struct _EAttachmentHandlerMailClass {
- EAttachmentHandlerClass parent_class;
-};
-
-GType e_attachment_handler_mail_get_type (void);
-
-G_END_DECLS
-
-#endif /* E_ATTACHMENT_HANDLER_MAIL_H */
diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
index e4013c5004..1dd3fae587 100644
--- a/mail/e-mail-browser.c
+++ b/mail/e-mail-browser.c
@@ -32,7 +32,6 @@
#include "mail/e-mail-reader.h"
#include "mail/e-mail-reader-utils.h"
#include "mail/e-mail-search-bar.h"
-#include "mail/e-mail-shell-backend.h"
#include "mail/em-folder-tree-model.h"
#include "mail/em-format-html-display.h"
#include "mail/message-list.h"
@@ -705,14 +704,13 @@ e_mail_browser_get_type (void)
}
GtkWidget *
-e_mail_browser_new (EMailShellBackend *mail_shell_backend)
+e_mail_browser_new (EShellBackend *shell_backend)
{
- g_return_val_if_fail (
- E_IS_MAIL_SHELL_BACKEND (mail_shell_backend), NULL);
+ g_return_val_if_fail (E_IS_SHELL_BACKEND (shell_backend), NULL);
return g_object_new (
E_TYPE_MAIL_BROWSER,
- "shell-backend", mail_shell_backend, NULL);
+ "shell-backend", shell_backend, NULL);
}
void
diff --git a/mail/e-mail-browser.h b/mail/e-mail-browser.h
index 2605b2e04c..f2fd4d9131 100644
--- a/mail/e-mail-browser.h
+++ b/mail/e-mail-browser.h
@@ -23,7 +23,7 @@
#define E_MAIL_BROWSER_H
#include <gtk/gtk.h>
-#include <mail/e-mail-shell-backend.h>
+#include <shell/e-shell-backend.h>
/* Standard GObject macros */
#define E_TYPE_MAIL_BROWSER \
@@ -60,7 +60,7 @@ struct _EMailBrowserClass {
};
GType e_mail_browser_get_type (void);
-GtkWidget * e_mail_browser_new (EMailShellBackend *mail_shell_backend);
+GtkWidget * e_mail_browser_new (EShellBackend *shell_backend);
void e_mail_browser_close (EMailBrowser *browser);
gboolean e_mail_browser_get_show_deleted (EMailBrowser *browser);
void e_mail_browser_set_show_deleted (EMailBrowser *browser,
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index f0999be97e..b9bde5b370 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -190,7 +190,6 @@ e_mail_reader_mark_selected (EMailReader *reader,
guint
e_mail_reader_open_selected (EMailReader *reader)
{
- EMailShellBackend *mail_shell_backend;
EShellBackend *shell_backend;
MessageList *message_list;
CamelFolder *folder;
@@ -206,8 +205,6 @@ e_mail_reader_open_selected (EMailReader *reader)
shell_backend = e_mail_reader_get_shell_backend (reader);
window = e_mail_reader_get_window (reader);
- mail_shell_backend = E_MAIL_SHELL_BACKEND (shell_backend);
-
folder = message_list->folder;
folder_uri = message_list->folder_uri;
uids = message_list_get_selected (message_list);
@@ -280,7 +277,7 @@ e_mail_reader_open_selected (EMailReader *reader)
const gchar *uid = views->pdata[ii];
GtkWidget *browser;
- browser = e_mail_browser_new (mail_shell_backend);
+ browser = e_mail_browser_new (shell_backend);
e_mail_reader_set_folder (
E_MAIL_READER (browser), folder, folder_uri);
e_mail_reader_set_message (
@@ -405,9 +402,6 @@ e_mail_reader_reply_to_message (EMailReader *reader,
uid = message_list->cursor_uid;
g_return_if_fail (uid != NULL);
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
if (!gtk_html_command (html, "is-selection-active"))
goto whole_message;
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index a58e0acd46..6d680aebe1 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -40,7 +40,6 @@
#include "mail/e-mail-browser.h"
#include "mail/e-mail-display.h"
#include "mail/e-mail-reader-utils.h"
-#include "mail/e-mail-shell-backend.h"
#include "mail/em-composer-utils.h"
#include "mail/em-event.h"
#include "mail/em-folder-selector.h"
@@ -342,9 +341,6 @@ action_mail_forward_cb (GtkAction *action,
message_list = e_mail_reader_get_message_list (reader);
window = e_mail_reader_get_window (reader);
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
folder = message_list->folder;
folder_uri = message_list->folder_uri;
uids = message_list_get_selected (message_list);
@@ -365,9 +361,6 @@ action_mail_forward_attached_cb (GtkAction *action,
message_list = e_mail_reader_get_message_list (reader);
window = e_mail_reader_get_window (reader);
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
folder = message_list->folder;
folder_uri = message_list->folder_uri;
uids = message_list_get_selected (message_list);
@@ -388,9 +381,6 @@ action_mail_forward_inline_cb (GtkAction *action,
message_list = e_mail_reader_get_message_list (reader);
window = e_mail_reader_get_window (reader);
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
folder = message_list->folder;
folder_uri = message_list->folder_uri;
uids = message_list_get_selected (message_list);
@@ -411,9 +401,6 @@ action_mail_forward_quoted_cb (GtkAction *action,
message_list = e_mail_reader_get_message_list (reader);
window = e_mail_reader_get_window (reader);
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
folder = message_list->folder;
folder_uri = message_list->folder_uri;
uids = message_list_get_selected (message_list);
@@ -517,9 +504,6 @@ action_mail_message_edit_cb (GtkAction *action,
window = e_mail_reader_get_window (reader);
message_list = e_mail_reader_get_message_list (reader);
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
folder = message_list->folder;
uids = message_list_get_selected (message_list);
@@ -536,9 +520,6 @@ action_mail_message_new_cb (GtkAction *action,
message_list = e_mail_reader_get_message_list (reader);
window = e_mail_reader_get_window (reader);
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
em_utils_compose_new_message (message_list->folder_uri);
}
@@ -746,9 +727,6 @@ action_mail_redirect_cb (GtkAction *action,
uid = message_list->cursor_uid;
g_return_if_fail (uid != NULL);
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
em_utils_redirect_message_by_uid (folder, uid);
}
@@ -861,7 +839,6 @@ action_mail_show_source_cb (GtkAction *action,
EMailReader *reader)
{
EMFormatHTMLDisplay *html_display;
- EMailShellBackend *mail_shell_backend;
EShellBackend *shell_backend;
MessageList *message_list;
CamelFolder *folder;
@@ -871,14 +848,13 @@ action_mail_show_source_cb (GtkAction *action,
message_list = e_mail_reader_get_message_list (reader);
shell_backend = e_mail_reader_get_shell_backend (reader);
- mail_shell_backend = E_MAIL_SHELL_BACKEND (shell_backend);
folder = message_list->folder;
folder_uri = message_list->folder_uri;
uids = message_list_get_selected (message_list);
g_return_if_fail (uids->len > 0);
- browser = e_mail_browser_new (mail_shell_backend);
+ browser = e_mail_browser_new (shell_backend);
reader = E_MAIL_READER (browser);
html_display = e_mail_reader_get_html_display (reader);
em_format_set_mode (EM_FORMAT (html_display), EM_FORMAT_SOURCE);
@@ -2251,6 +2227,8 @@ e_mail_reader_check_state (EMailReader *reader)
can_flag_for_followup = TRUE;
}
+ if (em_utils_check_user_can_send_mail ())
+ state |= E_MAIL_READER_HAVE_ACCOUNT;
if (uids->len == 1)
state |= E_MAIL_READER_SELECTION_SINGLE;
if (uids->len > 1)
@@ -2284,8 +2262,6 @@ e_mail_reader_check_state (EMailReader *reader)
if (has_unread)
state |= E_MAIL_READER_SELECTION_HAS_UNREAD;
#if 0 /* FIXME */
- if (has_callto_uri)
- state |= E_MAIL_READER_SELECTION_HAS_URI_CALLTO;
if (has_http_uri)
state |= E_MAIL_READER_SELECTION_HAS_URI_HTTP;
if (has_mailto_uri)
@@ -2318,7 +2294,7 @@ e_mail_reader_update_actions (EMailReader *reader)
gboolean enable_flag_clear;
gboolean enable_flag_completed;
gboolean enable_flag_for_followup;
- gboolean single_message_selected;
+ gboolean have_an_account;
gboolean multiple_messages_selected;
gboolean selection_has_deleted_messages;
gboolean selection_has_important_messages;
@@ -2329,6 +2305,7 @@ e_mail_reader_update_actions (EMailReader *reader)
gboolean selection_has_unimportant_messages;
gboolean selection_has_unread_messages;
gboolean selection_is_mailing_list;
+ gboolean single_message_selected;
g_return_if_fail (E_IS_MAIL_READER (reader));
@@ -2342,6 +2319,8 @@ e_mail_reader_update_actions (EMailReader *reader)
disable_printing = e_shell_settings_get_boolean (
shell_settings, "disable-printing");
+ have_an_account =
+ (state & E_MAIL_READER_HAVE_ACCOUNT);
single_message_selected =
(state & E_MAIL_READER_SELECTION_SINGLE);
multiple_messages_selected =
@@ -2397,22 +2376,22 @@ e_mail_reader_update_actions (EMailReader *reader)
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-forward";
- sensitive = any_messages_selected;
+ sensitive = have_an_account && any_messages_selected;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-forward-attached";
- sensitive = any_messages_selected;
+ sensitive = have_an_account && any_messages_selected;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-forward-inline";
- sensitive = single_message_selected;
+ sensitive = have_an_account && single_message_selected;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-forward-quoted";
- sensitive = single_message_selected;
+ sensitive = have_an_account && single_message_selected;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
@@ -2452,7 +2431,12 @@ e_mail_reader_update_actions (EMailReader *reader)
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-message-edit";
- sensitive = single_message_selected;
+ sensitive = have_an_account && single_message_selected;
+ action = e_mail_reader_get_action (reader, action_name);
+ gtk_action_set_sensitive (action, sensitive);
+
+ action_name = "mail-message-new";
+ sensitive = have_an_account;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
@@ -2502,22 +2486,23 @@ e_mail_reader_update_actions (EMailReader *reader)
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-redirect";
- sensitive = single_message_selected;
+ sensitive = have_an_account && single_message_selected;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-reply-all";
- sensitive = single_message_selected;
+ sensitive = have_an_account && single_message_selected;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-reply-list";
- sensitive = single_message_selected && selection_is_mailing_list;
+ sensitive = have_an_account && single_message_selected &&
+ selection_is_mailing_list;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
action_name = "mail-reply-sender";
- sensitive = single_message_selected;
+ sensitive = have_an_account && single_message_selected;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
diff --git a/mail/e-mail-reader.h b/mail/e-mail-reader.h
index c55ba92abd..08d6f23e51 100644
--- a/mail/e-mail-reader.h
+++ b/mail/e-mail-reader.h
@@ -56,22 +56,22 @@ typedef struct _EMailReader EMailReader;
typedef struct _EMailReaderIface EMailReaderIface;
enum {
- E_MAIL_READER_SELECTION_SINGLE = 1 << 0,
- E_MAIL_READER_SELECTION_MULTIPLE = 1 << 1,
- E_MAIL_READER_SELECTION_CAN_ADD_SENDER = 1 << 2,
- E_MAIL_READER_SELECTION_CAN_EDIT = 1 << 3,
- E_MAIL_READER_SELECTION_FLAG_CLEAR = 1 << 4,
- E_MAIL_READER_SELECTION_FLAG_COMPLETED = 1 << 5,
- E_MAIL_READER_SELECTION_FLAG_FOLLOWUP = 1 << 6,
- E_MAIL_READER_SELECTION_HAS_DELETED = 1 << 7,
- E_MAIL_READER_SELECTION_HAS_IMPORTANT = 1 << 8,
- E_MAIL_READER_SELECTION_HAS_JUNK = 1 << 9,
- E_MAIL_READER_SELECTION_HAS_NOT_JUNK = 1 << 10,
- E_MAIL_READER_SELECTION_HAS_READ = 1 << 11,
- E_MAIL_READER_SELECTION_HAS_UNDELETED = 1 << 12,
- E_MAIL_READER_SELECTION_HAS_UNIMPORTANT = 1 << 13,
- E_MAIL_READER_SELECTION_HAS_UNREAD = 1 << 14,
- E_MAIL_READER_SELECTION_HAS_URI_CALLTO = 1 << 15,
+ E_MAIL_READER_HAVE_ACCOUNT = 1 << 0,
+ E_MAIL_READER_SELECTION_SINGLE = 1 << 1,
+ E_MAIL_READER_SELECTION_MULTIPLE = 1 << 2,
+ E_MAIL_READER_SELECTION_CAN_ADD_SENDER = 1 << 3,
+ E_MAIL_READER_SELECTION_CAN_EDIT = 1 << 4,
+ E_MAIL_READER_SELECTION_FLAG_CLEAR = 1 << 5,
+ E_MAIL_READER_SELECTION_FLAG_COMPLETED = 1 << 6,
+ E_MAIL_READER_SELECTION_FLAG_FOLLOWUP = 1 << 7,
+ E_MAIL_READER_SELECTION_HAS_DELETED = 1 << 8,
+ E_MAIL_READER_SELECTION_HAS_IMPORTANT = 1 << 9,
+ E_MAIL_READER_SELECTION_HAS_JUNK = 1 << 10,
+ E_MAIL_READER_SELECTION_HAS_NOT_JUNK = 1 << 11,
+ E_MAIL_READER_SELECTION_HAS_READ = 1 << 12,
+ E_MAIL_READER_SELECTION_HAS_UNDELETED = 1 << 13,
+ E_MAIL_READER_SELECTION_HAS_UNIMPORTANT = 1 << 14,
+ E_MAIL_READER_SELECTION_HAS_UNREAD = 1 << 15,
E_MAIL_READER_SELECTION_HAS_URI_HTTP = 1 << 16,
E_MAIL_READER_SELECTION_HAS_URI_MAILTO = 1 << 17,
E_MAIL_READER_SELECTION_IS_MAILING_LIST = 1 << 18
diff --git a/mail/e-mail-shell-backend.c b/mail/e-mail-shell-backend.c
deleted file mode 100644
index 906312ccff..0000000000
--- a/mail/e-mail-shell-backend.c
+++ /dev/null
@@ -1,766 +0,0 @@
-/*
- * e-mail-shell-backend.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-backend.h"
-
-#include <glib/gi18n.h>
-#include <camel/camel-disco-store.h>
-#include <camel/camel-offline-store.h>
-#include <camel/camel-session.h>
-#include <camel/camel-url.h>
-
-#include "e-util/e-account-utils.h"
-#include "e-util/e-binding.h"
-#include "e-util/e-import.h"
-#include "e-util/e-util.h"
-#include "shell/e-shell.h"
-#include "shell/e-shell-window.h"
-#include "composer/e-msg-composer.h"
-#include "widgets/misc/e-preferences-window.h"
-
-#include "e-mail-shell-migrate.h"
-#include "e-mail-shell-settings.h"
-#include "e-mail-shell-sidebar.h"
-#include "e-mail-shell-view.h"
-
-#include "e-attachment-handler-mail.h"
-#include "e-mail-browser.h"
-#include "e-mail-reader.h"
-#include "e-mail-store.h"
-#include "em-account-prefs.h"
-#include "em-composer-prefs.h"
-#include "em-composer-utils.h"
-#include "em-config.h"
-#include "em-event.h"
-#include "em-folder-utils.h"
-#include "em-format-hook.h"
-#include "em-format-html-display.h"
-#include "em-junk-hook.h"
-#include "em-mailer-prefs.h"
-#include "em-network-prefs.h"
-#include "em-utils.h"
-#include "mail-config.h"
-#include "mail-ops.h"
-#include "mail-send-recv.h"
-#include "mail-session.h"
-#include "mail-vfolder.h"
-#include "importers/mail-importer.h"
-
-#define E_MAIL_SHELL_BACKEND_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE \
- ((obj), E_TYPE_MAIL_SHELL_BACKEND, EMailShellBackendPrivate))
-
-#define BACKEND_NAME "mail"
-
-struct _EMailShellBackendPrivate {
- gint mail_sync_in_progress;
- guint mail_sync_timeout_source_id;
-};
-
-/* XXX Make this a preprocessor definition. */
-const gchar *x_mailer = "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT;
-
-static gpointer parent_class;
-static GType mail_shell_backend_type;
-
-/* XXX So many things need the shell backend that it's
- * just easier for now to make it globally available.
- * We should fix this, though. */
-EMailShellBackend *global_mail_shell_backend = NULL;
-
-extern gint camel_application_is_exiting;
-
-static void
-mail_shell_backend_init_hooks (void)
-{
- e_plugin_hook_register_type (em_config_hook_get_type ());
- e_plugin_hook_register_type (em_event_hook_get_type ());
- e_plugin_hook_register_type (em_junk_hook_get_type ());
-
- /* EMFormat classes must be registered before EMFormatHook. */
- em_format_hook_register_type (em_format_get_type ());
- em_format_hook_register_type (em_format_html_get_type ());
- em_format_hook_register_type (em_format_html_display_get_type ());
- e_plugin_hook_register_type (em_format_hook_get_type ());
-
- em_junk_hook_register_type (emj_get_type ());
-}
-
-static void
-mail_shell_backend_init_importers (void)
-{
- EImportClass *import_class;
- EImportImporter *importer;
-
- import_class = g_type_class_ref (e_import_get_type ());
-
- importer = mbox_importer_peek ();
- e_import_class_add_importer (import_class, importer, NULL, NULL);
-
- importer = elm_importer_peek ();
- e_import_class_add_importer (import_class, importer, NULL, NULL);
-
- importer = pine_importer_peek ();
- e_import_class_add_importer (import_class, importer, NULL, NULL);
-}
-
-static void
-mail_shell_backend_mail_icon_cb (EShellWindow *shell_window,
- const gchar *icon_name)
-{
- GtkAction *action;
-
- action = e_shell_window_get_shell_view_action (
- shell_window, BACKEND_NAME);
- g_object_set (action, "icon-name", icon_name, NULL);
-}
-
-static void
-action_mail_folder_new_cb (GtkAction *action,
- EShellWindow *shell_window)
-{
- EMFolderTree *folder_tree = NULL;
- EMailShellSidebar *mail_shell_sidebar;
- EShellSidebar *shell_sidebar;
- EShellView *shell_view;
- const gchar *view_name;
-
- /* Take care not to unnecessarily load the mail shell view. */
- view_name = e_shell_window_get_active_view (shell_window);
- if (g_strcmp0 (view_name, BACKEND_NAME) != 0)
- goto exit;
-
- shell_view = e_shell_window_get_shell_view (shell_window, view_name);
- shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
-
- mail_shell_sidebar = E_MAIL_SHELL_SIDEBAR (shell_sidebar);
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
-
-exit:
- em_folder_utils_create_folder (
- NULL, folder_tree, GTK_WINDOW (shell_window));
-}
-
-static void
-action_mail_message_new_cb (GtkAction *action,
- EShellWindow *shell_window)
-{
- GtkWindow *window = GTK_WINDOW (shell_window);
- EMailShellSidebar *mail_shell_sidebar;
- EShellSidebar *shell_sidebar;
- EShellView *shell_view;
- EMFolderTree *folder_tree;
- const gchar *view_name;
- gchar *uri = NULL;
-
- if (!em_utils_check_user_can_send_mail (window))
- return;
-
- /* Take care not to unnecessarily load the mail shell view. */
- view_name = e_shell_window_get_active_view (shell_window);
- if (g_strcmp0 (view_name, BACKEND_NAME) != 0)
- goto exit;
-
- shell_view = e_shell_window_get_shell_view (shell_window, view_name);
- shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
-
- mail_shell_sidebar = E_MAIL_SHELL_SIDEBAR (shell_sidebar);
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- uri = em_folder_tree_get_selected_uri (folder_tree);
-
-exit:
- em_utils_compose_new_message (uri);
-
- g_free (uri);
-}
-
-static GtkActionEntry item_entries[] = {
-
- { "mail-message-new",
- "mail-message-new",
- NC_("New", "_Mail Message"),
- "<Shift><Control>m",
- N_("Compose a new mail message"),
- G_CALLBACK (action_mail_message_new_cb) }
-};
-
-static GtkActionEntry source_entries[] = {
-
- { "mail-folder-new",
- "folder-new",
- NC_("New", "Mail _Folder"),
- NULL,
- N_("Create a new mail folder"),
- G_CALLBACK (action_mail_folder_new_cb) }
-};
-
-static void
-mail_shell_backend_init_preferences (EShell *shell)
-{
- EAccountList *account_list;
- GtkWidget *preferences_window;
-
- account_list = e_get_account_list ();
- preferences_window = e_shell_get_preferences_window (shell);
-
- e_preferences_window_add_page (
- E_PREFERENCES_WINDOW (preferences_window),
- "mail-accounts",
- "preferences-mail-accounts",
- _("Mail Accounts"),
- em_account_prefs_new (account_list),
- 100);
-
- e_preferences_window_add_page (
- E_PREFERENCES_WINDOW (preferences_window),
- "mail",
- "preferences-mail",
- _("Mail Preferences"),
- em_mailer_prefs_new (shell),
- 300);
-
- e_preferences_window_add_page (
- E_PREFERENCES_WINDOW (preferences_window),
- "composer",
- "preferences-composer",
- _("Composer Preferences"),
- em_composer_prefs_new (shell),
- 400);
-
- e_preferences_window_add_page (
- E_PREFERENCES_WINDOW (preferences_window),
- "system-network-proxy",
- "preferences-system-network-proxy",
- _("Network Preferences"),
- em_network_prefs_new (),
- 500);
-}
-
-static void
-mail_shell_backend_sync_store_done_cb (CamelStore *store,
- gpointer user_data)
-{
- EMailShellBackend *mail_shell_backend = user_data;
-
- mail_shell_backend->priv->mail_sync_in_progress--;
-}
-
-static void
-mail_shell_backend_sync_store_cb (CamelStore *store,
- EMailShellBackend *mail_shell_backend)
-{
- if (!camel_application_is_exiting) {
- mail_shell_backend->priv->mail_sync_in_progress++;
- mail_sync_store (
- store, FALSE,
- mail_shell_backend_sync_store_done_cb,
- mail_shell_backend);
- }
-}
-
-static gboolean
-mail_shell_backend_mail_sync (EMailShellBackend *mail_shell_backend)
-{
- if (camel_application_is_exiting)
- return FALSE;
-
- if (mail_shell_backend->priv->mail_sync_in_progress)
- goto exit;
-
- if (session == NULL || !camel_session_is_online (session))
- goto exit;
-
- e_mail_store_foreach (
- (GHFunc) mail_shell_backend_sync_store_cb,
- mail_shell_backend);
-
-exit:
- return !camel_application_is_exiting;
-}
-
-static void
-mail_shell_backend_notify_online_cb (EShell *shell,
- GParamSpec *pspec,
- EShellBackend *shell_backend)
-{
- gboolean online;
-
- online = e_shell_get_online (shell);
- camel_session_set_online (session, online);
-}
-
-static void
-mail_shell_backend_handle_email_uri_cb (gchar *folder_uri,
- CamelFolder *folder,
- gpointer user_data)
-{
- EMailShellBackend *mail_shell_backend = user_data;
- CamelURL *url = user_data;
- const gchar *forward;
- const gchar *reply;
- const gchar *uid;
-
- if (folder == NULL) {
- g_warning ("Could not open folder '%s'", folder_uri);
- goto exit;
- }
-
- forward = camel_url_get_param (url, "forward");
- reply = camel_url_get_param (url, "reply");
- uid = camel_url_get_param (url, "uid");
-
- if (reply != NULL) {
- gint mode;
-
- if (g_strcmp0 (reply, "all") == 0)
- mode = REPLY_MODE_ALL;
- else if (g_strcmp0 (reply, "list") == 0)
- mode = REPLY_MODE_LIST;
- else
- mode = REPLY_MODE_SENDER;
-
- em_utils_reply_to_message (folder, uid, NULL, mode, NULL);
-
- } else if (forward != NULL) {
- GPtrArray *uids;
-
- uids = g_ptr_array_new ();
- g_ptr_array_add (uids, g_strdup (uid));
-
- if (g_strcmp0 (forward, "attached") == 0)
- em_utils_forward_attached (folder, uids, folder_uri);
- else if (g_strcmp0 (forward, "inline") == 0)
- em_utils_forward_inline (folder, uids, folder_uri);
- else if (g_strcmp0 (forward, "quoted") == 0)
- em_utils_forward_quoted (folder, uids, folder_uri);
- else
- em_utils_forward_messages (folder, uids, folder_uri);
-
- } else {
- GtkWidget *browser;
-
- /* FIXME Should pass in the shell module. */
- browser = e_mail_browser_new (mail_shell_backend);
- e_mail_reader_set_folder (
- E_MAIL_READER (browser), folder, folder_uri);
- e_mail_reader_set_message (
- E_MAIL_READER (browser), uid, FALSE);
- gtk_widget_show (browser);
- }
-
-exit:
- camel_url_free (url);
-}
-
-static gboolean
-mail_shell_backend_handle_uri_cb (EShell *shell,
- const gchar *uri,
- EMailShellBackend *mail_shell_backend)
-{
- gboolean handled = TRUE;
-
- if (g_str_has_prefix (uri, "mailto:")) {
- if (em_utils_check_user_can_send_mail (NULL))
- em_utils_compose_new_message_with_mailto (uri, NULL);
-
- } else if (g_str_has_prefix (uri, "email:")) {
- CamelURL *url;
-
- url = camel_url_new (uri, NULL);
- if (camel_url_get_param (url, "uid") != NULL) {
- gchar *curi = em_uri_to_camel (uri);
-
- mail_get_folder (
- curi, 0,
- mail_shell_backend_handle_email_uri_cb,
- mail_shell_backend, mail_msg_unordered_push);
- g_free (curi);
-
- } else {
- g_warning ("Email URI's must include a uid parameter");
- camel_url_free (url);
- }
- } else
- handled = FALSE;
-
- return TRUE;
-}
-
-/* Helper for mail_shell_backend_prepare_for_[off|on]line_cb() */
-static void
-mail_shell_store_line_transition_done_cb (CamelStore *store,
- gpointer user_data)
-{
- EActivity *activity = user_data;
-
- g_object_unref (activity);
-}
-
-/* Helper for mail_shell_backend_prepare_for_offline_cb() */
-static void
-mail_shell_store_prepare_for_offline_cb (CamelService *service,
- gpointer unused,
- EActivity *activity)
-{
- if (CAMEL_IS_DISCO_STORE (service) || CAMEL_IS_OFFLINE_STORE (service))
- mail_store_set_offline (
- CAMEL_STORE (service), TRUE,
- mail_shell_store_line_transition_done_cb,
- g_object_ref (activity));
-}
-
-static void
-mail_shell_backend_prepare_for_offline_cb (EShell *shell,
- EActivity *activity,
- EMailShellBackend *mail_shell_backend)
-{
- GList *watched_windows;
- GtkWidget *parent = NULL;
- gboolean synchronize = FALSE;
-
- watched_windows = e_shell_get_watched_windows (shell);
- if (watched_windows != NULL)
- parent = GTK_WIDGET (watched_windows->data);
-
- if (e_shell_get_network_available (shell))
- synchronize = em_utils_prompt_user (
- GTK_WINDOW (parent),
- "/apps/evolution/mail/prompts/quick_offline",
- "mail:ask-quick-offline", NULL);
-
- if (!synchronize) {
- mail_cancel_all ();
- camel_session_set_network_state (session, FALSE);
- }
-
- e_mail_store_foreach (
- (GHFunc) mail_shell_store_prepare_for_offline_cb, activity);
-}
-
-/* Helper for mail_shell_backend_prepare_for_online_cb() */
-static void
-mail_shell_store_prepare_for_online_cb (CamelService *service,
- gpointer unused,
- EActivity *activity)
-{
- if (CAMEL_IS_DISCO_STORE (service) || CAMEL_IS_OFFLINE_STORE (service))
- mail_store_set_offline (
- CAMEL_STORE (service), FALSE,
- mail_shell_store_line_transition_done_cb,
- g_object_ref (activity));
-}
-
-static void
-mail_shell_backend_prepare_for_online_cb (EShell *shell,
- EActivity *activity,
- EMailShellBackend *mail_shell_backend)
-{
- camel_session_set_online (session, TRUE);
-
- e_mail_store_foreach (
- (GHFunc) mail_shell_store_prepare_for_online_cb, activity);
-}
-
-static void
-mail_shell_backend_send_receive_cb (EShell *shell,
- GtkWindow *parent,
- EShellBackend *shell_backend)
-{
- em_utils_clear_get_password_canceled_accounts_flag ();
- mail_send_receive (parent);
-}
-
-static void
-mail_shell_backend_window_weak_notify_cb (EShell *shell,
- GObject *where_the_object_was)
-{
- g_signal_handlers_disconnect_by_func (
- shell, mail_shell_backend_mail_icon_cb,
- where_the_object_was);
-}
-
-static void
-mail_shell_backend_window_created_cb (EShell *shell,
- GtkWindow *window,
- EShellBackend *shell_backend)
-{
- EShellSettings *shell_settings;
- static gboolean first_time = TRUE;
- const gchar *backend_name;
-
- shell_settings = e_shell_get_shell_settings (shell);
-
- /* This applies to both the composer and signature editor. */
- if (GTKHTML_IS_EDITOR (window)) {
- GList *spell_languages;
-
- e_binding_new (
- G_OBJECT (shell_settings), "composer-inline-spelling",
- G_OBJECT (window), "inline-spelling");
-
- e_binding_new (
- G_OBJECT (shell_settings), "composer-magic-links",
- G_OBJECT (window), "magic-links");
-
- e_binding_new (
- G_OBJECT (shell_settings), "composer-magic-smileys",
- G_OBJECT (window), "magic-smileys");
-
- spell_languages = e_load_spell_languages ();
- gtkhtml_editor_set_spell_languages (
- GTKHTML_EDITOR (window), spell_languages);
- g_list_free (spell_languages);
- }
-
- if (E_IS_MSG_COMPOSER (window)) {
- /* Integrate the new composer into the mail module. */
- em_configure_new_composer (E_MSG_COMPOSER (window));
- return;
- }
-
- if (!E_IS_SHELL_WINDOW (window))
- return;
-
- backend_name = E_SHELL_BACKEND_GET_CLASS (shell_backend)->name;
-
- e_shell_window_register_new_item_actions (
- E_SHELL_WINDOW (window), backend_name,
- item_entries, G_N_ELEMENTS (item_entries));
-
- e_shell_window_register_new_source_actions (
- E_SHELL_WINDOW (window), backend_name,
- source_entries, G_N_ELEMENTS (source_entries));
-
- g_signal_connect_swapped (
- shell, "event::mail-icon",
- G_CALLBACK (mail_shell_backend_mail_icon_cb), window);
-
- g_object_weak_ref (
- G_OBJECT (window), (GWeakNotify)
- mail_shell_backend_window_weak_notify_cb, shell);
-
- if (first_time) {
- g_signal_connect (
- window, "map-event",
- G_CALLBACK (e_msg_composer_check_autosave), NULL);
- first_time = FALSE;
- }
-}
-
-static void
-mail_shell_backend_constructed (GObject *object)
-{
- EMailShellBackendPrivate *priv;
- EShell *shell;
- EShellBackend *shell_backend;
- const gchar *data_dir;
-
- priv = E_MAIL_SHELL_BACKEND_GET_PRIVATE (object);
-
- shell_backend = E_SHELL_BACKEND (object);
- shell = e_shell_backend_get_shell (shell_backend);
-
- /* This also initializes Camel, so it needs to happen early. */
- mail_session_init (E_MAIL_SHELL_BACKEND (shell_backend));
-
- mail_shell_backend_init_hooks ();
- mail_shell_backend_init_importers ();
-
- e_attachment_handler_mail_get_type ();
-
- /* XXX This never gets unreffed. */
- global_mail_shell_backend = g_object_ref (shell_backend);
-
- g_signal_connect (
- shell, "notify::online",
- G_CALLBACK (mail_shell_backend_notify_online_cb),
- shell_backend);
-
- g_signal_connect (
- shell, "handle-uri",
- G_CALLBACK (mail_shell_backend_handle_uri_cb),
- shell_backend);
-
- g_signal_connect (
- shell, "prepare-for-offline",
- G_CALLBACK (mail_shell_backend_prepare_for_offline_cb),
- shell_backend);
-
- g_signal_connect (
- shell, "prepare-for-online",
- G_CALLBACK (mail_shell_backend_prepare_for_online_cb),
- shell_backend);
-
- g_signal_connect (
- shell, "send-receive",
- G_CALLBACK (mail_shell_backend_send_receive_cb),
- shell_backend);
-
- g_signal_connect (
- shell, "window-created",
- G_CALLBACK (mail_shell_backend_window_created_cb),
- shell_backend);
-
- mail_config_init ();
- mail_msg_init ();
-
- data_dir = e_shell_backend_get_data_dir (shell_backend);
- e_mail_store_init (data_dir);
-
- /* Initialize settings before initializing preferences,
- * since the preferences bind to the shell settings. */
- e_mail_shell_settings_init (shell);
- mail_shell_backend_init_preferences (shell);
-}
-
-static void
-mail_shell_backend_start (EShellBackend *shell_backend)
-{
- EMailShellBackendPrivate *priv;
- EShell *shell;
- EShellSettings *shell_settings;
- gboolean enable_search_folders;
-
- priv = E_MAIL_SHELL_BACKEND_GET_PRIVATE (shell_backend);
-
- shell = e_shell_backend_get_shell (shell_backend);
- shell_settings = e_shell_get_shell_settings (shell);
-
- /* XXX Do we really still need this flag? */
- mail_session_set_interactive (TRUE);
-
- enable_search_folders = e_shell_settings_get_boolean (
- shell_settings, "mail-enable-search-folders");
- if (enable_search_folders)
- vfolder_load_storage ();
-
- mail_autoreceive_init (shell_backend, session);
-
- if (g_getenv ("CAMEL_FLUSH_CHANGES") != NULL)
- priv->mail_sync_timeout_source_id = g_timeout_add_seconds (
- mail_config_get_sync_timeout (),
- (GSourceFunc) mail_shell_backend_mail_sync,
- shell_backend);
-}
-
-static void
-mail_shell_backend_class_init (EMailShellBackendClass *class)
-{
- GObjectClass *object_class;
- EShellBackendClass *shell_backend_class;
-
- parent_class = g_type_class_peek_parent (class);
- g_type_class_add_private (class, sizeof (EMailShellBackendPrivate));
-
- object_class = G_OBJECT_CLASS (class);
- object_class->constructed = mail_shell_backend_constructed;
-
- shell_backend_class = E_SHELL_BACKEND_CLASS (class);
- shell_backend_class->shell_view_type = E_TYPE_MAIL_SHELL_VIEW;
- shell_backend_class->name = BACKEND_NAME;
- shell_backend_class->aliases = "";
- shell_backend_class->schemes = "mailto:email";
- shell_backend_class->sort_order = 200;
- shell_backend_class->start = mail_shell_backend_start;
- shell_backend_class->is_busy = NULL;
- shell_backend_class->shutdown = NULL;
- shell_backend_class->migrate = e_mail_shell_migrate;
-}
-
-static void
-mail_shell_backend_init (EMailShellBackend *mail_shell_backend)
-{
- mail_shell_backend->priv =
- E_MAIL_SHELL_BACKEND_GET_PRIVATE (mail_shell_backend);
-}
-
-GType
-e_mail_shell_backend_get_type (void)
-{
- return mail_shell_backend_type;
-}
-
-void
-e_mail_shell_backend_register_type (GTypeModule *type_module)
-{
- const GTypeInfo type_info = {
- sizeof (EMailShellBackendClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) mail_shell_backend_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EMailShellBackend),
- 0, /* n_preallocs */
- (GInstanceInitFunc) mail_shell_backend_init,
- NULL /* value_table */
- };
-
- mail_shell_backend_type = g_type_module_register_type (
- type_module, E_TYPE_SHELL_BACKEND,
- "EMailShellBackend", &type_info, 0);
-}
-
-/******************* Code below here belongs elsewhere. *******************/
-
-#include "filter/filter-option.h"
-#include "shell/e-shell-settings.h"
-#include "mail/e-mail-label-list-store.h"
-
-GSList *
-e_mail_labels_get_filter_options (void)
-{
- EShell *shell;
- EShellSettings *shell_settings;
- EMailLabelListStore *list_store;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GSList *list = NULL;
- gboolean valid;
-
- shell = e_shell_get_default ();
- shell_settings = e_shell_get_shell_settings (shell);
- list_store = e_shell_settings_get_object (
- shell_settings, "mail-label-list-store");
-
- model = GTK_TREE_MODEL (list_store);
- valid = gtk_tree_model_get_iter_first (model, &iter);
-
- while (valid) {
- struct _filter_option *option;
- gchar *name, *tag;
-
- name = e_mail_label_list_store_get_name (list_store, &iter);
- tag = e_mail_label_list_store_get_tag (list_store, &iter);
-
- option = g_new0 (struct _filter_option, 1);
- option->title = e_str_without_underscores (name);
- option->value = tag; /* takes ownership */
-
- g_free (name);
-
- valid = gtk_tree_model_iter_next (model, &iter);
- }
-
- g_object_unref (list_store);
-
- return list;
-}
diff --git a/mail/e-mail-shell-backend.h b/mail/e-mail-shell-backend.h
deleted file mode 100644
index 4bc1a36706..0000000000
--- a/mail/e-mail-shell-backend.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * e-mail-shell-backend.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_MAIL_SHELL_BACKEND_H
-#define E_MAIL_SHELL_BACKEND_H
-
-#include <shell/e-shell-backend.h>
-
-#include <camel/camel-folder.h>
-#include <camel/camel-store.h>
-#include <e-util/e-signature-list.h>
-#include <libedataserver/e-account-list.h>
-
-/* Standard GObject macros */
-#define E_TYPE_MAIL_SHELL_BACKEND \
- (e_mail_shell_backend_get_type ())
-#define E_MAIL_SHELL_BACKEND(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), E_TYPE_MAIL_SHELL_BACKEND, EMailShellBackend))
-#define E_MAIL_SHELL_BACKEND_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), E_TYPE_MAIL_SHELL_BACKEND, EMailShellBackendClass))
-#define E_IS_MAIL_SHELL_BACKEND(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), E_TYPE_MAIL_SHELL_BACKEND))
-#define E_IS_MAIL_SHELL_BACKEND_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_TYPE \
- ((cls), E_TYPE_MAIL_SHELL_BACKEND))
-#define E_MAIL_SHELL_BACKEND_GET_CLASS(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), E_TYPE_MAIL_SHELL_BACKEND, EMailShellBackendClass))
-
-G_BEGIN_DECLS
-
-typedef struct _EMailShellBackend EMailShellBackend;
-typedef struct _EMailShellBackendClass EMailShellBackendClass;
-typedef struct _EMailShellBackendPrivate EMailShellBackendPrivate;
-
-struct _EMailShellBackend {
- EShellBackend parent;
- EMailShellBackendPrivate *priv;
-};
-
-struct _EMailShellBackendClass {
- EShellBackendClass parent_class;
-};
-
-/* Globally available shell backend.
- *
- * XXX I don't like having this globally available but passing it around
- * to all the various utilities that need to access the backend's data
- * directory is too much of a pain for now. */
-extern EMailShellBackend *global_mail_shell_backend;
-
-GType e_mail_shell_backend_get_type (void);
-void e_mail_shell_backend_register_type
- (GTypeModule *type_module);
-
-/* XXX Find a better place for this function. */
-GSList * e_mail_labels_get_filter_options(void);
-
-G_END_DECLS
-
-#endif /* E_MAIL_SHELL_BACKEND_H */
diff --git a/mail/e-mail-shell-content.c b/mail/e-mail-shell-content.c
deleted file mode 100644
index b801093116..0000000000
--- a/mail/e-mail-shell-content.c
+++ /dev/null
@@ -1,1053 +0,0 @@
-/*
- * e-mail-shell-content.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-content.h"
-
-#include <glib/gi18n.h>
-#include <camel/camel-store.h>
-#include <libedataserver/e-data-server-util.h>
-
-#include "e-util/gconf-bridge.h"
-#include "widgets/menus/gal-view-etable.h"
-#include "widgets/menus/gal-view-instance.h"
-
-#include "em-search-context.h"
-#include "em-utils.h"
-#include "mail-config.h"
-#include "mail-ops.h"
-
-#include "e-mail-reader.h"
-#include "e-mail-search-bar.h"
-#include "e-mail-shell-backend.h"
-#include "e-mail-shell-view-actions.h"
-
-#define E_MAIL_SHELL_CONTENT_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE \
- ((obj), E_TYPE_MAIL_SHELL_CONTENT, EMailShellContentPrivate))
-
-#define STATE_KEY_SCROLLBAR_POSITION "ScrollbarPosition"
-#define STATE_KEY_SELECTED_MESSAGE "SelectedMessage"
-
-struct _EMailShellContentPrivate {
- GtkWidget *paned;
- GtkWidget *message_list;
- GtkWidget *search_bar;
-
- EMFormatHTMLDisplay *html_display;
- GalViewInstance *view_instance;
-
- /* ETable scrolling hack */
- gdouble default_scrollbar_position;
-
- guint paned_binding_id;
- guint scroll_timeout_id;
-
- /* Signal handler IDs */
- guint message_list_built_id;
- guint message_list_scrolled_id;
-
- guint preview_visible : 1;
- guint suppress_message_selection : 1;
- guint vertical_view : 1;
- guint show_deleted : 1;
-};
-
-enum {
- PROP_0,
- PROP_PREVIEW_VISIBLE,
- PROP_SHOW_DELETED,
- PROP_VERTICAL_VIEW
-};
-
-static gpointer parent_class;
-static GType mail_shell_content_type;
-
-static void
-mail_shell_content_etree_unfreeze (MessageList *message_list,
- GdkEvent *event)
-{
- ETableItem *item;
- GObject *object;
-
- item = e_tree_get_item (message_list->tree);
- object = G_OBJECT (((GnomeCanvasItem *) item)->canvas);
-
- g_object_set_data (object, "freeze-cursor", 0);
-}
-
-static void
-mail_shell_content_message_list_scrolled_cb (EMailShellContent *mail_shell_content,
- MessageList *message_list)
-{
- EShellContent *shell_content;
- EShellView *shell_view;
- GKeyFile *key_file;
- const gchar *folder_uri;
- const gchar *key;
- gchar *group_name;
- gdouble position;
-
- /* Save the scrollbar position for the current folder. */
-
- folder_uri = message_list->folder_uri;
-
- if (folder_uri == NULL)
- return;
-
- shell_content = E_SHELL_CONTENT (mail_shell_content);
- shell_view = e_shell_content_get_shell_view (shell_content);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- key = STATE_KEY_SCROLLBAR_POSITION;
- group_name = g_strdup_printf ("Folder %s", folder_uri);
- position = message_list_get_scrollbar_position (message_list);
-
- g_key_file_set_double (key_file, group_name, key, position);
- e_shell_view_set_state_dirty (shell_view);
-
- g_free (group_name);
-}
-
-static gboolean
-mail_shell_content_scroll_timeout_cb (EMailShellContent *mail_shell_content)
-{
- EMailShellContentPrivate *priv = mail_shell_content->priv;
- EShellContent *shell_content;
- EShellView *shell_view;
- MessageList *message_list;
- EMailReader *reader;
- GKeyFile *key_file;
- const gchar *folder_uri;
- const gchar *key;
- gchar *group_name;
-
- /* Initialize the scrollbar position for the current folder
- * and setup a callback to handle scrollbar position changes. */
-
- shell_content = E_SHELL_CONTENT (mail_shell_content);
- shell_view = e_shell_content_get_shell_view (shell_content);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- reader = E_MAIL_READER (mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder_uri = message_list->folder_uri;
-
- if (folder_uri == NULL)
- goto skip;
-
- /* Restore the message list scrollbar position. */
-
- key = STATE_KEY_SCROLLBAR_POSITION;
- group_name = g_strdup_printf ("Folder %s", folder_uri);
-
- if (g_key_file_has_key (key_file, group_name, key, NULL)) {
- gdouble position;
-
- position = g_key_file_get_double (
- key_file, group_name, key, NULL);
- message_list_set_scrollbar_position (message_list, position);
- }
-
- g_free (group_name);
-
-skip:
- priv->message_list_scrolled_id = g_signal_connect_swapped (
- message_list, "message-list-scrolled",
- G_CALLBACK (mail_shell_content_message_list_scrolled_cb),
- mail_shell_content);
-
- priv->scroll_timeout_id = 0;
-
- return FALSE;
-}
-
-static void
-mail_shell_content_message_list_built_cb (EMailShellContent *mail_shell_content,
- MessageList *message_list)
-{
- EMailShellContentPrivate *priv = mail_shell_content->priv;
- EShellContent *shell_content;
- EShellView *shell_view;
- GtkScrolledWindow *scrolled_window;
- GtkWidget *vscrollbar;
- GKeyFile *key_file;
- gchar *uid;
-
- g_signal_handler_disconnect (
- message_list, priv->message_list_built_id);
- priv->message_list_built_id = 0;
-
- shell_content = E_SHELL_CONTENT (mail_shell_content);
- shell_view = e_shell_content_get_shell_view (shell_content);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- if (message_list->cursor_uid != NULL)
- uid = NULL;
-
- else if (message_list->folder_uri == NULL)
- uid = NULL;
-
- else if (mail_shell_content->priv->suppress_message_selection)
- uid = NULL;
-
- else {
- const gchar *folder_uri;
- const gchar *key;
- gchar *group_name;
-
- key = STATE_KEY_SELECTED_MESSAGE;
- folder_uri = message_list->folder_uri;
- group_name = g_strdup_printf ("Folder %s", folder_uri);
- uid = g_key_file_get_string (key_file, group_name, key, NULL);
- g_free (group_name);
- }
-
- if (uid != NULL) {
- CamelFolder *folder;
- CamelMessageInfo *info;
-
- folder = message_list->folder;
- info = camel_folder_get_message_info (folder, uid);
- if (info != NULL) {
- EMailReader *reader;
-
- reader = E_MAIL_READER (mail_shell_content);
- e_mail_reader_set_message (reader, uid, TRUE);
- camel_folder_free_message_info (folder, info);
- }
-
- g_free (uid);
- }
-
- /* FIXME This is a gross workaround for an ETable bug that I can't
- * fix (Ximian bug #55303).
- *
- * Since e_canvas_item_region_show_relay() uses a timeout,
- * we have to use a timeout of the same interval but a lower
- * priority. */
- priv->scroll_timeout_id = g_timeout_add_full (
- G_PRIORITY_LOW, 250, (GSourceFunc)
- mail_shell_content_scroll_timeout_cb,
- mail_shell_content, NULL);
-
- /* FIXME This is another ugly hack to hide a side-effect of the
- * previous workaround. */
- scrolled_window = GTK_SCROLLED_WINDOW (message_list);
- vscrollbar = gtk_scrolled_window_get_vscrollbar (scrolled_window);
- g_signal_connect_swapped (
- vscrollbar, "button-press-event",
- G_CALLBACK (mail_shell_content_etree_unfreeze),
- message_list);
-}
-
-static void
-mail_shell_content_display_view_cb (EMailShellContent *mail_shell_content,
- GalView *gal_view)
-{
- EMailReader *reader;
- MessageList *message_list;
-
- reader = E_MAIL_READER (mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- if (GAL_IS_VIEW_ETABLE (gal_view))
- gal_view_etable_attach_tree (
- GAL_VIEW_ETABLE (gal_view), message_list->tree);
-}
-
-static void
-mail_shell_content_message_selected_cb (EMailShellContent *mail_shell_content,
- const gchar *message_uid,
- MessageList *message_list)
-{
- EShellContent *shell_content;
- EShellView *shell_view;
- GKeyFile *key_file;
- const gchar *folder_uri;
- const gchar *key;
- gchar *group_name;
-
- folder_uri = message_list->folder_uri;
-
- /* This also gets triggered when selecting a store name on
- * the sidebar such as "On This Computer", in which case
- * 'folder_uri' will be NULL. */
- if (folder_uri == NULL)
- return;
-
- shell_content = E_SHELL_CONTENT (mail_shell_content);
- shell_view = e_shell_content_get_shell_view (shell_content);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- key = STATE_KEY_SELECTED_MESSAGE;
- group_name = g_strdup_printf ("Folder %s", folder_uri);
-
- if (message_uid != NULL)
- g_key_file_set_string (key_file, group_name, key, message_uid);
- else
- g_key_file_remove_key (key_file, group_name, key, NULL);
- e_shell_view_set_state_dirty (shell_view);
-
- g_free (group_name);
-}
-
-static void
-mail_shell_content_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- switch (property_id) {
- case PROP_PREVIEW_VISIBLE:
- e_mail_shell_content_set_preview_visible (
- E_MAIL_SHELL_CONTENT (object),
- g_value_get_boolean (value));
- return;
-
- case PROP_SHOW_DELETED:
- e_mail_shell_content_set_show_deleted (
- E_MAIL_SHELL_CONTENT (object),
- g_value_get_boolean (value));
- return;
-
- case PROP_VERTICAL_VIEW:
- e_mail_shell_content_set_vertical_view (
- E_MAIL_SHELL_CONTENT (object),
- g_value_get_boolean (value));
- return;
- }
-
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-}
-
-static void
-mail_shell_content_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec)
-{
- switch (property_id) {
- case PROP_PREVIEW_VISIBLE:
- g_value_set_boolean (
- value,
- e_mail_shell_content_get_preview_visible (
- E_MAIL_SHELL_CONTENT (object)));
- return;
-
- case PROP_SHOW_DELETED:
- g_value_set_boolean (
- value,
- e_mail_shell_content_get_show_deleted (
- E_MAIL_SHELL_CONTENT (object)));
- return;
-
- case PROP_VERTICAL_VIEW:
- g_value_set_boolean (
- value,
- e_mail_shell_content_get_vertical_view (
- E_MAIL_SHELL_CONTENT (object)));
- }
-
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-}
-
-static void
-mail_shell_content_dispose (GObject *object)
-{
- EMailShellContentPrivate *priv;
-
- priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (object);
-
- if (priv->paned != NULL) {
- g_object_unref (priv->paned);
- priv->paned = NULL;
- }
-
- if (priv->message_list != NULL) {
- g_object_unref (priv->message_list);
- priv->message_list = NULL;
- }
-
- if (priv->search_bar != NULL) {
- g_object_unref (priv->search_bar);
- priv->search_bar = NULL;
- }
-
- if (priv->html_display != NULL) {
- g_object_unref (priv->html_display);
- priv->html_display = NULL;
- }
-
- if (priv->view_instance != NULL) {
- g_object_unref (priv->view_instance);
- priv->view_instance = NULL;
- }
-
- /* Chain up to parent's dispose() method. */
- G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-mail_shell_content_constructed (GObject *object)
-{
- EMailShellContentPrivate *priv;
- EShellContent *shell_content;
- EShellBackend *shell_backend;
- EShellView *shell_view;
- EShellViewClass *shell_view_class;
- EMailReader *reader;
- MessageList *message_list;
- GConfBridge *bridge;
- GtkWidget *container;
- GtkWidget *widget;
- GtkHTML *html;
- GalViewCollection *view_collection;
- const gchar *key;
-
- priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (object);
- priv->html_display = em_format_html_display_new ();
-
- /* Chain up to parent's constructed() method. */
- G_OBJECT_CLASS (parent_class)->constructed (object);
-
- shell_content = E_SHELL_CONTENT (object);
- shell_view = e_shell_content_get_shell_view (shell_content);
- shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
- shell_backend = e_shell_view_get_shell_backend (shell_view);
- view_collection = shell_view_class->view_collection;
-
- html = EM_FORMAT_HTML (priv->html_display)->html;
-
- /* Build content widgets. */
-
- container = GTK_WIDGET (object);
-
- widget = gtk_vpaned_new ();
- gtk_container_add (GTK_CONTAINER (container), widget);
- priv->paned = g_object_ref (widget);
- gtk_widget_show (widget);
-
- container = widget;
-
- widget = message_list_new (shell_backend);
- gtk_paned_add1 (GTK_PANED (container), widget);
- priv->message_list = g_object_ref (widget);
- gtk_widget_show (widget);
-
- widget = gtk_vbox_new (FALSE, 1);
- gtk_paned_add2 (GTK_PANED (container), widget);
- gtk_widget_show (widget);
-
- container = widget;
-
- widget = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (
- GTK_SCROLLED_WINDOW (widget),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (
- GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN);
- gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (html));
- gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
- gtk_widget_show (GTK_WIDGET (html));
- gtk_widget_show (widget);
-
- widget = e_mail_search_bar_new (html);
- gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
- priv->search_bar = g_object_ref (widget);
- gtk_widget_hide (widget);
-
- g_signal_connect_swapped (
- widget, "changed",
- G_CALLBACK (em_format_redraw), priv->html_display);
-
- /* Load the view instance. */
-
- e_mail_shell_content_update_view_instance (
- E_MAIL_SHELL_CONTENT (shell_content));
-
- /* Bind GObject properties to GConf keys. */
-
- bridge = gconf_bridge_get ();
-
- object = G_OBJECT (priv->paned);
- key = "/apps/evolution/mail/display/paned_size";
- gconf_bridge_bind_property_delayed (bridge, key, object, "position");
-
- object = G_OBJECT (shell_content);
- key = "/apps/evolution/mail/display/show_deleted";
- gconf_bridge_bind_property (bridge, key, object, "show-deleted");
-
- /* Message list customizations. */
-
- reader = E_MAIL_READER (shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- g_signal_connect_swapped (
- message_list, "message-selected",
- G_CALLBACK (mail_shell_content_message_selected_cb),
- shell_content);
-}
-
-static guint32
-mail_shell_content_check_state (EShellContent *shell_content)
-{
- return e_mail_reader_check_state (E_MAIL_READER (shell_content));
-}
-
-static GtkActionGroup *
-mail_shell_content_get_action_group (EMailReader *reader)
-{
- EShellContent *shell_content;
- EShellWindow *shell_window;
- EShellView *shell_view;
-
- shell_content = E_SHELL_CONTENT (reader);
- shell_view = e_shell_content_get_shell_view (shell_content);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- return E_SHELL_WINDOW_ACTION_GROUP_MAIL (shell_window);
-}
-
-static gboolean
-mail_shell_content_get_hide_deleted (EMailReader *reader)
-{
- EMailShellContent *mail_shell_content;
-
- mail_shell_content = E_MAIL_SHELL_CONTENT (reader);
-
- return !e_mail_shell_content_get_show_deleted (mail_shell_content);
-}
-
-static EMFormatHTMLDisplay *
-mail_shell_content_get_html_display (EMailReader *reader)
-{
- EMailShellContentPrivate *priv;
-
- priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (reader);
-
- return priv->html_display;
-}
-
-static MessageList *
-mail_shell_content_get_message_list (EMailReader *reader)
-{
- EMailShellContentPrivate *priv;
-
- priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (reader);
-
- return MESSAGE_LIST (priv->message_list);
-}
-
-static EShellBackend *
-mail_shell_content_get_shell_backend (EMailReader *reader)
-{
- EShellContent *shell_content;
- EShellView *shell_view;
-
- shell_content = E_SHELL_CONTENT (reader);
- shell_view = e_shell_content_get_shell_view (shell_content);
-
- return e_shell_view_get_shell_backend (shell_view);
-}
-
-static GtkWindow *
-mail_shell_content_get_window (EMailReader *reader)
-{
- EShellContent *shell_content;
- EShellWindow *shell_window;
- EShellView *shell_view;
-
- shell_content = E_SHELL_CONTENT (reader);
- shell_view = e_shell_content_get_shell_view (shell_content);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- return GTK_WINDOW (shell_window);
-}
-
-static void
-mail_shell_content_set_folder (EMailReader *reader,
- CamelFolder *folder,
- const gchar *folder_uri)
-{
- EMailShellContentPrivate *priv;
- EMailReaderIface *default_iface;
- MessageList *message_list;
- gboolean different_folder;
-
- priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (reader);
-
- message_list = e_mail_reader_get_message_list (reader);
-
- message_list_freeze (message_list);
-
- different_folder =
- message_list->folder != NULL &&
- folder != message_list->folder;
-
- /* Chain up to interface's default set_folder() method. */
- default_iface = g_type_default_interface_peek (E_TYPE_MAIL_READER);
- default_iface->set_folder (reader, folder, folder_uri);
-
- if (folder == NULL)
- goto exit;
-
- mail_refresh_folder (folder, NULL, NULL);
-
- /* This function gets triggered several times at startup,
- * so we don't want to reset the message suppression state
- * unless we're actually switching to a different folder. */
- if (different_folder)
- priv->suppress_message_selection = FALSE;
-
- /* This is a one-time-only callback. */
- if (message_list->cursor_uid == NULL && priv->message_list_built_id == 0)
- priv->message_list_built_id = g_signal_connect_swapped (
- message_list, "message-list-built",
- G_CALLBACK (mail_shell_content_message_list_built_cb),
- reader);
-
-exit:
- message_list_thaw (message_list);
-}
-
-static void
-mail_shell_content_show_search_bar (EMailReader *reader)
-{
- EMailShellContentPrivate *priv;
-
- priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (reader);
-
- gtk_widget_show (priv->search_bar);
-}
-
-static void
-mail_shell_content_class_init (EMailShellContentClass *class)
-{
- GObjectClass *object_class;
- EShellContentClass *shell_content_class;
-
- parent_class = g_type_class_peek_parent (class);
- g_type_class_add_private (class, sizeof (EMailShellContentPrivate));
-
- object_class = G_OBJECT_CLASS (class);
- object_class->set_property = mail_shell_content_set_property;
- object_class->get_property = mail_shell_content_get_property;
- object_class->dispose = mail_shell_content_dispose;
- object_class->constructed = mail_shell_content_constructed;
-
- shell_content_class = E_SHELL_CONTENT_CLASS (class);
- shell_content_class->new_search_context = em_search_context_new;
- shell_content_class->check_state = mail_shell_content_check_state;
-
- g_object_class_install_property (
- object_class,
- PROP_PREVIEW_VISIBLE,
- g_param_spec_boolean (
- "preview-visible",
- _("Preview is Visible"),
- _("Whether the preview pane is visible"),
- TRUE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (
- object_class,
- PROP_SHOW_DELETED,
- g_param_spec_boolean (
- "show-deleted",
- "Show Deleted",
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (
- object_class,
- PROP_VERTICAL_VIEW,
- g_param_spec_boolean (
- "vertical-view",
- _("Vertical View"),
- _("Whether vertical view is enabled"),
- FALSE,
- G_PARAM_READWRITE));
-}
-
-static void
-mail_shell_content_iface_init (EMailReaderIface *iface)
-{
- iface->get_action_group = mail_shell_content_get_action_group;
- iface->get_hide_deleted = mail_shell_content_get_hide_deleted;
- iface->get_html_display = mail_shell_content_get_html_display;
- iface->get_message_list = mail_shell_content_get_message_list;
- iface->get_shell_backend = mail_shell_content_get_shell_backend;
- iface->get_window = mail_shell_content_get_window;
- iface->set_folder = mail_shell_content_set_folder;
- iface->show_search_bar = mail_shell_content_show_search_bar;
-}
-
-static void
-mail_shell_content_init (EMailShellContent *mail_shell_content)
-{
- mail_shell_content->priv =
- E_MAIL_SHELL_CONTENT_GET_PRIVATE (mail_shell_content);
-
- mail_shell_content->priv->preview_visible = TRUE;
-
- /* Postpone widget construction until we have a shell view. */
-}
-
-GType
-e_mail_shell_content_get_type (void)
-{
- return mail_shell_content_type;
-}
-
-void
-e_mail_shell_content_register_type (GTypeModule *type_module)
-{
- static const GTypeInfo type_info = {
- sizeof (EMailShellContentClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) mail_shell_content_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EMailShellContent),
- 0, /* n_preallocs */
- (GInstanceInitFunc) mail_shell_content_init,
- NULL /* value_table */
- };
-
- static const GInterfaceInfo iface_info = {
- (GInterfaceInitFunc) mail_shell_content_iface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL /* interface_data */
- };
-
- mail_shell_content_type = g_type_module_register_type (
- type_module, E_TYPE_SHELL_CONTENT,
- "EMailShellContent", &type_info, 0);
-
- g_type_module_add_interface (
- type_module, mail_shell_content_type,
- E_TYPE_MAIL_READER, &iface_info);
-}
-
-GtkWidget *
-e_mail_shell_content_new (EShellView *shell_view)
-{
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
-
- return g_object_new (
- E_TYPE_MAIL_SHELL_CONTENT,
- "shell-view", shell_view, NULL);
-}
-
-gboolean
-e_mail_shell_content_get_preview_visible (EMailShellContent *mail_shell_content)
-{
- g_return_val_if_fail (
- E_IS_MAIL_SHELL_CONTENT (mail_shell_content), FALSE);
-
- return mail_shell_content->priv->preview_visible;
-}
-
-void
-e_mail_shell_content_set_preview_visible (EMailShellContent *mail_shell_content,
- gboolean preview_visible)
-{
- GtkPaned *paned;
- GtkWidget *child;
-
- g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content));
-
- if (preview_visible == mail_shell_content->priv->preview_visible)
- return;
-
- paned = GTK_PANED (mail_shell_content->priv->paned);
- child = gtk_paned_get_child2 (paned);
-
- if (preview_visible)
- gtk_widget_show (child);
- else
- gtk_widget_hide (child);
-
- mail_shell_content->priv->preview_visible = preview_visible;
-
- g_object_notify (G_OBJECT (mail_shell_content), "preview-visible");
-}
-
-gboolean
-e_mail_shell_content_get_show_deleted (EMailShellContent *mail_shell_content)
-{
- g_return_val_if_fail (
- E_IS_MAIL_SHELL_CONTENT (mail_shell_content), FALSE);
-
- return mail_shell_content->priv->show_deleted;
-}
-
-void
-e_mail_shell_content_set_show_deleted (EMailShellContent *mail_shell_content,
- gboolean show_deleted)
-{
- g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content));
-
- mail_shell_content->priv->show_deleted = show_deleted;
-
- g_object_notify (G_OBJECT (mail_shell_content), "show-deleted");
-}
-
-gboolean
-e_mail_shell_content_get_vertical_view (EMailShellContent *mail_shell_content)
-{
- g_return_val_if_fail (
- E_IS_MAIL_SHELL_CONTENT (mail_shell_content), FALSE);
-
- return mail_shell_content->priv->vertical_view;
-}
-
-void
-e_mail_shell_content_set_vertical_view (EMailShellContent *mail_shell_content,
- gboolean vertical_view)
-{
- GConfBridge *bridge;
- GtkWidget *old_paned;
- GtkWidget *new_paned;
- GtkWidget *child1;
- GtkWidget *child2;
- guint binding_id;
- const gchar *key;
-
- g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content));
-
- if (vertical_view == mail_shell_content->priv->vertical_view)
- return;
-
- bridge = gconf_bridge_get ();
- old_paned = mail_shell_content->priv->paned;
- binding_id = mail_shell_content->priv->paned_binding_id;
-
- child1 = gtk_paned_get_child1 (GTK_PANED (old_paned));
- child2 = gtk_paned_get_child2 (GTK_PANED (old_paned));
-
- if (binding_id > 0)
- gconf_bridge_unbind (bridge, binding_id);
-
- if (vertical_view) {
- new_paned = gtk_hpaned_new ();
- key = "/apps/evolution/mail/display/hpaned_size";
- } else {
- new_paned = gtk_vpaned_new ();
- key = "/apps/evolution/mail/display/paned_size";
- }
-
- gtk_widget_reparent (child1, new_paned);
- gtk_widget_reparent (child2, new_paned);
- gtk_widget_show (new_paned);
-
- gtk_widget_destroy (old_paned);
- gtk_container_add (GTK_CONTAINER (mail_shell_content), new_paned);
-
- binding_id = gconf_bridge_bind_property_delayed (
- bridge, key, G_OBJECT (new_paned), "position");
-
- mail_shell_content->priv->vertical_view = vertical_view;
- mail_shell_content->priv->paned_binding_id = binding_id;
- mail_shell_content->priv->paned = g_object_ref (new_paned);
-
- e_mail_shell_content_update_view_instance (mail_shell_content);
-
- g_object_notify (G_OBJECT (mail_shell_content), "vertical-view");
-}
-
-GalViewInstance *
-e_mail_shell_content_get_view_instance (EMailShellContent *mail_shell_content)
-{
- g_return_val_if_fail (
- E_IS_MAIL_SHELL_CONTENT (mail_shell_content), NULL);
-
- return mail_shell_content->priv->view_instance;
-}
-
-void
-e_mail_shell_content_set_search_strings (EMailShellContent *mail_shell_content,
- GSList *search_strings)
-{
- EMailSearchBar *search_bar;
- ESearchingTokenizer *tokenizer;
-
- g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content));
-
- search_bar = E_MAIL_SEARCH_BAR (mail_shell_content->priv->search_bar);
- tokenizer = e_mail_search_bar_get_tokenizer (search_bar);
-
- e_searching_tokenizer_set_secondary_case_sensitivity (tokenizer, FALSE);
- e_searching_tokenizer_set_secondary_search_string (tokenizer, NULL);
-
- while (search_strings != NULL) {
- e_searching_tokenizer_add_secondary_search_string (
- tokenizer, search_strings->data);
- search_strings = g_slist_next (search_strings);
- }
-
- e_mail_search_bar_changed (search_bar);
-}
-
-void
-e_mail_shell_content_update_view_instance (EMailShellContent *mail_shell_content)
-{
- EMailReader *reader;
- EShellContent *shell_content;
- EShellView *shell_view;
- EShellViewClass *shell_view_class;
- GalViewCollection *view_collection;
- GalViewInstance *view_instance;
- MessageList *message_list;
- gboolean outgoing_folder;
- gboolean show_vertical_view;
- gchar *view_id;
-
- g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content));
-
- shell_content = E_SHELL_CONTENT (mail_shell_content);
- shell_view = e_shell_content_get_shell_view (shell_content);
- shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
- view_collection = shell_view_class->view_collection;
-
- reader = E_MAIL_READER (mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- /* If no folder is selected, return silently. */
- if (message_list->folder == NULL)
- return;
-
- /* If we have a folder, we should also have a URI. */
- g_return_if_fail (message_list->folder_uri != NULL);
-
- if (mail_shell_content->priv->view_instance != NULL) {
- g_object_unref (mail_shell_content->priv->view_instance);
- mail_shell_content->priv->view_instance = NULL;
- }
-
- view_id = mail_config_folder_to_safe_url (message_list->folder);
- view_instance = e_shell_view_new_view_instance (shell_view, view_id);
- mail_shell_content->priv->view_instance = view_instance;
-
- show_vertical_view =
- e_mail_shell_content_get_vertical_view (mail_shell_content);
-
- if (show_vertical_view) {
- gchar *filename;
- gchar *safe_view_id;
-
- /* Force the view instance into vertical view. */
-
- g_free (view_instance->custom_filename);
- g_free (view_instance->current_view_filename);
-
- safe_view_id = g_strdup (view_id);
- e_filename_make_safe (safe_view_id);
-
- filename = g_strdup_printf (
- "custom_wide_view-%s.xml", safe_view_id);
- view_instance->custom_filename = g_build_filename (
- view_collection->local_dir, filename, NULL);
- g_free (filename);
-
- filename = g_strdup_printf (
- "current_wide_view-%s.xml", safe_view_id);
- view_instance->current_view_filename = g_build_filename (
- view_collection->local_dir, filename, NULL);
- g_free (filename);
-
- g_free (safe_view_id);
- }
-
- g_free (view_id);
-
- outgoing_folder =
- em_utils_folder_is_drafts (
- message_list->folder, message_list->folder_uri) ||
- em_utils_folder_is_outbox (
- message_list->folder, message_list->folder_uri) ||
- em_utils_folder_is_sent (
- message_list->folder, message_list->folder_uri);
-
- if (outgoing_folder) {
- if (show_vertical_view)
- gal_view_instance_set_default_view (
- view_instance, "Wide_View_Sent");
- else
- gal_view_instance_set_default_view (
- view_instance, "As_Sent_Folder");
- } else if (show_vertical_view) {
- gal_view_instance_set_default_view (
- view_instance, "Wide_View_Normal");
- }
-
- gal_view_instance_load (view_instance);
-
- if (!gal_view_instance_exists (view_instance)) {
- gchar *state_filename;
-
- state_filename = mail_config_folder_to_cachename (
- message_list->folder, "et-header-");
-
- if (g_file_test (state_filename, G_FILE_TEST_IS_REGULAR)) {
- ETableSpecification *spec;
- ETableState *state;
- GalView *view;
- gchar *spec_filename;
-
- spec = e_table_specification_new ();
- spec_filename = g_build_filename (
- EVOLUTION_ETSPECDIR,
- "message-list.etspec",
- NULL);
- e_table_specification_load_from_file (
- spec, spec_filename);
- g_free (spec_filename);
-
- state = e_table_state_new ();
- view = gal_view_etable_new (spec, "");
-
- e_table_state_load_from_file (
- state, state_filename);
- gal_view_etable_set_state (
- GAL_VIEW_ETABLE (view), state);
- gal_view_instance_set_custom_view (
- view_instance, view);
-
- g_object_unref (state);
- g_object_unref (view);
- g_object_unref (spec);
- }
-
- g_free (state_filename);
- }
-
- g_signal_connect (
- view_instance, "display-view",
- G_CALLBACK (mail_shell_content_display_view_cb),
- mail_shell_content);
-
- mail_shell_content_display_view_cb (
- mail_shell_content,
- gal_view_instance_get_current_view (view_instance));
-}
diff --git a/mail/e-mail-shell-content.h b/mail/e-mail-shell-content.h
deleted file mode 100644
index 57d2438705..0000000000
--- a/mail/e-mail-shell-content.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * e-mail-shell-content.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_MAIL_SHELL_CONTENT_H
-#define E_MAIL_SHELL_CONTENT_H
-
-#include <shell/e-shell-content.h>
-#include <shell/e-shell-view.h>
-
-#include <mail/em-format-html-display.h>
-
-/* Standard GObject macros */
-#define E_TYPE_MAIL_SHELL_CONTENT \
- (e_mail_shell_content_get_type ())
-#define E_MAIL_SHELL_CONTENT(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), E_TYPE_MAIL_SHELL_CONTENT, EMailShellContent))
-#define E_MAIL_SHELL_CONTENT_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), E_TYPE_MAIL_SHELL_CONTENT, EMailShellContentClass))
-#define E_IS_MAIL_SHELL_CONTENT(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), E_TYPE_MAIL_SHELL_CONTENT))
-#define E_IS_MAIL_SHELL_CONTENT_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_TYPE \
- ((cls), E_TYPE_MAIL_SHELL_CONTENT))
-#define E_MAIL_SHELL_CONTENT_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS \
- ((obj), E_TYPE_MAIL_SHELL_CONTENT, EMailShellContentClass))
-
-G_BEGIN_DECLS
-
-typedef struct _EMailShellContent EMailShellContent;
-typedef struct _EMailShellContentClass EMailShellContentClass;
-typedef struct _EMailShellContentPrivate EMailShellContentPrivate;
-
-struct _EMailShellContent {
- EShellContent parent;
- EMailShellContentPrivate *priv;
-};
-
-struct _EMailShellContentClass {
- EShellContentClass parent_class;
-};
-
-GType e_mail_shell_content_get_type (void);
-void e_mail_shell_content_register_type
- (GTypeModule *type_module);
-GtkWidget * e_mail_shell_content_new(EShellView *shell_view);
-gboolean e_mail_shell_content_get_preview_visible
- (EMailShellContent *mail_shell_content);
-void e_mail_shell_content_set_preview_visible
- (EMailShellContent *mail_shell_content,
- gboolean preview_visible);
-gboolean e_mail_shell_content_get_show_deleted
- (EMailShellContent *mail_shell_content);
-void e_mail_shell_content_set_show_deleted
- (EMailShellContent *mail_shell_content,
- gboolean show_deleted);
-gboolean e_mail_shell_content_get_vertical_view
- (EMailShellContent *mail_shell_content);
-void e_mail_shell_content_set_vertical_view
- (EMailShellContent *mail_shell_content,
- gboolean vertical_view);
-GalViewInstance *
- e_mail_shell_content_get_view_instance
- (EMailShellContent *mail_shell_content);
-void e_mail_shell_content_set_search_strings
- (EMailShellContent *mail_shell_content,
- GSList *search_strings);
-void e_mail_shell_content_update_view_instance
- (EMailShellContent *mail_shell_content);
-
-G_END_DECLS
-
-#endif /* E_MAIL_SHELL_CONTENT_H */
diff --git a/mail/e-mail-shell-migrate.c b/mail/e-mail-shell-migrate.c
deleted file mode 100644
index 2158580bf9..0000000000
--- a/mail/e-mail-shell-migrate.c
+++ /dev/null
@@ -1,3104 +0,0 @@
-/*
- * e-mail-shell-migrate.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-migrate.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <utime.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <regex.h>
-#include <errno.h>
-#include <ctype.h>
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <glib/gstdio.h>
-
-#include <gtk/gtk.h>
-
-#include <gconf/gconf-client.h>
-
-#include <camel/camel.h>
-#include <camel/camel-store.h>
-#include <camel/camel-session.h>
-#include <camel/camel-file-utils.h>
-#include <camel/camel-disco-folder.h>
-
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include <e-util/e-util.h>
-#include <libedataserver/e-xml-utils.h>
-#include <libedataserver/e-data-server-util.h>
-#include <e-util/e-xml-utils.h>
-
-#include "e-util/e-account-utils.h"
-#include "e-util/e-bconf-map.h"
-#include "e-util/e-error.h"
-#include "e-util/e-util-private.h"
-#include "e-util/e-plugin.h"
-#include "e-util/e-signature-utils.h"
-
-#include "e-mail-shell-backend.h"
-#include "shell/e-shell-migrate.h"
-
-#include "e-mail-store.h"
-#include "mail-config.h"
-#include "em-utils.h"
-
-#define d(x) x
-
-#ifndef G_OS_WIN32
-/* No versions previous to 2.8 or thereabouts have been available on
- * Windows, so don't bother with upgrade support from earlier versions
- * on Win32. Do try to support upgrades from 2.12 and later to the
- * current version.
- */
-
-/* upgrade helper functions */
-static xmlDocPtr
-emm_load_xml (const gchar *dirname, const gchar *filename)
-{
- xmlDocPtr doc;
- struct stat st;
- gchar *path;
-
- path = g_strdup_printf ("%s/%s", dirname, filename);
- if (stat (path, &st) == -1 || !(doc = xmlParseFile (path))) {
- g_free (path);
- return NULL;
- }
-
- g_free (path);
-
- return doc;
-}
-
-static gint
-emm_save_xml (xmlDocPtr doc, const gchar *dirname, const gchar *filename)
-{
- gchar *path;
- gint retval;
-
- path = g_strdup_printf ("%s/%s", dirname, filename);
- retval = e_xml_save_file (path, doc);
- g_free (path);
-
- return retval;
-}
-
-static xmlNodePtr
-xml_find_node (xmlNodePtr parent, const gchar *name)
-{
- xmlNodePtr node;
-
- node = parent->children;
- while (node != NULL) {
- if (node->name && !strcmp ((gchar *)node->name, name))
- return node;
-
- node = node->next;
- }
-
- return NULL;
-}
-
-static void
-upgrade_xml_uris (xmlDocPtr doc, gchar * (* upgrade_uri) (const gchar *uri))
-{
- xmlNodePtr root, node;
- gchar *uri, *new;
-
- if (!doc || !(root = xmlDocGetRootElement (doc)))
- return;
-
- if (!root->name || strcmp ((gchar *)root->name, "filteroptions") != 0) {
- /* root node is not <filteroptions>, nothing to upgrade */
- return;
- }
-
- if (!(node = xml_find_node (root, "ruleset"))) {
- /* no ruleset node, nothing to upgrade */
- return;
- }
-
- node = node->children;
- while (node != NULL) {
- if (node->name && !strcmp ((gchar *)node->name, "rule")) {
- xmlNodePtr actionset, part, val, n;
-
- if ((actionset = xml_find_node (node, "actionset"))) {
- /* filters.xml */
- part = actionset->children;
- while (part != NULL) {
- if (part->name && !strcmp ((gchar *)part->name, "part")) {
- val = part->children;
- while (val != NULL) {
- if (val->name && !strcmp ((gchar *)val->name, "value")) {
- gchar *type;
-
- type = (gchar *)xmlGetProp (val, (const guchar *)"type");
- if (type && !strcmp ((gchar *)type, "folder")) {
- if ((n = xml_find_node (val, "folder"))) {
- uri = (gchar *)xmlGetProp (n, (const guchar *)"uri");
- new = upgrade_uri (uri);
- xmlFree (uri);
-
- xmlSetProp (n, (const guchar *)"uri", (guchar *)new);
- g_free (new);
- }
- }
-
- xmlFree (type);
- }
-
- val = val->next;
- }
- }
-
- part = part->next;
- }
- } else if ((actionset = xml_find_node (node, "sources"))) {
- /* vfolders.xml */
- n = actionset->children;
- while (n != NULL) {
- if (n->name && !strcmp ((gchar *)n->name, "folder")) {
- uri = (gchar *)xmlGetProp (n, (const guchar *)"uri");
- new = upgrade_uri (uri);
- xmlFree (uri);
-
- xmlSetProp (n, (const guchar *)"uri", (guchar *)new);
- g_free (new);
- }
-
- n = n->next;
- }
- }
- }
-
- node = node->next;
- }
-}
-
-/* 1.0 upgrade functions & data */
-
-/* as much info as we have on a given account */
-struct _account_info_1_0 {
- gchar *name;
- gchar *uri;
- gchar *base_uri;
- union {
- struct {
- /* for imap */
- gchar *namespace;
- gchar *namespace_full;
- guint32 capabilities;
- GHashTable *folders;
- gchar dir_sep;
- } imap;
- } u;
-};
-
-struct _imap_folder_info_1_0 {
- gchar *folder;
- /* encoded? decoded? canonicalised? */
- gchar dir_sep;
-};
-
-static GHashTable *accounts_1_0 = NULL;
-static GHashTable *accounts_name_1_0 = NULL;
-
-static void
-imap_folder_info_1_0_free (struct _imap_folder_info_1_0 *fi)
-{
- g_free(fi->folder);
- g_free(fi);
-}
-
-static void
-account_info_1_0_free (struct _account_info_1_0 *ai)
-{
- g_free(ai->name);
- g_free(ai->uri);
- g_free(ai->base_uri);
- g_free(ai->u.imap.namespace);
- g_free(ai->u.imap.namespace_full);
- g_hash_table_destroy(ai->u.imap.folders);
- g_free(ai);
-}
-
-static gchar *
-get_base_uri(const gchar *val)
-{
- const gchar *tmp;
-
- tmp = strchr(val, ':');
- if (tmp) {
- tmp++;
- if (strncmp(tmp, "//", 2) == 0)
- tmp += 2;
- tmp = strchr(tmp, '/');
- }
-
- if (tmp)
- return g_strndup(val, tmp-val);
- else
- return g_strdup(val);
-}
-
-static gchar *
-upgrade_xml_uris_1_0 (const gchar *uri)
-{
- gchar *out = NULL;
-
- /* upgrades camel uri's */
- if (strncmp (uri, "imap:", 5) == 0) {
- gchar *base_uri, dir_sep, *folder, *p;
- struct _account_info_1_0 *ai;
-
- /* add namespace, canonicalise dir_sep to / */
- base_uri = get_base_uri (uri);
- ai = g_hash_table_lookup (accounts_1_0, base_uri);
-
- if (ai == NULL) {
- g_free (base_uri);
- return NULL;
- }
-
- dir_sep = ai->u.imap.dir_sep;
- if (dir_sep == 0) {
- /* no dir_sep listed, try get it from the namespace, if set */
- if (ai->u.imap.namespace != NULL) {
- p = ai->u.imap.namespace;
- while ((dir_sep = *p++)) {
- if (dir_sep < '0'
- || (dir_sep > '9' && dir_sep < 'A')
- || (dir_sep > 'Z' && dir_sep < 'a')
- || (dir_sep > 'z')) {
- break;
- }
- p++;
- }
- }
-
- /* give up ... */
- if (dir_sep == 0) {
- g_free (base_uri);
- return NULL;
- }
- }
-
- folder = g_strdup (uri + strlen (base_uri) + 1);
-
- /* Add the namespace before the mailbox name, unless the mailbox is INBOX */
- if (ai->u.imap.namespace && strcmp ((gchar *)folder, "INBOX") != 0)
- out = g_strdup_printf ("%s/%s/%s", base_uri, ai->u.imap.namespace, folder);
- else
- out = g_strdup_printf ("%s/%s", base_uri, folder);
-
- p = out;
- while (*p) {
- if (*p == dir_sep)
- *p = '/';
- p++;
- }
-
- g_free (folder);
- g_free (base_uri);
- } else if (strncmp (uri, "exchange:", 9) == 0) {
- gchar *base_uri, *folder, *p;
-
- /* exchange://user@host/exchange/ * -> exchange://user@host/personal/ * */
- /* Any url encoding (%xx) in the folder name is also removed */
- base_uri = get_base_uri (uri);
- uri += strlen (base_uri) + 1;
- if (strncmp (uri, "exchange/", 9) == 0) {
- folder = e_bconf_url_decode (uri + 9);
- p = strchr (folder, '/');
- out = g_strdup_printf ("%s/personal%s", base_uri, p ? p : "/");
- g_free (folder);
- }
- } else if (strncmp (uri, "exchanget:", 10) == 0) {
- /* these should be converted in the accounts table when it is loaded */
- g_warning ("exchanget: uri not converted: '%s'", uri);
- }
-
- return out;
-}
-
-static gchar *
-parse_lsub (const gchar *lsub, gchar *dir_sep)
-{
- static gint comp;
- static regex_t pat;
- regmatch_t match[3];
- const gchar *m = "^\\* LSUB \\([^)]*\\) \"?([^\" ]+)\"? \"?(.*)\"?$";
-
- if (!comp) {
- if (regcomp (&pat, m, REG_EXTENDED|REG_ICASE) == -1) {
- g_warning ("reg comp '%s' failed: %s", m, g_strerror (errno));
- return NULL;
- }
- comp = 1;
- }
-
- if (regexec (&pat, lsub, 3, match, 0) == 0) {
- if (match[1].rm_so != -1 && match[2].rm_so != -1) {
- if (dir_sep)
- *dir_sep = (match[1].rm_eo - match[1].rm_so == 1) ? lsub[match[1].rm_so] : 0;
- return g_strndup (lsub + match[2].rm_so, match[2].rm_eo - match[2].rm_so);
- }
- }
-
- return NULL;
-}
-
-static gboolean
-read_imap_storeinfo (struct _account_info_1_0 *si)
-{
- FILE *storeinfo;
- guint32 tmp;
- gchar *buf, *folder, dir_sep, *path, *name, *p;
- struct _imap_folder_info_1_0 *fi;
-
- si->u.imap.folders = g_hash_table_new_full (
- g_str_hash, g_str_equal,
- (GDestroyNotify) NULL,
- (GDestroyNotify) imap_folder_info_1_0_free);
-
- /* get details from uri first */
- name = strstr (si->uri, ";override_namespace");
- if (name) {
- name = strstr (si->uri, ";namespace=");
- if (name) {
- gchar *end;
-
- name += strlen (";namespace=");
- if (*name == '\"') {
- name++;
- end = strchr (name, '\"');
- } else {
- end = strchr (name, ';');
- }
-
- if (end) {
- /* try get the dir_sep from the namespace */
- si->u.imap.namespace = g_strndup (name, end-name);
-
- p = si->u.imap.namespace;
- while ((dir_sep = *p++)) {
- if (dir_sep < '0'
- || (dir_sep > '9' && dir_sep < 'A')
- || (dir_sep > 'Z' && dir_sep < 'a')
- || (dir_sep > 'z')) {
- si->u.imap.dir_sep = dir_sep;
- break;
- }
- p++;
- }
- }
- }
- }
-
- /* now load storeinfo if it exists */
- path = g_build_filename (g_get_home_dir (), "evolution", "mail", "imap", si->base_uri + 7, "storeinfo", NULL);
- storeinfo = fopen (path, "r");
- g_free (path);
- if (storeinfo == NULL) {
- g_warning ("could not find imap store info '%s'", path);
- return FALSE;
- }
-
- /* ignore version */
- camel_file_util_decode_uint32 (storeinfo, &tmp);
- camel_file_util_decode_uint32 (storeinfo, &si->u.imap.capabilities);
- g_free (si->u.imap.namespace);
- camel_file_util_decode_string (storeinfo, &si->u.imap.namespace);
- camel_file_util_decode_uint32 (storeinfo, &tmp);
- si->u.imap.dir_sep = tmp;
- /* strip trailing dir_sep or / */
- if (si->u.imap.namespace
- && (si->u.imap.namespace[strlen (si->u.imap.namespace) - 1] == si->u.imap.dir_sep
- || si->u.imap.namespace[strlen (si->u.imap.namespace) - 1] == '/')) {
- si->u.imap.namespace[strlen (si->u.imap.namespace) - 1] = 0;
- }
-
- d(printf ("namespace '%s' dir_sep '%c'\n", si->u.imap.namespace, si->u.imap.dir_sep ? si->u.imap.dir_sep : '?'));
-
- while (camel_file_util_decode_string (storeinfo, &buf) == 0) {
- folder = parse_lsub (buf, &dir_sep);
- if (folder) {
- fi = g_new0 (struct _imap_folder_info_1_0, 1);
- fi->folder = folder;
- fi->dir_sep = dir_sep;
-#if d(!)0
- printf (" add folder '%s' ", folder);
- if (dir_sep)
- printf ("'%c'\n", dir_sep);
- else
- printf ("NIL\n");
-#endif
- g_hash_table_insert (si->u.imap.folders, fi->folder, fi);
- } else {
- g_warning ("Could not parse LIST result '%s'\n", buf);
- }
- }
-
- fclose (storeinfo);
-
- return TRUE;
-}
-
-static gboolean
-load_accounts_1_0 (xmlDocPtr doc)
-{
- xmlNodePtr source;
- gchar *val, *tmp;
- gint count = 0, i;
- gchar key[32];
-
- if (!(source = e_bconf_get_path (doc, "/Mail/Accounts")))
- return TRUE;
-
- if ((val = e_bconf_get_value (source, "num"))) {
- count = atoi (val);
- xmlFree (val);
- }
-
- /* load account upgrade info for each account */
- for (i = 0; i < count; i++) {
- struct _account_info_1_0 *ai;
- gchar *rawuri;
-
- sprintf (key, "source_url_%d", i);
- if (!(rawuri = e_bconf_get_value (source, key)))
- continue;
-
- ai = g_malloc0 (sizeof (struct _account_info_1_0));
- ai->uri = e_bconf_hex_decode (rawuri);
- ai->base_uri = get_base_uri (ai->uri);
- sprintf (key, "account_name_%d", i);
- ai->name = e_bconf_get_string (source, key);
-
- d(printf("load account '%s'\n", ai->uri));
-
- if (!strncmp (ai->uri, "imap:", 5)) {
- read_imap_storeinfo (ai);
- } else if (!strncmp (ai->uri, "exchange:", 9)) {
- xmlNodePtr node;
-
- d(printf (" upgrade exchange account\n"));
- /* small hack, poke the source_url into the transport_url for exchanget: transports
- - this will be picked up later in the conversion */
- sprintf (key, "transport_url_%d", i);
- node = e_bconf_get_entry (source, key);
- if (node && (val = (gchar *)xmlGetProp (node, (const guchar *)"value"))) {
- tmp = e_bconf_hex_decode (val);
- xmlFree (val);
- if (strncmp (tmp, "exchanget:", 10) == 0)
- xmlSetProp (node, (const guchar *)"value", (guchar *)rawuri);
- g_free (tmp);
- } else {
- d(printf (" couldn't find transport uri?\n"));
- }
- }
- xmlFree (rawuri);
-
- g_hash_table_insert (accounts_1_0, ai->base_uri, ai);
- if (ai->name)
- g_hash_table_insert (accounts_name_1_0, ai->name, ai);
- }
-
- return TRUE;
-}
-
-static gboolean
-em_migrate_1_0 (const gchar *data_dir, xmlDocPtr config_xmldb, xmlDocPtr filters, xmlDocPtr vfolders, GError **error)
-{
- accounts_1_0 = g_hash_table_new_full (
- g_str_hash, g_str_equal,
- (GDestroyNotify) NULL,
- (GDestroyNotify) account_info_1_0_free);
- accounts_name_1_0 = g_hash_table_new (g_str_hash, g_str_equal);
- load_accounts_1_0 (config_xmldb);
-
- upgrade_xml_uris(filters, upgrade_xml_uris_1_0);
- upgrade_xml_uris(vfolders, upgrade_xml_uris_1_0);
-
- g_hash_table_destroy (accounts_1_0);
- g_hash_table_destroy (accounts_name_1_0);
-
- return TRUE;
-}
-
-/* 1.2 upgrade functions */
-static gboolean
-is_xml1encoded (const gchar *txt)
-{
- const guchar *p;
- gint isxml1 = FALSE;
- gint is8bit = FALSE;
-
- p = (const guchar *)txt;
- while (*p) {
- if (p[0] == '\\' && p[1] == 'U' && p[2] == '+'
- && isxdigit (p[3]) && isxdigit (p[4]) && isxdigit (p[5]) && isxdigit (p[6])
- && p[7] == '\\') {
- isxml1 = TRUE;
- p+=7;
- } else if (p[0] >= 0x80)
- is8bit = TRUE;
- p++;
- }
-
- /* check for invalid utf8 that needs cleaning */
- if (is8bit && !isxml1)
- isxml1 = !g_utf8_validate (txt, -1, NULL);
-
- return isxml1;
-}
-
-static gchar *
-decode_xml1 (const gchar *txt)
-{
- GString *out = g_string_new ("");
- const guchar *p;
- gchar *res;
-
- /* convert:
- \U+XXXX\ -> utf8
- 8 bit characters -> utf8 (iso-8859-1) */
-
- p = (const guchar *) txt;
- while (*p) {
- if (p[0] > 0x80
- || (p[0] == '\\' && p[1] == 'U' && p[2] == '+'
- && isxdigit (p[3]) && isxdigit (p[4]) && isxdigit (p[5]) && isxdigit (p[6])
- && p[7] == '\\')) {
- gchar utf8[8];
- gunichar u;
-
- if (p[0] == '\\') {
- memcpy (utf8, p + 3, 4);
- utf8[4] = 0;
- u = strtoul (utf8, NULL, 16);
- p+=7;
- } else
- u = p[0];
- utf8[g_unichar_to_utf8 (u, utf8)] = 0;
- g_string_append (out, utf8);
- } else {
- g_string_append_c (out, *p);
- }
- p++;
- }
-
- res = out->str;
- g_string_free (out, FALSE);
-
- return res;
-}
-
-static gchar *
-utf8_reencode (const gchar *txt)
-{
- GString *out = g_string_new ("");
- gchar *p;
- gchar *res;
-
- /* convert:
- libxml1 8 bit utf8 converted to xml entities byte-by-byte chars -> utf8 */
-
- p = (gchar *)txt;
-
- while (*p) {
- g_string_append_c (out, (gchar)g_utf8_get_char ((const gchar *)p));
- p = (gchar *)g_utf8_next_char (p);
- }
-
- res = out->str;
- if (g_utf8_validate (res, -1, NULL)) {
- g_string_free (out, FALSE);
- return res;
- } else {
- g_string_free (out, TRUE);
- return g_strdup (txt);
- }
-}
-
-static gboolean
-upgrade_xml_1_2_rec (xmlNodePtr node)
-{
- const gchar *value_tags[] = { "string", "address", "regex", "file", "command", NULL };
- const gchar *rule_tags[] = { "title", NULL };
- const gchar *item_props[] = { "name", NULL };
- struct {
- const gchar *name;
- const gchar **tags;
- const gchar **props;
- } tags[] = {
- { "value", value_tags, NULL },
- { "rule", rule_tags, NULL },
- { "item", NULL, item_props },
- { 0 },
- };
- xmlNodePtr work;
- gint i,j;
- gchar *txt, *tmp;
-
- /* upgrades the content of a node, if the node has a specific parent/node name */
-
- for (i = 0; tags[i].name; i++) {
- if (!strcmp ((gchar *)node->name, tags[i].name)) {
- if (tags[i].tags != NULL) {
- work = node->children;
- while (work) {
- for (j = 0; tags[i].tags[j]; j++) {
- if (!strcmp ((gchar *)work->name, tags[i].tags[j])) {
- txt = (gchar *)xmlNodeGetContent (work);
- if (is_xml1encoded (txt)) {
- tmp = decode_xml1 (txt);
- d(printf ("upgrading xml node %s/%s '%s' -> '%s'\n",
- tags[i].name, tags[i].tags[j], txt, tmp));
- xmlNodeSetContent (work, (guchar *)tmp);
- g_free (tmp);
- }
- xmlFree (txt);
- }
- }
- work = work->next;
- }
- break;
- }
-
- if (tags[i].props != NULL) {
- for (j = 0; tags[i].props[j]; j++) {
- txt = (gchar *)xmlGetProp (node, (guchar *)tags[i].props[j]);
- tmp = utf8_reencode (txt);
- d(printf ("upgrading xml property %s on node %s '%s' -> '%s'\n",
- tags[i].props[j], tags[i].name, txt, tmp));
- xmlSetProp (node, (const guchar *)tags[i].props[j], (guchar *)tmp);
- g_free (tmp);
- xmlFree (txt);
- }
- }
- }
- }
-
- node = node->children;
- while (node) {
- upgrade_xml_1_2_rec (node);
- node = node->next;
- }
-
- return TRUE;
-}
-
-static gboolean
-em_upgrade_xml_1_2 (xmlDocPtr doc)
-{
- xmlNodePtr root;
-
- if (!doc || !(root = xmlDocGetRootElement (doc)))
- return TRUE;
-
- return upgrade_xml_1_2_rec (root);
-}
-
-/* ********************************************************************** */
-/* Tables for converting flat bonobo conf -> gconf xml blob */
-/* ********************************************************************** */
-
-/* Mail/Accounts/ * */
-static e_bconf_map_t cc_map[] = {
- { "account_always_cc_%i", "always", E_BCONF_MAP_BOOL },
- { "account_always_cc_addrs_%i", "recipients", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL },
-};
-
-static e_bconf_map_t bcc_map[] = {
- { "account_always_cc_%i", "always", E_BCONF_MAP_BOOL },
- { "account_always_bcc_addrs_%i", "recipients", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL },
-};
-
-static e_bconf_map_t pgp_map[] = {
- { "account_pgp_encrypt_to_self_%i", "encrypt-to-self", E_BCONF_MAP_BOOL },
- { "account_pgp_always_trust_%i", "always-trust", E_BCONF_MAP_BOOL },
- { "account_pgp_always_sign_%i", "always-sign", E_BCONF_MAP_BOOL },
- { "account_pgp_no_imip_sign_%i", "no-imip-sign", E_BCONF_MAP_BOOL },
- { "account_pgp_key_%i", "key-id", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL },
-};
-
-static e_bconf_map_t smime_map[] = {
- { "account_smime_encrypt_to_self_%i", "encrypt-to-self", E_BCONF_MAP_BOOL },
- { "account_smime_always_sign_%i", "always-sign", E_BCONF_MAP_BOOL },
- { "account_smime_key_%i", "key-id", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL },
-};
-
-static e_bconf_map_t identity_sig_map[] = {
- { "identity_autogenerated_signature_%i", "auto", E_BCONF_MAP_BOOL },
- { "identity_def_signature_%i", "default", E_BCONF_MAP_LONG },
- { NULL },
-};
-
-static e_bconf_map_t identity_map[] = {
- { "identity_name_%i", "name", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { "identity_address_%i", "addr-spec", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { "identity_reply_to_%i", "reply-to", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { "identity_organization_%i", "organization", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL, "signature", E_BCONF_MAP_CHILD, identity_sig_map },
- { NULL },
-};
-
-static e_bconf_map_t source_map[] = {
- { "source_save_passwd_%i", "save-passwd", E_BCONF_MAP_BOOL },
- { "source_keep_on_server_%i", "keep-on-server", E_BCONF_MAP_BOOL },
- { "source_auto_check_%i", "auto-check", E_BCONF_MAP_BOOL },
- { "source_auto_check_time_%i", "auto-check-timeout", E_BCONF_MAP_LONG },
- { "source_url_%i", "url", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL },
-};
-
-static e_bconf_map_t transport_map[] = {
- { "transport_save_passwd_%i", "save-passwd", E_BCONF_MAP_BOOL },
- { "transport_url_%i", "url", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL },
-};
-
-static e_bconf_map_t account_map[] = {
- { "account_name_%i", "name", E_BCONF_MAP_STRING },
- { "source_enabled_%i", "enabled", E_BCONF_MAP_BOOL },
- { NULL, "identity", E_BCONF_MAP_CHILD, identity_map },
- { NULL, "source", E_BCONF_MAP_CHILD, source_map },
- { NULL, "transport", E_BCONF_MAP_CHILD, transport_map },
- { "account_drafts_folder_uri_%i", "drafts-folder", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { "account_sent_folder_uri_%i", "sent-folder", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL, "auto-cc", E_BCONF_MAP_CHILD, cc_map },
- { NULL, "auto-bcc", E_BCONF_MAP_CHILD, bcc_map },
- { NULL, "pgp", E_BCONF_MAP_CHILD, pgp_map },
- { NULL, "smime", E_BCONF_MAP_CHILD, smime_map },
- { NULL },
-};
-
-/* /Mail/Signatures/ * */
-static e_bconf_map_t signature_format_map[] = {
- { "text/plain", },
- { "text/html", },
- { NULL }
-};
-
-static e_bconf_map_t signature_map[] = {
- { "name_%i", "name", E_BCONF_MAP_STRING },
- { "html_%i", "format", E_BCONF_MAP_ENUM, signature_format_map },
- { "filename_%i", "filename", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { "script_%i", "script", E_BCONF_MAP_STRING|E_BCONF_MAP_CONTENT },
- { NULL },
-};
-
-/* ********************************************************************** */
-/* Tables for bonobo conf -> gconf conversion */
-/* ********************************************************************** */
-
-static e_gconf_map_t mail_accounts_map[] = {
- /* /Mail/Accounts - most entries are processed via the xml blob routine */
- /* This also works because the initial uid mapping is 1:1 with the list order */
- { "default_account", "mail/default_account", E_GCONF_MAP_SIMPLESTRING },
- { 0 },
-};
-
-static e_gconf_map_t mail_display_map[] = {
- /* /Mail/Display */
- { "side_bar_search", "mail/display/side_bar_search", E_GCONF_MAP_BOOL },
- { "thread_list", "mail/display/thread_list", E_GCONF_MAP_BOOL },
- { "thread_subject", "mail/display/thread_subject", E_GCONF_MAP_BOOL },
- { "hide_deleted", "mail/display/show_deleted", E_GCONF_MAP_BOOLNOT },
- { "preview_pane", "mail/display/show_preview", E_GCONF_MAP_BOOL },
- { "paned_size", "mail/display/paned_size", E_GCONF_MAP_INT },
- { "seen_timeout", "mail/display/mark_seen_timeout", E_GCONF_MAP_INT },
- { "do_seen_timeout", "mail/display/mark_seen", E_GCONF_MAP_BOOL },
- { "http_images", "mail/display/load_http_images", E_GCONF_MAP_INT },
- { "citation_highlight", "mail/display/mark_citations", E_GCONF_MAP_BOOL },
- { "citation_color", "mail/display/citation_colour", E_GCONF_MAP_COLOUR },
- { 0 },
-};
-
-static e_gconf_map_t mail_format_map[] = {
- /* /Mail/Format */
- { "message_display_style", "mail/display/message_style", E_GCONF_MAP_INT },
- { "send_html", "mail/composer/send_html", E_GCONF_MAP_BOOL },
- { "default_reply_style", "mail/format/reply_style", E_GCONF_MAP_INT },
- { "default_forward_style", "mail/format/forward_style", E_GCONF_MAP_INT },
- { "default_charset", "mail/composer/charset", E_GCONF_MAP_STRING },
- { "confirm_unwanted_html", "mail/prompts/unwanted_html", E_GCONF_MAP_BOOL },
- { 0 },
-};
-
-static e_gconf_map_t mail_trash_map[] = {
- /* /Mail/Trash */
- { "empty_on_exit", "mail/trash/empty_on_exit", E_GCONF_MAP_BOOL },
- { 0 },
-};
-
-static e_gconf_map_t mail_prompts_map[] = {
- /* /Mail/Prompts */
- { "confirm_expunge", "mail/prompts/expunge", E_GCONF_MAP_BOOL },
- { "empty_subject", "mail/prompts/empty_subject", E_GCONF_MAP_BOOL },
- { "only_bcc", "mail/prompts/only_bcc", E_GCONF_MAP_BOOL },
- { 0 }
-};
-
-static e_gconf_map_t mail_filters_map[] = {
- /* /Mail/Filters */
- { "log", "mail/filters/log", E_GCONF_MAP_BOOL },
- { "log_path", "mail/filters/logfile", E_GCONF_MAP_STRING },
- { 0 }
-};
-
-static e_gconf_map_t mail_notify_map[] = {
- /* /Mail/Notify */
- { "new_mail_notification", "mail/notify/type", E_GCONF_MAP_INT },
- { "new_mail_notification_sound_file", "mail/notify/sound", E_GCONF_MAP_STRING },
- { 0 }
-};
-
-static e_gconf_map_t mail_filesel_map[] = {
- /* /Mail/Filesel */
- { "last_filesel_dir", "mail/save_dir", E_GCONF_MAP_STRING },
- { 0 }
-};
-
-static e_gconf_map_t mail_composer_map[] = {
- /* /Mail/Composer */
- { "ViewFrom", "mail/composer/view/From", E_GCONF_MAP_BOOL },
- { "ViewReplyTo", "mail/composer/view/ReplyTo", E_GCONF_MAP_BOOL },
- { "ViewCC", "mail/composer/view/Cc", E_GCONF_MAP_BOOL },
- { "ViewBCC", "mail/composer/view/Bcc", E_GCONF_MAP_BOOL },
- { "ViewSubject", "mail/composer/view/Subject", E_GCONF_MAP_BOOL },
- { 0 },
-};
-
-/* ********************************************************************** */
-
-static e_gconf_map_t importer_elm_map[] = {
- /* /Importer/Elm */
- { "mail", "importer/elm/mail", E_GCONF_MAP_BOOL },
- { "mail-imported", "importer/elm/mail-imported", E_GCONF_MAP_BOOL },
- { 0 },
-};
-
-static e_gconf_map_t importer_pine_map[] = {
- /* /Importer/Pine */
- { "mail", "importer/elm/mail", E_GCONF_MAP_BOOL },
- { "address", "importer/elm/address", E_GCONF_MAP_BOOL },
- { 0 },
-};
-
-static e_gconf_map_t importer_netscape_map[] = {
- /* /Importer/Netscape */
- { "mail", "importer/netscape/mail", E_GCONF_MAP_BOOL },
- { "settings", "importer/netscape/settings", E_GCONF_MAP_BOOL },
- { "filters", "importer/netscape/filters", E_GCONF_MAP_BOOL },
- { 0 },
-};
-
-/* ********************************************************************** */
-
-static e_gconf_map_list_t gconf_remap_list[] = {
- { "/Mail/Accounts", mail_accounts_map },
- { "/Mail/Display", mail_display_map },
- { "/Mail/Format", mail_format_map },
- { "/Mail/Trash", mail_trash_map },
- { "/Mail/Prompts", mail_prompts_map },
- { "/Mail/Filters", mail_filters_map },
- { "/Mail/Notify", mail_notify_map },
- { "/Mail/Filesel", mail_filesel_map },
- { "/Mail/Composer", mail_composer_map },
-
- { "/Importer/Elm", importer_elm_map },
- { "/Importer/Pine", importer_pine_map },
- { "/Importer/Netscape", importer_netscape_map },
-
- { 0 },
-};
-
-static struct {
- const gchar *label;
- const gchar *colour;
-} label_default[5] = {
- { N_("Important"), "#EF2929" }, /* red */
- { N_("Work"), "#F57900" }, /* orange */
- { N_("Personal"), "#4E9A06" }, /* green */
- { N_("To Do"), "#3465A4" }, /* blue */
- { N_("Later"), "#75507B" } /* purple */
-};
-
-/* remaps mail config from bconf to gconf */
-static gboolean
-bconf_import(GConfClient *gconf, xmlDocPtr config_xmldb)
-{
- xmlNodePtr source;
- gchar labx[16], colx[16];
- gchar *val, *lab, *col;
- GSList *list, *l;
- gint i;
-
- e_bconf_import(gconf, config_xmldb, gconf_remap_list);
-
- /* Labels:
- label string + label colour as integer
- -> label string:# colour as hex */
- source = e_bconf_get_path(config_xmldb, "/Mail/Labels");
- if (source) {
- list = NULL;
- for (i = 0; i < 5; i++) {
- sprintf(labx, "label_%d", i);
- sprintf(colx, "color_%d", i);
- lab = e_bconf_get_string(source, labx);
- if ((col = e_bconf_get_value(source, colx))) {
- sprintf(colx, "#%06x", atoi(col) & 0xffffff);
- g_free(col);
- } else
- strcpy(colx, label_default[i].colour);
-
- val = g_strdup_printf("%s:%s", lab ? lab : label_default[i].label, colx);
- list = g_slist_append(list, val);
- g_free(lab);
- }
-
- gconf_client_set_list(gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, list, NULL);
- while (list) {
- l = list->next;
- g_free(list->data);
- g_slist_free_1(list);
- list = l;
- }
- } else {
- g_warning("could not find /Mail/Labels in old config database, skipping");
- }
-
- /* Accounts: The flat bonobo-config structure is remapped to a list of xml blobs. Upgrades as necessary */
- e_bconf_import_xml_blob(gconf, config_xmldb, account_map, "/Mail/Accounts",
- "/apps/evolution/mail/accounts", "account", "uid");
-
- /* Same for signatures */
- e_bconf_import_xml_blob(gconf, config_xmldb, signature_map, "/Mail/Signatures",
- "/apps/evolution/mail/signatures", "signature", NULL);
-
- return TRUE;
-}
-
-static gboolean
-em_migrate_1_2(const gchar *data_dir, xmlDocPtr config_xmldb, xmlDocPtr filters, xmlDocPtr vfolders, GError **error)
-{
- GConfClient *gconf;
-
- gconf = gconf_client_get_default();
- bconf_import(gconf, config_xmldb);
- g_object_unref(gconf);
-
- em_upgrade_xml_1_2(filters);
- em_upgrade_xml_1_2(vfolders);
-
- return TRUE;
-}
-
-/* 1.4 upgrade functions */
-
-#define EM_MIGRATE_SESSION_TYPE (em_migrate_session_get_type ())
-#define EM_MIGRATE_SESSION(obj) (CAMEL_CHECK_CAST((obj), EM_MIGRATE_SESSION_TYPE, EMMigrateSession))
-#define EM_MIGRATE_SESSION_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), EM_MIGRATE_SESSION_TYPE, EMMigrateSessionClass))
-#define EM_MIGRATE_IS_SESSION(o) (CAMEL_CHECK_TYPE((o), EM_MIGRATE_SESSION_TYPE))
-
-typedef struct _EMMigrateSession {
- CamelSession parent_object;
-
- CamelStore *store; /* new folder tree store */
- gchar *srcdir; /* old folder tree path */
-} EMMigrateSession;
-
-typedef struct _EMMigrateSessionClass {
- CamelSessionClass parent_class;
-
-} EMMigrateSessionClass;
-
-static CamelType em_migrate_session_get_type (void);
-static CamelSession *em_migrate_session_new (const gchar *path);
-
-static void
-class_init (EMMigrateSessionClass *klass)
-{
- ;
-}
-
-static CamelType
-em_migrate_session_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- type = camel_type_register (
- camel_session_get_type (),
- "EMMigrateSession",
- sizeof (EMMigrateSession),
- sizeof (EMMigrateSessionClass),
- (CamelObjectClassInitFunc) class_init,
- NULL,
- NULL,
- NULL);
- }
-
- return type;
-}
-
-static CamelSession *
-em_migrate_session_new (const gchar *path)
-{
- CamelSession *session;
-
- session = CAMEL_SESSION (camel_object_new (EM_MIGRATE_SESSION_TYPE));
-
- camel_session_construct (session, path);
-
- return session;
-}
-
-
-#endif /* !G_OS_WIN32 */
-
-static GtkWidget *window;
-static GtkLabel *label;
-static GtkProgressBar *progress;
-
-static void
-em_migrate_setup_progress_dialog (const gchar *title, const gchar *desc)
-{
- GtkWidget *vbox, *hbox, *w;
- gchar *markup;
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title ((GtkWindow *) window, _("Migrating..."));
- gtk_window_set_modal ((GtkWindow *) window, TRUE);
- gtk_container_set_border_width ((GtkContainer *) window, 6);
-
- vbox = gtk_vbox_new (FALSE, 6);
- gtk_widget_show (vbox);
- gtk_container_add ((GtkContainer *) window, vbox);
-
- w = gtk_label_new (desc);
-
- gtk_label_set_line_wrap ((GtkLabel *) w, TRUE);
- gtk_widget_show (w);
- gtk_box_pack_start_defaults ((GtkBox *) vbox, w);
-
- hbox = gtk_hbox_new (FALSE, 6);
- gtk_widget_show (hbox);
- gtk_box_pack_start_defaults ((GtkBox *) vbox, hbox);
-
- label = (GtkLabel *) gtk_label_new ("");
- gtk_widget_show ((GtkWidget *) label);
- gtk_box_pack_start_defaults ((GtkBox *) hbox, (GtkWidget *) label);
-
- progress = (GtkProgressBar *) gtk_progress_bar_new ();
- gtk_widget_show ((GtkWidget *) progress);
- gtk_box_pack_start_defaults ((GtkBox *) hbox, (GtkWidget *) progress);
-
- /* Prepare the message */
- vbox = gtk_vbox_new (FALSE, 12);
- gtk_widget_show (vbox);
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
-
- w = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0);
- markup = g_strconcat ("<big><b>", title ? title : _("Migration"), "</b></big>", NULL);
- gtk_label_set_markup (GTK_LABEL (w), markup);
- gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0);
- g_free (markup);
-
- w = gtk_label_new (desc);
- gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0);
- gtk_label_set_line_wrap (GTK_LABEL (w), TRUE);
- gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0);
-
- /* Progress bar */
- w = gtk_vbox_new (FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0);
-
- label = GTK_LABEL (gtk_label_new (""));
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
- gtk_label_set_line_wrap (label, TRUE);
- gtk_widget_show (GTK_WIDGET (label));
- gtk_box_pack_start (GTK_BOX (w), GTK_WIDGET (label), TRUE, TRUE, 0);
-
- progress = GTK_PROGRESS_BAR (gtk_progress_bar_new ());
- gtk_widget_show (GTK_WIDGET (progress));
- gtk_box_pack_start (GTK_BOX (w), GTK_WIDGET (progress), TRUE, TRUE, 0);
-
- gtk_container_add (GTK_CONTAINER (window), hbox);
- gtk_widget_show_all (hbox);
- gtk_widget_show (window);
-}
-
-static void
-em_migrate_close_progress_dialog (void)
-{
- gtk_widget_destroy ((GtkWidget *) window);
-}
-
-static void
-em_migrate_set_folder_name (const gchar *folder_name)
-{
- gchar *text;
-
- text = g_strdup_printf (_("Migrating '%s':"), folder_name);
- gtk_label_set_text (label, text);
- g_free (text);
-
- gtk_progress_bar_set_fraction (progress, 0.0);
- while (gtk_events_pending ())
- gtk_main_iteration ();
-}
-
-static void
-em_migrate_set_progress (double percent)
-{
- gchar text[5];
-
- snprintf (text, sizeof (text), "%d%%", (gint) (percent * 100.0f));
-
- gtk_progress_bar_set_fraction (progress, percent);
- gtk_progress_bar_set_text (progress, text);
-
- while (gtk_events_pending ())
- gtk_main_iteration ();
-}
-
-#ifndef G_OS_WIN32
-
-static gboolean
-is_mail_folder (const gchar *metadata)
-{
- xmlNodePtr node;
- xmlDocPtr doc;
- gchar *type;
-
- if (!(doc = xmlParseFile (metadata))) {
- g_warning ("Cannot parse `%s'", metadata);
- return FALSE;
- }
-
- if (!(node = xmlDocGetRootElement (doc))) {
- g_warning ("`%s' corrupt: document contains no root node", metadata);
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- if (!node->name || strcmp ((gchar *)node->name, "efolder") != 0) {
- g_warning ("`%s' corrupt: root node is not 'efolder'", metadata);
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- node = node->children;
- while (node != NULL) {
- if (node->name && !strcmp ((gchar *)node->name, "type")) {
- type = (gchar *)xmlNodeGetContent (node);
- if (!strcmp ((gchar *)type, "mail")) {
- xmlFreeDoc (doc);
- xmlFree (type);
-
- return TRUE;
- }
-
- xmlFree (type);
-
- break;
- }
-
- node = node->next;
- }
-
- xmlFreeDoc (doc);
-
- return FALSE;
-}
-
-static gboolean
-get_local_et_expanded (const gchar *dirname)
-{
- xmlNodePtr node;
- xmlDocPtr doc;
- struct stat st;
- gchar *buf, *p;
- gint thread_list;
-
- buf = g_strdup_printf ("%s/evolution/config/file:%s", g_get_home_dir (), dirname);
- p = buf + strlen (g_get_home_dir ()) + strlen ("/evolution/config/file:");
- e_filename_make_safe (p);
-
- if (stat (buf, &st) == -1) {
- g_free (buf);
- return FALSE;
- }
-
- if (!(doc = xmlParseFile (buf))) {
- g_free (buf);
- return FALSE;
- }
-
- g_free (buf);
-
- if (!(node = xmlDocGetRootElement (doc)) || strcmp ((gchar *)node->name, "expanded_state") != 0) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- if (!(buf = (gchar *)xmlGetProp (node, (const guchar *)"default"))) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- thread_list = strcmp (buf, "0") == 0 ? 0 : 1;
- xmlFree (buf);
-
- xmlFreeDoc (doc);
-
- return thread_list;
-}
-
-static gchar *
-get_local_store_uri (const gchar *dirname, gchar **namep, gint *indexp)
-{
- gchar *name, *protocol, *metadata, *tmp;
- gint index;
- struct stat st;
- xmlNodePtr node;
- xmlDocPtr doc;
-
- metadata = g_build_filename(dirname, "local-metadata.xml", NULL);
-
- /* in 1.4, any errors are treated as defaults, this function cannot fail */
-
- /* defaults */
- name = (gchar *) "mbox";
- protocol = (gchar *) "mbox";
- index = TRUE;
-
- if (stat (metadata, &st) == -1 || !S_ISREG (st.st_mode))
- goto nofile;
-
- doc = xmlParseFile(metadata);
- if (doc == NULL)
- goto nofile;
-
- node = doc->children;
- if (strcmp((gchar *)node->name, "folderinfo"))
- goto dodefault;
-
- for (node = node->children; node; node = node->next) {
- if (node->name && !strcmp ((gchar *)node->name, "folder")) {
- tmp = (gchar *)xmlGetProp (node, (const guchar *)"type");
- if (tmp) {
- protocol = alloca(strlen(tmp)+1);
- strcpy(protocol, tmp);
- xmlFree(tmp);
- }
- tmp = (gchar *)xmlGetProp (node, (const guchar *)"name");
- if (tmp) {
- name = alloca(strlen(tmp)+1);
- strcpy(name, tmp);
- xmlFree(tmp);
- }
- tmp = (gchar *)xmlGetProp (node, (const guchar *)"index");
- if (tmp) {
- index = atoi(tmp);
- xmlFree(tmp);
- }
- }
- }
-dodefault:
- xmlFreeDoc (doc);
-nofile:
- g_free(metadata);
-
- *namep = g_strdup(name);
- *indexp = index;
-
- return g_strdup_printf("%s:%s", protocol, dirname);
-}
-
-#endif /* !G_OS_WIN32 */
-
-enum {
- CP_UNIQUE = 0,
- CP_OVERWRITE,
- CP_APPEND
-};
-
-static gint open_flags[3] = {
- O_WRONLY | O_CREAT | O_TRUNC,
- O_WRONLY | O_CREAT | O_TRUNC,
- O_WRONLY | O_CREAT | O_APPEND,
-};
-
-static gboolean
-cp (const gchar *src, const gchar *dest, gboolean show_progress, gint mode)
-{
- guchar readbuf[65536];
- gssize nread, nwritten;
- gint errnosav, readfd, writefd;
- gsize total = 0;
- struct stat st;
- struct utimbuf ut;
-
- /* if the dest file exists and has content, abort - we don't
- * want to corrupt their existing data */
- if (g_stat (dest, &st) == 0 && st.st_size > 0 && mode == CP_UNIQUE) {
- errno = EEXIST;
- return FALSE;
- }
-
- if (g_stat (src, &st) == -1
- || (readfd = g_open (src, O_RDONLY | O_BINARY, 0)) == -1)
- return FALSE;
-
- if ((writefd = g_open (dest, open_flags[mode] | O_BINARY, 0666)) == -1) {
- errnosav = errno;
- close (readfd);
- errno = errnosav;
- return FALSE;
- }
-
- do {
- do {
- nread = read (readfd, readbuf, sizeof (readbuf));
- } while (nread == -1 && errno == EINTR);
-
- if (nread == 0)
- break;
- else if (nread < 0)
- goto exception;
-
- do {
- nwritten = write (writefd, readbuf, nread);
- } while (nwritten == -1 && errno == EINTR);
-
- if (nwritten < nread)
- goto exception;
-
- total += nwritten;
- if (show_progress)
- em_migrate_set_progress (((double) total) / ((double) st.st_size));
- } while (total < st.st_size);
-
- if (fsync (writefd) == -1)
- goto exception;
-
- close (readfd);
- if (close (writefd) == -1)
- goto failclose;
-
- ut.actime = st.st_atime;
- ut.modtime = st.st_mtime;
- utime (dest, &ut);
- chmod (dest, st.st_mode);
-
- return TRUE;
-
- exception:
-
- errnosav = errno;
- close (readfd);
- close (writefd);
- errno = errnosav;
-
- failclose:
-
- errnosav = errno;
- unlink (dest);
- errno = errnosav;
-
- return FALSE;
-}
-
-#ifndef G_OS_WIN32
-
-static gboolean
-cp_r (const gchar *src, const gchar *dest, const gchar *pattern, gint mode)
-{
- GString *srcpath, *destpath;
- struct dirent *dent;
- gsize slen, dlen;
- struct stat st;
- DIR *dir;
-
- if (g_mkdir_with_parents (dest, 0777) == -1)
- return FALSE;
-
- if (!(dir = opendir (src)))
- return FALSE;
-
- srcpath = g_string_new (src);
- g_string_append_c (srcpath, '/');
- slen = srcpath->len;
-
- destpath = g_string_new (dest);
- g_string_append_c (destpath, '/');
- dlen = destpath->len;
-
- while ((dent = readdir (dir))) {
- if (!strcmp (dent->d_name, ".") || !strcmp (dent->d_name, ".."))
- continue;
-
- g_string_truncate (srcpath, slen);
- g_string_truncate (destpath, dlen);
-
- g_string_append (srcpath, dent->d_name);
- g_string_append (destpath, dent->d_name);
-
- if (stat (srcpath->str, &st) == -1)
- continue;
-
- if (S_ISDIR (st.st_mode)) {
- cp_r (srcpath->str, destpath->str, pattern, mode);
- } else if (!pattern || !strcmp (dent->d_name, pattern)) {
- cp (srcpath->str, destpath->str, FALSE, mode);
- }
- }
-
- closedir (dir);
-
- g_string_free (destpath, TRUE);
- g_string_free (srcpath, TRUE);
-
- return TRUE;
-}
-
-static void
-mbox_build_filename (GString *path, const gchar *toplevel_dir, const gchar *full_name)
-{
- const gchar *start, *inptr = full_name;
- gint subdirs = 0;
-
- while (*inptr != '\0') {
- if (*inptr == '/')
- subdirs++;
- inptr++;
- }
-
- g_string_assign(path, toplevel_dir);
- g_string_append_c (path, '/');
-
- inptr = full_name;
- while (*inptr != '\0') {
- start = inptr;
- while (*inptr != '/' && *inptr != '\0')
- inptr++;
-
- g_string_append_len (path, start, inptr - start);
-
- if (*inptr == '/') {
- g_string_append (path, ".sbd/");
- inptr++;
-
- /* strip extranaeous '/'s */
- while (*inptr == '/')
- inptr++;
- }
- }
-}
-
-static gboolean
-em_migrate_folder(EMMigrateSession *session, const gchar *dirname, const gchar *full_name, GError **error)
-{
- CamelFolder *old_folder = NULL, *new_folder = NULL;
- CamelStore *local_store = NULL;
- CamelException ex;
- gchar *name, *uri;
- GPtrArray *uids;
- struct stat st;
- gboolean thread_list;
- gint index, i;
- GString *src, *dest;
- gboolean success = FALSE;
-
- camel_exception_init (&ex);
-
- src = g_string_new("");
-
- g_string_printf(src, "%s/folder-metadata.xml", dirname);
- if (stat (src->str, &st) == -1
- || !S_ISREG (st.st_mode)
- || !is_mail_folder(src->str)) {
- /* Not an evolution mail folder */
- g_string_free(src, TRUE);
- return TRUE;
- }
-
- dest = g_string_new("");
- uri = get_local_store_uri(dirname, &name, &index);
- em_migrate_set_folder_name (full_name);
- thread_list = get_local_et_expanded (dirname);
-
- /* Manually copy local mbox files, its much faster */
- if (!strncmp (uri, "mbox:", 5)) {
- static const gchar *meta_ext[] = { ".summary", ".ibex.index", ".ibex.index.data" };
- gsize slen, dlen;
- FILE *fp;
- gchar *p;
- gint mode;
-
- g_string_printf (src, "%s/%s", uri + 5, name);
- mbox_build_filename (dest, ((CamelService *)session->store)->url->path, full_name);
- p = strrchr (dest->str, '/');
- *p = '\0';
-
- slen = src->len;
- dlen = dest->len;
-
- if (g_mkdir_with_parents (dest->str, 0777) == -1 && errno != EEXIST) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Unable to create new folder `%s': %s"),
- dest->str, g_strerror (errno));
- goto fatal;
- }
-
- *p = '/';
- mode = CP_UNIQUE;
- retry_copy:
- if (!cp (src->str, dest->str, TRUE, mode)) {
- if (errno == EEXIST) {
- gint save = errno;
-
- switch (e_error_run(NULL, "mail:ask-migrate-existing", src->str, dest->str, NULL)) {
- case GTK_RESPONSE_ACCEPT:
- mode = CP_OVERWRITE;
- goto retry_copy;
- case GTK_RESPONSE_OK:
- mode = CP_APPEND;
- goto retry_copy;
- case GTK_RESPONSE_REJECT:
- goto ignore;
- }
-
- errno = save;
- }
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Unable to copy folder `%s' to `%s': %s"),
- src->str, dest->str, g_strerror (errno));
- goto fatal;
- }
- ignore:
-
- /* create a .cmeta file specifying to index and/or thread the folder */
- g_string_truncate (dest, dlen);
- g_string_append (dest, ".cmeta");
- if ((fp = fopen (dest->str, "w")) != NULL) {
- gint fd = fileno (fp);
-
- /* write the magic string */
- if (fwrite ("CLMD", 4, 1, fp) != 1)
- goto cmeta_err;
-
- /* write the version (1) */
- if (camel_file_util_encode_uint32 (fp, 1) == -1)
- goto cmeta_err;
-
- /* write the meta count */
- if (camel_file_util_encode_uint32 (fp, thread_list ? 1 : 0) == -1)
- goto cmeta_err;
-
- if (!thread_list) {
- if (camel_file_util_encode_string (fp, "evolution:thread_list") == -1)
- goto cmeta_err;
-
- if (camel_file_util_encode_string (fp, !thread_list ? "1" : "0") == -1)
- goto cmeta_err;
- }
-
- /* write the prop count (only prop is the index prop) */
- if (camel_file_util_encode_uint32 (fp, 1) == -1)
- goto cmeta_err;
-
- /* write the index prop tag (== CAMEL_FOLDER_ARG_LAST|CAMEL_ARG_BOO) */
- if (camel_file_util_encode_uint32 (fp, CAMEL_FOLDER_ARG_LAST|CAMEL_ARG_BOO) == -1)
- goto cmeta_err;
-
- /* write the index prop value */
- if (camel_file_util_encode_uint32 (fp, 1) == -1)
- goto cmeta_err;
-
- fflush (fp);
-
- if (fsync (fd) == -1) {
- cmeta_err:
- fclose (fp);
- unlink (dest->str);
- } else {
- fclose (fp);
- }
- }
-
- /* copy over the metadata files */
- for (i = 0; i < sizeof(meta_ext)/sizeof(meta_ext[0]); i++) {
- g_string_truncate (src, slen);
- g_string_truncate (dest, dlen);
-
- g_string_append (src, meta_ext[i]);
- g_string_append (dest, meta_ext[i]);
- cp (src->str, dest->str, FALSE, CP_OVERWRITE);
- }
- } else {
- guint32 flags = CAMEL_STORE_FOLDER_CREATE;
-
- if (!(local_store = camel_session_get_store ((CamelSession *) session, uri, &ex))
- || !(old_folder = camel_store_get_folder (local_store, name, 0, &ex)))
- goto fatal;
-
- flags |= (index ? CAMEL_STORE_FOLDER_BODY_INDEX : 0);
- if (!(new_folder = camel_store_get_folder (session->store, full_name, flags, &ex)))
- goto fatal;
-
- if (!thread_list) {
- camel_object_meta_set (new_folder, "evolution:thread_list", !thread_list ? "1" : "0");
- camel_object_state_write (new_folder);
- }
-
- uids = camel_folder_get_uids (old_folder);
- for (i = 0; i < uids->len; i++) {
- CamelMimeMessage *message;
- CamelMessageInfo *info;
-
- if (!(info = camel_folder_get_message_info (old_folder, uids->pdata[i])))
- continue;
-
- if (!(message = camel_folder_get_message (old_folder, uids->pdata[i], &ex))) {
- camel_folder_free_message_info (old_folder, info);
- camel_folder_free_uids (old_folder, uids);
- goto fatal;
- }
-
- camel_folder_append_message (new_folder, message, info, NULL, &ex);
- camel_folder_free_message_info (old_folder, info);
- camel_object_unref (message);
-
- if (camel_exception_is_set (&ex))
- break;
-
- em_migrate_set_progress (((double) i + 1) / ((double) uids->len));
- }
-
- camel_folder_free_uids (old_folder, uids);
-
- if (camel_exception_is_set (&ex))
- goto fatal;
- }
- success = TRUE;
-fatal:
- g_free (uri);
- g_free (name);
- g_string_free(src, TRUE);
- g_string_free(dest, TRUE);
- if (local_store)
- camel_object_unref(local_store);
- if (old_folder)
- camel_object_unref(old_folder);
- if (new_folder)
- camel_object_unref(new_folder);
-
- if (camel_exception_is_set (&ex)) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- "%s", camel_exception_get_description (&ex));
- camel_exception_clear (&ex);
- }
-
- return success;
-}
-
-static gboolean
-em_migrate_dir (EMMigrateSession *session, const gchar *dirname, const gchar *full_name, GError **error)
-{
- gchar *path;
- DIR *dir;
- struct stat st;
- struct dirent *dent;
- gboolean success = TRUE;
-
- if (!em_migrate_folder(session, dirname, full_name, error))
- return FALSE;
-
- /* no subfolders, not readable, don't care */
- path = g_strdup_printf ("%s/subfolders", dirname);
- if (stat (path, &st) == -1 || !S_ISDIR (st.st_mode)) {
- g_free (path);
- return TRUE;
- }
-
- if (!(dir = opendir (path))) {
- g_free (path);
- return TRUE;
- }
-
- while (success && (dent = readdir (dir))) {
- gchar *full_path;
- gchar *name;
-
- if (dent->d_name[0] == '.')
- continue;
-
- full_path = g_strdup_printf ("%s/%s", path, dent->d_name);
- if (stat (full_path, &st) == -1 || !S_ISDIR (st.st_mode)) {
- g_free (full_path);
- continue;
- }
-
- name = g_strdup_printf ("%s/%s", full_name, dent->d_name);
- success = em_migrate_dir (session, full_path, name, error);
- g_free (full_path);
- g_free (name);
- }
-
- closedir (dir);
-
- g_free (path);
-
- return success;
-}
-
-static gboolean
-em_migrate_local_folders_1_4 (EMMigrateSession *session, GError **error)
-{
- struct dirent *dent;
- struct stat st;
- DIR *dir;
- gboolean success = TRUE;
-
- if (!(dir = opendir (session->srcdir))) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Unable to scan for existing mailboxes at "
- "`%s': %s"), session->srcdir, g_strerror (errno));
- return FALSE;
- }
-
- em_migrate_setup_progress_dialog (
- _("Migrating Folders"),
- _("The location and hierarchy of the Evolution mailbox "
- "folders has changed since Evolution 1.x.\n\nPlease be "
- "patient while Evolution migrates your folders..."));
-
- while (success && (dent = readdir (dir))) {
- gchar *full_path;
-
- if (dent->d_name[0] == '.')
- continue;
-
- full_path = g_strdup_printf ("%s/%s", session->srcdir, dent->d_name);
- if (stat (full_path, &st) == -1 || !S_ISDIR (st.st_mode)) {
- g_free (full_path);
- continue;
- }
-
- success = em_migrate_dir (session, full_path, dent->d_name, error);
- g_free (full_path);
- }
-
- closedir (dir);
-
- em_migrate_close_progress_dialog ();
-
- return success;
-}
-
-static gchar *
-upgrade_xml_uris_1_4 (const gchar *uri)
-{
- gchar *path, *prefix, *p;
- CamelURL *url;
-
- if (!strncmp (uri, "file:", 5)) {
- url = camel_url_new (uri, NULL);
- camel_url_set_protocol (url, "email");
- camel_url_set_user (url, "local");
- camel_url_set_host (url, "local");
-
- prefix = g_build_filename (g_get_home_dir (), "evolution", "local", NULL);
- if (strncmp (url->path, prefix, strlen (prefix)) != 0) {
- /* uri is busticated - user probably copied from another user's home directory */
- camel_url_free (url);
- g_free (prefix);
-
- return g_strdup (uri);
- }
- path = g_strdup (url->path + strlen (prefix));
- g_free (prefix);
-
- /* modify the path in-place */
- p = path + strlen (path) - 12;
- while (p > path) {
- if (!strncmp (p, "/subfolders/", 12))
- memmove (p, p + 11, strlen (p + 11) + 1);
-
- p--;
- }
-
- camel_url_set_path (url, path);
- g_free (path);
-
- path = camel_url_to_string (url, 0);
- camel_url_free (url);
-
- return path;
- } else {
- return em_uri_from_camel (uri);
- }
-}
-
-static void
-upgrade_vfolder_sources_1_4 (xmlDocPtr doc)
-{
- xmlNodePtr root, node;
-
- if (!doc || !(root = xmlDocGetRootElement (doc)))
- return;
-
- if (!root->name || strcmp ((gchar *)root->name, "filteroptions") != 0) {
- /* root node is not <filteroptions>, nothing to upgrade */
- return;
- }
-
- if (!(node = xml_find_node (root, "ruleset"))) {
- /* no ruleset node, nothing to upgrade */
- return;
- }
-
- node = node->children;
- while (node != NULL) {
- if (node->name && !strcmp ((gchar *)node->name, "rule")) {
- xmlNodePtr sources;
- gchar *src;
-
- if (!(src = (gchar *)xmlGetProp (node, (const guchar *)"source")))
- src = (gchar *)xmlStrdup ((const guchar *)"local"); /* default to all local folders? */
-
- xmlSetProp (node, (const guchar *)"source", (const guchar *)"incoming");
-
- if (!(sources = xml_find_node (node, "sources")))
- sources = xmlNewChild (node, NULL, (const guchar *)"sources", NULL);
-
- xmlSetProp (sources, (const guchar *)"with", (guchar *)src);
- xmlFree (src);
- }
-
- node = node->next;
- }
-}
-
-static gchar *
-get_nth_sig (gint id)
-{
- ESignatureList *list;
- ESignature *sig;
- EIterator *iter;
- gchar *uid = NULL;
- gint i = 0;
-
- list = e_get_signature_list ();
- iter = e_list_get_iterator ((EList *) list);
-
- while (e_iterator_is_valid (iter) && i < id) {
- e_iterator_next (iter);
- i++;
- }
-
- if (i == id && e_iterator_is_valid (iter)) {
- sig = (ESignature *) e_iterator_get (iter);
- uid = g_strdup (sig->uid);
- }
-
- g_object_unref (iter);
-
- return uid;
-}
-
-static void
-em_upgrade_accounts_1_4 (void)
-{
- EAccountList *accounts;
- EIterator *iter;
-
- if (!(accounts = e_get_account_list ()))
- return;
-
- iter = e_list_get_iterator ((EList *) accounts);
- while (e_iterator_is_valid (iter)) {
- EAccount *account = (EAccount *) e_iterator_get (iter);
- gchar *url;
-
- if (account->drafts_folder_uri) {
- url = upgrade_xml_uris_1_4 (account->drafts_folder_uri);
- g_free (account->drafts_folder_uri);
- account->drafts_folder_uri = url;
- }
-
- if (account->sent_folder_uri) {
- url = upgrade_xml_uris_1_4 (account->sent_folder_uri);
- g_free (account->sent_folder_uri);
- account->sent_folder_uri = url;
- }
-
- if (account->id->sig_uid && !strncmp (account->id->sig_uid, "::", 2)) {
- gint sig_id;
-
- sig_id = strtol (account->id->sig_uid + 2, NULL, 10);
- g_free (account->id->sig_uid);
- account->id->sig_uid = get_nth_sig (sig_id);
- }
-
- e_iterator_next (iter);
- }
-
- g_object_unref (iter);
-
- e_account_list_save (accounts);
-}
-
-static gboolean
-em_migrate_pop_uid_caches_1_4 (const gchar *data_dir, GError **error)
-{
- GString *oldpath, *newpath;
- struct dirent *dent;
- gsize olen, nlen;
- gchar *cache_dir;
- DIR *dir;
- gboolean success = TRUE;
-
- /* Sigh, too many unique strings to translate, for cases which shouldn't ever happen */
-
- /* open the old cache dir */
- cache_dir = g_build_filename (g_get_home_dir (), "evolution", "mail", "pop3", NULL);
- if (!(dir = opendir (cache_dir))) {
- if (errno == ENOENT) {
- g_free(cache_dir);
- return TRUE;
- }
-
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Unable to open old POP keep-on-server data "
- "`%s': %s"), cache_dir, g_strerror (errno));
- g_free (cache_dir);
- return FALSE;
- }
-
- oldpath = g_string_new (cache_dir);
- g_string_append_c (oldpath, '/');
- olen = oldpath->len;
- g_free (cache_dir);
-
- cache_dir = g_build_filename (data_dir, "pop", NULL);
- if (g_mkdir_with_parents (cache_dir, 0777) == -1) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Unable to create POP3 keep-on-server data "
- "directory `%s': %s"), cache_dir,
- g_strerror (errno));
- g_string_free (oldpath, TRUE);
- g_free (cache_dir);
- closedir (dir);
- return FALSE;
- }
-
- newpath = g_string_new (cache_dir);
- g_string_append_c (newpath, '/');
- nlen = newpath->len;
- g_free (cache_dir);
-
- while (success && (dent = readdir (dir))) {
- if (strncmp (dent->d_name, "cache-pop:__", 12) != 0)
- continue;
-
- g_string_truncate (oldpath, olen);
- g_string_truncate (newpath, nlen);
-
- g_string_append (oldpath, dent->d_name);
- g_string_append (newpath, dent->d_name + 12);
-
- /* strip the trailing '_' */
- g_string_truncate (newpath, newpath->len - 1);
-
- if (g_mkdir_with_parents (newpath->str, 0777) == -1
- || !cp(oldpath->str, (g_string_append(newpath, "/uid-cache"))->str, FALSE, CP_UNIQUE)) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Unable to copy POP3 keep-on-server data "
- "`%s': %s"), oldpath->str,
- g_strerror (errno));
- success = FALSE;
- }
-
- }
-
- g_string_free (oldpath, TRUE);
- g_string_free (newpath, TRUE);
-
- closedir (dir);
-
- return success;
-}
-
-static gboolean
-em_migrate_imap_caches_1_4 (const gchar *data_dir, GError **error)
-{
- gchar *src, *dest;
- struct stat st;
-
- src = g_build_filename (g_get_home_dir (), "evolution", "mail", "imap", NULL);
- if (stat (src, &st) == -1 || !S_ISDIR (st.st_mode)) {
- g_free (src);
- return TRUE;
- }
-
- dest = g_build_filename (data_dir, "imap", NULL);
-
- /* we don't care if this fails, it's only a cache... */
- cp_r (src, dest, "summary", CP_OVERWRITE);
-
- g_free (dest);
- g_free (src);
-
- return TRUE;
-}
-
-static gboolean
-em_migrate_folder_expand_state_1_4 (const gchar *data_dir, GError **error)
-{
- GString *srcpath, *destpath;
- gsize slen, dlen, rlen;
- gchar *evo14_mbox_root;
- struct dirent *dent;
- struct stat st;
- DIR *dir;
-
- srcpath = g_string_new (g_get_home_dir ());
- g_string_append (srcpath, "/evolution/config");
- if (stat (srcpath->str, &st) == -1 || !S_ISDIR (st.st_mode)) {
- g_string_free (srcpath, TRUE);
- return TRUE;
- }
-
- destpath = g_string_new (data_dir);
- g_string_append (destpath, "/config");
- if (g_mkdir_with_parents (destpath->str, 0777) == -1 || !(dir = opendir (srcpath->str))) {
- g_string_free (destpath, TRUE);
- g_string_free (srcpath, TRUE);
- return TRUE;
- }
-
- g_string_append (srcpath, "/et-expanded-");
- slen = srcpath->len;
- g_string_append (destpath, "/et-expanded-");
- dlen = destpath->len;
-
- evo14_mbox_root = g_build_filename (g_get_home_dir (), "evolution", "local", NULL);
- e_filename_make_safe (evo14_mbox_root);
- rlen = strlen (evo14_mbox_root);
- evo14_mbox_root = g_realloc (evo14_mbox_root, rlen + 2);
- evo14_mbox_root[rlen++] = '_';
- evo14_mbox_root[rlen] = '\0';
-
- while ((dent = readdir (dir))) {
- gchar *full_name, *inptr, *buf = NULL;
- const gchar *filename;
- GString *new;
-
- if (strncmp (dent->d_name, "et-expanded-", 12) != 0)
- continue;
-
- if (!strncmp (dent->d_name + 12, "file:", 5)) {
- /* need to munge the filename */
- inptr = dent->d_name + 17;
-
- if (!strncmp (inptr, evo14_mbox_root, rlen)) {
- /* this should always be the case afaik... */
- inptr += rlen;
- new = g_string_new ("mbox:");
- g_string_append_printf (new, "%s/local#", data_dir);
-
- full_name = g_strdup (inptr);
- inptr = full_name + strlen (full_name) - 12;
- while (inptr > full_name) {
- if (!strncmp (inptr, "_subfolders_", 12))
- memmove (inptr, inptr + 11, strlen (inptr + 11) + 1);
-
- inptr--;
- }
-
- g_string_append (new, full_name);
- g_free (full_name);
-
- filename = buf = new->str;
- g_string_free (new, FALSE);
- e_filename_make_safe (buf);
- } else {
- /* but just in case... */
- filename = dent->d_name + 12;
- }
- } else {
- /* no munging needed */
- filename = dent->d_name + 12;
- }
-
- g_string_append (srcpath, dent->d_name + 12);
- g_string_append (destpath, filename);
- g_free (buf);
-
- cp (srcpath->str, destpath->str, FALSE, CP_UNIQUE);
-
- g_string_truncate (srcpath, slen);
- g_string_truncate (destpath, dlen);
- }
-
- closedir (dir);
-
- g_free (evo14_mbox_root);
- g_string_free (destpath, TRUE);
- g_string_free (srcpath, TRUE);
-
- return TRUE;
-}
-
-static gboolean
-em_migrate_folder_view_settings_1_4 (const gchar *data_dir, GError **error)
-{
- GString *srcpath, *destpath;
- gsize slen, dlen, rlen;
- gchar *evo14_mbox_root;
- struct dirent *dent;
- struct stat st;
- DIR *dir;
-
- srcpath = g_string_new (g_get_home_dir ());
- g_string_append (srcpath, "/evolution/views/mail");
- if (stat (srcpath->str, &st) == -1 || !S_ISDIR (st.st_mode)) {
- g_string_free (srcpath, TRUE);
- return TRUE;
- }
-
- destpath = g_string_new (data_dir);
- g_string_append (destpath, "/views");
- if (g_mkdir_with_parents (destpath->str, 0777) == -1 || !(dir = opendir (srcpath->str))) {
- g_string_free (destpath, TRUE);
- g_string_free (srcpath, TRUE);
- return TRUE;
- }
-
- g_string_append_c (srcpath, '/');
- slen = srcpath->len;
- g_string_append_c (destpath, '/');
- dlen = destpath->len;
-
- evo14_mbox_root = g_build_filename (g_get_home_dir (), "evolution", "local", NULL);
- e_filename_make_safe (evo14_mbox_root);
- rlen = strlen (evo14_mbox_root);
- evo14_mbox_root = g_realloc (evo14_mbox_root, rlen + 2);
- evo14_mbox_root[rlen++] = '_';
- evo14_mbox_root[rlen] = '\0';
-
- while ((dent = readdir (dir))) {
- gchar *full_name, *inptr, *buf = NULL;
- const gchar *filename, *ext;
- gsize prelen = 0;
- GString *new;
-
- if (dent->d_name[0] == '.')
- continue;
-
- if (!(ext = strrchr (dent->d_name, '.')))
- continue;
-
- if (!strcmp (ext, ".galview") || !strcmp ((gchar *)dent->d_name, "galview.xml")) {
- /* just copy the file */
- filename = dent->d_name;
- goto copy;
- } else if (strcmp (ext, ".xml") != 0) {
- continue;
- }
-
- if (!strncmp ((const gchar *)dent->d_name, "current_view-", 13)) {
- prelen = 13;
- } else if (!strncmp ((const gchar *)dent->d_name, "custom_view-", 12)) {
- prelen = 12;
- } else {
- /* huh? wtf is this file? */
- continue;
- }
-
- if (!strncmp (dent->d_name + prelen, "file:", 5)) {
- /* need to munge the filename */
- inptr = dent->d_name + prelen + 5;
-
- if (!strncmp (inptr, evo14_mbox_root, rlen)) {
- /* this should always be the case afaik... */
- inptr += rlen;
- new = g_string_new ("mbox:");
- g_string_append_printf (new, "%s/local#", data_dir);
-
- full_name = g_strdup (inptr);
- inptr = full_name + strlen (full_name) - 12;
- while (inptr > full_name) {
- if (!strncmp (inptr, "_subfolders_", 12))
- memmove (inptr, inptr + 11, strlen (inptr + 11) + 1);
-
- inptr--;
- }
-
- g_string_append (new, full_name);
- g_free (full_name);
-
- filename = buf = new->str;
- g_string_free (new, FALSE);
- e_filename_make_safe (buf);
- } else {
- /* but just in case... */
- filename = dent->d_name + prelen;
- }
- } else {
- /* no munging needed */
- filename = dent->d_name + prelen;
- }
-
- copy:
- g_string_append (srcpath, dent->d_name);
- if (prelen > 0)
- g_string_append_len (destpath, dent->d_name, prelen);
- g_string_append (destpath, filename);
- g_free (buf);
-
- cp (srcpath->str, destpath->str, FALSE, CP_UNIQUE);
-
- g_string_truncate (srcpath, slen);
- g_string_truncate (destpath, dlen);
- }
-
- closedir (dir);
-
- g_free (evo14_mbox_root);
- g_string_free (destpath, TRUE);
- g_string_free (srcpath, TRUE);
-
- return TRUE;
-}
-
-#define SUBFOLDER_DIR_NAME "subfolders"
-#define SUBFOLDER_DIR_NAME_LEN 10
-
-static gchar *
-e_path_to_physical (const gchar *prefix, const gchar *vpath)
-{
- const gchar *p, *newp;
- gchar *dp;
- gchar *ppath;
- gint ppath_len;
- gint prefix_len;
-
- while (*vpath == '/')
- vpath++;
- if (!prefix)
- prefix = "";
-
- /* Calculate the length of the real path. */
- ppath_len = strlen (vpath);
- ppath_len++; /* For the ending zero. */
-
- prefix_len = strlen (prefix);
- ppath_len += prefix_len;
- ppath_len++; /* For the separating slash. */
-
- /* Take account of the fact that we need to translate every
- * separator into `subfolders/'.
- */
- p = vpath;
- while (1) {
- newp = strchr (p, '/');
- if (newp == NULL)
- break;
-
- ppath_len += SUBFOLDER_DIR_NAME_LEN;
- ppath_len++; /* For the separating slash. */
-
- /* Skip consecutive slashes. */
- while (*newp == '/')
- newp++;
-
- p = newp;
- };
-
- ppath = g_malloc (ppath_len);
- dp = ppath;
-
- memcpy (dp, prefix, prefix_len);
- dp += prefix_len;
- *(dp++) = '/';
-
- /* Copy the mangled path. */
- p = vpath;
- while (1) {
- newp = strchr (p, '/');
- if (newp == NULL) {
- strcpy (dp, p);
- break;
- }
-
- memcpy (dp, p, newp - p + 1); /* `+ 1' to copy the slash too. */
- dp += newp - p + 1;
-
- memcpy (dp, SUBFOLDER_DIR_NAME, SUBFOLDER_DIR_NAME_LEN);
- dp += SUBFOLDER_DIR_NAME_LEN;
-
- *(dp++) = '/';
-
- /* Skip consecutive slashes. */
- while (*newp == '/')
- newp++;
-
- p = newp;
- }
-
- return ppath;
-}
-
-static gboolean
-em_migrate_imap_cmeta_1_4(const gchar *data_dir, GError **error)
-{
- GConfClient *gconf;
- GSList *paths, *p;
- EAccountList *accounts;
- const EAccount *account;
-
- if (!(accounts = e_get_account_list ()))
- return TRUE;
-
- gconf = gconf_client_get_default();
- paths = gconf_client_get_list(gconf, "/apps/evolution/shell/offline/folder_paths", GCONF_VALUE_STRING, NULL);
- for (p = paths;p;p = g_slist_next(p)) {
- gchar *name, *path;
-
- name = p->data;
- if (*name)
- name++;
- path = strchr(name, '/');
- if (path) {
- *path++ = 0;
- account = e_account_list_find(accounts, E_ACCOUNT_FIND_NAME, name);
- if (account && !strncmp(account->source->url, "imap:", 5)) {
- CamelURL *url = camel_url_new(account->source->url, NULL);
-
- if (url) {
- gchar *dir, *base;
-
- base = g_strdup_printf("%s/imap/%s@%s/folders",
- data_dir,
- url->user?url->user:"",
- url->host?url->host:"");
-
- dir = e_path_to_physical(base, path);
- if (g_mkdir_with_parents(dir, 0777) == 0) {
- gchar *cmeta;
- FILE *fp;
-
- cmeta = g_build_filename(dir, "cmeta", NULL);
- fp = fopen(cmeta, "w");
- if (fp) {
- /* header/version */
- fwrite("CLMD", 4, 1, fp);
- camel_file_util_encode_uint32(fp, 1);
- /* meta count, do we have any metadata? */
- camel_file_util_encode_uint32(fp, 0);
- /* prop count */
- camel_file_util_encode_uint32(fp, 1);
- /* sync offline property */
- camel_file_util_encode_uint32(fp, CAMEL_DISCO_FOLDER_OFFLINE_SYNC);
- camel_file_util_encode_uint32(fp, 1);
- fclose(fp);
- } else {
- g_warning("couldn't create imap folder cmeta file '%s'", cmeta);
- }
- g_free(cmeta);
- } else {
- g_warning("couldn't create imap folder directory '%s'", dir);
- }
- g_free(dir);
- g_free(base);
- camel_url_free(url);
- }
- } else
- g_warning("can't find offline folder '%s' '%s'", name, path);
- }
- g_free(p->data);
- }
- g_slist_free(paths);
- g_object_unref(gconf);
-
- /* we couldn't care less if this doesn't work */
-
- return TRUE;
-}
-
-static void
-remove_system_searches(xmlDocPtr searches)
-{
- xmlNodePtr node;
-
- /* in pre 2.0, system searches were stored in the user
- * searches.xml file with the source set to 'demand'. In 2.0+
- * the system searches are stored in the system
- * searchtypes.xml file instead */
-
- node = xmlDocGetRootElement(searches);
- if (!node->name || strcmp((gchar *)node->name, "filteroptions"))
- return;
-
- if (!(node = xml_find_node(node, "ruleset")))
- return;
-
- node = node->children;
- while (node != NULL) {
- xmlNodePtr nnode = node->next;
-
- if (node->name && !strcmp ((gchar *)node->name, "rule")) {
- gchar *src;
-
- src = (gchar *)xmlGetProp(node, (guchar *)"source");
- if (src && !strcmp((gchar *)src, "demand")) {
- xmlUnlinkNode(node);
- xmlFreeNodeList(node);
- }
- xmlFree (src);
- }
-
- node = nnode;
- }
-}
-
-static gboolean
-em_migrate_1_4 (const gchar *data_dir, xmlDocPtr filters, xmlDocPtr vfolders, GError **error)
-{
- EMMigrateSession *session;
- CamelException lex;
- struct stat st;
- gchar *path;
- xmlDocPtr searches;
-
- camel_init (data_dir, TRUE);
- camel_provider_init();
- session = (EMMigrateSession *) em_migrate_session_new (data_dir);
-
- session->srcdir = g_build_filename (g_get_home_dir (), "evolution", "local", NULL);
-
- path = g_strdup_printf ("mbox:%s/.evolution/mail/local", g_get_home_dir ());
- if (stat (path + 5, &st) == -1) {
- if (errno != ENOENT || g_mkdir_with_parents (path + 5, 0777) == -1) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Failed to create local mail storage "
- "`%s': %s"), path + 5, g_strerror (errno));
- g_free (session->srcdir);
- camel_object_unref (session);
- g_free (path);
- return FALSE;
- }
- }
-
- camel_exception_init (&lex);
- if (!(session->store = camel_session_get_store ((CamelSession *) session, path, &lex))) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Failed to create local mail storage `%s': %s"),
- path, lex.desc);
- g_free (session->srcdir);
- camel_object_unref (session);
- camel_exception_clear (&lex);
- g_free (path);
- return FALSE;
- }
- g_free (path);
-
- if (!em_migrate_local_folders_1_4 (session, error))
- return FALSE;
-
- camel_object_unref (session->store);
- g_free (session->srcdir);
-
- camel_object_unref (session);
-
- em_upgrade_accounts_1_4();
-
- upgrade_xml_uris(filters, upgrade_xml_uris_1_4);
- upgrade_vfolder_sources_1_4(vfolders);
- upgrade_xml_uris(vfolders, upgrade_xml_uris_1_4);
-
- path = g_build_filename(g_get_home_dir(), "evolution", NULL);
- searches = emm_load_xml(path, "searches.xml");
- g_free(path);
- if (searches) {
- remove_system_searches(searches);
- emm_save_xml(searches, data_dir, "searches.xml");
- xmlFreeDoc(searches);
- }
-
- if (!em_migrate_pop_uid_caches_1_4 (data_dir, error))
- return FALSE;
-
- /* these are non-fatal */
- em_migrate_imap_caches_1_4 (data_dir, error);
- g_clear_error (error);
- em_migrate_folder_expand_state_1_4 (data_dir, error);
- g_clear_error (error);
- em_migrate_folder_view_settings_1_4 (data_dir, error);
- g_clear_error (error);
- em_migrate_imap_cmeta_1_4 (data_dir, error);
- g_clear_error (error);
-
- return TRUE;
-}
-
-static void
-em_update_accounts_2_11 (void)
-{
- EAccountList *accounts;
- EIterator *iter;
- gboolean changed = FALSE;
-
- if (!(accounts = e_get_account_list ()))
- return;
-
- iter = e_list_get_iterator ((EList *) accounts);
- while (e_iterator_is_valid (iter)) {
- EAccount *account = (EAccount *) e_iterator_get (iter);
-
- if (g_str_has_prefix (account->source->url, "spool://")) {
- if (g_file_test (account->source->url + 8, G_FILE_TEST_IS_DIR)) {
- gchar *str = g_strdup_printf ("spooldir://%s", account->source->url + 8);
-
- g_free (account->source->url);
- account->source->url = str;
- changed = TRUE;
- }
- }
-
- e_iterator_next (iter);
- }
-
- g_object_unref (iter);
-
- if (changed)
- e_account_list_save (accounts);
-}
-
-#endif /* !G_OS_WIN32 */
-
-static gboolean
-emm_setup_initial(const gchar *data_dir)
-{
- GDir *dir;
- const gchar *d;
- gchar *local = NULL, *base;
- const gchar * const *language_names;
-
- /* special-case - this means brand new install of evolution */
- /* FIXME: create default folders and stuff... */
-
- d(printf("Setting up initial mail tree\n"));
-
- base = g_build_filename(data_dir, "local", NULL);
- if (g_mkdir_with_parents(base, 0777) == -1 && errno != EEXIST) {
- g_free(base);
- return FALSE;
- }
-
- /* e.g. try en-AU then en, etc */
- language_names = g_get_language_names ();
- while (*language_names != NULL) {
- local = g_build_filename (
- EVOLUTION_PRIVDATADIR, "default",
- *language_names, "mail", "local", NULL);
- if (g_file_test (local, G_FILE_TEST_EXISTS))
- break;
- g_free (local);
- language_names++;
- }
-
- /* Make sure we found one. */
- g_return_val_if_fail (*language_names != NULL, FALSE);
-
- dir = g_dir_open(local, 0, NULL);
- if (dir) {
- while ((d = g_dir_read_name(dir))) {
- gchar *src, *dest;
-
- src = g_build_filename(local, d, NULL);
- dest = g_build_filename(base, d, NULL);
-
- cp(src, dest, FALSE, CP_UNIQUE);
- g_free(dest);
- g_free(src);
- }
- g_dir_close(dir);
- }
-
- g_free(local);
- g_free(base);
-
- return TRUE;
-}
-
-static gboolean
-is_in_plugs_list (GSList *list, const gchar *value)
-{
- GSList *l;
-
- for (l = list; l; l = l->next) {
- if (l->data && !strcmp (l->data, value))
- return TRUE;
- }
-
- return FALSE;
-}
-
-/*
- * em_update_message_notify_settings_2_21
- * DBus plugin and sound email notification was merged to mail-notification plugin,
- * so move these options to new locations.
- */
-static void
-em_update_message_notify_settings_2_21 (void)
-{
- GConfClient *client;
- GConfValue *is_key;
- gboolean dbus, status;
- GSList *list;
- gchar *str;
- gint val;
-
- client = gconf_client_get_default ();
-
- is_key = gconf_client_get (client, "/apps/evolution/eplugin/mail-notification/dbus-enabled", NULL);
- if (is_key) {
- /* already migrated, so do not migrate again */
- gconf_value_free (is_key);
- g_object_unref (client);
-
- return;
- }
-
- gconf_client_set_bool (client, "/apps/evolution/eplugin/mail-notification/status-blink-icon",
- gconf_client_get_bool (client, "/apps/evolution/mail/notification/blink-status-icon", NULL), NULL);
- gconf_client_set_bool (client, "/apps/evolution/eplugin/mail-notification/status-notification",
- gconf_client_get_bool (client, "/apps/evolution/mail/notification/notification", NULL), NULL);
-
- list = gconf_client_get_list (client, "/apps/evolution/eplugin/disabled", GCONF_VALUE_STRING, NULL);
- dbus = !is_in_plugs_list (list, "org.gnome.evolution.new_mail_notify");
- status = !is_in_plugs_list (list, "org.gnome.evolution.mail_notification");
-
- gconf_client_set_bool (client, "/apps/evolution/eplugin/mail-notification/dbus-enabled", dbus, NULL);
- gconf_client_set_bool (client, "/apps/evolution/eplugin/mail-notification/status-enabled", status, NULL);
-
- if (!status) {
- /* enable this plugin, because it holds all those other things */
- GSList *plugins, *l;
-
- plugins = e_plugin_list_plugins ();
-
- for (l = plugins; l; l = l->next) {
- EPlugin *p = l->data;
-
- if (p && p->id && !strcmp (p->id, "org.gnome.evolution.mail_notification")) {
- e_plugin_enable (p, 1);
- break;
- }
- }
-
- g_slist_foreach (plugins, (GFunc)g_object_unref, NULL);
- g_slist_free (plugins);
- }
-
- g_slist_foreach (list, (GFunc) g_free, NULL);
- g_slist_free (list);
-
- val = gconf_client_get_int (client, "/apps/evolution/mail/notify/type", NULL);
- gconf_client_set_bool (client, "/apps/evolution/eplugin/mail-notification/sound-enabled", val == 1 || val == 2, NULL);
- gconf_client_set_bool (client, "/apps/evolution/eplugin/mail-notification/sound-beep", val == 0 || val == 1, NULL);
-
- str = gconf_client_get_string (client, "/apps/evolution/mail/notify/sound", NULL);
- gconf_client_set_string (client, "/apps/evolution/eplugin/mail-notification/sound-file", str ? str : "", NULL);
- g_free (str);
-
- g_object_unref (client);
-}
-
-/* fixing typo in SpamAssassin name */
-static void
-em_update_sa_junk_setting_2_23 (void)
-{
- GConfClient *client;
- GConfValue *key;
-
- client = gconf_client_get_default ();
-
- key = gconf_client_get (client, "/apps/evolution/mail/junk/default_plugin", NULL);
- if (key) {
- const gchar *str = gconf_value_get_string (key);
-
- if (str && strcmp (str, "Spamassasin") == 0)
- gconf_client_set_string (client, "/apps/evolution/mail/junk/default_plugin", "SpamAssassin", NULL);
-
- gconf_value_free (key);
- g_object_unref (client);
-
- return;
- }
-
- g_object_unref (client);
-}
-
-static gboolean
-update_progress_in_main_thread (double *progress)
-{
- em_migrate_set_progress (*progress);
- return FALSE;
-}
-
-static void
-migrate_folders(CamelStore *store, gboolean is_local, CamelFolderInfo *fi, const gchar *acc, CamelException *ex, gboolean *done, gint *nth_folder, gint total_folders)
-{
- CamelFolder *folder;
-
- while (fi) {
- double progress;
- gchar *tmp;
-
- *nth_folder = *nth_folder + 1;
-
- tmp = g_strdup_printf ("%s/%s", acc, fi->full_name);
- em_migrate_set_folder_name (tmp);
- g_free (tmp);
-
- progress = (double) (*nth_folder) / total_folders;
- g_idle_add ((GSourceFunc) update_progress_in_main_thread, &progress);
-
- if (is_local)
- folder = camel_store_get_folder (store, fi->full_name, CAMEL_STORE_IS_MIGRATING, ex);
- else
- folder = camel_store_get_folder (store, fi->full_name, 0, ex);
-
- if (folder != NULL)
- camel_folder_summary_migrate_infos (folder->summary);
- migrate_folders(store, is_local, fi->child, acc, ex, done, nth_folder, total_folders);
- fi = fi->next;
- }
-
- if ((*nth_folder) == (total_folders - 1))
- *done = TRUE;
-}
-
-/* This could be in CamelStore.ch */
-static void
-count_folders (CamelFolderInfo *fi, gint *count)
-{
- while (fi) {
- *count = *count + 1;
- count_folders (fi->child, count);
- fi = fi->next;
- }
-}
-
-static CamelStore *
-setup_local_store (EShellBackend *shell_backend,
- EMMigrateSession *session)
-{
- CamelURL *url;
- const gchar *data_dir;
- gchar *tmp;
- CamelStore *store;
-
- url = camel_url_new("mbox:", NULL);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
- tmp = g_build_filename (data_dir, "local", NULL);
- camel_url_set_path(url, tmp);
- g_free(tmp);
- tmp = camel_url_to_string(url, 0);
- store = (CamelStore *)camel_session_get_service(CAMEL_SESSION (session), tmp, CAMEL_PROVIDER_STORE, NULL);
- g_free(tmp);
-
- return store;
-}
-
-struct migrate_folders_to_db_structure {
- gchar *account_name;
- CamelException ex;
- CamelStore *store;
- CamelFolderInfo *info;
- gboolean done;
- gboolean is_local_store;
-};
-
-static void
-migrate_folders_to_db_thread (struct migrate_folders_to_db_structure *migrate_dbs)
-{
- gint num_of_folders = 0, nth_folder = 0;
- count_folders (migrate_dbs->info, &num_of_folders);
- migrate_folders (migrate_dbs->store, migrate_dbs->is_local_store, migrate_dbs->info,
- migrate_dbs->account_name, &(migrate_dbs->ex), &(migrate_dbs->done),
- &nth_folder, num_of_folders);
-}
-
-static void
-migrate_to_db (EShellBackend *shell_backend)
-{
- EMMigrateSession *session;
- EAccountList *accounts;
- EIterator *iter;
- gint i=0, len;
- CamelStore *store = NULL;
- CamelFolderInfo *info;
- const gchar *data_dir;
-
- if (!(accounts = e_get_account_list ()))
- return;
-
- iter = e_list_get_iterator ((EList *) accounts);
- len = e_list_length ((EList *) accounts);
-
- data_dir = e_shell_backend_get_data_dir (shell_backend);
- session = (EMMigrateSession *) em_migrate_session_new (data_dir);
- camel_session_set_online ((CamelSession *) session, FALSE);
- em_migrate_setup_progress_dialog (
- _("Migrating Folders"),
- _("The summary format of the Evolution mailbox "
- "folders has been moved to SQLite since Evolution 2.24.\n\nPlease be "
- "patient while Evolution migrates your folders..."));
-
- em_migrate_set_progress ( (double)i/(len+1));
- store = setup_local_store (shell_backend, session);
- info = camel_store_get_folder_info (store, NULL, CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST|CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, NULL);
- if (info) {
- GThread *thread;
- struct migrate_folders_to_db_structure migrate_dbs;
-
- if (g_str_has_suffix (((CamelService *)store)->url->path, ".evolution/mail/local"))
- migrate_dbs.is_local_store = TRUE;
- else
- migrate_dbs.is_local_store = FALSE;
- camel_exception_init (&migrate_dbs.ex);
- migrate_dbs.account_name = _("On This Computer");
- migrate_dbs.info = info;
- migrate_dbs.store = store;
- migrate_dbs.done = FALSE;
-
- thread = g_thread_create ((GThreadFunc) migrate_folders_to_db_thread, &migrate_dbs, TRUE, NULL);
- while (!migrate_dbs.done)
- g_main_context_iteration (NULL, TRUE);
- }
- i++;
- em_migrate_set_progress ( (double)i/(len+1));
-
-
- while (e_iterator_is_valid (iter)) {
- EAccount *account = (EAccount *) e_iterator_get (iter);
- EAccountService *service;
- const gchar *name;
-
-
- service = account->source;
- name = account->name;
- em_migrate_set_progress ( (double)i/(len+1));
- if (account->enabled
- && service->url != NULL
- && service->url[0]
- && strncmp(service->url, "mbox:", 5) != 0) {
-
- CamelException ex;
-
- camel_exception_init (&ex);
- e_mail_store_add_by_uri (service->url, name);
-
- store = (CamelStore *) camel_session_get_service (CAMEL_SESSION (session), service->url, CAMEL_PROVIDER_STORE, &ex);
- info = camel_store_get_folder_info (store, NULL, CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST|CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, &ex);
- if (info) {
- GThread *thread;
- struct migrate_folders_to_db_structure migrate_dbs;
-
- migrate_dbs.ex = ex;
- migrate_dbs.account_name = account->name;
- migrate_dbs.info = info;
- migrate_dbs.store = store;
- migrate_dbs.done = FALSE;
-
- thread = g_thread_create ((GThreadFunc) migrate_folders_to_db_thread, &migrate_dbs, TRUE, NULL);
- while (!migrate_dbs.done)
- g_main_context_iteration (NULL, TRUE);
- } else
- printf("%s:%s: failed to get folder infos \n", G_STRLOC, G_STRFUNC);
- camel_exception_clear(&ex);
-
- }
- i++;
- e_iterator_next (iter);
-
- }
-
- //camel_session_set_online ((CamelSession *) session, TRUE);
-
- g_object_unref (iter);
- em_migrate_close_progress_dialog ();
-
- g_object_unref (session);
-}
-
-gboolean
-e_mail_shell_migrate (EShellBackend *shell_backend,
- gint major,
- gint minor,
- gint micro,
- GError **error)
-{
- struct stat st;
- const gchar *data_dir;
- gchar *path;
-
- /* make sure ~/.evolution/mail exists */
- data_dir = e_shell_backend_get_data_dir (shell_backend);
- if (g_stat (data_dir, &st) == -1) {
- if (errno != ENOENT || g_mkdir_with_parents (data_dir, 0777) == -1) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Unable to create local mail folders at "
- "`%s': %s"), data_dir, g_strerror (errno));
- return FALSE;
- }
- }
-
- if (major == 0)
- return emm_setup_initial (data_dir);
-
- if (major == 1 && minor < 5) {
-#ifndef G_OS_WIN32
- xmlDocPtr config_xmldb = NULL, filters, vfolders;
-
- path = g_build_filename (g_get_home_dir (), "evolution", NULL);
- if (minor <= 2 && !(config_xmldb = emm_load_xml (path, "config.xmldb"))) {
- g_set_error (
- error, E_SHELL_MIGRATE_ERROR,
- E_SHELL_MIGRATE_ERROR_FAILED,
- _("Unable to read settings from previous "
- "Evolution install, `evolution/config.xmldb' "
- "does not exist or is corrupt."));
- return FALSE;
- }
- filters = emm_load_xml (path, "filters.xml");
- vfolders = emm_load_xml (path, "vfolders.xml");
- g_free (path);
-
- if (minor == 0) {
- if (!em_migrate_1_0 (data_dir, config_xmldb, filters, vfolders, error)) {
- xmlFreeDoc (config_xmldb);
- xmlFreeDoc (filters);
- xmlFreeDoc (vfolders);
- return FALSE;
- }
- }
-
- if (minor <= 2) {
- if (!em_migrate_1_2 (data_dir, config_xmldb, filters, vfolders, error)) {
- xmlFreeDoc (config_xmldb);
- xmlFreeDoc (filters);
- xmlFreeDoc (vfolders);
- return FALSE;
- }
-
- xmlFreeDoc (config_xmldb);
- }
-
- if (minor <= 4) {
- if (!em_migrate_1_4 (data_dir, filters, vfolders, error)) {
- xmlFreeDoc (filters);
- xmlFreeDoc (vfolders);
- return FALSE;
- }
- }
-
- if (filters) {
- emm_save_xml (filters, path, "filters.xml");
- xmlFreeDoc (filters);
- }
-
- if (vfolders) {
- emm_save_xml (vfolders, path, "vfolders.xml");
- xmlFreeDoc (vfolders);
- }
-
- g_free (path);
-#else
- g_error ("Upgrading from ancient versions not supported on Windows");
-#endif
- }
-
- if (major < 2 || (major == 2 && minor < 12)) {
-#ifndef G_OS_WIN32
- em_update_accounts_2_11 ();
-#else
- g_error ("Upgrading from ancient versions not supported on Windows");
-#endif
- }
-
-
- if (major < 2 || (major == 2 && minor < 22))
- em_update_message_notify_settings_2_21 ();
-
- if (major < 2 || (major == 2 && minor < 24)) {
- em_update_sa_junk_setting_2_23 ();
- migrate_to_db (shell_backend);
- }
-
- return TRUE;
-}
diff --git a/mail/e-mail-shell-migrate.h b/mail/e-mail-shell-migrate.h
deleted file mode 100644
index 8f3057ec0d..0000000000
--- a/mail/e-mail-shell-migrate.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * e-mail-shell-migrate.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_MAIL_SHELL_BACKEND_MIGRATE_H
-#define E_MAIL_SHELL_BACKEND_MIGRATE_H
-
-#include <glib.h>
-#include <shell/e-shell-backend.h>
-
-G_BEGIN_DECLS
-
-gboolean e_mail_shell_migrate (EShellBackend *shell_backend,
- gint major,
- gint minor,
- gint micro,
- GError **error);
-
-G_END_DECLS
-
-#endif /* E_MAIL_SHELL_BACKEND_MIGRATE_H */
diff --git a/mail/e-mail-shell-settings.c b/mail/e-mail-shell-settings.c
deleted file mode 100644
index 8237924e3c..0000000000
--- a/mail/e-mail-shell-settings.c
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- * e-mail-shell-settings.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-settings.h"
-
-#include <gconf/gconf-client.h>
-#include <libedataserver/e-account-list.h>
-
-#include "e-util/e-signature-list.h"
-#include "mail/e-mail-label-list-store.h"
-#include "mail/mail-session.h"
-
-void
-e_mail_shell_settings_init (EShell *shell)
-{
- EShellSettings *shell_settings;
- gpointer object;
-
- shell_settings = e_shell_get_shell_settings (shell);
-
- /* XXX Default values should match the GConf schema.
- * Yes it's redundant, but we're stuck with GConf. */
-
- /*** Global Objects ***/
-
- e_shell_settings_install_property (
- g_param_spec_object (
- "mail-label-list-store",
- NULL,
- NULL,
- E_TYPE_MAIL_LABEL_LIST_STORE,
- G_PARAM_READWRITE));
-
- object = e_mail_label_list_store_new ();
- e_shell_settings_set_object (
- shell_settings, "mail-label-list-store", object);
- g_object_unref (object);
-
- e_shell_settings_install_property (
- g_param_spec_pointer (
- "mail-session",
- NULL,
- NULL,
- G_PARAM_READWRITE));
-
- camel_object_ref (session);
- e_shell_settings_set_pointer (
- shell_settings, "mail-session", session);
-
- /*** Mail Preferences ***/
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-address-compress",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-address-compress",
- "/apps/evolution/mail/display/address_compress");
-
- e_shell_settings_install_property (
- g_param_spec_int (
- "mail-address-count",
- NULL,
- NULL,
- G_MININT,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-address-count",
- "/apps/evolution/mail/display/address_count");
-
- e_shell_settings_install_property (
- g_param_spec_string (
- "mail-charset-default",
- NULL,
- NULL,
- NULL,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-charset-default",
- "/apps/evolution/mail/display/charset");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-check-for-junk",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-check-for-junk",
- "/apps/evolution/mail/junk/check_incoming");
-
- e_shell_settings_install_property (
- g_param_spec_string (
- "mail-citation-color",
- NULL,
- NULL,
- "#737373",
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-citation-color",
- "/apps/evolution/mail/display/citation_colour");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-confirm-expunge",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-confirm-expunge",
- "/apps/evolution/mail/prompts/expunge");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-confirm-unwanted-html",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-confirm-unwanted-html",
- "/apps/evolution/mail/prompts/unwanted_html");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-empty-trash-on-exit",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-empty-trash-on-exit",
- "/apps/evolution/mail/trash/empty_on_exit");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-enable-search-folders",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-enable-search-folders",
- "/apps/evolution/mail/display/enable_vfolders");
-
- e_shell_settings_install_property (
- g_param_spec_string (
- "mail-font-monospace",
- NULL,
- NULL,
- "",
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-font-monospace",
- "/apps/evolution/mail/display/fonts/monospace");
-
- e_shell_settings_install_property (
- g_param_spec_string (
- "mail-font-variable",
- NULL,
- NULL,
- "",
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-font-variable",
- "/apps/evolution/mail/display/fonts/variable");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-force-message-limit",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-force-message-limit",
- "/apps/evolution/mail/display/force_message_limit");
-
- /* This value corresponds to MailConfigForwardStyle enum. */
- e_shell_settings_install_property (
- g_param_spec_int (
- "mail-forward-style",
- NULL,
- NULL,
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-forward-style",
- "/apps/evolution/mail/format/forward_style");
-
- /* This value corresponds to MailConfigHTTPMode enum. */
- e_shell_settings_install_property (
- g_param_spec_int (
- "mail-image-loading-policy",
- NULL,
- NULL,
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-image-loading-policy",
- "/apps/evolution/mail/display/load_http_images");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-magic-spacebar",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-magic-spacebar",
- "/apps/evolution/mail/display/magic_spacebar");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-mark-citations",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-mark-citations",
- "/apps/evolution/mail/display/mark_citations");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-mark-seen",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-mark-seen",
- "/apps/evolution/mail/display/mark_seen");
-
- e_shell_settings_install_property (
- g_param_spec_int (
- "mail-mark-seen-timeout",
- NULL,
- NULL,
- G_MININT,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-mark-seen-timeout",
- "/apps/evolution/mail/display/mark_seen_timeout");
-
- e_shell_settings_install_property (
- g_param_spec_int (
- "mail-message-text-part-limit",
- NULL,
- NULL,
- G_MININT,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-message-text-part-limit",
- "/apps/evolution/mail/display/message_text_part_limit");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-only-local-photos",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-only-local-photos",
- "/apps/evolution/mail/display/photo_local");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-prompt-delete-in-vfolder",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-prompt-delete-in-vfolder",
- "/apps/evolution/mail/prompts/delete_in_vfolder");
-
- /* This value corresponds to MailConfigReplyStyle enum,
- * but the ordering of the combo box items in preferences
- * has changed. We use transformation functions there. */
- e_shell_settings_install_property (
- g_param_spec_int (
- "mail-reply-style",
- NULL,
- NULL,
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-reply-style",
- "/apps/evolution/mail/format/reply_style");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-show-animated-images",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-show-animated-images",
- "/apps/evolution/mail/display/animated_images");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-show-sender-photo",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-show-sender-photo",
- "/apps/evolution/mail/display/sender_photo");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "mail-use-custom-fonts",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "mail-use-custom-fonts",
- "/apps/evolution/mail/display/fonts/use_custom");
-
-
- /*** Composer Preferences ***/
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-format-html",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-format-html",
- "/apps/evolution/mail/composer/send_html");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-inline-spelling",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-inline-spelling",
- "/apps/evolution/mail/composer/inline_spelling");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-magic-links",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-magic-links",
- "/apps/evolution/mail/composer/magic_links");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-magic-smileys",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-magic-smileys",
- "/apps/evolution/mail/composer/magic_smileys");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-outlook-filenames",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-outlook-filenames",
- "/apps/evolution/mail/composer/outlook_filenames");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-prompt-only-bcc",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-prompt-only-bcc",
- "/apps/evolution/mail/prompts/only_bcc");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-prompt-empty-subject",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-prompt-empty-subject",
- "/apps/evolution/mail/prompts/empty_subject");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-reply-start-bottom",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-reply-start-bottom",
- "/apps/evolution/mail/composer/reply_start_bottom");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-request-receipt",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-request-receipt",
- "/apps/evolution/mail/composer/request_receipt");
-
- e_shell_settings_install_property (
- g_param_spec_string (
- "composer-spell-color",
- NULL,
- NULL,
- "#ff0000",
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-spell-color",
- "/apps/evolution/mail/composer/spell_color");
-
- e_shell_settings_install_property (
- g_param_spec_boolean (
- "composer-top-signature",
- NULL,
- NULL,
- FALSE,
- G_PARAM_READWRITE));
-
- e_shell_settings_bind_to_gconf (
- shell_settings, "composer-top-signature",
- "/apps/evolution/mail/composer/top_signature");
-}
diff --git a/mail/e-mail-shell-settings.h b/mail/e-mail-shell-settings.h
deleted file mode 100644
index 4267fd8a60..0000000000
--- a/mail/e-mail-shell-settings.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * e-mail-shell-settings.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_MAIL_SHELL_SETTINGS_H
-#define E_MAIL_SHELL_SETTINGS_H
-
-#include <shell/e-shell.h>
-
-G_BEGIN_DECLS
-
-void e_mail_shell_settings_init (EShell *shell);
-
-G_END_DECLS
-
-#endif /* E_MAIL_SHELL_SETTINGS_H */
diff --git a/mail/e-mail-shell-sidebar.c b/mail/e-mail-shell-sidebar.c
deleted file mode 100644
index 2e5dffcb96..0000000000
--- a/mail/e-mail-shell-sidebar.c
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- * e-mail-shell-sidebar.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-sidebar.h"
-
-#include <string.h>
-#include <camel/camel.h>
-
-#include "em-utils.h"
-#include "em-folder-utils.h"
-
-#include "e-mail-local.h"
-#include "e-mail-store.h"
-
-#define E_MAIL_SHELL_SIDEBAR_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE \
- ((obj), E_TYPE_MAIL_SHELL_SIDEBAR, EMailShellSidebarPrivate))
-
-#define STATE_KEY_EXPANDED "Expanded"
-
-struct _EMailShellSidebarPrivate {
- GtkWidget *folder_tree;
-};
-
-enum {
- PROP_0,
- PROP_FOLDER_TREE
-};
-
-static gpointer parent_class;
-static GType mail_shell_sidebar_type;
-
-static void
-mail_shell_sidebar_restore_state (EMailShellSidebar *mail_shell_sidebar)
-{
- EShellView *shell_view;
- EShellSidebar *shell_sidebar;
- EMFolderTree *folder_tree;
- GtkTreeModel *tree_model;
- GtkTreeView *tree_view;
- GtkTreeIter iter;
- GKeyFile *key_file;
- gboolean valid;
- gchar *selected;
- gchar **groups;
- gint ii;
-
- shell_sidebar = E_SHELL_SIDEBAR (mail_shell_sidebar);
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
-
- tree_view = GTK_TREE_VIEW (folder_tree);
- tree_model = gtk_tree_view_get_model (tree_view);
-
- /* Restore selected folder. */
-
- selected = g_key_file_get_string (
- key_file, "Folder Tree", "Selected", NULL);
- if (selected != NULL) {
- em_folder_tree_set_selected (folder_tree, selected, FALSE);
- g_free (selected);
- }
-
- /* Set the initial folder tree expanded state in two stages:
- *
- * 1) Iterate over the "Store" and "Folder" state file groups
- * and apply the "Expanded" keys where possible.
- *
- * 2) Iterate over the top-level nodes in the folder tree
- * (these are all stores) and expand those that have no
- * corresponding "Expanded" key in the state file. This
- * ensures that new stores are expanded by default.
- */
-
- /* Stage 1 */
-
- groups = g_key_file_get_groups (key_file, NULL);
-
- for (ii = 0; groups[ii] != NULL; ii++) {
- GtkTreeRowReference *reference;
- GtkTreePath *path;
- GtkTreeIter iter;
- const gchar *group_name = groups[ii];
- const gchar *key = STATE_KEY_EXPANDED;
- const gchar *uri;
- gboolean expanded;
-
- if (g_str_has_prefix (group_name, "Store ")) {
- uri = group_name + 6;
- expanded = TRUE;
- } else if (g_str_has_prefix (group_name, "Folder ")) {
- uri = group_name + 7;
- expanded = FALSE;
- } else
- continue;
-
- if (g_key_file_has_key (key_file, group_name, key, NULL))
- expanded = g_key_file_get_boolean (
- key_file, group_name, key, NULL);
-
- if (!expanded)
- continue;
-
- reference = em_folder_tree_model_lookup_uri (
- EM_FOLDER_TREE_MODEL (tree_model), uri);
- if (reference == NULL)
- continue;
-
- path = gtk_tree_row_reference_get_path (reference);
- gtk_tree_model_get_iter (tree_model, &iter, path);
- gtk_tree_view_expand_row (tree_view, path, FALSE);
- gtk_tree_path_free (path);
- }
-
- g_strfreev (groups);
-
- /* Stage 2 */
-
- valid = gtk_tree_model_get_iter_first (tree_model, &iter);
-
- while (valid) {
- const gchar *key = STATE_KEY_EXPANDED;
- gchar *group_name;
- gchar *uri;
-
- gtk_tree_model_get (
- tree_model, &iter, COL_STRING_URI, &uri, -1);
-
- if (uri == NULL)
- goto next;
-
- group_name = g_strdup_printf ("Store %s", uri);
-
- if (!g_key_file_has_key (key_file, group_name, key, NULL)) {
- GtkTreePath *path;
-
- path = gtk_tree_model_get_path (tree_model, &iter);
- gtk_tree_view_expand_row (tree_view, path, FALSE);
- gtk_tree_path_free (path);
- }
-
- g_free (group_name);
- g_free (uri);
-
- next:
- valid = gtk_tree_model_iter_next (tree_model, &iter);
- }
-}
-
-static void
-mail_shell_sidebar_row_collapsed_cb (EShellSidebar *shell_sidebar,
- GtkTreeIter *iter,
- GtkTreePath *path,
- GtkTreeView *tree_view)
-{
- EShellView *shell_view;
- GtkTreeModel *model;
- GKeyFile *key_file;
- const gchar *key;
- gboolean is_folder;
- gboolean is_store;
- gchar *group_name;
- gchar *uri;
-
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- model = gtk_tree_view_get_model (tree_view);
-
- gtk_tree_model_get (
- model, iter,
- COL_STRING_URI, &uri,
- COL_BOOL_IS_STORE, &is_store,
- COL_BOOL_IS_FOLDER, &is_folder, -1);
-
- g_return_if_fail (is_store || is_folder);
-
- key = STATE_KEY_EXPANDED;
- if (is_store)
- group_name = g_strdup_printf ("Store %s", uri);
- else
- group_name = g_strdup_printf ("Folder %s", uri);
-
- g_key_file_set_boolean (key_file, group_name, key, FALSE);
- e_shell_view_set_state_dirty (shell_view);
-
- g_free (group_name);
- g_free (uri);
-}
-
-static void
-mail_shell_sidebar_row_expanded_cb (EShellSidebar *shell_sidebar,
- GtkTreeIter *unused,
- GtkTreePath *path,
- GtkTreeView *tree_view)
-{
- EShellView *shell_view;
- GtkTreeModel *model;
- GKeyFile *key_file;
- const gchar *key;
- gboolean is_folder;
- gboolean is_store;
- gchar *group_name;
- gchar *uri;
-
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- path = gtk_tree_path_copy (path);
- model = gtk_tree_view_get_model (tree_view);
-
- /* Expand the node and all ancestors. */
- while (gtk_tree_path_get_depth (path) > 0) {
- GtkTreeIter iter;
-
- gtk_tree_model_get_iter (model, &iter, path);
-
- gtk_tree_model_get (
- model, &iter,
- COL_STRING_URI, &uri,
- COL_BOOL_IS_STORE, &is_store,
- COL_BOOL_IS_FOLDER, &is_folder, -1);
-
- g_return_if_fail (is_store || is_folder);
-
- key = STATE_KEY_EXPANDED;
- if (is_store)
- group_name = g_strdup_printf ("Store %s", uri);
- else
- group_name = g_strdup_printf ("Folder %s", uri);
-
- g_key_file_set_boolean (key_file, group_name, key, TRUE);
- e_shell_view_set_state_dirty (shell_view);
-
- g_free (group_name);
- g_free (uri);
-
- gtk_tree_path_up (path);
- }
-
- gtk_tree_path_free (path);
-}
-
-static void
-mail_shell_sidebar_model_loaded_row_cb (EMailShellSidebar *mail_shell_sidebar,
- GtkTreePath *path,
- GtkTreeIter *iter,
- GtkTreeModel *model)
-{
- EShellSidebar *shell_sidebar;
- EShellView *shell_view;
- GtkTreeView *tree_view;
- GKeyFile *key_file;
- gboolean is_folder;
- gboolean is_store;
- const gchar *key;
- gchar *group_name;
- gchar *uri;
- gboolean expanded;
-
- shell_sidebar = E_SHELL_SIDEBAR (mail_shell_sidebar);
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- tree_view = GTK_TREE_VIEW (mail_shell_sidebar->priv->folder_tree);
-
- gtk_tree_model_get (
- model, iter,
- COL_STRING_URI, &uri,
- COL_BOOL_IS_STORE, &is_store,
- COL_BOOL_IS_FOLDER, &is_folder, -1);
-
- g_return_if_fail (is_store || is_folder);
-
- key = STATE_KEY_EXPANDED;
- if (is_store) {
- group_name = g_strdup_printf ("Store %s", uri);
- expanded = TRUE;
- } else {
- group_name = g_strdup_printf ("Folder %s", uri);
- expanded = FALSE;
- }
-
- if (g_key_file_has_key (key_file, group_name, key, NULL))
- expanded = g_key_file_get_boolean (
- key_file, group_name, key, NULL);
-
- if (expanded)
- gtk_tree_view_expand_row (tree_view, path, FALSE);
-
- g_free (group_name);
- g_free (uri);
-}
-
-static void
-mail_shell_sidebar_selection_changed_cb (EShellSidebar *shell_sidebar,
- GtkTreeSelection *selection)
-{
- EShellView *shell_view;
- EShellViewClass *shell_view_class;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GKeyFile *key_file;
- const gchar *icon_name;
- gchar *display_name = NULL;
- gchar *uri = NULL;
- gboolean is_folder = FALSE;
- guint flags = 0;
-
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
- shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- if (gtk_tree_selection_get_selected (selection, &model, &iter))
- gtk_tree_model_get (
- model, &iter,
- COL_STRING_DISPLAY_NAME, &display_name,
- COL_STRING_URI, &uri,
- COL_BOOL_IS_FOLDER, &is_folder,
- COL_UINT_FLAGS, &flags, -1);
-
- if (uri != NULL)
- g_key_file_set_string (
- key_file, "Folder Tree", "Selected", uri);
- else
- g_key_file_remove_key (
- key_file, "Folder Tree", "Selected", NULL);
-
- e_shell_view_set_state_dirty (shell_view);
-
- if (is_folder)
- icon_name = em_folder_utils_get_icon_name (flags);
- else {
- icon_name = shell_view_class->icon_name;
- display_name = g_strdup (shell_view_class->label);
- }
-
- e_shell_sidebar_set_icon_name (shell_sidebar, icon_name);
- e_shell_sidebar_set_primary_text (shell_sidebar, display_name);
-
- g_free (display_name);
- g_free (uri);
-}
-
-static void
-mail_shell_sidebar_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec)
-{
- switch (property_id) {
- case PROP_FOLDER_TREE:
- g_value_set_object (
- value, e_mail_shell_sidebar_get_folder_tree (
- E_MAIL_SHELL_SIDEBAR (object)));
- return;
- }
-
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-}
-
-static void
-mail_shell_sidebar_dispose (GObject *object)
-{
- EMailShellSidebarPrivate *priv;
-
- priv = E_MAIL_SHELL_SIDEBAR_GET_PRIVATE (object);
-
- if (priv->folder_tree != NULL) {
- g_object_unref (priv->folder_tree);
- priv->folder_tree = NULL;
- }
-
- /* Chain up to parent's dispose() method. */
- G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-mail_shell_sidebar_finalize (GObject *object)
-{
- EMailShellSidebarPrivate *priv;
-
- priv = E_MAIL_SHELL_SIDEBAR_GET_PRIVATE (object);
-
- /* Chain up to parent's finalize() method. */
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-mail_shell_sidebar_constructed (GObject *object)
-{
- EMailShellSidebar *mail_shell_sidebar;
- EShellSidebar *shell_sidebar;
- EShellView *shell_view;
- GtkTreeSelection *selection;
- GtkTreeView *tree_view;
- GtkTreeModel *model;
- GtkWidget *container;
- GtkWidget *widget;
-
- /* Chain up to parent's constructed method. */
- G_OBJECT_CLASS (parent_class)->constructed (object);
-
- shell_sidebar = E_SHELL_SIDEBAR (object);
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
-
- mail_shell_sidebar = E_MAIL_SHELL_SIDEBAR (object);
-
- /* Build sidebar widgets. */
-
- container = GTK_WIDGET (object);
-
- widget = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (
- GTK_SCROLLED_WINDOW (widget),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (
- GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN);
- gtk_container_add (GTK_CONTAINER (container), widget);
- gtk_widget_show (widget);
-
- container = widget;
-
- widget = em_folder_tree_new ();
- em_folder_tree_set_excluded (EM_FOLDER_TREE (widget), 0);
- em_folder_tree_enable_drag_and_drop (EM_FOLDER_TREE (widget));
- gtk_container_add (GTK_CONTAINER (container), widget);
- mail_shell_sidebar->priv->folder_tree = g_object_ref (widget);
- gtk_widget_show (widget);
-
- tree_view = GTK_TREE_VIEW (mail_shell_sidebar->priv->folder_tree);
- selection = gtk_tree_view_get_selection (tree_view);
- model = gtk_tree_view_get_model (tree_view);
-
- if (em_folder_tree_model_get_selection (
- EM_FOLDER_TREE_MODEL (model)) == NULL)
- mail_shell_sidebar_restore_state (mail_shell_sidebar);
-
- em_folder_tree_model_set_selection (
- EM_FOLDER_TREE_MODEL (model), selection);
-
- g_signal_connect_swapped (
- tree_view, "row-collapsed",
- G_CALLBACK (mail_shell_sidebar_row_collapsed_cb),
- shell_sidebar);
-
- g_signal_connect_swapped (
- tree_view, "row-expanded",
- G_CALLBACK (mail_shell_sidebar_row_expanded_cb),
- shell_sidebar);
-
- g_signal_connect_swapped (
- model, "loaded-row",
- G_CALLBACK (mail_shell_sidebar_model_loaded_row_cb),
- shell_sidebar);
-
- g_signal_connect_swapped (
- selection, "changed",
- G_CALLBACK (mail_shell_sidebar_selection_changed_cb),
- shell_sidebar);
-}
-
-static guint32
-mail_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
-{
- EMailShellSidebar *mail_shell_sidebar;
- EShellView *shell_view;
- EMFolderTree *folder_tree;
- GtkTreeSelection *selection;
- GtkTreeView *tree_view;
- GtkTreeModel *model;
- GtkTreeIter iter;
- CamelFolder *folder;
- CamelStore *local_store;
- CamelStore *store;
- gchar *full_name;
- gchar *uri;
- gboolean allows_children = TRUE;
- gboolean can_delete = TRUE;
- gboolean is_junk = FALSE;
- gboolean is_outbox = FALSE;
- gboolean is_store;
- gboolean is_trash = FALSE;
- guint32 folder_flags = 0;
- guint32 state = 0;
-
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
-
- local_store = e_mail_local_get_store ();
-
- mail_shell_sidebar = E_MAIL_SHELL_SIDEBAR (shell_sidebar);
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- tree_view = GTK_TREE_VIEW (folder_tree);
-
- selection = gtk_tree_view_get_selection (tree_view);
- if (!gtk_tree_selection_get_selected (selection, &model, &iter))
- return 0;
-
- gtk_tree_model_get (
- model, &iter,
- COL_POINTER_CAMEL_STORE, &store,
- COL_STRING_FULL_NAME, &full_name,
- COL_BOOL_IS_STORE, &is_store,
- COL_UINT_FLAGS, &folder_flags,
- COL_STRING_URI, &uri, -1);
-
- if (!is_store) {
- is_junk = (strcmp (full_name, CAMEL_VJUNK_NAME) == 0);
- is_trash = (strcmp (full_name, CAMEL_VTRASH_NAME) == 0);
- allows_children = !(is_junk || is_trash);
-
- /* Don't allow deletion of special local folders. */
- if (store == local_store)
- can_delete =
- (strcmp (full_name, "Drafts") != 0) &&
- (strcmp (full_name, "Inbox") != 0) &&
- (strcmp (full_name, "Outbox") != 0) &&
- (strcmp (full_name, "Sent") != 0) &&
- (strcmp (full_name, "Templates") != 0);
-
- folder = em_folder_tree_get_selected_folder (folder_tree);
- is_outbox = em_utils_folder_is_outbox (folder, NULL);
- can_delete &= !(folder_flags & CAMEL_FOLDER_SYSTEM);
- }
-
- if (allows_children)
- state |= E_MAIL_SHELL_SIDEBAR_FOLDER_ALLOWS_CHILDREN;
- if (can_delete)
- state |= E_MAIL_SHELL_SIDEBAR_FOLDER_CAN_DELETE;
- if (is_junk)
- state |= E_MAIL_SHELL_SIDEBAR_FOLDER_IS_JUNK;
- if (is_outbox)
- state |= E_MAIL_SHELL_SIDEBAR_FOLDER_IS_OUTBOX;
- if (is_store)
- state |= E_MAIL_SHELL_SIDEBAR_FOLDER_IS_STORE;
- if (is_trash)
- state |= E_MAIL_SHELL_SIDEBAR_FOLDER_IS_TRASH;
-
- return state;
-}
-
-static void
-mail_shell_sidebar_class_init (EMailShellSidebarClass *class)
-{
- GObjectClass *object_class;
- EShellSidebarClass *shell_sidebar_class;
-
- parent_class = g_type_class_peek_parent (class);
- g_type_class_add_private (class, sizeof (EMailShellSidebarPrivate));
-
- object_class = G_OBJECT_CLASS (class);
- object_class->get_property = mail_shell_sidebar_get_property;
- object_class->dispose = mail_shell_sidebar_dispose;
- object_class->finalize = mail_shell_sidebar_finalize;
- object_class->constructed = mail_shell_sidebar_constructed;
-
- shell_sidebar_class = E_SHELL_SIDEBAR_CLASS (class);
- shell_sidebar_class->check_state = mail_shell_sidebar_check_state;
-
- g_object_class_install_property (
- object_class,
- PROP_FOLDER_TREE,
- g_param_spec_object (
- "folder-tree",
- NULL,
- NULL,
- EM_TYPE_FOLDER_TREE,
- G_PARAM_READABLE));
-}
-
-static void
-mail_shell_sidebar_init (EMailShellSidebar *mail_shell_sidebar)
-{
- mail_shell_sidebar->priv =
- E_MAIL_SHELL_SIDEBAR_GET_PRIVATE (mail_shell_sidebar);
-
- /* Postpone widget construction until we have a shell view. */
-}
-
-GType
-e_mail_shell_sidebar_get_type (void)
-{
- return mail_shell_sidebar_type;
-}
-
-void
-e_mail_shell_sidebar_register_type (GTypeModule *type_module)
-{
- static const GTypeInfo type_info = {
- sizeof (EMailShellSidebarClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) mail_shell_sidebar_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EMailShellSidebar),
- 0, /* n_preallocs */
- (GInstanceInitFunc) mail_shell_sidebar_init,
- NULL /* value_table */
- };
-
- mail_shell_sidebar_type = g_type_module_register_type (
- type_module, E_TYPE_SHELL_SIDEBAR,
- "EMailShellSidebar", &type_info, 0);
-}
-
-GtkWidget *
-e_mail_shell_sidebar_new (EShellView *shell_view)
-{
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
-
- return g_object_new (
- E_TYPE_MAIL_SHELL_SIDEBAR,
- "shell-view", shell_view, NULL);
-}
-
-EMFolderTree *
-e_mail_shell_sidebar_get_folder_tree (EMailShellSidebar *mail_shell_sidebar)
-{
- g_return_val_if_fail (
- E_IS_MAIL_SHELL_SIDEBAR (mail_shell_sidebar), NULL);
-
- return EM_FOLDER_TREE (mail_shell_sidebar->priv->folder_tree);
-}
diff --git a/mail/e-mail-shell-sidebar.h b/mail/e-mail-shell-sidebar.h
deleted file mode 100644
index 10a2ff6a2a..0000000000
--- a/mail/e-mail-shell-sidebar.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * e-mail-shell-sidebar.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_MAIL_SHELL_SIDEBAR_H
-#define E_MAIL_SHELL_SIDEBAR_H
-
-#include <shell/e-shell-sidebar.h>
-#include <shell/e-shell-view.h>
-#include <mail/em-folder-tree.h>
-
-/* Standard GObject macros */
-#define E_TYPE_MAIL_SHELL_SIDEBAR \
- (e_mail_shell_sidebar_get_type ())
-#define E_MAIL_SHELL_SIDEBAR(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), E_TYPE_MAIL_SHELL_SIDEBAR, EMailShellSidebar))
-#define E_MAIL_SHELL_SIDEBAR_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), E_TYPE_MAIL_SHELL_SIDEBAR, EMailShellSidebarClass))
-#define E_IS_MAIL_SHELL_SIDEBAR(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), E_TYPE_MAIL_SHELL_SIDEBAR))
-#define E_IS_MAIL_SHELL_SIDEBAR_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), E_TYPE_MAIL_SHELL_SIDEBAR))
-#define E_MAIL_SHELL_SIDEBAR_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS \
- ((obj), E_TYPE_MAIL_SHELL_SIDEBAR, EMailShellSidebarClass))
-
-G_BEGIN_DECLS
-
-typedef struct _EMailShellSidebar EMailShellSidebar;
-typedef struct _EMailShellSidebarClass EMailShellSidebarClass;
-typedef struct _EMailShellSidebarPrivate EMailShellSidebarPrivate;
-
-enum {
- E_MAIL_SHELL_SIDEBAR_FOLDER_ALLOWS_CHILDREN = 1 << 0,
- E_MAIL_SHELL_SIDEBAR_FOLDER_CAN_DELETE = 1 << 1,
- E_MAIL_SHELL_SIDEBAR_FOLDER_IS_JUNK = 1 << 2,
- E_MAIL_SHELL_SIDEBAR_FOLDER_IS_OUTBOX = 1 << 3,
- E_MAIL_SHELL_SIDEBAR_FOLDER_IS_STORE = 1 << 4,
- E_MAIL_SHELL_SIDEBAR_FOLDER_IS_TRASH = 1 << 5
-};
-
-struct _EMailShellSidebar {
- EShellSidebar parent;
- EMailShellSidebarPrivate *priv;
-};
-
-struct _EMailShellSidebarClass {
- EShellSidebarClass parent_class;
-};
-
-GType e_mail_shell_sidebar_get_type (void);
-void e_mail_shell_sidebar_register_type
- (GTypeModule *type_module);
-GtkWidget * e_mail_shell_sidebar_new(EShellView *shell_view);
-EMFolderTree * e_mail_shell_sidebar_get_folder_tree
- (EMailShellSidebar *mail_shell_sidebar);
-
-G_END_DECLS
-
-#endif /* E_MAIL_SHELL_SIDEBAR_H */
diff --git a/mail/e-mail-shell-view-actions.c b/mail/e-mail-shell-view-actions.c
deleted file mode 100644
index 25e7d80da3..0000000000
--- a/mail/e-mail-shell-view-actions.c
+++ /dev/null
@@ -1,1806 +0,0 @@
-/*
- * e-mail-shell-view-actions.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-view-private.h"
-
-#define STATE_KEY_SEARCH_FILTER "SearchFilter"
-#define STATE_KEY_SEARCH_SCOPE "SearchScope"
-#define STATE_KEY_SEARCH_TEXT "SearchText"
-
-static void
-action_gal_save_custom_view_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellContent *mail_shell_content;
- EShellView *shell_view;
- GalViewInstance *view_instance;
-
- /* All shell views repond to the activation of this action,
- * which is defined by EShellWindow. But only the currently
- * active shell view proceeds with saving the custom view. */
- shell_view = E_SHELL_VIEW (mail_shell_view);
- if (!e_shell_view_is_active (shell_view))
- return;
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- view_instance = e_mail_shell_content_get_view_instance (mail_shell_content);
- gal_view_instance_save_as (view_instance);
-}
-
-static void
-action_mail_account_disable_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellSidebar *mail_shell_sidebar;
- EMFolderTree *folder_tree;
- EAccountList *account_list;
- EAccount *account;
- gchar *folder_uri;
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
-
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- folder_uri = em_folder_tree_get_selected_uri (folder_tree);
- g_return_if_fail (folder_uri != NULL);
-
- account_list = e_get_account_list ();
- account = mail_config_get_account_by_source_url (folder_uri);
- g_return_if_fail (account != NULL);
-
- if (e_account_list_account_has_proxies (account_list, account))
- e_account_list_remove_account_proxies (account_list, account);
-
- account->enabled = !account->enabled;
- e_account_list_change (account_list, account);
- e_mail_store_remove_by_uri (folder_uri);
-
- if (account->parent_uid != NULL)
- e_account_list_remove (account_list, account);
-
- e_account_list_save (account_list);
-
- g_free (folder_uri);
-}
-
-static void
-action_mail_create_search_folder_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- /* FIXME */
- g_print ("Action: %s\n", gtk_action_get_name (GTK_ACTION (action)));
-}
-
-static void
-action_mail_download_foreach_cb (CamelService *service)
-{
- if (CAMEL_IS_DISCO_STORE (service) || CAMEL_IS_OFFLINE_STORE (service))
- mail_store_prepare_offline (CAMEL_STORE (service));
-}
-
-static void
-action_mail_download_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- e_mail_store_foreach ((GHFunc) action_mail_download_foreach_cb, NULL);
-}
-
-static void
-action_mail_empty_trash_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShellWindow *shell_window;
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- em_utils_empty_trash (GTK_WIDGET (shell_window));
-}
-
-static void
-action_mail_flush_outbox_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- mail_send ();
-}
-
-static void
-action_mail_folder_copy_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellSidebar *mail_shell_sidebar;
- CamelFolderInfo *folder_info;
- EMFolderTree *folder_tree;
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- folder_info = em_folder_tree_get_selected_folder_info (folder_tree);
- g_return_if_fail (folder_info != NULL);
-
- /* XXX Leaking folder_info? */
- em_folder_utils_copy_folder (folder_info, FALSE);
-}
-
-static void
-action_mail_folder_delete_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellSidebar *mail_shell_sidebar;
- EMFolderTree *folder_tree;
- CamelFolder *folder;
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- folder = em_folder_tree_get_selected_folder (folder_tree);
- g_return_if_fail (folder != NULL);
-
- em_folder_utils_delete_folder (folder);
-}
-
-static void
-action_mail_folder_expunge_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailReader *reader;
- MessageList *message_list;
- EShellWindow *shell_window;
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- g_return_if_fail (message_list->folder != NULL);
-
- em_utils_expunge_folder (
- GTK_WIDGET (shell_window), message_list->folder);
-}
-
-static void
-action_mail_folder_mark_all_as_read_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailReader *reader;
- MessageList *message_list;
- EShellWindow *shell_window;
- EShellView *shell_view;
- CamelFolder *folder;
- GtkWindow *parent;
- GPtrArray *uids;
- const gchar *key;
- const gchar *prompt;
- guint ii;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- parent = GTK_WINDOW (shell_window);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder = message_list->folder;
- g_return_if_fail (folder != NULL);
-
- key = "/apps/evolution/mail/prompts/mark_all_read";
- prompt = "mail:ask-mark-all-read";
-
- if (!em_utils_prompt_user (parent, key, prompt, NULL))
- return;
-
- uids = message_list_get_uids (message_list);
-
- camel_folder_freeze (folder);
- for (ii = 0; ii < uids->len; ii++)
- camel_folder_set_message_flags (
- folder, uids->pdata[ii],
- CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
- camel_folder_thaw (folder);
-
- message_list_free_uids (message_list, uids);
-}
-
-static void
-action_mail_folder_move_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellSidebar *mail_shell_sidebar;
- CamelFolderInfo *folder_info;
- EMFolderTree *folder_tree;
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- folder_info = em_folder_tree_get_selected_folder_info (folder_tree);
- g_return_if_fail (folder_info != NULL);
-
- /* XXX Leaking folder_info? */
- em_folder_utils_copy_folder (folder_info, TRUE);
-}
-
-static void
-action_mail_folder_new_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellWindow *shell_window;
- EMailShellSidebar *mail_shell_sidebar;
- CamelFolderInfo *folder_info;
- EMFolderTree *folder_tree;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- folder_info = em_folder_tree_get_selected_folder_info (folder_tree);
- g_return_if_fail (folder_info != NULL);
-
- em_folder_utils_create_folder (
- folder_info, folder_tree, GTK_WINDOW (shell_window));
- camel_folder_info_free (folder_info);
-}
-
-static void
-action_mail_folder_properties_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellSidebar *mail_shell_sidebar;
- EMFolderTree *folder_tree;
- EShellView *shell_view;
- GtkTreeSelection *selection;
- GtkTreeView *tree_view;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *uri;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
-
- tree_view = GTK_TREE_VIEW (folder_tree);
- selection = gtk_tree_view_get_selection (tree_view);
- if (!gtk_tree_selection_get_selected (selection, &model, &iter))
- return;
-
- gtk_tree_model_get (model, &iter, COL_STRING_URI, &uri, -1);
- em_folder_properties_show (shell_view, NULL, uri);
- g_free (uri);
-}
-
-static void
-action_mail_folder_refresh_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellSidebar *mail_shell_sidebar;
- EMFolderTree *folder_tree;
- CamelFolder *folder;
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- folder = em_folder_tree_get_selected_folder (folder_tree);
- g_return_if_fail (folder != NULL);
-
- mail_refresh_folder (folder, NULL, NULL);
-}
-
-static void
-action_mail_folder_rename_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellSidebar *mail_shell_sidebar;
- EMFolderTree *folder_tree;
- CamelFolder *folder;
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
- folder = em_folder_tree_get_selected_folder (folder_tree);
- g_return_if_fail (folder != NULL);
-
- em_folder_utils_rename_folder (folder);
-}
-
-/* Helper for action_mail_folder_select_all_cb() */
-static gboolean
-action_mail_folder_select_all_timeout_cb (MessageList *message_list)
-{
- message_list_select_all (message_list);
- gtk_widget_grab_focus (GTK_WIDGET (message_list));
-
- return FALSE;
-}
-
-static void
-action_mail_folder_select_all_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailReader *reader;
- MessageList *message_list;
- EShellWindow *shell_window;
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- if (message_list->threaded) {
- gtk_action_activate (ACTION (MAIL_THREADS_EXPAND_ALL));
-
- /* XXX The timeout below is added so that the execution
- * thread to expand all conversation threads would
- * have completed. The timeout 505 is just to ensure
- * that the value is a small delta more than the
- * timeout value in mail_regen_list(). */
- g_timeout_add (
- 505, (GSourceFunc)
- action_mail_folder_select_all_timeout_cb,
- message_list);
- } else
- /* If there is no threading, just select all immediately. */
- action_mail_folder_select_all_timeout_cb (message_list);
-}
-
-static void
-action_mail_folder_select_thread_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- MessageList *message_list;
- EMailReader *reader;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- message_list_select_thread (message_list);
-}
-
-static void
-action_mail_folder_select_subthread_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- MessageList *message_list;
- EMailReader *reader;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- message_list_select_subthread (message_list);
-}
-
-static void
-action_mail_hide_deleted_cb (GtkToggleAction *action,
- EMailShellView *mail_shell_view)
-{
- MessageList *message_list;
- EMailReader *reader;
- gboolean active;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- active = gtk_toggle_action_get_active (action);
- message_list_set_hidedeleted (message_list, active);
-}
-
-static void
-action_mail_hide_read_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- MessageList *message_list;
- EMailReader *reader;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- message_list_hide_add (
- message_list,
- "(match-all (system-flag \"seen\"))",
- ML_HIDE_SAME, ML_HIDE_SAME);
-}
-
-static void
-action_mail_hide_selected_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- MessageList *message_list;
- EMailReader *reader;
- GPtrArray *uids;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- uids = message_list_get_selected (message_list);
- message_list_hide_uids (message_list, uids);
- message_list_free_uids (message_list, uids);
-}
-
-static void
-action_mail_label_cb (GtkToggleAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailReader *reader;
- MessageList *message_list;
- CamelFolder *folder;
- GPtrArray *uids;
- const gchar *tag;
- gint ii;
-
- tag = g_object_get_data (G_OBJECT (action), "tag");
- g_return_if_fail (tag != NULL);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder = message_list->folder;
-
- uids = message_list_get_selected (message_list);
-
- for (ii = 0; ii < uids->len; ii++) {
- if (gtk_toggle_action_get_active (action))
- camel_folder_set_message_user_flag (
- folder, uids->pdata[ii], tag, TRUE);
- else {
- camel_folder_set_message_user_flag (
- folder, uids->pdata[ii], tag, FALSE);
- camel_folder_set_message_user_tag (
- folder, uids->pdata[ii], "label", NULL);
- }
- }
-
- message_list_free_uids (message_list, uids);
-}
-
-static void
-action_mail_label_new_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShell *shell;
- EShellSettings *shell_settings;
- EShellWindow *shell_window;
- EShellView *shell_view;
- EMailLabelDialog *label_dialog;
- EMailLabelListStore *store;
- EMailReader *reader;
- MessageList *message_list;
- CamelFolder *folder;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *dialog;
- GPtrArray *uids;
- GdkColor label_color;
- const gchar *property_name;
- const gchar *label_name;
- gchar *label_tag;
- gint n_children;
- guint ii;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- dialog = e_mail_label_dialog_new (GTK_WINDOW (shell_window));
-
- gtk_window_set_title (GTK_WINDOW (dialog), _("Add Label"));
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
- goto exit;
-
- shell = e_shell_window_get_shell (shell_window);
- shell_settings = e_shell_get_shell_settings (shell);
-
- label_dialog = E_MAIL_LABEL_DIALOG (dialog);
- label_name = e_mail_label_dialog_get_label_name (label_dialog);
- e_mail_label_dialog_get_label_color (label_dialog, &label_color);
-
- property_name = "mail-label-list-store";
- store = e_shell_settings_get_object (shell_settings, property_name);
- e_mail_label_list_store_set (store, NULL, label_name, &label_color);
- g_object_unref (store);
-
- /* XXX This is awkward. We've added a new label to the list store
- * but we don't have the new label's tag nor an iterator to use
- * to fetch it. We know the label was appended to the store,
- * so we have to dig it out manually. EMailLabelListStore API
- * probably needs some rethinking. */
- model = GTK_TREE_MODEL (store);
- n_children = gtk_tree_model_iter_n_children (model, NULL);
- gtk_tree_model_iter_nth_child (model, &iter, NULL, n_children - 1);
- label_tag = e_mail_label_list_store_get_tag (store, &iter);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder = message_list->folder;
-
- uids = message_list_get_selected (message_list);
-
- for (ii = 0; ii < uids->len; ii++)
- camel_folder_set_message_user_flag (
- folder, uids->pdata[ii], label_tag, TRUE);
-
- message_list_free_uids (message_list, uids);
-
- g_free (label_tag);
-
-exit:
- gtk_widget_destroy (dialog);
-}
-
-static void
-action_mail_label_none_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShell *shell;
- EShellView *shell_view;
- EShellSettings *shell_settings;
- EShellWindow *shell_window;
- EMailReader *reader;
- MessageList *message_list;
- GtkTreeModel *tree_model;
- CamelFolder *folder;
- GtkTreeIter iter;
- GPtrArray *uids;
- gboolean valid;
- guint ii;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- shell = e_shell_window_get_shell (shell_window);
- shell_settings = e_shell_get_shell_settings (shell);
-
- tree_model = e_shell_settings_get_object (
- shell_settings, "mail-label-list-store");
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- uids = message_list_get_selected (message_list);
- folder = message_list->folder;
-
- valid = gtk_tree_model_get_iter_first (tree_model, &iter);
-
- while (valid) {
- gchar *tag;
-
- tag = e_mail_label_list_store_get_tag (
- E_MAIL_LABEL_LIST_STORE (tree_model), &iter);
-
- for (ii = 0; ii < uids->len; ii++) {
- camel_folder_set_message_user_flag (
- folder, uids->pdata[ii], tag, FALSE);
- camel_folder_set_message_user_tag (
- folder, uids->pdata[ii], "label", NULL);
- }
-
- g_free (tag);
-
- valid = gtk_tree_model_iter_next (tree_model, &iter);
- }
-
- message_list_free_uids (message_list, uids);
-}
-
-static void
-action_mail_search_cb (GtkRadioAction *action,
- GtkRadioAction *current,
- EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellContent *shell_content;
- const gchar *search_hint;
-
- /* XXX Figure out a way to handle this in EShellContent
- * instead of every shell view having to handle it.
- * The problem is EShellContent does not know what
- * the search option actions are for this view. It
- * would have to dig up the popup menu and retrieve
- * the action for each menu item. Seems messy. */
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_content = e_shell_view_get_shell_content (shell_view);
-
- search_hint = gtk_action_get_label (GTK_ACTION (current));
- e_shell_content_set_search_hint (shell_content, search_hint);
-}
-
-static void
-action_mail_show_hidden_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- MessageList *message_list;
- EMailReader *reader;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- message_list_hide_clear (message_list);
-}
-
-static void
-action_mail_smart_backward_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShell *shell;
- EShellView *shell_view;
- EShellWindow *shell_window;
- EShellSettings *shell_settings;
- EMailShellSidebar *mail_shell_sidebar;
- EMFolderTree *folder_tree;
- EMFormatHTMLDisplay *html_display;
- EMailReader *reader;
- MessageList *message_list;
- GtkToggleAction *toggle_action;
- GtkHTML *html;
- gboolean caret_mode;
- gboolean magic_spacebar;
-
- /* This implements the so-called "Magic Backspace". */
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- shell = e_shell_window_get_shell (shell_window);
- shell_settings = e_shell_get_shell_settings (shell);
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- html_display = e_mail_reader_get_html_display (reader);
- message_list = e_mail_reader_get_message_list (reader);
-
- magic_spacebar = e_shell_settings_get_boolean (
- shell_settings, "mail-magic-spacebar");
-
- toggle_action = GTK_TOGGLE_ACTION (ACTION (MAIL_CARET_MODE));
- caret_mode = gtk_toggle_action_get_active (toggle_action);
-
- html = EM_FORMAT_HTML (html_display)->html;
-
- if (gtk_html_command (html, "scroll-backward"))
- return;
-
- if (caret_mode || !magic_spacebar)
- return;
-
- /* XXX Are two separate calls really necessary? */
-
- if (message_list_select (
- message_list, MESSAGE_LIST_SELECT_PREVIOUS,
- 0, CAMEL_MESSAGE_SEEN))
- return;
-
- if (message_list_select (
- message_list, MESSAGE_LIST_SELECT_PREVIOUS |
- MESSAGE_LIST_SELECT_WRAP, 0, CAMEL_MESSAGE_SEEN))
- return;
-
- em_folder_tree_select_prev_path (folder_tree, TRUE);
-
- gtk_widget_grab_focus (GTK_WIDGET (message_list));
-}
-
-static void
-action_mail_smart_forward_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShell *shell;
- EShellView *shell_view;
- EShellWindow *shell_window;
- EShellSettings *shell_settings;
- EMailShellSidebar *mail_shell_sidebar;
- EMFolderTree *folder_tree;
- EMFormatHTMLDisplay *html_display;
- EMailReader *reader;
- MessageList *message_list;
- GtkToggleAction *toggle_action;
- GtkHTML *html;
- gboolean caret_mode;
- gboolean magic_spacebar;
-
- /* This implements the so-called "Magic Spacebar". */
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- shell = e_shell_window_get_shell (shell_window);
- shell_settings = e_shell_get_shell_settings (shell);
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- html_display = e_mail_reader_get_html_display (reader);
- message_list = e_mail_reader_get_message_list (reader);
-
- magic_spacebar = e_shell_settings_get_boolean (
- shell_settings, "mail-magic-spacebar");
-
- toggle_action = GTK_TOGGLE_ACTION (ACTION (MAIL_CARET_MODE));
- caret_mode = gtk_toggle_action_get_active (toggle_action);
-
- html = EM_FORMAT_HTML (html_display)->html;
-
- if (gtk_html_command (html, "scroll-forward"))
- return;
-
- if (caret_mode || !magic_spacebar)
- return;
-
- /* XXX Are two separate calls really necessary? */
-
- if (message_list_select (
- message_list, MESSAGE_LIST_SELECT_NEXT,
- 0, CAMEL_MESSAGE_SEEN))
- return;
-
- if (message_list_select (
- message_list, MESSAGE_LIST_SELECT_NEXT |
- MESSAGE_LIST_SELECT_WRAP, 0, CAMEL_MESSAGE_SEEN))
- return;
-
- em_folder_tree_select_next_path (folder_tree, TRUE);
-
- gtk_widget_grab_focus (GTK_WIDGET (message_list));
-}
-
-static void
-action_mail_stop_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- mail_cancel_all ();
-}
-
-static void
-action_mail_threads_collapse_all_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- MessageList *message_list;
- EMailReader *reader;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- message_list_set_threaded_collapse_all (message_list);
-}
-
-static void
-action_mail_threads_expand_all_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- MessageList *message_list;
- EMailReader *reader;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- message_list_set_threaded_expand_all (message_list);
-}
-
-static void
-action_mail_threads_group_by_cb (GtkToggleAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellContent *mail_shell_content;
- MessageList *message_list;
- EMailReader *reader;
- gboolean active;
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- active = gtk_toggle_action_get_active (action);
-
- reader = E_MAIL_READER (mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
-
- message_list_set_threaded (message_list, active);
-}
-
-static void
-action_mail_tools_filters_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShellWindow *shell_window;
- EShellView *shell_view;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- em_utils_edit_filters (GTK_WIDGET (shell_window));
-}
-
-static void
-action_mail_tools_search_folders_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- vfolder_edit (E_SHELL_VIEW (mail_shell_view));
-}
-
-static void
-action_mail_tools_subscriptions_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShellWindow *shell_window;
- EShellView *shell_view;
- GtkWidget *dialog;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- dialog = em_subscribe_editor_new ();
- gtk_window_set_transient_for (
- GTK_WINDOW (dialog), GTK_WINDOW (shell_window));
- gtk_dialog_run (GTK_DIALOG (dialog));
- /* XXX Dialog destroys itself. */
-}
-
-static void
-action_mail_view_cb (GtkRadioAction *action,
- GtkRadioAction *current,
- EMailShellView *mail_shell_view)
-{
- EMailShellContent *mail_shell_content;
- gboolean vertical_view;
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- vertical_view = (gtk_radio_action_get_current_value (action) == 1);
-
- e_mail_shell_content_set_vertical_view (
- mail_shell_content, vertical_view);
-}
-
-static void
-action_search_execute_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellContent *shell_content;
- EMailReader *reader;
- MessageList *message_list;
- GKeyFile *key_file;
- const gchar *folder_uri;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_content = e_shell_view_get_shell_content (shell_view);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- /* All shell views respond to the activation of this action,
- * which is defined by EShellWindow. But only the currently
- * active shell view proceeds with executing the search. */
- if (!e_shell_view_is_active (shell_view))
- return;
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder_uri = message_list->folder_uri;
-
- if (folder_uri != NULL) {
- const gchar *key;
- const gchar *string;
- gchar *group_name;
-
- key = STATE_KEY_SEARCH_TEXT;
- string = e_shell_content_get_search_text (shell_content);
- group_name = g_strdup_printf ("Folder %s", folder_uri);
-
- if (string != NULL && *string != '\0')
- g_key_file_set_string (
- key_file, group_name, key, string);
- else
- g_key_file_remove_key (
- key_file, group_name, key, NULL);
- e_shell_view_set_state_dirty (shell_view);
-
- g_free (group_name);
- }
-
- e_mail_shell_view_execute_search (mail_shell_view);
-}
-
-static void
-action_search_filter_cb (GtkRadioAction *action,
- GtkRadioAction *current,
- EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellWindow *shell_window;
- EMailReader *reader;
- MessageList *message_list;
- GKeyFile *key_file;
- const gchar *folder_uri;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder_uri = message_list->folder_uri;
-
- if (folder_uri != NULL) {
- const gchar *key;
- const gchar *string;
- gchar *group_name;
-
- key = STATE_KEY_SEARCH_FILTER;
- string = gtk_action_get_name (GTK_ACTION (current));
- group_name = g_strdup_printf ("Folder %s", folder_uri);
-
- g_key_file_set_string (key_file, group_name, key, string);
- e_shell_view_set_state_dirty (shell_view);
-
- g_free (group_name);
- }
-
- gtk_action_activate (ACTION (SEARCH_EXECUTE));
-}
-
-static void
-action_search_scope_cb (GtkRadioAction *action,
- GtkRadioAction *current,
- EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellWindow *shell_window;
- EMailReader *reader;
- MessageList *message_list;
- GKeyFile *key_file;
- const gchar *folder_uri;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- key_file = e_shell_view_get_state_key_file (shell_view);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder_uri = message_list->folder_uri;
-
- if (folder_uri != NULL) {
- const gchar *key;
- const gchar *string;
- gchar *group_name;
-
- key = STATE_KEY_SEARCH_SCOPE;
- string = gtk_action_get_name (GTK_ACTION (current));
- group_name = g_strdup_printf ("Folder %s", folder_uri);
-
- g_key_file_set_string (key_file, group_name, key, string);
- e_shell_view_set_state_dirty (shell_view);
-
- g_free (group_name);
- }
-
- gtk_action_activate (ACTION (SEARCH_EXECUTE));
-}
-
-static GtkActionEntry mail_entries[] = {
-
- { "mail-account-disable",
- NULL,
- N_("_Disable Account"),
- NULL,
- N_("Disable this account"),
- G_CALLBACK (action_mail_account_disable_cb) },
-
- { "mail-create-search-folder",
- NULL,
- N_("C_reate Search Folder From Search..."),
- NULL,
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (action_mail_create_search_folder_cb) },
-
- { "mail-download",
- NULL,
- N_("_Download Messages for Offline Usage"),
- NULL,
- N_("Download messages of accounts and folders marked for offline"),
- G_CALLBACK (action_mail_download_cb) },
-
- { "mail-empty-trash",
- NULL,
- N_("Empty _Trash"),
- NULL,
- N_("Permanently remove all the deleted messages from all folders"),
- G_CALLBACK (action_mail_empty_trash_cb) },
-
- { "mail-flush-outbox",
- "mail-send",
- N_("Fl_ush Outbox"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (action_mail_flush_outbox_cb) },
-
- { "mail-folder-copy",
- "folder-copy",
- N_("_Copy Folder To..."),
- NULL,
- N_("Copy the selected folder into another folder"),
- G_CALLBACK (action_mail_folder_copy_cb) },
-
- { "mail-folder-delete",
- GTK_STOCK_DELETE,
- NULL,
- NULL,
- N_("Permanently remove this folder"),
- G_CALLBACK (action_mail_folder_delete_cb) },
-
- { "mail-folder-expunge",
- NULL,
- N_("E_xpunge"),
- "<Control>e",
- N_("Permanently remove all deleted messages from this folder"),
- G_CALLBACK (action_mail_folder_expunge_cb) },
-
- { "mail-folder-mark-all-as-read",
- "mail-read",
- N_("Mar_k All Messages as Read"),
- NULL,
- N_("Mark all messages in the folder as read"),
- G_CALLBACK (action_mail_folder_mark_all_as_read_cb) },
-
- { "mail-folder-move",
- "folder-move",
- N_("_Move Folder To..."),
- NULL,
- N_("Move the selected folder into another folder"),
- G_CALLBACK (action_mail_folder_move_cb) },
-
- { "mail-folder-new",
- "folder-new",
- N_("_New..."),
- NULL,
- N_("Create a new folder for storing mail"),
- G_CALLBACK (action_mail_folder_new_cb) },
-
- { "mail-folder-properties",
- GTK_STOCK_PROPERTIES,
- NULL,
- NULL,
- N_("Change the properties of this folder"),
- G_CALLBACK (action_mail_folder_properties_cb) },
-
- { "mail-folder-refresh",
- GTK_STOCK_REFRESH,
- NULL,
- "F5",
- N_("Refresh the folder"),
- G_CALLBACK (action_mail_folder_refresh_cb) },
-
- { "mail-folder-rename",
- NULL,
- N_("_Rename..."),
- "F2",
- N_("Change the name of this folder"),
- G_CALLBACK (action_mail_folder_rename_cb) },
-
- { "mail-folder-select-all",
- NULL,
- N_("Select _All Messages"),
- "<Control>a",
- N_("Select all visible messages"),
- G_CALLBACK (action_mail_folder_select_all_cb) },
-
- { "mail-folder-select-thread",
- NULL,
- N_("Select Message _Thread"),
- "<Control>h",
- N_("Select all messages in the same thread as the selected message"),
- G_CALLBACK (action_mail_folder_select_thread_cb) },
-
- { "mail-folder-select-subthread",
- NULL,
- N_("Select Message S_ubthread"),
- "<Shift><Control>h",
- N_("Select all replies to the currently selected message"),
- G_CALLBACK (action_mail_folder_select_subthread_cb) },
-
- { "mail-label-new",
- NULL,
- N_("_New Label"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (action_mail_label_new_cb) },
-
- { "mail-label-none",
- NULL,
- N_("N_one"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (action_mail_label_none_cb) },
-
- { "mail-hide-read",
- NULL,
- N_("Hide _Read Messages"),
- NULL,
- N_("Temporarily hide all messages that have already been read"),
- G_CALLBACK (action_mail_hide_read_cb) },
-
- { "mail-hide-selected",
- NULL,
- N_("Hide S_elected Messages"),
- NULL,
- N_("Temporarily hide the selected messages"),
- G_CALLBACK (action_mail_hide_selected_cb) },
-
- { "mail-show-hidden",
- NULL,
- N_("Show Hidde_n Messages"),
- NULL,
- N_("Show messages that have been temporarily hidden"),
- G_CALLBACK (action_mail_show_hidden_cb) },
-
- { "mail-smart-backward",
- NULL,
- NULL, /* No menu item; key press only */
- NULL,
- NULL,
- G_CALLBACK (action_mail_smart_backward_cb) },
-
- { "mail-smart-forward",
- NULL,
- NULL, /* No menu item; key press only */
- NULL,
- NULL,
- G_CALLBACK (action_mail_smart_forward_cb) },
-
- { "mail-stop",
- GTK_STOCK_STOP,
- N_("Cancel"),
- NULL,
- N_("Cancel the current mail operation"),
- G_CALLBACK (action_mail_stop_cb) },
-
- { "mail-threads-collapse-all",
- NULL,
- N_("Collapse All _Threads"),
- "<Shift><Control>b",
- N_("Collapse all message threads"),
- G_CALLBACK (action_mail_threads_collapse_all_cb) },
-
- { "mail-threads-expand-all",
- NULL,
- N_("E_xpand All Threads"),
- NULL,
- N_("Expand all message threads"),
- G_CALLBACK (action_mail_threads_expand_all_cb) },
-
- { "mail-tools-filters",
- NULL,
- N_("_Message Filters"),
- NULL,
- N_("Create or edit rules for filtering new mail"),
- G_CALLBACK (action_mail_tools_filters_cb) },
-
- { "mail-tools-search-folders",
- NULL,
- N_("Search F_olders"),
- NULL,
- N_("Create or edit search folder definitions"),
- G_CALLBACK (action_mail_tools_search_folders_cb) },
-
- { "mail-tools-subscriptions",
- NULL,
- N_("_Subscriptions..."),
- NULL,
- N_("Subscribe or unsubscribe to folders on remote servers"),
- G_CALLBACK (action_mail_tools_subscriptions_cb) },
-
- /*** Menus ***/
-
- { "mail-folder-menu",
- NULL,
- N_("F_older"),
- NULL,
- NULL,
- NULL },
-
- { "mail-label-menu",
- NULL,
- N_("_Label"),
- NULL,
- NULL,
- NULL },
-
- { "mail-preview-menu",
- NULL,
- N_("_Preview"),
- NULL,
- NULL,
- NULL }
-};
-
-static EPopupActionEntry mail_popup_entries[] = {
-
- { "mail-popup-account-disable",
- NULL,
- "mail-account-disable" },
-
- { "mail-popup-empty-trash",
- NULL,
- "mail-empty-trash" },
-
- { "mail-popup-flush-outbox",
- NULL,
- "mail-flush-outbox" },
-
- { "mail-popup-folder-copy",
- NULL,
- "mail-folder-copy" },
-
- { "mail-popup-folder-delete",
- NULL,
- "mail-folder-delete" },
-
- { "mail-popup-folder-move",
- NULL,
- "mail-folder-move" },
-
- { "mail-popup-folder-new",
- N_("_New Folder..."),
- "mail-folder-new" },
-
- { "mail-popup-folder-properties",
- NULL,
- "mail-folder-properties" },
-
- { "mail-popup-folder-refresh",
- NULL,
- "mail-folder-refresh" },
-
- { "mail-popup-folder-rename",
- NULL,
- "mail-folder-rename" }
-};
-
-static GtkToggleActionEntry mail_toggle_entries[] = {
-
- { "mail-hide-deleted",
- NULL,
- N_("Hide _Deleted Messages"),
- NULL,
- N_("Hide deleted messages rather than displaying "
- "them with a line through them"),
- G_CALLBACK (action_mail_hide_deleted_cb),
- TRUE },
-
- { "mail-preview",
- NULL,
- N_("Show Message _Preview"),
- "<Control>m",
- N_("Show message preview pane"),
- NULL, /* Handled by property bindings */
- TRUE },
-
- { "mail-threads-group-by",
- NULL,
- N_("_Group By Threads"),
- "<Control>t",
- N_("Threaded message list"),
- G_CALLBACK (action_mail_threads_group_by_cb),
- FALSE }
-};
-
-static GtkRadioActionEntry mail_view_entries[] = {
-
- /* This action represents the initial active mail view.
- * It should not be visible in the UI, nor should it be
- * possible to switch to it from another shell view. */
- { "mail-view-internal",
- NULL,
- NULL,
- NULL,
- NULL,
- -1 },
-
- { "mail-view-classic",
- NULL,
- N_("_Classic View"),
- NULL,
- N_("Show message preview below the message list"),
- 0 },
-
- { "mail-view-vertical",
- NULL,
- N_("_Vertical View"),
- NULL,
- N_("Show message preview alongside the message list"),
- 1 }
-};
-
-static GtkRadioActionEntry mail_filter_entries[] = {
-
- { "mail-filter-all-messages",
- NULL,
- N_("All Messages"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_ALL_MESSAGES },
-
- { "mail-filter-important-messages",
- "emblem-important",
- N_("Important Messages"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_IMPORTANT_MESSAGES },
-
- { "mail-filter-last-5-days-messages",
- NULL,
- N_("Last 5 Days' Messages"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_LAST_5_DAYS_MESSAGES },
-
- { "mail-filter-messages-not-junk",
- "mail-mark-notjunk",
- N_("Messages Not Junk"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_MESSAGES_NOT_JUNK },
-
- { "mail-filter-messages-with-attachments",
- "mail-attachment",
- N_("Messages with Attachments"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_MESSAGES_WITH_ATTACHMENTS },
-
- { "mail-filter-no-label",
- NULL,
- N_("No Label"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_NO_LABEL },
-
- { "mail-filter-read-messages",
- "mail-read",
- N_("Read Messages"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_READ_MESSAGES },
-
- { "mail-filter-recent-messages",
- NULL,
- N_("Recent Messages"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_RECENT_MESSAGES },
-
- { "mail-filter-unread-messages",
- "mail-unread",
- N_("Unread Messages"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_FILTER_UNREAD_MESSAGES }
-};
-
-static GtkRadioActionEntry mail_search_entries[] = {
-
- { "mail-search-body-contains",
- NULL,
- N_("Body contains"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SEARCH_BODY_CONTAINS },
-
- { "mail-search-message-contains",
- NULL,
- N_("Message contains"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SEARCH_MESSAGE_CONTAINS },
-
- { "mail-search-recipients-contain",
- NULL,
- N_("Recipients contain"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SEARCH_RECIPIENTS_CONTAIN },
-
- { "mail-search-sender-contains",
- NULL,
- N_("Sender contains"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SEARCH_SENDER_CONTAINS },
-
- { "mail-search-subject-contains",
- NULL,
- N_("Subject contains"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SEARCH_SUBJECT_CONTAINS },
-
- { "mail-search-subject-or-recipients-contains",
- NULL,
- N_("Subject or Recipients contains"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SEARCH_SUBJECT_OR_RECIPIENTS_CONTAINS },
-
- { "mail-search-subject-or-sender-contains",
- NULL,
- N_("Subject or Sender contains"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SEARCH_SUBJECT_OR_SENDER_CONTAINS }
-};
-
-static GtkRadioActionEntry mail_scope_entries[] = {
-
- { "mail-scope-all-accounts",
- NULL,
- N_("All Accounts"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SCOPE_ALL_ACCOUNTS },
-
- { "mail-scope-current-account",
- NULL,
- N_("Current Account"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SCOPE_CURRENT_ACCOUNT },
-
- { "mail-scope-current-folder",
- NULL,
- N_("Current Folder"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- MAIL_SCOPE_CURRENT_FOLDER }
-};
-
-void
-e_mail_shell_view_actions_init (EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellWindow *shell_window;
- EShellContent *shell_content;
- GtkActionGroup *action_group;
- GtkRadioAction *radio_action;
- GConfBridge *bridge;
- GObject *object;
- GObject *src_object;
- GObject *dst_object;
- const gchar *key;
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- shell_content = e_shell_view_get_shell_content (shell_view);
-
- /* Mail Actions */
- action_group = ACTION_GROUP (MAIL);
- gtk_action_group_add_actions (
- action_group, mail_entries,
- G_N_ELEMENTS (mail_entries), mail_shell_view);
- e_action_group_add_popup_actions (
- action_group, mail_popup_entries,
- G_N_ELEMENTS (mail_popup_entries));
- gtk_action_group_add_toggle_actions (
- action_group, mail_toggle_entries,
- G_N_ELEMENTS (mail_toggle_entries), mail_shell_view);
- gtk_action_group_add_radio_actions (
- action_group, mail_view_entries,
- G_N_ELEMENTS (mail_view_entries), -1,
- G_CALLBACK (action_mail_view_cb), mail_shell_view);
- gtk_action_group_add_radio_actions (
- action_group, mail_search_entries,
- G_N_ELEMENTS (mail_search_entries),
- MAIL_SEARCH_SUBJECT_OR_SENDER_CONTAINS,
- G_CALLBACK (action_mail_search_cb), mail_shell_view);
- gtk_action_group_add_radio_actions (
- action_group, mail_scope_entries,
- G_N_ELEMENTS (mail_scope_entries),
- MAIL_SCOPE_CURRENT_FOLDER,
- G_CALLBACK (action_search_scope_cb), mail_shell_view);
-
- radio_action = GTK_RADIO_ACTION (ACTION (MAIL_SCOPE_ALL_ACCOUNTS));
- e_shell_content_set_scope_action (shell_content, radio_action);
- e_shell_content_set_scope_visible (shell_content, TRUE);
-
- /* Bind GObject properties for GConf keys. */
-
- bridge = gconf_bridge_get ();
-
- object = G_OBJECT (ACTION (MAIL_PREVIEW));
- key = "/apps/evolution/mail/display/show_preview";
- gconf_bridge_bind_property (bridge, key, object, "active");
-
- object = G_OBJECT (ACTION (MAIL_THREADS_GROUP_BY));
- key = "/apps/evolution/mail/display/thread_list";
- gconf_bridge_bind_property (bridge, key, object, "active");
-
- object = G_OBJECT (ACTION (MAIL_VIEW_VERTICAL));
- key = "/apps/evolution/mail/display/layout";
- gconf_bridge_bind_property (bridge, key, object, "current-value");
-
- /* Fine tuning. */
-
- src_object = G_OBJECT (ACTION (MAIL_THREADS_GROUP_BY));
-
- dst_object = G_OBJECT (ACTION (MAIL_FOLDER_SELECT_THREAD));
- e_binding_new (src_object, "active", dst_object, "sensitive");
-
- dst_object = G_OBJECT (ACTION (MAIL_FOLDER_SELECT_SUBTHREAD));
- e_binding_new (src_object, "active", dst_object, "sensitive");
-
- dst_object = G_OBJECT (ACTION (MAIL_THREADS_COLLAPSE_ALL));
- e_binding_new (src_object, "active", dst_object, "sensitive");
-
- dst_object = G_OBJECT (ACTION (MAIL_THREADS_EXPAND_ALL));
- e_binding_new (src_object, "active", dst_object, "sensitive");
-
- e_mutual_binding_new (
- G_OBJECT (ACTION (MAIL_PREVIEW)), "active",
- G_OBJECT (shell_content), "preview-visible");
-
- /* XXX The boolean sense of the GConf key is the inverse of
- * the menu item, so we have to maintain two properties. */
- e_mutual_binding_new_with_negation (
- G_OBJECT (shell_content), "show-deleted",
- G_OBJECT (ACTION (MAIL_HIDE_DELETED)), "active");
-
- g_signal_connect (
- ACTION (GAL_SAVE_CUSTOM_VIEW), "activate",
- G_CALLBACK (action_gal_save_custom_view_cb), mail_shell_view);
-
- g_signal_connect (
- ACTION (SEARCH_EXECUTE), "activate",
- G_CALLBACK (action_search_execute_cb), mail_shell_view);
-}
-
-/* Helper for e_mail_shell_view_update_popup_labels() */
-static void
-mail_shell_view_update_label_action (GtkToggleAction *action,
- MessageList *message_list,
- GPtrArray *uids,
- const gchar *label_tag)
-{
- CamelFolder *folder;
- gboolean exists = FALSE;
- gboolean not_exists = FALSE;
- gboolean sensitive;
- guint ii;
-
- folder = message_list->folder;
-
- /* Figure out the proper label action state for the selected
- * messages. If all the selected messages have the given label,
- * make the toggle action active. If all the selected message
- * DO NOT have the given label, make the toggle action inactive.
- * If some do and some don't, make the action insensitive. */
-
- for (ii = 0; ii < uids->len && (!exists || !not_exists); ii++) {
- const gchar *old_label;
- gchar *new_label;
-
- /* Check for new-style labels. */
- if (camel_folder_get_message_user_flag (
- folder, uids->pdata[ii], label_tag)) {
- exists = TRUE;
- continue;
- }
-
- /* Check for old-style labels. */
- old_label = camel_folder_get_message_user_tag (
- folder, uids->pdata[ii], "label");
- if (old_label == NULL) {
- not_exists = TRUE;
- continue;
- }
-
- /* Convert old-style labels ("<name>") to "$Label<name>". */
- new_label = g_alloca (strlen (old_label) + 10);
- g_stpcpy (g_stpcpy (new_label, "$Label"), old_label);
-
- if (strcmp (new_label, label_tag) == 0)
- exists = TRUE;
- else
- not_exists = TRUE;
- }
-
- sensitive = !(exists && not_exists);
- gtk_toggle_action_set_active (action, exists);
- gtk_action_set_sensitive (GTK_ACTION (action), sensitive);
-}
-
-void
-e_mail_shell_view_update_popup_labels (EMailShellView *mail_shell_view)
-{
- EShell *shell;
- EShellSettings *shell_settings;
- EShellWindow *shell_window;
- EShellView *shell_view;
- EMailReader *reader;
- MessageList *message_list;
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GtkTreeModel *tree_model;
- GtkTreeIter iter;
- GPtrArray *uids;
- const gchar *path;
- gboolean valid;
- guint merge_id;
- gint ii = 0;
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- ui_manager = e_shell_window_get_ui_manager (shell_window);
-
- shell = e_shell_window_get_shell (shell_window);
- shell_settings = e_shell_get_shell_settings (shell);
-
- tree_model = e_shell_settings_get_object (
- shell_settings, "mail-label-list-store");
-
- action_group = ACTION_GROUP (MAIL_LABEL);
- merge_id = mail_shell_view->priv->label_merge_id;
- path = "/mail-message-popup/mail-label-menu/mail-label-actions";
-
- /* Unmerge the previous menu items. */
- gtk_ui_manager_remove_ui (ui_manager, merge_id);
- e_action_group_remove_all_actions (action_group);
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- uids = message_list_get_selected (message_list);
-
- valid = gtk_tree_model_get_iter_first (tree_model, &iter);
-
- while (valid) {
- GtkToggleAction *toggle_action;
- GtkAction *action;
- gchar *action_name;
- gchar *stock_id;
- gchar *label;
- gchar *tag;
-
- label = e_mail_label_list_store_get_name (
- E_MAIL_LABEL_LIST_STORE (tree_model), &iter);
- stock_id = e_mail_label_list_store_get_stock_id (
- E_MAIL_LABEL_LIST_STORE (tree_model), &iter);
- tag = e_mail_label_list_store_get_tag (
- E_MAIL_LABEL_LIST_STORE (tree_model), &iter);
- action_name = g_strdup_printf ("mail-label-%d", ii);
-
- /* XXX Add a tooltip! */
- toggle_action = gtk_toggle_action_new (
- action_name, label, NULL, stock_id);
-
- g_object_set_data_full (
- G_OBJECT (toggle_action), "tag",
- tag, (GDestroyNotify) g_free);
-
- /* Configure the action before we connect to signals. */
- mail_shell_view_update_label_action (
- toggle_action, message_list, uids, tag);
-
- g_signal_connect (
- toggle_action, "toggled",
- G_CALLBACK (action_mail_label_cb), mail_shell_view);
-
- /* The action group takes ownership of the action. */
- action = GTK_ACTION (toggle_action);
- gtk_action_group_add_action (action_group, action);
- g_object_unref (toggle_action);
-
- gtk_ui_manager_add_ui (
- ui_manager, merge_id, path, action_name,
- action_name, GTK_UI_MANAGER_AUTO, FALSE);
-
- g_free (label);
- g_free (stock_id);
- g_free (action_name);
-
- valid = gtk_tree_model_iter_next (tree_model, &iter);
- ii++;
- }
-
- message_list_free_uids (message_list, uids);
-
- g_object_unref (tree_model);
-}
-
-void
-e_mail_shell_view_update_search_filter (EMailShellView *mail_shell_view)
-{
- EShell *shell;
- EShellContent *shell_content;
- EShellSettings *shell_settings;
- EShellWindow *shell_window;
- EShellView *shell_view;
- GtkActionGroup *action_group;
- GtkRadioAction *radio_action;
- GtkTreeModel *tree_model;
- GtkTreeIter iter;
- GList *list;
- GSList *group;
- gboolean valid;
- gint ii = 0;
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_content = e_shell_view_get_shell_content (shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- shell = e_shell_window_get_shell (shell_window);
- shell_settings = e_shell_get_shell_settings (shell);
-
- tree_model = e_shell_settings_get_object (
- shell_settings, "mail-label-list-store");
-
- action_group = ACTION_GROUP (MAIL_FILTER);
- e_action_group_remove_all_actions (action_group);
-
- /* Add the standard filter actions. */
- gtk_action_group_add_radio_actions (
- action_group, mail_filter_entries,
- G_N_ELEMENTS (mail_filter_entries),
- MAIL_FILTER_ALL_MESSAGES,
- G_CALLBACK (action_search_filter_cb),
- mail_shell_view);
-
- /* Retrieve the radio group from an action we just added. */
- list = gtk_action_group_list_actions (action_group);
- radio_action = GTK_RADIO_ACTION (list->data);
- group = gtk_radio_action_get_group (radio_action);
- g_list_free (list);
-
- valid = gtk_tree_model_get_iter_first (tree_model, &iter);
-
- while (valid) {
- GtkAction *action;
- gchar *action_name;
- gchar *stock_id;
- gchar *label;
-
- label = e_mail_label_list_store_get_name (
- E_MAIL_LABEL_LIST_STORE (tree_model), &iter);
- stock_id = e_mail_label_list_store_get_stock_id (
- E_MAIL_LABEL_LIST_STORE (tree_model), &iter);
-
- action_name = g_strdup_printf ("mail-filter-label-%d", ii);
- radio_action = gtk_radio_action_new (
- action_name, label, NULL, stock_id, ii);
- g_free (action_name);
-
- gtk_radio_action_set_group (radio_action, group);
- group = gtk_radio_action_get_group (radio_action);
-
- /* The action group takes ownership of the action. */
- action = GTK_ACTION (radio_action);
- gtk_action_group_add_action (action_group, action);
- g_object_unref (radio_action);
-
- g_free (label);
- g_free (stock_id);
-
- valid = gtk_tree_model_iter_next (tree_model, &iter);
- ii++;
- }
-
- /* Use any action in the group; doesn't matter which. */
- e_shell_content_set_filter_action (shell_content, radio_action);
-
- ii = MAIL_FILTER_UNREAD_MESSAGES;
- e_shell_content_add_filter_separator_after (shell_content, ii);
-
- ii = MAIL_FILTER_READ_MESSAGES;
- e_shell_content_add_filter_separator_before (shell_content, ii);
-
- g_object_unref (tree_model);
-}
diff --git a/mail/e-mail-shell-view-actions.h b/mail/e-mail-shell-view-actions.h
deleted file mode 100644
index 2a05582df8..0000000000
--- a/mail/e-mail-shell-view-actions.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * e-mail-shell-view-actions.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_MAIL_SHELL_VIEW_ACTIONS_H
-#define E_MAIL_SHELL_VIEW_ACTIONS_H
-
-#include <shell/e-shell-window-actions.h>
-
-/* Mail Actions */
-#define E_SHELL_WINDOW_ACTION_MAIL_ACCOUNT_DISABLE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-account-disable")
-#define E_SHELL_WINDOW_ACTION_MAIL_ADD_SENDER(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-add-sender")
-#define E_SHELL_WINDOW_ACTION_MAIL_CARET_MODE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-caret-mode")
-#define E_SHELL_WINDOW_ACTION_MAIL_CHECK_FOR_JUNK(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-check-for-junk")
-#define E_SHELL_WINDOW_ACTION_MAIL_CLIPBOARD_COPY(window) \
- E_SHELL_WINDOw_ACTION ((window), "mail-clipboard-copy")
-#define E_SHELL_WINDOW_ACTION_MAIL_COPY(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-copy")
-#define E_SHELL_WINDOW_ACTION_MAIL_CREATE_SEARCH_FOLDER(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-create-search-folder")
-#define E_SHELL_WINDOW_ACTION_MAIL_DELETE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-delete")
-#define E_SHELL_WINDOW_ACTION_MAIL_DOWNLOAD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-download")
-#define E_SHELL_WINDOW_ACTION_MAIL_EMPTY_TRASH(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-empty-trash")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_ON_MAILING_LIST(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-on-mailing-list")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_ON_RECIPIENTS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-on-recipients")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_ON_SENDER(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-on-sender")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_ON_SUBJECT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-on-subject")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTERS_APPLY(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filters-apply")
-#define E_SHELL_WINDOW_ACTION_MAIL_FIND(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-find")
-#define E_SHELL_WINDOW_ACTION_MAIL_FLAG_CLEAR(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-flag-clear")
-#define E_SHELL_WINDOW_ACTION_MAIL_FLAG_COMPLETED(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-flag-completed")
-#define E_SHELL_WINDOW_ACTION_MAIL_FLAG_FOR_FOLLOWUP(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-flag-for-followup")
-#define E_SHELL_WINDOW_ACTION_MAIL_FLUSH_OUTBOX(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-flush-outbox")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_COPY(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-copy")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_DELETE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-delete")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_EXPUNGE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-expunge")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_MARK_ALL_READ(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-mark-all-read")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_MOVE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-move")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_NEW(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-new")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_PROPERTIES(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-properties")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_REFRESH(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-refresh")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_RENAME(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-rename")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_SELECT_ALL(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-select-all")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_SELECT_THREAD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-select-thread")
-#define E_SHELL_WINDOW_ACTION_MAIL_FOLDER_SELECT_SUBTHREAD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-folder-select-subthread")
-#define E_SHELL_WINDOW_ACTION_MAIL_FORWARD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-forward")
-#define E_SHELL_WINDOW_ACTION_MAIL_FORWARD_ATTACHED(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-forward-attached")
-#define E_SHELL_WINDOW_ACTION_MAIL_FORWARD_INLINE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-forward-inline")
-#define E_SHELL_WINDOW_ACTION_MAIL_FORWARD_QUOTED(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-forward-quoted")
-#define E_SHELL_WINDOW_ACTION_MAIL_HIDE_DELETED(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-hide-deleted")
-#define E_SHELL_WINDOW_ACTION_MAIL_HIDE_READ(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-hide-read")
-#define E_SHELL_WINDOW_ACTION_MAIL_HIDE_SELECTED(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-hide-selected")
-#define E_SHELL_WINDOW_ACTION_MAIL_LABEL_NEW(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-label-new")
-#define E_SHELL_WINDOW_ACTION_MAIL_LABEL_NONE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-label-none")
-#define E_SHELL_WINDOW_ACTION_MAIL_LOAD_IMAGES(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-load-images")
-#define E_SHELL_WINDOW_ACTION_MAIL_MARK_IMPORTANT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-mark-important")
-#define E_SHELL_WINDOW_ACTION_MAIL_MARK_JUNK(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-mark-junk")
-#define E_SHELL_WINDOW_ACTION_MAIL_MARK_NOTJUNK(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-mark-notjunk")
-#define E_SHELL_WINDOW_ACTION_MAIL_MARK_READ(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-mark-read")
-#define E_SHELL_WINDOW_ACTION_MAIL_MARK_UNIMPORTANT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-mark-unimportant")
-#define E_SHELL_WINDOW_ACTION_MAIL_MARK_UNREAD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-mark-unread")
-#define E_SHELL_WINDOW_ACTION_MAIL_MESSAGE_EDIT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-message-edit")
-#define E_SHELL_WINDOW_ACTION_MAIL_MESSAGE_NEW(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-message-new")
-#define E_SHELL_WINDOW_ACTION_MAIL_MESSAGE_OPEN(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-message-open")
-#define E_SHELL_WINDOW_ACTION_MAIL_MOVE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-move")
-#define E_SHELL_WINDOW_ACTION_MAIL_NEXT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-next")
-#define E_SHELL_WINDOW_ACTION_MAIL_NEXT_IMPORTANT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-next-important")
-#define E_SHELL_WINDOW_ACTION_MAIL_NEXT_THREAD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-next-thread")
-#define E_SHELL_WINDOW_ACTION_MAIL_NEXT_UNREAD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-next-unread")
-#define E_SHELL_WINDOW_ACTION_MAIL_PREVIEW(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-preview")
-#define E_SHELL_WINDOW_ACTION_MAIL_PREVIOUS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-previous")
-#define E_SHELL_WINDOW_ACTION_MAIL_PREVIOUS_IMPORTANT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-previous-important")
-#define E_SHELL_WINDOW_ACTION_MAIL_PREVIOUS_UNREAD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-previous-unread")
-#define E_SHELL_WINDOW_ACTION_MAIL_PRINT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-print")
-#define E_SHELL_WINDOW_ACTION_MAIL_PRINT_PREVIEW(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-print-preview")
-#define E_SHELL_WINDOW_ACTION_MAIL_REDIRECT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-redirect")
-#define E_SHELL_WINDOW_ACTION_MAIL_REPLY_ALL(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-reply-all")
-#define E_SHELL_WINDOW_ACTION_MAIL_REPLY_LIST(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-reply-list")
-#define E_SHELL_WINDOW_ACTION_MAIL_REPLY_SENDER(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-reply-sender")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_FOLDER_FROM_MAILING_LIST(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-folder-from-mailing-list")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_FOLDER_FROM_RECIPIENTS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-folder-from-recipients")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_FOLDER_FROM_SENDER(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-folder-from-sender")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_FOLDER_FROM_SUBJECT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-folder-from-subject")
-#define E_SHELL_WINDOW_ACTION_MAIL_SELECT_ALL(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-select-all")
-#define E_SHELL_WINDOW_ACTION_MAIL_SHOW_ALL_HEADERS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-show-all-headers")
-#define E_SHELL_WINDOW_ACTION_MAIL_SHOW_HIDDEN(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-show-hidden")
-#define E_SHELL_WINDOW_ACTION_MAIL_SHOW_SOURCE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-show-source")
-#define E_SHELL_WINDOW_ACTION_MAIL_SMART_BACKWARD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-smart-backward")
-#define E_SHELL_WINDOW_ACTION_MAIL_SMART_FORWARD(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-smart-forward")
-#define E_SHELL_WINDOW_ACTION_MAIL_STOP(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-stop")
-#define E_SHELL_WINDOW_ACTION_MAIL_THREADS_COLLAPSE_ALL(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-threads-collapse-all")
-#define E_SHELL_WINDOW_ACTION_MAIL_THREADS_EXPAND_ALL(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-threads-expand-all")
-#define E_SHELL_WINDOW_ACTION_MAIL_THREADS_GROUP_BY(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-threads-group-by")
-#define E_SHELL_WINDOW_ACTION_MAIL_TOOLS_FILTERS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-tools-filters")
-#define E_SHELL_WINDOW_ACTION_MAIL_TOOLS_SEARCH_FOLDERS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-tools-search-folders")
-#define E_SHELL_WINDOW_ACTION_MAIL_TOOLS_SUBSCRIPTIONS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-tools-subscriptions")
-#define E_SHELL_WINDOW_ACTION_MAIL_UNDELETE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-undelete")
-#define E_SHELL_WINDOW_ACTION_MAIL_VIEW_CLASSIC(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-view-classic")
-#define E_SHELL_WINDOW_ACTION_MAIL_VIEW_VERTICAL(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-view-vertical")
-#define E_SHELL_WINDOW_ACTION_MAIL_ZOOM_100(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-zoom-100")
-#define E_SHELL_WINDOW_ACTION_MAIL_ZOOM_IN(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-zoom-in")
-#define E_SHELL_WINDOW_ACTION_MAIL_ZOOM_OUT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-zoom-out")
-
-/* Mail Query Actions */
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_ALL_MESSAGES(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-all-messages")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_IMPORTANT_MESSAGES(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-important-messages")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_LAST_5_DAYS_MESSAGES(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-last-5-days-messages")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_MESSAGES_NOT_JUNK(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-messages-not-junk")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_MESSAGES_WITH_ATTACHMENTS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-messages-with-attachments")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_NO_LABEL(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-no-label")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_READ_MESSAGES(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-read-messages")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_RECENT_MESSAGES(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-recent-messages")
-#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_UNREAD_MESSAGES(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-filter-unread-messages")
-#define E_SHELL_WINDOW_ACTION_MAIL_SCOPE_ALL_ACCOUNTS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-scope-all-accounts")
-#define E_SHELL_WINDOW_ACTION_MAIL_SCOPE_CURRENT_ACCOUNT(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-scope-current-account")
-#define E_SHELL_WINDOW_ACTION_MAIL_SCOPE_CURRENT_FOLDER(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-scope-current-folder")
-#define E_SHELL_WINDOW_ACTION_MAIL_SCOPE_CURRENT_MESSAGE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-scope-current-message")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_BODY_CONTAINS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-body-contains")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_MESSAGE_CONTAINS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-message-contains")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_RECIPIENTS_CONTAIN(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-recipients-contain")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_SENDER_CONTAINS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-sender-contains")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_SUBJECT_CONTAINS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-subject-contains")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_SUBJECT_OR_RECIPIENTS_CONTAINS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-subject-or-recipients-contains")
-#define E_SHELL_WINDOW_ACTION_MAIL_SEARCH_SUBJECT_OR_SENDER_CONTAINS(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-search-subject-or-sender-contains")
-
-/* Action Groups */
-#define E_SHELL_WINDOW_ACTION_GROUP_MAIL(window) \
- E_SHELL_WINDOW_ACTION_GROUP ((window), "mail")
-#define E_SHELL_WINDOW_ACTION_GROUP_MAIL_FILTER(window) \
- E_SHELL_WINDOW_ACTION_GROUP ((window), "mail-filter")
-#define E_SHELL_WINDOW_ACTION_GROUP_MAIL_LABEL(window) \
- E_SHELL_WINDOW_ACTION_GROUP ((window), "mail-label")
-
-#endif /* E_MAIL_SHELL_VIEW_ACTIONS_H */
diff --git a/mail/e-mail-shell-view-private.c b/mail/e-mail-shell-view-private.c
deleted file mode 100644
index f3b3b5a513..0000000000
--- a/mail/e-mail-shell-view-private.c
+++ /dev/null
@@ -1,905 +0,0 @@
-/*
- * e-mail-shell-view-private.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-view-private.h"
-
-#include "widgets/menus/gal-view-factory-etable.h"
-
-static void
-mail_shell_view_folder_tree_selected_cb (EMailShellView *mail_shell_view,
- const gchar *full_name,
- const gchar *uri,
- guint32 flags,
- EMFolderTree *folder_tree)
-{
- EShellView *shell_view;
- EMailReader *reader;
- gboolean folder_selected;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
-
- folder_selected =
- !(flags & CAMEL_FOLDER_NOSELECT) &&
- full_name != NULL;
-
- if (folder_selected)
- e_mail_reader_set_folder_uri (reader, uri);
- else
- e_mail_reader_set_folder (reader, NULL, NULL);
-
- e_shell_view_update_actions (shell_view);
-}
-
-static void
-mail_shell_view_folder_tree_popup_event_cb (EShellView *shell_view,
- GdkEventButton *event)
-{
- const gchar *widget_path;
-
- widget_path = "/mail-folder-popup";
- e_shell_view_show_popup_menu (shell_view, widget_path, event);
-}
-
-static gboolean
-mail_shell_view_key_press_event_cb (EMailShellView *mail_shell_view,
- GdkEventKey *event)
-{
- EShellView *shell_view;
- EShellWindow *shell_window;
- GtkAction *action;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- if ((event->state & GDK_CONTROL_MASK) != 0)
- return FALSE;
-
- switch (event->keyval) {
- case GDK_space:
- action = ACTION (MAIL_SMART_FORWARD);
- break;
-
- case GDK_BackSpace:
- action = ACTION (MAIL_SMART_BACKWARD);
- break;
-
- default:
- return FALSE;
- }
-
- gtk_action_activate (action);
-
- return TRUE;
-}
-
-static gint
-mail_shell_view_message_list_key_press_cb (EMailShellView *mail_shell_view,
- gint row,
- ETreePath path,
- gint col,
- GdkEvent *event)
-{
- return mail_shell_view_key_press_event_cb (
- mail_shell_view, &event->key);
-}
-
-static gboolean
-mail_shell_view_message_list_right_click_cb (EShellView *shell_view,
- gint row,
- ETreePath path,
- gint col,
- GdkEventButton *event)
-{
- const gchar *widget_path;
-
- widget_path = "/mail-message-popup";
- e_shell_view_show_popup_menu (shell_view, widget_path, event);
-
- return TRUE;
-}
-
-static void
-mail_shell_view_reader_changed_cb (EMailShellView *mail_shell_view,
- EMailReader *reader)
-{
- EMailShellContent *mail_shell_content;
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- e_mail_shell_content_update_view_instance (mail_shell_content);
- e_mail_shell_view_update_sidebar (mail_shell_view);
-}
-
-static void
-mail_shell_view_reader_status_message_cb (EMailShellView *mail_shell_view,
- const gchar *status_message)
-{
- EShellView *shell_view;
- EShellTaskbar *shell_taskbar;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_taskbar = e_shell_view_get_shell_taskbar (shell_view);
-
- e_shell_taskbar_set_message (shell_taskbar, status_message);
-}
-
-static void
-mail_shell_view_load_view_collection (EShellViewClass *shell_view_class)
-{
- GalViewCollection *collection;
- GalViewFactory *factory;
- ETableSpecification *spec;
- const gchar *base_dir;
- gchar *filename;
-
- collection = shell_view_class->view_collection;
-
- base_dir = EVOLUTION_ETSPECDIR;
- spec = e_table_specification_new ();
- filename = g_build_filename (base_dir, ETSPEC_FILENAME, NULL);
- if (!e_table_specification_load_from_file (spec, filename))
- g_critical ("Unable to load ETable specification file "
- "for mail");
- g_free (filename);
-
- factory = gal_view_factory_etable_new (spec);
- gal_view_collection_add_factory (collection, factory);
- g_object_unref (factory);
- g_object_unref (spec);
-
- gal_view_collection_load (collection);
-}
-
-static void
-mail_shell_view_notify_view_id_cb (EMailShellView *mail_shell_view)
-{
- EMailShellContent *mail_shell_content;
- GalViewInstance *view_instance;
- const gchar *view_id;
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- view_instance = NULL; /* FIXME */
- view_id = e_shell_view_get_view_id (E_SHELL_VIEW (mail_shell_view));
-
- /* A NULL view ID implies we're in a custom view. But you can
- * only get to a custom view via the "Define Views" dialog, which
- * would have already modified the view instance appropriately.
- * Furthermore, there's no way to refer to a custom view by ID
- * anyway, since custom views have no IDs. */
- if (view_id == NULL)
- return;
-
- gal_view_instance_set_current_view_id (view_instance, view_id);
-}
-
-void
-e_mail_shell_view_private_init (EMailShellView *mail_shell_view,
- EShellViewClass *shell_view_class)
-{
- if (!gal_view_collection_loaded (shell_view_class->view_collection))
- mail_shell_view_load_view_collection (shell_view_class);
-
- g_signal_connect (
- mail_shell_view, "notify::view-id",
- G_CALLBACK (mail_shell_view_notify_view_id_cb), NULL);
-}
-
-void
-e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
-{
- EMailShellViewPrivate *priv = mail_shell_view->priv;
- EMailShellSidebar *mail_shell_sidebar;
- EShell *shell;
- EShellView *shell_view;
- EShellBackend *shell_backend;
- EShellContent *shell_content;
- EShellSettings *shell_settings;
- EShellSidebar *shell_sidebar;
- EShellWindow *shell_window;
- EMFormatHTMLDisplay *html_display;
- EMFolderTree *folder_tree;
- RuleContext *context;
- FilterRule *rule = NULL;
- GtkTreeModel *tree_model;
- GtkUIManager *ui_manager;
- MessageList *message_list;
- EMailReader *reader;
- GtkHTML *html;
- const gchar *source;
- guint merge_id;
- gint ii = 0;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_backend = e_shell_view_get_shell_backend (shell_view);
- shell_content = e_shell_view_get_shell_content (shell_view);
- shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- ui_manager = e_shell_window_get_ui_manager (shell_window);
-
- shell = e_shell_window_get_shell (shell_window);
- shell_settings = e_shell_get_shell_settings (shell);
-
- tree_model = e_shell_settings_get_object (
- shell_settings, "mail-label-list-store");
-
- e_shell_window_add_action_group (shell_window, "mail");
- e_shell_window_add_action_group (shell_window, "mail-filter");
- e_shell_window_add_action_group (shell_window, "mail-label");
-
- merge_id = gtk_ui_manager_new_merge_id (ui_manager);
- priv->label_merge_id = merge_id;
-
- /* Cache these to avoid lots of awkward casting. */
- priv->mail_shell_backend = g_object_ref (shell_backend);
- priv->mail_shell_content = g_object_ref (shell_content);
- priv->mail_shell_sidebar = g_object_ref (shell_sidebar);
-
- reader = E_MAIL_READER (shell_content);
- html_display = e_mail_reader_get_html_display (reader);
- message_list = e_mail_reader_get_message_list (reader);
-
- mail_shell_sidebar = E_MAIL_SHELL_SIDEBAR (shell_sidebar);
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
-
- html = EM_FORMAT_HTML (html_display)->html;
-
- g_signal_connect_swapped (
- folder_tree, "folder-selected",
- G_CALLBACK (mail_shell_view_folder_tree_selected_cb),
- mail_shell_view);
-
- g_signal_connect_swapped (
- folder_tree, "popup-event",
- G_CALLBACK (mail_shell_view_folder_tree_popup_event_cb),
- mail_shell_view);
-
- g_signal_connect_swapped (
- message_list->tree, "key-press",
- G_CALLBACK (mail_shell_view_message_list_key_press_cb),
- mail_shell_view);
-
- g_signal_connect_swapped (
- message_list->tree, "right-click",
- G_CALLBACK (mail_shell_view_message_list_right_click_cb),
- mail_shell_view);
-
- g_signal_connect_swapped (
- reader, "changed",
- G_CALLBACK (mail_shell_view_reader_changed_cb),
- mail_shell_view);
-
- /* Use the same callback as "changed". */
- g_signal_connect_swapped (
- reader, "folder-loaded",
- G_CALLBACK (mail_shell_view_reader_changed_cb),
- mail_shell_view);
-
- g_signal_connect_swapped (
- reader, "folder-loaded",
- G_CALLBACK (e_mail_shell_view_restore_state),
- mail_shell_view);
-
- g_signal_connect_swapped (
- tree_model, "row-changed",
- G_CALLBACK (e_mail_shell_view_update_search_filter),
- mail_shell_view);
-
- g_signal_connect_swapped (
- tree_model, "row-deleted",
- G_CALLBACK (e_mail_shell_view_update_search_filter),
- mail_shell_view);
-
- g_signal_connect_swapped (
- tree_model, "row-inserted",
- G_CALLBACK (e_mail_shell_view_update_search_filter),
- mail_shell_view);
-
- g_signal_connect_swapped (
- html, "key-press-event",
- G_CALLBACK (mail_shell_view_key_press_event_cb),
- mail_shell_view);
-
- g_signal_connect_swapped (
- html, "status-message",
- G_CALLBACK (mail_shell_view_reader_status_message_cb),
- mail_shell_view);
-
- e_mail_shell_view_actions_init (mail_shell_view);
- e_mail_shell_view_update_search_filter (mail_shell_view);
- e_mail_reader_init (reader);
-
- /* Populate built-in rules for search entry popup menu.
- * Keep the assertions, please. If the conditions aren't
- * met we're going to crash anyway, just more mysteriously. */
- context = e_shell_content_get_search_context (shell_content);
- source = FILTER_SOURCE_DEMAND;
- while ((rule = rule_context_next_rule (context, rule, source))) {
- g_assert (ii < MAIL_NUM_SEARCH_RULES);
- priv->search_rules[ii++] = g_object_ref (rule);
- }
- g_assert (ii == MAIL_NUM_SEARCH_RULES);
-}
-
-void
-e_mail_shell_view_private_dispose (EMailShellView *mail_shell_view)
-{
- EMailShellViewPrivate *priv = mail_shell_view->priv;
- gint ii;
-
- DISPOSE (priv->mail_shell_backend);
- DISPOSE (priv->mail_shell_content);
- DISPOSE (priv->mail_shell_sidebar);
-
- for (ii = 0; ii < MAIL_NUM_SEARCH_RULES; ii++)
- DISPOSE (priv->search_rules[ii]);
-}
-
-void
-e_mail_shell_view_private_finalize (EMailShellView *mail_shell_view)
-{
- /* XXX Nothing to do? */
-}
-
-void
-e_mail_shell_view_restore_state (EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellContent *shell_content;
- EMailReader *reader;
- MessageList *message_list;
- const gchar *folder_uri;
- gchar *group_name;
-
- /* XXX Move this to EMailShellContent. */
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_content = e_shell_view_get_shell_content (shell_view);
-
- reader = E_MAIL_READER (shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder_uri = message_list->folder_uri;
- g_return_if_fail (folder_uri != NULL);
-
- group_name = g_strdup_printf ("Folder %s", folder_uri);
- e_shell_content_restore_state (shell_content, group_name);
- g_free (group_name);
-}
-
-void
-e_mail_shell_view_execute_search (EMailShellView *mail_shell_view)
-{
- EShell *shell;
- EShellView *shell_view;
- EShellWindow *shell_window;
- EShellContent *shell_content;
- EShellSettings *shell_settings;
- EMFormatHTMLDisplay *html_display;
- EMailShellContent *mail_shell_content;
- MessageList *message_list;
- FilterRule *rule;
- EMailReader *reader;
- CamelFolder *folder;
- GtkAction *action;
- GtkTreeModel *model;
- GtkTreePath *path;
- GtkTreeIter tree_iter;
- GString *string;
- GList *iter;
- GSList *search_strings = NULL;
- const gchar *folder_uri;
- const gchar *text;
- gboolean valid;
- gchar *query;
- gchar *temp;
- gchar *tag;
- gint value;
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- shell_content = e_shell_view_get_shell_content (shell_view);
-
- shell = e_shell_window_get_shell (shell_window);
- shell_settings = e_shell_get_shell_settings (shell);
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
-
- reader = E_MAIL_READER (shell_content);
- html_display = e_mail_reader_get_html_display (reader);
- message_list = e_mail_reader_get_message_list (reader);
-
- folder_uri = message_list->folder_uri;
- folder = message_list->folder;
-
- /* This returns a new object reference. */
- model = e_shell_settings_get_object (
- shell_settings, "mail-label-list-store");
-
- text = e_shell_content_get_search_text (shell_content);
- if (text == NULL || *text == '\0') {
- query = g_strdup ("");
- goto filter;
- }
-
- /* Replace variables in the selected rule with the
- * current search text and extract a query string. */
-
- action = ACTION (MAIL_SEARCH_SUBJECT_OR_SENDER_CONTAINS);
- value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
- g_return_if_fail (value >= 0 && value < MAIL_NUM_SEARCH_RULES);
- rule = mail_shell_view->priv->search_rules[value];
-
- for (iter = rule->parts; iter != NULL; iter = iter->next) {
- FilterPart *part = iter->data;
- FilterElement *element = NULL;
-
- if (strcmp (part->name, "subject") == 0)
- element = filter_part_find_element (part, "subject");
- else if (strcmp (part->name, "body") == 0)
- element = filter_part_find_element (part, "word");
- else if (strcmp (part->name, "sender") == 0)
- element = filter_part_find_element (part, "sender");
- else if (strcmp (part->name, "to") == 0)
- element = filter_part_find_element (part, "recipient");
-
- if (strcmp (part->name, "body") == 0) {
- struct _camel_search_words *words;
- gint ii;
-
- words = camel_search_words_split ((guchar *) text);
- for (ii = 0; ii < words->len; ii++)
- search_strings = g_slist_prepend (
- search_strings, g_strdup (
- words->words[ii]->word));
- camel_search_words_free (words);
- }
-
- if (element != NULL) {
- FilterInput *input = FILTER_INPUT (element);
- filter_input_set_value (input, text);
- }
- }
-
- string = g_string_sized_new (1024);
- filter_rule_build_code (rule, string);
- query = g_string_free (string, FALSE);
-
-filter:
-
- /* Apply selected filter. */
-
- value = e_shell_content_get_filter_value (shell_content);
- switch (value) {
- case MAIL_FILTER_ALL_MESSAGES:
- break;
-
- case MAIL_FILTER_UNREAD_MESSAGES:
- temp = g_strdup_printf (
- "(and %s (match-all (not "
- "(system-flag \"Seen\"))))", query);
- g_free (query);
- query = temp;
- break;
-
- case MAIL_FILTER_NO_LABEL:
- string = g_string_sized_new (1024);
- g_string_append_printf (
- string, "(and %s (and ", query);
- valid = gtk_tree_model_get_iter_first (
- model, &tree_iter);
- while (valid) {
- tag = e_mail_label_list_store_get_tag (
- E_MAIL_LABEL_LIST_STORE (model),
- &tree_iter);
- g_string_append_printf (
- string, " (match-all (not (or "
- "(= (user-tag \"label\") \"%s\") "
- "(user-flag \"$Label%s\") "
- "(user-flag \"%s\"))))",
- tag, tag, tag);
- g_free (tag);
-
- valid = gtk_tree_model_iter_next (
- model, &tree_iter);
- }
- g_string_append_len (string, "))", 2);
- g_free (query);
- query = g_string_free (string, FALSE);
- break;
-
- case MAIL_FILTER_READ_MESSAGES:
- temp = g_strdup_printf (
- "(and %s (match-all "
- "(system-flag \"Seen\")))", query);
- g_free (query);
- query = temp;
- break;
-
- case MAIL_FILTER_RECENT_MESSAGES:
- if (em_utils_folder_is_sent (folder, folder_uri))
- temp = g_strdup_printf (
- "(and %s (match-all "
- "(> (get-sent-date) "
- "(- (get-current-date) 86400))))",
- query);
- else
- temp = g_strdup_printf (
- "(and %s (match-all "
- "(> (get-received-date) "
- "(- (get-current-date) 86400))))",
- query);
- g_free (query);
- query = temp;
- break;
-
- case MAIL_FILTER_LAST_5_DAYS_MESSAGES:
- if (em_utils_folder_is_sent (folder, folder_uri))
- temp = g_strdup_printf (
- "(and %s (match-all "
- "(> (get-sent-date) "
- "(- (get-current-date) 432000))))",
- query);
- else
- temp = g_strdup_printf (
- "(and %s (match-all "
- "(> (get-received-date) "
- "(- (get-current-date) 432000))))",
- query);
- g_free (query);
- query = temp;
- break;
-
- case MAIL_FILTER_MESSAGES_WITH_ATTACHMENTS:
- temp = g_strdup_printf (
- "(and %s (match-all "
- "(system-flag \"Attachments\")))", query);
- g_free (query);
- query = temp;
- break;
-
- case MAIL_FILTER_IMPORTANT_MESSAGES:
- temp = g_strdup_printf (
- "(and %s (match-all "
- "(system-flag \"Flagged\")))", query);
- g_free (query);
- query = temp;
- break;
-
- case MAIL_FILTER_MESSAGES_NOT_JUNK:
- temp = g_strdup_printf (
- "(and %s (match-all (not "
- "(system-flag \"junk\"))))", query);
- g_free (query);
- query = temp;
- break;
-
- default:
- /* The action value also serves as a path for
- * the label list store. That's why we number
- * the label actions from zero. */
- path = gtk_tree_path_new_from_indices (value, -1);
- gtk_tree_model_get_iter (model, &tree_iter, path);
- gtk_tree_path_free (path);
-
- tag = e_mail_label_list_store_get_tag (
- E_MAIL_LABEL_LIST_STORE (model), &tree_iter);
- temp = g_strdup_printf (
- "(and %s (match-all (or "
- "(= (user-tag \"label\") \"%s\") "
- "(user-flag \"$Label%s\") "
- "(user-flag \"%s\"))))",
- query, tag, tag, tag);
- g_free (tag);
-
- g_free (query);
- query = temp;
- break;
- }
-
- message_list_set_search (message_list, query);
-
- e_mail_shell_content_set_search_strings (
- mail_shell_content, search_strings);
-
- g_slist_foreach (search_strings, (GFunc) g_free, NULL);
- g_slist_free (search_strings);
-
- g_object_unref (model);
- g_free (query);
-}
-
-/* Helper for e_mail_shell_view_create_filter_from_selected() */
-static void
-mail_shell_view_create_filter_cb (CamelFolder *folder,
- const gchar *uid,
- CamelMimeMessage *message,
- gpointer user_data)
-{
- struct {
- const gchar *source;
- gint type;
- } *filter_data = user_data;
-
- if (message != NULL)
- filter_gui_add_from_message (
- message, filter_data->source, filter_data->type);
-
- g_free (filter_data);
-}
-
-void
-e_mail_shell_view_create_filter_from_selected (EMailShellView *mail_shell_view,
- gint filter_type)
-{
- EMailReader *reader;
- MessageList *message_list;
- CamelFolder *folder;
- const gchar *filter_source;
- const gchar *folder_uri;
- GPtrArray *uids;
-
- struct {
- const gchar *source;
- gint type;
- } *filter_data;
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder_uri = message_list->folder_uri;
- folder = message_list->folder;
-
- if (em_utils_folder_is_sent (folder, folder_uri))
- filter_source = FILTER_SOURCE_OUTGOING;
- else if (em_utils_folder_is_outbox (folder, folder_uri))
- filter_source = FILTER_SOURCE_OUTGOING;
- else
- filter_source = FILTER_SOURCE_INCOMING;
-
- uids = message_list_get_selected (message_list);
-
- if (uids->len == 1) {
- filter_data = g_malloc (sizeof (*filter_data));
- filter_data->source = filter_source;
- filter_data->type = filter_type;
-
- mail_get_message (
- folder, uids->pdata[0],
- mail_shell_view_create_filter_cb,
- filter_data, mail_msg_unordered_push);
- }
-
- em_utils_uids_free (uids);
-}
-
-/* Helper for e_mail_shell_view_create_vfolder_from_selected() */
-static void
-mail_shell_view_create_vfolder_cb (CamelFolder *folder,
- const gchar *uid,
- CamelMimeMessage *message,
- gpointer user_data)
-{
- struct {
- gchar *uri;
- gint type;
- } *vfolder_data = user_data;
-
- if (message != NULL)
- vfolder_gui_add_from_message (
- message, vfolder_data->type, vfolder_data->uri);
-
- g_free (vfolder_data->uri);
- g_free (vfolder_data);
-}
-
-void
-e_mail_shell_view_create_vfolder_from_selected (EMailShellView *mail_shell_view,
- gint vfolder_type)
-{
- EMailReader *reader;
- MessageList *message_list;
- CamelFolder *folder;
- const gchar *folder_uri;
- GPtrArray *uids;
-
- struct {
- gchar *uri;
- gint type;
- } *vfolder_data;
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- reader = E_MAIL_READER (mail_shell_view->priv->mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder_uri = message_list->folder_uri;
- folder = message_list->folder;
-
- uids = message_list_get_selected (message_list);
-
- if (uids->len == 1) {
- vfolder_data = g_malloc (sizeof (*vfolder_data));
- vfolder_data->uri = g_strdup (folder_uri);
- vfolder_data->type = vfolder_type;
-
- mail_get_message (
- folder, uids->pdata[0],
- mail_shell_view_create_vfolder_cb,
- vfolder_data, mail_msg_unordered_push);
- }
-
- em_utils_uids_free (uids);
-}
-
-void
-e_mail_shell_view_update_sidebar (EMailShellView *mail_shell_view)
-{
- EMailShellContent *mail_shell_content;
- EShellSidebar *shell_sidebar;
- EShellView *shell_view;
- EMailReader *reader;
- MessageList *message_list;
- CamelStore *local_store;
- CamelFolder *folder;
- GPtrArray *selected;
- GString *buffer;
- const gchar *display_name;
- const gchar *folder_uri;
- gchar *folder_name;
- gchar *title;
- guint32 num_deleted;
- guint32 num_junked;
- guint32 num_junked_not_deleted;
- guint32 num_unread;
- guint32 num_visible;
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
-
- reader = E_MAIL_READER (mail_shell_content);
- message_list = e_mail_reader_get_message_list (reader);
- folder_uri = message_list->folder_uri;
- folder = message_list->folder;
-
- local_store = e_mail_local_get_store ();
-
- /* If no folder is selected, reset the sidebar banners
- * to their default values and stop. */
- if (folder == NULL) {
- GtkAction *action;
- gchar *label;
-
- action = e_shell_view_get_action (shell_view);
-
- g_object_get (action, "label", &label, NULL);
- e_shell_sidebar_set_secondary_text (shell_sidebar, NULL);
- e_shell_view_set_title (shell_view, label);
- g_free (label);
-
- return;
- }
-
- camel_object_get (
- folder, NULL,
- CAMEL_FOLDER_NAME, &folder_name,
- CAMEL_FOLDER_DELETED, &num_deleted,
- CAMEL_FOLDER_JUNKED, &num_junked,
- CAMEL_FOLDER_JUNKED_NOT_DELETED, &num_junked_not_deleted,
- CAMEL_FOLDER_UNREAD, &num_unread,
- CAMEL_FOLDER_VISIBLE, &num_visible,
- NULL);
-
- buffer = g_string_sized_new (256);
- selected = message_list_get_selected (message_list);
-
- if (selected->len > 1)
- g_string_append_printf (
- buffer, ngettext ("%d selected, ", "%d selected, ",
- selected->len), selected->len);
-
- if (CAMEL_IS_VTRASH_FOLDER (folder)) {
- CamelVTrashFolder *trash_folder;
-
- trash_folder = (CamelVTrashFolder *) folder;
-
- /* "Trash" folder */
- if (trash_folder->type == CAMEL_VTRASH_FOLDER_TRASH)
- g_string_append_printf (
- buffer, ngettext ("%d deleted",
- "%d deleted", num_deleted), num_deleted);
-
- /* "Junk" folder (hide deleted messages) */
- else if (e_mail_reader_get_hide_deleted (reader))
- g_string_append_printf (
- buffer, ngettext ("%d junk",
- "%d junk", num_junked_not_deleted),
- num_junked_not_deleted);
-
- /* "Junk" folder (show deleted messages) */
- else
- g_string_append_printf (
- buffer, ngettext ("%d junk", "%d junk",
- num_junked), num_junked);
-
- /* "Drafts" folder */
- } else if (em_utils_folder_is_drafts (folder, folder_uri)) {
- g_string_append_printf (
- buffer, ngettext ("%d draft", "%d drafts",
- num_visible), num_visible);
-
- /* "Outbox" folder */
- } else if (em_utils_folder_is_outbox (folder, folder_uri)) {
- g_string_append_printf (
- buffer, ngettext ("%d unsent", "%d unsent",
- num_visible), num_visible);
-
- /* "Sent" folder */
- } else if (em_utils_folder_is_sent (folder, folder_uri)) {
- g_string_append_printf (
- buffer, ngettext ("%d sent", "%d sent",
- num_visible), num_visible);
-
- /* Normal folder */
- } else {
- if (!e_mail_reader_get_hide_deleted (reader))
- num_visible +=
- num_deleted - num_junked +
- num_junked_not_deleted;
-
- if (num_unread > 0 && selected->len <= 1)
- g_string_append_printf (
- buffer, ngettext ("%d unread, ",
- "%d unread, ", num_unread), num_unread);
- g_string_append_printf (
- buffer, ngettext ("%d total", "%d total",
- num_visible), num_visible);
- }
-
- message_list_free_uids (message_list, selected);
-
- /* Choose a suitable folder name for displaying. */
- if (folder->parent_store == local_store && (
- strcmp (folder_name, "Drafts") == 0 ||
- strcmp (folder_name, "Inbox") == 0 ||
- strcmp (folder_name, "Outbox") == 0 ||
- strcmp (folder_name, "Sent") == 0 ||
- strcmp (folder_name, "Templates") == 0))
- display_name = _(folder_name);
- else if (strcmp (folder_name, "INBOX") == 0)
- display_name = _("Inbox");
- else
- display_name = folder_name;
-
- title = g_strdup_printf ("%s (%s)", display_name, buffer->str);
- e_shell_sidebar_set_secondary_text (shell_sidebar, buffer->str);
- e_shell_view_set_title (shell_view, title);
- g_free (title);
-
- camel_object_free (folder, CAMEL_FOLDER_NAME, folder_name);
- g_string_free (buffer, TRUE);
-}
diff --git a/mail/e-mail-shell-view-private.h b/mail/e-mail-shell-view-private.h
deleted file mode 100644
index 988d494219..0000000000
--- a/mail/e-mail-shell-view-private.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * e-mail-shell-view-private.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_MAIL_SHELL_VIEW_PRIVATE_H
-#define E_MAIL_SHELL_VIEW_PRIVATE_H
-
-#include "e-mail-shell-view.h"
-
-#include <glib/gi18n.h>
-#include <gtkhtml/gtkhtml.h>
-#include <camel/camel-disco-store.h>
-#include <camel/camel-offline-store.h>
-#include <camel/camel-vtrash-folder.h>
-#include <camel/camel-search-private.h> /* for camel_search_word */
-
-#include "e-util/e-util.h"
-#include "e-util/e-binding.h"
-#include "e-util/gconf-bridge.h"
-#include "e-util/e-account-utils.h"
-#include "filter/filter-part.h"
-#include "widgets/misc/e-popup-action.h"
-#include "widgets/menus/gal-view-instance.h"
-
-#include "e-mail-label-dialog.h"
-#include "e-mail-label-list-store.h"
-#include "e-mail-local.h"
-#include "e-mail-reader.h"
-#include "e-mail-store.h"
-#include "em-composer-utils.h"
-#include "em-folder-properties.h"
-#include "em-folder-selector.h"
-#include "em-folder-utils.h"
-#include "em-subscribe-editor.h"
-#include "em-utils.h"
-#include "mail-autofilter.h"
-#include "mail-config.h"
-#include "mail-ops.h"
-#include "mail-send-recv.h"
-#include "mail-vfolder.h"
-
-#include "e-mail-shell-backend.h"
-#include "e-mail-shell-content.h"
-#include "e-mail-shell-sidebar.h"
-#include "e-mail-shell-view-actions.h"
-
-#define E_MAIL_SHELL_VIEW_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE \
- ((obj), E_TYPE_MAIL_SHELL_VIEW, EMailShellViewPrivate))
-
-/* Shorthand, requires a variable named "shell_window". */
-#define ACTION(name) \
- (E_SHELL_WINDOW_ACTION_##name (shell_window))
-#define ACTION_GROUP(name) \
- (E_SHELL_WINDOW_ACTION_GROUP_##name (shell_window))
-
-/* For use in dispose() methods. */
-#define DISPOSE(obj) \
- G_STMT_START { \
- if ((obj) != NULL) { g_object_unref (obj); (obj) = NULL; } \
- } G_STMT_END
-
-/* ETable Specifications */
-#define ETSPEC_FILENAME "message-list.etspec"
-
-G_BEGIN_DECLS
-
-/* Filter items are displayed in ascending order.
- * Labels are numbered from zero, so subsequent items must have
- * sufficiently large values. Unfortunately this introduces an
- * arbitrary upper bound on labels. */
-enum {
- MAIL_FILTER_ALL_MESSAGES = -3,
- MAIL_FILTER_UNREAD_MESSAGES = -2,
- MAIL_FILTER_NO_LABEL = -1,
- /* Labels go here */
- MAIL_FILTER_READ_MESSAGES = 5000,
- MAIL_FILTER_RECENT_MESSAGES = 5001,
- MAIL_FILTER_LAST_5_DAYS_MESSAGES = 5002,
- MAIL_FILTER_MESSAGES_WITH_ATTACHMENTS = 5003,
- MAIL_FILTER_IMPORTANT_MESSAGES = 5004,
- MAIL_FILTER_MESSAGES_NOT_JUNK = 5005
-};
-
-/* Search items are displayed in ascending order. */
-enum {
- MAIL_SEARCH_SUBJECT_OR_SENDER_CONTAINS,
- MAIL_SEARCH_SUBJECT_OR_RECIPIENTS_CONTAINS,
- MAIL_SEARCH_RECIPIENTS_CONTAIN,
- MAIL_SEARCH_MESSAGE_CONTAINS,
- MAIL_SEARCH_SUBJECT_CONTAINS,
- MAIL_SEARCH_SENDER_CONTAINS,
- MAIL_SEARCH_BODY_CONTAINS,
- MAIL_NUM_SEARCH_RULES
-};
-
-/* Scope items are displayed in ascending order. */
-enum {
- MAIL_SCOPE_CURRENT_FOLDER,
- MAIL_SCOPE_CURRENT_ACCOUNT,
- MAIL_SCOPE_ALL_ACCOUNTS
-};
-
-struct _EMailShellViewPrivate {
-
- /*** Other Stuff ***/
-
- /* These are just for convenience. */
- EMailShellBackend *mail_shell_backend;
- EMailShellContent *mail_shell_content;
- EMailShellSidebar *mail_shell_sidebar;
-
- /* For UI merging and unmerging. */
- guint merge_id;
- guint label_merge_id;
-
- /* Filter rules correspond to the search entry menu. */
- FilterRule *search_rules[MAIL_NUM_SEARCH_RULES];
-
- guint show_deleted : 1;
-};
-
-void e_mail_shell_view_private_init
- (EMailShellView *mail_shell_view,
- EShellViewClass *shell_view_class);
-void e_mail_shell_view_private_constructed
- (EMailShellView *mail_shell_view);
-void e_mail_shell_view_private_dispose
- (EMailShellView *mail_shell_view);
-void e_mail_shell_view_private_finalize
- (EMailShellView *mail_shell_view);
-
-/* Private Utilities */
-
-void e_mail_shell_view_actions_init
- (EMailShellView *mail_shell_view);
-void e_mail_shell_view_restore_state
- (EMailShellView *mail_shell_view);
-void e_mail_shell_view_execute_search
- (EMailShellView *mail_shell_view);
-void e_mail_shell_view_create_filter_from_selected
- (EMailShellView *mail_shell_view,
- gint filter_type);
-void e_mail_shell_view_create_vfolder_from_selected
- (EMailShellView *mail_shell_view,
- gint vfolder_type);
-void e_mail_shell_view_update_popup_labels
- (EMailShellView *mail_shell_view);
-void e_mail_shell_view_update_search_filter
- (EMailShellView *mail_shell_view);
-void e_mail_shell_view_update_sidebar
- (EMailShellView *mail_shell_view);
-
-G_END_DECLS
-
-#endif /* E_MAIL_SHELL_VIEW_PRIVATE_H */
diff --git a/mail/e-mail-shell-view.c b/mail/e-mail-shell-view.c
deleted file mode 100644
index 8d8b4aa2b3..0000000000
--- a/mail/e-mail-shell-view.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * e-mail-shell-view.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-view-private.h"
-
-static gpointer parent_class;
-static GType mail_shell_view_type;
-
-static void
-mail_shell_view_dispose (GObject *object)
-{
- e_mail_shell_view_private_dispose (E_MAIL_SHELL_VIEW (object));
-
- /* Chain up to parent's dispose() method. */
- G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-mail_shell_view_finalize (GObject *object)
-{
- e_mail_shell_view_private_finalize (E_MAIL_SHELL_VIEW (object));
-
- /* Chain up to parent's finalize() method. */
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-mail_shell_view_constructed (GObject *object)
-{
- /* Chain up to parent's constructed() method. */
- G_OBJECT_CLASS (parent_class)->constructed (object);
-
- e_mail_shell_view_private_constructed (E_MAIL_SHELL_VIEW (object));
-}
-
-static void
-mail_shell_view_toggled (EShellView *shell_view)
-{
- EMailShellViewPrivate *priv;
- EShellWindow *shell_window;
- GtkUIManager *ui_manager;
- const gchar *basename;
- gboolean view_is_active;
-
- /* Chain up to parent's toggled() method. */
- E_SHELL_VIEW_CLASS (parent_class)->toggled (shell_view);
-
- priv = E_MAIL_SHELL_VIEW_GET_PRIVATE (shell_view);
-
- shell_window = e_shell_view_get_shell_window (shell_view);
- ui_manager = e_shell_window_get_ui_manager (shell_window);
- view_is_active = e_shell_view_is_active (shell_view);
- basename = E_MAIL_READER_UI_DEFINITION;
-
- if (view_is_active && priv->merge_id == 0) {
- priv->merge_id = e_load_ui_definition (ui_manager, basename);
- e_mail_reader_create_charset_menu (
- E_MAIL_READER (priv->mail_shell_content),
- ui_manager, priv->merge_id);
- } else if (!view_is_active && priv->merge_id != 0) {
- gtk_ui_manager_remove_ui (ui_manager, priv->merge_id);
- priv->merge_id = 0;
- }
-
- gtk_ui_manager_ensure_update (ui_manager);
-}
-
-static void
-mail_shell_view_update_actions (EShellView *shell_view)
-{
- EMailShellView *mail_shell_view;
- EMailShellSidebar *mail_shell_sidebar;
- EShellContent *shell_content;
- EShellSidebar *shell_sidebar;
- EShellWindow *shell_window;
- EMFolderTree *folder_tree;
- EAccount *account = NULL;
- GtkAction *action;
- const gchar *label;
- gchar *uri;
- gboolean sensitive;
- guint32 state;
-
- /* Be descriptive. */
- gboolean account_is_groupwise;
- gboolean folder_allows_children;
- gboolean folder_can_be_deleted;
- gboolean folder_is_junk;
- gboolean folder_is_outbox;
- gboolean folder_is_store;
- gboolean folder_is_trash;
-
- mail_shell_view = E_MAIL_SHELL_VIEW (shell_view);
-
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- shell_content = e_shell_view_get_shell_content (shell_view);
- e_mail_reader_update_actions (E_MAIL_READER (shell_content));
-
- mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
- folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
-
- shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
- state = e_shell_sidebar_check_state (shell_sidebar);
-
- folder_allows_children =
- (state & E_MAIL_SHELL_SIDEBAR_FOLDER_ALLOWS_CHILDREN);
- folder_can_be_deleted =
- (state & E_MAIL_SHELL_SIDEBAR_FOLDER_CAN_DELETE);
- folder_is_junk =
- (state & E_MAIL_SHELL_SIDEBAR_FOLDER_IS_JUNK);
- folder_is_outbox =
- (state & E_MAIL_SHELL_SIDEBAR_FOLDER_IS_OUTBOX);
- folder_is_store =
- (state & E_MAIL_SHELL_SIDEBAR_FOLDER_IS_STORE);
- folder_is_trash =
- (state & E_MAIL_SHELL_SIDEBAR_FOLDER_IS_TRASH);
-
- uri = em_folder_tree_get_selected_uri (folder_tree);
- if (uri != NULL) {
- account = mail_config_get_account_by_source_url (uri);
-
- /* FIXME This belongs in a GroupWise plugin. */
- account_is_groupwise =
- (g_strrstr (uri, "groupwise://") != NULL) &&
- account != NULL && account->parent_uid != NULL;
-
- g_free (uri);
- }
-
- action = ACTION (MAIL_ACCOUNT_DISABLE);
- sensitive = (account != NULL) && folder_is_store;
- if (account_is_groupwise)
- label = _("Proxy _Logout");
- else
- label = _("_Disable Account");
- gtk_action_set_sensitive (action, sensitive);
- g_object_set (action, "label", label, NULL);
-
- action = ACTION (MAIL_EMPTY_TRASH);
- sensitive = folder_is_trash;
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MAIL_FLUSH_OUTBOX);
- sensitive = folder_is_outbox;
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MAIL_FOLDER_COPY);
- sensitive = !folder_is_store;
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MAIL_FOLDER_DELETE);
- sensitive = !folder_is_store && folder_can_be_deleted;
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MAIL_FOLDER_MOVE);
- sensitive = !folder_is_store && folder_can_be_deleted;
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MAIL_FOLDER_NEW);
- sensitive = folder_allows_children;
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MAIL_FOLDER_PROPERTIES);
- sensitive = !folder_is_store;
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MAIL_FOLDER_REFRESH);
- sensitive = !folder_is_store;
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MAIL_FOLDER_RENAME);
- sensitive = !folder_is_store && folder_can_be_deleted;
- gtk_action_set_sensitive (action, sensitive);
-
- e_mail_shell_view_update_popup_labels (mail_shell_view);
-}
-
-static void
-mail_shell_view_class_init (EMailShellViewClass *class,
- GTypeModule *type_module)
-{
- GObjectClass *object_class;
- EShellViewClass *shell_view_class;
-
- parent_class = g_type_class_peek_parent (class);
- g_type_class_add_private (class, sizeof (EMailShellViewPrivate));
-
- object_class = G_OBJECT_CLASS (class);
- object_class->dispose = mail_shell_view_dispose;
- object_class->finalize = mail_shell_view_finalize;
- object_class->constructed = mail_shell_view_constructed;
-
- shell_view_class = E_SHELL_VIEW_CLASS (class);
- shell_view_class->label = _("Mail");
- shell_view_class->icon_name = "evolution-mail";
- shell_view_class->ui_definition = "evolution-mail.ui";
- shell_view_class->ui_manager_id = "org.gnome.evolution.mail";
- shell_view_class->search_options = "/mail-search-options";
- shell_view_class->search_rules = "searchtypes.xml";
- shell_view_class->new_shell_content = e_mail_shell_content_new;
- shell_view_class->new_shell_sidebar = e_mail_shell_sidebar_new;
- shell_view_class->toggled = mail_shell_view_toggled;
- shell_view_class->update_actions = mail_shell_view_update_actions;
-}
-
-static void
-mail_shell_view_init (EMailShellView *mail_shell_view,
- EShellViewClass *shell_view_class)
-{
- mail_shell_view->priv =
- E_MAIL_SHELL_VIEW_GET_PRIVATE (mail_shell_view);
-
- e_mail_shell_view_private_init (mail_shell_view, shell_view_class);
-}
-
-GType
-e_mail_shell_view_get_type (void)
-{
- return mail_shell_view_type;
-}
-
-void
-e_mail_shell_view_register_type (GTypeModule *type_module)
-{
- const GTypeInfo type_info = {
- sizeof (EMailShellViewClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) mail_shell_view_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EMailShellView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) mail_shell_view_init,
- NULL /* value_table */
- };
-
- mail_shell_view_type = g_type_module_register_type (
- type_module, E_TYPE_SHELL_VIEW,
- "EMailShellView", &type_info, 0);
-}
diff --git a/mail/e-mail-shell-view.h b/mail/e-mail-shell-view.h
deleted file mode 100644
index d20bde74a6..0000000000
--- a/mail/e-mail-shell-view.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * e-mail-shell-view.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef E_MAIL_SHELL_VIEW_H
-#define E_MAIL_SHELL_VIEW_H
-
-#include <shell/e-shell-view.h>
-
-/* Standard GObject macros */
-#define E_TYPE_MAIL_SHELL_VIEW \
- (e_mail_shell_view_get_type ())
-#define E_MAIL_SHELL_VIEW(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), E_TYPE_MAIL_SHELL_VIEW, EMailShellView))
-#define E_MAIL_SHELL_VIEW_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), E_TYPE_MAIL_SHELL_VIEW, EMailShellViewClass))
-#define E_IS_MAIL_SHELL_VIEW(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), E_TYPE_MAIL_SHELL_VIEW))
-#define E_IS_MAIL_SHELL_VIEW_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_TYPE \
- ((cls), E_TYPE_MAIL_SHELL_VIEW))
-#define E_MAIL_SHELL_VIEW_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS \
- ((obj), E_TYPE_MAIL_SHELL_VIEW, EMailShellViewClass))
-
-G_BEGIN_DECLS
-
-typedef struct _EMailShellView EMailShellView;
-typedef struct _EMailShellViewClass EMailShellViewClass;
-typedef struct _EMailShellViewPrivate EMailShellViewPrivate;
-
-struct _EMailShellView {
- EShellView parent;
- EMailShellViewPrivate *priv;
-};
-
-struct _EMailShellViewClass {
- EShellViewClass parent_class;
-};
-
-GType e_mail_shell_view_get_type (void);
-void e_mail_shell_view_register_type
- (GTypeModule *type_module);
-gboolean e_mail_shell_view_get_show_deleted
- (EMailShellView *mail_shell_view);
-void e_mail_shell_view_set_show_deleted
- (EMailShellView *mail_shell_view,
- gboolean show_deleted);
-
-G_END_DECLS
-
-#endif /* E_MAIL_SHELL_VIEW_H */
diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c
deleted file mode 100644
index 4ae929513e..0000000000
--- a/mail/em-account-editor.c
+++ /dev/null
@@ -1,3114 +0,0 @@
-/*
- * 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/>
- *
- *
- * Authors:
- * Dan Winship <danw@ximian.com>
- * Jeffrey Stedfast <fejj@ximian.com>
- * Michael Zucchi <notzed@ximian.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-/*
- work before merge can occur:
-
- verify behaviour.
- work out what to do with the startup druid.
-
- also need to work out:
- how to remove unecessary items from a service url once
- configured (removing settings from other types).
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib/gi18n.h>
-#include <glib/gstdio.h>
-
-#include <string.h>
-#include <stdarg.h>
-
-#include <gconf/gconf-client.h>
-
-#include <glade/glade.h>
-
-#include <libgnomeui/gnome-druid.h>
-#include <libgnomeui/gnome-druid-page-standard.h>
-
-#include <e-util/e-signature-list.h>
-
-#include "e-util/e-error.h"
-#include "e-util/e-account-utils.h"
-#include "e-util/e-signature-utils.h"
-#include "e-util/e-util-private.h"
-
-#include "e-mail-local.h"
-#include "em-config.h"
-#include "em-folder-selection-button.h"
-#include "em-account-editor.h"
-#include "mail-session.h"
-#include "mail-send-recv.h"
-#include "e-signature-editor.h"
-#include "em-utils.h"
-#include "em-composer-prefs.h"
-#include "mail-config.h"
-#include "mail-ops.h"
-#include "mail-mt.h"
-
-#if defined (HAVE_NSS)
-#include "smime/gui/e-cert-selector.h"
-#endif
-
-#define d(x)
-
-/* econfig item for the extra config hings */
-struct _receive_options_item {
- EMConfigItem item;
-
- /* Only CAMEL_PROVIDER_CONF_ENTRYs GtkEntrys are stored here.
- The auto-detect camel provider code will probably be removed */
- GHashTable *extra_table;
-};
-
-typedef struct _EMAccountEditorService {
- EMAccountEditor *emae; /* parent pointer, for callbacks */
-
- /* NOTE: keep all widgets together, first frame last check_dialog */
- GtkWidget *frame;
- GtkWidget *container;
-
- GtkComboBox *providers;
-
- GtkLabel *description;
- GtkLabel *hostlabel;
- GtkEntry *hostname;
- GtkLabel *userlabel;
- GtkEntry *username;
- GtkEntry *path;
- GtkLabel *pathlabel;
- GtkWidget *pathentry;
-
- GtkWidget *ssl_frame;
- GtkComboBox *use_ssl;
- GtkWidget *ssl_hbox;
- GtkWidget *no_ssl;
-
- GtkWidget *auth_frame;
- GtkComboBox *authtype;
-
- GtkWidget *authitem;
- GtkToggleButton *remember;
- GtkButton *check_supported;
- GtkToggleButton *needs_auth;
-
- GtkWidget *check_dialog;
- gint check_id;
-
- GList *authtypes; /* if "Check supported" */
- CamelProvider *provider;
- CamelProviderType type;
-
- gint auth_changed_id;
-} EMAccountEditorService;
-
-struct _EMAccountEditorPrivate {
- struct _EMConfig *config;
- GList *providers;
-
- /* signatures */
- GtkComboBox *signatures_dropdown;
- guint sig_added_id;
- guint sig_removed_id;
- guint sig_changed_id;
- const gchar *sig_uid;
-
- /* incoming mail */
- EMAccountEditorService source;
-
- /* extra incoming config */
- CamelProvider *extra_provider;
- GSList *extra_items; /* this is freed by the econfig automatically */
-
- /* outgoing mail */
- EMAccountEditorService transport;
-
- /* account management */
- GtkEntry *identity_entries[5];
- GtkToggleButton *default_account;
- GtkWidget *management_frame;
-
- /* special folders */
- GtkButton *drafts_folder_button;
- GtkButton *sent_folder_button;
- GtkButton *restore_folders_button;
-
- /* Security */
- GtkEntry *pgp_key;
- GtkToggleButton *pgp_encrypt_to_self;
- GtkToggleButton *pgp_always_sign;
- GtkToggleButton *pgp_no_imip_sign;
- GtkToggleButton *pgp_always_trust;
-
- GtkToggleButton *smime_sign_default;
- GtkEntry *smime_sign_key;
- GtkButton *smime_sign_key_select;
- GtkButton *smime_sign_key_clear;
- GtkButton *smime_sign_select;
- GtkToggleButton *smime_encrypt_default;
- GtkToggleButton *smime_encrypt_to_self;
- GtkEntry *smime_encrypt_key;
- GtkButton *smime_encrypt_key_select;
- GtkButton *smime_encrypt_key_clear;
-
- /* for e-config callbacks, each page sets up its widgets, then they are dealed out by the get_widget callback in order*/
- GtkWidget *widgets[5];
- const gchar *widgets_name[5];
- gint widgets_index;
-
- /* for druid page preparation */
- guint identity_set:1;
- guint receive_set:1;
- guint management_set:1;
-};
-
-static void emae_refresh_authtype(EMAccountEditor *emae, EMAccountEditorService *service);
-static void em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account_editor_t type, const gchar *id);
-static void emae_account_folder_changed(EMFolderSelectionButton *folder, EMAccountEditor *emae);
-static GtkVBoxClass *emae_parent;
-
-static void
-emae_init(GObject *o)
-{
- EMAccountEditor *emae = (EMAccountEditor *)o;
-
- emae->priv = g_malloc0(sizeof(*emae->priv));
-
- emae->priv->source.emae = emae;
- emae->priv->transport.emae = emae;
-}
-
-static void
-emae_finalise(GObject *o)
-{
- EMAccountEditor *emae = (EMAccountEditor *)o;
- EMAccountEditorPrivate *p = emae->priv;
-
- if (p->sig_added_id) {
- ESignatureList *signatures = e_get_signature_list ();
-
- g_signal_handler_disconnect(signatures, p->sig_added_id);
- g_signal_handler_disconnect(signatures, p->sig_removed_id);
- g_signal_handler_disconnect(signatures, p->sig_changed_id);
- }
-
- g_list_free(p->source.authtypes);
- g_list_free(p->transport.authtypes);
-
- g_list_free(p->providers);
- g_free(p);
-
- g_object_unref(emae->account);
- if (emae->original)
- g_object_unref(emae->original);
-
- ((GObjectClass *)emae_parent)->finalize(o);
-}
-
-static void
-emae_class_init(GObjectClass *klass)
-{
- klass->finalize = emae_finalise;
-}
-
-GType
-em_account_editor_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(EMAccountEditorClass),
- NULL, NULL,
- (GClassInitFunc)emae_class_init,
- NULL, NULL,
- sizeof(EMAccountEditor), 0,
- (GInstanceInitFunc)emae_init
- };
- emae_parent = g_type_class_ref(G_TYPE_OBJECT);
- type = g_type_register_static(G_TYPE_OBJECT, "EMAccountEditor", &info, 0);
- }
-
- return type;
-}
-
-/**
- * em_account_editor_new:
- * @account:
- * @type:
- *
- * Create a new account editor. If @account is NULL then this is to
- * create a new account, else @account is copied to a working
- * structure and is for editing an existing account.
- *
- * Return value:
- **/
-EMAccountEditor *em_account_editor_new(EAccount *account, em_account_editor_t type, const gchar *id)
-{
- EMAccountEditor *emae = g_object_new(em_account_editor_get_type(), NULL);
-
- em_account_editor_construct(emae, account, type, id);
-
- return emae;
-}
-
-/**
- * em_account_editor_new_for_pages:
- * @account:
- * @type:
- *
- * Create a new account editor. If @account is NULL then this is to
- * create a new account, else @account is copied to a working
- * structure and is for editing an existing account.
- *
- * Return value:
- **/
-EMAccountEditor *em_account_editor_new_for_pages(EAccount *account, em_account_editor_t type, gchar *id, GtkWidget **pages)
-{
- EMAccountEditor *emae = g_object_new(em_account_editor_get_type(), NULL);
- emae->pages = pages;
- em_account_editor_construct(emae, account, type, id);
-
- return emae;
-}
-
-/* ********************************************************************** */
-
-static struct {
- const gchar *label;
- const gchar *value;
-} ssl_options[] = {
- /* Translators: This string is a "Use secure connection" option for
- the Mailer. It will not use an encrypted connection. */
- { N_("No encryption"), "never" },
- /* Translators: This string is a "Use secure connection" option for
- the Mailer. TLS (Transport Layer Security) is commonly known by
- this abbreviation. */
- { N_("TLS encryption"), "when-possible" },
- /* Translators: This string is a "Use secure connection" option for
- the Mailer. SSL (Secure Sockets Layer) is commonly known by this
- abbreviation. */
- { N_("SSL encryption"), "always" }
-};
-
-#define num_ssl_options (sizeof (ssl_options) / sizeof (ssl_options[0]))
-
-static gboolean
-is_email (const gchar *address)
-{
- /* This is supposed to check if the address's domain could be
- an FQDN but alas, it's not worth the pain and suffering. */
- const gchar *at;
-
- at = strchr (address, '@');
- /* make sure we have an '@' and that it's not the first or last gchar */
- if (!at || at == address || *(at + 1) == '\0')
- return FALSE;
-
- return TRUE;
-}
-
-static CamelURL *
-emae_account_url(EMAccountEditor *emae, gint urlid)
-{
- CamelURL *url = NULL;
- const gchar *uri;
-
- uri = e_account_get_string(emae->account, urlid);
-
- if (uri && uri[0])
- url = camel_url_new(uri, NULL);
-
- if (url == NULL) {
- url = camel_url_new("dummy:", NULL);
- camel_url_set_protocol(url, NULL);
- }
-
- return url;
-}
-
-/* ********************************************************************** */
-static void
-emae_license_state(GtkToggleButton *button, GtkDialog *dialog)
-{
- gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_ACCEPT,
- gtk_toggle_button_get_active(button));
-}
-
-static gboolean
-emae_load_text(GtkTextView *view, const gchar *filename)
-{
- FILE *fd;
- gchar filebuf[1024];
- GtkTextIter iter;
- GtkTextBuffer *buffer;
- gint count;
-
- g_return_val_if_fail (filename != NULL , FALSE);
-
- fd = g_fopen (filename, "r");
- if (fd) {
- buffer = gtk_text_buffer_new (NULL);
- gtk_text_buffer_get_start_iter (buffer, &iter);
- while (!feof (fd) && !ferror (fd)) {
- count = fread (filebuf, 1, sizeof (filebuf), fd);
- gtk_text_buffer_insert (buffer, &iter, filebuf, count);
- }
-
- gtk_text_view_set_buffer(GTK_TEXT_VIEW (view), GTK_TEXT_BUFFER(buffer));
- fclose (fd);
- }
-
- return fd != NULL;
-}
-
-static gboolean
-emae_display_license(EMAccountEditor *emae, CamelProvider *prov)
-{
- GladeXML *xml;
- GtkWidget *w, *dialog;
- gchar *tmp;
- GtkResponseType response = GTK_RESPONSE_NONE;
- gchar *gladefile;
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-dialogs.glade",
- NULL);
- xml = glade_xml_new (gladefile, "license_dialog", NULL);
- g_free (gladefile);
-
- dialog = glade_xml_get_widget(xml, "license_dialog");
- gtk_dialog_set_response_sensitive((GtkDialog *)dialog, GTK_RESPONSE_ACCEPT, FALSE);
- tmp = g_strdup_printf(_("%s License Agreement"), prov->license);
- gtk_window_set_title((GtkWindow *)dialog, tmp);
- g_free(tmp);
-
- g_signal_connect(glade_xml_get_widget(xml, "license_checkbutton"),
- "toggled", G_CALLBACK(emae_license_state), dialog);
-
- tmp = g_strdup_printf(_("\nPlease read carefully the license agreement\n"
- "for %s displayed below\n"
- "and tick the check box for accepting it\n"), prov->license);
- gtk_label_set_text((GtkLabel *)glade_xml_get_widget(xml, "license_top_label"), tmp);
- g_free(tmp);
-
- w = glade_xml_get_widget(xml, "license_textview");
- if (emae_load_text((GtkTextView *)w, prov->license_file)) {
- gtk_text_view_set_editable((GtkTextView *)w, FALSE);
- response = gtk_dialog_run((GtkDialog *)dialog);
- } else {
- e_error_run(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL,
- "mail:no-load-license", prov->license_file, NULL);
- }
-
- gtk_widget_destroy(dialog);
- g_object_unref(xml);
-
- return (response == GTK_RESPONSE_ACCEPT);
-}
-
-static gboolean
-emae_check_license(EMAccountEditor *emae, CamelProvider *prov)
-{
- gboolean accepted = TRUE;
-
- if (prov->flags & CAMEL_PROVIDER_HAS_LICENSE) {
- GConfClient *gconf = mail_config_get_gconf_client();
- GSList *providers_list, *l;
-
- providers_list = gconf_client_get_list (gconf, "/apps/evolution/mail/licenses", GCONF_VALUE_STRING, NULL);
-
- for (l = providers_list, accepted = FALSE; l && !accepted; l = g_slist_next(l))
- accepted = (strcmp((gchar *)l->data, prov->protocol) == 0);
-
- if (!accepted
- && (accepted = emae_display_license(emae, prov)) == TRUE) {
- providers_list = g_slist_append(providers_list, g_strdup(prov->protocol));
- gconf_client_set_list(gconf,
- "/apps/evolution/mail/licenses",
- GCONF_VALUE_STRING,
- providers_list, NULL);
- }
-
- g_slist_foreach(providers_list, (GFunc)g_free, NULL);
- g_slist_free(providers_list);
- }
-
- return accepted;
-}
-
-static void
-default_folders_clicked (GtkButton *button, gpointer user_data)
-{
- EMAccountEditor *emae = user_data;
- const gchar *uri;
-
- uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS);
- em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->drafts_folder_button, uri);
- emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->drafts_folder_button, emae);
-
- uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT);
- em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->sent_folder_button, uri);
- emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->sent_folder_button, emae);
-}
-
-/* custom widget factories */
-GtkWidget *em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2);
-
-GtkWidget *
-em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2)
-{
- return (GtkWidget *)em_folder_selection_button_new (
- string1 ? string1 : _("Select Folder"), NULL);
-}
-
-GtkWidget *em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2);
-
-GtkWidget *
-em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2)
-{
- return gtk_combo_box_new ();
-}
-
-GtkWidget *em_account_editor_ssl_selector_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2);
-
-GtkWidget *
-em_account_editor_ssl_selector_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2)
-{
- GtkComboBox *dropdown = (GtkComboBox *)gtk_combo_box_new();
- GtkCellRenderer *cell = gtk_cell_renderer_text_new();
- GtkListStore *store;
- gint i;
- GtkTreeIter iter;
-
- gtk_widget_show((GtkWidget *)dropdown);
-
- store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
-
- for (i=0;i<num_ssl_options;i++) {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, _(ssl_options[i].label), 1, ssl_options[i].value, -1);
- }
-
- gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE);
- gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, NULL);
-
- gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store);
-
- return (GtkWidget *)dropdown;
-}
-
-/* The camel provider auto-detect interface should be deprecated.
- But it still needs to be replaced with something of similar functionality.
- Just using the normal econfig plugin mechanism should be adequate. */
-static void
-emae_auto_detect_free (gpointer key, gpointer value, gpointer user_data)
-{
- g_free (key);
- g_free (value);
-}
-
-static void
-emae_auto_detect(EMAccountEditor *emae)
-{
- EMAccountEditorPrivate *gui = emae->priv;
- EMAccountEditorService *service = &gui->source;
- GHashTable *auto_detected;
- GSList *l;
- CamelProviderConfEntry *entries;
- gchar *value;
- gint i;
- CamelURL *url;
-
- if (service->provider == NULL
- || (entries = service->provider->extra_conf) == NULL)
- return;
-
- d(printf("Running auto-detect\n"));
-
- url = emae_account_url(emae, E_ACCOUNT_SOURCE_URL);
- camel_provider_auto_detect(service->provider, url, &auto_detected, NULL);
- camel_url_free(url);
- if (auto_detected == NULL) {
- d(printf(" no values detected\n"));
- return;
- }
-
- for (i = 0; entries[i].type != CAMEL_PROVIDER_CONF_END; i++) {
- struct _receive_options_item *item;
- GtkWidget *w;
-
- if (entries[i].name == NULL
- || (value = g_hash_table_lookup (auto_detected, entries[i].name)) == NULL)
- continue;
-
- /* only 2 providers use this, and they only do it for 3 entries only */
- g_return_if_fail (entries[i].type == CAMEL_PROVIDER_CONF_ENTRY);
-
- w = NULL;
- for (l = emae->priv->extra_items;l;l=g_slist_next(l)) {
- item = l->data;
- if (item->extra_table && (w = g_hash_table_lookup(item->extra_table, entries[i].name)))
- break;
- }
-
- gtk_entry_set_text((GtkEntry *)w, value?value:"");
- }
-
- g_hash_table_foreach(auto_detected, emae_auto_detect_free, NULL);
- g_hash_table_destroy(auto_detected);
-}
-
-static gint
-provider_compare (const CamelProvider *p1, const CamelProvider *p2)
-{
- /* sort providers based on "location" (ie. local or remote) */
- if (p1->flags & CAMEL_PROVIDER_IS_REMOTE) {
- if (p2->flags & CAMEL_PROVIDER_IS_REMOTE)
- return 0;
- return -1;
- } else {
- if (p2->flags & CAMEL_PROVIDER_IS_REMOTE)
- return 1;
- return 0;
- }
-}
-
-static void
-emae_signature_added(ESignatureList *signatures, ESignature *sig, EMAccountEditor *emae)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- model = gtk_combo_box_get_model(emae->priv->signatures_dropdown);
-
- gtk_list_store_append((GtkListStore *)model, &iter);
- gtk_list_store_set((GtkListStore *)model, &iter, 0, sig->autogen?_("Autogenerated"):sig->name, 1, sig->uid, -1);
-
- gtk_combo_box_set_active(emae->priv->signatures_dropdown, gtk_tree_model_iter_n_children(model, NULL)-1);
-}
-
-static gint
-emae_signature_get_iter(EMAccountEditor *emae, ESignature *sig, GtkTreeModel **modelp, GtkTreeIter *iter)
-{
- GtkTreeModel *model;
- gint found = 0;
-
- model = gtk_combo_box_get_model(emae->priv->signatures_dropdown);
- *modelp = model;
- if (!gtk_tree_model_get_iter_first(model, iter))
- return FALSE;
-
- do {
- gchar *uid;
-
- gtk_tree_model_get(model, iter, 1, &uid, -1);
- if (uid && !strcmp(uid, sig->uid))
- found = TRUE;
- g_free(uid);
- } while (!found && gtk_tree_model_iter_next(model, iter));
-
- return found;
-}
-
-static void
-emae_signature_removed(ESignatureList *signatures, ESignature *sig, EMAccountEditor *emae)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- if (emae_signature_get_iter(emae, sig, &model, &iter))
- gtk_list_store_remove((GtkListStore *)model, &iter);
-}
-
-static void
-emae_signature_changed(ESignatureList *signatures, ESignature *sig, EMAccountEditor *emae)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- if (emae_signature_get_iter(emae, sig, &model, &iter))
- gtk_list_store_set((GtkListStore *)model, &iter, 0, sig->autogen?_("Autogenerated"):sig->name, -1);
-}
-
-static void
-emae_signaturetype_changed(GtkComboBox *dropdown, EMAccountEditor *emae)
-{
- gint id = gtk_combo_box_get_active(dropdown);
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *uid = NULL;
-
- if (id != -1) {
- model = gtk_combo_box_get_model(dropdown);
- if (gtk_tree_model_iter_nth_child(model, &iter, NULL, id))
- gtk_tree_model_get(model, &iter, 1, &uid, -1);
- }
-
- e_account_set_string(emae->account, E_ACCOUNT_ID_SIGNATURE, uid);
- g_free(uid);
-}
-
-static void
-emae_signature_new(GtkWidget *w, EMAccountEditor *emae)
-{
- EShell *shell;
- EShellSettings *shell_settings;
- GtkWidget *parent;
- gboolean html_mode;
-
- shell = e_shell_get_default ();
- shell_settings = e_shell_get_shell_settings (shell);
- parent = gtk_widget_get_toplevel (w);
-
- html_mode = e_shell_settings_get_boolean (
- shell_settings, "composer-format-html");
-
- em_composer_prefs_new_signature (GTK_WINDOW (parent), html_mode);
-}
-
-static GtkWidget *
-emae_setup_signatures(EMAccountEditor *emae, GladeXML *xml)
-{
- EMAccountEditorPrivate *p = emae->priv;
- GtkComboBox *dropdown = (GtkComboBox *)glade_xml_get_widget(xml, "signature_dropdown");
- GtkCellRenderer *cell = gtk_cell_renderer_text_new();
- GtkListStore *store;
- gint i, active=0;
- GtkTreeIter iter;
- ESignatureList *signatures;
- EIterator *it;
- const gchar *current = e_account_get_string(emae->account, E_ACCOUNT_ID_SIGNATURE);
- GtkWidget *button;
-
- emae->priv->signatures_dropdown = dropdown;
- gtk_widget_show((GtkWidget *)dropdown);
-
- store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, _("None"), 1, NULL, -1);
-
- signatures = e_get_signature_list ();
-
- if (p->sig_added_id == 0) {
- p->sig_added_id = g_signal_connect(signatures, "signature-added", G_CALLBACK(emae_signature_added), emae);
- p->sig_removed_id = g_signal_connect(signatures, "signature-removed", G_CALLBACK(emae_signature_removed), emae);
- p->sig_changed_id = g_signal_connect(signatures, "signature-changed", G_CALLBACK(emae_signature_changed), emae);
- }
-
- /* we need to count the 'none' entry before using the index */
- i = 1;
- it = e_list_get_iterator ((EList *) signatures);
- while (e_iterator_is_valid (it)) {
- ESignature *sig = (ESignature *)e_iterator_get(it);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, sig->autogen?_("Autogenerated"):sig->name, 1, sig->uid, -1);
-
- if (current && !strcmp(current, sig->uid))
- active = i;
-
- e_iterator_next(it);
- i++;
- }
- g_object_unref (it);
-
- gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE);
- gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, NULL);
-
- gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store);
- gtk_combo_box_set_active(dropdown, active);
-
- g_signal_connect(dropdown, "changed", G_CALLBACK(emae_signaturetype_changed), emae);
- gtk_widget_set_sensitive((GtkWidget *)dropdown, e_account_writable(emae->account, E_ACCOUNT_ID_SIGNATURE));
-
- button = glade_xml_get_widget(xml, "sigAddNew");
- g_signal_connect(button, "clicked", G_CALLBACK(emae_signature_new), emae);
- gtk_widget_set_sensitive(button,
- gconf_client_key_is_writable(mail_config_get_gconf_client(),
- "/apps/evolution/mail/signatures", NULL));
-
- return (GtkWidget *)dropdown;
-}
-
-static void
-emae_receipt_policy_changed(GtkComboBox *dropdown, EMAccountEditor *emae)
-{
- gint id = gtk_combo_box_get_active(dropdown);
- GtkTreeModel *model;
- GtkTreeIter iter;
- EAccountReceiptPolicy policy;
-
- if (id != -1) {
- model = gtk_combo_box_get_model(dropdown);
- if (gtk_tree_model_iter_nth_child(model, &iter, NULL, id)) {
- gtk_tree_model_get(model, &iter, 1, &policy, -1);
- e_account_set_int (emae->account, E_ACCOUNT_RECEIPT_POLICY, policy);
- }
- }
-
-}
-
-static GtkWidget *
-emae_setup_receipt_policy (EMAccountEditor *emae, GladeXML *xml)
-{
- GtkComboBox *dropdown = (GtkComboBox *)glade_xml_get_widget(xml, "receipt_policy_dropdown");
- GtkListStore *store;
- gint i = 0, active = 0;
- GtkTreeIter iter;
- EAccountReceiptPolicy current = emae->account->receipt_policy;
- static struct {
- EAccountReceiptPolicy policy;
- const gchar *label;
- } receipt_policies[] = {
- { E_ACCOUNT_RECEIPT_NEVER, N_("Never") },
- { E_ACCOUNT_RECEIPT_ALWAYS, N_("Always") },
- { E_ACCOUNT_RECEIPT_ASK, N_("Ask for each message") }
- };
-
- gtk_widget_show((GtkWidget *)dropdown);
-
- store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
-
- for (i = 0; i < 3; ++i) {
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter,
- 0, _(receipt_policies[i].label),
- 1, receipt_policies[i].policy,
- -1);
- if (current == receipt_policies[i].policy)
- active = i;
- }
-
- gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store);
- gtk_combo_box_set_active(dropdown, active);
-
- g_signal_connect(dropdown, "changed", G_CALLBACK(emae_receipt_policy_changed), emae);
- gtk_widget_set_sensitive((GtkWidget *)dropdown, e_account_writable(emae->account, E_ACCOUNT_RECEIPT_POLICY));
-
- return (GtkWidget *)dropdown;
-}
-
-static void
-emae_account_entry_changed(GtkEntry *entry, EMAccountEditor *emae)
-{
- gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)entry, "account-item"));
-
- e_account_set_string(emae->account, item, gtk_entry_get_text(entry));
-}
-
-static GtkEntry *
-emae_account_entry(EMAccountEditor *emae, const gchar *name, gint item, GladeXML *xml)
-{
- GtkEntry *entry;
- const gchar *text;
-
- entry = (GtkEntry *)glade_xml_get_widget(xml, name);
- text = e_account_get_string(emae->account, item);
- if (text)
- gtk_entry_set_text(entry, text);
- g_object_set_data((GObject *)entry, "account-item", GINT_TO_POINTER(item));
- g_signal_connect(entry, "changed", G_CALLBACK(emae_account_entry_changed), emae);
- gtk_widget_set_sensitive((GtkWidget *)entry, e_account_writable(emae->account, item));
-
- return entry;
-}
-
-static void
-emae_account_toggle_changed(GtkToggleButton *toggle, EMAccountEditor *emae)
-{
- gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)toggle, "account-item"));
-
- e_account_set_bool(emae->account, item, gtk_toggle_button_get_active(toggle));
-}
-
-static void
-emae_account_toggle_widget(EMAccountEditor *emae, GtkToggleButton *toggle, gint item)
-{
- gtk_toggle_button_set_active(toggle, e_account_get_bool(emae->account, item));
- g_object_set_data((GObject *)toggle, "account-item", GINT_TO_POINTER(item));
- g_signal_connect(toggle, "toggled", G_CALLBACK(emae_account_toggle_changed), emae);
- gtk_widget_set_sensitive((GtkWidget *)toggle, e_account_writable(emae->account, item));
-}
-
-static GtkToggleButton *
-emae_account_toggle(EMAccountEditor *emae, const gchar *name, gint item, GladeXML *xml)
-{
- GtkToggleButton *toggle;
-
- toggle = (GtkToggleButton *)glade_xml_get_widget(xml, name);
- emae_account_toggle_widget(emae, toggle, item);
-
- return toggle;
-}
-
-static void
-emae_account_spinint_changed(GtkSpinButton *spin, EMAccountEditor *emae)
-{
- gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)spin, "account-item"));
-
- e_account_set_int(emae->account, item, gtk_spin_button_get_value(spin));
-}
-
-static void
-emae_account_spinint_widget(EMAccountEditor *emae, GtkSpinButton *spin, gint item)
-{
- gtk_spin_button_set_value(spin, e_account_get_int(emae->account, item));
- g_object_set_data((GObject *)spin, "account-item", GINT_TO_POINTER(item));
- g_signal_connect(spin, "value_changed", G_CALLBACK(emae_account_spinint_changed), emae);
- gtk_widget_set_sensitive((GtkWidget *)spin, e_account_writable(emae->account, item));
-}
-
-#if 0
-static GtkSpinButton *
-emae_account_spinint(EMAccountEditor *emae, const gchar *name, gint item)
-{
- GtkSpinButton *spin;
-
- spin = (GtkSpinButton *)glade_xml_get_widget(emae->priv->xml, name);
- emae_account_spinint_widget(emae, spin, item);
-
- return spin;
-}
-#endif
-
-static void
-emae_account_folder_changed(EMFolderSelectionButton *folder, EMAccountEditor *emae)
-{
- gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)folder, "account-item"));
-
- e_account_set_string(emae->account, item, em_folder_selection_button_get_selection(folder));
-}
-
-static EMFolderSelectionButton *
-emae_account_folder(EMAccountEditor *emae, const gchar *name, gint item, gint deffolder, GladeXML *xml)
-{
- EMFolderSelectionButton *folder;
- const gchar *uri;
-
- folder = (EMFolderSelectionButton *)glade_xml_get_widget(xml, name);
- uri = e_account_get_string(emae->account, item);
- if (uri) {
- gchar *tmp = em_uri_to_camel(uri);
-
- em_folder_selection_button_set_selection(folder, tmp);
- g_free(tmp);
- } else {
- const gchar *uri;
-
- uri = e_mail_local_get_folder_uri (deffolder);
- em_folder_selection_button_set_selection(folder, uri);
- }
-
- g_object_set_data((GObject *)folder, "account-item", GINT_TO_POINTER(item));
- g_object_set_data((GObject *)folder, "folder-default", GINT_TO_POINTER(deffolder));
- g_signal_connect(folder, "selected", G_CALLBACK(emae_account_folder_changed), emae);
- gtk_widget_show((GtkWidget *)folder);
-
- gtk_widget_set_sensitive((GtkWidget *)folder, e_account_writable(emae->account, item));
-
- return folder;
-}
-
-#if defined (HAVE_NSS)
-static void
-smime_changed(EMAccountEditor *emae)
-{
- EMAccountEditorPrivate *gui = emae->priv;
- gint act;
- const gchar *tmp;
-
- tmp = gtk_entry_get_text(gui->smime_sign_key);
- act = tmp && tmp[0];
- gtk_widget_set_sensitive((GtkWidget *)gui->smime_sign_key_clear, act);
- gtk_widget_set_sensitive((GtkWidget *)gui->smime_sign_default, act);
- if (!act)
- gtk_toggle_button_set_active(gui->smime_sign_default, FALSE);
-
- tmp = gtk_entry_get_text(gui->smime_encrypt_key);
- act = tmp && tmp[0];
- gtk_widget_set_sensitive((GtkWidget *)gui->smime_encrypt_key_clear, act);
- gtk_widget_set_sensitive((GtkWidget *)gui->smime_encrypt_default, act);
- gtk_widget_set_sensitive((GtkWidget *)gui->smime_encrypt_to_self, act);
- if (!act) {
- gtk_toggle_button_set_active(gui->smime_encrypt_default, FALSE);
- gtk_toggle_button_set_active(gui->smime_encrypt_to_self, FALSE);
- }
-}
-
-static void
-smime_sign_key_selected(GtkWidget *dialog, const gchar *key, EMAccountEditor *emae)
-{
- EMAccountEditorPrivate *gui = emae->priv;
-
- if (key != NULL) {
- gtk_entry_set_text(gui->smime_sign_key, key);
- smime_changed(emae);
- }
-
- gtk_widget_destroy(dialog);
-}
-
-static void
-smime_sign_key_select(GtkWidget *button, EMAccountEditor *emae)
-{
- EMAccountEditorPrivate *gui = emae->priv;
- GtkWidget *w;
-
- w = e_cert_selector_new(E_CERT_SELECTOR_SIGNER, gtk_entry_get_text(gui->smime_sign_key));
- gtk_window_set_modal((GtkWindow *)w, TRUE);
- gtk_window_set_transient_for((GtkWindow *)w, (GtkWindow *)gtk_widget_get_toplevel(button));
- g_signal_connect(w, "selected", G_CALLBACK(smime_sign_key_selected), emae);
- gtk_widget_show(w);
-}
-
-static void
-smime_sign_key_clear(GtkWidget *w, EMAccountEditor *emae)
-{
- EMAccountEditorPrivate *gui = emae->priv;
-
- gtk_entry_set_text(gui->smime_sign_key, "");
- smime_changed(emae);
-}
-
-static void
-smime_encrypt_key_selected(GtkWidget *dialog, const gchar *key, EMAccountEditor *emae)
-{
- EMAccountEditorPrivate *gui = emae->priv;
-
- if (key != NULL) {
- gtk_entry_set_text(gui->smime_encrypt_key, key);
- smime_changed(emae);
- }
-
- gtk_widget_destroy(dialog);
-}
-
-static void
-smime_encrypt_key_select(GtkWidget *button, EMAccountEditor *emae)
-{
- EMAccountEditorPrivate *gui = emae->priv;
- GtkWidget *w;
-
- w = e_cert_selector_new(E_CERT_SELECTOR_SIGNER, gtk_entry_get_text(gui->smime_encrypt_key));
- gtk_window_set_modal((GtkWindow *)w, TRUE);
- gtk_window_set_transient_for((GtkWindow *)w, (GtkWindow *)gtk_widget_get_toplevel(button));
- g_signal_connect(w, "selected", G_CALLBACK(smime_encrypt_key_selected), emae);
- gtk_widget_show(w);
-}
-
-static void
-smime_encrypt_key_clear(GtkWidget *w, EMAccountEditor *emae)
-{
- EMAccountEditorPrivate *gui = emae->priv;
-
- gtk_entry_set_text(gui->smime_encrypt_key, "");
- smime_changed(emae);
-}
-#endif
-
-static void
-emae_url_set_hostport(CamelURL *url, const gchar *txt)
-{
- const gchar *port;
- gchar *host;
-
- /* FIXME: what if this was a raw IPv6 address? */
- if (txt && (port = strchr(txt, ':'))) {
- camel_url_set_port(url, atoi(port+1));
- host = g_strdup(txt);
- host[port-txt] = 0;
- } else {
- /* "" is converted to NULL, but if we set NULL on the url,
- camel_url_to_string strips lots of details */
- host = g_strdup((txt?txt:""));
- camel_url_set_port (url, 0);
- }
-
- g_strstrip(host);
- if (txt && *txt)
- camel_url_set_host(url, host);
-
- g_free(host);
-}
-
-/* This is used to map a funciton which will set on the url a string value.
- if widgets[0] is set, it is the entry which will be called against setval()
- We need our own function for host:port decoding, as above */
-struct _provider_host_info {
- guint32 flag;
- void (*setval)(CamelURL *, const gchar *);
- glong widgets[3];
-};
-
-static struct _provider_host_info emae_source_host_info[] = {
- { CAMEL_URL_PART_HOST, emae_url_set_hostport, { G_STRUCT_OFFSET(EMAccountEditorService, hostname), G_STRUCT_OFFSET(EMAccountEditorService, hostlabel), }, },
- { CAMEL_URL_PART_USER, camel_url_set_user, { G_STRUCT_OFFSET(EMAccountEditorService, username), G_STRUCT_OFFSET(EMAccountEditorService, userlabel), } },
- { CAMEL_URL_PART_PATH, camel_url_set_path, { G_STRUCT_OFFSET(EMAccountEditorService, path), G_STRUCT_OFFSET(EMAccountEditorService, pathlabel), G_STRUCT_OFFSET(EMAccountEditorService, pathentry) }, },
- { CAMEL_URL_PART_AUTH, NULL, { 0, G_STRUCT_OFFSET(EMAccountEditorService, auth_frame), }, },
- { 0 },
-};
-
-static struct _provider_host_info emae_transport_host_info[] = {
- { CAMEL_URL_PART_HOST, emae_url_set_hostport, { G_STRUCT_OFFSET(EMAccountEditorService, hostname), G_STRUCT_OFFSET(EMAccountEditorService, hostlabel), }, },
- { CAMEL_URL_PART_USER, camel_url_set_user, { G_STRUCT_OFFSET(EMAccountEditorService, username), G_STRUCT_OFFSET(EMAccountEditorService, userlabel), } },
- { CAMEL_URL_PART_AUTH, NULL, { 0, G_STRUCT_OFFSET(EMAccountEditorService, auth_frame), }, },
- { 0 },
-};
-
-/* This is used to map each of the two services in a typical account to the widgets that represent each service.
- i.e. the receiving (source) service, and the sending (transport) service.
- It is used throughout the following code to drive each page */
-static struct _service_info {
- gint account_uri_key;
- gint save_passwd_key;
-
- const gchar *frame;
- const gchar *type_dropdown;
-
- const gchar *container;
- const gchar *description;
- const gchar *hostname;
- const gchar *hostlabel;
- const gchar *username;
- const gchar *userlabel;
- const gchar *path;
- const gchar *pathlabel;
- const gchar *pathentry;
-
- const gchar *security_frame;
- const gchar *ssl_hbox;
- const gchar *use_ssl;
- const gchar *ssl_disabled;
-
- const gchar *needs_auth;
- const gchar *auth_frame;
-
- const gchar *authtype;
- const gchar *authtype_check;
-
- const gchar *remember_password;
-
- struct _provider_host_info *host_info;
-} emae_service_info[CAMEL_NUM_PROVIDER_TYPES] = {
- { E_ACCOUNT_SOURCE_URL, E_ACCOUNT_SOURCE_SAVE_PASSWD,
- "source_frame", "source_type_dropdown",
- "source_vbox", "source_description", "source_host", "source_host_label", "source_user", "source_user_label", "source_path", "source_path_label", "source_path_entry",
- "source_security_frame", "source_ssl_hbox", "source_use_ssl", "source_ssl_disabled",
- NULL, "source_auth_frame",
- "source_auth_dropdown", "source_check_supported",
- "source_remember_password",
- emae_source_host_info,
- },
- { E_ACCOUNT_TRANSPORT_URL, E_ACCOUNT_TRANSPORT_SAVE_PASSWD,
- "transport_frame", "transport_type_dropdown",
- "transport_vbox", "transport_description", "transport_host", "transport_host_label", "transport_user", "transport_user_label", NULL, NULL, NULL,
- "transport_security_frame", "transport_ssl_hbox", "transport_use_ssl", "transport_ssl_disabled",
- "transport_needs_auth", "transport_auth_frame",
- "transport_auth_dropdown", "transport_check_supported",
- "transport_remember_password",
- emae_transport_host_info,
- },
-};
-
-static void
-emae_uri_changed(EMAccountEditorService *service, CamelURL *url)
-{
- gchar *uri;
-
- uri = camel_url_to_string(url, 0);
-
- e_account_set_string(service->emae->account, emae_service_info[service->type].account_uri_key, uri);
-
- /* small hack for providers which are store and transport - copy settings across */
- if (service->type == CAMEL_PROVIDER_STORE
- && service->provider
- && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT(service->provider))
- e_account_set_string(service->emae->account, E_ACCOUNT_TRANSPORT_URL, uri);
-
- g_free(uri);
-}
-
-static void
-emae_service_url_changed(EMAccountEditorService *service, void (*setval)(CamelURL *, const gchar *), GtkEntry *entry)
-{
- GtkComboBox *dropdown;
- gint id;
- GtkTreeModel *model;
- GtkTreeIter iter;
- CamelServiceAuthType *authtype;
-
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
- const gchar *text = gtk_entry_get_text(entry);
-
- setval(url, (text && text[0])?text:NULL);
-
- if (text && text[0] && setval == camel_url_set_user) {
- dropdown = service->authtype;
- if(dropdown) {
- id = gtk_combo_box_get_active (dropdown);
- if (id != -1) {
- model = gtk_combo_box_get_model (dropdown);
- if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) {
- gtk_tree_model_get (model, &iter, 1, &authtype, -1);
- if (authtype)
- camel_url_set_authmech (url, authtype->authproto);
- }
- }
- }
- }
-
- emae_uri_changed(service, url);
- camel_url_free(url);
-}
-
-static void
-emae_service_url_path_changed(EMAccountEditorService *service, void (*setval)(CamelURL *, const gchar *), GtkWidget *widget)
-{
- GtkComboBox *dropdown;
- gint id;
- GtkTreeModel *model;
- GtkTreeIter iter;
- CamelServiceAuthType *authtype;
-
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
- const gchar *text = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
-
- setval(url, (text && text[0])?text:NULL);
-
- if (text && text[0] && setval == camel_url_set_user) {
- dropdown = service->authtype;
- if(dropdown) {
- id = gtk_combo_box_get_active (dropdown);
- if (id != -1) {
- model = gtk_combo_box_get_model (dropdown);
- if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) {
- gtk_tree_model_get (model, &iter, 1, &authtype, -1);
- if (authtype)
- camel_url_set_authmech (url, authtype->authproto);
- }
- }
- }
- }
-
- emae_uri_changed(service, url);
- camel_url_free(url);
-}
-
-static void
-emae_hostname_changed(GtkEntry *entry, EMAccountEditorService *service)
-{
- emae_service_url_changed(service, emae_url_set_hostport, entry);
-}
-
-static void
-emae_username_changed(GtkEntry *entry, EMAccountEditorService *service)
-{
- emae_service_url_changed(service, camel_url_set_user, entry);
-}
-
-static void
-emae_path_changed(GtkWidget *widget, EMAccountEditorService *service)
-{
- emae_service_url_path_changed(service, camel_url_set_path, widget);
-}
-
-static gint
-emae_ssl_update(EMAccountEditorService *service, CamelURL *url)
-{
- gint id = gtk_combo_box_get_active(service->use_ssl);
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *ssl;
-
- if (id == -1)
- return 0;
-
- model = gtk_combo_box_get_model(service->use_ssl);
- if (gtk_tree_model_iter_nth_child(model, &iter, NULL, id)) {
- gtk_tree_model_get(model, &iter, 1, &ssl, -1);
- if (!strcmp(ssl, "none"))
- ssl = NULL;
- camel_url_set_param(url, "use_ssl", ssl);
- return 1;
- }
-
- return 0;
-}
-
-static void
-emae_ssl_changed(GtkComboBox *dropdown, EMAccountEditorService *service)
-{
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
-
- if (emae_ssl_update(service, url))
- emae_uri_changed(service, url);
- camel_url_free(url);
-}
-
-static void
-emae_service_provider_changed(EMAccountEditorService *service)
-{
- gint i, j;
- void (*show)(GtkWidget *);
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
-
- if (service->provider) {
- gint enable;
- GtkWidget *dwidget = NULL;
-
- camel_url_set_protocol(url, service->provider->protocol);
- gtk_label_set_text(service->description, service->provider->description);
- if (!emae_check_license(service->emae, service->provider))
- gtk_widget_hide(service->frame);
- else
- gtk_widget_show(service->frame);
-
- enable = e_account_writable_option(service->emae->account, service->provider->protocol, "auth");
- gtk_widget_set_sensitive((GtkWidget *)service->authtype, enable);
- gtk_widget_set_sensitive((GtkWidget *)service->check_supported, enable);
-
- enable = e_account_writable_option(service->emae->account, service->provider->protocol, "use_ssl");
- gtk_widget_set_sensitive((GtkWidget *)service->use_ssl, enable);
-
- enable = e_account_writable(service->emae->account, emae_service_info[service->type].save_passwd_key);
- gtk_widget_set_sensitive((GtkWidget *)service->remember, enable);
-
- for (i=0;emae_service_info[service->type].host_info[i].flag;i++) {
- GtkWidget *w;
- gint hide;
- struct _provider_host_info *info = &emae_service_info[service->type].host_info[i];
-
- enable = CAMEL_PROVIDER_ALLOWS(service->provider, info->flag);
- hide = CAMEL_PROVIDER_HIDDEN(service->provider, info->flag);
- show = (enable && !hide)?gtk_widget_show:gtk_widget_hide;
-
- for (j=0; j < sizeof(info->widgets)/sizeof(info->widgets[0]); j++) {
- if (info->widgets[j] && (w = G_STRUCT_MEMBER(GtkWidget *, service, info->widgets[j]))) {
- show(w);
- if (j == 0) {
- if (dwidget == NULL && enable)
- dwidget = w;
-
- if (info->setval && !hide)
- info->setval(url, enable?gtk_entry_get_text((GtkEntry *)w):NULL);
- }
- }
- }
- }
-
- if (dwidget)
- gtk_widget_grab_focus(dwidget);
-
- if (CAMEL_PROVIDER_ALLOWS(service->provider, CAMEL_URL_PART_AUTH)) {
- GList *ll;
-
- /* try to keep the authmech from the current url, or clear it */
- if (url->authmech) {
- if (service->provider->authtypes) {
- for (ll = service->provider->authtypes;ll;ll = g_list_next(ll))
- if (!strcmp(url->authmech, ((CamelServiceAuthType *)ll->data)->authproto))
- break;
- if (ll == NULL)
- camel_url_set_authmech(url, NULL);
- } else {
- camel_url_set_authmech(url, NULL);
- }
- }
-
- emae_refresh_authtype(service->emae, service);
- if (service->needs_auth && !CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_AUTH))
- gtk_widget_show((GtkWidget *)service->needs_auth);
- } else {
- if (service->needs_auth)
- gtk_widget_hide((GtkWidget *)service->needs_auth);
- }
-#ifdef HAVE_SSL
- gtk_widget_hide(service->no_ssl);
- if (service->provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) {
- emae_ssl_update(service, url);
- show = gtk_widget_show;
- } else {
- camel_url_set_param(url, "use_ssl", NULL);
- show = gtk_widget_hide;
- }
- show(service->ssl_frame);
- show(service->ssl_hbox);
-#else
- gtk_widget_hide(service->ssl_hbox);
- gtk_widget_show(service->no_ssl);
- camel_url_set_param(url, "use_ssl", NULL);
-#endif
- } else {
- camel_url_set_protocol(url, NULL);
- gtk_label_set_text(service->description, "");
- gtk_widget_hide(service->frame);
- gtk_widget_hide(service->auth_frame);
- gtk_widget_hide(service->ssl_frame);
- }
-
- /* FIXME: linked services? */
- /* FIXME: permissions setup */
-
- emae_uri_changed(service, url);
- camel_url_free(url);
-}
-
-static void
-emae_provider_changed(GtkComboBox *dropdown, EMAccountEditorService *service)
-{
- gint id = gtk_combo_box_get_active(dropdown);
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- if (id == -1)
- return;
-
- model = gtk_combo_box_get_model(dropdown);
- if (!gtk_tree_model_iter_nth_child(model, &iter, NULL, id))
- return;
-
- gtk_tree_model_get(model, &iter, 1, &service->provider, -1);
-
- g_list_free(service->authtypes);
- service->authtypes = NULL;
-
- emae_service_provider_changed(service);
-
- e_config_target_changed((EConfig *)service->emae->priv->config, E_CONFIG_TARGET_CHANGED_REBUILD);
-}
-
-static void
-emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service)
-{
- EAccount *account = emae->account;
- GtkListStore *store;
- GtkTreeIter iter;
- GList *l;
- GtkCellRenderer *cell = gtk_cell_renderer_text_new();
- GtkComboBox *dropdown;
- gint active = 0, i;
- struct _service_info *info = &emae_service_info[service->type];
- const gchar *uri = e_account_get_string(account, info->account_uri_key);
- gchar *current = NULL;
- const gchar *tmp;
- CamelURL *url;
-
- dropdown = service->providers;
- gtk_widget_show((GtkWidget *)dropdown);
-
- if (uri) {
- const gchar *colon = strchr(uri, ':');
- gint len;
-
- if (colon) {
- len = colon-uri;
- current = g_alloca(len+1);
- memcpy(current, uri, len);
- current[len] = 0;
- }
- } else {
- current = (gchar *) "imap";
- }
-
- store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
-
- i = 0;
-
- /* We just special case each type here, its just easier */
- if (service->type == CAMEL_PROVIDER_STORE) {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, _("None"), 1, NULL, -1);
- i++;
- }
-
- for (l=emae->priv->providers; l; l=l->next) {
- CamelProvider *provider = l->data;
-
- if (!((strcmp(provider->domain, "mail") == 0
- || strcmp (provider->domain, "news") == 0)
- && provider->object_types[service->type]
- && (service->type != CAMEL_PROVIDER_STORE || (provider->flags & CAMEL_PROVIDER_IS_SOURCE) != 0))
- /* hardcode not showing providers who's transport is done in the store */
- || (service->type == CAMEL_PROVIDER_TRANSPORT
- && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider)))
- continue;
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, provider->name, 1, provider, -1);
-
- /* find the displayed and set default */
- if (i == 0 || (current && strcmp(provider->protocol, current) == 0)) {
- service->provider = provider;
- active = i;
-
- /* we need to set this value on the uri too */
- if (current == NULL) {
- CamelURL *url = emae_account_url(emae, info->account_uri_key);
-
- camel_url_set_protocol(url, provider->protocol);
- emae_uri_changed(service, url);
- camel_url_free(url);
- }
- }
- i++;
- }
-
-
- gtk_cell_layout_clear((GtkCellLayout *)dropdown);
- gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store);
- gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE);
- gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, NULL);
-
- g_signal_handlers_disconnect_by_func(dropdown, emae_provider_changed, service);
- gtk_combo_box_set_active(dropdown, -1); /* needed for gtkcombo bug(?) */
- gtk_combo_box_set_active(dropdown, active);
- g_signal_connect(dropdown, "changed", G_CALLBACK(emae_provider_changed), service);
-
- if (!uri || (url = camel_url_new(uri, NULL)) == NULL) {
- return;
- }
-
- tmp = camel_url_get_param(url, "use_ssl");
- if (tmp == NULL)
- tmp = "never";
- for (i=0;i<num_ssl_options;i++) {
- if (!strcmp(ssl_options[i].value, tmp)) {
- gtk_combo_box_set_active(service->use_ssl, i);
- break;
- }
- }
-}
-
-static void
-emae_authtype_changed(GtkComboBox *dropdown, EMAccountEditorService *service)
-{
- gint id = gtk_combo_box_get_active(dropdown);
- GtkTreeModel *model;
- GtkTreeIter iter;
- CamelServiceAuthType *authtype;
- CamelURL *url;
-
- if (id == -1)
- return;
-
- url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
- model = gtk_combo_box_get_model(dropdown);
- if (gtk_tree_model_iter_nth_child(model, &iter, NULL, id)) {
- gtk_tree_model_get(model, &iter, 1, &authtype, -1);
- if (authtype)
- camel_url_set_authmech(url, authtype->authproto);
- else
- camel_url_set_authmech(url, NULL);
- emae_uri_changed(service, url);
- }
- camel_url_free(url);
-
- gtk_widget_set_sensitive((GtkWidget *)service->remember,
- authtype
- ?(authtype->need_password && e_account_writable(service->emae->account, emae_service_info[service->type].save_passwd_key))
- :FALSE);
-}
-
-static void
-emae_needs_auth(GtkToggleButton *toggle, EMAccountEditorService *service)
-{
- gint need = gtk_toggle_button_get_active(toggle);
-
- gtk_widget_set_sensitive(service->auth_frame, need);
-
- if (need)
- emae_authtype_changed(service->authtype, service);
- else {
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
-
- camel_url_set_authmech(url, NULL);
- emae_uri_changed(service, url);
- camel_url_free(url);
- }
-}
-
-static void emae_check_authtype(GtkWidget *w, EMAccountEditorService *service);
-
-static void
-emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service)
-{
- EAccount *account = emae->account;
- GtkListStore *store;
- GtkTreeIter iter;
- GtkComboBox *dropdown;
- gint active = 0;
- gint i;
- struct _service_info *info = &emae_service_info[service->type];
- const gchar *uri = e_account_get_string(account, info->account_uri_key);
- GList *l, *ll;
- CamelURL *url = NULL;
-
- dropdown = service->authtype;
- gtk_widget_show((GtkWidget *)dropdown);
-
- store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
-
- if (uri)
- url = camel_url_new(uri, NULL);
-
- if (service->provider) {
- for (i=0, l=service->provider->authtypes; l; l=l->next, i++) {
- CamelServiceAuthType *authtype = l->data;
- gint avail;
-
- /* if we have some already shown */
- if (service->authtypes) {
- for (ll = service->authtypes;ll;ll = g_list_next(ll))
- if (!strcmp(authtype->authproto, ((CamelServiceAuthType *)ll->data)->authproto))
- break;
- avail = ll != NULL;
- } else {
- avail = TRUE;
- }
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, authtype->name, 1, authtype, 2, !avail, -1);
-
- if (url && url->authmech && !strcmp(url->authmech, authtype->authproto))
- active = i;
- }
- }
-
- gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store);
- gtk_combo_box_set_active(dropdown, -1);
-
- if (service->auth_changed_id == 0) {
- GtkCellRenderer *cell = gtk_cell_renderer_text_new();
-
- gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE);
- gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, "strikethrough", 2, NULL);
-
- service->auth_changed_id = g_signal_connect(dropdown, "changed", G_CALLBACK(emae_authtype_changed), service);
- g_signal_connect(service->check_supported, "clicked", G_CALLBACK(emae_check_authtype), service);
- }
-
- gtk_combo_box_set_active(dropdown, active);
-
- if (url)
- camel_url_free(url);
-}
-
-static void emae_check_authtype_done(const gchar *uri, CamelProviderType type, GList *types, gpointer data)
-{
- EMAccountEditorService *service = data;
-
- if (service->check_dialog) {
- if (service->authtypes)
- g_list_free(service->authtypes);
-
- service->authtypes = g_list_copy(types);
- emae_refresh_authtype(service->emae, service);
- gtk_widget_destroy(service->check_dialog);
- }
-
- if (service->emae->editor)
- gtk_widget_set_sensitive(service->emae->editor, TRUE);
-
- service->check_id = -1;
- g_object_unref(service->emae);
-}
-
-static void emae_check_authtype_response(GtkWidget *d, gint button, EMAccountEditorService *service)
-{
- mail_msg_cancel(service->check_id);
- gtk_widget_destroy(service->check_dialog);
- service->check_dialog = NULL;
-
- if (service->emae->editor)
- gtk_widget_set_sensitive(service->emae->editor, TRUE);
-}
-
-static void emae_check_authtype(GtkWidget *w, EMAccountEditorService *service)
-{
- EMAccountEditor *emae = service->emae;
- const gchar *uri;
-
- /* TODO: do we need to remove the auth mechanism from the uri? */
- uri = e_account_get_string(emae->account, emae_service_info[service->type].account_uri_key);
- g_object_ref(emae);
-
- service->check_dialog = e_error_new(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL,
- "mail:checking-service", NULL);
- g_signal_connect(service->check_dialog, "response", G_CALLBACK(emae_check_authtype_response), service);
- gtk_widget_show(service->check_dialog);
- if (emae->editor)
- gtk_widget_set_sensitive(emae->editor, FALSE);
- service->check_id = mail_check_service(uri, service->type, emae_check_authtype_done, service);
-}
-
-static void
-emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, GladeXML *xml)
-{
- struct _service_info *info = &emae_service_info[service->type];
- CamelURL *url = emae_account_url(emae, info->account_uri_key);
- const gchar *uri = e_account_get_string(emae->account, info->account_uri_key);
- const gchar *tmp;
- gint i;
-
- service->provider = uri?camel_provider_get(uri, NULL):NULL;
- service->frame = glade_xml_get_widget(xml, info->frame);
- service->container = glade_xml_get_widget(xml, info->container);
- service->description = GTK_LABEL (glade_xml_get_widget (xml, info->description));
- service->hostname = GTK_ENTRY (glade_xml_get_widget (xml, info->hostname));
- service->hostlabel = (GtkLabel *)glade_xml_get_widget (xml, info->hostlabel);
- service->username = GTK_ENTRY (glade_xml_get_widget (xml, info->username));
- service->userlabel = (GtkLabel *)glade_xml_get_widget (xml, info->userlabel);
- if (info->pathentry) {
- service->pathlabel = (GtkLabel *)glade_xml_get_widget(xml, info->pathlabel);
- service->pathentry = glade_xml_get_widget(xml, info->pathentry);
- }
-
- service->ssl_frame = glade_xml_get_widget (xml, info->security_frame);
- gtk_widget_hide (service->ssl_frame);
- service->ssl_hbox = glade_xml_get_widget (xml, info->ssl_hbox);
- service->use_ssl = (GtkComboBox *)glade_xml_get_widget (xml, info->use_ssl);
- service->no_ssl = glade_xml_get_widget (xml, info->ssl_disabled);
-
- /* configure ui for current settings */
- if (url->host) {
- if (url->port) {
- gchar *host = g_strdup_printf("%s:%d", url->host, url->port);
-
- gtk_entry_set_text(service->hostname, host);
- g_free(host);
- } else
- gtk_entry_set_text(service->hostname, url->host);
- }
- if (url->user && *url->user) {
- gtk_entry_set_text(service->username, url->user);
- }
- if (service->pathentry) {
- GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
-
- if (service->provider && (service->provider->url_flags & CAMEL_URL_NEED_PATH_DIR) == 0)
- action = GTK_FILE_CHOOSER_ACTION_OPEN;
-
- if (action != gtk_file_chooser_get_action (GTK_FILE_CHOOSER (service->pathentry)))
- gtk_file_chooser_set_action (GTK_FILE_CHOOSER (service->pathentry), action);
-
- if (url->path)
- gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (service->pathentry), url->path);
- }
-
- tmp = camel_url_get_param(url, "use_ssl");
- if (tmp == NULL)
- tmp = "never";
-
- for (i=0;i<num_ssl_options;i++) {
- if (!strcmp(ssl_options[i].value, tmp)) {
- gtk_combo_box_set_active(service->use_ssl, i);
- break;
- }
- }
-
- g_signal_connect (service->hostname, "changed", G_CALLBACK (emae_hostname_changed), service);
- g_signal_connect (service->username, "changed", G_CALLBACK (emae_username_changed), service);
- if (service->pathentry)
- g_signal_connect (GTK_FILE_CHOOSER (service->pathentry), "selection-changed", G_CALLBACK (emae_path_changed), service);
-
- g_signal_connect(service->use_ssl, "changed", G_CALLBACK(emae_ssl_changed), service);
-
- service->auth_frame = glade_xml_get_widget(xml, info->auth_frame);
- service->remember = emae_account_toggle(emae, info->remember_password, info->save_passwd_key, xml);
- service->check_supported = (GtkButton *)glade_xml_get_widget(xml, info->authtype_check);
- service->authtype = (GtkComboBox *)glade_xml_get_widget(xml, info->authtype);
- /* old authtype will be destroyed when we exit */
- service->auth_changed_id = 0;
- service->providers = (GtkComboBox *)glade_xml_get_widget(xml, info->type_dropdown);
- emae_refresh_providers(emae, service);
- emae_refresh_authtype(emae, service);
-
- if (info->needs_auth) {
- service->needs_auth = (GtkToggleButton *)glade_xml_get_widget (xml, info->needs_auth);
- gtk_toggle_button_set_active(service->needs_auth, url->authmech != NULL);
- g_signal_connect(service->needs_auth, "toggled", G_CALLBACK(emae_needs_auth), service);
- emae_needs_auth(service->needs_auth, service);
- } else {
- service->needs_auth = NULL;
- }
-
- if (!e_account_writable (emae->account, info->account_uri_key))
- gtk_widget_set_sensitive(service->container, FALSE);
- else
- gtk_widget_set_sensitive(service->container, TRUE);
-
- emae_service_provider_changed(service);
-
- camel_url_free(url);
-}
-
-/* do not re-order these, the order is used by various code to look up emae->priv->identity_entries[] */
-static struct {
- const gchar *name;
- gint item;
-} emae_identity_entries[] = {
- { "management_name", E_ACCOUNT_NAME },
- { "identity_full_name", E_ACCOUNT_ID_NAME },
- { "identity_address", E_ACCOUNT_ID_ADDRESS },
- { "identity_reply_to", E_ACCOUNT_ID_REPLY_TO },
- { "identity_organization", E_ACCOUNT_ID_ORGANIZATION },
-};
-
-/* its a bit obtuse, but its simple */
-static void
-emae_queue_widgets(EMAccountEditor *emae, GladeXML *xml, const gchar *first, ...)
-{
- gint i = 0;
- va_list ap;
-
- va_start(ap, first);
- while (first) {
- emae->priv->widgets_name[i] = first;
- emae->priv->widgets[i++] = glade_xml_get_widget(xml, first);
- first = va_arg(ap, const gchar *);
- }
- va_end(ap);
-
- g_return_if_fail(i < sizeof(emae->priv->widgets)/sizeof(emae->priv->widgets[0]));
-
- emae->priv->widgets[i] = NULL;
- emae->priv->widgets_index = 0;
-}
-
-static GtkWidget *
-emae_identity_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
- EMAccountEditorPrivate *gui = emae->priv;
- EAccount *account = emae->account;
- gint i;
- GtkWidget *w;
- GladeXML *xml;
- gchar *gladefile;
-
- /*if (old)
- return old;*/
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- xml = glade_xml_new(gladefile, item->label, NULL);
- g_free (gladefile);
-
- /* Management & Identity fields, in the druid the management frame is relocated to the last page later on */
- for (i=0;i<sizeof(emae_identity_entries)/sizeof(emae_identity_entries[0]);i++)
- gui->identity_entries[i] = emae_account_entry(emae, emae_identity_entries[i].name, emae_identity_entries[i].item, xml);
-
- gui->management_frame = glade_xml_get_widget(xml, "management_frame");
-
- gui->default_account = GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "management_default"));
- if (!e_get_default_account ()
- || (account == e_get_default_account ())
- || (GPOINTER_TO_INT(g_object_get_data (G_OBJECT (emae->account), "default_flagged"))) )
- gtk_toggle_button_set_active (gui->default_account, TRUE);
-
- if (emae->do_signature) {
- emae_setup_signatures(emae, xml);
- } else {
- /* TODO: this could/should probably be neater */
- gtk_widget_hide(glade_xml_get_widget(xml, "sigLabel"));
-#if 0
- gtk_widget_hide(glade_xml_get_widget(xml, "sigOption"));
-#endif
- gtk_widget_hide(glade_xml_get_widget(xml, "sigAddNew"));
- }
-
- w = glade_xml_get_widget(xml, item->label);
- if (emae->type == EMAE_PAGES) {
- gtk_box_pack_start ((GtkBox *)emae->pages[0], w, TRUE, TRUE, 0);
- } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
- GladeXML *druidxml;
- GtkWidget *page;
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- druidxml = glade_xml_new(gladefile, "identity_page", NULL);
- g_free (gladefile);
-
- page = glade_xml_get_widget(druidxml, "identity_page");
-
- gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0);
- w = page;
- g_object_unref(druidxml);
- gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page);
- } else {
- gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Identity")));
- }
-
- emae_queue_widgets(emae, xml, "account_vbox", "identity_required_table", "identity_optional_table", NULL);
-
- g_object_unref(xml);
-
- return w;
-}
-
-static GtkWidget *
-emae_receive_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
- EMAccountEditorPrivate *gui = emae->priv;
- GtkWidget *w;
- GladeXML *xml;
- gchar *gladefile;
-
- /*if (old)
- return old;*/
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- xml = glade_xml_new(gladefile, item->label, NULL);
- g_free (gladefile);
-
- gui->source.type = CAMEL_PROVIDER_STORE;
- emae_setup_service(emae, &gui->source, xml);
-
- w = glade_xml_get_widget(xml, item->label);
- if (emae->type == EMAE_PAGES) {
- gtk_box_pack_start ((GtkBox *)emae->pages[1], w, TRUE, TRUE, 0);
- } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
- GladeXML *druidxml;
- GtkWidget *page;
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- druidxml = glade_xml_new(gladefile, "source_page", NULL);
- g_free (gladefile);
-
- page = glade_xml_get_widget(druidxml, "source_page");
-
- gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0);
- w = page;
- g_object_unref(druidxml);
- gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page);
- } else {
- gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Receiving Email")));
- }
-
- emae_queue_widgets(emae, xml, "source_type_table", "table4", "vbox181", "vbox179", NULL);
-
- g_object_unref(xml);
-
- return w;
-}
-
-static void
-emae_option_toggle_changed(GtkToggleButton *toggle, EMAccountEditorService *service)
-{
- const gchar *name = g_object_get_data((GObject *)toggle, "option-name");
- GSList *depl = g_object_get_data((GObject *)toggle, "dependent-list");
- gint active = gtk_toggle_button_get_active(toggle);
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
-
- for (;depl;depl = g_slist_next(depl))
- gtk_widget_set_sensitive((GtkWidget *)depl->data, active);
-
- camel_url_set_param(url, name, active?"":NULL);
- emae_uri_changed(service, url);
- camel_url_free(url);
-}
-
-static GtkWidget *
-emae_option_toggle(EMAccountEditorService *service, CamelURL *url, const gchar *text, const gchar *name, gint def)
-{
- GtkWidget *w;
-
- /* FIXME: how do we get the default value ever? */
- w = gtk_check_button_new_with_mnemonic(text);
- g_object_set_data((GObject *)w, "option-name", (gpointer)name);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), camel_url_get_param (url, name) != NULL);
- g_signal_connect(w, "toggled", G_CALLBACK(emae_option_toggle_changed), service);
- gtk_widget_show(w);
-
- return w;
-}
-
-static void
-emae_option_entry_changed(GtkEntry *entry, EMAccountEditorService *service)
-{
- const gchar *name = g_object_get_data((GObject *)entry, "option-name");
- const gchar *text = gtk_entry_get_text(entry);
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
-
- camel_url_set_param(url, name, text && text[0]?text:NULL);
- emae_uri_changed(service, url);
- camel_url_free(url);
-}
-
-static GtkWidget *
-emae_option_entry(EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *def, GtkWidget *l)
-{
- GtkWidget *w;
- const gchar *val = camel_url_get_param(url, name);
-
- if (val == NULL) {
- if (def) {
- val = def;
- camel_url_set_param(url, name, val);
- emae_uri_changed(service, url);
- } else
- val = "";
- }
-
- w = g_object_new(gtk_entry_get_type(),
- "text", val,
- NULL);
- gtk_label_set_mnemonic_widget ((GtkLabel*)l, w);
- g_object_set_data((GObject *)w, "option-name", (gpointer)name);
- g_signal_connect(w, "changed", G_CALLBACK(emae_option_entry_changed), service);
- gtk_widget_show(w);
-
- return w;
-}
-
-static void
-emae_option_checkspin_changed(GtkSpinButton *spin, EMAccountEditorService *service)
-{
- const gchar *name = g_object_get_data((GObject *)spin, "option-name");
- gchar value[16];
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
-
- sprintf(value, "%d", gtk_spin_button_get_value_as_int(spin));
- camel_url_set_param(url, name, value);
- emae_uri_changed(service, url);
- camel_url_free(url);
-}
-
-static void
-emae_option_checkspin_check_changed(GtkToggleButton *toggle, EMAccountEditorService *service)
-{
- const gchar *name = g_object_get_data((GObject *)toggle, "option-name");
- GtkSpinButton *spin = g_object_get_data((GObject *)toggle, "option-target");
-
- if (gtk_toggle_button_get_active(toggle)) {
- gtk_widget_set_sensitive((GtkWidget *)spin, TRUE);
- emae_option_checkspin_changed(spin, service);
- } else {
- CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key);
-
- camel_url_set_param(url, name, NULL);
- gtk_widget_set_sensitive((GtkWidget *)spin, FALSE);
- emae_uri_changed(service, url);
- camel_url_free(url);
- }
-}
-
-/* this is a fugly api */
-static GtkWidget *
-emae_option_checkspin(EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *fmt, const gchar *info)
-{
- GtkWidget *hbox, *check, *spin, *label = NULL;
- double min, def, max;
- gchar *pre, *post;
- const gchar *val;
- gchar on;
- gint enable;
-
- pre = g_alloca(strlen(fmt)+1);
- strcpy(pre, fmt);
- post = strstr(pre, "%s");
- if (post) {
- *post = 0;
- post+=2;
- }
-
- if (sscanf(info, "%c:%lf:%lf:%lf", &on, &min, &def, &max) != 4) {
- min = 0.0;
- def = 0.0;
- max = 1.0;
- }
-
- if ((enable = (val = camel_url_get_param(url, name)) != NULL) )
- def = strtod(val, NULL);
- else
- enable = (on == 'y');
-
- hbox = gtk_hbox_new(FALSE, 0);
- check = g_object_new(gtk_check_button_get_type(), "label", pre, "use_underline", TRUE, "active", enable, NULL);
-
- spin = gtk_spin_button_new((GtkAdjustment *)gtk_adjustment_new(def, min, max, 1, 1, 0), 1, 0);
- if (post)
- label = gtk_label_new_with_mnemonic(post);
- gtk_box_pack_start((GtkBox *)hbox, check, FALSE, TRUE, 0);
- gtk_box_pack_start((GtkBox *)hbox, spin, FALSE, TRUE, 0);
- if (label)
- gtk_box_pack_start((GtkBox *)hbox, label, FALSE, TRUE, 4);
-
- g_object_set_data((GObject *)spin, "option-name", (gpointer)name);
- g_object_set_data((GObject *)check, "option-name", (gpointer)name);
- g_object_set_data((GObject *)check, "option-target", (gpointer)spin);
-
- g_signal_connect(spin, "value_changed", G_CALLBACK(emae_option_checkspin_changed), service);
- g_signal_connect(check, "toggled", G_CALLBACK(emae_option_checkspin_check_changed), service);
-
- gtk_widget_show_all(hbox);
-
- return hbox;
-}
-
-static void
-emae_option_options_changed (GtkComboBox *options, EMAccountEditorService *service)
-{
- const gchar *name = g_object_get_data (G_OBJECT (options), "option-name");
- gchar *value = NULL;
- CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key);
- gint id = gtk_combo_box_get_active (options);
-
- if (id != -1) {
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- model = gtk_combo_box_get_model (options);
- if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) {
- gtk_tree_model_get (model, &iter, 0, &value, -1);
- }
- }
-
- camel_url_set_param (url, name, value);
- emae_uri_changed (service, url);
- camel_url_free (url);
- g_free (value);
-}
-
-/* 'values' is in format "value0:caption0:value2:caption2:...valueN:captionN" */
-static GtkWidget *
-emae_option_options (EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *values, GtkWidget *l)
-{
- GtkComboBox *w;
- GtkListStore *store;
- GtkTreeIter iter;
- const gchar *p, *value, *caption;
- GtkCellRenderer *cell;
- gint active = 0; /* the first item entered is always a default item */
- gint i;
- const gchar *val = camel_url_get_param (url, name);
-
- w = GTK_COMBO_BOX (gtk_combo_box_new ());
-
- /* value and caption */
- store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
-
- p = values;
- for (p = values, i = 0; p; i++) {
- gchar *vl, *cp;
-
- value = p;
- caption = strchr (p, ':');
- if (caption) {
- caption++;
- } else {
- g_warning (G_STRLOC ": expected ':' not found at '%s'", p);
- break;
- }
- p = strchr (caption, ':');
-
- vl = g_strndup (value, caption - value - 1);
- if (p) {
- p++;
- cp = g_strndup (caption, p - caption - 1);
- } else
- cp = g_strdup (caption);
-
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, vl, 1, dgettext (service->provider->translation_domain, cp), -1);
-
- if (val && g_ascii_strcasecmp (val, vl) == 0)
- active = i;
-
- g_free (vl);
- g_free (cp);
- }
-
- gtk_combo_box_set_model (w, (GtkTreeModel *)store);
- gtk_combo_box_set_active (w, i > 0 ? active : -1);
-
- cell = gtk_cell_renderer_text_new ();
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), cell, TRUE);
- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), cell, "text", 1, NULL);
-
- gtk_widget_show (GTK_WIDGET (w));
-
- gtk_label_set_mnemonic_widget (GTK_LABEL (l), GTK_WIDGET (w));
-
- g_object_set_data (G_OBJECT (w), "option-name", (gpointer)name);
- g_signal_connect (w, "changed", G_CALLBACK (emae_option_options_changed), service);
-
- return GTK_WIDGET (w);
-}
-
-static GtkWidget *
-emae_receive_options_item(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
- GtkWidget *w, *box, *spin;
- gint row;
-
- if (emae->priv->source.provider == NULL
- || emae->priv->source.provider->extra_conf == NULL)
- return NULL;
-
- if (old)
- return old;
-
- /* We have to add the automatic mail check item with the rest of the receive options */
- row = ((GtkTable *)parent)->nrows;
-
- box = gtk_hbox_new(FALSE, 4);
- w = gtk_check_button_new_with_mnemonic (_("Check for _new messages every"));
- emae_account_toggle_widget(emae, (GtkToggleButton *)w, E_ACCOUNT_SOURCE_AUTO_CHECK);
- gtk_box_pack_start((GtkBox *)box, w, FALSE, FALSE, 0);
-
- spin = gtk_spin_button_new_with_range(1.0, 1440.0, 1.0);
- emae_account_spinint_widget(emae, (GtkSpinButton *)spin, E_ACCOUNT_SOURCE_AUTO_CHECK_TIME);
- gtk_box_pack_start((GtkBox *)box, spin, FALSE, TRUE, 0);
-
- w = gtk_label_new_with_mnemonic (_("minu_tes"));
- gtk_label_set_mnemonic_widget (GTK_LABEL (w), spin);
- gtk_box_pack_start((GtkBox *)box, w, FALSE, FALSE, 0);
-
- gtk_widget_show_all(box);
-
- gtk_table_attach((GtkTable *)parent, box, 0, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);
-
- return box;
-}
-
-static GtkWidget *
-emae_receive_options_extra_item(EConfig *ec, EConfigItem *eitem, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
- struct _receive_options_item *item = (struct _receive_options_item *)eitem;
- GtkWidget *w, *l, *h;
- CamelProviderConfEntry *entries;
- GtkWidget *depw;
- GSList *depl = NULL, *n;
- EMAccountEditorService *service = &emae->priv->source;
- gint row, i;
- GHashTable *extra;
- CamelURL *url;
-
- if (emae->priv->source.provider == NULL
- || emae->priv->source.provider->extra_conf == NULL)
- return NULL;
-
- entries = emae->priv->source.provider->extra_conf;
- for (i=0;entries && entries[i].type != CAMEL_PROVIDER_CONF_END;i++)
- if (entries[i].type == CAMEL_PROVIDER_CONF_SECTION_START
- && entries[i].name
- && strcmp(entries[i].name, eitem->user_data) == 0)
- goto section;
-
- return NULL;
-section:
- d(printf("Building extra section '%s'\n", eitem->path));
-
- url = emae_account_url(emae, emae_service_info[service->type].account_uri_key);
- item->extra_table = g_hash_table_new(g_str_hash, g_str_equal);
- extra = g_hash_table_new(g_str_hash, g_str_equal);
- row = ((GtkTable *)parent)->nrows;
-
- for (;entries[i].type != CAMEL_PROVIDER_CONF_END && entries[i].type != CAMEL_PROVIDER_CONF_SECTION_END;i++) {
- if (entries[i].depname) {
- depw = g_hash_table_lookup(extra, entries[i].depname);
- if (depw)
- depl = g_object_steal_data((GObject *)depw, "dependent-list");
- } else
- depw = NULL;
-
- switch (entries[i].type) {
- case CAMEL_PROVIDER_CONF_SECTION_START:
- case CAMEL_PROVIDER_CONF_SECTION_END:
- break;
- case CAMEL_PROVIDER_CONF_LABEL:
- /* FIXME: This is a hack for exchange connector, labels should be removed from confentry */
- if (!strcmp(entries[i].name, "hostname"))
- l = (GtkWidget *)emae->priv->source.hostlabel;
- else if (!strcmp(entries[i].name, "username"))
- l = (GtkWidget *)emae->priv->source.userlabel;
- else
- l = NULL;
-
- if (l) {
- gtk_label_set_text_with_mnemonic((GtkLabel *)l, entries[i].text);
- if (depw)
- depl = g_slist_prepend(depl, l);
- }
- break;
- case CAMEL_PROVIDER_CONF_CHECKBOX:
- w = emae_option_toggle(service, url, entries[i].text, entries[i].name, atoi(entries[i].value));
- gtk_table_attach((GtkTable *)parent, w, 0, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);
- g_hash_table_insert(extra, (gpointer)entries[i].name, w);
- if (depw)
- depl = g_slist_prepend(depl, w);
- row++;
- /* HACK: keep_on_server is stored in the e-account, but is displayed as a properly on the uri,
- make sure they track/match here */
- if (!strcmp(entries[i].name, "keep_on_server"))
- emae_account_toggle_widget(emae, (GtkToggleButton *)w, E_ACCOUNT_SOURCE_KEEP_ON_SERVER);
- break;
- case CAMEL_PROVIDER_CONF_ENTRY:
- l = g_object_new(gtk_label_get_type(), "label", entries[i].text, "xalign", 0.0, "use_underline", TRUE, NULL);
- gtk_widget_show(l);
- w = emae_option_entry(service, url, entries[i].name, entries[i].value, l);
- gtk_table_attach((GtkTable *)parent, l, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
- gtk_table_attach((GtkTable *)parent, w, 1, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);
- if (depw) {
- depl = g_slist_prepend(depl, w);
- depl = g_slist_prepend(depl, l);
- }
- row++;
- /* FIXME: this is another hack for exchange/groupwise connector */
- g_hash_table_insert(item->extra_table, (gpointer)entries[i].name, w);
- break;
- case CAMEL_PROVIDER_CONF_CHECKSPIN:
- w = emae_option_checkspin(service, url, entries[i].name, entries[i].text, entries[i].value);
- gtk_table_attach((GtkTable *)parent, w, 0, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);
- if (depw)
- depl = g_slist_prepend(depl, w);
- row++;
- break;
- case CAMEL_PROVIDER_CONF_OPTIONS:
- h = gtk_hbox_new (FALSE, 4);
- gtk_widget_show (h);
- l = g_object_new (gtk_label_get_type (), "label", entries[i].text, "xalign", 0.0, "use_underline", TRUE, NULL);
- gtk_widget_show (l);
- w = emae_option_options (service, url, entries[i].name, entries[i].value, l);
- gtk_box_pack_start (GTK_BOX (h), l, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0);
- gtk_table_attach ((GtkTable *)parent, h, 0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
- if (depw) {
- depl = g_slist_prepend (depl, h);
- }
- row++;
- break;
- default:
- break;
- }
-
- if (depw && depl) {
- gint act = gtk_toggle_button_get_active((GtkToggleButton *)depw);
-
- g_object_set_data_full((GObject *)depw, "dependent-list", depl, (GDestroyNotify)g_slist_free);
- for (n=depl;n;n=g_slist_next(n))
- gtk_widget_set_sensitive((GtkWidget *)n->data, act);
- }
- }
-
- camel_url_free(url);
-
- /* Since EConfig destroys the factory widget when it changes, we
- * need to destroy our own ones as well, and add a dummy item
- * so it knows this section isn't empty */
-
- w = gtk_label_new("");
- gtk_widget_hide(w);
- gtk_table_attach((GtkTable *)parent, w, 0, 2, row, row+1, 0, 0, 0, 0);
-
- return w;
-}
-
-static GtkWidget *
-emae_send_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
- EMAccountEditorPrivate *gui = emae->priv;
- GtkWidget *w;
- GladeXML *xml;
- gchar *gladefile;
-
- /* no transport options page at all for these types of providers */
- if (gui->source.provider && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT(gui->source.provider)) {
- memset(&gui->transport.frame, 0, ((gchar *)&gui->transport.check_dialog)-((gchar *)&gui->transport.frame));
- return NULL;
- }
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- xml = glade_xml_new(gladefile, item->label, NULL);
- g_free (gladefile);
-
- /* Transport */
- gui->transport.type = CAMEL_PROVIDER_TRANSPORT;
- emae_setup_service(emae, &gui->transport, xml);
-
- w = glade_xml_get_widget(xml, item->label);
- if (emae->type == EMAE_PAGES) {
- gtk_box_pack_start ((GtkBox *)emae->pages[2], w, TRUE, TRUE, 0);
- } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
- GladeXML *druidxml;
- GtkWidget *page;
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- druidxml = glade_xml_new(gladefile, "transport_page", NULL);
- g_free (gladefile);
-
- page = glade_xml_get_widget(druidxml, "transport_page");
-
- gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0);
- w = page;
- g_object_unref(druidxml);
- gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page);
- } else {
- gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Sending Email")));
- }
-
- emae_queue_widgets(emae, xml, "transport_type_table", "vbox12", "vbox183", "vbox61", NULL);
-
- g_object_unref(xml);
-
- return w;
-}
-
-static GtkWidget *
-emae_defaults_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
- EMAccountEditorPrivate *gui = emae->priv;
- GtkWidget *w;
- GladeXML *xml;
- gchar *gladefile;
-
- /*if (old)
- return old;*/
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- xml = glade_xml_new(gladefile, item->label, NULL);
- g_free (gladefile);
-
- /* Special folders */
- gui->drafts_folder_button = (GtkButton *)emae_account_folder(emae, "drafts_button", E_ACCOUNT_DRAFTS_FOLDER_URI, E_MAIL_FOLDER_DRAFTS, xml);
- gui->sent_folder_button = (GtkButton *)emae_account_folder(emae, "sent_button", E_ACCOUNT_SENT_FOLDER_URI, E_MAIL_FOLDER_SENT, xml);
-
- /* Special Folders "Reset Defaults" button */
- gui->restore_folders_button = (GtkButton *)glade_xml_get_widget (xml, "default_folders_button");
- g_signal_connect (gui->restore_folders_button, "clicked", G_CALLBACK (default_folders_clicked), emae);
-
- /* Always Cc/Bcc */
- emae_account_toggle(emae, "always_cc", E_ACCOUNT_CC_ALWAYS, xml);
- emae_account_entry(emae, "cc_addrs", E_ACCOUNT_CC_ADDRS, xml);
- emae_account_toggle(emae, "always_bcc", E_ACCOUNT_BCC_ALWAYS, xml);
- emae_account_entry(emae, "bcc_addrs", E_ACCOUNT_BCC_ADDRS, xml);
-
- gtk_widget_set_sensitive((GtkWidget *)gui->drafts_folder_button, e_account_writable(emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI));
-
- gtk_widget_set_sensitive( (GtkWidget *)gui->sent_folder_button,
- e_account_writable(emae->account, E_ACCOUNT_SENT_FOLDER_URI)
- &&
- (emae->priv->source.provider ? !(emae->priv->source.provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER): TRUE)
- );
-
- gtk_widget_set_sensitive((GtkWidget *)gui->restore_folders_button,
- (e_account_writable(emae->account, E_ACCOUNT_SENT_FOLDER_URI)
- && ((emae->priv->source.provider && !( emae->priv->source.provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER))
- || e_account_writable(emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI))));
-
- /* Receipt policy */
- emae_setup_receipt_policy (emae, xml);
-
- w = glade_xml_get_widget(xml, item->label);
- gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Defaults")));
-
- emae_queue_widgets(emae, xml, "vbox184", "table8", NULL);
-
- g_object_unref(xml);
-
- return w;
-}
-
-static GtkWidget *
-emae_security_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
-#if defined (HAVE_NSS)
- EMAccountEditorPrivate *gui = emae->priv;
-#endif
- GtkWidget *w;
- GladeXML *xml;
- gchar *gladefile;
-
- /*if (old)
- return old;*/
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- xml = glade_xml_new(gladefile, item->label, NULL);
- g_free (gladefile);
-
- /* Security */
- emae_account_entry(emae, "pgp_key", E_ACCOUNT_PGP_KEY, xml);
- emae_account_toggle(emae, "pgp_encrypt_to_self", E_ACCOUNT_PGP_ENCRYPT_TO_SELF, xml);
- emae_account_toggle(emae, "pgp_always_sign", E_ACCOUNT_PGP_ALWAYS_SIGN, xml);
- emae_account_toggle(emae, "pgp_no_imip_sign", E_ACCOUNT_PGP_NO_IMIP_SIGN, xml);
- emae_account_toggle(emae, "pgp_always_trust", E_ACCOUNT_PGP_ALWAYS_TRUST, xml);
-
-#if defined (HAVE_NSS)
- /* TODO: this should handle its entry separately? */
- gui->smime_sign_key = emae_account_entry(emae, "smime_sign_key", E_ACCOUNT_SMIME_SIGN_KEY, xml);
- gui->smime_sign_key_select = (GtkButton *)glade_xml_get_widget (xml, "smime_sign_key_select");
- gui->smime_sign_key_clear = (GtkButton *)glade_xml_get_widget (xml, "smime_sign_key_clear");
- g_signal_connect(gui->smime_sign_key_select, "clicked", G_CALLBACK(smime_sign_key_select), emae);
- g_signal_connect(gui->smime_sign_key_clear, "clicked", G_CALLBACK(smime_sign_key_clear), emae);
-
- gui->smime_sign_default = emae_account_toggle(emae, "smime_sign_default", E_ACCOUNT_SMIME_SIGN_DEFAULT, xml);
-
- gui->smime_encrypt_key = emae_account_entry(emae, "smime_encrypt_key", E_ACCOUNT_SMIME_ENCRYPT_KEY, xml);
- gui->smime_encrypt_key_select = (GtkButton *)glade_xml_get_widget (xml, "smime_encrypt_key_select");
- gui->smime_encrypt_key_clear = (GtkButton *)glade_xml_get_widget (xml, "smime_encrypt_key_clear");
- g_signal_connect(gui->smime_encrypt_key_select, "clicked", G_CALLBACK(smime_encrypt_key_select), emae);
- g_signal_connect(gui->smime_encrypt_key_clear, "clicked", G_CALLBACK(smime_encrypt_key_clear), emae);
-
- gui->smime_encrypt_default = emae_account_toggle(emae, "smime_encrypt_default", E_ACCOUNT_SMIME_ENCRYPT_DEFAULT, xml);
- gui->smime_encrypt_to_self = emae_account_toggle(emae, "smime_encrypt_to_self", E_ACCOUNT_SMIME_ENCRYPT_TO_SELF, xml);
- smime_changed(emae);
-#else
- {
- /* Since we don't have NSS, hide the S/MIME config options */
- GtkWidget *frame;
-
- frame = glade_xml_get_widget(xml, "smime_vbox");
- gtk_widget_destroy(frame);
- }
-#endif /* HAVE_NSS */
-
- w = glade_xml_get_widget(xml, item->label);
- gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Security")));
-
- g_object_unref(xml);
-
- return w;
-}
-
-static GtkWidget *
-emae_widget_glade(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
- gint i;
-
- for (i=0;emae->priv->widgets[i];i++)
- if (!strcmp(emae->priv->widgets_name[i], item->label))
- return emae->priv->widgets[i];
-
- g_warning("Mail account widget '%s' not found", item->label);
-
- return NULL;
-}
-
-/* plugin meta-data for "org.gnome.evolution.mail.config.accountEditor" */
-static EMConfigItem emae_editor_items[] = {
- { E_CONFIG_BOOK, (gchar *) "" },
- { E_CONFIG_PAGE, (gchar *) "00.identity", (gchar *) "vboxIdentityBorder", emae_identity_page },
- { E_CONFIG_SECTION, (gchar *) "00.identity/00.name", (gchar *) "account_vbox", emae_widget_glade },
- { E_CONFIG_SECTION_TABLE, (gchar *) "00.identity/10.required", (gchar *) "identity_required_table", emae_widget_glade },
- { E_CONFIG_SECTION_TABLE, (gchar *) "00.identity/20.info", (gchar *) "identity_optional_table", emae_widget_glade },
-
- { E_CONFIG_PAGE, (gchar *) "10.receive", (gchar *) "vboxSourceBorder", emae_receive_page },
- { E_CONFIG_SECTION_TABLE, (gchar *) "10.receive/00.type", (gchar *) "source_type_table", emae_widget_glade },
- { E_CONFIG_SECTION_TABLE, (gchar *) "10.receive/10.config", (gchar *) "table4", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "10.receive/20.security", (gchar *) "vbox181", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "10.receive/30.auth", (gchar *) "vbox179", emae_widget_glade },
-
- /* Most sections for this is auto-generated from the camel config */
- { E_CONFIG_PAGE, (gchar *) "20.receive_options", (gchar *) N_("Receiving Options"), },
- { E_CONFIG_SECTION_TABLE, (gchar *) "20.receive_options/10.mailcheck", (gchar *) N_("Checking for New Messages"), },
- { E_CONFIG_ITEM_TABLE, (gchar *) "20.receive_options/10.mailcheck/00.autocheck", NULL, emae_receive_options_item, },
-
- { E_CONFIG_PAGE, (gchar *) "30.send", (gchar *) "vboxTransportBorder", emae_send_page },
- { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/00.type", (gchar *) "transport_type_table", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "30.send/10.config", (gchar *) "vbox12", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "30.send/20.security", (gchar *) "vbox183", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "30.send/30.auth", (gchar *) "vbox61", emae_widget_glade },
-
- { E_CONFIG_PAGE, (gchar *) "40.defaults", (gchar *) "vboxFoldersBorder", emae_defaults_page },
- { E_CONFIG_SECTION, (gchar *) "40.defaults/00.folders", (gchar *) "vbox184", emae_widget_glade },
- { E_CONFIG_SECTION_TABLE, (gchar *) "40.defaults/10.composing", (gchar *) "table8", emae_widget_glade },
-
- { E_CONFIG_PAGE, (gchar *) "50.security", (gchar *) "vboxSecurityBorder", emae_security_page },
- /* 1x1 table(!) not vbox: { E_CONFIG_SECTION, "50.security/00.gpg", "table19", emae_widget_glade }, */
- /* table not vbox: { E_CONFIG_SECTION, "50.security/10.smime", "smime_table", emae_widget_glade }, */
- { 0 },
-};
-static gboolean emae_editor_items_translated = FALSE;
-
-static GtkWidget *
-emae_management_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMAccountEditor *emae = data;
- EMAccountEditorPrivate *gui = emae->priv;
- GtkWidget *w;
-
- w = gui->management_frame;
- if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) {
- GladeXML *druidxml;
- GtkWidget *page;
- gchar *gladefile;
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- druidxml = glade_xml_new(gladefile, "management_page", NULL);
- g_free (gladefile);
-
- page = glade_xml_get_widget(druidxml, "management_page");
-
- gtk_widget_reparent(w, ((GnomeDruidPageStandard *)page)->vbox);
- w = page;
- g_object_unref(druidxml);
- gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page);
- }
-
- return w;
-}
-
-static GtkWidget *
-emae_widget_druid_glade(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- GladeXML *druidxml;
- GtkWidget *w;
- gchar *gladefile;
- EMAccountEditor *emae = (EMAccountEditor *)data;
-
- if (emae->type == EMAE_PAGES)
- return NULL;
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- druidxml = glade_xml_new(gladefile, item->label, NULL);
- g_free (gladefile);
-
- w = glade_xml_get_widget(druidxml, item->label);
- /* i think the glade file has issues, we need to show all on at least the end page */
- gtk_widget_show_all(w);
- g_object_unref(druidxml);
-
- gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)w);
-
- return w;
-}
-
-/* plugin meta-data for "org.gnome.evolution.mail.config.accountDruid" */
-static EMConfigItem emae_druid_items[] = {
- { E_CONFIG_DRUID, (gchar *) "" },
- { E_CONFIG_PAGE_START, (gchar *) "0.start", (gchar *) "start_page", emae_widget_druid_glade },
-
- { E_CONFIG_PAGE, (gchar *) "00.identity", (gchar *) "vboxIdentityBorder", emae_identity_page },
- { E_CONFIG_SECTION, (gchar *) "00.identity/00.name", (gchar *) "account_vbox", emae_widget_glade },
- { E_CONFIG_SECTION_TABLE, (gchar *) "00.identity/10.required", (gchar *) "identity_required_table", emae_widget_glade },
- { E_CONFIG_SECTION_TABLE, (gchar *) "00.identity/20.info", (gchar *) "identity_optional_table", emae_widget_glade },
-
- { E_CONFIG_PAGE, (gchar *) "10.receive", (gchar *) "vboxSourceBorder", emae_receive_page },
- { E_CONFIG_SECTION_TABLE, (gchar *) "10.receive/00.type", (gchar *) "source_type_table", emae_widget_glade },
- { E_CONFIG_SECTION_TABLE, (gchar *) "10.receive/10.config", (gchar *) "table4", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "10.receive/20.security", (gchar *) "vbox181", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "10.receive/30.auth", (gchar *) "vbox179", emae_widget_glade },
-
- /* Most sections for this is auto-generated fromt the camel config */
- { E_CONFIG_PAGE, (gchar *) "20.receive_options", (gchar *) N_("Receiving Options"), },
- { E_CONFIG_SECTION_TABLE, (gchar *) "20.receive_options/10.mailcheck", (gchar *) N_("Checking for New Messages"), },
- { E_CONFIG_ITEM_TABLE, (gchar *) "20.receive_options/10.mailcheck/00.autocheck", NULL, emae_receive_options_item, },
-
- { E_CONFIG_PAGE, (gchar *) "30.send", (gchar *) "vboxTransportBorder", emae_send_page },
- { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/00.type", (gchar *) "transport_type_table", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "30.send/10.config", (gchar *) "vbox12", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "30.send/20.security", (gchar *) "vbox183", emae_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "30.send/30.auth", (gchar *) "vbox61", emae_widget_glade },
-
- { E_CONFIG_PAGE, (gchar *) "40.management", (gchar *) "management_frame", emae_management_page },
-
- { E_CONFIG_PAGE_FINISH, (gchar *) "999.end", (gchar *) "finish_page", emae_widget_druid_glade },
- { 0 },
-};
-static gboolean emae_druid_items_translated = FALSE;
-
-static void
-emae_free(EConfig *ec, GSList *items, gpointer data)
-{
- g_slist_free(items);
-}
-
-static void
-emae_free_auto(EConfig *ec, GSList *items, gpointer data)
-{
- GSList *l, *n;
-
- for (l=items;l;) {
- struct _receive_options_item *item = l->data;
-
- n = g_slist_next(l);
- g_free(item->item.path);
- if (item->extra_table)
- g_hash_table_destroy(item->extra_table);
- g_free(item);
- g_slist_free_1(l);
- l = n;
- }
-}
-
-static gboolean
-emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service)
-{
- CamelURL *url;
- gint ok = TRUE;
- const gchar *uri;
-
- if (service->provider == NULL)
- return TRUE;
-
- uri = e_account_get_string(emae->account, emae_service_info[service->type].account_uri_key);
- if (uri == NULL || (url = camel_url_new(uri, NULL)) == NULL)
- return FALSE;
-
- if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)) {
- if (url->host == NULL || url->host[0] == 0)
- ok = FALSE;
- }
- /* We only need the user if the service needs auth as well, i think */
- if (ok
- && (service->needs_auth == NULL
- || CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_AUTH)
- || gtk_toggle_button_get_active(service->needs_auth))
- && CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_USER)
- && (url->user == NULL || url->user[0] == 0))
- ok = FALSE;
-
- if (ok
- && CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_PATH)
- && (url->path == NULL || url->path[0] == 0))
- ok = FALSE;
-
- camel_url_free(url);
-
- return ok;
-}
-
-enum {
- GMAIL = 0,
- YAHOO,
- AOL
-};
-struct _server_prefill {
- const gchar *key;
- const gchar *recv;
- const gchar *send;
- const gchar *proto;
- const gchar *ssl;
-} mail_servers [] = {
- {"gmail", "imap.gmail.com", "smtp.gmail.com", "imap", "always"},
- {"yahoo", "pop3.yahoo.com", "smtp.yahoo.com", "pop", "never"},
- {"aol", "imap.aol.com", "smtp.aol.com", "pop", "never"},
- {"msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop", "never"}
-};
-
-static gint
-check_servers (gchar *server)
-{
- gint len = G_N_ELEMENTS(mail_servers), i;
-
- for (i=0; i<len; i++) {
- if (strstr(server, mail_servers[i].key) != NULL)
- return i;
- }
-
- return -1;
-}
-
-static gboolean
-emae_check_complete(EConfig *ec, const gchar *pageid, gpointer data)
-{
- EMAccountEditor *emae = data;
- gint ok = TRUE;
- const gchar *tmp;
- EAccount *ea;
- gboolean refresh = FALSE;
-
- /* We use the page-check of various pages to 'prepare' or
- pre-load their values, only in the druid */
- if (pageid
- && ((EConfig *)emae->priv->config)->type == E_CONFIG_DRUID) {
- if (!strcmp(pageid, "00.identity")) {
- if (!emae->priv->identity_set) {
- gchar *uname;
-
- emae->priv->identity_set = 1;
-#ifndef G_OS_WIN32
- uname = g_locale_to_utf8(g_get_real_name(), -1, NULL, NULL, NULL);
-#else
- uname = g_strdup(g_get_real_name());
-#endif
- if (uname) {
- gtk_entry_set_text(emae->priv->identity_entries[1], uname);
- g_free(uname);
- }
- }
- } else if (!strcmp(pageid, "10.receive")) {
- if (!emae->priv->receive_set) {
- gchar *user, *at;
- gint index;
- gchar *uri = g_strdup(e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL));
- CamelURL *url;
-
- emae->priv->receive_set = 1;
- tmp = (gchar *)e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS);
- at = strchr(tmp, '@');
- user = g_alloca(at-tmp+1);
- memcpy(user, tmp, at-tmp);
- user[at-tmp] = 0;
- at++;
-
- index = check_servers(at);
- gtk_entry_set_text(emae->priv->source.username, user);
- gtk_entry_set_text(emae->priv->transport.username, user);
- if (uri && (url = camel_url_new(uri, NULL)) != NULL) {
- refresh = TRUE;
- camel_url_set_protocol(url, mail_servers[index].proto);
- camel_url_set_param(url, "use_ssl", mail_servers[index].ssl);
- camel_url_set_host (url, mail_servers[index].recv);
- camel_url_set_user (url, user);
- gtk_entry_set_text(emae->priv->source.hostname, mail_servers[index].recv);
- gtk_entry_set_text(emae->priv->transport.hostname, mail_servers[index].send);
- uri = camel_url_to_string(url, 0);
- e_account_set_string(emae->account, E_ACCOUNT_SOURCE_URL, uri);
-
- g_free(uri);
- camel_url_free(url);
- }
-
- }
- } else if (!strcmp(pageid, "30.send")) {
- CamelURL *url;
- gchar *at, *user;
- gint index;
- gchar *uri = (gchar *)e_account_get_string(emae->account, E_ACCOUNT_TRANSPORT_URL);
-
- tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS);
- at = strchr(tmp, '@');
- user = g_alloca(at-tmp+1);
- memcpy(user, tmp, at-tmp);
- user[at-tmp] = 0;
- at++;
-
- index = check_servers(at);
- if (uri && (url = camel_url_new(uri, NULL)) != NULL) {
- refresh = TRUE;
- camel_url_set_protocol (url, "smtp");
- camel_url_set_param(url, "use_ssl", mail_servers[index].ssl);
- camel_url_set_host (url, mail_servers[index].send);
- camel_url_set_user (url, user);
- uri = camel_url_to_string(url, 0);
- e_account_set_string(emae->account, E_ACCOUNT_TRANSPORT_URL, uri);
- g_free(uri);
- camel_url_free(url);
- } else {
- g_warning("buz2\n");
- }
-
- } else if (!strcmp(pageid, "20.receive_options")) {
- if (emae->priv->source.provider
- && emae->priv->extra_provider != emae->priv->source.provider) {
- emae->priv->extra_provider = emae->priv->source.provider;
- emae_auto_detect(emae);
- }
- } else if (!strcmp(pageid, "40.management")) {
- if (!emae->priv->management_set) {
- gchar *template;
- guint i = 0, len;
-
- emae->priv->management_set = 1;
- tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS);
- len = strlen(tmp);
- template = alloca(len + 14);
- strcpy(template, tmp);
- while (e_get_account_by_name (template))
- sprintf(template + len, " (%d)", i++);
-
- gtk_entry_set_text(emae->priv->identity_entries[0], template);
- }
- }
- }
-
- /*
- Setting a flag on the Account if it is marked as default. It is done in this way instead of
- using a temporary variable so as to keep track of which account is marked as default in case of
- editing multiple accounts at a time
- */
- if (gtk_toggle_button_get_active(emae->priv->default_account))
- g_object_set_data (G_OBJECT (emae->account), "default_flagged", GINT_TO_POINTER(1));
-
- if (pageid == NULL || !strcmp(pageid, "00.identity")) {
- /* TODO: check the account name is set, and unique in the account list */
- ok = (tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_NAME))
- && tmp[0]
- && (tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS))
- && is_email(tmp)
- && ((tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_REPLY_TO)) == NULL
- || tmp[0] == 0
- || is_email(tmp));
- if (!ok) {
- d(printf("identity incomplete\n"));
- }
- }
-
- if (ok && (pageid == NULL || !strcmp(pageid, "10.receive"))) {
- if (emae->type == EMAE_PAGES && refresh) {
- emae_refresh_providers(emae, &emae->priv->source);
- }
- ok = emae_service_complete(emae, &emae->priv->source);
- if (!ok) {
- d(printf("receive page incomplete\n"));
- }
- }
-
- if (ok && (pageid == NULL || !strcmp(pageid, "30.send"))) {
- if (emae->type == EMAE_PAGES && refresh) {
- emae_refresh_providers(emae, &emae->priv->transport);
- }
- ok = emae_service_complete(emae, &emae->priv->transport);
- if (!ok) {
- d(printf("send page incomplete\n"));
- }
- }
-
- if (ok && (pageid == NULL || !strcmp(pageid, "40.management"))) {
- ok = (tmp = e_account_get_string(emae->account, E_ACCOUNT_NAME))
- && tmp[0]
- && ((ea = e_get_account_by_name (tmp)) == NULL
- || ea == emae->original);
- if (!ok) {
- d(printf("management page incomplete\n"));
- }
- }
-
- return ok;
-}
-
-void
-em_account_editor_check (EMAccountEditor *emae, const gchar *page)
-{
- emae_check_complete((EConfig *)emae->config, page, emae);
-}
-
-/* HACK: FIXME: the component should listen to the account object directly */
-static void
-add_new_store (gchar *uri, CamelStore *store, gpointer user_data)
-{
-#if 0 /* KILL-BONOBO: Try to actually fix this? */
- MailComponent *component = mail_component_peek ();
- EAccount *account = user_data;
-
- if (store == NULL)
- return;
-
- mail_component_add_store (component, store, account->name);
-#endif
-}
-
-static void
-emae_commit(EConfig *ec, GSList *items, gpointer data)
-{
- EMAccountEditor *emae = data;
- EAccountList *accounts = e_get_account_list ();
- EAccount *account;
-
- /* the mail-config*acconts* api needs a lot of work */
-
- if (emae->original) {
- d(printf("Committing account '%s'\n", e_account_get_string(emae->account, E_ACCOUNT_NAME)));
- e_account_import(emae->original, emae->account);
- account = emae->original;
- e_account_list_change(accounts, account);
- } else {
- d(printf("Adding new account '%s'\n", e_account_get_string(emae->account, E_ACCOUNT_NAME)));
- e_account_list_add(accounts, emae->account);
- account = emae->account;
-
- /* HACK: this will add the account to the folder tree.
- We should just be listening to the account list directly for changed events */
- if (account->enabled
- && emae->priv->source.provider
- && (emae->priv->source.provider->flags & CAMEL_PROVIDER_IS_STORAGE))
- mail_get_store(e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL), NULL, add_new_store, account);
- }
-
- if (gtk_toggle_button_get_active(emae->priv->default_account))
- e_account_list_set_default(accounts, account);
-
- e_account_list_save(accounts);
-}
-
-void
-em_account_editor_commit (EMAccountEditor *emae)
-{
- emae_commit ((EConfig *)emae->config, NULL, emae);
-}
-
-static void
-emae_editor_destroyed(GtkWidget *dialog, EMAccountEditor *emae)
-{
- emae->editor = NULL;
- g_object_unref(emae);
-}
-
-static void
-em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account_editor_t type, const gchar *id)
-{
- EMAccountEditorPrivate *gui = emae->priv;
- gint i, index;
- GSList *l;
- GList *prov;
- EMConfig *ec;
- EMConfigTargetAccount *target;
- GHashTable *have;
- EConfigItem *items;
-
- emae->type = type;
- emae->original = account;
- if (emae->original) {
- gchar *xml;
-
- g_object_ref(emae->original);
- xml = e_account_to_xml(emae->original);
- emae->account = e_account_new_from_xml(xml);
- g_free(xml);
-
- emae->do_signature = TRUE;
- } else {
- /* TODO: have a get_default_account thing?? */
- emae->account = e_account_new();
- emae->account->enabled = TRUE;
-
- e_account_set_string (
- emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI,
- e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS));
-
- e_account_set_string (
- emae->account, E_ACCOUNT_SENT_FOLDER_URI,
- e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT));
- }
-
- /* sort the providers, remote first */
- gui->providers = g_list_sort(camel_provider_list(TRUE), (GCompareFunc)provider_compare);
-
- if (type == EMAE_NOTEBOOK) {
- ec = em_config_new(E_CONFIG_BOOK, id);
- items = emae_editor_items;
- if (!emae_editor_items_translated) {
- for (i=0;items[i].path;i++) {
- if (items[i].label)
- items[i].label = gettext(items[i].label);
- }
- emae_editor_items_translated = TRUE;
- }
- } else {
- ec = em_config_new(E_CONFIG_DRUID, id);
- items = emae_druid_items;
- if (!emae_druid_items_translated) {
- for (i=0;items[i].path;i++) {
- if (items[i].label)
- items[i].label = _(items[i].label);
- }
- emae_druid_items_translated = TRUE;
- }
- }
-
- emae->config = gui->config = ec;
- l = NULL;
- for (i=0;items[i].path;i++)
- l = g_slist_prepend(l, &items[i]);
- e_config_add_items((EConfig *)ec, l, emae_commit, NULL, emae_free, emae);
-
- /* This is kinda yuck, we're dynamically mapping from the 'old style' extensibility api to the new one */
- l = NULL;
- have = g_hash_table_new(g_str_hash, g_str_equal);
- index = 20;
- for (prov=gui->providers;prov;prov=g_list_next(prov)) {
- CamelProviderConfEntry *entries = ((CamelProvider *)prov->data)->extra_conf;
-
- for (i=0;entries && entries[i].type != CAMEL_PROVIDER_CONF_END;i++) {
- struct _receive_options_item *item;
- const gchar *name = entries[i].name;
- gint myindex = index;
-
- if (entries[i].type != CAMEL_PROVIDER_CONF_SECTION_START
- || name == NULL
- || g_hash_table_lookup(have, name))
- continue;
-
- /* override mailcheck since we also insert our own mailcheck item at this index */
- if (name && !strcmp(name, "mailcheck"))
- myindex = 10;
-
- item = g_malloc0(sizeof(*item));
- item->item.type = E_CONFIG_SECTION_TABLE;
- item->item.path = g_strdup_printf("20.receive_options/%02d.%s", myindex, name?name:"unnamed");
- item->item.label = g_strdup (entries[i].text);
-
- l = g_slist_prepend(l, item);
-
- item = g_malloc0(sizeof(*item));
- item->item.type = E_CONFIG_ITEM_TABLE;
- item->item.path = g_strdup_printf("20.receive_options/%02d.%s/80.camelitem", myindex, name?name:"unnamed");
- item->item.factory = emae_receive_options_extra_item;
- item->item.user_data = g_strdup (entries[i].name);
-
- l = g_slist_prepend(l, item);
-
- index += 10;
- g_hash_table_insert(have, (gpointer)entries[i].name, have);
- }
- }
- g_hash_table_destroy(have);
- e_config_add_items((EConfig *)ec, l, NULL, NULL, emae_free_auto, emae);
- gui->extra_items = l;
-
- e_config_add_page_check((EConfig *)ec, NULL, emae_check_complete, emae);
-
- target = em_config_target_new_account(ec, emae->account);
- e_config_set_target((EConfig *)ec, (EConfigTarget *)target);
-
- if (type != EMAE_PAGES) {
- emae->editor = e_config_create_window((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant"));
- g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae);
- } else {
- e_config_create_widget((EConfig *)ec);
- }
-}
diff --git a/mail/em-account-editor.h b/mail/em-account-editor.h
deleted file mode 100644
index d8d96f58f0..0000000000
--- a/mail/em-account-editor.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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/>
- *
- *
- * Authors:
- * Jeffrey Stedfast <fejj@ximian.com>
- * Dan Winship <danw@ximian.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef EM_ACCOUNT_EDITOR_H
-#define EM_ACCOUNT_EDITOR_H
-
-#include <gtk/gtk.h>
-
-#include <mail/em-config.h>
-
-G_BEGIN_DECLS
-
-typedef struct _EMAccountEditor EMAccountEditor;
-typedef struct _EMAccountEditorClass EMAccountEditorClass;
-typedef struct _EMAccountEditorPrivate EMAccountEditorPrivate;
-
-typedef enum {
- EMAE_NOTEBOOK,
- EMAE_DRUID,
- EMAE_PAGES
-} em_account_editor_t;
-
-struct _EMAccountEditor {
- GObject gobject;
-
- EMAccountEditorPrivate *priv;
-
- em_account_editor_t type;
- GtkWidget *editor; /* gtknotebook or druid, depending on type */
-
- EMConfig *config; /* driver object */
-
- EAccount *account; /* working account, must instant apply to this */
- EAccount *original; /* original account, not changed unless commit is invoked */
-
- GtkWidget **pages; /* Pages for Anjal's page type editor */
-
- guint do_signature:1; /* allow editing signature */
-};
-
-struct _EMAccountEditorClass {
- GObjectClass gobject_class;
-};
-
-GType em_account_editor_get_type(void);
-
-EMAccountEditor *em_account_editor_new(EAccount *account, em_account_editor_t type, const gchar *id);
-EMAccountEditor *em_account_editor_new_for_pages(EAccount *account, em_account_editor_t type, gchar *id, GtkWidget **pages);
-void em_account_editor_commit (EMAccountEditor *emae);
-void em_account_editor_check (EMAccountEditor *emae, const gchar *page);
-
-gboolean em_account_editor_save (EMAccountEditor *gui);
-void em_account_editor_destroy (EMAccountEditor *gui);
-
-gboolean em_account_editor_identity_complete (EMAccountEditor *gui, GtkWidget **incomplete);
-gboolean em_account_editor_source_complete (EMAccountEditor *gui, GtkWidget **incomplete);
-gboolean em_account_editor_transport_complete (EMAccountEditor *gui, GtkWidget **incomplete);
-gboolean em_account_editor_management_complete (EMAccountEditor *gui, GtkWidget **incomplete);
-
-void em_account_editor_build_extra_conf (EMAccountEditor *gui, const gchar *url);
-
-void em_account_editor_auto_detect_extra_conf (EMAccountEditor *gui);
-
-G_END_DECLS
-
-#endif /* EM_ACCOUNT_EDITOR_H */
diff --git a/mail/em-account-prefs.c b/mail/em-account-prefs.c
deleted file mode 100644
index f2c646d5ed..0000000000
--- a/mail/em-account-prefs.c
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * em-account-prefs.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-/* XXX EAccountManager handles all the user interface stuff. This subclass
- * applies policies using mailer resources that EAccountManager does not
- * have access to. The desire is to someday move account management
- * completely out of the mailer, perhaps to evolution-data-server. */
-
-#include "em-account-prefs.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <camel/camel-url.h>
-
-#include <glib/gi18n.h>
-
-#include "e-util/e-error.h"
-
-#include "e-mail-store.h"
-#include "em-config.h"
-#include "em-account-editor.h"
-
-#define EM_ACCOUNT_PREFS_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE \
- ((obj), EM_TYPE_ACCOUNT_PREFS, EMAccountPrefsPrivate))
-
-struct _EMAccountPrefsPrivate {
- gpointer druid; /* weak pointer */
- gpointer editor; /* weak pointer */
-};
-
-static gpointer parent_class;
-
-static void
-account_prefs_enable_account_cb (EAccountTreeView *tree_view)
-{
- EAccount *account;
-
- account = e_account_tree_view_get_selected (tree_view);
- g_return_if_fail (account != NULL);
-
- e_mail_store_add_by_uri (account->source->url, account->name);
-}
-
-static void
-account_prefs_disable_account_cb (EAccountTreeView *tree_view)
-{
- EAccountList *account_list;
- EAccount *account;
- gpointer parent;
- gint response;
-
- account = e_account_tree_view_get_selected (tree_view);
- g_return_if_fail (account != NULL);
-
- account_list = e_account_tree_view_get_account_list (tree_view);
- g_return_if_fail (account_list != NULL);
-
- if (!e_account_list_account_has_proxies (account_list, account))
- return;
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (tree_view));
- parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
-
- response = e_error_run (
- parent, "mail:ask-delete-proxy-accounts", NULL);
-
- if (response != GTK_RESPONSE_YES) {
- g_signal_stop_emission_by_name (tree_view, "disable-account");
- return;
- }
-
- e_account_list_remove_account_proxies (account_list, account);
-
- e_mail_store_remove_by_uri (account->source->url);
-}
-
-static void
-account_prefs_add_account (EAccountManager *manager)
-{
- EMAccountPrefsPrivate *priv;
- EMAccountEditor *emae;
- gpointer parent;
-
- priv = EM_ACCOUNT_PREFS_GET_PRIVATE (manager);
-
- if (priv->druid != NULL) {
- gtk_window_present (GTK_WINDOW (priv->druid));
- return;
- }
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (manager));
- parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
-
- /** @HookPoint-EMConfig: New Mail Account Druid
- * @Id: org.gnome.evolution.mail.config.accountDruid
- * @Type: E_CONFIG_DRUID
- * @Class: org.gnome.evolution.mail.config:1.0
- * @Target: EMConfigTargetAccount
- *
- * The new mail account druid.
- */
- emae = em_account_editor_new (
- NULL, EMAE_DRUID,
- "org.gnome.evolution.mail.config.accountDruid");
- priv->druid = emae->editor;
-
- g_object_add_weak_pointer (G_OBJECT (priv->druid), &priv->druid);
- gtk_window_set_transient_for (GTK_WINDOW (priv->druid), parent);
- gtk_widget_show (priv->druid);
-}
-
-static void
-account_prefs_edit_account (EAccountManager *manager)
-{
- EMAccountPrefsPrivate *priv;
- EMAccountEditor *emae;
- EAccountTreeView *tree_view;
- EAccountList *account_list;
- EAccount *account;
- gpointer parent;
-
- priv = EM_ACCOUNT_PREFS_GET_PRIVATE (manager);
-
- if (priv->editor != NULL) {
- gtk_window_present (GTK_WINDOW (priv->editor));
- return;
- }
-
- account_list = e_account_manager_get_account_list (manager);
- tree_view = e_account_manager_get_tree_view (manager);
- account = e_account_tree_view_get_selected (tree_view);
- g_return_if_fail (account != NULL);
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (manager));
- parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
-
- /** @HookPoint-EMConfig: Mail Account Editor
- * @Id: org.gnome.evolution.mail.config.accountEditor
- * @Type: E_CONFIG_BOOK
- * @Class: org.gnome.evolution.mail.config:1.0
- * @Target: EMConfigTargetAccount
- *
- * The account editor window.
- */
- emae = em_account_editor_new (
- account, EMAE_NOTEBOOK,
- "org.gnome.evolution.mail.config.accountEditor");
- priv->editor = emae->editor;
-
- g_object_add_weak_pointer (G_OBJECT (priv->editor), &priv->editor);
- gtk_window_set_transient_for (GTK_WINDOW (priv->editor), parent);
- gtk_widget_show (priv->editor);
-}
-
-static void
-account_prefs_delete_account (EAccountManager *manager)
-{
- EMAccountPrefsPrivate *priv;
- EAccountTreeView *tree_view;
- EAccountList *account_list;
- EAccount *account;
- gboolean has_proxies;
- gpointer parent;
- gint response;
-
- priv = EM_ACCOUNT_PREFS_GET_PRIVATE (manager);
-
- account_list = e_account_manager_get_account_list (manager);
- tree_view = e_account_manager_get_tree_view (manager);
- account = e_account_tree_view_get_selected (tree_view);
- g_return_if_fail (account != NULL);
-
- /* Make sure we aren't editing anything... */
- if (priv->editor != NULL)
- return;
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (manager));
- parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
-
- has_proxies =
- e_account_list_account_has_proxies (account_list, account);
-
- response = e_error_run (
- parent, has_proxies ?
- "mail:ask-delete-account-with-proxies" :
- "mail:ask-delete-account", NULL);
-
- if (response != GTK_RESPONSE_YES) {
- g_signal_stop_emission_by_name (manager, "delete-account");
- return;
- }
-
- /* Remove the account from the folder tree. */
- if (account->enabled && account->source && account->source->url)
- e_mail_store_remove_by_uri (account->source->url);
-
- /* Remove all the proxies the account has created. */
- if (has_proxies)
- e_account_list_remove_account_proxies (account_list, account);
-
- /* Remove it from the config file. */
- e_account_list_remove (account_list, account);
-
- e_account_list_save (account_list);
-}
-
-static void
-account_prefs_dispose (GObject *object)
-{
- EMAccountPrefsPrivate *priv;
-
- priv = EM_ACCOUNT_PREFS_GET_PRIVATE (object);
-
- if (priv->druid != NULL) {
- g_object_remove_weak_pointer (
- G_OBJECT (priv->druid), &priv->druid);
- priv->druid = NULL;
- }
-
- if (priv->editor != NULL) {
- g_object_remove_weak_pointer (
- G_OBJECT (priv->editor), &priv->editor);
- priv->editor = NULL;
- }
-
- /* Chain up to parent's dispose() method. */
- G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-account_prefs_class_init (EMAccountPrefsClass *class)
-{
- GObjectClass *object_class;
- EAccountManagerClass *account_manager_class;
-
- parent_class = g_type_class_peek_parent (class);
- g_type_class_add_private (class, sizeof (EMAccountPrefsPrivate));
-
- object_class = G_OBJECT_CLASS (class);
- object_class->dispose = account_prefs_dispose;
-
- account_manager_class = E_ACCOUNT_MANAGER_CLASS (class);
- account_manager_class->add_account = account_prefs_add_account;
- account_manager_class->edit_account = account_prefs_edit_account;
- account_manager_class->delete_account = account_prefs_delete_account;
-}
-
-static void
-account_prefs_init (EMAccountPrefs *prefs)
-{
- EAccountManager *manager;
- EAccountTreeView *tree_view;
-
- prefs->priv = EM_ACCOUNT_PREFS_GET_PRIVATE (prefs);
-
- manager = E_ACCOUNT_MANAGER (prefs);
- tree_view = e_account_manager_get_tree_view (manager);
-
- g_signal_connect (
- tree_view, "enable-account",
- G_CALLBACK (account_prefs_enable_account_cb), NULL);
-
- g_signal_connect (
- tree_view, "disable-account",
- G_CALLBACK (account_prefs_disable_account_cb), NULL);
-}
-
-GType
-em_account_prefs_get_type (void)
-{
- static GType type = 0;
-
- if (G_UNLIKELY (type == 0)) {
- static const GTypeInfo type_info = {
- sizeof (EMAccountPrefsClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) account_prefs_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EMAccountPrefs),
- 0, /* n_preallocs */
- (GInstanceInitFunc) account_prefs_init,
- NULL /* value_table */
- };
-
- type = g_type_register_static (
- E_TYPE_ACCOUNT_MANAGER, "EMAccountPrefs",
- &type_info, 0);
- }
-
- return type;
-}
-
-GtkWidget *
-em_account_prefs_new (EAccountList *account_list)
-{
- g_return_val_if_fail (E_IS_ACCOUNT_LIST (account_list), NULL);
-
- return g_object_new (
- EM_TYPE_ACCOUNT_PREFS, "account-list", account_list, NULL);
-}
diff --git a/mail/em-account-prefs.h b/mail/em-account-prefs.h
deleted file mode 100644
index 82df8fa941..0000000000
--- a/mail/em-account-prefs.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * em-account-prefs.h
- *
- * 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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef EM_ACCOUNT_PREFS_H
-#define EM_ACCOUNT_PREFS_H
-
-#include <gtk/gtk.h>
-#include <table/e-table.h>
-#include <libedataserver/e-account-list.h>
-#include <misc/e-account-manager.h>
-
-/* Standard GObject macros */
-#define EM_TYPE_ACCOUNT_PREFS \
- (em_account_prefs_get_type ())
-#define EM_ACCOUNT_PREFS(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), EM_TYPE_ACCOUNT_PREFS, EMAccountPrefs))
-#define EM_ACCOUNT_PREFS_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), EM_TYPE_ACCOUNT_PREFS, EMAccountPrefsClass))
-#define EM_IS_ACCOUNT_PREFS(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), EM_TYPE_ACCOUNT_PREFS))
-#define EM_IS_ACCOUNT_PREFS_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_TYPE \
- ((cls), EM_TYPE_ACCOUNT_PREFS))
-#define EM_ACCOUNT_PREFS_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS \
- ((obj), EM_TYPE_ACCOUNT_PREFS, EMAccountPrefsClass))
-
-G_BEGIN_DECLS
-
-typedef struct _EMAccountPrefs EMAccountPrefs;
-typedef struct _EMAccountPrefsClass EMAccountPrefsClass;
-typedef struct _EMAccountPrefsPrivate EMAccountPrefsPrivate;
-
-struct _EMAccountPrefs {
- EAccountManager parent;
- EMAccountPrefsPrivate *priv;
-};
-
-struct _EMAccountPrefsClass {
- EAccountManagerClass parent_class;
-};
-
-GType em_account_prefs_get_type (void);
-GtkWidget * em_account_prefs_new (EAccountList *account_list);
-
-G_END_DECLS
-
-#endif /* EM_ACCOUNT_PREFS_H */
diff --git a/mail/em-composer-prefs.c b/mail/em-composer-prefs.c
deleted file mode 100644
index d87bb37ffb..0000000000
--- a/mail/em-composer-prefs.c
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * 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/>
- *
- *
- * Authors:
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include "e-util/e-binding.h"
-#include "e-util/e-signature-utils.h"
-#include "e-util/gconf-bridge.h"
-
-#include "em-composer-prefs.h"
-#include "composer/e-msg-composer.h"
-
-#include <camel/camel-iconv.h>
-
-#include <misc/e-gui-utils.h>
-
-#include <glib/gi18n.h>
-#include <glib/gstdio.h>
-
-#include <gtkhtml/gtkhtml.h>
-#include <editor/gtkhtml-spell-language.h>
-
-#include "misc/e-charset-picker.h"
-#include "misc/e-signature-manager.h"
-#include "misc/e-signature-preview.h"
-#include "e-util/e-error.h"
-#include "e-util/e-util-private.h"
-
-#include "mail-config.h"
-#include "e-signature-editor.h"
-#include "em-config.h"
-
-static gpointer parent_class;
-
-static gboolean
-transform_color_to_string (const GValue *src_value,
- GValue *dst_value,
- gpointer user_data)
-{
- const GdkColor *color;
- gchar *string;
-
- color = g_value_get_boxed (src_value);
- string = gdk_color_to_string (color);
- g_value_set_string (dst_value, string);
- g_free (string);
-
- return TRUE;
-}
-
-static gboolean
-transform_string_to_color (const GValue *src_value,
- GValue *dst_value,
- gpointer user_data)
-{
- GdkColor color;
- const gchar *string;
- gboolean success = FALSE;
-
- string = g_value_get_string (src_value);
- if (gdk_color_parse (string, &color)) {
- g_value_set_boxed (dst_value, &color);
- success = TRUE;
- }
-
- return success;
-}
-
-static gboolean
-transform_old_to_new_reply_style (const GValue *src_value,
- GValue *dst_value,
- gpointer user_data)
-{
- gboolean success = TRUE;
-
- /* XXX This is the kind of legacy crap we wind up
- * with when we don't migrate things properly. */
-
- switch (g_value_get_int (src_value)) {
- case 0: /* Quoted: 0 -> 2 */
- g_value_set_int (dst_value, 2);
- break;
-
- case 1: /* Do Not Quote: 1 -> 3 */
- g_value_set_int (dst_value, 3);
- break;
-
- case 2: /* Attach: 2 -> 0 */
- g_value_set_int (dst_value, 0);
- break;
-
- case 3: /* Outlook: 3 -> 1 */
- g_value_set_int (dst_value, 1);
- break;
-
- default:
- success = FALSE;
- break;
- }
-
- return success;
-}
-
-static gboolean
-transform_new_to_old_reply_style (const GValue *src_value,
- GValue *dst_value,
- gpointer user_data)
-{
- gboolean success = TRUE;
-
- /* XXX This is the kind of legacy crap we wind up
- * with when we don't migrate things properly. */
-
- switch (g_value_get_int (src_value)) {
- case 0: /* Attach: 0 -> 2 */
- g_value_set_int (dst_value, 2);
- break;
-
- case 1: /* Outlook: 1 -> 3 */
- g_value_set_int (dst_value, 3);
- break;
-
- case 2: /* Quoted: 2 -> 0 */
- g_value_set_int (dst_value, 0);
- break;
-
- case 3: /* Do Not Quote: 3 -> 1 */
- g_value_set_int (dst_value, 1);
- break;
-
- default:
- success = FALSE;
- break;
- }
-
- return success;
-}
-
-static void
-composer_prefs_finalize (GObject *object)
-{
- EMComposerPrefs *prefs = (EMComposerPrefs *) object;
-
- g_object_unref (prefs->gui);
-
- /* Chain up to parent's finalize() method. */
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-composer_prefs_class_init (EMComposerPrefsClass *class)
-{
- GObjectClass *object_class;
-
- parent_class = g_type_class_peek_parent (class);
-
- object_class = G_OBJECT_CLASS (class);
- object_class->finalize = composer_prefs_finalize;
-}
-
-static void
-composer_prefs_init (EMComposerPrefs *prefs)
-{
-}
-
-GType
-em_composer_prefs_get_type (void)
-{
- static GType type = 0;
-
- if (G_UNLIKELY (type == 0)) {
- static const GTypeInfo type_info = {
- sizeof (EMComposerPrefsClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) composer_prefs_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EMComposerPrefs),
- 0, /* n_allocs */
- (GInstanceInitFunc) composer_prefs_init,
- NULL /* value_table */
- };
-
- type = g_type_register_static (
- GTK_TYPE_VBOX, "EMComposerPrefs", &type_info, 0);
- }
-
- return type;
-}
-
-void
-em_composer_prefs_new_signature (GtkWindow *parent,
- gboolean html_mode)
-{
- GtkWidget *editor;
-
- editor = e_signature_editor_new ();
- gtkhtml_editor_set_html_mode (GTKHTML_EDITOR (editor), html_mode);
- gtk_window_set_transient_for (GTK_WINDOW (editor), parent);
- gtk_widget_show (editor);
-}
-
-static void
-spell_language_toggled_cb (GtkCellRendererToggle *renderer,
- const gchar *path_string,
- EMComposerPrefs *prefs)
-{
- GtkTreeModel *model;
- GtkTreePath *path;
- GtkTreeIter iter;
- gboolean active;
- gboolean valid;
-
- model = prefs->language_model;
-
- /* Convert the path string to a tree iterator. */
- path = gtk_tree_path_new_from_string (path_string);
- valid = gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_path_free (path);
- g_return_if_fail (valid);
-
- /* Toggle the active state. */
- gtk_tree_model_get (model, &iter, 0, &active, -1);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, !active, -1);
-}
-
-static void
-spell_language_save (EMComposerPrefs *prefs)
-{
- GList *spell_languages = NULL;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean valid;
-
- model = prefs->language_model;
-
- /* Build a list of active spell languages. */
- valid = gtk_tree_model_get_iter_first (model, &iter);
- while (valid) {
- const GtkhtmlSpellLanguage *language;
- gboolean active;
-
- gtk_tree_model_get (
- model, &iter, 0, &active, 2, &language, -1);
-
- if (active)
- spell_languages = g_list_prepend (
- spell_languages, (gpointer) language);
-
- valid = gtk_tree_model_iter_next (model, &iter);
- }
- spell_languages = g_list_reverse (spell_languages);
-
- /* Update the GConf value. */
- e_save_spell_languages (spell_languages);
-
- g_list_free (spell_languages);
-}
-
-static void
-spell_setup (EMComposerPrefs *prefs)
-{
- const GList *available_languages;
- GList *active_languages;
- GtkListStore *store;
-
- store = GTK_LIST_STORE (prefs->language_model);
- available_languages = gtkhtml_spell_language_get_available ();
-
- active_languages = e_load_spell_languages ();
-
- /* Populate the GtkListStore. */
- while (available_languages != NULL) {
- const GtkhtmlSpellLanguage *language;
- GtkTreeIter tree_iter;
- const gchar *name;
- gboolean active;
-
- language = available_languages->data;
- name = gtkhtml_spell_language_get_name (language);
- active = (g_list_find (active_languages, language) != NULL);
-
- gtk_list_store_append (store, &tree_iter);
-
- gtk_list_store_set (
- store, &tree_iter,
- 0, active, 1, name, 2, language, -1);
-
- available_languages = available_languages->next;
- }
-
- g_list_free (active_languages);
-}
-
-static void
-charset_activate (GtkWidget *item,
- EMComposerPrefs *prefs)
-{
- GConfClient *client;
- GtkWidget *menu;
- gchar *string;
-
- client = mail_config_get_gconf_client ();
- menu = gtk_option_menu_get_menu (prefs->charset);
- string = e_charset_picker_get_charset (menu);
-
- if (string == NULL)
- string = g_strdup (camel_iconv_locale_charset ());
-
- gconf_client_set_string (
- client, "/apps/evolution/mail/composer/charset",
- string, NULL);
-
- g_free (string);
-}
-
-static void
-option_menu_connect (EMComposerPrefs *prefs,
- GtkOptionMenu *omenu,
- GCallback callback,
- const gchar *key)
-{
- GConfClient *client;
- GtkWidget *menu;
- GList *list;
-
- client = mail_config_get_gconf_client ();
- menu = gtk_option_menu_get_menu (omenu);
- list = GTK_MENU_SHELL (menu)->children;
-
- while (list != NULL) {
- GtkWidget *widget = list->data;
-
- g_object_set_data (G_OBJECT (widget), "key", (gpointer) key);
- g_signal_connect (widget, "activate", callback, prefs);
- list = list->next;
- }
-
- if (!gconf_client_key_is_writable (client, key, NULL))
- gtk_widget_set_sensitive (GTK_WIDGET (omenu), FALSE);
-}
-
-static GtkWidget *
-emcp_widget_glade (EConfig *ec,
- EConfigItem *item,
- GtkWidget *parent,
- GtkWidget *old,
- gpointer data)
-{
- EMComposerPrefs *prefs = data;
-
- return glade_xml_get_widget (prefs->gui, item->label);
-}
-
-/* plugin meta-data */
-static EMConfigItem emcp_items[] = {
- { E_CONFIG_BOOK, (gchar *) "", (gchar *) "composer_toplevel", emcp_widget_glade },
- { E_CONFIG_PAGE, (gchar *) "00.general", (gchar *) "vboxGeneral", emcp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "00.general/00.behavior", (gchar *) "vboxBehavior", emcp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "00.general/10.alerts", (gchar *) "vboxAlerts", emcp_widget_glade },
- { E_CONFIG_PAGE, (gchar *) "10.signatures", (gchar *) "vboxSignatures", emcp_widget_glade },
- /* signature/signatures and signature/preview parts not usable */
-
- { E_CONFIG_PAGE, (gchar *) "20.spellcheck", (gchar *) "vboxSpellChecking", emcp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "20.spellcheck/00.languages", (gchar *) "vbox178", emcp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "20.spellcheck/00.options", (gchar *) "vboxOptions", emcp_widget_glade },
-};
-
-static void
-emcp_free (EConfig *ec, GSList *items, gpointer data)
-{
- /* the prefs data is freed automagically */
- g_slist_free (items);
-}
-
-static void
-em_composer_prefs_construct (EMComposerPrefs *prefs,
- EShell *shell)
-{
- GtkWidget *toplevel, *widget, *menu, *info_pixmap;
- GtkWidget *container;
- EShellSettings *shell_settings;
- ESignatureList *signature_list;
- ESignatureTreeView *signature_tree_view;
- GladeXML *gui;
- GtkTreeView *view;
- GtkListStore *store;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GConfBridge *bridge;
- GConfClient *client;
- gchar *buf;
- EMConfig *ec;
- EMConfigTargetPrefs *target;
- GSList *l;
- gint i;
- gchar *gladefile;
-
- bridge = gconf_bridge_get ();
- client = mail_config_get_gconf_client ();
- shell_settings = e_shell_get_shell_settings (shell);
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- gui = glade_xml_new (gladefile, "composer_toplevel", NULL);
- prefs->gui = gui;
- g_free (gladefile);
-
- /** @HookPoint-EMConfig: Mail Composer Preferences
- * @Id: org.gnome.evolution.mail.composerPrefs
- * @Type: E_CONFIG_BOOK
- * @Class: org.gnome.evolution.mail.config:1.0
- * @Target: EMConfigTargetPrefs
- *
- * The mail composer preferences settings page.
- */
- ec = em_config_new(E_CONFIG_BOOK, "org.gnome.evolution.mail.composerPrefs");
- l = NULL;
- for (i = 0; i < G_N_ELEMENTS (emcp_items); i++)
- l = g_slist_prepend(l, &emcp_items[i]);
- e_config_add_items((EConfig *)ec, l, NULL, NULL, emcp_free, prefs);
-
- /* General tab */
-
- /* Default Behavior */
- widget = glade_xml_get_widget (gui, "chkSendHTML");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-format-html",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkPromptEmptySubject");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-prompt-empty-subject",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkPromptBccOnly");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-prompt-only-bcc",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkAutoSmileys");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-magic-smileys",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkRequestReceipt");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-request-receipt",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkReplyStartBottom");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-reply-start-bottom",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkOutlookFilenames");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-outlook-filenames",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkTopSignature");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-top-signature",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkEnableSpellChecking");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "composer-inline-spelling",
- G_OBJECT (widget), "active");
-
- prefs->charset = GTK_OPTION_MENU (
- glade_xml_get_widget (gui, "omenuCharset1"));
- buf = gconf_client_get_string (
- client, "/apps/evolution/mail/composer/charset", NULL);
- menu = e_charset_picker_new (
- buf && *buf ? buf : camel_iconv_locale_charset ());
- gtk_option_menu_set_menu (prefs->charset, GTK_WIDGET (menu));
- option_menu_connect (
- prefs, prefs->charset,
- G_CALLBACK (charset_activate),
- "/apps/evolution/mail/composer/charset");
- g_free (buf);
-
- /* Spell Checking */
- widget = glade_xml_get_widget (gui, "listSpellCheckLanguage");
- view = GTK_TREE_VIEW (widget);
- store = gtk_list_store_new (
- 3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER);
- g_signal_connect_swapped (
- store, "row-changed",
- G_CALLBACK (spell_language_save), prefs);
- prefs->language_model = GTK_TREE_MODEL (store);
- gtk_tree_view_set_model (view, prefs->language_model);
- renderer = gtk_cell_renderer_toggle_new ();
- g_signal_connect (
- renderer, "toggled",
- G_CALLBACK (spell_language_toggled_cb), prefs);
- gtk_tree_view_insert_column_with_attributes (
- view, -1, _("Enabled"),
- renderer, "active", 0, NULL);
-
- gtk_tree_view_insert_column_with_attributes (
- view, -1, _("Language(s)"),
- gtk_cell_renderer_text_new (),
- "text", 1, NULL);
- selection = gtk_tree_view_get_selection (view);
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
- info_pixmap = glade_xml_get_widget (gui, "pixmapSpellInfo");
- gtk_image_set_from_stock (
- GTK_IMAGE (info_pixmap),
- GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_BUTTON);
-
- widget = glade_xml_get_widget (gui, "colorButtonSpellCheckColor");
- e_mutual_binding_new_full (
- G_OBJECT (shell_settings), "composer-spell-color",
- G_OBJECT (widget), "color",
- transform_string_to_color,
- transform_color_to_string,
- NULL, NULL);
-
- spell_setup (prefs);
-
- /* Forwards and Replies */
- widget = glade_xml_get_widget (gui, "comboboxForwardStyle");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-forward-style",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "comboboxReplyStyle");
- e_mutual_binding_new_full (
- G_OBJECT (shell_settings), "mail-reply-style",
- G_OBJECT (widget), "active",
- transform_old_to_new_reply_style,
- transform_new_to_old_reply_style,
- NULL, NULL);
-
- /* Signatures */
- signature_list = e_get_signature_list ();
- container = glade_xml_get_widget (gui, "alignSignatures");
- widget = e_signature_manager_new (signature_list);
- gtk_container_add (GTK_CONTAINER (container), widget);
- gtk_widget_show (widget);
-
- /* The mail shell backend responds to the "window-created" signal
- * that this triggers and configures it with composer preferences. */
- g_signal_connect_swapped (
- widget, "editor-created",
- G_CALLBACK (e_shell_watch_window), shell);
-
- e_binding_new (
- G_OBJECT (shell_settings), "composer-format-html",
- G_OBJECT (widget), "prefer-html");
-
- e_binding_new_with_negation (
- G_OBJECT (shell_settings), "disable-command-line",
- G_OBJECT (widget), "allow-scripts");
-
- signature_tree_view = e_signature_manager_get_tree_view (
- E_SIGNATURE_MANAGER (widget));
-
- container = glade_xml_get_widget (gui, "scrolled-sig");
- widget = e_signature_preview_new ();
- gtk_container_add (GTK_CONTAINER (container), widget);
- gtk_widget_show (widget);
-
- e_binding_new_with_negation (
- G_OBJECT (shell_settings), "disable-command-line",
- G_OBJECT (widget), "allow-scripts");
-
- e_binding_new (
- G_OBJECT (signature_tree_view), "selected",
- G_OBJECT (widget), "signature");
-
- /* get our toplevel widget */
- target = em_config_target_new_prefs (ec, client);
- e_config_set_target ((EConfig *)ec, (EConfigTarget *)target);
- toplevel = e_config_create_widget ((EConfig *)ec);
- gtk_container_add (GTK_CONTAINER (prefs), toplevel);
-}
-
-GtkWidget *
-em_composer_prefs_new (EShell *shell)
-{
- EMComposerPrefs *prefs;
-
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- prefs = g_object_new (EM_TYPE_COMPOSER_PREFS, NULL);
- em_composer_prefs_construct (prefs, shell);
-
- return GTK_WIDGET (prefs);
-}
diff --git a/mail/em-composer-prefs.h b/mail/em-composer-prefs.h
deleted file mode 100644
index 3b848f1a2f..0000000000
--- a/mail/em-composer-prefs.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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/>
- *
- *
- * Authors:
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef EM_COMPOSER_PREFS_H
-#define EM_COMPOSER_PREFS_H
-
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-#include <gtkhtml/gtkhtml.h>
-
-#include <shell/e-shell.h>
-
-/* Standard GObject macros */
-#define EM_TYPE_COMPOSER_PREFS \
- (em_composer_prefs_get_type ())
-#define EM_COMPOSER_PREFS(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), EM_TYPE_COMPOSER_PREFS, EMComposerPrefs))
-#define EM_COMPOSER_PREFS_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), EM_TYPE_COMPOSER_PREFS, EMComposerPrefsClass))
-#define EM_IS_COMPOSER_PREFS(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), EM_TYPE_COMPOSER_PREFS))
-#define EM_IS_COMPOSER_PREFS_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_TYPE \
- ((cls), EM_TYPE_COMPOSER_PREFS))
-#define EM_COMPOSER_PREFS_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS \
- ((obj), EM_TYPE_COMPOSER_PREFS, EMComposerPrefsClass))
-
-G_BEGIN_DECLS
-
-typedef struct _EMComposerPrefs EMComposerPrefs;
-typedef struct _EMComposerPrefsClass EMComposerPrefsClass;
-
-struct _ESignature;
-
-struct _EMComposerPrefs {
- GtkVBox parent;
-
- GladeXML *gui;
-
- /* General tab */
-
- /* Default Behavior */
- GtkOptionMenu *charset;
-
- GtkTreeModel *language_model;
-
- /* Forwards and Replies */
- GtkComboBox *forward_style;
- GtkComboBox *reply_style;
-
- /* Signatures */
- GtkHTML *sig_preview;
-};
-
-struct _EMComposerPrefsClass {
- GtkVBoxClass parent_class;
-};
-
-GType em_composer_prefs_get_type (void);
-GtkWidget * em_composer_prefs_new (EShell *shell);
-void em_composer_prefs_new_signature (GtkWindow *parent,
- gboolean html_mode);
-
-/* needed by global config */
-#define EM_COMPOSER_PREFS_CONTROL_ID \
- "OAFIID:GNOME_Evolution_Mail_ComposerPrefs_ConfigControl:" BASE_VERSION
-
-G_END_DECLS
-
-#endif /* EM_COMPOSER_PREFS_H */
diff --git a/mail/em-folder-tree.h b/mail/em-folder-tree.h
index b92c0a2f4c..74b79d37ee 100644
--- a/mail/em-folder-tree.h
+++ b/mail/em-folder-tree.h
@@ -26,7 +26,6 @@
#include <gtk/gtk.h>
#include <camel/camel-store.h>
-#include <mail/e-mail-shell-backend.h>
#include <mail/em-folder-tree-model.h>
/* Standard GObject macros */
diff --git a/mail/em-mailer-prefs.c b/mail/em-mailer-prefs.c
deleted file mode 100644
index fa450dc2ee..0000000000
--- a/mail/em-mailer-prefs.c
+++ /dev/null
@@ -1,1332 +0,0 @@
-/*
- * 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/>
- *
- *
- * Authors:
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glib/gi18n-lib.h>
-
-#include "em-mailer-prefs.h"
-#include "em-format/em-format.h"
-
-#include <camel/camel-iconv.h>
-#include <gtkhtml/gtkhtml-properties.h>
-#include <libxml/tree.h>
-#include "misc/e-charset-picker.h"
-
-#include <glade/glade.h>
-
-#include <gconf/gconf-client.h>
-
-#include "libedataserverui/e-cell-renderer-color.h"
-
-#include "e-util/e-binding.h"
-#include "e-util/e-util-private.h"
-
-#include "e-mail-label-manager.h"
-#include "mail-config.h"
-#include "em-junk-hook.h"
-#include "em-config.h"
-#include "mail-session.h"
-
-static void em_mailer_prefs_class_init (EMMailerPrefsClass *class);
-static void em_mailer_prefs_init (EMMailerPrefs *dialog);
-static void em_mailer_prefs_finalize (GObject *object);
-
-static GtkVBoxClass *parent_class = NULL;
-
-enum {
- HEADER_LIST_NAME_COLUMN, /* displayable name of the header (may be a translation) */
- HEADER_LIST_ENABLED_COLUMN, /* is the header enabled? */
- HEADER_LIST_IS_DEFAULT_COLUMN, /* is this header a default header, eg From: */
- HEADER_LIST_HEADER_COLUMN, /* the real name of this header */
- HEADER_LIST_N_COLUMNS
-};
-
-static GType col_types[] = {
- G_TYPE_STRING,
- G_TYPE_BOOLEAN,
- G_TYPE_BOOLEAN,
- G_TYPE_STRING
-};
-
-/* temporarily copied from em-format.c */
-static const gchar *default_headers[] = {
- N_("From"),
- N_("Reply-To"),
- N_("To"),
- N_("Cc"),
- N_("Bcc"),
- N_("Subject"),
- N_("Date"),
- N_("Newsgroups"),
- N_("Face"),
- "x-evolution-mailer", /* DO NOT translate */
-};
-
-#define EM_FORMAT_HEADER_XMAILER "x-evolution-mailer"
-
-/* for empty trash on exit frequency */
-static const struct {
- const gchar *label;
- gint days;
-} empty_trash_frequency[] = {
- { N_("Every time"), 0 },
- { N_("Once per day"), 1 },
- { N_("Once per week"), 7 },
- { N_("Once per month"), 30 },
-};
-
-GType
-em_mailer_prefs_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- GTypeInfo type_info = {
- sizeof (EMMailerPrefsClass),
- NULL, NULL,
- (GClassInitFunc) em_mailer_prefs_class_init,
- NULL, NULL,
- sizeof (EMMailerPrefs),
- 0,
- (GInstanceInitFunc) em_mailer_prefs_init,
- };
-
- type = g_type_register_static (gtk_vbox_get_type (), "EMMailerPrefs", &type_info, 0);
- }
-
- return type;
-}
-
-static void
-em_mailer_prefs_class_init (EMMailerPrefsClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = (GObjectClass *) klass;
- parent_class = g_type_class_ref (gtk_vbox_get_type ());
-
- object_class->finalize = em_mailer_prefs_finalize;
-}
-
-static void
-em_mailer_prefs_init (EMMailerPrefs *preferences)
-{
- preferences->gconf = mail_config_get_gconf_client ();
-}
-
-static void
-em_mailer_prefs_finalize (GObject *obj)
-{
- EMMailerPrefs *prefs = (EMMailerPrefs *) obj;
-
- g_object_unref (prefs->gui);
-
- if (prefs->labels_change_notify_id) {
- gconf_client_notify_remove (prefs->gconf, prefs->labels_change_notify_id);
-
- prefs->labels_change_notify_id = 0;
- }
-
- ((GObjectClass *)(parent_class))->finalize (obj);
-}
-
-static gboolean
-mark_seen_timeout_transform (const GValue *src_value,
- GValue *dst_value,
- gpointer user_data)
-{
- gdouble v_double;
-
- /* Shell Settings (gint) -> Spin Button (double) */
- v_double = (gdouble) g_value_get_int (src_value);
- g_value_set_double (dst_value, v_double / 1000.0);
-
- return TRUE;
-}
-
-static gboolean
-mark_seen_timeout_reverse_transform (const GValue *src_value,
- GValue *dst_value,
- gpointer user_data)
-{
- gdouble v_double;
-
- /* Spin Button (double) -> Shell Settings (gint) */
- v_double = g_value_get_double (src_value);
- g_value_set_int (dst_value, v_double * 1000);
-
- return TRUE;
-}
-
-enum {
- JH_LIST_COLUMN_NAME,
- JH_LIST_COLUMN_VALUE
-};
-
-static void
-jh_tree_refill (EMMailerPrefs *prefs)
-{
- GtkListStore *store = prefs->junk_header_list_store;
- GSList *l, *cjh = gconf_client_get_list (prefs->gconf, "/apps/evolution/mail/junk/custom_header", GCONF_VALUE_STRING, NULL);
-
- gtk_list_store_clear (store);
-
- for (l = cjh; l; l = l->next) {
- GtkTreeIter iter;
- gchar **tokens = g_strsplit (l->data, "=", 2);
-
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (
- store, &iter,
- JH_LIST_COLUMN_NAME , tokens[0] ? tokens[0] : "",
- JH_LIST_COLUMN_VALUE, tokens[1] ? tokens[1] : "" ,
- -1);
- g_strfreev (tokens);
- }
-
- g_slist_foreach (cjh, (GFunc) g_free, NULL);
- g_slist_free (cjh);
-}
-
-static void
-jh_add_cb (GtkWidget *widget, gpointer user_data)
-{
- EMMailerPrefs *prefs = (EMMailerPrefs *) user_data;
- GtkWidget *dialog, *l1, *l2, *entry1, *entry2, *vbox, *hbox;
- gint response;
- dialog = gtk_dialog_new_with_buttons (_("Add Custom Junk Header"), (GtkWindow *)gtk_widget_get_toplevel (widget), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
-
- vbox = gtk_vbox_new (FALSE, 6);
- hbox = gtk_hbox_new (FALSE, 0);
- l1 = gtk_label_new_with_mnemonic (_("Header Name:"));
- l2 = gtk_label_new_with_mnemonic (_("Header Value Contains:"));
- entry1 = gtk_entry_new ();
- entry2 = gtk_entry_new ();
- gtk_box_pack_start ((GtkBox *) hbox, l1, FALSE, FALSE, 6);
- gtk_box_pack_start ((GtkBox *)hbox, entry1, FALSE, FALSE, 6);
- gtk_box_pack_start ((GtkBox *)vbox, hbox, FALSE, FALSE, 6);
-
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start ((GtkBox *)hbox, l2, FALSE, FALSE, 6);
- gtk_box_pack_start ((GtkBox *)hbox, entry2, FALSE, FALSE, 6);
- gtk_box_pack_start ((GtkBox *)vbox, hbox, FALSE, FALSE, 6);
-
- gtk_widget_show_all (vbox);
- gtk_container_add ((GtkContainer *)((GtkDialog *)dialog)->vbox, vbox);
- response = gtk_dialog_run ((GtkDialog *)dialog);
- if (response == GTK_RESPONSE_ACCEPT) {
- const gchar *name = gtk_entry_get_text ((GtkEntry *)entry1);
- const gchar *value = gtk_entry_get_text ((GtkEntry *)entry2);
- gchar *tok;
- GSList *list = gconf_client_get_list (prefs->gconf, "/apps/evolution/mail/junk/custom_header", GCONF_VALUE_STRING, NULL);
-
- /* FIXME: Validate the values */
-
- tok = g_strdup_printf ("%s=%s", name, value);
- list = g_slist_append (list, tok);
- gconf_client_set_list (prefs->gconf, "/apps/evolution/mail/junk/custom_header", GCONF_VALUE_STRING, list, NULL);
- g_slist_foreach (list, (GFunc)g_free, NULL);
-
- g_slist_free (list);
- }
- gtk_widget_destroy (dialog);
- jh_tree_refill (prefs);
-}
-
-static void
-jh_remove_cb (GtkWidget *widget, gpointer user_data)
-{
- EMMailerPrefs *prefs = user_data;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- g_return_if_fail (prefs != NULL);
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (prefs->junk_header_tree));
- if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
- gchar *name=NULL, *value=NULL;
- GSList *prev = NULL, *node, *list = gconf_client_get_list (prefs->gconf, "/apps/evolution/mail/junk/custom_header", GCONF_VALUE_STRING, NULL);
- gtk_tree_model_get (model, &iter, JH_LIST_COLUMN_NAME, &name, JH_LIST_COLUMN_VALUE, &value, -1);
- node = list;
- while (node) {
- gchar *test;
- gint len = strlen (name);
- test = strncmp (node->data, name, len) == 0 ? (gchar *) node->data+len:NULL;
-
- if (test) {
- test++;
- if (strcmp (test, value) == 0)
- break;
- }
-
- prev = node;
- node = node->next;
- }
-
- if (prev && !node) {
- /* Not found. So what? */
- } else if (prev && node) {
- prev->next = node->next;
- g_free (node->data);
- } else if (!prev && node) {
- list = list->next;
- g_free (node->data);
- }
-
- gconf_client_set_list (prefs->gconf, "/apps/evolution/mail/junk/custom_header", GCONF_VALUE_STRING, list, NULL);
-
- g_slist_foreach (list, (GFunc)g_free, NULL);
- g_slist_free (list);
- g_free (name);
- g_free (value);
-
- jh_tree_refill (prefs);
- }
-}
-
-
-static GtkListStore *
-init_junk_tree (GtkWidget *label_tree, EMMailerPrefs *prefs)
-{
- GtkListStore *store;
- GtkCellRenderer *renderer;
- gint col;
-
- g_return_val_if_fail (label_tree != NULL, NULL);
- g_return_val_if_fail (prefs != NULL, NULL);
-
- store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
- gtk_tree_view_set_model (GTK_TREE_VIEW (label_tree), GTK_TREE_MODEL (store));
-
- renderer = gtk_cell_renderer_text_new ();
- col = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (label_tree), -1, _("Header"), renderer, "text", JH_LIST_COLUMN_NAME, NULL);
- g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL);
-
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (label_tree), -1, _("Contains Value"), renderer, "text", JH_LIST_COLUMN_VALUE, NULL);
- g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL);
-
- return store;
-}
-
-static void
-emmp_header_remove_sensitivity (EMMailerPrefs *prefs)
-{
- GtkTreeIter iter;
- GtkTreeSelection *selection = gtk_tree_view_get_selection (prefs->header_list);
- gboolean is_default;
-
- /* remove button should be sensitive if the currenlty selected entry in the list view
- is not a default header. if there are no entries, or none is selected, it should be
- disabled
- */
- if (gtk_tree_selection_get_selected (selection, NULL, &iter)) {
- gtk_tree_model_get (GTK_TREE_MODEL (prefs->header_list_store), &iter,
- HEADER_LIST_IS_DEFAULT_COLUMN, &is_default,
- -1);
- if (is_default)
- gtk_widget_set_sensitive (GTK_WIDGET (prefs->remove_header), FALSE);
- else
- gtk_widget_set_sensitive (GTK_WIDGET (prefs->remove_header), TRUE);
- } else {
- gtk_widget_set_sensitive (GTK_WIDGET (prefs->remove_header), FALSE);
- }
-}
-
-static gboolean
-emmp_header_is_valid (const gchar *header)
-{
- gint len = g_utf8_strlen (header, -1);
-
- if (header[0] == 0
- || g_utf8_strchr (header, len, ':') != NULL
- || g_utf8_strchr (header, len, ' ') != NULL)
- return FALSE;
-
- return TRUE;
-}
-
-static void
-emmp_header_add_sensitivity (EMMailerPrefs *prefs)
-{
- const gchar *entry_contents;
- GtkTreeIter iter;
- gboolean valid;
-
- /* the add header button should be sensitive if the text box contains
- a valid header string, that is not a duplicate with something already
- in the list view
- */
- entry_contents = gtk_entry_get_text (GTK_ENTRY (prefs->entry_header));
- if (!emmp_header_is_valid (entry_contents)) {
- gtk_widget_set_sensitive (GTK_WIDGET (prefs->add_header), FALSE);
- return;
- }
-
- /* check if this is a duplicate */
- valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (prefs->header_list_store), &iter);
- while (valid) {
- gchar *header_name;
-
- gtk_tree_model_get (GTK_TREE_MODEL (prefs->header_list_store), &iter,
- HEADER_LIST_HEADER_COLUMN, &header_name,
- -1);
- if (g_ascii_strcasecmp (header_name, entry_contents) == 0) {
- gtk_widget_set_sensitive (GTK_WIDGET (prefs->add_header), FALSE);
- return;
- }
-
- valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (prefs->header_list_store), &iter);
- }
-
- gtk_widget_set_sensitive (GTK_WIDGET (prefs->add_header), TRUE);
-}
-
-static void
-emmp_save_headers (EMMailerPrefs *prefs)
-{
- GSList *header_list;
- GtkTreeIter iter;
- gboolean valid;
-
- /* Headers */
- header_list = NULL;
- valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (prefs->header_list_store), &iter);
- while (valid) {
- struct _EMMailerPrefsHeader h;
- gboolean enabled;
- gchar *xml;
-
- gtk_tree_model_get (GTK_TREE_MODEL (prefs->header_list_store), &iter,
- HEADER_LIST_HEADER_COLUMN, &h.name,
- HEADER_LIST_ENABLED_COLUMN, &enabled,
- -1);
- h.enabled = enabled;
-
- if ((xml = em_mailer_prefs_header_to_xml (&h)))
- header_list = g_slist_append (header_list, xml);
-
- valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (prefs->header_list_store), &iter);
- }
-
- gconf_client_set_list (prefs->gconf, "/apps/evolution/mail/display/headers", GCONF_VALUE_STRING, header_list, NULL);
- g_slist_foreach (header_list, (GFunc) g_free, NULL);
- g_slist_free (header_list);
-}
-
-static void
-emmp_header_list_enabled_toggled (GtkCellRendererToggle *cell, const gchar *path_string, EMMailerPrefs *prefs)
-{
- GtkTreeModel *model = GTK_TREE_MODEL (prefs->header_list_store);
- GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
- GtkTreeIter iter;
- gint enabled;
-
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, HEADER_LIST_ENABLED_COLUMN, &enabled, -1);
- enabled = !enabled;
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, HEADER_LIST_ENABLED_COLUMN,
- enabled, -1);
- gtk_tree_path_free (path);
-
- emmp_save_headers (prefs);
-}
-
-static void
-emmp_header_add_header (GtkWidget *widget, EMMailerPrefs *prefs)
-{
- GtkTreeModel *model = GTK_TREE_MODEL (prefs->header_list_store);
- GtkTreeIter iter;
- const gchar *text = gtk_entry_get_text (prefs->entry_header);
-
- g_strstrip ((gchar *)text);
-
- if (text && (strlen (text)>0)) {
- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
- HEADER_LIST_NAME_COLUMN, text,
- HEADER_LIST_ENABLED_COLUMN, TRUE,
- HEADER_LIST_HEADER_COLUMN, text,
- HEADER_LIST_IS_DEFAULT_COLUMN, FALSE,
- -1);
- gtk_entry_set_text (prefs->entry_header, "");
- emmp_header_remove_sensitivity (prefs);
- emmp_header_add_sensitivity (prefs);
-
- emmp_save_headers (prefs);
- }
-}
-
-static void
-emmp_header_remove_header (GtkWidget *button, gpointer user_data)
-{
- EMMailerPrefs *prefs = (EMMailerPrefs *) user_data;
- GtkTreeModel *model = GTK_TREE_MODEL (prefs->header_list_store);
- GtkTreeSelection *selection = gtk_tree_view_get_selection (prefs->header_list);
- GtkTreeIter iter;
-
- if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
- return;
-
- gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
- emmp_header_remove_sensitivity (prefs);
-
- emmp_save_headers (prefs);
-}
-
-static void
-emmp_header_list_row_selected (GtkTreeSelection *selection, gpointer user_data)
-{
- EMMailerPrefs *prefs = (EMMailerPrefs *) user_data;
-
- emmp_header_remove_sensitivity (prefs);
-}
-
-static void
-emmp_header_entry_changed (GtkWidget *entry, gpointer user_data)
-{
- EMMailerPrefs *prefs = (EMMailerPrefs *) user_data;
-
- emmp_header_add_sensitivity (prefs);
-}
-
-static void
-toggle_button_toggled (GtkToggleButton *toggle, EMMailerPrefs *prefs)
-{
- const gchar *key;
-
- key = g_object_get_data ((GObject *) toggle, "key");
- gconf_client_set_bool (prefs->gconf, key, gtk_toggle_button_get_active (toggle), NULL);
-}
-
-static void
-junk_book_lookup_button_toggled (GtkToggleButton *toggle, EMMailerPrefs *prefs)
-{
- toggle_button_toggled (toggle, prefs);
- gtk_widget_set_sensitive (GTK_WIDGET (prefs->junk_lookup_local_only), gtk_toggle_button_get_active (toggle));
-}
-
-static void
-custom_junk_button_toggled (GtkToggleButton *toggle, EMMailerPrefs *prefs)
-{
- toggle_button_toggled (toggle, prefs);
- if (gtk_toggle_button_get_active (toggle)) {
- gtk_widget_set_sensitive ((GtkWidget *) prefs->junk_header_remove, TRUE);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->junk_header_add, TRUE);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->junk_header_tree, TRUE);
- } else {
- gtk_widget_set_sensitive ((GtkWidget *) prefs->junk_header_tree, FALSE);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->junk_header_add, FALSE);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->junk_header_remove, FALSE);
- }
-
-
-}
-
-static void
-toggle_button_init (EMMailerPrefs *prefs, GtkToggleButton *toggle, gint not, const gchar *key, GCallback toggled)
-{
- gboolean bool;
-
- bool = gconf_client_get_bool (prefs->gconf, key, NULL);
- gtk_toggle_button_set_active (toggle, not ? !bool : bool);
-
- if (toggled) {
- g_object_set_data ((GObject *) toggle, "key", (gpointer) key);
- g_signal_connect (toggle, "toggled", toggled, prefs);
- }
-
- if (!gconf_client_key_is_writable (prefs->gconf, key, NULL))
- gtk_widget_set_sensitive ((GtkWidget *) toggle, FALSE);
-}
-
-static void
-charset_activate (GtkWidget *item, EMMailerPrefs *prefs)
-{
- GtkWidget *menu;
- gchar *string;
-
- menu = gtk_option_menu_get_menu (prefs->charset);
- if (!(string = e_charset_picker_get_charset (menu)))
- string = g_strdup (camel_iconv_locale_charset ());
-
- gconf_client_set_string (prefs->gconf, "/apps/evolution/mail/display/charset", string, NULL);
- g_free (string);
-}
-
-static void
-charset_menu_init (EMMailerPrefs *prefs)
-{
- GtkWidget *menu, *item;
- GList *items;
- gchar *buf;
-
- buf = gconf_client_get_string (prefs->gconf, "/apps/evolution/mail/display/charset", NULL);
- menu = e_charset_picker_new (buf && *buf ? buf : camel_iconv_locale_charset ());
- gtk_option_menu_set_menu (prefs->charset, GTK_WIDGET (menu));
- g_free (buf);
-
- items = GTK_MENU_SHELL (menu)->children;
- while (items) {
- item = items->data;
- g_signal_connect (item, "activate", G_CALLBACK (charset_activate), prefs);
- items = items->next;
- }
-
- if (!gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/charset", NULL))
- gtk_widget_set_sensitive ((GtkWidget *) prefs->charset, FALSE);
-}
-
-static void
-trash_days_activate (GtkWidget *item, EMMailerPrefs *prefs)
-{
- gint days;
-
- days = GPOINTER_TO_INT (g_object_get_data ((GObject *) item, "days"));
- gconf_client_set_int (prefs->gconf, "/apps/evolution/mail/trash/empty_on_exit_days", days, NULL);
-}
-
-static void
-emmp_empty_trash_init (EMMailerPrefs *prefs)
-{
- gint locked, days, hist = 0, i;
- GtkWidget *menu, *item;
-
- days = gconf_client_get_int(prefs->gconf, "/apps/evolution/mail/trash/empty_on_exit_days", NULL);
- menu = gtk_menu_new();
- for (i = 0; i < G_N_ELEMENTS (empty_trash_frequency); i++) {
- if (days >= empty_trash_frequency[i].days)
- hist = i;
-
- item = gtk_menu_item_new_with_label (_(empty_trash_frequency[i].label));
- g_object_set_data ((GObject *) item, "days", GINT_TO_POINTER (empty_trash_frequency[i].days));
- g_signal_connect (item, "activate", G_CALLBACK (trash_days_activate), prefs);
-
- gtk_widget_show (item);
- gtk_menu_shell_append((GtkMenuShell *)menu, item);
- }
-
- gtk_widget_show(menu);
- gtk_option_menu_set_menu((GtkOptionMenu *)prefs->empty_trash_days, menu);
- gtk_option_menu_set_history((GtkOptionMenu *)prefs->empty_trash_days, hist);
-
- locked = !gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/trash/empty_on_exit_days", NULL);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->empty_trash_days, !locked);
-}
-
-static void
-junk_days_activate (GtkWidget *item, EMMailerPrefs *prefs)
-{
- gint days;
-
- days = GPOINTER_TO_INT (g_object_get_data ((GObject *) item, "days"));
- gconf_client_set_int (prefs->gconf, "/apps/evolution/mail/junk/empty_on_exit_days", days, NULL);
-}
-
-static void
-emmp_empty_junk_init (EMMailerPrefs *prefs)
-{
- gint locked, days, hist = 0, i;
- GtkWidget *menu, *item;
-
- toggle_button_init (prefs, prefs->empty_junk, FALSE,
- "/apps/evolution/mail/junk/empty_on_exit",
- G_CALLBACK (toggle_button_toggled));
-
- days = gconf_client_get_int(prefs->gconf, "/apps/evolution/mail/junk/empty_on_exit_days", NULL);
- menu = gtk_menu_new();
- for (i = 0; i < G_N_ELEMENTS (empty_trash_frequency); i++) {
- if (days >= empty_trash_frequency[i].days)
- hist = i;
-
- item = gtk_menu_item_new_with_label (_(empty_trash_frequency[i].label));
- g_object_set_data ((GObject *) item, "days", GINT_TO_POINTER (empty_trash_frequency[i].days));
- g_signal_connect (item, "activate", G_CALLBACK (junk_days_activate), prefs);
-
- gtk_widget_show (item);
- gtk_menu_shell_append((GtkMenuShell *)menu, item);
- }
-
- gtk_widget_show(menu);
- gtk_option_menu_set_menu((GtkOptionMenu *)prefs->empty_junk_days, menu);
- gtk_option_menu_set_history((GtkOptionMenu *)prefs->empty_junk_days, hist);
-
- locked = !gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/junk/empty_on_exit_days", NULL);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->empty_junk_days, !locked);
-}
-
-static void
-http_images_changed (GtkWidget *widget, EMMailerPrefs *prefs)
-{
- gint when;
-
- if (gtk_toggle_button_get_active (prefs->images_always))
- when = MAIL_CONFIG_HTTP_ALWAYS;
- else if (gtk_toggle_button_get_active (prefs->images_sometimes))
- when = MAIL_CONFIG_HTTP_SOMETIMES;
- else
- when = MAIL_CONFIG_HTTP_NEVER;
-
- gconf_client_set_int (prefs->gconf, "/apps/evolution/mail/display/load_http_images", when, NULL);
-}
-
-
-static GtkWidget *
-emmp_widget_glade(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMMailerPrefs *prefs = data;
-
- return glade_xml_get_widget(prefs->gui, item->label);
-}
-
-/* plugin meta-data */
-static EMConfigItem emmp_items[] = {
- { E_CONFIG_BOOK, (gchar *) "", (gchar *) "preferences_toplevel", emmp_widget_glade },
- { E_CONFIG_PAGE, (gchar *) "00.general", (gchar *) "vboxGeneral", emmp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "00.general/00.fonts", (gchar *) "vboxMessageFonts", emmp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "00.general/10.display", (gchar *) "vboxMessageDisplay", emmp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "00.general/20.delete", (gchar *) "vboxDeletingMail", emmp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "00.general/30.newmail", (gchar *) "vboxNewMailNotify", emmp_widget_glade },
- { E_CONFIG_PAGE, (gchar *) "10.html", (gchar *) "vboxHtmlMail", emmp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "10.html/00.general", (gchar *) "vbox173", emmp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "10.html/10.images", (gchar *) "vbox190", emmp_widget_glade },
- { E_CONFIG_PAGE, (gchar *) "20.labels", (gchar *) "frameColours", emmp_widget_glade },
- /* this is a table, so we can't use it { E_CONFIG_SECTION, "20.labels/00.labels", "tableColours", emmp_widget_glade }, */
- { E_CONFIG_PAGE, (gchar *) "30.headers", (gchar *) "vboxHeaderTab", emmp_widget_glade },
- /* no subvbox for section { E_CONFIG_PAGE, "30.headers/00.headers", "vbox199", emmp_widget_glade }, */
- { E_CONFIG_PAGE, (gchar *) "40.junk", (gchar *) "vbox161", emmp_widget_glade },
- /* no subvbox for section { E_CONFIG_SECTION, "40.junk/00.general", xxx, emmp_widget_glade } */
- { E_CONFIG_SECTION, (gchar *) "40.junk/10.options", (gchar *) "vbox204", emmp_widget_glade },
-};
-
-static void
-emmp_free(EConfig *ec, GSList *items, gpointer data)
-{
- /* the prefs data is freed automagically */
-
- g_slist_free(items);
-}
-
-static void
-junk_plugin_changed (GtkWidget *combo, EMMailerPrefs *prefs)
-{
- gchar *def_plugin = gtk_combo_box_get_active_text(GTK_COMBO_BOX (combo));
- const GList *plugins = mail_session_get_junk_plugins();
-
- gconf_client_set_string (prefs->gconf, "/apps/evolution/mail/junk/default_plugin", def_plugin, NULL);
- while (plugins) {
- struct _EMJunkHookItem *item = plugins->data;;
-
- if (item->plugin_name && def_plugin && !strcmp (item->plugin_name, def_plugin)) {
- gboolean status;
-
- session->junk_plugin = CAMEL_JUNK_PLUGIN (&(item->csp));
- status = e_plugin_invoke (item->hook->hook.plugin, item->validate_binary, NULL) != NULL;
- if ((gboolean)status == TRUE) {
- gchar *text, *html;
- gtk_image_set_from_stock (prefs->plugin_image, "gtk-dialog-info", GTK_ICON_SIZE_MENU);
- text = g_strdup_printf (_("%s plugin is available and the binary is installed."), item->plugin_name);
- html = g_strdup_printf ("<i>%s</i>", text);
- gtk_label_set_markup (prefs->plugin_status, html);
- g_free (html);
- g_free (text);
- } else {
- gchar *text, *html;
- gtk_image_set_from_stock (prefs->plugin_image, "gtk-dialog-warning", GTK_ICON_SIZE_MENU);
- text = g_strdup_printf (_("%s plugin is not available. Please check whether the package is installed."), item->plugin_name);
- html = g_strdup_printf ("<i>%s</i>", text);
- gtk_label_set_markup (prefs->plugin_status, html);
- g_free (html);
- g_free (text);
- }
- break;
- }
- plugins = plugins->next;
- }
-}
-
-static void
-junk_plugin_setup (GtkWidget *combo, EMMailerPrefs *prefs)
-{
- gint index = 0;
- gboolean def_set = FALSE;
- const GList *plugins = mail_session_get_junk_plugins();
- gchar *pdefault = gconf_client_get_string (prefs->gconf, "/apps/evolution/mail/junk/default_plugin", NULL);
-
- if (!plugins || !g_list_length ((GList *)plugins)) {
- gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("No Junk plugin available"));
- gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
- gtk_widget_set_sensitive (GTK_WIDGET (combo), FALSE);
- gtk_widget_hide (GTK_WIDGET (prefs->plugin_image));
- gtk_widget_hide (GTK_WIDGET (prefs->plugin_status));
- gtk_image_set_from_stock (prefs->plugin_image, NULL, 0);
- g_free (pdefault);
-
- return;
- }
-
- while (plugins) {
- struct _EMJunkHookItem *item = plugins->data;;
-
- gtk_combo_box_append_text (GTK_COMBO_BOX (combo), item->plugin_name);
- if (!def_set && pdefault && item->plugin_name && !strcmp(pdefault, item->plugin_name)) {
- gboolean status;
-
- def_set = TRUE;
- gtk_combo_box_set_active (GTK_COMBO_BOX (combo), index);
- status = e_plugin_invoke (item->hook->hook.plugin, item->validate_binary, NULL) != NULL;
- if (status) {
- gchar *text, *html;
- gtk_image_set_from_stock (prefs->plugin_image, "gtk-dialog-info", GTK_ICON_SIZE_MENU);
- /* May be a better text */
- text = g_strdup_printf (_("%s plugin is available and the binary is installed."), item->plugin_name);
- html = g_strdup_printf ("<i>%s</i>", text);
- gtk_label_set_markup (prefs->plugin_status, html);
- g_free (html);
- g_free (text);
- } else {
- gchar *text, *html;
- gtk_image_set_from_stock (prefs->plugin_image, "gtk-dialog-warning", GTK_ICON_SIZE_MENU);
- /* May be a better text */
- text = g_strdup_printf (_("%s plugin is not available. Please check whether the package is installed."), item->plugin_name);
- html = g_strdup_printf ("<i>%s</i>", text);
- gtk_label_set_markup (prefs->plugin_status, html);
- g_free (html);
- g_free (text);
- }
- }
- plugins = plugins->next;
- index++;
- }
-
- g_signal_connect (combo, "changed", G_CALLBACK(junk_plugin_changed), prefs);
- g_free (pdefault);
-}
-
-GtkWidget *
-create_combo_text_widget (void) {
- return gtk_combo_box_new_text ();
-}
-
-static void
-em_mailer_prefs_construct (EMMailerPrefs *prefs,
- EShell *shell)
-{
- GSList *header_config_list, *header_add_list, *p;
- EShellSettings *shell_settings;
- GHashTable *default_header_hash;
- GtkWidget *toplevel;
- GtkWidget *container;
- GtkWidget *widget;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkTreeIter iter;
- GladeXML *gui;
- gboolean locked;
- gint val, i;
- EMConfig *ec;
- EMConfigTargetPrefs *target;
- GSList *l;
- gchar *gladefile;
-
- shell_settings = e_shell_get_shell_settings (shell);
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- gui = glade_xml_new (gladefile, "preferences_toplevel", NULL);
- g_free (gladefile);
-
- prefs->gui = gui;
-
- /** @HookPoint-EMConfig: Mail Preferences Page
- * @Id: org.gnome.evolution.mail.prefs
- * @Type: E_CONFIG_BOOK
- * @Class: org.gnome.evolution.mail.config:1.0
- * @Target: EMConfigTargetPrefs
- *
- * The main mail preferences page.
- */
- ec = em_config_new(E_CONFIG_BOOK, "org.gnome.evolution.mail.prefs");
- l = NULL;
- for (i=0;i<sizeof(emmp_items)/sizeof(emmp_items[0]);i++)
- l = g_slist_prepend(l, &emmp_items[i]);
- e_config_add_items((EConfig *)ec, l, NULL, NULL, emmp_free, prefs);
-
- /* General tab */
-
- /* Message Display */
- widget = glade_xml_get_widget (gui, "chkMarkTimeout");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-mark-seen",
- G_OBJECT (widget), "active");
-
- /* The "mark seen" timeout requires special transform functions
- * because we display the timeout value to the user in seconds
- * but store the settings value in milliseconds. */
- widget = glade_xml_get_widget (gui, "spinMarkTimeout");
- prefs->timeout = GTK_SPIN_BUTTON (widget);
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-mark-seen",
- G_OBJECT (widget), "sensitive");
- e_mutual_binding_new_full (
- G_OBJECT (shell_settings), "mail-mark-seen-timeout",
- G_OBJECT (widget), "value",
- mark_seen_timeout_transform,
- mark_seen_timeout_reverse_transform,
- NULL, NULL);
-
- widget = glade_xml_get_widget (gui, "mlimit_checkbutton");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-force-message-limit",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "mlimit_spin");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-force-message-limit",
- G_OBJECT (widget), "sensitive");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-message-text-part-limit",
- G_OBJECT (widget), "value");
-
- widget = glade_xml_get_widget (gui, "address_checkbox");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-address-compress",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "address_spin");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-address-compress",
- G_OBJECT (widget), "sensitive");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-address-count",
- G_OBJECT (widget), "value");
-
- widget = glade_xml_get_widget (gui, "magic_spacebar_checkbox");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-magic-spacebar",
- G_OBJECT (widget), "active");
-
- prefs->charset = GTK_OPTION_MENU (glade_xml_get_widget (gui, "omenuCharset"));
- charset_menu_init (prefs);
-
- widget = glade_xml_get_widget (gui, "chkHighlightCitations");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-mark-citations",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "colorButtonHighlightCitations");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-mark-citations",
- G_OBJECT (widget), "sensitive");
- e_mutual_binding_new_full (
- G_OBJECT (shell_settings), "mail-citation-color",
- G_OBJECT (widget), "color",
- e_binding_transform_string_to_color,
- e_binding_transform_color_to_string,
- NULL, NULL);
-
- widget = glade_xml_get_widget (gui, "chkEnableSearchFolders");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-enable-search-folders",
- G_OBJECT (widget), "active");
-
- /* Deleting Mail */
- widget = glade_xml_get_widget (gui, "chkEmptyTrashOnExit");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-empty-trash-on-exit",
- G_OBJECT (widget), "active");
-
- prefs->empty_trash_days = GTK_OPTION_MENU (glade_xml_get_widget (gui, "omenuEmptyTrashDays"));
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-empty-trash-on-exit",
- G_OBJECT (prefs->empty_trash_days), "sensitive");
- emmp_empty_trash_init (prefs);
-
- widget = glade_xml_get_widget (gui, "chkConfirmExpunge");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-confirm-expunge",
- G_OBJECT (widget), "active");
-
- /* Mail Fonts */
- widget = glade_xml_get_widget (gui, "radFontUseSame");
- e_mutual_binding_new_with_negation (
- G_OBJECT (shell_settings), "mail-use-custom-fonts",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "FontFixed");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-font-monospace",
- G_OBJECT (widget), "font-name");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-use-custom-fonts",
- G_OBJECT (widget), "sensitive");
-
- widget = glade_xml_get_widget (gui, "FontVariable");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-font-variable",
- G_OBJECT (widget), "font-name");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-use-custom-fonts",
- G_OBJECT (widget), "sensitive");
-
- /* HTML Mail tab */
-
- /* Loading Images */
- locked = !gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/load_http_images", NULL);
-
- val = gconf_client_get_int (prefs->gconf, "/apps/evolution/mail/display/load_http_images", NULL);
- prefs->images_never = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "radImagesNever"));
- gtk_toggle_button_set_active (prefs->images_never, val == MAIL_CONFIG_HTTP_NEVER);
- if (locked)
- gtk_widget_set_sensitive ((GtkWidget *) prefs->images_never, FALSE);
-
- prefs->images_sometimes = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "radImagesSometimes"));
- gtk_toggle_button_set_active (prefs->images_sometimes, val == MAIL_CONFIG_HTTP_SOMETIMES);
- if (locked)
- gtk_widget_set_sensitive ((GtkWidget *) prefs->images_sometimes, FALSE);
-
- prefs->images_always = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "radImagesAlways"));
- gtk_toggle_button_set_active (prefs->images_always, val == MAIL_CONFIG_HTTP_ALWAYS);
- if (locked)
- gtk_widget_set_sensitive ((GtkWidget *) prefs->images_always, FALSE);
-
- g_signal_connect (prefs->images_never, "toggled", G_CALLBACK (http_images_changed), prefs);
- g_signal_connect (prefs->images_sometimes, "toggled", G_CALLBACK (http_images_changed), prefs);
- g_signal_connect (prefs->images_always, "toggled", G_CALLBACK (http_images_changed), prefs);
-
- widget = glade_xml_get_widget (gui, "chkShowAnimatedImages");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-show-animated-images",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "chkPromptWantHTML");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-confirm-unwanted-html",
- G_OBJECT (widget), "active");
-
- container = glade_xml_get_widget (gui, "labels-alignment");
- widget = e_mail_label_manager_new ();
- gtk_container_add (GTK_CONTAINER (container), widget);
- gtk_widget_show (widget);
-
- e_binding_new (
- G_OBJECT (shell_settings), "mail-label-list-store",
- G_OBJECT (widget), "list-store");
-
- /* headers */
- locked = !gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/headers", NULL);
-
- widget = glade_xml_get_widget (gui, "photo_show");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-show-sender-photo",
- G_OBJECT (widget), "active");
-
- widget = glade_xml_get_widget (gui, "photo_local");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-show-sender-photo",
- G_OBJECT (widget), "sensitive");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-only-local-photos",
- G_OBJECT (widget), "active");
-
- /* always de-sensitised until the user types something in the entry */
- prefs->add_header = GTK_BUTTON (glade_xml_get_widget (gui, "cmdHeadersAdd"));
- gtk_widget_set_sensitive ((GtkWidget *) prefs->add_header, FALSE);
-
- /* always de-sensitised until the user selects a header in the list */
- prefs->remove_header = GTK_BUTTON (glade_xml_get_widget (gui, "cmdHeadersRemove"));
- gtk_widget_set_sensitive ((GtkWidget *) prefs->remove_header, FALSE);
-
- prefs->entry_header = GTK_ENTRY (glade_xml_get_widget (gui, "txtHeaders"));
- gtk_widget_set_sensitive ((GtkWidget *) prefs->entry_header, !locked);
-
- prefs->header_list = GTK_TREE_VIEW (glade_xml_get_widget (gui, "treeHeaders"));
- gtk_widget_set_sensitive ((GtkWidget *) prefs->header_list, !locked);
-
- selection = gtk_tree_view_get_selection (prefs->header_list);
- g_signal_connect (selection, "changed", G_CALLBACK (emmp_header_list_row_selected), prefs);
- g_signal_connect (prefs->entry_header, "changed", G_CALLBACK (emmp_header_entry_changed), prefs);
- g_signal_connect (prefs->entry_header, "activate", G_CALLBACK (emmp_header_add_header), prefs);
- /* initialise the tree with appropriate headings */
- prefs->header_list_store = gtk_list_store_newv (HEADER_LIST_N_COLUMNS, col_types);
- g_signal_connect (prefs->add_header, "clicked", G_CALLBACK (emmp_header_add_header), prefs);
- g_signal_connect (prefs->remove_header, "clicked", G_CALLBACK (emmp_header_remove_header), prefs);
- gtk_tree_view_set_model (prefs->header_list, GTK_TREE_MODEL (prefs->header_list_store));
-
- renderer = gtk_cell_renderer_toggle_new ();
- g_object_set (renderer, "activatable", TRUE, NULL);
- g_signal_connect (renderer, "toggled", G_CALLBACK (emmp_header_list_enabled_toggled), prefs);
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (prefs->header_list), -1,
- "Enabled", renderer,
- "active", HEADER_LIST_ENABLED_COLUMN,
- NULL);
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (prefs->header_list), -1,
- "Name", renderer,
- "text", HEADER_LIST_NAME_COLUMN,
- NULL);
-
- /* populated the listview with entries; firstly we add all the default headers, and then
- we add read header configuration out of gconf. If a header in gconf is a default header,
- we update the enabled flag accordingly
- */
- header_add_list = NULL;
- default_header_hash = g_hash_table_new (g_str_hash, g_str_equal);
- for (i = 0; i < G_N_ELEMENTS (default_headers); i++) {
- struct _EMMailerPrefsHeader *h;
-
- h = g_malloc (sizeof (struct _EMMailerPrefsHeader));
- h->is_default = TRUE;
- h->name = g_strdup (default_headers[i]);
- h->enabled = strcmp ((gchar *)default_headers[i], "x-evolution-mailer") != 0;
- g_hash_table_insert (default_header_hash, (gpointer) default_headers[i], h);
- header_add_list = g_slist_append (header_add_list, h);
- }
-
- /* read stored headers from gconf */
- header_config_list = gconf_client_get_list (prefs->gconf, "/apps/evolution/mail/display/headers", GCONF_VALUE_STRING, NULL);
- p = header_config_list;
- while (p) {
- struct _EMMailerPrefsHeader *h, *def;
- gchar *xml = (gchar *) p->data;
-
- h = em_mailer_prefs_header_from_xml (xml);
- if (h) {
- def = g_hash_table_lookup (default_header_hash, h->name);
- if (def) {
- def->enabled = h->enabled;
- em_mailer_prefs_header_free (h);
- } else {
- h->is_default = FALSE;
- header_add_list = g_slist_append (header_add_list, h);
- }
- }
-
- p = p->next;
- }
-
- g_hash_table_destroy (default_header_hash);
- g_slist_foreach (header_config_list, (GFunc) g_free, NULL);
- g_slist_free (header_config_list);
-
- p = header_add_list;
- while (p) {
- struct _EMMailerPrefsHeader *h = (struct _EMMailerPrefsHeader *) p->data;
- const gchar *name;
-
- if (g_ascii_strcasecmp (h->name, EM_FORMAT_HEADER_XMAILER) == 0)
- name = _("Mailer");
- else
- name = _(h->name);
-
- gtk_list_store_append (prefs->header_list_store, &iter);
- gtk_list_store_set (prefs->header_list_store, &iter,
- HEADER_LIST_NAME_COLUMN, name,
- HEADER_LIST_ENABLED_COLUMN, h->enabled,
- HEADER_LIST_IS_DEFAULT_COLUMN, h->is_default,
- HEADER_LIST_HEADER_COLUMN, h->name,
- -1);
-
- em_mailer_prefs_header_free (h);
- p = p->next;
- }
-
- g_slist_free (header_add_list);
-
- /* Junk prefs */
- widget = glade_xml_get_widget (gui, "chkCheckIncomingMail");
- e_mutual_binding_new (
- G_OBJECT (shell_settings), "mail-check-for-junk",
- G_OBJECT (widget), "active");
-
- prefs->empty_junk = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "junk_empty_check"));
- prefs->empty_junk_days = GTK_OPTION_MENU (glade_xml_get_widget (gui, "junk_empty_combo"));
- emmp_empty_junk_init (prefs);
-
- prefs->default_junk_plugin = GTK_COMBO_BOX (glade_xml_get_widget (gui, "default_junk_plugin"));
- prefs->plugin_status = GTK_LABEL (glade_xml_get_widget (gui, "plugin_status"));
- prefs->plugin_image = GTK_IMAGE (glade_xml_get_widget (gui, "plugin_image"));
- junk_plugin_setup (GTK_WIDGET (prefs->default_junk_plugin), prefs);
-
- prefs->junk_header_check = (GtkToggleButton *)glade_xml_get_widget (gui, "junk_header_check");
- prefs->junk_header_tree = (GtkTreeView *)glade_xml_get_widget (gui, "junk_header_tree");
- prefs->junk_header_add = (GtkButton *)glade_xml_get_widget (gui, "junk_header_add");
- prefs->junk_header_remove = (GtkButton *)glade_xml_get_widget (gui, "junk_header_remove");
- prefs->junk_book_lookup = (GtkToggleButton *)glade_xml_get_widget (gui, "lookup_book");
- prefs->junk_lookup_local_only = (GtkToggleButton *)glade_xml_get_widget (gui, "junk_lookup_local_only");
- toggle_button_init (prefs, prefs->junk_book_lookup, FALSE,
- "/apps/evolution/mail/junk/lookup_addressbook",
- G_CALLBACK (junk_book_lookup_button_toggled));
-
- toggle_button_init (prefs, prefs->junk_lookup_local_only, FALSE,
- "/apps/evolution/mail/junk/lookup_addressbook_local_only",
- G_CALLBACK (toggle_button_toggled));
-
- junk_book_lookup_button_toggled (prefs->junk_book_lookup, prefs);
-
- prefs->junk_header_list_store = init_junk_tree ((GtkWidget *)prefs->junk_header_tree, prefs);
- toggle_button_init (prefs, prefs->junk_header_check, FALSE,
- "/apps/evolution/mail/junk/check_custom_header",
- G_CALLBACK (custom_junk_button_toggled));
-
- custom_junk_button_toggled (prefs->junk_header_check, prefs);
- jh_tree_refill (prefs);
- g_signal_connect (G_OBJECT (prefs->junk_header_add), "clicked", G_CALLBACK (jh_add_cb), prefs);
- g_signal_connect (G_OBJECT (prefs->junk_header_remove), "clicked", G_CALLBACK (jh_remove_cb), prefs);
-
- /* get our toplevel widget */
- target = em_config_target_new_prefs(ec, prefs->gconf);
- e_config_set_target((EConfig *)ec, (EConfigTarget *)target);
- toplevel = e_config_create_widget((EConfig *)ec);
- gtk_container_add (GTK_CONTAINER (prefs), toplevel);
-}
-
-GtkWidget *
-em_mailer_prefs_new (EShell *shell)
-{
- EMMailerPrefs *new;
-
- g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
- new = g_object_new (EM_TYPE_MAILER_PREFS, NULL);
-
- /* FIXME Kill this function. */
- em_mailer_prefs_construct (new, shell);
-
- return GTK_WIDGET (new);
-}
-
-
-static struct _EMMailerPrefsHeader *
-emmp_header_from_xmldoc (xmlDocPtr doc)
-{
- struct _EMMailerPrefsHeader *h;
- xmlNodePtr root;
- xmlChar *name;
-
- if (doc == NULL)
- return NULL;
-
- root = doc->children;
- if (strcmp ((gchar *)root->name, "header") != 0)
- return NULL;
-
- name = xmlGetProp (root, (const guchar *)"name");
- if (name == NULL)
- return NULL;
-
- h = g_malloc0 (sizeof (struct _EMMailerPrefsHeader));
- h->name = g_strdup ((gchar *)name);
- xmlFree (name);
-
- if (xmlHasProp (root, (const guchar *)"enabled"))
- h->enabled = 1;
- else
- h->enabled = 0;
-
- return h;
-}
-
-/**
- * em_mailer_prefs_header_from_xml
- * @xml: XML configuration data
- *
- * Parses passed XML data, which should be of
- * the format <header name="foo" enabled />, and
- * returns a EMMailerPrefs structure, or NULL if there
- * is an error.
- **/
-struct _EMMailerPrefsHeader *
-em_mailer_prefs_header_from_xml (const gchar *xml)
-{
- struct _EMMailerPrefsHeader *header;
- xmlDocPtr doc;
-
- if (!(doc = xmlParseDoc ((guchar *) xml)))
- return NULL;
-
- header = emmp_header_from_xmldoc (doc);
- xmlFreeDoc (doc);
-
- return header;
-}
-
-/**
- * em_mailer_prefs_header_free
- * @header: header to free
- *
- * Frees the memory associated with the passed header
- * structure.
- */
-void
-em_mailer_prefs_header_free (struct _EMMailerPrefsHeader *header)
-{
- if (header == NULL)
- return;
-
- g_free (header->name);
- g_free (header);
-}
-
-/**
- * em_mailer_prefs_header_to_xml
- * @header: header from which to generate XML
- *
- * Returns the passed header as a XML structure,
- * or NULL on error
- */
-gchar *
-em_mailer_prefs_header_to_xml (struct _EMMailerPrefsHeader *header)
-{
- xmlDocPtr doc;
- xmlNodePtr root;
- xmlChar *xml;
- gchar *out;
- gint size;
-
- g_return_val_if_fail (header != NULL, NULL);
- g_return_val_if_fail (header->name != NULL, NULL);
-
- doc = xmlNewDoc ((const guchar *)"1.0");
-
- root = xmlNewDocNode (doc, NULL, (const guchar *)"header", NULL);
- xmlSetProp (root, (const guchar *)"name", (guchar *)header->name);
- if (header->enabled)
- xmlSetProp (root, (const guchar *)"enabled", NULL);
-
- xmlDocSetRootElement (doc, root);
- xmlDocDumpMemory (doc, &xml, &size);
- xmlFreeDoc (doc);
-
- out = g_malloc (size + 1);
- memcpy (out, xml, size);
- out[size] = '\0';
- xmlFree (xml);
-
- return out;
-}
diff --git a/mail/em-mailer-prefs.h b/mail/em-mailer-prefs.h
deleted file mode 100644
index b33e620392..0000000000
--- a/mail/em-mailer-prefs.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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/>
- *
- *
- * Authors:
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef EM_MAILER_PREFS_H
-#define EM_MAILER_PREFS_H
-
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-#include <gconf/gconf-client.h>
-#include <shell/e-shell.h>
-
-/* Standard GObject macros */
-#define EM_TYPE_MAILER_PREFS \
- (em_mailer_prefs_get_type ())
-#define EM_MAILER_PREFS(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), EM_TYPE_MAILER_PREFS, EMMailerPrefs))
-#define EM_MAILER_PREFS_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), EM_TYPE_MAILER_PREFS, EMMailerPrefsClass))
-#define EM_IS_MAILER_PREFS(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), EM_TYPE_MAILER_PREFS))
-#define EM_IS_MAILER_PREFS_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_TYPE \
- ((cls), EM_TYPE_MAILER_PREFS))
-#define EM_MAILER_PREFS_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS \
- ((obj), EM_TYPE_MAILER_PREFS))
-
-G_BEGIN_DECLS
-
-typedef struct _EMMailerPrefs EMMailerPrefs;
-typedef struct _EMMailerPrefsClass EMMailerPrefsClass;
-typedef struct _EMMailerPrefsHeader EMMailerPrefsHeader;
-
-struct _EMMailerPrefsHeader {
- gchar *name;
- guint enabled:1;
- guint is_default:1;
-};
-
-struct _EMMailerPrefs {
- GtkVBox parent_object;
-
- GladeXML *gui;
- GConfClient *gconf;
-
- /* General tab */
-
- /* Message Display */
- GtkSpinButton *timeout;
- GtkOptionMenu *charset;
-
- /* Deleting Mail */
- GtkToggleButton *empty_trash;
- GtkComboBox *empty_trash_days;
- GtkToggleButton *confirm_expunge;
-
- /* HTML Mail tab */
- GtkFontButton *font_variable;
- GtkFontButton *font_fixed;
- GtkToggleButton *font_share;
-
- /* Loading Images */
- GtkToggleButton *images_always;
- GtkToggleButton *images_sometimes;
- GtkToggleButton *images_never;
-
- GtkToggleButton *autodetect_links;
-
- /* Labels and Colours tab */
- GtkWidget *label_add;
- GtkWidget *label_edit;
- GtkWidget *label_remove;
- GtkWidget *label_tree;
- GtkListStore *label_list_store;
- guint labels_change_notify_id; /* mail_config's notify id */
-
- /* Headers tab */
- GtkButton *add_header;
- GtkButton *remove_header;
- GtkEntry *entry_header;
- GtkTreeView *header_list;
- GtkListStore *header_list_store;
-
- /* Junk prefs */
- GtkToggleButton *empty_junk;
- GtkComboBox *empty_junk_days;
-
- GtkToggleButton *sa_local_tests_only;
- GtkToggleButton *sa_use_daemon;
- GtkComboBox *default_junk_plugin;
- GtkLabel *plugin_status;
- GtkImage *plugin_image;
-
- GtkToggleButton *junk_header_check;
- GtkTreeView *junk_header_tree;
- GtkListStore *junk_header_list_store;
- GtkButton *junk_header_add;
- GtkButton *junk_header_remove;
- GtkToggleButton *junk_book_lookup;
- GtkToggleButton *junk_lookup_local_only;
-};
-
-struct _EMMailerPrefsClass {
- GtkVBoxClass parent_class;
-};
-
-GType em_mailer_prefs_get_type (void);
-GtkWidget * create_combo_text_widget (void);
-
-GtkWidget * em_mailer_prefs_new (EShell *shell);
-
-EMMailerPrefsHeader *
- em_mailer_prefs_header_from_xml (const gchar *xml);
-gchar * em_mailer_prefs_header_to_xml (EMMailerPrefsHeader *header);
-void em_mailer_prefs_header_free (EMMailerPrefsHeader *header);
-
-G_END_DECLS
-
-#endif /* EM_MAILER_PREFS_H */
diff --git a/mail/em-network-prefs.c b/mail/em-network-prefs.c
deleted file mode 100644
index e530d4d076..0000000000
--- a/mail/em-network-prefs.c
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * 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/>
- *
- *
- * Authors:
- * Veerapuram Varadhan <vvaradhan@novell.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include "em-network-prefs.h"
-
-#include <gdk/gdkkeysyms.h>
-#include <gconf/gconf-client.h>
-#include <glade/glade.h>
-
-#include <glib/gstdio.h>
-
-#include "e-util/e-error.h"
-#include "e-util/e-util-private.h"
-
-#include "mail-config.h"
-#include "em-config.h"
-
-#define d(x)
-
-#define GCONF_E_SHELL_NETWORK_CONFIG_PATH "/apps/evolution/shell/network_config/"
-#define GCONF_E_HTTP_HOST_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "http_host"
-#define GCONF_E_HTTP_PORT_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "http_port"
-#define GCONF_E_HTTPS_HOST_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "secure_host"
-#define GCONF_E_HTTPS_PORT_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "secure_port"
-#define GCONF_E_SOCKS_HOST_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "socks_host"
-#define GCONF_E_SOCKS_PORT_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "socks_port"
-#define GCONF_E_IGNORE_HOSTS_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "ignore_hosts"
-#define GCONF_E_USE_AUTH_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "use_authentication"
-#define GCONF_E_PROXY_TYPE_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "proxy_type"
-#define GCONF_E_AUTH_USER_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "authentication_user"
-#define GCONF_E_AUTH_PWD_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "authentication_password"
-#define GCONF_E_USE_PROXY_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "use_http_proxy"
-#define GCONF_E_AUTOCONFIG_URL_KEY GCONF_E_SHELL_NETWORK_CONFIG_PATH "autoconfig_url"
-
-static void em_network_prefs_class_init (EMNetworkPrefsClass *class);
-static void em_network_prefs_init (EMNetworkPrefs *dialog);
-static void em_network_prefs_destroy (GtkObject *obj);
-static void em_network_prefs_finalise (GObject *obj);
-
-
-static GtkVBoxClass *parent_class = NULL;
-
-
-GType
-em_network_prefs_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EMNetworkPrefsClass),
- NULL, NULL,
- (GClassInitFunc) em_network_prefs_class_init,
- NULL, NULL,
- sizeof (EMNetworkPrefs),
- 0,
- (GInstanceInitFunc) em_network_prefs_init,
- };
-
- type = g_type_register_static (gtk_vbox_get_type (), "EMNetworkPrefs", &info, 0);
- }
-
- return type;
-}
-
-static void
-em_network_prefs_class_init (EMNetworkPrefsClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (gtk_vbox_get_type ());
-
- object_class->destroy = em_network_prefs_destroy;
- gobject_class->finalize = em_network_prefs_finalise;
-}
-
-static void
-em_network_prefs_init (EMNetworkPrefs *prefs)
-{
- /* do something here */
-}
-
-static void
-em_network_prefs_finalise (GObject *obj)
-{
- d(g_print ("Network preferences finalize is called\n"));
-
- /* do something here */
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-static void
-em_network_prefs_destroy (GtkObject *obj)
-{
- d(g_print ("Network preferences destroy is called\n"));
-
- GTK_OBJECT_CLASS (parent_class)->destroy (obj);
-}
-
-static void
-toggle_button_toggled (GtkToggleButton *toggle, EMNetworkPrefs *prefs)
-{
- const gchar *key;
-
- key = g_object_get_data ((GObject *) toggle, "key");
- gconf_client_set_bool (prefs->gconf, key, gtk_toggle_button_get_active (toggle), NULL);
- if (toggle == prefs->use_auth) {
- gboolean sensitivity = gtk_toggle_button_get_active (prefs->use_auth);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_auth_user, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_auth_pwd, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->auth_user, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->auth_pwd, sensitivity);
- }
-}
-
-static void
-toggle_button_init (EMNetworkPrefs *prefs, GtkToggleButton *toggle, const gchar *key)
-{
- gboolean bool;
-
- bool = gconf_client_get_bool (prefs->gconf, key, NULL);
- gtk_toggle_button_set_active (toggle, bool);
-
- g_object_set_data ((GObject *) toggle, "key", (gpointer) key);
- g_signal_connect (toggle, "toggled", G_CALLBACK (toggle_button_toggled), prefs);
-
- if (!gconf_client_key_is_writable (prefs->gconf, key, NULL))
- gtk_widget_set_sensitive ((GtkWidget *) toggle, FALSE);
-}
-
-static GtkWidget *
-emnp_widget_glade(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data)
-{
- EMNetworkPrefs *prefs = data;
-
- return glade_xml_get_widget(prefs->gui, item->label);
-}
-
-static void
-emnp_set_sensitiveness (EMNetworkPrefs *prefs, NetworkConfigProxyType type, gboolean sensitivity)
-{
-#if 0
- if (type == NETWORK_PROXY_AUTOCONFIG) {
- gtk_widget_set_sensitive ((GtkWidget *) prefs->auto_proxy_url, sensitivity);
- d(g_print ("Setting sensitivity of autoconfig to: %d\n", sensitivity));
- } else
-#endif
- if (type == NETWORK_PROXY_MANUAL) {
- gboolean state;
-
- gtk_widget_set_sensitive ((GtkWidget *) prefs->http_host, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->https_host, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->ignore_hosts, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->use_auth, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->http_port, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->https_port, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_ignore_hosts, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_http_host, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_http_port, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_https_host, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_https_port, sensitivity);
-#if 0
- gtk_widget_set_sensitive ((GtkWidget *) prefs->socks_host, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->socks_port, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_socks_host, sensitivity);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_socks_port, sensitivity);
-#endif
- state = sensitivity && gtk_toggle_button_get_active (prefs->use_auth);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_auth_user, state);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->lbl_auth_pwd, state);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->auth_user, state);
- gtk_widget_set_sensitive ((GtkWidget *) prefs->auth_pwd, state);
-
- d(g_print ("Setting sensitivity of manual proxy to: %d\n", sensitivity));
- }
-}
-
-static void
-notify_proxy_type_changed (GtkWidget *widget, EMNetworkPrefs *prefs)
-{
- gint type;
-
- if (gtk_toggle_button_get_active (prefs->sys_proxy))
- type = NETWORK_PROXY_SYS_SETTINGS;
- else if (gtk_toggle_button_get_active (prefs->no_proxy))
- type = NETWORK_PROXY_DIRECT_CONNECTION;
- else if (gtk_toggle_button_get_active (prefs->manual_proxy))
- type = NETWORK_PROXY_MANUAL;
- else
-#if 0
- type = NETWORK_PROXY_AUTOCONFIG;
-#else
- type = NETWORK_PROXY_SYS_SETTINGS;
-#endif
-
- gconf_client_set_int (prefs->gconf, "/apps/evolution/shell/network_config/proxy_type", type, NULL);
-
- if (type == NETWORK_PROXY_DIRECT_CONNECTION ||
- type == NETWORK_PROXY_SYS_SETTINGS) {
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_MANUAL, FALSE);
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_AUTOCONFIG, FALSE);
- } else if (type == NETWORK_PROXY_AUTOCONFIG) {
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_MANUAL, FALSE);
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_AUTOCONFIG, TRUE);
- } else if (type == NETWORK_PROXY_MANUAL) {
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_AUTOCONFIG, FALSE);
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_MANUAL, TRUE);
- }
-
- if (type != NETWORK_PROXY_DIRECT_CONNECTION)
- gconf_client_set_bool (prefs->gconf, GCONF_E_USE_PROXY_KEY, TRUE, NULL);
- else if (type != NETWORK_PROXY_SYS_SETTINGS)
- gconf_client_set_bool (prefs->gconf, GCONF_E_USE_PROXY_KEY, FALSE, NULL);
-
-}
-
-static void
-widget_entry_changed_cb (GtkWidget *widget, gpointer data)
-{
- const gchar *value;
- gint port = -1;
- GConfClient *gconf = mail_config_get_gconf_client ();
-
- /*
- Do not change the order of comparison -
- GtkSpinButton is an extended form of GtkEntry
- */
- if (GTK_IS_SPIN_BUTTON (widget)) {
- port = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widget));
- gconf_client_set_int (gconf, (const gchar *)data, port, NULL);
- d(g_print ("%s:%s: %s is SpinButton: value = [%d]\n", G_STRLOC, G_STRFUNC, (const gchar *)data, port));
- } else if (GTK_IS_ENTRY (widget)) {
- value = gtk_entry_get_text (GTK_ENTRY (widget));
- gconf_client_set_string (gconf, (const gchar *)data, value, NULL);
- d(g_print ("%s:%s: %s is Entry: value = [%s]\n", G_STRLOC, G_STRFUNC, (const gchar *)data, value));
- }
-
-}
-
-/* plugin meta-data */
-static EMConfigItem emnp_items[] = {
- { E_CONFIG_BOOK, (gchar *) "", (gchar *) "network_preferences_toplevel", emnp_widget_glade },
- { E_CONFIG_PAGE, (gchar *) "00.general", (gchar *) "vboxGeneral", emnp_widget_glade },
- { E_CONFIG_SECTION, (gchar *) "00.general/00.proxy", (gchar *) "frameProxy", emnp_widget_glade },
-};
-
-static void
-emnp_free(EConfig *ec, GSList *items, gpointer data)
-{
- /* the prefs data is freed automagically */
-
- g_slist_free(items);
-}
-
-static void
-emnp_set_markups (EMNetworkPrefs *prefs)
-{
- gtk_label_set_use_markup (GTK_LABEL (GTK_BIN(prefs->sys_proxy)->child), TRUE);
- gtk_label_set_use_markup (GTK_LABEL (GTK_BIN(prefs->no_proxy)->child), TRUE);
- gtk_label_set_use_markup (GTK_LABEL (GTK_BIN(prefs->manual_proxy)->child), TRUE);
-#if 0
- gtk_label_set_use_markup (GTK_LABEL (GTK_BIN(prefs->auto_proxy)->child), TRUE);
-#endif
-}
-
-static void
-em_network_prefs_construct (EMNetworkPrefs *prefs)
-{
- GtkWidget *toplevel;
- GladeXML *gui;
- GSList* l;
- gchar *buf;
- EMConfig *ec;
- EMConfigTargetPrefs *target;
- gboolean locked;
- gint i, val, port;
- gchar *gladefile;
-
- prefs->gconf = mail_config_get_gconf_client ();
-
- gladefile = g_build_filename (EVOLUTION_GLADEDIR,
- "mail-config.glade",
- NULL);
- gui = glade_xml_new (gladefile, "network_preferences_toplevel", NULL);
- prefs->gui = gui;
- g_free (gladefile);
-
- /** @HookPoint-EMConfig: Network Preferences
- * @Id: org.gnome.evolution.mail.networkPrefs
- * @Type: E_CONFIG_BOOK
- * @Class: org.gnome.evolution.mail.config:1.0
- * @Target: EMConfigTargetPrefs
- *
- * The network preferences settings page.
- */
- ec = em_config_new(E_CONFIG_BOOK, "org.gnome.evolution.mail.networkPrefs");
- l = NULL;
- for (i=0;i<sizeof(emnp_items)/sizeof(emnp_items[0]);i++)
- l = g_slist_prepend(l, &emnp_items[i]);
- e_config_add_items((EConfig *)ec, l, NULL, NULL, emnp_free, prefs);
-
- /* Proxy tab */
-
- /* Default Behavior */
- locked = !gconf_client_key_is_writable (prefs->gconf, GCONF_E_PROXY_TYPE_KEY, NULL);
-
- val = gconf_client_get_int (prefs->gconf, GCONF_E_PROXY_TYPE_KEY, NULL);
-
- /* no auto-proxy at the moment */
- if (val == NETWORK_PROXY_AUTOCONFIG)
- val = NETWORK_PROXY_SYS_SETTINGS;
-
- prefs->sys_proxy = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "rdoSysSettings"));
- gtk_toggle_button_set_active (prefs->sys_proxy, val == NETWORK_PROXY_SYS_SETTINGS);
- if (locked)
- gtk_widget_set_sensitive ((GtkWidget *) prefs->sys_proxy, FALSE);
-
- d(g_print ("Sys settings ----!!! \n"));
-
- prefs->no_proxy = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "rdoNoProxy"));
- gtk_toggle_button_set_active (prefs->no_proxy, val == NETWORK_PROXY_DIRECT_CONNECTION);
- if (locked)
- gtk_widget_set_sensitive ((GtkWidget *) prefs->no_proxy, FALSE);
-
- d(g_print ("No proxy settings ----!!! \n"));
-
- /* no auto-proxy at the moment */
-#if 0
- prefs->auto_proxy = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "rdoAutoConfig"));
- prefs->auto_proxy_url = GTK_ENTRY (glade_xml_get_widget (gui, "txtAutoConfigUrl"));
-
- gtk_toggle_button_set_active (prefs->auto_proxy, val == NETWORK_PROXY_AUTOCONFIG);
-
- g_signal_connect(prefs->auto_proxy_url, "changed", G_CALLBACK(widget_entry_changed_cb), GCONF_E_AUTOCONFIG_URL_KEY);
- if (locked)
- gtk_widget_set_sensitive ((GtkWidget *) prefs->auto_proxy, FALSE);
-#endif
-
- d(g_print ("Auto config settings ----!!! \n"));
-
- prefs->manual_proxy = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "rdoManualProxy"));
- prefs->http_host = GTK_ENTRY (glade_xml_get_widget (gui, "txtHttpHost"));
- prefs->https_host = GTK_ENTRY (glade_xml_get_widget (gui, "txtHttpsHost"));
- prefs->ignore_hosts = GTK_ENTRY (glade_xml_get_widget (gui, "txtIgnoreHosts"));
- prefs->http_port = GTK_SPIN_BUTTON (glade_xml_get_widget (gui, "spnHttpPort"));
- prefs->https_port = GTK_SPIN_BUTTON (glade_xml_get_widget (gui, "spnHttpsPort"));
- prefs->lbl_http_host = GTK_LABEL (glade_xml_get_widget (gui, "lblHttpHost"));
- prefs->lbl_http_port = GTK_LABEL (glade_xml_get_widget (gui, "lblHttpPort"));
- prefs->lbl_https_host = GTK_LABEL (glade_xml_get_widget (gui, "lblHttpsHost"));
- prefs->lbl_https_port = GTK_LABEL (glade_xml_get_widget (gui, "lblHttpsPort"));
- prefs->lbl_ignore_hosts = GTK_LABEL (glade_xml_get_widget (gui, "lblIgnoreHosts"));
- prefs->use_auth = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkUseAuth"));
- toggle_button_init (prefs, prefs->use_auth, GCONF_E_USE_AUTH_KEY);
- prefs->lbl_auth_user = GTK_LABEL (glade_xml_get_widget (gui, "lblAuthUser"));
- prefs->lbl_auth_pwd = GTK_LABEL (glade_xml_get_widget (gui, "lblAuthPwd"));
- prefs->auth_user = GTK_ENTRY (glade_xml_get_widget (gui, "txtAuthUser"));
- prefs->auth_pwd = GTK_ENTRY (glade_xml_get_widget (gui, "txtAuthPwd"));
-
-#if 0
- prefs->socks_host = GTK_ENTRY (glade_xml_get_widget (gui, "txtSocksHost"));
- prefs->socks_port = GTK_SPIN_BUTTON (glade_xml_get_widget (gui, "spnSocksPort"));
- prefs->lbl_socks_host = GTK_LABEL (glade_xml_get_widget (gui, "lblSocksHost"));
- prefs->lbl_socks_port = GTK_LABEL (glade_xml_get_widget (gui, "lblSocksPort"));
- g_signal_connect (prefs->socks_host, "changed",
- G_CALLBACK(widget_entry_changed_cb), GCONF_E_SOCKS_HOST_KEY);
- g_signal_connect (prefs->socks_port, "value_changed",
- G_CALLBACK(widget_entry_changed_cb), GCONF_E_SOCKS_PORT_KEY);
-#endif
-
- /* Manual proxy options */
- g_signal_connect (prefs->http_host, "changed",
- G_CALLBACK(widget_entry_changed_cb),
- (gpointer) GCONF_E_HTTP_HOST_KEY);
- g_signal_connect (prefs->https_host, "changed",
- G_CALLBACK(widget_entry_changed_cb),
- (gpointer) GCONF_E_HTTPS_HOST_KEY);
- g_signal_connect (prefs->ignore_hosts, "changed",
- G_CALLBACK(widget_entry_changed_cb),
- (gpointer) GCONF_E_IGNORE_HOSTS_KEY);
- g_signal_connect (prefs->http_port, "value_changed",
- G_CALLBACK(widget_entry_changed_cb),
- (gpointer) GCONF_E_HTTP_PORT_KEY);
- g_signal_connect (prefs->https_port, "value_changed",
- G_CALLBACK(widget_entry_changed_cb),
- (gpointer) GCONF_E_HTTPS_PORT_KEY);
- g_signal_connect (prefs->auth_user, "changed",
- G_CALLBACK(widget_entry_changed_cb),
- (gpointer) GCONF_E_AUTH_USER_KEY);
- g_signal_connect (prefs->auth_pwd, "changed",
- G_CALLBACK(widget_entry_changed_cb),
- (gpointer) GCONF_E_AUTH_PWD_KEY);
-
- gtk_toggle_button_set_active (prefs->manual_proxy, val == NETWORK_PROXY_MANUAL);
- g_signal_connect (prefs->sys_proxy, "toggled", G_CALLBACK (notify_proxy_type_changed), prefs);
- g_signal_connect (prefs->no_proxy, "toggled", G_CALLBACK (notify_proxy_type_changed), prefs);
-#if 0
- g_signal_connect (prefs->auto_proxy, "toggled", G_CALLBACK (notify_proxy_type_changed), prefs);
-#endif
- g_signal_connect (prefs->manual_proxy, "toggled", G_CALLBACK (notify_proxy_type_changed), prefs);
-
- if (locked)
- gtk_widget_set_sensitive ((GtkWidget *) prefs->manual_proxy, FALSE);
- d(g_print ("Manual settings ----!!! \n"));
-
- buf = gconf_client_get_string (prefs->gconf, GCONF_E_HTTP_HOST_KEY, NULL);
- gtk_entry_set_text (prefs->http_host, buf ? buf : "");
- g_free (buf);
-
- buf = gconf_client_get_string (prefs->gconf, GCONF_E_HTTPS_HOST_KEY, NULL);
- gtk_entry_set_text (prefs->https_host, buf ? buf : "");
- g_free (buf);
-
- buf = gconf_client_get_string (prefs->gconf, GCONF_E_IGNORE_HOSTS_KEY, NULL);
- gtk_entry_set_text (prefs->ignore_hosts, buf ? buf : "");
- g_free (buf);
-
- buf = gconf_client_get_string (prefs->gconf, GCONF_E_AUTH_USER_KEY, NULL);
- gtk_entry_set_text (prefs->auth_user, buf ? buf : "");
- g_free (buf);
-
- buf = gconf_client_get_string (prefs->gconf, GCONF_E_AUTH_PWD_KEY, NULL);
- gtk_entry_set_text (prefs->auth_pwd, buf ? buf : "");
- g_free (buf);
-
- port = gconf_client_get_int (prefs->gconf, GCONF_E_HTTP_PORT_KEY, NULL);
- gtk_spin_button_set_value (prefs->http_port, (gdouble)port);
-
- port = gconf_client_get_int (prefs->gconf, GCONF_E_HTTPS_PORT_KEY, NULL);
- gtk_spin_button_set_value (prefs->https_port, (gdouble)port);
-
-#if 0
- buf = gconf_client_get_string (prefs->gconf, GCONF_E_SOCKS_HOST_KEY, NULL);
- gtk_entry_set_text (prefs->socks_host, buf ? buf : "");
- g_free (buf);
-
- port = gconf_client_get_int (prefs->gconf, GCONF_E_SOCKS_PORT_KEY, NULL);
- gtk_spin_button_set_value (prefs->socks_port, (gdouble)port);
-#endif
- emnp_set_markups (prefs);
-
- if (val == NETWORK_PROXY_DIRECT_CONNECTION ||
- val == NETWORK_PROXY_SYS_SETTINGS) {
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_MANUAL, FALSE);
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_AUTOCONFIG, FALSE);
- } else if (val == NETWORK_PROXY_AUTOCONFIG) {
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_MANUAL, FALSE);
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_AUTOCONFIG, TRUE);
- } else if (val == NETWORK_PROXY_MANUAL) {
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_AUTOCONFIG, FALSE);
- emnp_set_sensitiveness (prefs, NETWORK_PROXY_MANUAL, TRUE);
- }
-
- /* get our toplevel widget */
- target = em_config_target_new_prefs(ec, prefs->gconf);
- e_config_set_target((EConfig *)ec, (EConfigTarget *)target);
- toplevel = e_config_create_widget((EConfig *)ec);
- gtk_container_add (GTK_CONTAINER (prefs), toplevel);
-}
-
-GtkWidget *
-em_network_prefs_new (void)
-{
- EMNetworkPrefs *new;
-
- new = (EMNetworkPrefs *) g_object_new (em_network_prefs_get_type (), NULL);
- em_network_prefs_construct (new);
-
- return (GtkWidget *) new;
-}
diff --git a/mail/em-network-prefs.h b/mail/em-network-prefs.h
deleted file mode 100644
index 057247b750..0000000000
--- a/mail/em-network-prefs.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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/>
- *
- *
- * Authors:
- * Veerapuram Varadhan <vvaradhan@novell.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef EM_NETWORK_PREFS_H
-#define EM_NETWORK_PREFS_H
-
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-#include <gconf/gconf-client.h>
-
-/* Standard GObject macros */
-#define EM_TYPE_NETWORK_PREFS \
- (em_network_prefs_get_type ())
-#define EM_NETWORK_PREFS(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST \
- ((obj), EM_TYPE_NETWORK_PREFS, EMNetworkPrefs))
-#define EM_NETWORK_PREFS_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_CAST \
- ((cls), EM_TYPE_NETWORK_PREFS, EMNetworkPrefsClass))
-#define EM_IS_NETWORK_PREFS(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE \
- ((obj), EM_TYPE_NETWORK_PREFS))
-#define EM_IS_NETWORK_PREFS_CLASS(cls) \
- (G_TYPE_CHECK_CLASS_TYPE \
- ((cls), EM_TYPE_NETWORK_PREFS))
-#define EM_NETWORK_PREFS_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS \
- ((obj), EM_TYPE_NETWORK_PREFS, EMNetworkPrefsClass))
-
-G_BEGIN_DECLS
-
-typedef struct _EMNetworkPrefs EMNetworkPrefs;
-typedef struct _EMNetworkPrefsClass EMNetworkPrefsClass;
-
-typedef enum {
- NETWORK_PROXY_SYS_SETTINGS,
- NETWORK_PROXY_DIRECT_CONNECTION,
- NETWORK_PROXY_MANUAL,
- NETWORK_PROXY_AUTOCONFIG
-} NetworkConfigProxyType;
-
-struct _EMNetworkPrefs {
- GtkVBox parent_object;
-
- GConfClient *gconf;
-
- GladeXML *gui;
-
- /* Default Behavior */
- GtkToggleButton *sys_proxy;
- GtkToggleButton *no_proxy;
- GtkToggleButton *manual_proxy;
- GtkToggleButton *use_auth;
-
- GtkEntry *http_host;
- GtkEntry *https_host;
- GtkEntry *socks_host;
- GtkEntry *ignore_hosts;
- GtkEntry *auth_user;
- GtkEntry *auth_pwd;
-
- GtkLabel *lbl_http_host;
- GtkLabel *lbl_http_port;
- GtkLabel *lbl_https_host;
- GtkLabel *lbl_https_port;
- GtkLabel *lbl_ignore_hosts;
- GtkLabel *lbl_auth_user;
- GtkLabel *lbl_auth_pwd;
-
- GtkSpinButton *http_port;
- GtkSpinButton *https_port;
-};
-
-struct _EMNetworkPrefsClass {
- GtkVBoxClass parent_class;
-};
-
-GType em_network_prefs_get_type (void);
-GtkWidget * em_network_prefs_new (void);
-
-G_END_DECLS
-
-#endif /* EM_NETWORK_PREFS_H */
diff --git a/mail/em-utils.c b/mail/em-utils.c
index dffa11b132..a971b90f34 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -71,21 +71,49 @@
#include "e-util/e-account-utils.h"
#include "e-util/e-dialog-utils.h"
#include "e-util/e-error.h"
+#include "shell/e-shell.h"
#include "widgets/misc/e-alert-activity.h"
#include "widgets/misc/e-attachment.h"
#include "em-utils.h"
#include "em-composer-utils.h"
#include "em-format-quote.h"
-#include "em-account-editor.h"
-
#include "e-mail-local.h"
-#include "e-mail-shell-backend.h"
static void emu_save_part_done (CamelMimePart *part, gchar *name, gint done, gpointer data);
#define d(x)
+const gchar *
+em_utils_get_data_dir (void)
+{
+ EShell *shell;
+ EShellBackend *shell_backend;
+
+ /* XXX This is a temporary solution until I can figure out a
+ * better way. Ideally, nothing below the module layer
+ * should need to know about the user data directory. */
+ shell = e_shell_get_default ();
+ shell_backend = e_shell_get_backend_by_name (shell, "mail");
+
+ return e_shell_backend_get_data_dir (shell_backend);
+}
+
+const gchar *
+em_utils_get_config_dir (void)
+{
+ EShell *shell;
+ EShellBackend *shell_backend;
+
+ /* XXX This is a temporary solution until I can figure out a
+ * better way. Ideally, nothing below the module layer
+ * should need to know about the user config directory. */
+ shell = e_shell_get_default ();
+ shell_backend = e_shell_get_backend_by_name (shell, "mail");
+
+ return e_shell_backend_get_config_dir (shell_backend);
+}
+
/**
* em_utils_prompt_user:
* @parent: parent window
@@ -174,69 +202,22 @@ em_utils_uids_free (GPtrArray *uids)
g_ptr_array_free (uids, TRUE);
}
-static void
-druid_destroy_cb (gpointer user_data, GObject *deadbeef)
-{
- gtk_main_quit ();
-}
-
-/**
- * em_utils_configure_account:
- * @parent: parent window for the druid to be a child of.
- *
- * Displays a druid allowing the user to configure an account. If
- * @parent is non-NULL, then the druid will be created as a child
- * window of @parent's toplevel window.
- *
- * Returns %TRUE if an account has been configured or %FALSE
- * otherwise.
- **/
-gboolean
-em_utils_configure_account (GtkWindow *parent)
-{
- EMAccountEditor *emae;
- EAccountList *account_list;
-
- g_return_val_if_fail (GTK_IS_WINDOW (parent), FALSE);
-
- emae = em_account_editor_new(NULL, EMAE_DRUID, "org.gnome.evolution.mail.config.accountDruid");
- gtk_window_set_transient_for (GTK_WINDOW (emae->editor), parent);
-
- g_object_weak_ref((GObject *)emae->editor, (GWeakNotify) druid_destroy_cb, NULL);
- gtk_widget_show(emae->editor);
- gtk_grab_add(emae->editor);
- gtk_main();
-
- account_list = e_get_account_list ();
-
- return (e_list_length ((EList *) account_list) > 0);
-}
-
/**
* em_utils_check_user_can_send_mail:
- * @parent: parent window for the druid to be a child of.
- *
- * If no accounts have been configured, the user will be given a
- * chance to configure an account. In the case that no accounts are
- * configured, a druid will be created. If @parent is non-NULL, then
- * the druid will be created as a child window of @parent's toplevel
- * window.
*
* Returns %TRUE if the user has an account configured (to send mail)
* or %FALSE otherwise.
**/
gboolean
-em_utils_check_user_can_send_mail (GtkWindow *parent)
+em_utils_check_user_can_send_mail (void)
{
EAccountList *account_list;
EAccount *account;
account_list = e_get_account_list ();
- if (e_list_length ((EList *) account_list) == 0) {
- if (!em_utils_configure_account (parent))
- return FALSE;
- }
+ if (e_list_length ((EList *) account_list) == 0)
+ return FALSE;
if (!(account = e_get_default_account ()))
return FALSE;
@@ -255,16 +236,13 @@ static GtkWidget *filter_editor = NULL;
static void
em_filter_editor_response (GtkWidget *dialog, gint button, gpointer user_data)
{
- EShellBackend *shell_backend;
EMFilterContext *fc;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
if (button == GTK_RESPONSE_OK) {
const gchar *data_dir;
gchar *user;
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
fc = g_object_get_data ((GObject *) dialog, "context");
user = g_strdup_printf ("%s/filters.xml", data_dir);
rule_context_save ((RuleContext *) fc, user);
@@ -293,7 +271,6 @@ static EMFilterSource em_filter_source_element_names[] = {
void
em_utils_edit_filters (GtkWidget *parent)
{
- EShellBackend *shell_backend;
const gchar *data_dir;
gchar *user, *system;
EMFilterContext *fc;
@@ -303,8 +280,7 @@ em_utils_edit_filters (GtkWidget *parent)
return;
}
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
fc = em_filter_context_new ();
user = g_build_filename (data_dir, "filters.xml", NULL);
@@ -2292,10 +2268,12 @@ em_utils_clear_get_password_canceled_accounts_flag (void)
void
em_utils_show_error_silent (GtkWidget *widget)
{
+ EShell *shell;
EShellBackend *shell_backend;
EActivity *activity;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
+ shell = e_shell_get_default ();
+ shell_backend = e_shell_get_backend_by_name (shell, "mail");
activity = e_alert_activity_new_warning (widget);
e_shell_backend_add_activity (shell_backend, activity);
@@ -2310,10 +2288,12 @@ em_utils_show_error_silent (GtkWidget *widget)
void
em_utils_show_info_silent (GtkWidget *widget)
{
+ EShell *shell;
EShellBackend *shell_backend;
EActivity *activity;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
+ shell = e_shell_get_default ();
+ shell_backend = e_shell_get_backend_by_name (shell, "mail");
activity = e_alert_activity_new_info (widget);
e_shell_backend_add_activity (shell_backend, activity);
diff --git a/mail/em-utils.h b/mail/em-utils.h
index 64c4d7aba7..14dc8cef23 100644
--- a/mail/em-utils.h
+++ b/mail/em-utils.h
@@ -38,13 +38,15 @@ G_BEGIN_DECLS
struct _EMFormat;
+const gchar * em_utils_get_data_dir (void);
+const gchar * em_utils_get_config_dir (void);
+
gboolean em_utils_prompt_user(GtkWindow *parent, const gchar *promptkey, const gchar *tag, const gchar *arg0, ...);
GPtrArray *em_utils_uids_copy (GPtrArray *uids);
void em_utils_uids_free (GPtrArray *uids);
-gboolean em_utils_configure_account (GtkWindow *parent);
-gboolean em_utils_check_user_can_send_mail (GtkWindow *parent);
+gboolean em_utils_check_user_can_send_mail (void);
void em_utils_edit_filters (GtkWidget *parent);
void em_filename_make_safe (gchar *string);
diff --git a/mail/evolution-module-mail.c b/mail/evolution-module-mail.c
deleted file mode 100644
index 97bc953c41..0000000000
--- a/mail/evolution-module-mail.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * evolution-module-mail.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/>
- *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#include "e-mail-shell-backend.h"
-#include "e-mail-shell-content.h"
-#include "e-mail-shell-sidebar.h"
-#include "e-mail-shell-view.h"
-
-/* Module Entry Points */
-void e_module_load (GTypeModule *type_module);
-void e_module_unload (GTypeModule *type_module);
-const gchar * g_module_check_init (GModule *module);
-
-G_MODULE_EXPORT void
-e_module_load (GTypeModule *type_module)
-{
- /* Register dynamically loaded types. */
-
- e_mail_shell_backend_register_type (type_module);
- e_mail_shell_content_register_type (type_module);
- e_mail_shell_sidebar_register_type (type_module);
- e_mail_shell_view_register_type (type_module);
-}
-
-G_MODULE_EXPORT void
-e_module_unload (GTypeModule *type_module)
-{
-}
-
-G_MODULE_EXPORT const gchar *
-g_module_check_init (GModule *module)
-{
- /* FIXME Until mail is split into a module library and a
- * reusable shared library, prevent the module from
- * being unloaded. Unloading the module resets all
- * static variables, which screws up foo_get_type()
- * functions among other things. */
- g_module_make_resident (module);
-
- return NULL;
-}
diff --git a/mail/importers/Makefile.am b/mail/importers/Makefile.am
new file mode 100644
index 0000000000..ecd883cd8b
--- /dev/null
+++ b/mail/importers/Makefile.am
@@ -0,0 +1,33 @@
+if OS_WIN32
+WIN32_BOOTSTRAP_LIBS = \
+ $(top_builddir)/win32/libevolution-mail.la
+endif
+
+privsolib_LTLIBRARIES = libevolution-mail-importers.la
+
+INCLUDES = -I.. \
+ -I$(srcdir)/.. \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/widgets \
+ $(EVOLUTION_MAIL_CFLAGS) \
+ -DG_LOG_DOMAIN=\"evolution-mail-importer\" \
+ -DEVOLUTION_PRIVDATADIR=\""$(privdatadir)"\" \
+ $(IMPORTERS_CFLAGS)
+
+libevolution_mail_importers_la_SOURCES = \
+ mail-importer.c \
+ mail-importer.h \
+ elm-importer.c \
+ pine-importer.c \
+ evolution-mbox-importer.c
+
+libevolution_mail_importers_la_LDFLAGS = $(NO_UNDEFINED)
+
+libevolution_mail_importers_la_LIBADD = \
+ $(WIN32_BOOTSTRAP_LIBS) \
+ $(top_builddir)/e-util/libeutil.la \
+ $(top_builddir)/filter/libfilter.la \
+ $(top_builddir)/mail/libevolution-mail.la \
+ $(IMPORTERS_LIBS)
+
+-include $(top_srcdir)/git.mk
diff --git a/mail/importers/evolution-mbox-importer.c b/mail/importers/evolution-mbox-importer.c
index e44cf57fef..ade34526fc 100644
--- a/mail/importers/evolution-mbox-importer.c
+++ b/mail/importers/evolution-mbox-importer.c
@@ -42,7 +42,6 @@
#include "mail/e-mail-local.h"
#include "mail/e-mail-store.h"
-#include "mail/e-mail-shell-backend.h"
#include "mail/em-folder-selection-button.h"
#include "mail/em-folder-tree-model.h"
#include "mail/mail-mt.h"
diff --git a/mail/importers/mail-importer.c b/mail/importers/mail-importer.c
index 1e1f423316..dd4de6370b 100644
--- a/mail/importers/mail-importer.c
+++ b/mail/importers/mail-importer.c
@@ -45,12 +45,12 @@
#include <camel/camel-stream-mem.h>
#include "e-util/e-util-private.h"
+#include "shell/e-shell-backend.h"
-#include "mail/mail-mt.h"
-#include "mail/mail-tools.h"
-
-#include "mail/e-mail-local.h"
-#include "mail/e-mail-shell-backend.h"
+#include "mail-mt.h"
+#include "mail-tools.h"
+#include "e-mail-local.h"
+#include "em-utils.h"
#include "mail-importer.h"
@@ -358,7 +358,6 @@ struct _import_folders_data {
static void
import_folders_rec(struct _import_folders_data *m, const gchar *filepath, const gchar *folderparent)
{
- EShellBackend *shell_backend;
GDir *dir;
const gchar *d;
struct stat st;
@@ -370,8 +369,7 @@ import_folders_rec(struct _import_folders_data *m, const gchar *filepath, const
if (dir == NULL)
return;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
utf8_filename = g_filename_to_utf8 (filepath, -1, NULL, NULL, NULL);
camel_operation_start(NULL, _("Scanning %s"), utf8_filename);
diff --git a/mail/mail-autofilter.c b/mail/mail-autofilter.c
index a9f757e6fa..fd7fc5752b 100644
--- a/mail/mail-autofilter.c
+++ b/mail/mail-autofilter.c
@@ -48,8 +48,6 @@
#include <camel/camel-internet-address.h>
#include <camel/camel-mime-message.h>
-#include "e-mail-shell-backend.h"
-
#define d(x)
static void
@@ -346,7 +344,6 @@ filter_rule_from_message (EMFilterContext *context, CamelMimeMessage *msg, gint
void
filter_gui_add_from_message (CamelMimeMessage *msg, const gchar *source, gint flags)
{
- EShellBackend *shell_backend;
EMFilterContext *fc;
const gchar *data_dir;
gchar *user, *system;
@@ -354,10 +351,8 @@ filter_gui_add_from_message (CamelMimeMessage *msg, const gchar *source, gint fl
g_return_if_fail (msg != NULL);
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
fc = em_filter_context_new ();
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "filters.xml", NULL);
system = g_build_filename (EVOLUTION_PRIVDATADIR, "filtertypes.xml", NULL);
rule_context_load ((RuleContext *)fc, system, user);
@@ -375,7 +370,6 @@ filter_gui_add_from_message (CamelMimeMessage *msg, const gchar *source, gint fl
void
mail_filter_rename_uri(CamelStore *store, const gchar *olduri, const gchar *newuri)
{
- EShellBackend *shell_backend;
EMFilterContext *fc;
const gchar *data_dir;
gchar *user, *system;
@@ -385,10 +379,8 @@ mail_filter_rename_uri(CamelStore *store, const gchar *olduri, const gchar *newu
eolduri = em_uri_from_camel(olduri);
enewuri = em_uri_from_camel(newuri);
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
fc = em_filter_context_new ();
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "filters.xml", NULL);
system = g_build_filename (EVOLUTION_PRIVDATADIR, "filtertypes.xml", NULL);
rule_context_load ((RuleContext *)fc, system, user);
@@ -412,7 +404,6 @@ mail_filter_rename_uri(CamelStore *store, const gchar *olduri, const gchar *newu
void
mail_filter_delete_uri(CamelStore *store, const gchar *uri)
{
- EShellBackend *shell_backend;
EMFilterContext *fc;
const gchar *data_dir;
gchar *user, *system;
@@ -421,10 +412,8 @@ mail_filter_delete_uri(CamelStore *store, const gchar *uri)
euri = em_uri_from_camel(uri);
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
fc = em_filter_context_new ();
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "filters.xml", NULL);
system = g_build_filename (EVOLUTION_PRIVDATADIR, "filtertypes.xml", NULL);
rule_context_load ((RuleContext *)fc, system, user);
diff --git a/mail/mail-config.c b/mail/mail-config.c
index 09763920eb..b1cfd5ab29 100644
--- a/mail/mail-config.c
+++ b/mail/mail-config.c
@@ -63,9 +63,8 @@
#include "mail-config.h"
#include "mail-mt.h"
#include "mail-tools.h"
-
+#include "em-utils.h"
#include "e-mail-local.h"
-#include "e-mail-shell-backend.h"
typedef struct {
GConfClient *gconf;
@@ -773,13 +772,11 @@ mail_config_get_default_transport (void)
static gchar *
uri_to_evname (const gchar *uri, const gchar *prefix)
{
- EShellBackend *shell_backend;
const gchar *data_dir;
gchar *safe;
gchar *tmp;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
safe = g_strdup (uri);
e_filename_make_safe (safe);
@@ -908,13 +905,10 @@ mail_config_folder_to_safe_url (CamelFolder *folder)
gchar *
mail_config_folder_to_cachename (CamelFolder *folder, const gchar *prefix)
{
- EShellBackend *shell_backend;
gchar *url, *basename, *filename;
const gchar *config_dir;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
- config_dir = e_shell_backend_get_config_dir (shell_backend);
-
+ config_dir = em_utils_get_config_dir ();
url = mail_config_folder_to_safe_url (folder);
basename = g_strdup_printf ("%s%s", prefix, url);
filename = g_build_filename (config_dir, basename, NULL);
diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c
index faa80b2629..b3d7a1e12b 100644
--- a/mail/mail-folder-cache.c
+++ b/mail/mail-folder-cache.c
@@ -64,6 +64,7 @@
#include "em-folder-tree-model.h"
#include "em-event.h"
+#include "em-utils.h"
#include "e-mail-local.h"
#include "e-mail-store.h"
@@ -629,7 +630,6 @@ folder_to_url(CamelStore *store, const gchar *full_name)
static void
rename_folders(struct _store_info *si, const gchar *oldbase, const gchar *newbase, CamelFolderInfo *fi)
{
- EShellBackend *shell_backend;
gchar *old, *olduri, *oldfile, *newuri, *newfile;
struct _folder_info *mfi;
struct _folder_update *up;
@@ -689,8 +689,7 @@ rename_folders(struct _store_info *si, const gchar *oldbase, const gchar *newbas
#endif
/* rename the meta-data we maintain ourselves */
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
- config_dir = e_shell_backend_get_config_dir (shell_backend);
+ config_dir = em_utils_get_config_dir ();
olduri = folder_to_url(si->store, old);
e_filename_make_safe(olduri);
newuri = folder_to_url(si->store, fi->full_name);
diff --git a/mail/mail-mt.c b/mail/mail-mt.c
index ade31e56b9..c5b6edaa14 100644
--- a/mail/mail-mt.c
+++ b/mail/mail-mt.c
@@ -34,6 +34,7 @@
#include <camel/camel-url.h>
#include <camel/camel-operation.h>
+#include "shell/e-shell.h"
#include "misc/e-gui-utils.h"
#include "e-util/e-error.h"
#include "e-util/e-icon-factory.h"
@@ -43,8 +44,6 @@
#include "mail-session.h"
#include "mail-mt.h"
-#include "e-mail-shell-backend.h"
-
/*#define MALLOC_CHECK*/
#define LOG_OPS
#define LOG_LOCKS
@@ -142,9 +141,11 @@ mail_msg_new (MailMsgInfo *info)
static void
end_event_callback (CamelObject *o, EActivity *activity, gpointer error)
{
+ EShell *shell;
EShellBackend *shell_backend;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
+ shell = e_shell_get_default ();
+ shell_backend = e_shell_get_backend_by_name (shell, "mail");
if (error == NULL) {
e_activity_complete (activity);
@@ -941,6 +942,7 @@ struct _op_status_msg {
static void
op_status_exec (struct _op_status_msg *m)
{
+ EShell *shell;
EShellBackend *shell_backend;
MailMsg *msg;
MailMsgPrivate *data;
@@ -949,7 +951,8 @@ op_status_exec (struct _op_status_msg *m)
g_return_if_fail (mail_in_main_thread ());
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
+ shell = e_shell_get_default ();
+ shell_backend = e_shell_get_backend_by_name (shell, "mail");
MAIL_MT_LOCK (mail_msg_lock);
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index a88a55e6c2..1c00420f89 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -70,12 +70,12 @@
#include "mail-vfolder.h"
#include "e-mail-local.h"
-#include "e-mail-shell-backend.h"
#define w(x)
#define d(x)
-extern const gchar *x_mailer;
+/* XXX Make this a preprocessor definition. */
+const gchar *x_mailer = "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT;
/* used for both just filtering a folder + uid's, and for filtering a whole folder */
/* used both for fetching mail, and for filtering mail */
@@ -247,19 +247,16 @@ static gchar *
uid_cachename_hack (CamelStore *store)
{
CamelURL *url = CAMEL_SERVICE (store)->url;
- EShellBackend *shell_backend;
gchar *encoded_url, *filename;
const gchar *data_dir;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
encoded_url = g_strdup_printf ("%s%s%s@%s", url->user,
url->authmech ? ";auth=" : "",
url->authmech ? url->authmech : "",
url->host);
e_filename_make_safe (encoded_url);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
filename = g_build_filename (data_dir, "pop", encoded_url, "uid-cache", NULL);
g_free (encoded_url);
@@ -1762,17 +1759,14 @@ empty_trash_desc (struct _empty_trash_msg *m)
static void
empty_trash_exec (struct _empty_trash_msg *m)
{
- EShellBackend *shell_backend;
const gchar *data_dir;
CamelFolder *trash;
gchar *uri;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
if (m->account) {
trash = mail_tool_get_trash (m->account->source->url, FALSE, &m->base.ex);
} else {
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
uri = g_strdup_printf ("mbox:%s/local", data_dir);
trash = mail_tool_get_trash (uri, TRUE, &m->base.ex);
g_free (uri);
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index 2f9cd77de6..9cc75057fa 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -51,7 +51,6 @@
#include "e-util/gconf-bridge.h"
#include "e-mail-local.h"
-#include "e-mail-shell-backend.h"
#define d(x)
diff --git a/mail/mail-session.c b/mail/mail-session.c
index 862b611d15..bdb5d915c9 100644
--- a/mail/mail-session.c
+++ b/mail/mail-session.c
@@ -83,7 +83,7 @@ typedef struct _MailSessionClass {
} MailSessionClass;
-static EMailShellBackend *session_mail_shell_backend;
+static EShellBackend *session_shell_backend;
static CamelSessionClass *ms_parent_class;
static gchar *get_password(CamelSession *session, CamelService *service, const gchar *domain, const gchar *prompt, const gchar *item, guint32 flags, CamelException *ex);
@@ -503,7 +503,6 @@ session_system_beep (CamelFilterDriver *driver, gpointer user_data)
static CamelFilterDriver *
main_get_filter_driver (CamelSession *session, const gchar *type, CamelException *ex)
{
- EShellBackend *shell_backend;
CamelFilterDriver *driver;
FilterRule *rule = NULL;
const gchar *data_dir;
@@ -512,9 +511,8 @@ main_get_filter_driver (CamelSession *session, const gchar *type, CamelException
RuleContext *fc;
gconf = mail_config_get_gconf_client ();
- shell_backend = E_SHELL_BACKEND (session_mail_shell_backend);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = e_shell_backend_get_data_dir (session_shell_backend);
user = g_build_filename (data_dir, "filters.xml", NULL);
system = g_build_filename (EVOLUTION_PRIVDATADIR, "filtertypes.xml", NULL);
fc = (RuleContext *) em_filter_context_new ();
@@ -708,17 +706,15 @@ mail_session_check_junk_notify (GConfClient *gconf, guint id, GConfEntry *entry,
}
void
-mail_session_init (EMailShellBackend *mail_shell_backend)
+mail_session_init (EShellBackend *shell_backend)
{
EShell *shell;
- EShellBackend *shell_backend;
GConfClient *gconf;
gboolean online;
const gchar *data_dir;
- session_mail_shell_backend = mail_shell_backend;
+ session_shell_backend = shell_backend;
- shell_backend = E_SHELL_BACKEND (mail_shell_backend);
shell = e_shell_backend_get_shell (shell_backend);
online = e_shell_get_online (shell);
diff --git a/mail/mail-session.h b/mail/mail-session.h
index 450404efcd..b1274403c0 100644
--- a/mail/mail-session.h
+++ b/mail/mail-session.h
@@ -25,11 +25,11 @@
#include <glib.h>
#include <camel/camel-session.h>
-#include <mail/e-mail-shell-backend.h>
+#include <shell/e-shell-backend.h>
G_BEGIN_DECLS
-void mail_session_init (EMailShellBackend *mail_shell_backend);
+void mail_session_init (EShellBackend *shell_backend);
void mail_session_shutdown (void);
gboolean mail_session_get_interactive (void);
void mail_session_set_interactive (gboolean interactive);
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
index 67407ae81f..a19c3dedb4 100644
--- a/mail/mail-tools.c
+++ b/mail/mail-tools.c
@@ -58,8 +58,6 @@
#include "mail-tools.h"
#include "mail-vfolder.h"
-#include "e-mail-shell-backend.h"
-
/* **************************************** */
CamelFolder *
@@ -107,7 +105,6 @@ mail_tool_get_trash (const gchar *url, gint connect, CamelException *ex)
static gchar *
mail_tool_get_local_movemail_path (const guchar *uri, CamelException *ex)
{
- EShellBackend *shell_backend;
guchar *safe_uri, *c;
const gchar *data_dir;
gchar *path, *full;
@@ -118,8 +115,7 @@ mail_tool_get_local_movemail_path (const guchar *uri, CamelException *ex)
if (strchr("/:;=|%&#!*^()\\, ", *c) || !isprint((gint) *c))
*c = '_';
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
path = g_build_filename (data_dir, "spool", NULL);
if (g_stat(path, &st) == -1 && g_mkdir_with_parents(path, 0777) == -1) {
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
index 5a5f7324ed..487eea0e10 100644
--- a/mail/mail-vfolder.c
+++ b/mail/mail-vfolder.c
@@ -52,7 +52,6 @@
#include "e-mail-local.h"
#include "e-mail-store.h"
-#include "e-mail-shell-backend.h"
#define d(x) /* (printf("%s:%s: ", G_STRLOC, G_STRFUNC), (x))*/
@@ -533,7 +532,6 @@ done:
void
mail_vfolder_delete_uri(CamelStore *store, const gchar *curi)
{
- EShellBackend *shell_backend;
FilterRule *rule;
const gchar *source;
CamelVeeFolder *vf;
@@ -550,8 +548,6 @@ mail_vfolder_delete_uri(CamelStore *store, const gchar *curi)
g_return_if_fail (mail_in_main_thread());
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
changed = g_string_new ("");
LOCK();
@@ -612,7 +608,7 @@ done:
dialog = e_error_new(NULL, "mail:vfolder-updated", changed->str, uri, NULL);
em_utils_show_info_silent (dialog);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "vfolders.xml", NULL);
rule_context_save ((RuleContext *) context, user);
g_free (user);
@@ -627,7 +623,6 @@ done:
void
mail_vfolder_rename_uri(CamelStore *store, const gchar *cfrom, const gchar *cto)
{
- EShellBackend *shell_backend;
FilterRule *rule;
const gchar *source;
CamelVeeFolder *vf;
@@ -641,8 +636,6 @@ mail_vfolder_rename_uri(CamelStore *store, const gchar *cfrom, const gchar *cto)
g_return_if_fail (mail_in_main_thread());
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
from = em_uri_from_camel(cfrom);
to = em_uri_from_camel(cto);
@@ -683,7 +676,7 @@ mail_vfolder_rename_uri(CamelStore *store, const gchar *cfrom, const gchar *cto)
gchar *user;
d(printf("Vfolders updated from renamed folder\n"));
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "vfolders.xml", NULL);
rule_context_save((RuleContext *)context, user);
g_free(user);
@@ -837,7 +830,6 @@ store_folder_created(CamelObject *o, gpointer event_data, gpointer data)
static void
store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data)
{
- EShellBackend *shell_backend;
CamelStore *store = (CamelStore *)o;
CamelFolderInfo *info = event_data;
FilterRule *rule;
@@ -846,8 +838,6 @@ store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data)
d(printf("Folder deleted: %s\n", info->name));
store = store;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
/* Warning not thread safe, but might be enough */
LOCK();
@@ -864,7 +854,7 @@ store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data)
g_object_unref(rule);
g_signal_connect(context, "rule_removed", G_CALLBACK(context_rule_removed), context);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "vfolders.xml", NULL);
rule_context_save((RuleContext *)context, user);
g_free(user);
@@ -878,15 +868,12 @@ store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data)
static void
store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data)
{
- EShellBackend *shell_backend;
CamelRenameInfo *info = event_data;
FilterRule *rule;
gchar *user;
gpointer key, folder;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
/* This should be more-or-less thread-safe */
d(printf("Folder renamed to '%s' from '%s'\n", info->new->full_name, info->old_base));
@@ -913,7 +900,7 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data)
filter_rule_set_name(rule, info->new->full_name);
g_signal_connect(rule, "changed", G_CALLBACK(rule_changed), folder);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "vfolders.xml", NULL);
rule_context_save((RuleContext *)context, user);
g_free(user);
@@ -931,15 +918,12 @@ vfolder_load_storage(void)
/* lock for loading storage, it is safe to call it more than once */
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
- EShellBackend *shell_backend;
const gchar *data_dir;
gchar *user, *storeuri;
FilterRule *rule;
gchar *xmlfile;
GConfClient *gconf;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
pthread_mutex_lock (&lock);
if (vfolder_hash) {
@@ -953,7 +937,7 @@ vfolder_load_storage(void)
pthread_mutex_unlock (&lock);
/* first, create the vfolder store, and set it up */
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
storeuri = g_strdup_printf("vfolder:%s/vfolder", data_dir);
vfolder_store = camel_session_get_store(session, storeuri, NULL);
if (vfolder_store == NULL) {
@@ -1010,14 +994,11 @@ vfolder_load_storage(void)
void
vfolder_revert(void)
{
- EShellBackend *shell_backend;
const gchar *data_dir;
gchar *user;
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
d(printf("vfolder_revert\n"));
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "vfolders.xml", NULL);
rule_context_revert((RuleContext *)context, user);
g_free(user);
@@ -1064,10 +1045,6 @@ vfolder_edit (EShellView *shell_view)
static void
edit_rule_response(GtkWidget *w, gint button, gpointer data)
{
- EShellBackend *shell_backend;
-
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
if (button == GTK_RESPONSE_OK) {
const gchar *data_dir;
gchar *user;
@@ -1075,7 +1052,7 @@ edit_rule_response(GtkWidget *w, gint button, gpointer data)
FilterRule *orig = g_object_get_data (G_OBJECT (w), "orig");
filter_rule_copy(orig, rule);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "vfolders.xml", NULL);
rule_context_save((RuleContext *)context, user);
g_free(user);
@@ -1132,10 +1109,6 @@ vfolder_edit_rule(const gchar *uri)
static void
new_rule_clicked(GtkWidget *w, gint button, gpointer data)
{
- EShellBackend *shell_backend;
-
- shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
-
if (button == GTK_RESPONSE_OK) {
const gchar *data_dir;
gchar *user;
@@ -1154,7 +1127,7 @@ new_rule_clicked(GtkWidget *w, gint button, gpointer data)
g_object_ref(rule);
rule_context_add_rule((RuleContext *)context, rule);
- data_dir = e_shell_backend_get_data_dir (shell_backend);
+ data_dir = em_utils_get_data_dir ();
user = g_build_filename (data_dir, "vfolders.xml", NULL);
rule_context_save((RuleContext *)context, user);
g_free(user);