Mercurial > dovecot > core-2.2
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 *