# HG changeset patch # User Josef 'Jeff' Sipek # Date 1487167955 18000 # Node ID b1fd9a5366bf77b1f725459280482087d74df47a # Parent 4d4823518e9c0dd6bfa0160c5751665a317ecfd8 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". diff -r 4d4823518e9c -r b1fd9a5366bf src/lib-imap-client/imapc-client-private.h --- 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; diff -r 4d4823518e9c -r b1fd9a5366bf src/lib-imap-client/imapc-client.c --- 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; +} diff -r 4d4823518e9c -r b1fd9a5366bf src/lib-imap-client/imapc-client.h --- 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 diff -r 4d4823518e9c -r b1fd9a5366bf src/lib-imap-client/imapc-connection.c --- 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 *