[evolution-patches] fix for the bug #315752 [calendar]



Hi,
  Have attached the fix for the bug. There is no crash as the bug
states. The stack trace shows trace for the gui being in-responsive if
some other operation is happening in the same folder. Have attached the
fix for the same.

thanks, Chenthill.
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/plugins/mail-to-task/ChangeLog,v
retrieving revision 1.14
diff -u -p -r1.14 ChangeLog
--- ChangeLog	24 Aug 2005 03:14:24 -0000	1.14
+++ ChangeLog	3 Oct 2005 06:49:08 -0000
@@ -1,3 +1,14 @@
+2005-10-03  Chenthill Palanisamy  <pchenthill novell com>
+
+	Fixes #315752
+	* mail-to-task.c:  Created a new structure AsyncData to
+	store information passed to thread.
+	(do_mail_to_task): get the required contents from AsyncData and
+       free it at the end.	
+	(copy_uids): Duplicate the uids from t->uids.
+	(org_gnome_mail_to_task): duplicated the t->uid and run
+	do_mail_to_task as a thread.
+
 2005-08-23  Not Zed  <NotZed Ximian com>
 
 	* mail-to-task.c (add_attendee_cb): use the right type for attendees.
Index: mail-to-task.c
===================================================================
RCS file: /cvs/gnome/evolution/plugins/mail-to-task/mail-to-task.c,v
retrieving revision 1.4
diff -u -p -r1.4 mail-to-task.c
--- mail-to-task.c	24 Aug 2005 03:14:24 -0000	1.4
+++ mail-to-task.c	3 Oct 2005 06:49:08 -0000
@@ -25,6 +25,12 @@
 #include <camel/camel-stream-mem.h>
 #include "mail/em-popup.h"
 
+typedef struct {
+	ECal *client;
+	struct _CamelFolder *folder;
+	GPtrArray *uids;
+}AsyncData;
+
 static void
 add_attendee_cb (gpointer key, gpointer value, gpointer user_data)
 {
@@ -107,25 +113,27 @@ set_organizer (ECalComponent *comp, Came
 	e_cal_component_set_organizer (comp, &organizer);
 }
 
-static void
-do_mail_to_task (EMPopupTargetSelect *t, ESource *tasks_source)
+static gboolean 
+do_mail_to_task (AsyncData *data)
 {
-	ECal *client;
+	ECal *client = data->client;
+	struct _CamelFolder *folder = data->folder;
+	GPtrArray *uids = data->uids;
 
 	/* open the task client */
-	client = e_cal_new (tasks_source, E_CAL_SOURCE_TYPE_TODO);
 	if (e_cal_open (client, FALSE, NULL)) {
 		int i;
-
-		for (i = 0; i < (t->uids ? t->uids->len : 0); i++) {
+			
+		for (i = 0; i < (uids ? uids->len : 0); i++) {
 			CamelMimeMessage *message;
 			ECalComponent *comp;
 			ECalComponentText text;
 
 			/* retrieve the message from the CamelFolder */
-			message = camel_folder_get_message (t->folder, g_ptr_array_index (t->uids, i), NULL);
-			if (!message)
+			message = camel_folder_get_message (folder, g_ptr_array_index (uids, i), NULL);
+			if (!message) {
 				continue;
+			}
 
 			comp = e_cal_component_new ();
 			e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_TODO);
@@ -147,20 +155,42 @@ do_mail_to_task (EMPopupTargetSelect *t,
 			g_object_unref (comp);
 		}
 	}
-
+	
 	/* free memory */
-	g_object_unref (client);
+	g_object_unref (data->client);
+	g_ptr_array_free (data->uids, TRUE);
+	g_free (data);
+	data = NULL;
+
+	return TRUE;
 }
 
 void org_gnome_mail_to_task (void *ep, EMPopupTargetSelect *t);
 
+static void
+copy_uids (char *uid, GPtrArray *uid_array) 
+{
+	g_ptr_array_add (uid_array, g_strdup (uid));
+}
+
 void
 org_gnome_mail_to_task (void *ep, EMPopupTargetSelect *t)
 {
 	GtkWidget *dialog;
 	GConfClient *conf_client;
 	ESourceList *source_list;
+	GPtrArray *uid_array = NULL;
 
+	if (t->uids->len > 0) {
+		/* FIXME Some how in the thread function the values inside t->uids gets freed 
+		   and are corrupted which needs to be fixed, this is sought of work around fix for
+		   the gui inresponsiveness */
+		uid_array = g_ptr_array_new ();
+		g_ptr_array_foreach (t->uids, (GFunc)copy_uids, (gpointer) uid_array);
+	} else {
+		return;
+	}
+			
 	/* ask the user which tasks list to save to */
 	conf_client = gconf_client_get_default ();
 	source_list = e_source_list_new_for_gconf (conf_client, "/apps/evolution/tasks/sources");
@@ -172,8 +202,38 @@ org_gnome_mail_to_task (void *ep, EMPopu
 
 		/* if a source has been selected, perform the mail2task operation */
 		source = e_source_selector_dialog_peek_primary_selection (E_SOURCE_SELECTOR_DIALOG (dialog));
-		if (source)
-			do_mail_to_task (t, source);
+		if (source) {
+			ECal *client = NULL;
+			AsyncData *data = NULL;
+			GThread *thread = NULL;
+			GError *error = NULL;
+			
+			client = e_cal_new (source, E_CAL_SOURCE_TYPE_TODO);
+			if (!client) {
+				char *uri = e_source_get_uri (source);
+				
+				g_warning ("Could not create the client: %s \n", uri);
+
+				g_free (uri);
+				g_object_unref (conf_client);
+				g_object_unref (source_list);
+				gtk_widget_destroy (dialog);
+				return;
+			}
+			
+			/* Fill the elements in AsynData */
+			data = g_new0 (AsyncData, 1);
+			data->client = client;
+			data->folder = t->folder; 
+			data->uids = uid_array;
+
+			thread = g_thread_create ((GThreadFunc) do_mail_to_task, data, FALSE, &error);
+			if (!thread) {
+				g_warning (G_STRLOC ": %s", error->message);
+				g_error_free (error);
+			}
+
+		}
 	}
 
 	g_object_unref (conf_client);


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