aboutsummaryrefslogtreecommitdiffstats
path: root/modules/itip-formatter
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2013-05-15 21:17:58 +0800
committerMatthew Barnes <mbarnes@redhat.com>2013-05-20 01:07:22 +0800
commitf9ffe647231a7ba2bd5347d92d560b6a57fee786 (patch)
tree6c1245d91a399647fc25521bc1f38cf564210979 /modules/itip-formatter
parent0b4e7ec091c8bbe65dc2f2afd7da78b04da7c274 (diff)
downloadgsoc2013-evolution-f9ffe647231a7ba2bd5347d92d560b6a57fee786.tar
gsoc2013-evolution-f9ffe647231a7ba2bd5347d92d560b6a57fee786.tar.gz
gsoc2013-evolution-f9ffe647231a7ba2bd5347d92d560b6a57fee786.tar.bz2
gsoc2013-evolution-f9ffe647231a7ba2bd5347d92d560b6a57fee786.tar.lz
gsoc2013-evolution-f9ffe647231a7ba2bd5347d92d560b6a57fee786.tar.xz
gsoc2013-evolution-f9ffe647231a7ba2bd5347d92d560b6a57fee786.tar.zst
gsoc2013-evolution-f9ffe647231a7ba2bd5347d92d560b6a57fee786.zip
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.
Diffstat (limited to 'modules/itip-formatter')
-rw-r--r--modules/itip-formatter/Makefile.am1
-rw-r--r--modules/itip-formatter/e-mail-parser-itip.c108
-rw-r--r--modules/itip-formatter/e-mail-part-itip.c171
-rw-r--r--modules/itip-formatter/e-mail-part-itip.h34
-rw-r--r--modules/itip-formatter/evolution-module-itip-formatter.c2
5 files changed, 205 insertions, 111 deletions
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 <http://www.gnu.org/licenses/>
+ *
+ */
+
+#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 <gmodule.h>
#include <gio/gio.h>
@@ -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);