sieve_session->state = SIEVE_READY;
break;
case SIEVE_SETACTIVE:
- if (response_is_no(msg)) {
- /* error */
+ parse_response((gchar *)msg, &result);
+ if (result.success) {
+ /* clear status possibly set when setting another
+ * script active. TODO: give textual feedback */
+ sieve_error(sieve_session, "");
+
command_cb(sieve_session->current_cmd, NULL);
- } else if (response_is_ok(msg)) {
- command_cb(sieve_session->current_cmd, (void*)TRUE);
+ } else if (result.description) {
+ command_cb(sieve_session->current_cmd,
+ result.description);
} else {
log_warning(LOG_PROTOCOL, _("error occurred on SIEVE session\n"));
}
- sieve_session->state = SIEVE_READY;
+ if (result.has_octets) {
+ sieve_session->octets_remaining = result.octets;
+ sieve_session->state = SIEVE_SETACTIVE_DATA;
+ } else {
+ sieve_session->state = SIEVE_READY;
+ }
+ break;
+ case SIEVE_SETACTIVE_DATA:
+ /* Dovecot shows a script's warnings when making it active */
+ sieve_session->octets_remaining -= strlen(msg) + 1;
+ if (sieve_session->octets_remaining > 0) {
+ /* TODO: buffer multi-line message */
+ sieve_error(sieve_session, msg);
+ } else {
+ sieve_session->state = SIEVE_READY;
+ }
break;
case SIEVE_GETSCRIPT:
if (response_is_no(msg)) {
}
static void filter_activated(SieveSession *session, gboolean abort,
- gboolean success, CommandDataName *cmd_data)
+ const gchar *err, CommandDataName *cmd_data)
{
SieveManagerPage *page = cmd_data->page;
GSList *cur;
if (abort) {
- } else if (!success) {
- got_session_error(session, "Unable to set active script", page);
+ } else if (err) {
+ got_session_error(session, err, page);
} else {
manager_sessions_foreach(cur, session, page) {
filter_set_active(page, cmd_data->filter_name);