changeset 21563:b1fd9a5366bf

lib-imap-client: add callback to notify consumers about state changes Add a callback to notify imapc users about failures. Currently, the only failure defined is "authentication failed".
author Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
date Wed, 15 Feb 2017 09:12:35 -0500
parents 4d4823518e9c
children 437d6269a5b1
files src/lib-imap-client/imapc-client-private.h src/lib-imap-client/imapc-client.c src/lib-imap-client/imapc-client.h src/lib-imap-client/imapc-connection.c
diffstat 4 files changed, 32 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-imap-client/imapc-client-private.h	Tue Feb 14 08:58:10 2017 -0500
+++ b/src/lib-imap-client/imapc-client-private.h	Wed Feb 15 09:12:35 2017 -0500
@@ -20,6 +20,9 @@
 	imapc_untagged_callback_t *untagged_callback;
 	void *untagged_context;
 
+	imapc_state_change_callback_t *state_change_callback;
+	void *state_change_context;
+
 	ARRAY(struct imapc_client_connection *) conns;
 
 	struct ioloop *ioloop;
--- a/src/lib-imap-client/imapc-client.c	Tue Feb 14 08:58:10 2017 -0500
+++ b/src/lib-imap-client/imapc-client.c	Wed Feb 15 09:12:35 2017 -0500
@@ -468,3 +468,14 @@
 	*path_r = str_c(path);
 	return fd;
 }
+
+void imapc_client_register_state_change_callback(struct imapc_client *client,
+						 imapc_state_change_callback_t *cb,
+						 void *context)
+{
+	i_assert(client->state_change_callback == NULL);
+	i_assert(client->state_change_context == NULL);
+
+	client->state_change_callback = cb;
+	client->state_change_context = context;
+}
--- a/src/lib-imap-client/imapc-client.h	Tue Feb 14 08:58:10 2017 -0500
+++ b/src/lib-imap-client/imapc-client.h	Wed Feb 15 09:12:35 2017 -0500
@@ -146,12 +146,19 @@
 	void *untagged_box_context;
 };
 
+enum imapc_state_change_event {
+	IMAPC_STATE_CHANGE_AUTH_FAILED,
+};
+
 /* Called when tagged reply is received for command. */
 typedef void imapc_command_callback_t(const struct imapc_command_reply *reply,
 				      void *context);
 /* Called each time untagged input is received. */
 typedef void imapc_untagged_callback_t(const struct imapc_untagged_reply *reply,
 				       void *context);
+typedef void imapc_state_change_callback_t(void *context,
+					   enum imapc_state_change_event event,
+					   const char *error);
 
 struct imapc_client *
 imapc_client_init(const struct imapc_client_settings *set);
@@ -208,4 +215,8 @@
 int imapc_client_create_temp_fd(struct imapc_client *client,
 				const char **path_r);
 
+void imapc_client_register_state_change_callback(struct imapc_client *client,
+						 imapc_state_change_callback_t *cb,
+						 void *context);
+
 #endif
--- a/src/lib-imap-client/imapc-connection.c	Tue Feb 14 08:58:10 2017 -0500
+++ b/src/lib-imap-client/imapc-connection.c	Wed Feb 15 09:12:35 2017 -0500
@@ -146,6 +146,13 @@
 		  const char *error)
 {
 	i_error("imapc(%s): Authentication failed: %s", conn->name, error);
+
+	if (conn->client->state_change_callback == NULL)
+		return;
+
+	conn->client->state_change_callback(conn->client->state_change_context,
+					    IMAPC_STATE_CHANGE_AUTH_FAILED,
+					    error);
 }
 
 struct imapc_connection *