diff options
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-address-parts.h')
-rw-r--r-- | pigeonhole/src/lib-sieve/sieve-address-parts.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/sieve-address-parts.h b/pigeonhole/src/lib-sieve/sieve-address-parts.h new file mode 100644 index 0000000..c774dc3 --- /dev/null +++ b/pigeonhole/src/lib-sieve/sieve-address-parts.h @@ -0,0 +1,135 @@ +#ifndef SIEVE_ADDRESS_PARTS_H +#define SIEVE_ADDRESS_PARTS_H + +#include "message-address.h" + +#include "sieve-common.h" +#include "sieve-match.h" +#include "sieve-extensions.h" +#include "sieve-objects.h" + +/* + * Address part definition + */ + +struct sieve_address_part_def { + struct sieve_object_def obj_def; + + const char *(*extract_from) + (const struct sieve_address_part *addrp, + const struct smtp_address *address); +}; + +/* + * Address part instance + */ + +struct sieve_address_part { + struct sieve_object object; + + const struct sieve_address_part_def *def; +}; + +#define SIEVE_ADDRESS_PART_DEFAULT(definition) \ + { SIEVE_OBJECT_DEFAULT(definition), &(definition) }; + +#define sieve_address_part_name(addrp) \ + ( (addrp)->object.def->identifier ) +#define sieve_address_part_is(addrp, definition) \ + ( (addrp)->def == &(definition) ) + +/* + * Core address parts + */ + +enum sieve_address_part_code { + SIEVE_ADDRESS_PART_ALL, + SIEVE_ADDRESS_PART_LOCAL, + SIEVE_ADDRESS_PART_DOMAIN, + SIEVE_ADDRESS_PART_CUSTOM +}; + +extern const struct sieve_address_part_def all_address_part; +extern const struct sieve_address_part_def local_address_part; +extern const struct sieve_address_part_def domain_address_part; + +/* + * Address part tagged argument + */ + +extern const struct sieve_argument_def address_part_tag; + +void sieve_address_parts_link_tags + (struct sieve_validator *valdtr, struct sieve_command_registration *cmd_reg, + int id_code); + +/* + * Address part registry + */ + +void sieve_address_part_register + (struct sieve_validator *valdtr, const struct sieve_extension *ext, + const struct sieve_address_part_def *addrp); + +/* + * Address part operand + */ + +extern const struct sieve_operand_def address_part_operand; +extern const struct sieve_operand_class sieve_address_part_operand_class; + +#define SIEVE_EXT_DEFINE_ADDRESS_PART(OP) SIEVE_EXT_DEFINE_OBJECT(OP) +#define SIEVE_EXT_DEFINE_ADDRESS_PARTS(OPS) SIEVE_EXT_DEFINE_OBJECTS(OPS) + +static inline void sieve_opr_address_part_emit +(struct sieve_binary_block *sblock, const struct sieve_address_part *addrp) +{ + sieve_opr_object_emit(sblock, addrp->object.ext, addrp->object.def); +} + +static inline bool sieve_opr_address_part_dump + (const struct sieve_dumptime_env *denv, sieve_size_t *address) +{ + return sieve_opr_object_dump + (denv, &sieve_address_part_operand_class, address, NULL); +} + +static inline int sieve_opr_address_part_read +(const struct sieve_runtime_env *renv, sieve_size_t *address, + struct sieve_address_part *addrp) +{ + if ( !sieve_opr_object_read + (renv, &sieve_address_part_operand_class, address, &addrp->object) ) + return SIEVE_EXEC_BIN_CORRUPT; + + addrp->def = (const struct sieve_address_part_def *) addrp->object.def; + return SIEVE_EXEC_OK; +} + +/* + * Address-part string list + */ + +struct sieve_stringlist *sieve_address_part_stringlist_create + (const struct sieve_runtime_env *renv, const struct sieve_address_part *addrp, + struct sieve_address_list *addresses); + +/* + * Match utility + */ + +enum sieve_addrmatch_opt_operand { + SIEVE_AM_OPT_ADDRESS_PART = SIEVE_MATCH_OPT_LAST, + SIEVE_AM_OPT_LAST +}; + +int sieve_addrmatch_opr_optional_dump + (const struct sieve_dumptime_env *denv, sieve_size_t *address, + signed int *opt_code); + +int sieve_addrmatch_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 *mtch, struct sieve_comparator *cmp); + +#endif |