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