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;
*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;
+}
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);
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
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 *