dovecot-2.1: imapc: Command sending API changed to be more exten...

dovecot at dovecot.org dovecot at dovecot.org
Fri Oct 7 20:01:54 EEST 2011


details:   http://hg.dovecot.org/dovecot-2.1/rev/e0a339d677cb
changeset: 13613:e0a339d677cb
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Oct 07 20:10:11 2011 +0300
description:
imapc: Command sending API changed to be more extensible.

diffstat:

 src/lib-imap-client/imapc-client-private.h     |    3 +
 src/lib-imap-client/imapc-client.c             |  128 ++++------------------
 src/lib-imap-client/imapc-client.h             |   21 +-
 src/lib-imap-client/imapc-connection.c         |  142 ++++++++++++++----------
 src/lib-imap-client/imapc-connection.h         |   14 +-
 src/lib-storage/index/imapc/imapc-list.c       |   48 ++++---
 src/lib-storage/index/imapc/imapc-mail-fetch.c |    7 +-
 src/lib-storage/index/imapc/imapc-mail.c       |    6 +-
 src/lib-storage/index/imapc/imapc-save.c       |   17 +-
 src/lib-storage/index/imapc/imapc-storage.c    |   31 +++-
 src/lib-storage/index/imapc/imapc-sync.c       |   17 +-
 11 files changed, 200 insertions(+), 234 deletions(-)

diffs (truncated from 929 to 300 lines):

diff -r 21566f1780ef -r e0a339d677cb src/lib-imap-client/imapc-client-private.h
--- a/src/lib-imap-client/imapc-client-private.h	Fri Oct 07 19:25:52 2011 +0300
+++ b/src/lib-imap-client/imapc-client-private.h	Fri Oct 07 20:10:11 2011 +0300
@@ -37,4 +37,7 @@
 void imapc_client_ref(struct imapc_client *client);
 void imapc_client_unref(struct imapc_client **client);
 
+void imapc_command_set_mailbox(struct imapc_command *cmd,
+			       struct imapc_client_mailbox *box);
+
 #endif
diff -r 21566f1780ef -r e0a339d677cb src/lib-imap-client/imapc-client.c
--- a/src/lib-imap-client/imapc-client.c	Fri Oct 07 19:25:52 2011 +0300
+++ b/src/lib-imap-client/imapc-client.c	Fri Oct 07 20:10:11 2011 +0300
@@ -12,13 +12,6 @@
 
 #include <unistd.h>
 
-struct imapc_client_command_context {
-	struct imapc_client_mailbox *box;
-
-	imapc_command_callback_t *callback;
-	void *context;
-};
-
 const struct imapc_capability_name imapc_capability_names[] = {
 	{ "SASL-IR", IMAPC_CAPABILITY_SASL_IR },
 	{ "LITERAL+", IMAPC_CAPABILITY_LITERALPLUS },
@@ -203,18 +196,14 @@
 	return (*connp)->conn;
 }
 
-void imapc_client_cmdf(struct imapc_client *client,
-		       imapc_command_callback_t *callback, void *context,
-		       const char *cmd_fmt, ...)
+struct imapc_command *
+imapc_client_cmd(struct imapc_client *client,
+		 imapc_command_callback_t *callback, void *context)
 {
 	struct imapc_connection *conn;
-	va_list args;
 
 	conn = imapc_client_find_connection(client);
-
-	va_start(args, cmd_fmt);
-	imapc_connection_cmdvf(conn, FALSE, callback, context, cmd_fmt, args);
-	va_end(args);
+	return imapc_connection_cmd(conn, callback, context);
 }
 
 static struct imapc_client_connection *
@@ -292,93 +281,15 @@
 	*_box = NULL;
 }
 
