From 0bf2d899d8c14f8f54aea57ceb3ffbb010e581fe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Dec 2002 18:44:46 +0000 Subject: Fix for bug #33295 2002-12-07 Jeffrey Stedfast Fix for bug #33295 * e-msg-composer-attachment.c: Change the parent_class to a GObjectClass pointer instead of a GtkObjectClass pointer. (e_msg_composer_attachment_edit): Ref the attachment object so that if the attachment is removed while it is still being edited, the attachment object will still exist and therefor foil the user's attempt to make Evolution crash when they close the properties dialog for this attachment. (close_cb): Unref the attachment object. svn path=/trunk/; revision=19053 --- composer/ChangeLog | 13 ++++ composer/e-msg-composer-attachment.c | 130 ++++++++++++++++------------------- 2 files changed, 72 insertions(+), 71 deletions(-) diff --git a/composer/ChangeLog b/composer/ChangeLog index ae0520d217..b5fe6fd3b6 100644 --- a/composer/ChangeLog +++ b/composer/ChangeLog @@ -1,3 +1,16 @@ +2002-12-07 Jeffrey Stedfast + + Fix for bug #33295 + + * e-msg-composer-attachment.c: Change the parent_class to a + GObjectClass pointer instead of a GtkObjectClass pointer. + (e_msg_composer_attachment_edit): Ref the attachment object so + that if the attachment is removed while it is still being edited, + the attachment object will still exist and therefor foil the + user's attempt to make Evolution crash when they close the + properties dialog for this attachment. + (close_cb): Unref the attachment object. + 2002-12-03 Jeffrey Stedfast * e-msg-composer.c (message_rfc822_dnd): Get rid of the unused diff --git a/composer/e-msg-composer-attachment.c b/composer/e-msg-composer-attachment.c index 0f7c06ff26..4e97e71a6e 100644 --- a/composer/e-msg-composer-attachment.c +++ b/composer/e-msg-composer-attachment.c @@ -31,10 +31,9 @@ #include #include +#include #include #include -#include -#include #include #include "e-msg-composer.h" @@ -47,13 +46,13 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -static GtkObjectClass *parent_class = NULL; +static GObjectClass *parent_class = NULL; static void changed (EMsgComposerAttachment *attachment) { - g_signal_emit(attachment, signals[CHANGED], 0); + g_signal_emit (attachment, signals[CHANGED], 0); } @@ -63,14 +62,14 @@ static void finalise(GObject *object) { EMsgComposerAttachment *attachment; - + attachment = E_MSG_COMPOSER_ATTACHMENT (object); - camel_object_unref(attachment->body); + camel_object_unref (attachment->body); if (attachment->pixbuf_cache != NULL) - g_object_unref(attachment->pixbuf_cache); - - G_OBJECT_CLASS(parent_class)->finalize(object); + g_object_unref (attachment->pixbuf_cache); + + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -79,7 +78,6 @@ finalise(GObject *object) static void real_changed (EMsgComposerAttachment *msg_composer_attachment) { - g_return_if_fail (msg_composer_attachment != NULL); g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT (msg_composer_attachment)); } @@ -88,17 +86,17 @@ static void class_init (EMsgComposerAttachmentClass *klass) { GObjectClass *object_class; - + object_class = (GObjectClass*) klass; - parent_class = g_type_class_ref(G_TYPE_OBJECT); - + parent_class = g_type_class_ref (G_TYPE_OBJECT); + object_class->finalize = finalise; klass->changed = real_changed; - + signals[CHANGED] = g_signal_new ("changed", E_TYPE_MSG_COMPOSER_ATTACHMENT, G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(EMsgComposerAttachmentClass, changed), + G_STRUCT_OFFSET (EMsgComposerAttachmentClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, @@ -118,7 +116,7 @@ GType e_msg_composer_attachment_get_type (void) { static GType type = 0; - + if (type == 0) { static const GTypeInfo info = { sizeof (EMsgComposerAttachmentClass), @@ -131,10 +129,10 @@ e_msg_composer_attachment_get_type (void) 0, (GInstanceInitFunc) init, }; - - type = g_type_register_static(G_TYPE_OBJECT, "EMsgComposerAttachment", &info, 0); + + type = g_type_register_static (G_TYPE_OBJECT, "EMsgComposerAttachment", &info, 0); } - + return type; } @@ -159,7 +157,7 @@ e_msg_composer_attachment_new (const char *file_name, struct stat statbuf; char *mime_type; char *filename; - + g_return_val_if_fail (file_name != NULL, NULL); if (stat (file_name, &statbuf) < 0) { @@ -225,7 +223,7 @@ e_msg_composer_attachment_new (const char *file_name, g_free (content_id); #endif - new = g_object_new(E_TYPE_MSG_COMPOSER_ATTACHMENT, NULL); + new = g_object_new (E_TYPE_MSG_COMPOSER_ATTACHMENT, NULL); new->editor_gui = NULL; new->body = part; new->size = statbuf.st_size; @@ -267,7 +265,7 @@ e_msg_composer_attachment_new_from_mime_part (CamelMimePart *part) camel_object_unref (stream); - new = g_object_new(E_TYPE_MSG_COMPOSER_ATTACHMENT, NULL); + new = g_object_new (E_TYPE_MSG_COMPOSER_ATTACHMENT, NULL); new->editor_gui = NULL; new->body = mime_part; new->guessed_type = FALSE; @@ -279,15 +277,14 @@ e_msg_composer_attachment_new_from_mime_part (CamelMimePart *part) /* The attachment property dialog. */ -struct _DialogData { +typedef struct { GtkWidget *dialog; GtkEntry *file_name_entry; GtkEntry *description_entry; GtkEntry *mime_type_entry; GtkToggleButton *disposition_checkbox; EMsgComposerAttachment *attachment; -}; -typedef struct _DialogData DialogData; +} DialogData; static void destroy_dialog_data (DialogData *data) @@ -304,29 +301,27 @@ destroy_dialog_data (DialogData *data) static void update_mime_type (DialogData *data) { - gchar *mime_type; - const gchar *file_name; - + const char *file_name; + char *mime_type; + if (!data->attachment->guessed_type) return; - - file_name = gtk_entry_get_text(data->file_name_entry); + + file_name = gtk_entry_get_text (data->file_name_entry); #warning "do we need to create file uri for gnome-vfs-get-mime-type" mime_type = gnome_vfs_get_mime_type (file_name); - + if (mime_type) { gtk_entry_set_text (data->mime_type_entry, mime_type); - g_free(mime_type); + g_free (mime_type); } } static void -set_entry (GladeXML *xml, - const gchar *widget_name, - const gchar *value) +set_entry (GladeXML *xml, const char *widget_name, const char *value) { GtkEntry *entry; - + entry = GTK_ENTRY (glade_xml_get_widget (xml, widget_name)); if (entry == NULL) g_warning ("Entry for `%s' not found.", widget_name); @@ -335,16 +330,13 @@ set_entry (GladeXML *xml, } static void -connect_widget (GladeXML *gui, - const gchar *name, - const gchar *signal_name, - GCallback func, - gpointer data) +connect_widget (GladeXML *gui, const char *name, const char *signal_name, + GCallback func, gpointer data) { GtkWidget *widget; - + widget = glade_xml_get_widget (gui, name); - g_signal_connect(widget, signal_name, func, data); + g_signal_connect (widget, signal_name, func, data); } static void @@ -355,12 +347,13 @@ close_cb (GtkWidget *widget, gpointer data) dialog_data = (DialogData *) data; attachment = dialog_data->attachment; - - /* need to unref dialog? */ + gtk_widget_destroy (dialog_data->dialog); - g_object_unref(attachment->editor_gui); + g_object_unref (attachment->editor_gui); attachment->editor_gui = NULL; + g_object_unref (attachment); + destroy_dialog_data (dialog_data); } @@ -369,7 +362,7 @@ ok_cb (GtkWidget *widget, gpointer data) { DialogData *dialog_data; EMsgComposerAttachment *attachment; - const gchar *str; + const char *str; dialog_data = (DialogData *) data; attachment = dialog_data->attachment; @@ -402,9 +395,7 @@ ok_cb (GtkWidget *widget, gpointer data) } static void -file_name_focus_out_cb (GtkWidget *widget, - GdkEventFocus *event, - gpointer data) +file_name_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data) { DialogData *dialog_data; @@ -414,11 +405,13 @@ file_name_focus_out_cb (GtkWidget *widget, void -e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment, - GtkWidget *parent) +e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment, GtkWidget *parent) { + CamelContentType *content_type; + const char *disposition; DialogData *dialog_data; GladeXML *editor_gui; + char *type; g_return_if_fail (attachment != NULL); g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT (attachment)); @@ -446,6 +439,7 @@ e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment, GTK_WINDOW (gtk_widget_get_toplevel (parent))); dialog_data = g_new (DialogData, 1); + g_object_ref (attachment); dialog_data->attachment = attachment; dialog_data->dialog = glade_xml_get_widget (editor_gui, "dialog"); dialog_data->file_name_entry = GTK_ENTRY ( @@ -457,31 +451,25 @@ e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment, dialog_data->disposition_checkbox = GTK_TOGGLE_BUTTON ( glade_xml_get_widget (editor_gui, "disposition_checkbox")); - if (attachment != NULL) { - CamelContentType *content_type; - const char *disposition; - char *type; - - set_entry (editor_gui, "file_name_entry", - camel_mime_part_get_filename (attachment->body)); - set_entry (editor_gui, "description_entry", - camel_mime_part_get_description (attachment->body)); - content_type = camel_mime_part_get_content_type (attachment->body); - type = header_content_type_simple (content_type); - set_entry (editor_gui, "mime_type_entry", type); - g_free (type); - - disposition = camel_mime_part_get_disposition (attachment->body); - gtk_toggle_button_set_active (dialog_data->disposition_checkbox, - disposition && !g_ascii_strcasecmp (disposition, "inline")); - } + set_entry (editor_gui, "file_name_entry", + camel_mime_part_get_filename (attachment->body)); + set_entry (editor_gui, "description_entry", + camel_mime_part_get_description (attachment->body)); + content_type = camel_mime_part_get_content_type (attachment->body); + type = header_content_type_simple (content_type); + set_entry (editor_gui, "mime_type_entry", type); + g_free (type); + + disposition = camel_mime_part_get_disposition (attachment->body); + gtk_toggle_button_set_active (dialog_data->disposition_checkbox, + disposition && !g_ascii_strcasecmp (disposition, "inline")); connect_widget (editor_gui, "ok_button", "clicked", (GCallback)ok_cb, dialog_data); connect_widget (editor_gui, "close_button", "clicked", (GCallback)close_cb, dialog_data); connect_widget (editor_gui, "file_name_entry", "focus_out_event", (GCallback)file_name_focus_out_cb, dialog_data); - + #warning "signal connect while alive" /* make sure that when the composer gets hidden/closed that our windows also close */ parent = gtk_widget_get_toplevel (parent); -- cgit