ext-environment-common.c [plain text]
#include "lib.h"
#include "hash.h"
#include "sieve-common.h"
#include "sieve-extensions.h"
#include "ext-environment-common.h"
struct ext_environment_context {
struct hash_table *environment_items;
};
static const struct sieve_environment_item *core_env_items[] = {
&domain_env_item,
&host_env_item,
&location_env_item,
&phase_env_item,
&name_env_item,
&version_env_item
};
static unsigned int core_env_items_count = N_ELEMENTS(core_env_items);
static void ext_environment_item_register
(struct ext_environment_context *ectx,
const struct sieve_environment_item *item)
{
hash_table_insert
(ectx->environment_items, (void *) item->name, (void *) item);
}
void sieve_ext_environment_item_register
(const struct sieve_extension *ext, const struct sieve_environment_item *item)
{
struct ext_environment_context *ectx =
(struct ext_environment_context *) ext->context;
ext_environment_item_register(ectx, item);
}
bool ext_environment_init
(const struct sieve_extension *ext ATTR_UNUSED, void **context)
{
struct ext_environment_context *ectx =
i_new(struct ext_environment_context, 1);
unsigned int i;
ectx->environment_items = hash_table_create
(default_pool, default_pool, 0, str_hash, (hash_cmp_callback_t *)strcmp);
for ( i = 0; i < core_env_items_count; i++ ) {
ext_environment_item_register(ectx, core_env_items[i]);
}
*context = (void *) ectx;
return TRUE;
}
void ext_environment_deinit(const struct sieve_extension *ext)
{
struct ext_environment_context *ectx =
(struct ext_environment_context *) ext->context;
hash_table_destroy(&ectx->environment_items);
i_free(ectx);
}
const char *ext_environment_item_get_value
(const struct sieve_extension *ext, const char *name,
const struct sieve_script_env *senv)
{
struct ext_environment_context *ectx =
(struct ext_environment_context *) ext->context;
const struct sieve_environment_item *item =
(const struct sieve_environment_item *)
hash_table_lookup(ectx->environment_items, name);
if ( item == NULL )
return NULL;
if ( item->value != NULL )
return item->value;
if ( item->get_value != NULL )
return item->get_value(senv);
return NULL;
}
const struct sieve_environment_item domain_env_item = {
"domain",
NULL,
NULL,
};
static const char *envit_host_get_value(const struct sieve_script_env *senv)
{
return senv->hostname != NULL ? senv->hostname : "";
}
const struct sieve_environment_item host_env_item = {
"host",
NULL,
envit_host_get_value,
};
const struct sieve_environment_item location_env_item = {
"location",
NULL,
NULL,
};
const struct sieve_environment_item phase_env_item = {
"phase",
NULL,
NULL,
};
const struct sieve_environment_item name_env_item = {
"name",
PIGEONHOLE_NAME" Sieve",
NULL,
};
const struct sieve_environment_item version_env_item = {
"version",
PIGEONHOLE_VERSION,
NULL,
};