int mailimap_fetch_envelope(mailimap * session, uint32_t first, uint32_t last, clist ** result) { int r; clist * fetch_list; struct mailimap_fetch_att * fetch_att; struct mailimap_fetch_type * fetch_type; struct mailimap_set * set; fetch_att = mailimap_fetch_att_new_envelope(); fetch_type = mailimap_fetch_type_new_fetch_att(fetch_att); set = mailimap_set_new_interval(first, last); r = mailimap_fetch(session, set, fetch_type, &fetch_list); mailimap_set_free(set); mailimap_fetch_type_free(fetch_type); if (r != MAILIMAP_NO_ERROR) return r; * result = fetch_list; return MAILIMAP_NO_ERROR; }
int mailimap_fetch_rfc822(mailimap * session, uint32_t msgid, char ** result) { int r; clist * fetch_list; struct mailimap_fetch_att * fetch_att; struct mailimap_fetch_type * fetch_type; struct mailimap_set * set; struct mailimap_msg_att * msg_att; struct mailimap_msg_att_item * item; int res; fetch_att = mailimap_fetch_att_new_rfc822(); fetch_type = mailimap_fetch_type_new_fetch_att(fetch_att); set = mailimap_set_new_single(msgid); r = mailimap_fetch(session, set, fetch_type, &fetch_list); mailimap_set_free(set); mailimap_fetch_type_free(fetch_type); if (r != MAILIMAP_NO_ERROR) { res = r; goto err; } if (clist_isempty(fetch_list)) { res = MAILIMAP_ERROR_FETCH; goto free; } msg_att = (struct mailimap_msg_att *) clist_begin(fetch_list)->data; if (clist_isempty(msg_att->att_list)) { res = MAILIMAP_ERROR_FETCH; goto free; } item = (struct mailimap_msg_att_item *) clist_begin(msg_att->att_list)->data; if (item->att_type != MAILIMAP_MSG_ATT_ITEM_STATIC) { res = MAILIMAP_ERROR_FETCH; goto free; } if (item->att_data.att_static->att_type != MAILIMAP_MSG_ATT_RFC822) { res = MAILIMAP_ERROR_FETCH; goto free; } * result = item->att_data.att_static->att_data.att_rfc822.att_content; item->att_data.att_static->att_data.att_rfc822.att_content = NULL; mailimap_fetch_list_free(fetch_list); return MAILIMAP_NO_ERROR; free: mailimap_fetch_list_free(fetch_list); err: return res; }
static int imap_fetch_section_body(mailmessage * msg_info, struct mailmime * mime, char ** result, size_t * result_len) { struct mailimap_section * section; struct mailimap_fetch_att * fetch_att; int r; struct mailimap_fetch_type * fetch_type; char * text; size_t text_length; struct mailmime_section * part; if (mime->mm_parent == NULL) return imap_fetch_body(msg_info, result, result_len); if (mime->mm_parent->mm_parent == NULL) return imap_fetch_body(msg_info, result, result_len); r = mailmime_get_section_id(mime, &part); if (r != MAILIMF_NO_ERROR) return maildriver_imf_error_to_mail_error(r); r = imap_section_to_imap_section(part, IMAP_SECTION_BODY, §ion); mailmime_section_free(part); if (r != MAIL_NO_ERROR) return MAIL_ERROR_MEMORY; fetch_att = mailimap_fetch_att_new_body_peek_section(section); if (fetch_att == NULL) { mailimap_section_free(section); return MAIL_ERROR_MEMORY; } fetch_type = mailimap_fetch_type_new_fetch_att(fetch_att); if (fetch_type == NULL) { mailimap_fetch_att_free(fetch_att); return MAIL_ERROR_MEMORY; } text = NULL; text_length = 0; r = fetch_imap(msg_info, fetch_type, &text, &text_length); mailimap_fetch_type_free(fetch_type); if (r != MAIL_NO_ERROR) return r; * result = text; * result_len = text_length; return MAIL_NO_ERROR; }
static int imap_fetch_size(mailmessage * msg_info, size_t * result) { int r; struct mailimap_set * set; struct mailimap_fetch_att * fetch_att; struct mailimap_fetch_type * fetch_type; clist * fetch_result; struct mailimap_msg_att * msg_att; struct mailimap_msg_att_item * msg_att_item; size_t size; int res; clistiter * cur; set = mailimap_set_new_single(msg_info->msg_index); if (set == NULL) { res = MAIL_ERROR_MEMORY; goto err; } fetch_att = mailimap_fetch_att_new_rfc822_size(); if (fetch_att == NULL) { res = MAIL_ERROR_MEMORY; goto free_set; } fetch_type = mailimap_fetch_type_new_fetch_att(fetch_att); if (fetch_type == NULL) { res = MAIL_ERROR_MEMORY; goto free_fetch_att; } r = mailimap_uid_fetch(get_imap_session(msg_info), set, fetch_type, &fetch_result); mailimap_fetch_type_free(fetch_type); mailimap_set_free(set); switch (r) { case MAILIMAP_ERROR_BAD_STATE: return MAIL_ERROR_BAD_STATE; case MAILIMAP_ERROR_STREAM: return MAIL_ERROR_STREAM; case MAILIMAP_NO_ERROR: break; default: return MAIL_ERROR_FETCH; } if (clist_begin(fetch_result) == NULL) { mailimap_fetch_list_free(fetch_result); return MAIL_ERROR_FETCH; } msg_att = clist_begin(fetch_result)->data; for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { msg_att_item = clist_content(cur); if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_RFC822_SIZE) { size = msg_att_item->att_data.att_static->att_data.att_rfc822_size; * result = size; mailimap_fetch_list_free(fetch_result); return MAIL_NO_ERROR; } } } mailimap_fetch_list_free(fetch_result); return MAIL_ERROR_FETCH; free_fetch_att: mailimap_fetch_att_free(fetch_att); free_set: mailimap_set_free(set); err: return res; }
static int imap_fetch_body(mailmessage * msg_info, char ** result, size_t * result_len) { int r; struct mailimap_set * set; struct mailimap_fetch_att * fetch_att; struct mailimap_fetch_type * fetch_type; clist * fetch_result; struct mailimap_msg_att * msg_att; struct mailimap_msg_att_item * msg_att_item; char * text; size_t text_length; int res; clistiter * cur; struct mailimap_section * section; set = mailimap_set_new_single(msg_info->msg_index); if (set == NULL) { res = MAIL_ERROR_MEMORY; goto err; } #if 0 fetch_att = mailimap_fetch_att_new_rfc822_text(); if (fetch_att == NULL) { res = MAIL_ERROR_MEMORY; goto free_set; } fetch_type = mailimap_fetch_type_new_fetch_att(fetch_att); if (fetch_type == NULL) { res = MAIL_ERROR_MEMORY; goto free_fetch_att; } r = mailimap_uid_fetch(get_imap_session(msg_info->session), set, fetch_type, &fetch_result); mailimap_fetch_type_free(fetch_type); #endif section = mailimap_section_new_text(); if (section == NULL) { res = MAIL_ERROR_MEMORY; goto free_set; } fetch_att = mailimap_fetch_att_new_body_peek_section(section); if (fetch_att == NULL) { mailimap_section_free(section); res = MAIL_ERROR_MEMORY; goto free_set; } fetch_type = mailimap_fetch_type_new_fetch_att(fetch_att); if (fetch_type == NULL) { res = MAIL_ERROR_MEMORY; goto free_fetch_att; } r = mailimap_uid_fetch(get_imap_session(msg_info), set, fetch_type, &fetch_result); mailimap_fetch_type_free(fetch_type); mailimap_set_free(set); switch (r) { case MAILIMAP_NO_ERROR: break; default: return imap_error_to_mail_error(r); } cur = clist_begin(fetch_result); if (cur == NULL) { mailimap_fetch_list_free(fetch_result); return MAIL_ERROR_FETCH; } msg_att = clist_content(cur); text = NULL; text_length = 0; for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { msg_att_item = clist_content(cur); if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { #if 0 if (msg_att_item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_TEXT) { text = msg_att_item->msg_att_static->rfc822_text; msg_att_item->msg_att_static->rfc822_text = NULL; text_length = msg_att_item->msg_att_static->length; } #endif if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = NULL; text_length = msg_att_item->att_data.att_static->att_data.att_body_section->sec_length; } } } mailimap_fetch_list_free(fetch_result); if (text == NULL) return MAIL_ERROR_FETCH; * result = text; * result_len = text_length; return MAIL_NO_ERROR; free_fetch_att: mailimap_fetch_att_free(fetch_att); free_set: mailimap_set_free(set); err: return res; }