aboutsummaryrefslogtreecommitdiffstats
path: root/my-evolution/e-summary-mail.c
diff options
context:
space:
mode:
authorIain Holmes <iain@src.gnome.org>2001-06-09 04:47:52 +0800
committerIain Holmes <iain@src.gnome.org>2001-06-09 04:47:52 +0800
commitd09d4962997e9056652815aab81f49311a6a59a8 (patch)
tree807d49e73be441e0332b67f889b38c0b518f74ef /my-evolution/e-summary-mail.c
parentda6c1c4d2ef41c60130e4de31160ee8107227588 (diff)
downloadgsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.tar.gz
gsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.tar.zst
gsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.zip
Committing the new My Evolution.
svn path=/trunk/; revision=10163
Diffstat (limited to 'my-evolution/e-summary-mail.c')
-rw-r--r--my-evolution/e-summary-mail.c276
1 files changed, 276 insertions, 0 deletions
diff --git a/my-evolution/e-summary-mail.c b/my-evolution/e-summary-mail.c
new file mode 100644
index 0000000000..c5a2e54819
--- /dev/null
+++ b/my-evolution/e-summary-mail.c
@@ -0,0 +1,276 @@
+/*
+ * e-summary-mail.c: Mail summary bit.
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#include <liboaf/liboaf.h>
+
+#include "Mail.h"
+#include "e-summary.h"
+#include "e-summary-mail.h"
+
+#include <gtk/gtksignal.h>
+#include <bonobo/bonobo-exception.h>
+#include <bonobo/bonobo-listener.h>
+
+#include <Evolution.h>
+#include <evolution-storage-listener.h>
+
+#define MAIL_IID "OAFIID:GNOME_Evolution_FolderInfo"
+
+struct _ESummaryMail {
+ GNOME_Evolution_FolderInfo folder_info;
+ BonoboListener *listener;
+
+ GHashTable *folders;
+ ESummaryMailMode mode;
+
+ char *html;
+};
+
+typedef struct _ESummaryMailFolder {
+ char *name;
+ char *path;
+
+ int count;
+ int unread;
+} 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 (const char *foldername)
+{
+ char *pretty;
+
+ if ((pretty = strrchr (foldername, '/'))) {
+ return g_strdup (pretty + 1);
+ } else {
+ return g_strdup (foldername);
+ }
+}
+
+static void
+folder_gen_html (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ GString *string = user_data;
+ ESummaryMailFolder *folder = value;
+ char *str, *pretty_name, *uri;
+
+ pretty_name = make_pretty_foldername (folder->name);
+ uri = g_strconcat ("evolution:", folder->name, NULL);
+ str = g_strdup_printf ("<tr><td><a href=\"%s\"><pre>%s</pre></a></td><td align=\"Left\"><pre>%d/%d</pre></td></tr>",
+ uri, pretty_name, folder->unread, folder->count);
+ g_free (uri);
+ g_string_append (string, str);
+ g_free (pretty_name);
+ g_free (str);
+}
+
+static void
+e_summary_mail_generate_html (ESummary *summary)
+{
+ ESummaryMail *mail;
+ GString *string;
+
+ mail = summary->mail;
+ string = g_string_new ("<dl><dt><img src=\"ico-mail.png\" "
+ "align=\"middle\" alt=\"\" width=\"48\" "
+ "height=\"48\"> <b><a href=\"evolution:/local/Inbox\">Mail summary</a>"
+ "</b></dt><dd><table numcols=\"2\" width=\"100%\">");
+
+ g_hash_table_foreach (mail->folders, folder_gen_html, string);
+
+ g_string_append (string, "</table></dd></dl>");
+ mail->html = string->str;
+ g_string_free (string, FALSE);
+}
+
+static void
+e_summary_mail_get_info (ESummaryMail *mail,
+ const char *uri,
+ BonoboListener *listener)
+{
+ Bonobo_Listener corba_listener;
+ CORBA_Environment ev;
+
+ g_return_if_fail (mail != NULL);
+ g_return_if_fail (mail->folder_info != CORBA_OBJECT_NIL);
+
+ corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener));
+ CORBA_exception_init (&ev);
+ GNOME_Evolution_FolderInfo_getInfo (mail->folder_info, uri ? uri : "",
+ corba_listener, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Error getting info for %s:\n%s", uri,
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+ return;
+ }
+
+ CORBA_exception_free (&ev);
+ return;
+}
+
+static void
+new_folder_cb (EvolutionStorageListener *listener,
+ const char *path,
+ const GNOME_Evolution_Folder *folder,
+ ESummary *summary)
+{
+ ESummaryMail *mail;
+ ESummaryMailFolder *mail_folder;
+
+ /* Don't care about none mail */
+ if (strcmp (folder->type, "mail") != 0 ||
+ strncmp (folder->physical_uri, "file://", 7) != 0) {
+ return;
+ }
+
+ mail = summary->mail;
+
+ mail_folder = g_new (ESummaryMailFolder, 1);
+ mail_folder->path = g_strdup (folder->physical_uri);
+ mail_folder->name = g_strdup (path);
+ mail_folder->count = -1;
+ mail_folder->unread = -1;
+
+ g_hash_table_insert (mail->folders, mail_folder->path, mail_folder);
+ e_summary_mail_get_info (mail, mail_folder->path, mail->listener);
+}
+
+static void
+remove_folder_cb (EvolutionStorageListener *listener,
+ const char *path,
+ ESummary *summary)
+{
+ ESummaryMail *mail;
+ ESummaryMailFolder *mail_folder;
+
+ mail = summary->mail;
+ mail_folder = g_hash_table_lookup (mail->folders, path);
+ if (mail_folder == NULL) {
+ return;
+ }
+
+ g_hash_table_remove (mail->folders, path);
+ g_free (mail_folder->path);
+ g_free (mail_folder);
+}
+
+static void
+mail_change_notify (BonoboListener *listener,
+ const char *name,
+ const BonoboArg *arg,
+ CORBA_Environment *ev,
+ ESummary *summary)
+{
+ GNOME_Evolution_FolderInfo_MessageCount *count;
+ ESummaryMail *mail;
+ ESummaryMailFolder *folder;
+
+ mail = summary->mail;
+
+ count = arg->_value;
+ folder = g_hash_table_lookup (mail->folders, count->path);
+
+ if (folder == NULL) {
+ return;
+ }
+
+ folder->count = count->count;
+ folder->unread = count->unread;
+
+ /* Regen HTML */
+ e_summary_mail_generate_html (summary);
+ e_summary_draw (summary);
+}
+
+static void
+e_summary_mail_protocol (ESummary *summary,
+ const char *uri,
+ void *closure)
+{
+}
+
+void
+e_summary_mail_init (ESummary *summary,
+ GNOME_Evolution_Shell corba_shell)
+{
+ ESummaryMail *mail;
+ CORBA_Environment ev;
+ GNOME_Evolution_LocalStorage local_storage;
+ EvolutionStorageListener *listener;
+ GNOME_Evolution_StorageListener corba_listener;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+
+ mail = g_new (ESummaryMail, 1);
+ summary->mail = mail;
+
+ CORBA_exception_init (&ev);
+ mail->folder_info = oaf_activate_from_id (MAIL_IID, 0, NULL, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Exception creating FolderInfo: %s",
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+
+ g_free (mail);
+ return;
+ }
+
+ /* Create a hash table for the folders */
+ mail->folders = g_hash_table_new (g_str_hash, g_str_equal);
+
+ /* Create a BonoboListener for all the notifies. */
+ mail->listener = bonobo_listener_new (NULL, NULL);
+ gtk_signal_connect (GTK_OBJECT (mail->listener), "event-notify",
+ GTK_SIGNAL_FUNC (mail_change_notify), summary);
+
+ local_storage = GNOME_Evolution_Shell_getLocalStorage (corba_shell, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Exception getting local storage: %s",
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+
+ g_free (mail);
+ return;
+ }
+
+ listener = evolution_storage_listener_new ();
+ gtk_signal_connect (GTK_OBJECT (listener), "new-folder",
+ GTK_SIGNAL_FUNC (new_folder_cb), summary);
+ gtk_signal_connect (GTK_OBJECT (listener), "removed-folder",
+ GTK_SIGNAL_FUNC (remove_folder_cb), summary);
+ corba_listener = evolution_storage_listener_corba_objref (listener);
+
+ GNOME_Evolution_Storage_addListener (local_storage, corba_listener, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Exception adding listener: %s",
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+
+ g_free (mail);
+ return;
+ }
+
+ CORBA_exception_free (&ev);
+
+ e_summary_add_protocol_listener (summary, "mail", e_summary_mail_protocol, mail);
+ return;
+}