static int mailimap_enable_parse(mailstream * fd, MMAPString * buffer, size_t * indx, struct mailimap_capability_data ** result, size_t progr_rate, progress_function * progr_fun) { size_t cur_token; int r; int res; struct mailimap_capability_data * capabilities; clist * cap_list; cur_token = * indx; r = mailimap_token_case_insensitive_parse(fd, buffer, &cur_token, "ENABLED"); if (r != MAILIMAP_NO_ERROR) { res = r; goto err; } r = mailimap_capability_list_parse(fd, buffer, &cur_token, &cap_list, progr_rate, progr_fun); if (r == MAILIMAP_ERROR_PARSE) { cap_list = clist_new(); if (cap_list == NULL) { res = MAILIMAP_ERROR_MEMORY; goto err; } r = MAILIMAP_NO_ERROR; } if (r != MAILIMAP_NO_ERROR) { res = r; goto err; } capabilities = mailimap_capability_data_new(cap_list); if (capabilities == NULL) { res = MAILIMAP_ERROR_MEMORY; goto free_list; } * result = capabilities; * indx = cur_token; return MAILIMAP_NO_ERROR; free_list: if (cap_list) { clist_foreach(cap_list, (clist_func) mailimap_capability_free, NULL); clist_free(cap_list); } err: return res; }
LIBETPAN_EXPORT int mailimap_enable(mailimap * session, struct mailimap_capability_data * capabilities, struct mailimap_capability_data ** result) { struct mailimap_response * response; int r; int error_code; clistiter * cur; struct mailimap_capability_data * cap_data; if (session->imap_state != MAILIMAP_STATE_AUTHENTICATED) return MAILIMAP_ERROR_BAD_STATE; r = mailimap_send_current_tag(session); if (r != MAILIMAP_NO_ERROR) return r; r = mailimap_enable_send(session->imap_stream, capabilities); if (r != MAILIMAP_NO_ERROR) return r; r = mailimap_crlf_send(session->imap_stream); if (r != MAILIMAP_NO_ERROR) return r; if (mailstream_flush(session->imap_stream) == -1) return MAILIMAP_ERROR_STREAM; if (mailimap_read_line(session) == NULL) return MAILIMAP_ERROR_STREAM; r = mailimap_parse_response(session, &response); if (r != MAILIMAP_NO_ERROR) return r; cap_data = NULL; for(cur = clist_begin(session->imap_response_info->rsp_extension_list) ; cur != NULL ; cur = clist_next(cur)) { struct mailimap_extension_data * ext_data; ext_data = clist_content(cur); if (ext_data->ext_extension->ext_id != MAILIMAP_EXTENSION_ENABLE) { continue; } if (ext_data->ext_type != MAILIMAP_ENABLE_TYPE_ENABLE) { continue; } if (cap_data != NULL) { mailimap_capability_data_free(cap_data); } cap_data = ext_data->ext_data; ext_data->ext_data = NULL; break; } if (cap_data == NULL) { clist * list; list = clist_new(); if (list == NULL) { return MAILIMAP_ERROR_MEMORY; } cap_data = mailimap_capability_data_new(list); if (cap_data == NULL) { clist_free(list); return MAILIMAP_ERROR_MEMORY; } } error_code = response->rsp_resp_done->rsp_data.rsp_tagged->rsp_cond_state->rsp_type; mailimap_response_free(response); switch (error_code) { case MAILIMAP_RESP_COND_STATE_OK: * result = cap_data; return MAILIMAP_NO_ERROR; default: mailimap_capability_data_free(cap_data); return MAILIMAP_ERROR_EXTENSION; } }