dovecot-2.0: doveadm: Changed mail command handler API.

dovecot at dovecot.org dovecot at dovecot.org
Fri Apr 30 19:15:00 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/f05909834219
changeset: 11247:f05909834219
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Apr 30 19:14:57 2010 +0300
description:
doveadm: Changed mail command handler API.
This should help add some new future features.

diffstat:

 src/doveadm/doveadm-mail-altmove.c |   31 +++++++--
 src/doveadm/doveadm-mail-expunge.c |   37 ++++++++---
 src/doveadm/doveadm-mail-fetch.c   |  104 ++++++++++++++++++++--------------
 src/doveadm/doveadm-mail-list.c    |   52 +++++++++++------
 src/doveadm/doveadm-mail-search.c  |   31 +++++++--
 src/doveadm/doveadm-mail.c         |   95 +++++++++++++++++++++++--------
 src/doveadm/doveadm-mail.h         |   28 ++++++--
 src/plugins/quota/doveadm-quota.c  |   26 ++++++++-
 8 files changed, 281 insertions(+), 123 deletions(-)

diffs (truncated from 822 to 300 lines):

diff -r f195e11fd919 -r f05909834219 src/doveadm/doveadm-mail-altmove.c
--- a/src/doveadm/doveadm-mail-altmove.c	Fri Apr 30 18:01:08 2010 +0300
+++ b/src/doveadm/doveadm-mail-altmove.c	Fri Apr 30 19:14:57 2010 +0300
@@ -9,6 +9,11 @@
 #include "doveadm-mail-iter.h"
 #include "doveadm-mail.h"
 
+struct altmove_cmd_context {
+	struct doveadm_mail_cmd_context ctx;
+	struct mail_search_args *search_args;
+};
+
 static int
 cmd_altmove_box(const struct mailbox_info *info,
 		struct mail_search_args *search_args)
@@ -41,14 +46,15 @@
 	}
 }
 
-void cmd_altmove(struct mail_user *user, const char *const args[])
+static void
+cmd_altmove_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
 {
+	struct altmove_cmd_context *ctx = (struct altmove_cmd_context *)_ctx;
 	const enum mailbox_list_iter_flags iter_flags =
 		MAILBOX_LIST_ITER_RAW_LIST |
 		MAILBOX_LIST_ITER_VIRTUAL_NAMES |
 		MAILBOX_LIST_ITER_NO_AUTO_INBOX |
 		MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
-	struct mail_search_args *search_args;
 	struct doveadm_mail_list_iter *iter;
 	const struct mailbox_info *info;
 	struct mail_namespace *ns, *prev_ns = NULL;
@@ -56,12 +62,8 @@
 	struct mail_storage *const *storages;
 	unsigned int i, count;
 
-	if (args[0] == NULL)
-		doveadm_mail_help_name("altmove");
-	search_args = doveadm_mail_build_search_args(args);
-
 	t_array_init(&purged_storages, 8);
-	iter = doveadm_mail_list_iter_init(user, search_args, iter_flags);
+	iter = doveadm_mail_list_iter_init(user, ctx->search_args, iter_flags);
 	while ((info = doveadm_mail_list_iter_next(iter)) != NULL) T_BEGIN {
 		if (info->ns != prev_ns) {
 			if (prev_ns != NULL) {
@@ -71,7 +73,7 @@
 			}
 			prev_ns = info->ns;
 		}
-		(void)cmd_altmove_box(info, search_args);
+		(void)cmd_altmove_box(info, ctx->search_args);
 	} T_END;
 	doveadm_mail_list_iter_deinit(&iter);
 
@@ -91,3 +93,16 @@
 		}
 	}
 }
