aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--composer/ChangeLog13
-rw-r--r--composer/e-msg-composer-attachment.c130
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 <fejj@ximian.com>
+
+ 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 <fejj@ximian.com>
* 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 <sys/stat.h>
#include <errno.h>
+#include <camel/camel.h>
#include <gtk/gtknotebook.h>
#include <gtk/gtktogglebutton.h>
-#include <camel/camel.h>
-#include <gal/widgets/e-unicode.h>
#include <libgnomevfs/gnome-vfs-mime-utils.h>
#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);