aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-format.h
diff options
context:
space:
mode:
Diffstat (limited to 'mail/em-format.h')
-rw-r--r--mail/em-format.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/mail/em-format.h b/mail/em-format.h
new file mode 100644
index 0000000000..98812ea377
--- /dev/null
+++ b/mail/em-format.h
@@ -0,0 +1,200 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors: Michael Zucchi <notzed@ximian.com>
+ *
+ * Copyright 2003 Ximian, Inc. (www.ximian.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+/*
+ Abstract class for formatting mime messages
+*/
+
+#ifndef _EM_FORMAT_H
+#define _EM_FORMAT_H
+
+#include <glib-object.h>
+#include "e-util/e-msgport.h"
+
+struct _CamelStream;
+struct _CamelMimePart;
+struct _CamelMedium;
+struct _CamelSession;
+struct _CamelURL;
+struct _CamelDataWrapper;
+
+typedef struct _EMFormat EMFormat;
+typedef struct _EMFormatClass EMFormatClass;
+
+typedef struct _EMFormatHandler EMFormatHandler;
+typedef struct _EMFormatHeader EMFormatHeader;
+
+typedef void (*EMFormatFunc) (EMFormat *md, struct _CamelStream *stream, struct _CamelMimePart *part, const EMFormatHandler *info);
+
+typedef enum _em_format_mode_t {
+ EM_FORMAT_NORMAL,
+ EM_FORMAT_ALLHEADERS,
+ EM_FORMAT_SOURCE,
+} em_format_mode_t;
+
+/* can be subclassed/extended ... */
+struct _EMFormatHandler {
+ char *mime_type;
+ EMFormatFunc handler;
+ GList *applications; /* gnome vfs short-list of applications, do we care? */
+};
+
+typedef struct _EMFormatPURI EMFormatPURI;
+typedef void (*EMFormatPURIFunc)(EMFormat *md, struct _CamelStream *stream, EMFormatPURI *puri);
+
+struct _EMFormatPURI {
+ struct _EMFormatPURI *next, *prev;
+
+ struct _EMFormat *format;
+
+ char *uri; /* will be the location of the part, may be empty */
+ char *cid; /* will always be set, a fake one created if needed */
+
+ EMFormatPURIFunc func;
+ struct _CamelMimePart *part;
+
+ unsigned int use_count; /* used by multipart/related to see if it was accessed */
+};
+
+/* used to stack pending uri's for visibility (multipart/related) */
+struct _EMFormatPURITree {
+ struct _EMFormatPURITree *next, *prev, *parent;
+
+ EDList uri_list;
+ EDList children;
+};
+
+struct _EMFormatHeader {
+ struct _EMFormatHeader *next, *prev;
+
+ guint32 flags; /* E_FORMAT_HEADER_* */
+ char name[1];
+};
+
+#define EM_FORMAT_HEADER_BOLD (1<<0)
+#define EM_FORMAT_HEADER_LAST (1<<4) /* reserve 4 slots */
+
+struct _EMFormat {
+ GObject parent;
+
+ struct _CamelMedium *message; /* the current message */
+
+ EDList header_list; /* if empty, then all */
+
+ struct _CamelSession *session; /* session, used for authentication when required */
+ struct _CamelURL *base; /* current location (base url) */
+
+ /* for forcing inlining */
+ GHashTable *inline_table;
+
+ /* global lookup table for message */
+ GHashTable *pending_uri_table;
+
+ /* visibility tree, also stores every puri permanently */
+ struct _EMFormatPURITree *pending_uri_tree;
+ /* current level to search from */
+ struct _EMFormatPURITree *pending_uri_level;
+
+ em_format_mode_t mode; /* source/headers/etc */
+ char *charset; /* charset override */
+};
+
+struct _EMFormatClass {
+ GObjectClass parent_class;
+
+ GHashTable *type_handlers;
+
+ /* start formatting a message */
+ void (*format_clone)(EMFormat *, struct _CamelMedium *, EMFormat *);
+ /* some internel error/inconsistency */
+ void (*format_error)(EMFormat *, struct _CamelStream *, const char *msg);
+
+ /* use for external structured parts */
+ void (*format_attachment)(EMFormat *, struct _CamelStream *, struct _CamelMimePart *, const char *mime_type, const struct _EMFormatHandler *info);
+ /* for any message parts */
+ void (*format_message)(EMFormat *, struct _CamelStream *, struct _CamelMedium *);
+ /* use for unparsable content */
+ void (*format_source)(EMFormat *, struct _CamelStream *, struct _CamelMimePart *);
+
+ /* returns true if the formatter is still busy with pending stuff */
+ gboolean (*busy)(EMFormat *);
+
+ /* signals */
+ /* complete, alternative to polling busy, for asynchronous work */
+ void (*complete)(EMFormat *);
+};
+
+/* helper entry point */
+void em_format_set_session(EMFormat *emf, struct _CamelSession *s);
+
+void em_format_set_mode(EMFormat *emf, em_format_mode_t type);
+void em_format_set_charset(EMFormat *emf, const char *charset);
+
+void em_format_clear_headers(EMFormat *emf); /* also indicates to show all headers */
+void em_format_default_headers(EMFormat *emf);
+void em_format_add_header(EMFormat *emf, const char *name, guint32 flags);
+
+/* FIXME: Need a 'clone' api to copy details about the current view (inlines etc)
+ Or maybe it should live with sub-classes? */
+
+int em_format_is_attachment(EMFormat *emf, struct _CamelMimePart *part);
+int em_format_is_inline(EMFormat *emf, struct _CamelMimePart *part);
+/* FIXME: not sure about this api */
+void em_format_set_inline(EMFormat *emf, struct _CamelMimePart *part, int state);
+char *em_format_describe_part(struct _CamelMimePart *part, const char *mimetype);
+
+/* for implementers */
+GType em_format_get_type(void);
+
+void em_format_class_add_handler(EMFormatClass *emfc, EMFormatHandler *info);
+void em_format_class_remove_handler (EMFormatClass *emfc, const char *mime_type);
+const EMFormatHandler *em_format_find_handler(EMFormat *emf, const char *mime_type);
+const EMFormatHandler *em_format_fallback_handler(EMFormat *emf, const char *mime_type);
+
+/* puri is short for pending uri ... really */
+EMFormatPURI *em_format_add_puri(EMFormat *emf, size_t size, const char *uri, struct _CamelMimePart *part, EMFormatPURIFunc func);
+EMFormatPURI *em_format_find_visible_puri(EMFormat *emf, const char *uri);
+EMFormatPURI *em_format_find_puri(EMFormat *emf, const char *uri);
+void em_format_clear_puri_tree(EMFormat *emf);
+void em_format_push_level(EMFormat *emf);
+void em_format_pull_level(EMFormat *emf);
+
+/* clones inline state/view and format, or use to redraw */
+#define em_format_format_clone(emf, msg, src) ((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->format_clone((emf), (msg), (src))
+/* formats a new message */
+#define em_format_format(emf, msg) ((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->format_clone((emf), (msg), NULL)
+#define em_format_format_error(emf, stream, txt) ((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->format_error((emf), (stream), (txt))
+#define em_format_format_attachment(emf, stream, msg, type, info) ((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->format_attachment((emf), (stream), (msg), (type), (info))
+#define em_format_format_message(emf, stream, msg) ((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->format_message((emf), (stream), (msg))
+#define em_format_format_source(emf, stream, msg) ((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->format_source((emf), (stream), (msg))
+
+#define em_format_busy(emf) ((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->busy((emf))
+
+/* raw content only */
+void em_format_format_content(EMFormat *emf, struct _CamelStream *stream, struct _CamelMimePart *part);
+/* raw content text parts - should this just be checked/done by above? */
+void em_format_format_text(EMFormat *emf, struct _CamelStream *stream, struct _CamelDataWrapper *part);
+
+void em_format_part_as(EMFormat *emf, struct _CamelStream *stream, struct _CamelMimePart *part, const char *mime_type);
+void em_format_part(EMFormat *emf, struct _CamelStream *stream, struct _CamelMimePart *part);
+
+#endif /* ! _EM_FORMAT_H */