aboutsummaryrefslogtreecommitdiffstats
path: root/em-format/em-format.h
diff options
context:
space:
mode:
Diffstat (limited to 'em-format/em-format.h')
-rw-r--r--em-format/em-format.h566
1 files changed, 241 insertions, 325 deletions
diff --git a/em-format/em-format.h b/em-format/em-format.h
index cf214d81a5..712b41bce1 100644
--- a/em-format/em-format.h
+++ b/em-format/em-format.h
@@ -21,14 +21,11 @@
*
*/
-/*
- Abstract class for formatting mime messages
-*/
-
#ifndef EM_FORMAT_H
#define EM_FORMAT_H
#include <camel/camel.h>
+#include <gtk/gtk.h>
/* Standard GObject macros */
#define EM_TYPE_FORMAT \
@@ -51,194 +48,139 @@
G_BEGIN_DECLS
+#define EM_FORMAT_HEADER_BOLD (1<<0)
+#define EM_FORMAT_HEADER_LAST (1<<4) /* reserve 4 slots */
+
+#define EM_FORMAT_VALIDITY_FOUND_PGP (1<<0)
+#define EM_FORMAT_VALIDITY_FOUND_SMIME (1<<1)
+#define EM_FORMAT_VALIDITY_FOUND_SIGNED (1<<2)
+#define EM_FORMAT_VALIDITY_FOUND_ENCRYPTED (1<<3)
+
typedef struct _EMFormat EMFormat;
typedef struct _EMFormatClass EMFormatClass;
typedef struct _EMFormatPrivate EMFormatPrivate;
-typedef struct _EMFormatHandler EMFormatHandler;
+typedef struct _EMFormatPURI EMFormatPURI;
typedef struct _EMFormatHeader EMFormatHeader;
+typedef struct _EMFormatHandler EMFormatHandler;
+typedef struct _EMFormatParserInfo EMFormatParserInfo;
+typedef struct _EMFormatWriterInfo EMFormatWriterInfo;
+typedef struct _WebKitDOMElement WebKitDOMElement;
-typedef void (*EMFormatFunc) (EMFormat *emf,
+typedef void (*EMFormatParseFunc) (EMFormat *emf,
+ CamelMimePart *part,
+ GString *part_id,
+ EMFormatParserInfo *info,
+ GCancellable *cancellable);
+typedef void (*EMFormatWriteFunc) (EMFormat *emf,
+ EMFormatPURI *puri,
CamelStream *stream,
- CamelMimePart *mime_part,
- const EMFormatHandler *info,
- GCancellable *cancellable,
- gboolean is_fallback);
-
-typedef enum {
- EM_FORMAT_MODE_NORMAL,
- EM_FORMAT_MODE_ALLHEADERS,
- EM_FORMAT_MODE_SOURCE
-} EMFormatMode;
+ EMFormatWriterInfo *info,
+ GCancellable *cancellable);
+typedef GtkWidget * (*EMFormatWidgetFunc) (EMFormat *emf,
+ EMFormatPURI *puri,
+ GCancellable *cancellable);
+typedef void (*EMailDisplayBindFunc) (WebKitDOMElement *root,
+ EMFormatPURI *puri);
-/**
- * EMFormatHandlerFlags - Format handler flags.
- *
- * @EM_FORMAT_HANDLER_INLINE: This type should be shown expanded
- * inline by default.
- * @EM_FORMAT_HANDLER_INLINE_DISPOSITION: This type should always be
- * shown inline, despite what the Content-Disposition suggests.
- *
- **/
typedef enum {
EM_FORMAT_HANDLER_INLINE = 1 << 0,
- EM_FORMAT_HANDLER_INLINE_DISPOSITION = 1 << 1
+ EM_FORMAT_HANDLER_INLINE_DISPOSITION = 1 << 1,
+ EM_FORMAT_HANDLER_COMPOUND_TYPE = 1 << 2
} EMFormatHandlerFlags;
-/**
- * struct _EMFormatHandler - MIME type handler.
- *
- * @mime_type: Type this handler handles.
- * @handler: The handler callback.
- * @flags: Handler flags
- * @old: The last handler set on this type. Allows overrides to
- * fallback to previous implementation.
- *
- **/
+typedef enum {
+ EM_FORMAT_WRITE_MODE_NORMAL= 1 << 0,
+ EM_FORMAT_WRITE_MODE_ALL_HEADERS = 1 << 1,
+ EM_FORMAT_WRITE_MODE_SOURCE = 1 << 2,
+ EM_FORMAT_WRITE_MODE_PRINTING = 1 << 3,
+ EM_FORMAT_WRITE_MODE_RAW = 1 << 4
+} EMFormatWriteMode;
+
struct _EMFormatHandler {
gchar *mime_type;
- EMFormatFunc handler;
+ EMFormatParseFunc parse_func;
+ EMFormatWriteFunc write_func;
EMFormatHandlerFlags flags;
EMFormatHandler *old;
};
-typedef struct _EMFormatPURI EMFormatPURI;
-typedef void (*EMFormatPURIFunc) (EMFormat *emf,
- CamelStream *stream,
- EMFormatPURI *puri,
- GCancellable *cancellable);
-
/**
- * struct _EMFormatPURI - Pending URI object.
- *
- * @free: May be set by allocator and will be called when no longer needed.
- * @format:
- * @uri: Calculated URI of the part, if the part has one in its
- * Content-Location field.
- * @cid: The RFC2046 Content-Id of the part. If none is present, a unique value
- * is calculated from @part_id.
- * @part_id: A unique identifier for each part.
- * @func: Callback for when the URI is requested. The callback writes
- * its data to the supplied stream.
- * @part:
- * @use_count:
- *
- * This is used for multipart/related, and other formatters which may
- * need to include a reference to out-of-band data in the content
- * stream.
- *
- * This object may be subclassed as a struct.
- **/
-struct _EMFormatPURI {
- void (*free)(EMFormatPURI *p); /* optional callback for freeing user-fields */
- EMFormat *format;
+ * Use this struct to pass additional information between
+ * EMFormatParseFunc's.
+ * Much cleaner then setting public property of EMFormat.
+ */
+struct _EMFormatParserInfo {
+ const EMFormatHandler *handler;
- gchar *uri; /* will be the location of the part, may be empty */
- gchar *cid; /* will always be set, a fake one created if needed */
- gchar *part_id; /* will always be set, emf->part_id->str for this part */
+ /* EM_FORMAT_VALIDITY_* flags */
+ guint32 validity_type;
+ CamelCipherValidity *validity;
- EMFormatPURIFunc func;
- CamelMimePart *part;
+ gint is_attachment : 1;
+ gint force_handler: 1;
+};
- guint use_count; /* used by multipart/related to see if it was accessed */
+struct _EMFormatWriterInfo {
+ EMFormatWriteMode mode;
+ gboolean headers_collapsable;
+ gboolean headers_collapsed;
};
struct _EMFormatHeader {
guint32 flags; /* E_FORMAT_HEADER_ * */
- gchar name[1];
+ gchar *name;
+ gchar *value;
};
#define EM_FORMAT_HEADER_BOLD (1<<0)
#define EM_FORMAT_HEADER_LAST (1<<4) /* reserve 4 slots */
-#define EM_FORMAT_VALIDITY_FOUND_PGP (1<<0)
-#define EM_FORMAT_VALIDITY_FOUND_SMIME (1<<1)
-#define EM_FORMAT_VALIDITY_FOUND_SIGNED (1<<2)
-#define EM_FORMAT_VALIDITY_FOUND_ENCRYPTED (1<<3)
+struct _EMFormatPURI {
+ CamelMimePart *part;
+
+ EMFormat *emf;
+ EMFormatWriteFunc write_func;
+ EMFormatWidgetFunc widget_func;
+
+ /**
+ * Called by #EMailDisplay whenever document/frame is reloaded.
+ * Modules and plugins can create bindings to events of DOM
+ * objects they created.
+ */
+ EMailDisplayBindFunc bind_func;
+
+ gchar *uri;
+ gchar *cid;
+ gchar *mime_type;
+
+ /* EM_FORMAT_VALIDITY_* flags */
+ guint32 validity_type;
+ CamelCipherValidity *validity;
+ CamelCipherValidity *validity_parent;
+
+ gboolean is_attachment;
+
+ void (*free)(EMFormatPURI *puri); /* optional callback for freeing user-fields */
+};
-/**
- * struct _EMFormat - Mail formatter object.
- *
- * @parent:
- * @priv:
- * @message:
- * @folder:
- * @uid:
- * @part_id:
- * @header_list:
- * @session:
- * @base url:
- * @snoop_mime_type:
- * @valid:
- * @valid_parent:
- * @inline_table:
- * @pending_uri_table:
- * @pending_uri_tree:
- * @pending_uri_level:
- * @mode:
- * @charset:
- * @default_charset:
- *
- * Most fields are private or read-only.
- *
- * This is the base MIME formatter class. It provides no formatting
- * itself, but drives most of the basic types, including multipart / * types.
- **/
struct _EMFormat {
GObject parent;
EMFormatPrivate *priv;
- /* The current message */
CamelMimeMessage *message;
-
CamelFolder *folder;
- gchar *uid;
+ gchar *message_uid;
+ gchar *uri_base;
- /* Current part ID prefix for identifying parts directly. */
- GString *part_id;
- /* part_id of the currently processing message
- * (when the message has message-attachments) */
- gchar *current_message_part_id;
+ /* Defines order in which parts should be displayed */
+ GList *mail_part_list;
+ /* For quick search for parts by their URI/ID */
+ GHashTable *mail_part_table;
/* If empty, then all. */
GQueue header_list;
-
- /* Used for authentication when required. */
- CamelSession *session;
-
- /* Content-Base header or absolute Content-Location, for any part. */
- CamelURL *base;
-
- /* If we snooped an application/octet-stream, what we snooped. */
- const gchar *snoop_mime_type;
-
- /* For validity enveloping. */
- CamelCipherValidity *valid;
- CamelCipherValidity *valid_parent;
-
- /* For checking whether we found any signed or encrypted parts. */
- guint32 validity_found;
-
- /* For forcing inlining. */
- GHashTable *inline_table;
-
- /* Global URI lookup table for message. */
- GHashTable *pending_uri_table;
-
- /* This structure is used internally to form a visibility tree of
- * parts in the current formatting stream. This is to implement the
- * part resolution rules for RFC2387 to implement multipart/related. */
- GNode *pending_uri_tree;
-
- /* The current level to search from. */
- GNode *pending_uri_level;
-
- EMFormatMode mode; /* source/headers/etc */
- gchar *charset; /* charset override */
- gchar *default_charset; /* charset fallback */
- gboolean composer; /* formatting from composer? */
- gboolean print; /* formatting for printing? */
};
struct _EMFormatClass {
@@ -246,187 +188,161 @@ struct _EMFormatClass {
GHashTable *type_handlers;
- /* lookup handler, default falls back to hashtable above */
- const EMFormatHandler *
- (*find_handler) (EMFormat *emf,
- const gchar *mime_type);
-
- /* start formatting a message */
- void (*format_clone) (EMFormat *emf,
- CamelFolder *folder,
- const gchar *uid,
- CamelMimeMessage *message,
- EMFormat *source,
- GCancellable *cancellable);
-
- /* some internel error/inconsistency */
- void (*format_error) (EMFormat *emf,
- CamelStream *stream,
- const gchar *errmsg);
-
- /* use for external structured parts */
- void (*format_attachment) (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *mime_part,
- const gchar *mime_type,
- const EMFormatHandler *info,
- GCancellable *cancellable);
+ gboolean (*is_inline) (EMFormat *emf,
+ const gchar *part_id,
+ CamelMimePart *part,
+ const EMFormatHandler *handler);
- /* use for unparsable content */
- void (*format_source) (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *mime_part,
- GCancellable *cancellable);
- /* for outputing secure(d) content */
- void (*format_secure) (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *mime_part,
- CamelCipherValidity *validity,
- GCancellable *cancellable);
+ /* Write the entire message to stream */
+ void (*write) (EMFormat *emf,
+ CamelStream *stream,
+ EMFormatWriterInfo *info,
+ GCancellable *cancellable);
- /* returns true if the formatter is still busy with pending stuff */
- gboolean (*busy) (EMFormat *);
-
- /* Shows optional way to open messages */
- void (*format_optional) (EMFormat *emf,
- CamelStream *filter_stream,
- CamelMimePart *mime_part,
- CamelStream *mem_stream,
- GCancellable *cancellable);
-
- gboolean (*is_inline) (EMFormat *emf,
- const gchar *part_id,
- CamelMimePart *mime_part,
- const EMFormatHandler *handle);
+ void (*preparse) (EMFormat *emf);
/* signals */
- /* complete, alternative to polling busy, for asynchronous work */
- void (*complete) (EMFormat *emf);
-};
+ void (*redraw_requested) (EMFormat *emf);
-void em_format_set_mode (EMFormat *emf,
- EMFormatMode mode);
-void em_format_set_charset (EMFormat *emf,
- const gchar *charset);
-void em_format_set_default_charset (EMFormat *emf,
- const gchar *charset);
-
-/* also indicates to show all headers */
-void em_format_clear_headers (EMFormat *emf);
-
-void em_format_default_headers (EMFormat *emf);
-void em_format_add_header (EMFormat *emf,
- const gchar *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? */
-
-gint em_format_is_attachment (EMFormat *emf,
- CamelMimePart *part);
-
-gboolean em_format_is_inline (EMFormat *emf,
- const gchar *part_id,
- CamelMimePart *mime_part,
- const EMFormatHandler *handle);
-void em_format_set_inline (EMFormat *emf,
- const gchar *partid,
- gint state);
-
-gchar * em_format_describe_part (CamelMimePart *part,
- const gchar *mime_type);
-
-/* 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,
- EMFormatHandler *info);
-const EMFormatHandler *
- em_format_find_handler (EMFormat *emf,
- const gchar *mime_type);
-const EMFormatHandler *
- em_format_fallback_handler (EMFormat *emf,
- const gchar *mime_type);
-
-/* puri is short for pending uri ... really */
-EMFormatPURI * em_format_add_puri (EMFormat *emf,
- gsize size,
- const gchar *uri,
- CamelMimePart *part,
- EMFormatPURIFunc func);
-EMFormatPURI * em_format_find_visible_puri (EMFormat *emf,
- const gchar *uri);
-EMFormatPURI * em_format_find_puri (EMFormat *emf,
- const gchar *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 */
-void em_format_format_clone (EMFormat *emf,
- CamelFolder *folder,
- const gchar *uid,
- CamelMimeMessage *message,
- EMFormat *source,
- GCancellable *cancellable);
-
-/* formats a new message */
-void em_format_format (EMFormat *emf,
- CamelFolder *folder,
- const gchar *uid,
- CamelMimeMessage *message,
- GCancellable *cancellable);
-void em_format_queue_redraw (EMFormat *emf);
-void em_format_format_attachment (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *mime_part,
- const gchar *mime_type,
- const EMFormatHandler *info,
- GCancellable *cancellable);
-void em_format_format_error (EMFormat *emf,
- CamelStream *stream,
- const gchar *format,
- ...) G_GNUC_PRINTF (3, 4);
-void em_format_format_secure (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *mime_part,
- CamelCipherValidity *valid,
- GCancellable *cancellable);
-void em_format_format_source (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *mime_part,
- GCancellable *cancellable);
-
-gboolean em_format_busy (EMFormat *emf);
-
-/* raw content only */
-void em_format_format_content (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *part,
- GCancellable *cancellable);
-
-/* raw content text parts - should this just be checked/done by above? */
-void em_format_format_text (EMFormat *emf,
- CamelStream *stream,
- CamelDataWrapper *part,
- GCancellable *cancellable);
-
-void em_format_part_as (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *part,
- const gchar *mime_type,
- GCancellable *cancellable);
-void em_format_part (EMFormat *emf,
- CamelStream *stream,
- CamelMimePart *mime_part,
- GCancellable *cancellable);
-void em_format_merge_handler (EMFormat *new,
- EMFormat *old);
-
-const gchar * em_format_snoop_type (CamelMimePart *part);
+};
-G_END_DECLS
+EMFormat * em_format_new (void);
+
+GType em_format_get_type (void);
+
+void em_format_set_charset (EMFormat *emf,
+ const gchar *charset);
+const gchar * em_format_get_charset (EMFormat *emf);
+
+void em_format_set_default_charset (EMFormat *emf,
+ const gchar *charset);
+const gchar * em_format_get_default_charset (EMFormat *emf);
+
+void em_format_set_composer (EMFormat *emf,
+ gboolean composer);
+gboolean em_format_get_composer (EMFormat *emf);
+
+void em_format_set_base_url (EMFormat *emf,
+ CamelURL *url);
+void em_format_set_base_url_string (EMFormat *emf,
+ const gchar *url_string);
+CamelURL * em_format_get_base_url (EMFormat *emf);
+
+void em_format_clear_headers (EMFormat *emf);
+
+void em_format_default_headers (EMFormat *emf);
+
+void em_format_add_header (EMFormat *emf,
+ const gchar *name,
+ const gchar *value,
+ guint32 flags);
+void em_format_add_header_struct (EMFormat *emf,
+ EMFormatHeader *header);
+void em_format_remove_header (EMFormat *emf,
+ const gchar *name,
+ const gchar *value);
+void em_format_remove_header_struct (EMFormat *emf,
+ const EMFormatHeader *header);
+
+void em_format_add_puri (EMFormat *emf,
+ EMFormatPURI *puri);
+EMFormatPURI * em_format_find_puri (EMFormat *emf,
+ const gchar *id);
+
+void em_format_class_add_handler (EMFormatClass *emfc,
+ EMFormatHandler *handler);
+void em_format_class_remove_handler (EMFormatClass *emfc,
+ EMFormatHandler *handler);
+
+const EMFormatHandler * em_format_find_handler (EMFormat *emf,
+ const gchar *mime_type);
+const EMFormatHandler * em_format_fallback_handler (EMFormat *emf,
+ const gchar *mime_type);
+
+void em_format_parse (EMFormat *emf,
+ CamelMimeMessage *message,
+ CamelFolder *folder,
+ GCancellable *cancellable);
+
+void em_format_write (EMFormat *emf,
+ CamelStream *stream,
+ EMFormatWriterInfo *info,
+ GCancellable *cancellable);
+
+void em_format_parse_async (EMFormat *emf,
+ CamelMimeMessage *message,
+ CamelFolder *folder,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+void em_format_parse_part (EMFormat *emf,
+ CamelMimePart *part,
+ GString *part_id,
+ EMFormatParserInfo *info,
+ GCancellable *cancellable);
+void em_format_parse_part_as (EMFormat *emf,
+ CamelMimePart *part,
+ GString *part_id,
+ EMFormatParserInfo *info,
+ const gchar *mime_type,
+ GCancellable *cancellable);
+gboolean em_format_is_inline (EMFormat *emf,
+ const gchar *part_id,
+ CamelMimePart *part,
+ const EMFormatHandler *handler);
+
+gchar * em_format_get_error_id (EMFormat *emf);
+
+void em_format_format_error (EMFormat *emf,
+ const gchar *format,
+ ...) G_GNUC_PRINTF (2, 3);
+void em_format_format_text (EMFormat *emf,
+ CamelStream *stream,
+ CamelDataWrapper *dw,
+ GCancellable *cancellable);
+gchar * em_format_describe_part (CamelMimePart *part,
+ const gchar *mime_type);
+gint em_format_is_attachment (EMFormat *emf,
+ CamelMimePart *part);
+const gchar * em_format_snoop_type (CamelMimePart *part);
+
+gchar * em_format_build_mail_uri (CamelFolder *folder,
+ const gchar *message_uid,
+ const gchar *part_uid,
+ ...) G_GNUC_NULL_TERMINATED;
+
+/* EMFormatParseFunc that does nothing. Use it to disable
+ * parsing of a specific mime type parts */
+void em_format_empty_parser (EMFormat *emf,
+ CamelMimePart *part,
+ GString *part_id,
+ EMFormatParserInfo *info,
+ GCancellable *cancellable);
+
+/* EMFormatWriteFunc that does nothing. Use it to disable
+ * writing of a specific mime type parts */
+void em_format_empty_writer (EMFormat *emf,
+ EMFormatPURI *puri,
+ CamelStream *stream,
+ EMFormatWriterInfo *info,
+ GCancellable *cancellable);
+
+void em_format_redraw (EMFormat *emf);
+
+EMFormatPURI * em_format_puri_new (EMFormat *emf,
+ gsize puri_size,
+ CamelMimePart *part,
+ const gchar *uri);
+void em_format_puri_free (EMFormatPURI *puri);
+
+void em_format_puri_write (EMFormatPURI *puri,
+ CamelStream *stream,
+ EMFormatWriterInfo *info,
+ GCancellable *cancellable);
+
+EMFormatHeader * em_format_header_new (const gchar *name,
+ const gchar *value);
+void em_format_header_free (EMFormatHeader *header);
#endif /* EM_FORMAT_H */