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, &notify_capabilities);
+	sieve_extension_capabilities_register(ext, &notify_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