static void prepare_mime_single(struct mailmime * mime) { struct mailmime_single_fields single_fields; int encoding; int r; if (mime->mm_mime_fields != NULL) { mailmime_single_fields_init(&single_fields, mime->mm_mime_fields, mime->mm_content_type); if (single_fields.fld_encoding != NULL) { encoding = single_fields.fld_encoding->enc_type; switch (encoding) { case MAILMIME_MECHANISM_8BIT: case MAILMIME_MECHANISM_7BIT: case MAILMIME_MECHANISM_BINARY: single_fields.fld_encoding->enc_type = MAILMIME_MECHANISM_QUOTED_PRINTABLE; break; } } else { struct mailmime_mechanism * mechanism; struct mailmime_field * field; mechanism = mailmime_mechanism_new(MAILMIME_MECHANISM_QUOTED_PRINTABLE, NULL); if (mechanism == NULL) return; field = mailmime_field_new(MAILMIME_FIELD_TRANSFER_ENCODING, NULL, mechanism, NULL, NULL, 0, NULL, NULL, NULL); if (field == NULL) { mailmime_mechanism_free(mechanism); return; } r = clist_append(mime->mm_mime_fields->fld_list, field); if (r < 0) { mailmime_field_free(field); return; } } } if (mime->mm_type == MAILMIME_SINGLE) { switch (mime->mm_data.mm_single->dt_encoding) { case MAILMIME_MECHANISM_8BIT: case MAILMIME_MECHANISM_7BIT: case MAILMIME_MECHANISM_BINARY: mime->mm_data.mm_single->dt_encoding = MAILMIME_MECHANISM_QUOTED_PRINTABLE; mime->mm_data.mm_single->dt_encoded = 0; break; } } }
static void strip_mime_headers(struct mailmime * mime) { struct mailmime_fields * fields; clistiter * cur; fields = mime->mm_mime_fields; if (fields == NULL) return; for(cur = clist_begin(fields->fld_list) ; cur != NULL ; cur = clist_next(cur)) { struct mailmime_field * field; field = clist_content(cur); if (field->fld_type == MAILMIME_FIELD_VERSION) { mailmime_field_free(field); clist_delete(fields->fld_list, cur); break; } } }
struct mailmime_fields * mailmime_fields_new_with_version(struct mailmime_mechanism * encoding, char * id, char * description, struct mailmime_disposition * disposition, struct mailmime_language * language) { struct mailmime_field * field; struct mailmime_fields * fields; int r; fields = mailmime_fields_new_with_data(encoding, id, description, disposition, language); if (fields == NULL) goto err; field = mailmime_field_new(MAILMIME_FIELD_VERSION, NULL, NULL, NULL, NULL, MIME_VERSION, NULL, NULL, NULL); if (field == NULL) goto free; r = mailmime_fields_add(fields, field); if (r != MAILIMF_NO_ERROR) { mailmime_field_detach(field); mailmime_field_free(field); goto free; } return fields; free: clist_foreach(fields->fld_list, (clist_func) mailmime_field_detach, NULL); mailmime_fields_free(fields); err: return NULL; }
LIBETPAN_EXPORT int mailmime_fields_parse(struct mailimf_fields * fields, struct mailmime_fields ** result) { clistiter * cur; struct mailmime_fields * mime_fields; clist * list; int r; int res; list = clist_new(); if (list == NULL) { res = MAILIMF_ERROR_MEMORY; goto err; } for(cur = clist_begin(fields->fld_list) ; cur != NULL ; cur = clist_next(cur)) { struct mailimf_field * field; struct mailmime_field * mime_field; field = clist_content(cur); if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) { r = mailmime_field_parse(field->fld_data.fld_optional_field, &mime_field); if (r == MAILIMF_NO_ERROR) { r = clist_append(list, mime_field); if (r < 0) { mailmime_field_free(mime_field); res = MAILIMF_ERROR_MEMORY; goto free_list; } } else if (r == MAILIMF_ERROR_PARSE) { /* do nothing */ } else { res = r; goto free_list; } } } if (clist_begin(list) == NULL) { res = MAILIMF_ERROR_PARSE; goto free_list; } mime_fields = mailmime_fields_new(list); if (mime_fields == NULL) { res = MAILIMF_ERROR_MEMORY; goto free_list; } * result = mime_fields; return MAILIMF_NO_ERROR; free_list: clist_foreach(list, (clist_func) mailmime_field_free, NULL); clist_free(list); err: return res; }
LIBETPAN_EXPORT int mailmime_unparsed_fields_parse(struct mailimf_unparsed_fields * fields, struct mailmime_fields ** result) { clistiter * cur; struct mailmime_fields * mime_fields; clist * list; int r; int res; list = clist_new(); if (list == NULL) { res = MAILIMF_ERROR_MEMORY; goto err; } if (fields->list == NULL) { res = MAILIMF_ERROR_PARSE; goto err; } for(cur = clist_begin(fields->list) ; cur != NULL ; cur = clist_next(cur)) { struct mailimf_optional_field * field = cur->data; struct mailmime_field * mime_field; r = mailmime_field_parse(field, &mime_field); if (r == MAILIMF_NO_ERROR) { r = clist_append(list, mime_field); if (r < 0) { mailmime_field_free(mime_field); res = MAILIMF_ERROR_MEMORY; goto free_list; } } } if (clist_begin(list) == NULL) { res = MAILIMF_ERROR_PARSE; goto free_list; } mime_fields = mailmime_fields_new(list); if (mime_fields == NULL) { res = MAILIMF_ERROR_MEMORY; goto free_list; } * result = mime_fields; return MAILIMF_NO_ERROR; free_list: clist_foreach(list, (clist_func) mailmime_field_free, NULL); clist_free(list); err: return res; }
struct mailmime_fields * mailmime_fields_new_with_data(struct mailmime_mechanism * encoding, char * id, char * description, struct mailmime_disposition * disposition, struct mailmime_language * language) { struct mailmime_field * field; struct mailmime_fields * fields; int r; fields = mailmime_fields_new_empty(); if (fields == NULL) goto err; #if 0 if (content != NULL) { field = mailmime_field_new(MAILMIME_FIELD_TYPE, content, NULL, NULL, NULL, 0, NULL, NULL); if (field == NULL) goto free; r = mailmime_fields_add(fields, field); if (r != MAILIMF_NO_ERROR) { mailmime_field_detach(field); mailmime_field_free(field); goto free; } } #endif if (encoding != NULL) { field = mailmime_field_new(MAILMIME_FIELD_TRANSFER_ENCODING, NULL, encoding, NULL, NULL, 0, NULL, NULL, NULL); if (field == NULL) goto free; r = mailmime_fields_add(fields, field); if (r != MAILIMF_NO_ERROR) { mailmime_field_detach(field); mailmime_field_free(field); goto free; } } if (id != NULL) { field = mailmime_field_new(MAILMIME_FIELD_ID, NULL, NULL, id, NULL, 0, NULL, NULL, NULL); if (field == NULL) goto free; r = mailmime_fields_add(fields, field); if (r != MAILIMF_NO_ERROR) { mailmime_field_detach(field); mailmime_field_free(field); goto free; } } if (description != NULL) { field = mailmime_field_new(MAILMIME_FIELD_DESCRIPTION, NULL, NULL, NULL, description, 0, NULL, NULL, NULL); if (field == NULL) goto free; r = mailmime_fields_add(fields, field); if (r != MAILIMF_NO_ERROR) { mailmime_field_detach(field); mailmime_field_free(field); goto free; } } if (disposition != NULL) { field = mailmime_field_new(MAILMIME_FIELD_DISPOSITION, NULL, NULL, NULL, NULL, 0, disposition, NULL, NULL); if (field == NULL) goto free; r = mailmime_fields_add(fields, field); if (r != MAILIMF_NO_ERROR) { mailmime_field_detach(field); mailmime_field_free(field); goto free; } } if (language != NULL) { field = mailmime_field_new(MAILMIME_FIELD_DISPOSITION, NULL, NULL, NULL, NULL, 0, NULL, language, NULL); if (field == NULL) goto free; r = mailmime_fields_add(fields, field); if (r != MAILIMF_NO_ERROR) { mailmime_field_detach(field); mailmime_field_free(field); goto free; } } return fields; free: clist_foreach(fields->fld_list, (clist_func) mailmime_field_detach, NULL); mailmime_fields_free(fields); err: return NULL; }