[anjal] Fix crash while canceling downloaded messages.



commit a18585363c4c4c1da8c3a99ebf2270138d83795c
Author: Srinivasa Ragavan <sragavan novell com>
Date:   Tue May 19 00:30:27 2009 +0530

    Fix crash while canceling downloaded messages.
---
 evo-anjal-2-27.patch    |   42 +++++++++++++++++++++++++++++++++++++++++-
 evo-anjal.patch         |   42 +++++++++++++++++++++++++++++++++++++++++-
 src/mail-message-view.c |   10 ++++++++--
 3 files changed, 90 insertions(+), 4 deletions(-)

diff --git a/evo-anjal-2-27.patch b/evo-anjal-2-27.patch
index 1ed2307..51ca1b0 100644
--- a/evo-anjal-2-27.patch
+++ b/evo-anjal-2-27.patch
@@ -1716,7 +1716,7 @@ index 556715d..7d7547c 100644
  #define ONLINE 1
  
 diff --git a/mail/mail-ops.c b/mail/mail-ops.c
-index a8aa14d..42d778a 100644
+index a8aa14d..6ab48a0 100644
 --- a/mail/mail-ops.c
 +++ b/mail/mail-ops.c
 @@ -73,6 +73,8 @@
@@ -1747,6 +1747,46 @@ index a8aa14d..42d778a 100644
  
  	m = mail_msg_new (&append_mail_info);
  	m->folder = folder;
