summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/sieve-message.h
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-message.h')
-rw-r--r--pigeonhole/src/lib-sieve/sieve-message.h280
1 files changed, 280 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/sieve-message.h b/pigeonhole/src/lib-sieve/sieve-message.h
new file mode 100644
index 0000000..4cb77cc
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/sieve-message.h
@@ -0,0 +1,280 @@
+#ifndef SIEVE_MESSAGE_H
+#define SIEVE_MESSAGE_H
+
+#include "sieve-common.h"
+#include "sieve-stringlist.h"
+#include "sieve-objects.h"
+
+/*
+ * Message transmission
+ */
+
+const char *sieve_message_get_new_id(const struct sieve_instance *svinst);
+
+/*
+ * Message context
+ */
+
+struct sieve_message_context;
+
+struct sieve_message_context *sieve_message_context_create
+ (struct sieve_instance *svinst, struct mail_user *mail_user,
+ const struct sieve_message_data *msgdata);
+void sieve_message_context_ref(struct sieve_message_context *msgctx);
+void sieve_message_context_unref(struct sieve_message_context **msgctx);
+
+void sieve_message_context_reset(struct sieve_message_context *msgctx);
+
+pool_t sieve_message_context_pool
+ (struct sieve_message_context *msgctx) ATTR_PURE;
+void sieve_message_context_time(struct sieve_message_context *msgctx,
+ struct timeval *time);
+
+/* Extension support */
+
+void sieve_message_context_extension_set
+ (struct sieve_message_context *msgctx, const struct sieve_extension *ext,
+ void *context);
+const void *sieve_message_context_extension_get
+ (struct sieve_message_context *msgctx, const struct sieve_extension *ext);
+
+/* Envelope */
+
+const struct smtp_address *sieve_message_get_final_recipient
+ (struct sieve_message_context *msgctx);
+const struct smtp_address *sieve_message_get_orig_recipient
+ (struct sieve_message_context *msgctx);
+
+const struct smtp_address *sieve_message_get_sender
+ (struct sieve_message_context *msgctx);
+
+/* Mail */
+
+struct mail *sieve_message_get_mail
+ (struct sieve_message_context *msgctx);
+
+int sieve_message_substitute
+ (struct sieve_message_context *msgctx, struct istream *input);
+struct edit_mail *sieve_message_edit
+ (struct sieve_message_context *msgctx);
+void sieve_message_snapshot
+ (struct sieve_message_context *msgctx);
+
+/*
+ * Header stringlist
+ */
+
+struct sieve_header_list {
+ struct sieve_stringlist strlist;
+
+ int (*next_item)
+ (struct sieve_header_list *_hdrlist, const char **name_r,
+ string_t **value_r) ATTR_NULL(2);
+};
+
+static inline int sieve_header_list_next_item
+(struct sieve_header_list *hdrlist, const char **name_r,
+ string_t **value_r) ATTR_NULL(2)
+{
+ return hdrlist->next_item(hdrlist, name_r, value_r);
+}
+
+static inline void sieve_header_list_reset
+(struct sieve_header_list *hdrlist)
+{
+ sieve_stringlist_reset(&hdrlist->strlist);
+}
+
+static inline int sieve_header_list_get_length
+(struct sieve_header_list *hdrlist)
+{
+ return sieve_stringlist_get_length(&hdrlist->strlist);
+}
+
+static inline void sieve_header_list_set_trace
+(struct sieve_header_list *hdrlist, bool trace)
+{
+ sieve_stringlist_set_trace(&hdrlist->strlist, trace);
+}
+
+struct sieve_header_list *sieve_message_header_list_create
+ (const struct sieve_runtime_env *renv,
+ struct sieve_stringlist *field_names,
+ bool mime_decode);
+
+/*
+ * Message override
+ */
+
+/* Header override object */
+
+struct sieve_message_override_def {
+ struct sieve_object_def obj_def;
+
+ unsigned int sequence;
+
+ /* Context coding */
+
+ bool (*dump_context)
+ (const struct sieve_message_override *svmo,
+ const struct sieve_dumptime_env *denv, sieve_size_t *address);
+ int (*read_context)
+ (const struct sieve_message_override *svmo,
+ const struct sieve_runtime_env *renv, sieve_size_t *address,
+ void **se_context);
+
+ /* Override */
+
+ int (*header_override)
+ (const struct sieve_message_override *svmo,
+ const struct sieve_runtime_env *renv,
+ bool mime_decode, struct sieve_stringlist **headers);
+};
+
+struct sieve_message_override {
+ struct sieve_object object;
+
+ const struct sieve_message_override_def *def;
+
+ void *context;
+};
+
+ARRAY_DEFINE_TYPE(sieve_message_override,
+ struct sieve_message_override);
+
+/*
+ * Message override operand
+ */
+
+#define SIEVE_EXT_DEFINE_MESSAGE_OVERRIDE(SVMO) SIEVE_EXT_DEFINE_OBJECT(SVMO)
+#define SIEVE_EXT_DEFINE_MESSAGE_OVERRIDES(SVMOS) SIEVE_EXT_DEFINE_OBJECTS(SMOS)
+
+#define SIEVE_OPT_MESSAGE_OVERRIDE (-2)
+
+extern const struct sieve_operand_class
+ sieve_message_override_operand_class;
+
+static inline void sieve_opr_message_override_emit
+(struct sieve_binary_block *sblock, const struct sieve_extension *ext,
+ const struct sieve_message_override_def *seff)
+{
+ sieve_opr_object_emit(sblock, ext, &seff->obj_def);
+}
+
+bool sieve_opr_message_override_dump
+ (const struct sieve_dumptime_env *denv, sieve_size_t *address);
+int sieve_opr_message_override_read
+ (const struct sieve_runtime_env *renv, sieve_size_t *address,
+ struct sieve_message_override *svmo);
+
+/*
+ * Optional operands
+ */
+
+int sieve_message_opr_optional_dump
+ (const struct sieve_dumptime_env *denv, sieve_size_t *address,
+ signed int *opt_code);
+
+int sieve_message_opr_optional_read
+ (const struct sieve_runtime_env *renv, sieve_size_t *address,
+ signed int *opt_code, int *exec_status,
+ struct sieve_address_part *addrp, struct sieve_match_type *mcht,
+ struct sieve_comparator *cmp,
+ ARRAY_TYPE(sieve_message_override) *svmos);
+
+/*
+ * Message header
+ */
+
+int sieve_message_get_header_fields
+ (const struct sieve_runtime_env *renv,
+ struct sieve_stringlist *field_names,
+ ARRAY_TYPE(sieve_message_override) *svmos,
+ bool mime_decode, struct sieve_stringlist **fields_r);
+
+/*
+ * Message part
+ */
+
+struct sieve_message_part;
+
+struct sieve_message_part_data {
+ const char *content_type;
+ const char *content_disposition;
+
+ const char *content;
+ unsigned long size;
+};
+
+struct sieve_message_part *sieve_message_part_parent
+ (struct sieve_message_part *mpart) ATTR_PURE;
+struct sieve_message_part *sieve_message_part_next
+ (struct sieve_message_part *mpart) ATTR_PURE;
+struct sieve_message_part *sieve_message_part_children
+ (struct sieve_message_part *mpart) ATTR_PURE;
+
+const char *sieve_message_part_content_type
+ (struct sieve_message_part *mpart) ATTR_PURE;
+const char *sieve_message_part_content_disposition
+ (struct sieve_message_part *mpart) ATTR_PURE;
+
+int sieve_message_part_get_first_header
+ (struct sieve_message_part *mpart, const char *field,
+ const char **value_r);
+
+void sieve_message_part_get_data
+ (struct sieve_message_part *mpart,
+ struct sieve_message_part_data *data, bool text);
+
+/*
+ * Message body
+ */
+
+int sieve_message_body_get_content
+ (const struct sieve_runtime_env *renv,
+ const char * const *content_types,
+ struct sieve_message_part_data **parts_r);
+int sieve_message_body_get_text
+ (const struct sieve_runtime_env *renv,
+ struct sieve_message_part_data **parts_r);
+int sieve_message_body_get_raw
+ (const struct sieve_runtime_env *renv,
+ struct sieve_message_part_data **parts_r);
+
+/*
+ * Message part iterator
+ */
+
+struct sieve_message_part_iter {
+ const struct sieve_runtime_env *renv;
+ struct sieve_message_part *root;
+ unsigned int index, offset;
+};
+
+int sieve_message_part_iter_init
+(struct sieve_message_part_iter *iter,
+ const struct sieve_runtime_env *renv);
+void sieve_message_part_iter_subtree(struct sieve_message_part_iter *iter,
+ struct sieve_message_part_iter *subtree);
+void sieve_message_part_iter_children(struct sieve_message_part_iter *iter,
+ struct sieve_message_part_iter *child);
+
+struct sieve_message_part *sieve_message_part_iter_current
+(struct sieve_message_part_iter *iter);
+struct sieve_message_part *sieve_message_part_iter_next
+(struct sieve_message_part_iter *iter);
+
+void sieve_message_part_iter_reset
+(struct sieve_message_part_iter *iter);
+
+/*
+ * MIME header list
+ */
+
+struct sieve_header_list *sieve_mime_header_list_create
+(const struct sieve_runtime_env *renv,
+ struct sieve_stringlist *field_names,
+ struct sieve_message_part_iter *part_iter,
+ bool mime_decode, bool children);
+
+#endif