From f9ffe647231a7ba2bd5347d92d560b6a57fee786 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 15 May 2013 09:17:58 -0400 Subject: Convert EMailPart to a GObject. EMailPart is reference-counted, subclassed, and allows a custom finalize function. There's no excuse for it not to use GObject. --- modules/itip-formatter/Makefile.am | 1 + modules/itip-formatter/e-mail-parser-itip.c | 108 +------------ modules/itip-formatter/e-mail-part-itip.c | 171 +++++++++++++++++++++ modules/itip-formatter/e-mail-part-itip.h | 34 +++- .../evolution-module-itip-formatter.c | 2 + 5 files changed, 205 insertions(+), 111 deletions(-) create mode 100644 modules/itip-formatter/e-mail-part-itip.c (limited to 'modules/itip-formatter') diff --git a/modules/itip-formatter/Makefile.am b/modules/itip-formatter/Makefile.am index abb45f3f81..240e09f903 100644 --- a/modules/itip-formatter/Makefile.am +++ b/modules/itip-formatter/Makefile.am @@ -20,6 +20,7 @@ module_itip_formatter_la_SOURCES = \ e-mail-formatter-itip.h \ e-mail-parser-itip.c \ e-mail-parser-itip.h \ + e-mail-part-itip.c \ e-mail-part-itip.h \ e-source-conflict-search.c \ e-source-conflict-search.h \ diff --git a/modules/itip-formatter/e-mail-parser-itip.c b/modules/itip-formatter/e-mail-parser-itip.c index 088f79d8ae..04c08e9cc3 100644 --- a/modules/itip-formatter/e-mail-parser-itip.c +++ b/modules/itip-formatter/e-mail-parser-itip.c @@ -62,106 +62,6 @@ static const gchar *parser_mime_types[] = { NULL }; -static void -mail_part_itip_free (EMailPart *mail_part) -{ - EMailPartItip *pitip = (EMailPartItip *) mail_part; - - g_cancellable_cancel (pitip->cancellable); - g_clear_object (&pitip->cancellable); - g_clear_object (&pitip->client_cache); - - g_free (pitip->vcalendar); - pitip->vcalendar = NULL; - - if (pitip->comp) { - g_object_unref (pitip->comp); - pitip->comp = NULL; - } - - if (pitip->top_level) { - icalcomponent_free (pitip->top_level); - pitip->top_level = NULL; - } - - if (pitip->main_comp) { - icalcomponent_free (pitip->main_comp); - pitip->main_comp = NULL; - } - pitip->ical_comp = NULL; - - g_free (pitip->calendar_uid); - pitip->calendar_uid = NULL; - - g_free (pitip->from_address); - pitip->from_address = NULL; - g_free (pitip->from_name); - pitip->from_name = NULL; - g_free (pitip->to_address); - pitip->to_address = NULL; - g_free (pitip->to_name); - pitip->to_name = NULL; - g_free (pitip->delegator_address); - pitip->delegator_address = NULL; - g_free (pitip->delegator_name); - pitip->delegator_name = NULL; - g_free (pitip->my_address); - pitip->my_address = NULL; - g_free (pitip->uid); - g_hash_table_destroy (pitip->real_comps); - - g_clear_object (&pitip->view); -} - -/******************************************************************************/ - -static void -bind_itip_view (EMailPart *part, - WebKitDOMElement *element) -{ - GString *buffer; - WebKitDOMDocument *document; - ItipView *view; - EMailPartItip *pitip; - - if (!WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT (element)) { - - WebKitDOMNodeList *nodes; - guint length, i; - - nodes = webkit_dom_element_get_elements_by_tag_name ( - element, "iframe"); - length = webkit_dom_node_list_get_length (nodes); - for (i = 0; i < length; i++) { - - element = WEBKIT_DOM_ELEMENT ( - webkit_dom_node_list_item (nodes, i)); - break; - } - - } - - g_return_if_fail (WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT (element)); - - buffer = g_string_new (""); - document = webkit_dom_html_iframe_element_get_content_document ( - WEBKIT_DOM_HTML_IFRAME_ELEMENT (element)); - pitip = E_MAIL_PART_ITIP (part); - - view = itip_view_new (pitip, pitip->client_cache); - g_object_set_data_full ( - G_OBJECT (element), "view", view, - (GDestroyNotify) g_object_unref); - - itip_view_create_dom_bindings ( - view, webkit_dom_document_get_document_element (document)); - - itip_view_init_view (view); - g_string_free (buffer, TRUE); -} - -/*******************************************************************************/ - static gboolean empe_itip_parse (EMailParserExtension *extension, EMailParser *parser, @@ -189,13 +89,7 @@ empe_itip_parse (EMailParserExtension *extension, shell = e_shell_get_default (); client_cache = e_shell_get_client_cache (shell); - itip_part = (EMailPartItip *) e_mail_part_subclass_new ( - part, part_id->str, - sizeof (EMailPartItip), - (GFreeFunc) mail_part_itip_free); - itip_part->parent.mime_type = g_strdup ("text/calendar"); - itip_part->parent.bind_func = bind_itip_view; - itip_part->parent.force_collapse = TRUE; + itip_part = e_mail_part_itip_new (part, part_id->str); itip_part->delete_message = g_settings_get_boolean (settings, CONF_KEY_DELETE); itip_part->has_organizer = FALSE; itip_part->no_reply_wanted = FALSE; diff --git a/modules/itip-formatter/e-mail-part-itip.c b/modules/itip-formatter/e-mail-part-itip.c new file mode 100644 index 0000000000..e4e6302822 --- /dev/null +++ b/modules/itip-formatter/e-mail-part-itip.c @@ -0,0 +1,171 @@ +/* + * e-mail-part-itip.c + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see + * + */ + +#include "e-mail-part-itip.h" + +#define E_MAIL_PART_ITIP_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_MAIL_PART_ITIP, EMailPartItipPrivate)) + +struct _EMailPartItipPrivate { + gint placeholder; +}; + +G_DEFINE_DYNAMIC_TYPE ( + EMailPartItip, + e_mail_part_itip, + E_TYPE_MAIL_PART) + +static void +mail_part_itip_dispose (GObject *object) +{ + EMailPartItip *part = E_MAIL_PART_ITIP (object); + + g_cancellable_cancel (part->cancellable); + + g_clear_object (&part->cancellable); + g_clear_object (&part->client_cache); + g_clear_object (&part->comp); + g_clear_object (&part->view); + + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_mail_part_itip_parent_class)->dispose (object); +} + +static void +mail_part_itip_finalize (GObject *object) +{ + EMailPartItip *part = E_MAIL_PART_ITIP (object); + + g_free (part->vcalendar); + g_free (part->calendar_uid); + g_free (part->from_address); + g_free (part->from_name); + g_free (part->to_address); + g_free (part->to_name); + g_free (part->delegator_address); + g_free (part->delegator_name); + g_free (part->my_address); + g_free (part->uid); + + if (part->top_level != NULL) + icalcomponent_free (part->top_level); + + if (part->main_comp != NULL) + icalcomponent_free (part->main_comp); + + g_hash_table_destroy (part->real_comps); + + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (e_mail_part_itip_parent_class)->finalize (object); +} + +static void +mail_part_itip_bind_dom_element (EMailPart *part, + WebKitDOMElement *element) +{ + GString *buffer; + WebKitDOMDocument *document; + ItipView *view; + EMailPartItip *pitip; + + pitip = E_MAIL_PART_ITIP (part); + + if (!WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT (element)) { + WebKitDOMNodeList *nodes; + guint ii, length; + + nodes = webkit_dom_element_get_elements_by_tag_name ( + element, "iframe"); + length = webkit_dom_node_list_get_length (nodes); + for (ii = 0; ii < length; ii++) { + element = WEBKIT_DOM_ELEMENT ( + webkit_dom_node_list_item (nodes, ii)); + break; + } + } + + g_return_if_fail (WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT (element)); + + buffer = g_string_new (""); + document = webkit_dom_html_iframe_element_get_content_document ( + WEBKIT_DOM_HTML_IFRAME_ELEMENT (element)); + + view = itip_view_new (pitip, pitip->client_cache); + g_object_set_data_full ( + G_OBJECT (element), "view", view, + (GDestroyNotify) g_object_unref); + + itip_view_create_dom_bindings ( + view, webkit_dom_document_get_document_element (document)); + + itip_view_init_view (view); + g_string_free (buffer, TRUE); +} + +static void +e_mail_part_itip_class_init (EMailPartItipClass *class) +{ + GObjectClass *object_class; + EMailPartClass *mail_part_class; + + g_type_class_add_private (class, sizeof (EMailPartItipPrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->dispose = mail_part_itip_dispose; + object_class->finalize = mail_part_itip_finalize; + + mail_part_class = E_MAIL_PART_CLASS (class); + mail_part_class->bind_dom_element = mail_part_itip_bind_dom_element; +} + +static void +e_mail_part_itip_class_finalize (EMailPartItipClass *class) +{ +} + +static void +e_mail_part_itip_init (EMailPartItip *part) +{ + part->priv = E_MAIL_PART_ITIP_GET_PRIVATE (part); + + e_mail_part_set_mime_type (E_MAIL_PART (part), "text/calendar"); + + E_MAIL_PART (part)->force_collapse = TRUE; +} + +void +e_mail_part_itip_type_register (GTypeModule *type_module) +{ + /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration + * function, so we have to wrap it with a public function in + * order to register types from a separate compilation unit. */ + e_mail_part_itip_register_type (type_module); +} + +EMailPartItip * +e_mail_part_itip_new (CamelMimePart *mime_part, + const gchar *id) +{ + g_return_val_if_fail (id != NULL, NULL); + + return g_object_new ( + E_TYPE_MAIL_PART_ITIP, + "id", id, "mime-part", mime_part, NULL); +} + diff --git a/modules/itip-formatter/e-mail-part-itip.h b/modules/itip-formatter/e-mail-part-itip.h index 78004bca96..ef978bed8e 100644 --- a/modules/itip-formatter/e-mail-part-itip.h +++ b/modules/itip-formatter/e-mail-part-itip.h @@ -26,17 +26,34 @@ #include "itip-view.h" -#define E_MAIL_PART_ITIP(part) \ - ((EMailPartItip *) part) -#define E_IS_MAIL_PART_ITIP(part) \ - (E_MAIL_PART_IS (part, EMailPartItip)) +/* Standard GObject macros */ +#define E_TYPE_MAIL_PART_ITIP \ + (e_mail_part_itip_get_type ()) +#define E_MAIL_PART_ITIP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_MAIL_PART_ITIP, EMailPartItip)) +#define E_MAIL_PART_ITIP_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_MAIL_PART_ITIP, EMailPartItipClass)) +#define E_IS_MAIL_PART_ITIP(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_MAIL_PART_ITIP)) +#define E_IS_MAIL_PART_ITIP_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), E_TYPE_MAIL_PART_ITIP)) +#define E_MAIL_PART_ITIP_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), E_TYPE_MAIL_PART_ITIP, EMailPartItipClass)) G_BEGIN_DECLS typedef struct _EMailPartItip EMailPartItip; +typedef struct _EMailPartItipClass EMailPartItipClass; +typedef struct _EMailPartItipPrivate EMailPartItipPrivate; struct _EMailPartItip { EMailPart parent; + EMailPartItipPrivate *priv; CamelFolder *folder; CamelMimeMessage *msg; @@ -114,6 +131,15 @@ struct _EMailPartItip { ItipView *view; }; +struct _EMailPartItipClass { + EMailPartClass parent_class; +}; + +GType e_mail_part_itip_get_type (void) G_GNUC_CONST; +void e_mail_part_itip_type_register (GTypeModule *type_module); +EMailPartItip * e_mail_part_itip_new (CamelMimePart *mime_part, + const gchar *id); + G_END_DECLS #endif /* E_MAIL_PART_ITIP_H */ diff --git a/modules/itip-formatter/evolution-module-itip-formatter.c b/modules/itip-formatter/evolution-module-itip-formatter.c index 13a73a30d7..af1a2358ce 100644 --- a/modules/itip-formatter/evolution-module-itip-formatter.c +++ b/modules/itip-formatter/evolution-module-itip-formatter.c @@ -18,6 +18,7 @@ #include "e-mail-formatter-itip.h" #include "e-mail-parser-itip.h" +#include "e-mail-part-itip.h" #include #include @@ -49,6 +50,7 @@ e_module_load (GTypeModule *type_module) } + e_mail_part_itip_type_register (type_module); e_mail_parser_itip_type_register (type_module); e_mail_formatter_itip_type_register (type_module); -- cgit v1.2.3