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.

svn path=/trunk/; revision=19053
This commit is contained in:
Jeffrey Stedfast
2002-12-07 18:44:46 +00:00
committed by Jeffrey Stedfast
parent 70b1993d5e
commit 0bf2d899d8
2 changed files with 72 additions and 71 deletions

View File

@ -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

View File

@ -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);