+@@ -1879,7 +1880,7 @@ typedef void (*get_done)(CamelFolder *folder, const char *uid, CamelMimeMessage
+ static void
+ get_messagex_done (struct _get_message_msg *m)
+ {
+-	if (m->done) {
++	if (m->done && !camel_operation_cancel_check (m->cancel)) {
+ 		get_done done = (get_done)m->done;
+ 		done(m->folder, m->uid, m->message, m->data, &m->base.ex);
+ 	}
+@@ -1895,7 +1896,7 @@ static MailMsgInfo get_messagex_info = {
+ 
+ /* This is temporary, to avoid having to rewrite everything that uses
+    mail_get_message; it adds an exception argument to the callback */
+-void
++CamelOperation *
+ mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
+ 		 void *data, MailMsgDispatchFunc dispatch)
+ {
+@@ -1910,6 +1911,8 @@ mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolde
+ 	m->cancel = camel_operation_new(NULL, NULL);
+ 
+ 	dispatch (m);
++
++	return m->cancel;
+ }
+ 
+ /* ********************************************************************** */
+diff --git a/mail/mail-ops.h b/mail/mail-ops.h
+index e615a91..9ee3899 100644
+--- a/mail/mail-ops.h
++++ b/mail/mail-ops.h
+@@ -57,7 +57,7 @@ void mail_get_message (CamelFolder *folder, const char *uid,
+ 		       void *data,
+ 		       MailMsgDispatchFunc dispatch);
+ 
+-void
++CamelOperation *
+ mail_get_messagex(CamelFolder *folder, const char *uid,
+ 		  void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
+ 		  void *data, MailMsgDispatchFunc dispatch);
 diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am
 index 124c736..b0486ab 100644
 --- a/widgets/misc/Makefile.am
diff --git a/evo-anjal.patch b/evo-anjal.patch
index 1009661..b8a1d7b 100644
--- a/evo-anjal.patch
+++ b/evo-anjal.patch
@@ -1759,7 +1759,7 @@ index 12b4019..22b786f 100644
  #define ONLINE 1
  
 diff --git a/mail/mail-ops.c b/mail/mail-ops.c
-index 7c5f033..d280daa 100644
+index 7c5f033..ebf6018 100644
 --- a/mail/mail-ops.c
 +++ b/mail/mail-ops.c
 @@ -73,6 +73,8 @@
@@ -1790,6 +1790,46 @@ index 7c5f033..d280daa 100644
  
  	m = mail_msg_new (&append_mail_info);
  	m->folder = folder;
+@@ -1873,7 +1874,7 @@ typedef void (*get_done)(CamelFolder *folder, const char *uid, CamelMimeMessage
+ static void
+ get_messagex_done (struct _get_message_msg *m)
+ {
+-	if (m->done) {
++	if (m->done && !camel_operation_cancel_check (m->cancel)) {
+ 		get_done done = (get_done)m->done;
+ 		done(m->folder, m->uid, m->message, m->data, &m->base.ex);
+ 	}
+@@ -1889,7 +1890,7 @@ static MailMsgInfo get_messagex_info = {
+ 
+ /* This is temporary, to avoid having to rewrite everything that uses
+    mail_get_message; it adds an exception argument to the callback */
+-void
++CamelOperation *
+ mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
+ 		 void *data, MailMsgDispatchFunc dispatch)
+ {
+@@ -1904,6 +1905,8 @@ mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolde
+ 	m->cancel = camel_operation_new(NULL, NULL);
+ 
+ 	dispatch (m);
++
++	return m->cancel;
+ }
+ 
+ /* ********************************************************************** */
+diff --git a/mail/mail-ops.h b/mail/mail-ops.h
+index e615a91..9ee3899 100644
+--- a/mail/mail-ops.h
++++ b/mail/mail-ops.h
+@@ -57,7 +57,7 @@ void mail_get_message (CamelFolder *folder, const char *uid,
+ 		       void *data,
+ 		       MailMsgDispatchFunc dispatch);
+ 
+-void
++CamelOperation *
+ mail_get_messagex(CamelFolder *folder, const char *uid,
+ 		  void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
+ 		  void *data, MailMsgDispatchFunc dispatch);
 diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am
 index 95acd8b..2d92b1e 100644
 --- a/widgets/misc/Makefile.am
diff --git a/src/mail-message-view.c b/src/mail-message-view.c
index 44c24f9..ad4507d 100644
--- a/src/mail-message-view.c
+++ b/src/mail-message-view.c
@@ -65,6 +65,7 @@ struct  _MailMessageViewPrivate {
 	GtkWidget *unread_image;
 	char *bold[2];
 	char *normal[2];
+	CamelOperation *cancel;
 };
 
 typedef enum {
@@ -102,6 +103,7 @@ mail_message_view_init (MailMessageView  *shell)
 {
 	shell->priv = g_new0(MailMessageViewPrivate, 1);
 	shell->priv->spinner = NULL;
+	shell->priv->cancel = NULL;
 	shell->type = MAIL_VIEW_MESSAGE;
 	shell->uri = "mail://";
 	shell->composer = NULL;
@@ -112,7 +114,10 @@ mail_message_view_finalize (GObject *object)
 {
 	MailMessageView *shell = (MailMessageView *)object;
 	MailMessageViewPrivate *priv = shell->priv;
-
+	
+	if (shell->priv->cancel) {
+		camel_operation_cancel(shell->priv->cancel);
+	}
 	g_object_unref (shell->efwd);
 	g_free (priv->uid);
 	g_free (priv->normal[0]);
@@ -175,6 +180,7 @@ static void
 mmv_message_opened(CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *ex)
 {
 	MailMessageView *shell = (MailMessageView *)data;
+	shell->priv->cancel = NULL;
 	mail_indicate_new_mail (FALSE);
 	em_format_webkit_set_message_view (shell->efwd, shell, shell->body);
 	em_format_format((EMFormat *)shell->efwd, folder, uid, msg); 
@@ -221,7 +227,7 @@ mmv_show (MailMessageView *mmv)
 {
 	if (!mmv->priv->msg) {
 		gtk_widget_show(mmv->priv->spinner);
-		mail_get_messagex(mmv->priv->folder, mmv->priv->uid, mmv_message_opened, mmv, mail_msg_fast_ordered_push);
+		mmv->priv->cancel = mail_get_messagex(mmv->priv->folder, mmv->priv->uid, mmv_message_opened, mmv, mail_msg_fast_ordered_push);
 	}
 	gtk_widget_show (mmv->body);
 	gtk_widget_show_all (mmv->footer);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]