aboutsummaryrefslogtreecommitdiffstats
path: root/my-evolution/e-summary-mail.c
diff options
context:
space:
mode:
Diffstat (limited to 'my-evolution/e-summary-mail.c')
-rw-r--r--my-evolution/e-summary-mail.c437
1 files changed, 84 insertions, 353 deletions
diff --git a/my-evolution/e-summary-mail.c b/my-evolution/e-summary-mail.c
index aff5061cc8..90d6bddd91 100644
--- a/my-evolution/e-summary-mail.c
+++ b/my-evolution/e-summary-mail.c
@@ -26,6 +26,12 @@
#include <liboaf/liboaf.h>
#include <gal/widgets/e-unicode.h>
+#include "Mail.h"
+#include "e-summary.h"
+#include "e-summary-mail.h"
+
+#include "e-util/e-path.h"
+
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-i18n.h>
#include <libgnome/gnome-util.h> /* gnome_util_prepend_user_home */
@@ -36,23 +42,13 @@
#include <Evolution.h>
#include <evolution-storage-listener.h>
-#include "Mail.h"
-#include "e-summary.h"
-#include "e-summary-mail.h"
-#include "e-summary-table.h"
-
-#include "e-util/e-path.h"
-
#define MAIL_IID "OAFIID:GNOME_Evolution_FolderInfo"
struct _ESummaryMail {
GNOME_Evolution_FolderInfo folder_info;
- GNOME_Evolution_StorageRegistry registry;
BonoboListener *listener;
EvolutionStorageListener *storage_listener;
- GSList *storage_list;
-
GHashTable *folders;
GList *shown;
ESummaryMailMode mode;
@@ -60,16 +56,6 @@ struct _ESummaryMail {
char *html;
};
-typedef struct _StorageInfo {
- char *name;
- char *toplevel;
-
- GNOME_Evolution_Storage storage;
- EvolutionStorageListener *listener;
- ESummary *summary;
- GList *folders;
-} StorageInfo;
-
typedef struct _ESummaryMailFolder {
char *name;
char *path;
@@ -78,9 +64,18 @@ typedef struct _ESummaryMailFolder {
int unread;
gboolean init; /* Has this folder been initialised? */
- StorageInfo *si;
} ESummaryMailFolder;
+const char *
+e_summary_mail_get_html (ESummary *summary)
+{
+ if (summary->mail == NULL) {
+ return NULL;
+ }
+
+ return summary->mail->html;
+}
+
/* Work out what to do with folder names */
static char *
make_pretty_foldername (ESummary *summary,
@@ -150,19 +145,6 @@ e_summary_mail_generate_html (ESummary *summary)
g_string_free (string, FALSE);
}
-const char *
-e_summary_mail_get_html (ESummary *summary)
-{
- /* Only regenerate HTML when it's needed */
- e_summary_mail_generate_html (summary);
-
- if (summary->mail == NULL) {
- return NULL;
- }
-
- return summary->mail->html;
-}
-
static void
e_summary_mail_get_info (ESummaryMail *mail,
const char *uri,
@@ -193,23 +175,21 @@ static void
new_folder_cb (EvolutionStorageListener *listener,
const char *path,
const GNOME_Evolution_Folder *folder,
- StorageInfo *si)
+ ESummary *summary)
{
- ESummary *summary = si->summary;
ESummaryMail *mail;
ESummaryMailFolder *mail_folder;
GList *p;
/* Don't care about non mail */
if (strcmp (folder->type, "mail") != 0 ||
- (strncmp (folder->physicalUri, "file://", 7) != 0 &&
- strncmp (folder->physicalUri, "vfolder", 7) != 0)) {
+ strncmp (folder->physicalUri, "file://", 7) != 0) {
return;
}
+
mail = summary->mail;
mail_folder = g_new (ESummaryMailFolder, 1);
- mail_folder->si = si;
mail_folder->path = g_strdup (folder->physicalUri);
mail_folder->name = g_strdup (path);
mail_folder->count = -1;
@@ -217,14 +197,17 @@ new_folder_cb (EvolutionStorageListener *listener,
mail_folder->init = FALSE;
g_hash_table_insert (mail->folders, mail_folder->path, mail_folder);
- si->folders = g_list_prepend (si->folders, mail_folder);
-
+
for (p = summary->preferences->display_folders; p; p = p->next) {
- if (strcmp (p->data, folder->physicalUri) == 0) {
+ char *uri;
+
+ uri = g_strconcat ("file://", p->data, NULL);
+ if (strcmp (uri, folder->physicalUri) == 0) {
mail->shown = g_list_append (mail->shown, mail_folder);
e_summary_mail_get_info (mail, mail_folder->path,
mail->listener);
}
+ g_free (uri);
}
}
@@ -232,33 +215,29 @@ static void
update_folder_cb (EvolutionStorageListener *listener,
const char *path,
int unread_count,
- StorageInfo *si)
+ ESummary *summary)
{
- ESummary *summary = si->summary;
char *evolution_dir;
- static char *proto = NULL;
+ char *proto;
char *uri;
- /* Make this static, saves having to recompute it each time */
- if (proto == NULL) {
- evolution_dir = gnome_util_prepend_user_home ("evolution/local");
+ evolution_dir = gnome_util_prepend_user_home ("evolution/local");
- proto = g_strconcat ("file://", evolution_dir, NULL);
- g_free (evolution_dir);
- }
+ proto = g_strconcat ("file://", evolution_dir, NULL);
uri = e_path_to_physical (proto, path);
e_summary_mail_get_info (summary->mail, uri, summary->mail->listener);
g_free (uri);
+ g_free (evolution_dir);
+ g_free (proto);
}
static void
remove_folder_cb (EvolutionStorageListener *listener,
const char *path,
- StorageInfo *si)
+ ESummary *summary)
{
- ESummary *summary = si->summary;
ESummaryMail *mail;
ESummaryMailFolder *mail_folder;
GList *p;
@@ -313,10 +292,19 @@ mail_change_notify (BonoboListener *listener,
/* Are we displaying this folder? */
for (p = summary->preferences->display_folders; p; p = p->next) {
- if (strcmp (p->data, folder->path) == 0) {
+ char *uri;
+
+ uri = g_strconcat ("file://", p->data, NULL);
+ if (strcmp (uri, folder->path) == 0) {
+ /* Regen HTML */
+ e_summary_mail_generate_html (summary);
e_summary_draw (summary);
+
+ g_free (uri);
return;
}
+
+ g_free (uri);
}
}
@@ -327,38 +315,30 @@ e_summary_mail_protocol (ESummary *summary,
{
}
-
-
static gboolean
e_summary_mail_register_storage (ESummary *summary,
- const char *name,
GNOME_Evolution_Storage corba_storage)
{
ESummaryMail *mail;
+ EvolutionStorageListener *listener;
GNOME_Evolution_StorageListener corba_listener;
- StorageInfo *si;
CORBA_Environment ev;
mail = summary->mail;
- si = g_new (StorageInfo, 1);
- si->name = g_strdup (name);
- si->toplevel = NULL;
- si->summary = summary;
- si->storage = corba_storage;
- si->listener = evolution_storage_listener_new ();
- si->folders = NULL;
+ if (mail->storage_listener == NULL) {
+ mail->storage_listener = evolution_storage_listener_new ();
- mail->storage_list = g_slist_prepend (mail->storage_list, si);
-
- gtk_signal_connect (GTK_OBJECT (si->listener), "new-folder",
- GTK_SIGNAL_FUNC (new_folder_cb), si);
- gtk_signal_connect (GTK_OBJECT (si->listener), "removed-folder",
- GTK_SIGNAL_FUNC (remove_folder_cb), si);
- gtk_signal_connect (GTK_OBJECT (si->listener), "update_folder",
- GTK_SIGNAL_FUNC (update_folder_cb), si);
+ gtk_signal_connect (GTK_OBJECT (mail->storage_listener), "new-folder",
+ GTK_SIGNAL_FUNC (new_folder_cb), summary);
+ gtk_signal_connect (GTK_OBJECT (mail->storage_listener), "removed-folder",
+ GTK_SIGNAL_FUNC (remove_folder_cb), summary);
+ gtk_signal_connect (GTK_OBJECT (mail->storage_listener), "update_folder",
+ GTK_SIGNAL_FUNC (update_folder_cb), summary);
+ }
+ listener = mail->storage_listener;
- corba_listener = evolution_storage_listener_corba_objref (si->listener);
+ corba_listener = evolution_storage_listener_corba_objref (listener);
CORBA_exception_init (&ev);
GNOME_Evolution_Storage_addListener (corba_storage, corba_listener, &ev);
@@ -376,116 +356,31 @@ e_summary_mail_register_storage (ESummary *summary,
return TRUE;
}
-static void
-e_summary_mail_register_local_storage (ESummary *summary)
-{
- ESummaryMail *mail;
- GNOME_Evolution_Storage local_storage;
- CORBA_Environment ev;
-
- mail = summary->mail;
-
- CORBA_exception_init (&ev);
- local_storage = GNOME_Evolution_Shell_getLocalStorage (summary->shell, &ev);
- if (BONOBO_EX (&ev) || local_storage == CORBA_OBJECT_NIL) {
- g_warning ("Error getting local storage: %s", CORBA_exception_id (&ev));
- CORBA_exception_free (&ev);
- return;
- }
- CORBA_exception_free (&ev);
-
- e_summary_mail_register_storage (summary, _("Local Folders"), local_storage);
-}
-
-static void
-storage_notify (BonoboListener *listener,
- const char *name,
- const BonoboArg *arg,
- CORBA_Environment *ev,
- ESummary *summary)
-{
- GNOME_Evolution_StorageRegistry_NotifyResult *nr;
- GNOME_Evolution_Storage corba_storage;
- CORBA_Environment ev2;
- ESummaryMail *mail;
-
- mail = summary->mail;
- g_return_if_fail (mail != NULL);
-
- nr = arg->_value;
- switch (nr->type) {
- case GNOME_Evolution_StorageRegistry_STORAGE_CREATED:
- /* These need to be special cased because they're special */
- if (strcmp (nr->name, "summary") == 0) {
- break;
- }
-
- if (strcmp (nr->name, "local") == 0) {
- e_summary_mail_register_local_storage (summary);
- break;
- }
-
- CORBA_exception_init (&ev2);
- corba_storage = GNOME_Evolution_StorageRegistry_getStorageByName (mail->registry,
- nr->name, &ev2);
- if (BONOBO_EX (&ev2) || corba_storage == CORBA_OBJECT_NIL) {
- g_warning ("Error getting storage %s\n%s", nr->name,
- CORBA_exception_id (&ev2));
- CORBA_exception_free (&ev2);
- return;
- }
-
- CORBA_exception_free (&ev2);
- e_summary_mail_register_storage (summary, nr->name, corba_storage);
- break;
-
- case GNOME_Evolution_StorageRegistry_STORAGE_DESTROYED:
- g_print ("%s removed\n", nr->name);
- break;
-
- default:
- g_print ("Unknown response %d\n", nr->type);
- break;
- }
-}
-
static gboolean
e_summary_mail_register_storages (ESummary *summary,
GNOME_Evolution_Shell corba_shell)
{
- Bonobo_Listener corba_listener;
- BonoboListener *listener;
+ GNOME_Evolution_Storage local_storage;
CORBA_Environment ev;
g_return_val_if_fail (summary != NULL, FALSE);
g_return_val_if_fail (IS_E_SUMMARY (summary), FALSE);
CORBA_exception_init (&ev);
-
- summary->mail->registry = Bonobo_Unknown_queryInterface (corba_shell,
- "IDL:GNOME/Evolution/StorageRegistry:1.0",
- &ev);
- if (BONOBO_EX (&ev) || summary->mail->registry == NULL) {
- g_warning ("No storage registry: %s", CORBA_exception_id (&ev));
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- listener = bonobo_listener_new (NULL, NULL);
- gtk_signal_connect (GTK_OBJECT (listener), "event-notify",
- GTK_SIGNAL_FUNC (storage_notify), summary);
- corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener));
-
- /* Storages will be added whenever the listener gets an event. */
- GNOME_Evolution_StorageRegistry_addListener (summary->mail->registry, corba_listener, &ev);
+ local_storage = GNOME_Evolution_Shell_getLocalStorage (corba_shell, &ev);
if (BONOBO_EX (&ev)) {
- g_warning ("Cannot add listener\n%s", CORBA_exception_id (&ev));
+ g_warning ("Exception getting local storage: %s",
+ CORBA_exception_id (&ev));
CORBA_exception_free (&ev);
+
return FALSE;
}
-
CORBA_exception_free (&ev);
- return TRUE;
+
+ if (e_summary_mail_register_storage (summary, local_storage))
+ return TRUE;
+ else
+ return FALSE;
}
void
@@ -512,8 +407,6 @@ e_summary_mail_init (ESummary *summary,
return;
}
- CORBA_exception_free (&ev);
-
/* Create a BonoboListener for all the notifies. */
mail->listener = bonobo_listener_new (NULL, NULL);
gtk_signal_connect (GTK_OBJECT (mail->listener), "event-notify",
@@ -545,13 +438,7 @@ e_summary_mail_reconfigure (ESummary *summary)
ESummaryMailFolder *folder;
char *uri;
- if (strncmp (p->data, "file://", 7) == 0 ||
- strncmp (p->data, "vfolder:", 8) == 0) {
- uri = g_strdup (p->data);
- } else {
- uri = g_strconcat ("file://", p->data, NULL);
- }
-
+ uri = g_strconcat ("file://", p->data, NULL);
folder = g_hash_table_lookup (mail->folders, uri);
if (folder != NULL) {
if (folder->init == FALSE) {
@@ -604,196 +491,40 @@ static int
str_compare (gconstpointer a,
gconstpointer b)
{
- ESummaryMailFolder *folder_a, *folder_b;
+ ESummaryMailRowData *rda, *rdb;
- folder_a = (ESummaryMailFolder *) a;
- folder_b = (ESummaryMailFolder *) b;
- return strcasecmp (folder_a->name, folder_b->name);
-}
-
-static int
-sort_storages (gconstpointer a,
- gconstpointer b)
-{
- StorageInfo *si_a, *si_b;
-
- si_a = (StorageInfo *) a;
- si_b = (StorageInfo *) b;
-
- return strcasecmp (si_a->name, si_b->name);
-}
-
-static char *
-get_parent_path (const char *path)
-{
- char *last;
-
- if (strncmp (path, "vfolder", 7) == 0) {
- last = strrchr (path, '#');
- if (last == NULL) {
- return g_strdup (path);
- }
- return g_strndup (path, last - path);
- } else {
- last = strrchr (path, '/');
- return g_strndup (path, last - path);
- }
-}
-
-static gboolean
-is_folder_shown (ESummaryMail *mail,
- const char *path)
-{
- GList *p;
-
- for (p = mail->shown; p; p = p->next) {
- ESummaryMailFolder *folder = p->data;
- if (strcmp (folder->path, path) == 0) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static ETreePath
-insert_path_recur (ESummaryTable *est,
- StorageInfo *si,
- GHashTable *hash_table,
- const char *path,
- ESummaryMail *mail)
-{
- char *parent_path, *name;
- ETreePath parent_node, node;
- ESummaryTableModelEntry *entry;
- int children;
-
- parent_path = get_parent_path (path);
-
- parent_node = g_hash_table_lookup (hash_table, parent_path);
- if (parent_node == NULL) {
- if (strcmp (si->toplevel, path) == 0) {
- /* Insert root */
- children = e_summary_table_get_num_children (est, NULL);
- node = e_summary_table_add_node (est, NULL, children, NULL);
- entry = g_new (ESummaryTableModelEntry, 1);
- entry->path = node;
- entry->location = NULL;
- entry->name = g_strdup (si->name);
- entry->editable = FALSE;
- entry->removable = FALSE;
- entry->shown = FALSE;
-
- g_hash_table_insert (est->model, entry->path, entry);
- g_hash_table_insert (hash_table, g_strdup (path), node);
- return node;
- } else {
- parent_node = insert_path_recur (est, si, hash_table, parent_path, mail);
- }
- }
-
- g_free (parent_path);
- if (strcmp (si->name, "VFolders") == 0) {
- name = strrchr (path, '#');
- } else {
- name = strrchr (path, '/');
- }
-
- /* Leave out folders called "subfolder" */
- if (strcmp (name + 1, "subfolders") == 0) {
- return parent_node;
- }
-
- children = e_summary_table_get_num_children (est, parent_node);
- node = e_summary_table_add_node (est, parent_node, children, NULL);
- entry = g_new (ESummaryTableModelEntry, 1);
- entry->path = node;
- entry->location = g_strdup (path);
- entry->name = g_strdup (name + 1);
- entry->editable = TRUE;
- entry->removable = FALSE;
-
- /* Check if shown */
- entry->shown = is_folder_shown (mail, path);
- g_hash_table_insert (est->model, entry->path, entry);
- g_hash_table_insert (hash_table, g_strdup (path), node);
-
- return node;
-}
-
-static void
-free_path_hash (gpointer key,
- gpointer value,
- gpointer data)
-{
- g_free (key);
-}
-
-static void
-add_storage_to_table (ESummaryTable *est,
- StorageInfo *si,
- ESummary *summary)
-{
- GHashTable *path_hash;
- GList *p;
-
- path_hash = g_hash_table_new (g_str_hash, g_str_equal);
- p = g_list_sort (si->folders, str_compare);
-
- for (; p; p = p->next) {
- ESummaryMailFolder *folder = p->data;
-
- insert_path_recur (est, si, path_hash, folder->path, summary->mail);
- }
-
- g_hash_table_foreach (path_hash, free_path_hash, NULL);
- g_hash_table_destroy (path_hash);
-}
-
-static void
-make_toplevel (StorageInfo *si)
-{
- if (si->toplevel != NULL) {
- return;
- }
-
- if (strcmp (si->name, "VFolders") == 0) {
- si->toplevel = g_strdup_printf ("vfolder:%s/evolution/vfolder",
- g_get_home_dir ());
- } else if (strcmp (si->name, "Local Folders") == 0) {
- si->toplevel = g_strdup_printf ("file://%s/evolution/local",
- g_get_home_dir ());
- } else {
- g_warning ("Unknown folder name... EEEEEEKEKEKEKEE!");
- si->toplevel = g_strdup ("Dunno");
- }
+ rda = (ESummaryMailRowData *) a;
+ rdb = (ESummaryMailRowData *) b;
+ return strcmp (rda->name, rdb->name);
}
void
-e_summary_mail_fill_list (ESummaryTable *est,
+e_summary_mail_fill_list (GtkCList *clist,
ESummary *summary)
{
ESummaryMail *mail;
- GSList *p;
+ GList *names = NULL, *p;
- g_return_if_fail (IS_E_SUMMARY_TABLE (est));
- g_return_if_fail (IS_E_SUMMARY (summary));
-
mail = summary->mail;
if (mail == NULL) {
return;
}
- p = g_slist_sort (mail->storage_list, sort_storages);
- for (; p; p = p->next) {
- StorageInfo *si = p->data;
+ g_hash_table_foreach (mail->folders, hash_to_list, &names);
- if (si->toplevel == NULL) {
- make_toplevel (si);
- }
-
- add_storage_to_table (est, si, summary);
+ names = g_list_sort (names, str_compare);
+ for (p = names; p; p = p->next) {
+ ESummaryMailRowData *rd;
+ char *text[1];
+ int row;
+
+ rd = p->data;
+ text[0] = rd->name + 1;
+ row = gtk_clist_append (clist, text);
+ gtk_clist_set_row_data_full (clist, row, rd, free_row_data);
}
+
+ g_list_free (names);
}
const char *