dovecot-2.2-pigeonhole: lib-sieve: Created special stringlist cl...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Sun Nov 29 10:53:29 UTC 2015
details: http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/c107764e6008
changeset: 2137:c107764e6008
user: Stephan Bosch <stephan at rename-it.nl>
date: Sun Nov 29 11:48:29 2015 +0100
description:
lib-sieve: Created special stringlist class for message headers, so that header names can also be returned by the iterator.
diffstat:
src/lib-sieve/sieve-message.c | 128 +++++++++++++++++++++++++----------------
src/lib-sieve/sieve-message.h | 39 ++++++++++++-
2 files changed, 116 insertions(+), 51 deletions(-)
diffs (275 lines):
diff -r 0bc3cb5c4c0a -r c107764e6008 src/lib-sieve/sieve-message.c
--- a/src/lib-sieve/sieve-message.c Sun Nov 29 11:48:21 2015 +0100
+++ b/src/lib-sieve/sieve-message.c Sun Nov 29 11:48:29 2015 +0100
@@ -491,44 +491,50 @@
}
/*
- * Header stringlist
+ * Message header list
*/
/* Forward declarations */
-static int sieve_message_header_stringlist_next_item
- (struct sieve_stringlist *_strlist, string_t **str_r);
-static void sieve_message_header_stringlist_reset
+static int sieve_message_header_list_next_item
+ (struct sieve_header_list *_hdrlist, const char **name_r,
+ string_t **value_r);
+static int sieve_message_header_list_next_value
+ (struct sieve_stringlist *_strlist, string_t **value_r);
+static void sieve_message_header_list_reset
(struct sieve_stringlist *_strlist);
/* String list object */
-struct sieve_message_header_stringlist {
- struct sieve_stringlist strlist;
+struct sieve_message_header_list {
+ struct sieve_header_list hdrlist;
struct sieve_stringlist *field_names;
+ const char *header_name;
const char *const *headers;
int headers_index;
unsigned int mime_decode:1;
};
-struct sieve_stringlist *sieve_message_header_stringlist_create
-(const struct sieve_runtime_env *renv, struct sieve_stringlist *field_names,
+struct sieve_header_list *sieve_message_header_list_create
+(const struct sieve_runtime_env *renv,
+ struct sieve_stringlist *field_names,
bool mime_decode)
{
- struct sieve_message_header_stringlist *strlist;
+ struct sieve_message_header_list *hdrlist;
- strlist = t_new(struct sieve_message_header_stringlist, 1);
- strlist->strlist.runenv = renv;
- strlist->strlist.exec_status = SIEVE_EXEC_OK;
- strlist->strlist.next_item = sieve_message_header_stringlist_next_item;
- strlist->strlist.reset = sieve_message_header_stringlist_reset;
- strlist->field_names = field_names;
- strlist->mime_decode = mime_decode;
+ hdrlist = t_new(struct sieve_message_header_list, 1);
+ hdrlist->hdrlist.strlist.runenv = renv;
+ hdrlist->hdrlist.strlist.exec_status = SIEVE_EXEC_OK;
+ hdrlist->hdrlist.strlist.next_item = sieve_message_header_list_next_value;
+ hdrlist->hdrlist.strlist.reset = sieve_message_header_list_reset;
+ hdrlist->hdrlist.next_item = sieve_message_header_list_next_item;
+ hdrlist->field_names = field_names;
+ hdrlist->mime_decode = mime_decode;
- return &strlist->strlist;
+ return &hdrlist->hdrlist;
}
static inline string_t *_header_right_trim(const char *raw)
@@ -547,73 +553,93 @@
/* String list implementation */
-static int sieve_message_header_stringlist_next_item
-(struct sieve_stringlist *_strlist, string_t **str_r)
+static int sieve_message_header_list_next_item
+(struct sieve_header_list *_hdrlist, const char **name_r,
+ string_t **value_r)
{
- struct sieve_message_header_stringlist *strlist =
- (struct sieve_message_header_stringlist *) _strlist;
- const struct sieve_runtime_env *renv = _strlist->runenv;
+ struct sieve_message_header_list *hdrlist =
+ (struct sieve_message_header_list *) _hdrlist;
+ const struct sieve_runtime_env *renv = _hdrlist->strlist.runenv;
struct mail *mail = sieve_message_get_mail(renv->msgctx);
- *str_r = NULL;
+ if ( name_r != NULL )
+ *name_r = NULL;
+ *value_r = NULL;
/* Check for end of current header list */
- if ( strlist->headers == NULL ) {
- strlist->headers_index = 0;
- } else if ( strlist->headers[strlist->headers_index] == NULL ) {
- strlist->headers = NULL;
- strlist->headers_index = 0;
+ if ( hdrlist->headers == NULL ) {
+ hdrlist->headers_index = 0;
+ } else if ( hdrlist->headers[hdrlist->headers_index] == NULL ) {
+ hdrlist->headers = NULL;
+ hdrlist->headers_index = 0;
}
/* Fetch next header */
- while ( strlist->headers == NULL ) {
+ while ( hdrlist->headers == NULL ) {
string_t *hdr_item = NULL;
int ret;
/* Read next header name from source list */
- if ( (ret=sieve_stringlist_next_item(strlist->field_names, &hdr_item))
- <= 0 )
+ if ( (ret=sieve_stringlist_next_item
+ (hdrlist->field_names, &hdr_item)) <= 0 )
return ret;
- if ( _strlist->trace ) {
+ hdrlist->header_name = str_c(hdr_item);
+
+ if ( _hdrlist->strlist.trace ) {
sieve_runtime_trace(renv, 0,
"extracting `%s' headers from message",
str_sanitize(str_c(hdr_item), 80));
}
/* Fetch all matching headers from the e-mail */
- if ( strlist->mime_decode ) {
- ret = mail_get_headers_utf8(mail, str_c(hdr_item), &strlist->headers);
+ if ( hdrlist->mime_decode ) {
+ ret = mail_get_headers_utf8(mail,
+ str_c(hdr_item), &hdrlist->headers);
} else {
- ret = mail_get_headers(mail, str_c(hdr_item), &strlist->headers);
+ ret = mail_get_headers(mail,
+ str_c(hdr_item), &hdrlist->headers);
}
if (ret < 0) {
- _strlist->exec_status = sieve_runtime_mail_error
- (renv, mail, "failed to read header field `%s'", str_c(hdr_item));
+ _hdrlist->strlist.exec_status =
+ sieve_runtime_mail_error(renv, mail,
+ "failed to read header field `%s'", str_c(hdr_item));
return -1;
}
- if ( strlist->headers == NULL || strlist->headers[0] == NULL ) {
+ if ( hdrlist->headers == NULL || hdrlist->headers[0] == NULL ) {
/* Try next item when no headers found */
- strlist->headers = NULL;
+ hdrlist->headers = NULL;
}
}
/* Return next item */
- *str_r = _header_right_trim(strlist->headers[strlist->headers_index++]);
+ if ( name_r != NULL )
+ *name_r = hdrlist->header_name;
+ *value_r = _header_right_trim(hdrlist->headers[hdrlist->headers_index++]);
return 1;
}
-static void sieve_message_header_stringlist_reset
-(struct sieve_stringlist *_strlist)
+static int sieve_message_header_list_next_value
+(struct sieve_stringlist *_strlist, string_t **value_r)
{
- struct sieve_message_header_stringlist *strlist =
- (struct sieve_message_header_stringlist *) _strlist;
+ struct sieve_header_list *hdrlist =
+ (struct sieve_header_list *) _strlist;
- strlist->headers = NULL;
- strlist->headers_index = 0;
- sieve_stringlist_reset(strlist->field_names);
+ return sieve_message_header_list_next_item
+ (hdrlist, NULL, value_r);
+}
+
+static void sieve_message_header_list_reset
+(struct sieve_stringlist *strlist)
+{
+ struct sieve_message_header_list *hdrlist =
+ (struct sieve_message_header_list *) strlist;
+
+ hdrlist->headers = NULL;
+ hdrlist->headers_index = 0;
+ sieve_stringlist_reset(hdrlist->field_names);
}
/*
@@ -784,8 +810,10 @@
if ( svmos == NULL || !array_is_created(svmos) ||
array_count(svmos) == 0 ) {
- *fields_r = sieve_message_header_stringlist_create
+ struct sieve_header_list *headers;
+ headers = sieve_message_header_list_create
(renv, field_names, mime_decode);
+ *fields_r = &headers->strlist;
return SIEVE_EXEC_OK;
}
@@ -794,8 +822,10 @@
svmo[0].def->header_override != NULL ) {
*fields_r = field_names;
} else {
- *fields_r = sieve_message_header_stringlist_create
+ struct sieve_header_list *headers;
+ headers = sieve_message_header_list_create
(renv, field_names, mime_decode);
+ *fields_r = &headers->strlist;
}
for ( i = 0; i < count; i++ ) {
diff -r 0bc3cb5c4c0a -r c107764e6008 src/lib-sieve/sieve-message.h
--- a/src/lib-sieve/sieve-message.h Sun Nov 29 11:48:21 2015 +0100
+++ b/src/lib-sieve/sieve-message.h Sun Nov 29 11:48:29 2015 +0100
@@ -5,6 +5,7 @@
#define __SIEVE_MESSAGE_H
#include "sieve-common.h"
+#include "sieve-stringlist.h"
#include "sieve-objects.h"
/*
@@ -74,8 +75,42 @@
* Header stringlist
*/
-struct sieve_stringlist *sieve_message_header_stringlist_create
- (const struct sieve_runtime_env *renv, struct sieve_stringlist *field_names,
+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);
/*
More information about the dovecot-cvs
mailing list