-static void imapc_client_mailbox_cmd_cb(const struct imapc_command_reply *reply,
-					void *context)
+struct imapc_command *
+imapc_client_mailbox_cmd(struct imapc_client_mailbox *box,
+			 imapc_command_callback_t *callback, void *context)
 {
-	struct imapc_client_command_context *ctx = context;
+	struct imapc_command *cmd;
 
-	ctx->box->pending_box_command_count--;
-
-	ctx->callback(reply, ctx->context);
-	i_free(ctx);
-}
-
-static struct imapc_client_command_context *
-imapc_client_mailbox_cmd_common(struct imapc_client_mailbox *box,
-				imapc_command_callback_t *callback,
-				void *context)
-{
-	struct imapc_client_command_context *ctx;
-
-	ctx = i_new(struct imapc_client_command_context, 1);
-	ctx->box = box;
-	ctx->callback = callback;
-	ctx->context = context;
-
-	box->pending_box_command_count++;
-	return ctx;
-}
-
-static bool
-imapc_client_mailbox_is_selected(struct imapc_client_mailbox *box,
-				 struct imapc_command_reply *reply_r)
-{
-	struct imapc_client_mailbox *selected_box;
-
-	selected_box = box->conn == NULL ? NULL :
-		imapc_connection_get_mailbox(box->conn);
-	if (selected_box == box)
-		return TRUE;
-
-	memset(reply_r, 0, sizeof(*reply_r));
-	reply_r->state = IMAPC_COMMAND_STATE_DISCONNECTED;
-	if (selected_box == NULL) {
-		reply_r->text_full = "Disconnected from server";
-	} else {
-		i_error("imapc: Selected mailbox changed unexpectedly");
-		reply_r->text_full = "Internal error";
-	}
-	reply_r->text_without_resp = reply_r->text_full;
-
-	box->conn = NULL;
-	return FALSE;
-}
-
-void imapc_client_mailbox_cmd(struct imapc_client_mailbox *box,
-			      imapc_command_callback_t *callback,
-			      void *context, const char *cmd)
-{
-	struct imapc_client_command_context *ctx;
-	struct imapc_command_reply reply;
-
-	if (!imapc_client_mailbox_is_selected(box, &reply)) {
-		callback(&reply, context);
-		return;
-	}
-
-	ctx = imapc_client_mailbox_cmd_common(box, callback, context);
-	imapc_connection_cmd(box->conn, TRUE, cmd,
-			     imapc_client_mailbox_cmd_cb, ctx);
-}
-
-void imapc_client_mailbox_cmdf(struct imapc_client_mailbox *box,
-			       imapc_command_callback_t *callback,
-			       void *context, const char *cmd_fmt, ...)
-{
-	struct imapc_client_command_context *ctx;
-	va_list args;
-	struct imapc_command_reply reply;
-
-	if (!imapc_client_mailbox_is_selected(box, &reply)) {
-		callback(&reply, context);
-		return;
-	}
-
-	ctx = imapc_client_mailbox_cmd_common(box, callback, context);
-	va_start(args, cmd_fmt);
-	imapc_connection_cmdvf(box->conn, TRUE, imapc_client_mailbox_cmd_cb,
-			       ctx, cmd_fmt, args);
-	va_end(args);
+	cmd = imapc_connection_cmd(box->conn, callback, context);
+	imapc_command_set_mailbox(cmd, box);
+	return cmd;
 }
 
 struct imapc_msgmap *
@@ -389,17 +300,24 @@
 
 void imapc_client_mailbox_idle(struct imapc_client_mailbox *box)
 {
-	struct imapc_command_reply reply;
-
-	if (imapc_client_mailbox_is_selected(box, &reply))
+	if (imapc_client_mailbox_is_connected(box))
 		imapc_connection_idle(box->conn);
 }
 
 bool imapc_client_mailbox_is_connected(struct imapc_client_mailbox *box)
 {
-	struct imapc_command_reply reply;
+	struct imapc_client_mailbox *selected_box;
 
-	return imapc_client_mailbox_is_selected(box, &reply);
+	selected_box = box->conn == NULL ? NULL :
+		imapc_connection_get_mailbox(box->conn);
+	if (selected_box == box)
+		return TRUE;
+
+	if (selected_box != NULL)
+		i_error("imapc: Selected mailbox changed unexpectedly");
+
+	box->conn = NULL;
+	return FALSE;
 }
 
 enum imapc_capability
diff -r 21566f1780ef -r e0a339d677cb src/lib-imap-client/imapc-client.h
--- a/src/lib-imap-client/imapc-client.h	Fri Oct 07 19:25:52 2011 +0300
+++ b/src/lib-imap-client/imapc-client.h	Fri Oct 07 20:10:11 2011 +0300
@@ -109,9 +109,14 @@
 void imapc_client_login(struct imapc_client *client,
 			imapc_command_callback_t *callback, void *context);
 
-void imapc_client_cmdf(struct imapc_client *client,
-		       imapc_command_callback_t *callback, void *context,
-		       const char *cmd_fmt, ...) ATTR_FORMAT(4, 5);
+struct imapc_command *
+imapc_client_cmd(struct imapc_client *client,
+		 imapc_command_callback_t *callback, void *context);
+void imapc_command_send(struct imapc_command *cmd, const char *cmd_str);
+void imapc_command_sendf(struct imapc_command *cmd, const char *cmd_fmt, ...)
+	ATTR_FORMAT(2, 3);
+void imapc_command_sendvf(struct imapc_command *cmd,
+			  const char *cmd_fmt, va_list args) ATTR_FORMAT(2, 0);
 
 void imapc_client_register_untagged(struct imapc_client *client,
 				    imapc_untagged_callback_t *callback,
@@ -132,13 +137,9 @@
 			  void *untagged_box_context);
 void imapc_client_mailbox_close(struct imapc_client_mailbox **box);
 void imapc_client_mailbox_disconnect(struct imapc_client_mailbox *box);