+
+struct doveadm_mail_cmd_context *cmd_altmove(const char *const args[])
+{
+	struct altmove_cmd_context *ctx;
+
+	if (args[0] == NULL)
+		doveadm_mail_help_name("altmove");
+
+	ctx = doveadm_mail_cmd_init(struct altmove_cmd_context);
+	ctx->ctx.run = cmd_altmove_run;
+	ctx->search_args = doveadm_mail_build_search_args(args);
+	return &ctx->ctx;
+}
diff -r f195e11fd919 -r f05909834219 src/doveadm/doveadm-mail-expunge.c
--- a/src/doveadm/doveadm-mail-expunge.c	Fri Apr 30 18:01:08 2010 +0300
+++ b/src/doveadm/doveadm-mail-expunge.c	Fri Apr 30 19:14:57 2010 +0300
@@ -9,6 +9,11 @@
 #include "doveadm-mail-iter.h"
 #include "doveadm-mail.h"
 
+struct expunge_cmd_context {
+	struct doveadm_mail_cmd_context ctx;
+	struct mail_search_args *search_args;
+};
+
 static int
 cmd_expunge_box(const struct mailbox_info *info,
 		struct mail_search_args *search_args)
@@ -161,35 +166,45 @@
 	return FALSE;
 }
 
-void cmd_expunge(struct mail_user *user, const char *const args[])
+static void
+cmd_expunge_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
 {
+	struct expunge_cmd_context *ctx = (struct expunge_cmd_context *)_ctx;
 	const enum mailbox_list_iter_flags iter_flags =
 		MAILBOX_LIST_ITER_RAW_LIST |
 		MAILBOX_LIST_ITER_VIRTUAL_NAMES |
 		MAILBOX_LIST_ITER_NO_AUTO_INBOX |
 		MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
-	struct mail_search_args *search_args;
 	struct doveadm_mail_list_iter *iter;
 	const struct mailbox_info *info;
 
-	if (args[0] == NULL)
-		doveadm_mail_help_name("expunge");
-	search_args = doveadm_mail_build_search_args(args);
-	mail_search_args_simplify(search_args);
-
-	if (!expunge_search_args_is_mailbox_ok(search_args->args)) {
+	if (!expunge_search_args_is_mailbox_ok(ctx->search_args->args)) {
 		i_fatal("expunge: To avoid accidents, search query "
 			"must contain MAILBOX in all search branches");
 	}
-	if (!expunge_search_args_is_msgset_ok(search_args->args)) {
+	if (!expunge_search_args_is_msgset_ok(ctx->search_args->args)) {
 		i_fatal("expunge: To avoid accidents, each branch in "
 			"search query must contain something else "
 			"besides MAILBOX");
 	}
 
-	iter = doveadm_mail_list_iter_init(user, search_args, iter_flags);
+	iter = doveadm_mail_list_iter_init(user, ctx->search_args, iter_flags);
 	while ((info = doveadm_mail_list_iter_next(iter)) != NULL) T_BEGIN {
-		(void)cmd_expunge_box(info, search_args);
+		(void)cmd_expunge_box(info, ctx->search_args);
 	} T_END;
 	doveadm_mail_list_iter_deinit(&iter);
 }
+
+struct doveadm_mail_cmd_context *cmd_expunge(const char *const args[])
+{
+	struct expunge_cmd_context *ctx;
+
+	if (args[0] == NULL)
+		doveadm_mail_help_name("expunge");
+
+	ctx = doveadm_mail_cmd_init(struct expunge_cmd_context);
+	ctx->ctx.run = cmd_expunge_run;
+	ctx->search_args = doveadm_mail_build_search_args(args);
+	mail_search_args_simplify(ctx->search_args);
+	return &ctx->ctx;
+}
diff -r f195e11fd919 -r f05909834219 src/doveadm/doveadm-mail-fetch.c
--- a/src/doveadm/doveadm-mail-fetch.c	Fri Apr 30 18:01:08 2010 +0300
+++ b/src/doveadm/doveadm-mail-fetch.c	Fri Apr 30 19:14:57 2010 +0300
@@ -17,7 +17,9 @@
 
 #include <stdio.h>
 
-struct fetch_context {
+struct fetch_cmd_context {
+	struct doveadm_mail_cmd_context ctx;
+
 	struct mail_search_args *search_args;
 	struct ostream *output;
 	struct mail *mail;
@@ -31,7 +33,7 @@
 	bool print_field_prefix;
 };
 
-static int fetch_mailbox(struct fetch_context *ctx)
+static int fetch_mailbox(struct fetch_cmd_context *ctx)
 {
 	const char *value;
 
@@ -41,7 +43,7 @@
 	return 0;
 }
 
-static int fetch_mailbox_guid(struct fetch_context *ctx)
+static int fetch_mailbox_guid(struct fetch_cmd_context *ctx)
 {
 	uint8_t guid[MAIL_GUID_128_SIZE];
 
@@ -51,19 +53,19 @@
 	return 0;
 }
 
-static int fetch_seq(struct fetch_context *ctx)
+static int fetch_seq(struct fetch_cmd_context *ctx)
 {
 	str_printfa(ctx->hdr, "%u", ctx->mail->seq);
 	return 0;
 }
 
-static int fetch_uid(struct fetch_context *ctx)
+static int fetch_uid(struct fetch_cmd_context *ctx)
 {
 	str_printfa(ctx->hdr, "%u", ctx->mail->seq);
 	return 0;
 }
 
-static int fetch_guid(struct fetch_context *ctx)
+static int fetch_guid(struct fetch_cmd_context *ctx)
 {
 	const char *value;
 
@@ -73,20 +75,20 @@
 	return 0;
 }
 
-static int fetch_flags(struct fetch_context *ctx)
+static int fetch_flags(struct fetch_cmd_context *ctx)
 {
 	imap_write_flags(ctx->hdr, mail_get_flags(ctx->mail),
 			 mail_get_keywords(ctx->mail));
 	return 0;
 }
 
-static void flush_hdr(struct fetch_context *ctx)
+static void flush_hdr(struct fetch_cmd_context *ctx)
 {
 	o_stream_send(ctx->output, str_data(ctx->hdr), str_len(ctx->hdr));
 	str_truncate(ctx->hdr, 0);
 }
 
-static int fetch_hdr(struct fetch_context *ctx)
+static int fetch_hdr(struct fetch_cmd_context *ctx)
 {
 	struct istream *input;
 	struct message_size hdr_size;
@@ -112,7 +114,7 @@
 	return ret;
 }
 
-static int fetch_body(struct fetch_context *ctx)
+static int fetch_body(struct fetch_cmd_context *ctx)
 {
 	struct istream *input;
 	struct message_size hdr_size;
@@ -137,7 +139,7 @@
 	return ret;
 }
 
-static int fetch_text(struct fetch_context *ctx)
+static int fetch_text(struct fetch_cmd_context *ctx)
 {
 	struct istream *input;
 	int ret = 0;
@@ -160,7 +162,7 @@
 	return ret;
 }
 
-static int fetch_size_physical(struct fetch_context *ctx)
+static int fetch_size_physical(struct fetch_cmd_context *ctx)
 {
 	uoff_t size;
 
@@ -170,7 +172,7 @@
 	return 0;
 }
 
-static int fetch_size_virtual(struct fetch_context *ctx)
+static int fetch_size_virtual(struct fetch_cmd_context *ctx)
 {
 	uoff_t size;
 
@@ -180,7 +182,7 @@
 	return 0;
 }
 
-static int fetch_date_received(struct fetch_context *ctx)
+static int fetch_date_received(struct fetch_cmd_context *ctx)
 {
 	time_t t;
 
@@ -190,7 +192,7 @@
 	return 0;
 }
 
-static int fetch_date_sent(struct fetch_context *ctx)
+static int fetch_date_sent(struct fetch_cmd_context *ctx)
 {
 	time_t t;
 	int tz;
@@ -206,7 +208,7 @@
 	return 0;
 }
 
-static int fetch_date_saved(struct fetch_context *ctx)
+static int fetch_date_saved(struct fetch_cmd_context *ctx)
 {
 	time_t t;
 
@@ -219,7 +221,7 @@
 struct fetch_field {
 	const char *name;
 	enum mail_fetch_field wanted_fields;
-	int (*print)(struct fetch_context *ctx);
+	int (*print)(struct fetch_cmd_context *ctx);
 };
 
 static const struct fetch_field fetch_fields[] = {
@@ -261,7 +263,7 @@
 	fprintf(stderr, "\n");
 }
 


More information about the dovecot-cvs mailing list