From 169a3649cc3b73a35b6bf362f72d2e96f53d08fc Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Thu, 29 Nov 2007 00:35:22 +0100
Subject: [PATCH] Defined side-effect object for the copy extension.

---
 src/lib-sieve/plugins/copy/ext-copy.c         | 44 +++++++++++++++++--
 .../plugins/imapflags/ext-imapflags.c         |  4 +-
 src/lib-sieve/sieve-actions.c                 |  3 +-
 src/lib-sieve/sieve-actions.h                 |  3 +-
 4 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/src/lib-sieve/plugins/copy/ext-copy.c b/src/lib-sieve/plugins/copy/ext-copy.c
index ad4f7ddc4..a0a549402 100644
--- a/src/lib-sieve/plugins/copy/ext-copy.c
+++ b/src/lib-sieve/plugins/copy/ext-copy.c
@@ -14,6 +14,7 @@
 
 #include "sieve-code.h"
 #include "sieve-extensions.h"
+#include "sieve-actions.h"
 #include "sieve-commands.h"
 #include "sieve-validator.h"
 #include "sieve-generator.h"
@@ -44,6 +45,25 @@ static bool ext_copy_load(int ext_id)
 	return TRUE;
 }
 
+/* Side effect */
+
+const struct sieve_side_effect_extension ext_copy_side_effect;
+
+const struct sieve_side_effect copy_side_effect = {
+	"copy",
+	&act_store,
+	
+	&ext_copy_side_effect,
+	0,
+	NULL, NULL, NULL, NULL
+};
+
+const struct sieve_side_effect_extension ext_copy_side_effect = {
+	&copy_extension,
+
+	SIEVE_EXT_DEFINE_SIDE_EFFECT(copy_side_effect)
+};
+
 /* Tag validation */
 
 static bool tag_copy_validate
@@ -57,12 +77,30 @@ static bool tag_copy_validate
 	return TRUE;
 }
 
+/* Tag generation */
+
+static bool tag_copy_generate
+(struct sieve_generator *generator, struct sieve_ast_argument *arg,
+    struct sieve_command_context *context ATTR_UNUSED)
+{
+    struct sieve_binary *sbin = sieve_generator_get_binary(generator);
+
+    if ( sieve_ast_argument_type(arg) != SAAT_TAG ) {
+        return FALSE;
+    }
+
+    sieve_opr_side_effect_emit(sbin, &copy_side_effect, ext_my_id);
+
+    return TRUE;
+}
+
 /* Tag */
 
 static const struct sieve_argument copy_tag = { 
 	"copy", NULL, 
 	tag_copy_validate, 
-	NULL, NULL 
+	NULL,
+	tag_copy_generate
 };
 
 /* Load extension into validator */
@@ -72,8 +110,8 @@ static bool ext_copy_validator_load(struct sieve_validator *validator)
 	 * whether these commands are registered or even whether they will be
 	 * registered at all. The validator handles either situation gracefully 
 	 */
-	sieve_validator_register_external_tag(validator, &copy_tag, "redirect", 0);
-	sieve_validator_register_external_tag(validator, &copy_tag, "fileinto", 0);
+	sieve_validator_register_external_tag(validator, &copy_tag, "redirect", -1);
+	sieve_validator_register_external_tag(validator, &copy_tag, "fileinto", -1);
 
 	return TRUE;
 }
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags.c b/src/lib-sieve/plugins/imapflags/ext-imapflags.c
index 82be527f9..d08a91f23 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags.c
@@ -89,8 +89,8 @@ static bool ext_imapflags_validator_load
 	 * whether these commands are registered or even whether they will be
 	 * registered at all. The validator handles either situation gracefully 
 	 */
-	sieve_validator_register_external_tag(validator, &tag_flags, "keep", 0);
-	sieve_validator_register_external_tag(validator, &tag_flags, "fileinto", 0);
+	sieve_validator_register_external_tag(validator, &tag_flags, "keep", -1);
+	sieve_validator_register_external_tag(validator, &tag_flags, "fileinto", -1);
 
 	return TRUE;
 }
diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c
index cafa3d18b..41de0063c 100644
--- a/src/lib-sieve/sieve-actions.c
+++ b/src/lib-sieve/sieve-actions.c
@@ -71,7 +71,8 @@ struct sieve_operand side_effect_operand =
 	{ "side-effect", &side_effect_class, FALSE };
 
 void sieve_opr_side_effect_emit
-	(struct sieve_binary *sbin, struct sieve_side_effect *seffect, int ext_id)
+	(struct sieve_binary *sbin, const struct sieve_side_effect *seffect, 
+		int ext_id)
 { 
 	sieve_binary_emit_extension
 		(sbin, seffect, ext_id, 0, SIEVE_OPERAND_SIDE_EFFECT, 
diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h
index b4edd6e55..64cdbd169 100644
--- a/src/lib-sieve/sieve-actions.h
+++ b/src/lib-sieve/sieve-actions.h
@@ -91,7 +91,8 @@ void sieve_side_effect_extension_set
 		const struct sieve_side_effect_extension *ext);
 
 void sieve_opr_side_effect_emit
-	(struct sieve_binary *sbin, struct sieve_side_effect *seffect, int ext_id);
+	(struct sieve_binary *sbin, const struct sieve_side_effect *seffect, 
+		int ext_id);
 
 /* Actions common to multiple commands */
 
-- 
GitLab