dovecot-2.0-sieve: Improved various aspects of the plugin-relate...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Wed Jan 13 10:04:00 EET 2010
details: http://hg.rename-it.nl/dovecot-2.0-sieve/rev/a1ebe12c6986
changeset: 1199:a1ebe12c6986
user: Stephan Bosch <stephan at rename-it.nl>
date: Wed Jan 13 09:02:53 2010 +0100
description:
Improved various aspects of the plugin-related extension API.
diffstat:
src/lib-sieve/plugins/enotify/ext-enotify-common.c | 36 +++++++-
src/lib-sieve/plugins/enotify/ext-enotify.c | 2 +-
src/lib-sieve/plugins/enotify/sieve-ext-enotify.h | 5 +-
src/lib-sieve/sieve-extensions.c | 100 ++++++++++++++++++------
src/lib-sieve/sieve-extensions.h | 7 +-
src/lib-sieve/sieve-plugins.c | 11 +-
src/lib-sieve/sieve.c | 4 +-
7 files changed, 125 insertions(+), 40 deletions(-)
diffs (truncated from 394 to 300 lines):
diff -r f5509b2c9ca6 -r a1ebe12c6986 src/lib-sieve/plugins/enotify/ext-enotify-common.c
--- a/src/lib-sieve/plugins/enotify/ext-enotify-common.c Tue Jan 12 16:55:12 2010 +0100
+++ b/src/lib-sieve/plugins/enotify/ext-enotify-common.c Wed Jan 13 09:02:53 2010 +0100
@@ -66,9 +66,11 @@
const struct sieve_enotify_method_def *nmth_def)
{
struct sieve_enotify_method *nmth;
+ int nmth_id = (int) array_count(&ectx->notify_methods);
nmth = array_append_space(&ectx->notify_methods);
nmth->def = nmth_def;
+ nmth->id = nmth_id;
nmth->svinst = svinst;
if ( nmth_def->load != NULL )
@@ -116,6 +118,27 @@
return NULL;
}
+void sieve_enotify_method_unregister
+(const struct sieve_enotify_method *nmth)
+{
+ struct sieve_instance *svinst = nmth->svinst;
+ const struct sieve_extension *ntfy_ext =
+ sieve_extension_get_by_name(svinst, "enotify");
+
+ if ( ntfy_ext != NULL ) {
+ struct ext_enotify_context *ectx =
+ (struct ext_enotify_context *) ntfy_ext->context;
+ int nmth_id = nmth->id;
+
+ if ( nmth_id >= 0 && nmth_id < (int)array_count(&ectx->notify_methods) ) {
+ struct sieve_enotify_method *nmth_mod =
+ array_idx_modifiable(&ectx->notify_methods, nmth_id);
+
+ nmth_mod->def = NULL;
+ }
+ }
+}
+
const struct sieve_enotify_method *ext_enotify_method_find
(const struct sieve_extension *ntfy_ext, const char *identifier)
{
@@ -147,13 +170,14 @@
string_t *result = t_str_new(128);
methods = array_get(&ectx->notify_methods, &meth_count);
-
+
if ( meth_count > 0 ) {
- str_append(result, methods[0].def->identifier);
-
- for ( i = 1; i < meth_count; i++ ) {
- str_append_c(result, ' ');
- str_append(result, methods[i].def->identifier);
+ for ( i = 0; i < meth_count; i++ ) {
+ if ( str_len(result) > 0 )
+ str_append_c(result, ' ');
+
+ if ( methods[i].def != NULL )
+ str_append(result, methods[i].def->identifier);
}
return str_c(result);
diff -r f5509b2c9ca6 -r a1ebe12c6986 src/lib-sieve/plugins/enotify/ext-enotify.c
--- a/src/lib-sieve/plugins/enotify/ext-enotify.c Tue Jan 12 16:55:12 2010 +0100
+++ b/src/lib-sieve/plugins/enotify/ext-enotify.c Wed Jan 13 09:02:53 2010 +0100
@@ -71,7 +71,7 @@
ext_enotify_methods_init(ext->svinst, ectx);
- sieve_extension_capabilities_register(ext->svinst, ext, ¬ify_capabilities);
+ sieve_extension_capabilities_register(ext, ¬ify_capabilities);
return TRUE;
}
diff -r f5509b2c9ca6 -r a1ebe12c6986 src/lib-sieve/plugins/enotify/sieve-ext-enotify.h
--- a/src/lib-sieve/plugins/enotify/sieve-ext-enotify.h Tue Jan 12 16:55:12 2010 +0100
+++ b/src/lib-sieve/plugins/enotify/sieve-ext-enotify.h Wed Jan 13 09:02:53 2010 +0100
@@ -84,6 +84,7 @@
struct sieve_enotify_method {
const struct sieve_enotify_method_def *def;
+ int id;
struct sieve_instance *svinst;
void *context;
@@ -91,7 +92,9 @@
const struct sieve_enotify_method *sieve_enotify_method_register
(struct sieve_instance *svinst,
- const struct sieve_enotify_method_def *nmth_def);
+ const struct sieve_enotify_method_def *nmth_def);
+void sieve_enotify_method_unregister
+ (const struct sieve_enotify_method *nmth);
/*
* Notify method environment
diff -r f5509b2c9ca6 -r a1ebe12c6986 src/lib-sieve/sieve-extensions.c
--- a/src/lib-sieve/sieve-extensions.c Tue Jan 12 16:55:12 2010 +0100
+++ b/src/lib-sieve/sieve-extensions.c Wed Jan 13 09:02:53 2010 +0100
@@ -238,6 +238,25 @@
* Extension registry
*/
+static bool _sieve_extension_load(struct sieve_extension *ext)
+{
+ /* Call load handler */
+ if ( ext->def != NULL && ext->def->load != NULL &&
+ !ext->def->load(ext, &ext->context) ) {
+ sieve_sys_error("failed to load '%s' extension support.", ext->def->name);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void _sieve_extension_unload(struct sieve_extension *ext)
+{
+ /* Call unload handler */
+ if ( ext->def != NULL && ext->def->unload != NULL )
+ ext->def->unload(ext);
+}
+
static void sieve_extension_registry_init(struct sieve_instance *svinst)
{
struct sieve_extension_registry *ext_reg = svinst->ext_reg;
@@ -260,8 +279,7 @@
while ( hash_table_iterate(itx, &key, &value) ) {
struct sieve_extension *ext = (struct sieve_extension *) value;
- if ( ext->def != NULL && ext->def->unload != NULL )
- ext->def->unload(ext);
+ _sieve_extension_unload(ext);
}
hash_table_iterate_deinit(&itx);
@@ -269,18 +287,6 @@
hash_table_destroy(&ext_reg->extension_index);
}
-static bool _sieve_extension_load(struct sieve_extension *ext)
-{
- /* Call load handler */
- if ( ext->def != NULL && ext->def->load != NULL &&
- !ext->def->load(ext, &ext->context) ) {
- sieve_sys_error("failed to load '%s' extension support.", ext->def->name);
- return FALSE;
- }
-
- return TRUE;
-}
-
bool sieve_extension_reload(const struct sieve_extension *ext)
{
struct sieve_extension_registry *ext_reg = ext->svinst->ext_reg;
@@ -307,7 +313,7 @@
/* Register extension if it is not registered already */
if ( ext == NULL ) {
- int ext_id = array_count(&ext_reg->extensions);
+ int ext_id = (int)array_count(&ext_reg->extensions);
/* Add extension to the registry */
@@ -318,6 +324,12 @@
hash_table_insert
(ext_reg->extension_index, (void *) extdef->name, (void *) ext);
+
+ /* Re-register it if it were previously unregistered
+ * (not going to happen)
+ */
+ } else if ( ext->def == NULL ) {
+ ext->def = extdef;
}
/* Enable extension */
@@ -345,10 +357,26 @@
return _sieve_extension_register(svinst, extdef, load, FALSE);
}
+void sieve_extension_unregister(const struct sieve_extension *ext)
+{
+ struct sieve_extension_registry *ext_reg = ext->svinst->ext_reg;
+ struct sieve_extension *mod_ext;
+ int ext_id = ext->id;
+
+ if ( ext_id > 0 && ext_id < (int) array_count(&ext_reg->extensions) ) {
+ mod_ext = array_idx_modifiable(&ext_reg->extensions, ext_id);
+
+ sieve_extension_capabilities_unregister(ext);
+ _sieve_extension_unload(mod_ext);
+ mod_ext->loaded = FALSE;
+ mod_ext->def = NULL;
+ }
+}
+
const struct sieve_extension *sieve_extension_require
(struct sieve_instance *svinst, const struct sieve_extension_def *extdef)
{
- return _sieve_extension_register(svinst, extdef, TRUE, TRUE);
+ return _sieve_extension_register(svinst, extdef, TRUE, TRUE);
}
int sieve_extensions_get_count(struct sieve_instance *svinst)
@@ -367,7 +395,7 @@
if ( ext_id < array_count(&ext_reg->extensions) ) {
ext = array_idx(&ext_reg->extensions, ext_id);
- if ( ext->enabled )
+ if ( ext->def != NULL && ext->enabled )
return ext;
}
@@ -386,7 +414,7 @@
ext = (const struct sieve_extension *)
hash_table_lookup(ext_reg->extension_index, name);
- if ( ext == NULL || !ext->enabled )
+ if ( ext == NULL || ext->def == NULL || !ext->enabled )
return NULL;
return ext;
@@ -406,7 +434,8 @@
/* Find first listable extension */
while ( i < ext_count &&
- !( exts[i].enabled && *(exts[i].def->name) != '@' ) )
+ !( exts[i].enabled && exts[i].def != NULL &&
+ *(exts[i].def->name) != '@' ) )
i++;
if ( i < ext_count ) {
@@ -416,7 +445,8 @@
/* Add others */
for ( ; i < ext_count; i++ ) {
- if ( exts[i].enabled && *(exts[i].def->name) != '@' ) {
+ if ( exts[i].enabled && exts[i].def != NULL &&
+ *(exts[i].def->name) != '@' ) {
str_append_c(extstr, ' ');
str_append(extstr, exts[i].def->name);
}
@@ -493,7 +523,7 @@
ext = (const struct sieve_extension *)
hash_table_lookup(ext_reg->extension_index, name);
- if ( ext == NULL ) {
+ if ( ext == NULL || ext->def == NULL ) {
sieve_sys_warning(
"ignored unknown extension '%s' while configuring "
"available extensions", name);
@@ -550,7 +580,8 @@
/* Perform actual activation/deactivation */
- if ( exts[i].id >= 0 && *(exts[i].def->name) != '@' ) {
+ if ( exts[i].id >= 0 && exts[i].def != NULL &&
+ *(exts[i].def->name) != '@' ) {
if ( disabled && !exts[i].required )
sieve_extension_disable(&exts[i]);
else
@@ -605,9 +636,10 @@
}
void sieve_extension_capabilities_register
-(struct sieve_instance *svinst, const struct sieve_extension *ext,
+(const struct sieve_extension *ext,
const struct sieve_extension_capabilities *cap)
-{
+{
+ struct sieve_instance *svinst = ext->svinst;
struct sieve_extension_registry *ext_reg = svinst->ext_reg;
struct sieve_capability_registration *reg =
p_new(svinst->pool, struct sieve_capability_registration, 1);
@@ -619,11 +651,29 @@
(ext_reg->capabilities_index, (void *) cap->name, (void *) reg);
}
+void sieve_extension_capabilities_unregister
+(const struct sieve_extension *ext)
+{
+ struct sieve_extension_registry *ext_reg = ext->svinst->ext_reg;
+ struct hash_iterate_context *hictx;
+ void *key = NULL, *value = NULL;
+
+ hictx = hash_table_iterate_init(ext_reg->capabilities_index);
+ while ( hash_table_iterate(hictx, key, value) ) {
+ struct sieve_capability_registration *reg =
+ (struct sieve_capability_registration *) value;
+
+ if ( reg->ext == ext )
+ hash_table_remove(ext_reg->capabilities_index, key);
+ }
+ hash_table_iterate_deinit(&hictx);
+}
+
const char *sieve_extension_capabilities_get_string
(struct sieve_instance *svinst, const char *cap_name)
More information about the dovecot-cvs
mailing list