aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-summary.c
diff options
context:
space:
mode:
authorIain Holmes <iain@helixcode.com>2000-10-07 08:58:03 +0800
committerIain Holmes <iain@src.gnome.org>2000-10-07 08:58:03 +0800
commitee625ee5fcc71e9d17fafd53fa17c7cd73558c9f (patch)
treebb93966fd64cce8876fcdbd4b4f9131ea0119c56 /mail/mail-summary.c
parentb9db2f0137dd06111913dd93d97737542dba026d (diff)
downloadgsoc2013-evolution-ee625ee5fcc71e9d17fafd53fa17c7cd73558c9f.tar
gsoc2013-evolution-ee625ee5fcc71e9d17fafd53fa17c7cd73558c9f.tar.gz
gsoc2013-evolution-ee625ee5fcc71e9d17fafd53fa17c7cd73558c9f.tar.bz2
gsoc2013-evolution-ee625ee5fcc71e9d17fafd53fa17c7cd73558c9f.tar.lz
gsoc2013-evolution-ee625ee5fcc71e9d17fafd53fa17c7cd73558c9f.tar.xz
gsoc2013-evolution-ee625ee5fcc71e9d17fafd53fa17c7cd73558c9f.tar.zst
gsoc2013-evolution-ee625ee5fcc71e9d17fafd53fa17c7cd73558c9f.zip
Fix the locking up of the mail by only calling camel functions from the
2000-10-06 Iain Holmes <iain@helixcode.com> * mail-summary.c: Fix the locking up of the mail by only calling camel functions from the camel thread, and ORBit functions from the GTK thread. Watch for the message-changed signal again. * component-factory.c (summary_fn, component_factory_init): Re-enabled it, cos I think it works again. * mail-display.h: Remove the pb_cache. * Makefile.am: Readd the mail-summary.[ch] files and add the evolution-services library to the link. svn path=/trunk/; revision=5777
Diffstat (limited to 'mail/mail-summary.c')
-rw-r--r--mail/mail-summary.c189
1 files changed, 146 insertions, 43 deletions
diff --git a/mail/mail-summary.c b/mail/mail-summary.c
index 619accf24e..e670057ad8 100644
--- a/mail/mail-summary.c
+++ b/mail/mail-summary.c
@@ -28,11 +28,11 @@
#include <bonobo.h>
#include "camel.h"
-
+#include <gnome.h>
#include "mail.h" /* YUCK FIXME */
#include "mail-tools.h"
#include "mail-ops.h"
-#include <gal/widgets/e-gui-utils.h>
+
#include "mail-local-storage.h"
#include <executive-summary/evolution-services/executive-summary-component.h>
@@ -41,41 +41,142 @@ typedef struct {
ExecutiveSummaryComponent *component;
CamelFolder *folder;
- int mailread, mailunread;
+ int mail, unread;
char *html;
} MailSummary;
+#define SUMMARY_IN() g_print ("IN: %s: %d\n", __FUNCTION__, __LINE__);
+#define SUMMARY_OUT() g_print ("OUT: %s: %d\n", __FUNCTION__, __LINE__);
+
+static int queue_len = 0;
+
+#define MAIN_READER main_compipe[0]
+#define MAIN_WRITER main_compipe[1]
+#define DISPATCH_READER dispatch_compipe[0]
+#define DISPATCH_WRITER dispatch_compipe[1]
+
+static int main_compipe[2] = {-1, -1};
+static int dispatch_compipe[2] = {-1, -1};
+
+GIOChannel *summary_chan_reader = NULL;
+
+static void do_changed (MailSummary *summary);
+
+static gboolean
+read_msg (GIOChannel *source,
+ GIOCondition condition,
+ gpointer user_data)
+{
+ MailSummary *summary;
+ int size;
+
+ summary = g_new0 (MailSummary, 1);
+ g_io_channel_read (source, (gchar *) summary,
+ sizeof (MailSummary) / sizeof (gchar), &size);
+
+ if (size != sizeof (MailSummary)) {
+ g_warning (_("Incomplete message written on pipe!"));
+ return TRUE;
+ }
+
+ do_changed (summary);
+ g_free (summary);
+
+ return TRUE;
+}
+
+/* check_compipes: */
+static void
+check_compipes (void)
+{
+ if (MAIN_READER < 0) {
+ if (pipe (main_compipe) < 0) {
+ g_warning ("Call to pipe failed");
+ return;
+ }
+
+ summary_chan_reader = g_io_channel_unix_new (MAIN_READER);
+ g_io_add_watch (summary_chan_reader, G_IO_IN, read_msg, NULL);
+ }
+
+ if (DISPATCH_READER < 0) {
+ if (pipe (dispatch_compipe) < 0) {
+ g_warning ("Call to pipe failed");
+ return;
+ }
+ }
+}
+
/* Temporary functions to create the summary
FIXME: Need TigerT's designs :) */
static void
+do_changed (MailSummary *summary)
+{
+ char *ret_html, *str1;
+ int mail = summary->mail;
+
+ str1 = g_strdup_printf (_("<b>Inbox:</b> %d/%d"),
+ summary->unread, mail);
+
+ ret_html = g_strdup_printf ("<table><tr><td><img src=\"evolution-inbox-mini.png\"></td><td>%s</td></tr></table>", str1);
+ g_free (str1);
+
+ executive_summary_component_update (summary->component, ret_html);
+ g_free (ret_html);
+
+}
+
+/* These two callbacks are called from the Camel thread,
+ which can't make any CORBA calls, or else ORBit locks up,
+ and likewise the thread that can call ORBit, cannot call
+ camel.
+
+ So, when the callbacks are triggered, they generate a MailSummary
+ structure and write this onto a pipe. The ORBit calling thread
+ detects when something is written to the pipe and creates its own
+ MailSummary structure, and calls the appropriate CORBA calls.
+
+ Same theory as mail-threads.c, but a lot less complicated
+ as there is only one way communication, and only one type of message
+*/
+static void
folder_changed_cb (CamelObject *folder,
gpointer event_data,
gpointer user_data)
{
MailSummary *summary;
- char *ret_html, *str1, *str2;
- int mailread, mailunread;
-
+ int mail;
+
+ summary = (MailSummary *) user_data;
+ /* Put the summary data onto a pipe */
+
+ mail = camel_folder_get_message_count (folder);
+ summary->unread = camel_folder_get_unread_message_count (folder);
+ summary->mail = mail;
+
+ write (MAIN_WRITER, summary, sizeof (MailSummary));
+ queue_len++;
+
+ return;
+}
+
+static void
+message_changed_cb (CamelObject *folder,
+ gpointer event_data,
+ gpointer user_data)
+{
+ MailSummary *summary;
+ int mail;
+
summary = (MailSummary *)user_data;
- mailread = camel_folder_get_message_count (CAMEL_FOLDER (folder));
- mailunread = camel_folder_get_unread_message_count (CAMEL_FOLDER (folder));
-
- str1 = g_strdup_printf (_("There %s %d %s."),
- (mailread == 1) ? _("is"): _("are"),
- mailread,
- (mailread == 1) ? _("message"): _("messages"));
- str2 = g_strdup_printf (_("There %s %d unread %s."),
- (mailunread == 1) ? _("is"): _("are"),
- mailunread,
- (mailunread == 1) ? _("message"): _("messages"));
-
- ret_html = g_strdup_printf ("<table><tr><td><img src=\"evolution-inbox-mini.png\"></td><td>%s</td></tr><tr><td><img src=\"evolution-inbox-mini.png\"></td><td>%s</td></tr></table>", str1, str2);
- g_free (str1);
- g_free (str2);
+ summary->unread = camel_folder_get_unread_message_count (folder);
+ summary->mail = camel_folder_get_message_count (folder);
- executive_summary_component_update (summary->component, ret_html);
- g_free (ret_html);
+ write (MAIN_WRITER, summary, sizeof (MailSummary));
+ queue_len++;
+
+ return;
}
char *
@@ -83,43 +184,45 @@ create_summary_view (ExecutiveSummaryComponent *component,
char **title,
void *closure)
{
- char *str1, *str2, *ret_html;
- int mailread, mailunread;
+ char *str1, *ret_html;
+ int mailread, unread;
CamelFolder *folder;
CamelException *ex;
MailSummary *summary;
- ex = camel_exception_new ();
- folder = mail_tool_get_local_inbox (ex);
-
/* Strdup the title */
*title = g_strdup ("Inbox:");
+ mail_tool_camel_lock_up ();
+ ex = camel_exception_new ();
+ folder = mail_tool_get_local_inbox (ex);
+
mailread = camel_folder_get_message_count (folder);
- mailunread = camel_folder_get_unread_message_count (folder);
-
- str1 = g_strdup_printf (_("There %s %d %s."),
- (mailread == 1) ? _("is"): _("are"),
- mailread,
- (mailread == 1) ? _("message"): _("messages"));
- str2 = g_strdup_printf (_("There %s %d unread %s."),
- (mailunread == 1) ? _("is"): _("are"),
- mailunread,
- (mailunread == 1) ? _("message"): _("messages"));
-
- ret_html = g_strdup_printf ("<table><tr><td><img src=\"evolution-inbox-mini.png\"></td><td>%s</td></tr><tr><td><img src=\"evolution-inbox-mini.png\"></td><td>%s</td></tr></table>", str1, str2);
+ unread = camel_folder_get_unread_message_count (folder);
+ mail_tool_camel_lock_down ();
+
+ str1 = g_strdup_printf (_("<b>Inbox:</b>%d/%d"),
+ unread, mailread);
+
+ ret_html = g_strdup_printf ("<table><tr><td><img src=\"evolution-inbox-mini.png\"></td><td>%s</td></tr></table>", str1);
g_free (str1);
- g_free (str2);
summary = g_new (MailSummary, 1);
summary->folder = folder;
summary->html = ret_html;
- summary->mailread = mailread;
- summary->mailunread = mailunread;
+ summary->mail = mailread;
+ summary->unread = unread;
summary->component = component;
+ check_compipes ();
+
+ mail_tool_camel_lock_up ();
camel_object_hook_event (folder, "folder_changed",
(CamelObjectEventHookFunc) folder_changed_cb,
summary);
+ camel_object_hook_event (folder, "message_changed",
+ (CamelObjectEventHookFunc) message_changed_cb,
+ summary);
+ mail_tool_camel_lock_down ();
return ret_html;
}