-void imapc_client_mailbox_cmd(struct imapc_client_mailbox *box,
-			      imapc_command_callback_t *callback,
-			      void *context, const char *cmd);
-void imapc_client_mailbox_cmdf(struct imapc_client_mailbox *box,
-			       imapc_command_callback_t *callback,
-			       void *context, const char *cmd_fmt, ...)
-	ATTR_FORMAT(4, 5);
+struct imapc_command *
+imapc_client_mailbox_cmd(struct imapc_client_mailbox *box,
+			 imapc_command_callback_t *callback, void *context);
 struct imapc_msgmap *
 imapc_client_mailbox_get_msgmap(struct imapc_client_mailbox *box);
 
diff -r 21566f1780ef -r e0a339d677cb src/lib-imap-client/imapc-connection.c
--- a/src/lib-imap-client/imapc-connection.c	Fri Oct 07 19:25:52 2011 +0300
+++ b/src/lib-imap-client/imapc-connection.c	Fri Oct 07 20:10:11 2011 +0300
@@ -47,13 +47,19 @@
 	unsigned int send_pos;
 	unsigned int tag;
 
+	struct imapc_connection *conn;
+	/* If non-NULL, points to the mailbox where this command should be
+	   executed */
+	struct imapc_client_mailbox *box;
+
 	ARRAY_DEFINE(streams, struct imapc_command_stream);
 
 	imapc_command_callback_t *callback;
 	void *context;
 
+	/* This is the IDLE command */
 	unsigned int idle:1;
-	unsigned int mailboxcmd:1;
+	/* Waiting for '+' literal reply before we can continue */
 	unsigned int wait_for_literal:1;
 };
 
@@ -657,7 +663,7 @@
 static void imapc_connection_authenticate(struct imapc_connection *conn)
 {
 	const struct imapc_client_settings *set = &conn->client->set;
-	const char *cmd;
+	struct imapc_command *cmd;
 
 	if (conn->client->set.debug) {
 		if (set->master_user == NULL) {
@@ -669,23 +675,21 @@
 		}
 	}
 
+	cmd = imapc_connection_cmd(conn, imapc_connection_login_cb,
+				   conn);
+
 	if ((set->master_user == NULL &&
 	     need_literal(set->username) && need_literal(set->password)) ||
 	    (conn->capabilities & IMAPC_CAPABILITY_AUTH_PLAIN) == 0) {
 		/* We can use LOGIN command */
-		imapc_connection_cmdf(conn, FALSE, imapc_connection_login_cb,
-				      conn, "LOGIN %s %s",
-				      set->username, set->password);
+		imapc_command_sendf(cmd, "LOGIN %s %s",
+				    set->username, set->password);
 	} else if ((conn->capabilities & IMAPC_CAPABILITY_SASL_IR) != 0) {
-		cmd = t_strdup_printf("AUTHENTICATE PLAIN %s",
+		imapc_command_sendf(cmd, "AUTHENTICATE PLAIN %1s",
 			imapc_connection_get_sasl_plain_request(conn));
-		imapc_connection_cmd(conn, FALSE, cmd,
-				     imapc_connection_login_cb, conn);
 	} else {
-		cmd = t_strdup_printf("AUTHENTICATE PLAIN\r\n%s",
+		imapc_command_sendf(cmd, "AUTHENTICATE PLAIN\r\n%1s",
 			imapc_connection_get_sasl_plain_request(conn));
-		imapc_connection_cmd(conn, FALSE, cmd,
-				     imapc_connection_login_cb, conn);
 	}
 }
 
@@ -709,6 +713,8 @@
 
 static void imapc_connection_starttls(struct imapc_connection *conn)
 {
+	struct imapc_command *cmd;
+
 	if (conn->client->set.ssl_mode == IMAPC_CLIENT_SSL_MODE_STARTTLS &&
 	    conn->ssl_iostream == NULL) {
 		if ((conn->capabilities & IMAPC_CAPABILITY_STARTTLS) == 0) {
@@ -718,8 +724,9 @@
 			imapc_connection_disconnect(conn);
 			return;
 		}
-		imapc_connection_cmd(conn, FALSE, "STARTTLS",
-				     imapc_connection_starttls_cb, conn);
+		cmd = imapc_connection_cmd(conn, imapc_connection_starttls_cb,


More information about the dovecot-cvs mailing list