From 07defb0af7208f365de36245aaa26e75fddf3eba Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Mon, 2 Nov 2015 18:56:39 +0100 Subject: [PATCH] lib-sieve: imap4flags extension: Made flag manipulation API available to other extensions. --- src/lib-sieve/plugins/imap4flags/Makefile.am | 8 ++- src/lib-sieve/plugins/imap4flags/cmd-flag.c | 6 +-- .../imap4flags/ext-imap4flags-common.c | 35 ++++++++----- .../imap4flags/ext-imap4flags-common.h | 21 +++----- .../plugins/imap4flags/sieve-ext-imap4flags.h | 50 +++++++++++++++++++ .../plugins/imap4flags/tst-hasflag.c | 4 +- 6 files changed, 90 insertions(+), 34 deletions(-) create mode 100644 src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h diff --git a/src/lib-sieve/plugins/imap4flags/Makefile.am b/src/lib-sieve/plugins/imap4flags/Makefile.am index a511bacdc..e5390d472 100644 --- a/src/lib-sieve/plugins/imap4flags/Makefile.am +++ b/src/lib-sieve/plugins/imap4flags/Makefile.am @@ -22,6 +22,12 @@ libsieve_ext_imap4flags_la_SOURCES = \ ext-imap4flags.c \ ext-imapflags.c +public_headers = \ + sieve-ext-imap4flags.h -noinst_HEADERS = \ +headers = \ ext-imap4flags-common.h + +pkginc_libdir=$(dovecot_pkgincludedir)/sieve +pkginc_lib_HEADERS = $(public_headers) +noinst_HEADERS = $(headers) diff --git a/src/lib-sieve/plugins/imap4flags/cmd-flag.c b/src/lib-sieve/plugins/imap4flags/cmd-flag.c index 63dce4015..1db774965 100644 --- a/src/lib-sieve/plugins/imap4flags/cmd-flag.c +++ b/src/lib-sieve/plugins/imap4flags/cmd-flag.c @@ -230,13 +230,13 @@ static int cmd_flag_operation_execute if ( sieve_operation_is(op, setflag_operation) ) { sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "setflag command"); - flag_op = ext_imap4flags_set_flags; + flag_op = sieve_ext_imap4flags_set_flags; } else if ( sieve_operation_is(op, addflag_operation) ) { sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "addflag command"); - flag_op = ext_imap4flags_add_flags; + flag_op = sieve_ext_imap4flags_add_flags; } else if ( sieve_operation_is(op, removeflag_operation) ) { sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "removeflag command"); - flag_op = ext_imap4flags_remove_flags; + flag_op = sieve_ext_imap4flags_remove_flags; } else { i_unreached(); } diff --git a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c index c7964ff46..d021f0e2e 100644 --- a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c +++ b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c @@ -404,6 +404,11 @@ static void ext_imap4flags_iter_delete_last /* Flag operations */ +static string_t *ext_imap4flags_get_flag_variable +(const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, unsigned int var_index) + ATTR_NULL(2); + static bool flags_list_flag_exists (string_t *flags_list, const char *flag) { @@ -479,8 +484,8 @@ static void flags_list_clear_flags } static string_t *ext_imap4flags_get_flag_variable -(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, - unsigned int var_index) +(const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, unsigned int var_index) { string_t *flags; @@ -504,9 +509,10 @@ static string_t *ext_imap4flags_get_flag_variable return flags; } -int ext_imap4flags_set_flags -(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, - unsigned int var_index, struct sieve_stringlist *flags) +int sieve_ext_imap4flags_set_flags +(const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, unsigned int var_index, + struct sieve_stringlist *flags) { string_t *cur_flags = ext_imap4flags_get_flag_variable (renv, storage, var_index); @@ -531,9 +537,10 @@ int ext_imap4flags_set_flags return SIEVE_EXEC_BIN_CORRUPT; } -int ext_imap4flags_add_flags -(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, - unsigned int var_index, struct sieve_stringlist *flags) +int sieve_ext_imap4flags_add_flags +(const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, unsigned int var_index, + struct sieve_stringlist *flags) { string_t *cur_flags = ext_imap4flags_get_flag_variable (renv, storage, var_index); @@ -557,9 +564,10 @@ int ext_imap4flags_add_flags return SIEVE_EXEC_BIN_CORRUPT; } -int ext_imap4flags_remove_flags -(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, - unsigned int var_index, struct sieve_stringlist *flags) +int sieve_ext_imap4flags_remove_flags +(const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, unsigned int var_index, + struct sieve_stringlist *flags) { string_t *cur_flags = ext_imap4flags_get_flag_variable (renv, storage, var_index); @@ -690,8 +698,9 @@ static void ext_imap4flags_stringlist_reset /* Flag access */ -struct sieve_stringlist *ext_imap4flags_get_flags -(const struct sieve_runtime_env *renv, struct sieve_stringlist *flags_list) +struct sieve_stringlist *sieve_ext_imap4flags_get_flags +(const struct sieve_runtime_env *renv, + struct sieve_stringlist *flags_list) { if ( flags_list == NULL ) return ext_imap4flags_stringlist_create_single diff --git a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h index 7399c5347..ac03d2f55 100644 --- a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h +++ b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h @@ -9,6 +9,8 @@ #include "sieve-common.h" #include "sieve-ext-variables.h" +#include "sieve-ext-imap4flags.h" + /* * Extension */ @@ -89,24 +91,13 @@ const char *ext_imap4flags_iter_get_flag /* Flag operations */ typedef int (*ext_imapflag_flag_operation_t) - (const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, - unsigned int var_index, struct sieve_stringlist *flags); - -int ext_imap4flags_set_flags - (const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, - unsigned int var_index, struct sieve_stringlist *flags); -int ext_imap4flags_add_flags - (const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, - unsigned int var_index, struct sieve_stringlist *flags); -int ext_imap4flags_remove_flags - (const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, - unsigned int var_index, struct sieve_stringlist *flags); + (const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, + unsigned int var_index, struct sieve_stringlist *flags) + ATTR_NULL(2); /* Flags access */ -struct sieve_stringlist *ext_imap4flags_get_flags - (const struct sieve_runtime_env *renv, struct sieve_stringlist *flags_list); - void ext_imap4flags_get_implicit_flags_init (struct ext_imap4flags_iter *iter, const struct sieve_extension *this_ext, struct sieve_result *result); diff --git a/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h b/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h new file mode 100644 index 000000000..139699494 --- /dev/null +++ b/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h @@ -0,0 +1,50 @@ +/* Copyright (c) 2002-2015 Pigeonhole authors, see the included COPYING file + */ + +#ifndef __SIEVE_EXT_IMAP4FLAGS_H +#define __SIEVE_EXT_IMAP4FLAGS_H + +struct sieve_variable_storage; + +/* + * Imap4flags extension + */ + +/* FIXME: this is not suitable for future plugin support */ + +extern const struct sieve_extension_def imap4flags_extension; + +static inline const struct sieve_extension * +sieve_ext_imap4flags_require_extension +(struct sieve_instance *svinst) +{ + return sieve_extension_require + (svinst, &imap4flags_extension, TRUE); +} + +/* + * Flag manipulation + */ + +int sieve_ext_imap4flags_set_flags +(const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, unsigned int var_index, + struct sieve_stringlist *flags) ATTR_NULL(2); +int sieve_ext_imap4flags_add_flags +(const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, unsigned int var_index, + struct sieve_stringlist *flags) ATTR_NULL(2); +int sieve_ext_imap4flags_remove_flags +(const struct sieve_runtime_env *renv, + struct sieve_variable_storage *storage, unsigned int var_index, + struct sieve_stringlist *flags) ATTR_NULL(2); + +/* + * Flag retrieval + */ + +struct sieve_stringlist *sieve_ext_imap4flags_get_flags +(const struct sieve_runtime_env *renv, + struct sieve_stringlist *flags_list); + +#endif diff --git a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c index 2b2858861..a95425110 100644 --- a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c +++ b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c @@ -225,11 +225,11 @@ static int tst_hasflag_operation_execute sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "hasflag test"); - value_list = ext_imap4flags_get_flags(renv, variables_list); + value_list = sieve_ext_imap4flags_get_flags(renv, variables_list); if ( sieve_match_type_is(&mcht, is_match_type) || sieve_match_type_is(&mcht, contains_match_type) ) - key_list = ext_imap4flags_get_flags(renv, flag_list); + key_list = sieve_ext_imap4flags_get_flags(renv, flag_list); else key_list = flag_list; -- GitLab