static struct mailmime * get_file_part(const char * filename, const char * mime_type, const char * text, size_t length) { char * disposition_name; int encoding_type; struct mailmime_disposition * disposition; struct mailmime_mechanism * encoding; struct mailmime_content * content; struct mailmime * mime; struct mailmime_fields * mime_fields; disposition_name = NULL; if (filename != NULL) { disposition_name = strdup(filename); } disposition = mailmime_disposition_new_with_data(MAILMIME_DISPOSITION_TYPE_ATTACHMENT, disposition_name, NULL, NULL, NULL, (size_t) -1); content = mailmime_content_new_with_str(mime_type); encoding_type = MAILMIME_MECHANISM_BASE64; encoding = mailmime_mechanism_new(encoding_type, NULL); mime_fields = mailmime_fields_new_with_data(encoding, NULL, NULL, disposition, NULL); mime = part_new_empty(content, mime_fields, NULL, 1); mailmime_set_body_text(mime, (char *) text, length); return mime; }
struct mailmime_fields * mailmime_fields_new_filename(int dsp_type, char * filename, int encoding_type) { struct mailmime_disposition * dsp; struct mailmime_mechanism * encoding; struct mailmime_fields * mime_fields; dsp = mailmime_disposition_new_with_data(dsp_type, filename, NULL, NULL, NULL, (size_t) -1); if (dsp == NULL) goto err; encoding = mailmime_mechanism_new(encoding_type, NULL); if (encoding == NULL) goto free_dsp; mime_fields = mailmime_fields_new_with_data(encoding, NULL, NULL, dsp, NULL); if (mime_fields == NULL) goto free_encoding; return mime_fields; free_encoding: mailmime_encoding_free(encoding); free_dsp: mailmime_disposition_free(dsp); err: return NULL; }
struct mailmime_fields * mailmime_fields_new_encoding(int type) { struct mailmime_mechanism * encoding; struct mailmime_fields * mime_fields; encoding = mailmime_mechanism_new(type, NULL); if (encoding == NULL) goto err; mime_fields = mailmime_fields_new_with_data(encoding, NULL, NULL, NULL, NULL); if (mime_fields == NULL) goto free; return mime_fields; free: mailmime_mechanism_free(encoding); err: return NULL; }
static struct mailmime * get_text_part(const char * mime_type, const char * text, size_t length, int encoding_type) { struct mailmime_fields * mime_fields; struct mailmime * mime; struct mailmime_content * content; struct mailmime_parameter * param; struct mailmime_disposition * disposition; struct mailmime_mechanism * encoding; encoding = mailmime_mechanism_new(encoding_type, NULL); disposition = mailmime_disposition_new_with_data(MAILMIME_DISPOSITION_TYPE_INLINE, NULL, NULL, NULL, NULL, (size_t) -1); mime_fields = mailmime_fields_new_with_data(encoding, NULL, NULL, disposition, NULL); content = mailmime_content_new_with_str(mime_type); param = mailmime_param_new_with_data("charset", "utf-8"); clist_append(content->ct_parameters, param); mime = part_new_empty(content, mime_fields, NULL, 1); mailmime_set_body_text(mime, (char *) text, length); return mime; }
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; }
struct mailmime * mailprivacy_new_file_part(struct mailprivacy * privacy, char * filename, char * default_content_type, int default_encoding) { char basename_buf[PATH_MAX]; char * name; struct mailmime_mechanism * encoding; struct mailmime_content * content; struct mailmime * mime; int r; char * dup_filename; struct mailmime_fields * mime_fields; int encoding_type; char * content_type_str; int do_encoding; if (filename != NULL) { strncpy(basename_buf, filename, PATH_MAX); name = libetpan_basename(basename_buf); } else { name = NULL; } encoding = NULL; /* default content-type */ if (default_content_type == NULL) content_type_str = "application/octet-stream"; else content_type_str = default_content_type; content = mailmime_content_new_with_str(content_type_str); if (content == NULL) { goto free_content; } do_encoding = 1; if (content->ct_type->tp_type == MAILMIME_TYPE_COMPOSITE_TYPE) { struct mailmime_composite_type * composite; composite = content->ct_type->tp_data.tp_composite_type; switch (composite->ct_type) { case MAILMIME_COMPOSITE_TYPE_MESSAGE: if (strcasecmp(content->ct_subtype, "rfc822") == 0) do_encoding = 0; break; case MAILMIME_COMPOSITE_TYPE_MULTIPART: do_encoding = 0; break; } } if (do_encoding) { if (default_encoding == -1) encoding_type = MAILMIME_MECHANISM_BASE64; else encoding_type = default_encoding; /* default Content-Transfer-Encoding */ encoding = mailmime_mechanism_new(encoding_type, NULL); if (encoding == NULL) { goto free_content; } } mime_fields = mailmime_fields_new_with_data(encoding, NULL, NULL, NULL, NULL); if (mime_fields == NULL) { goto free_content; } mime = mailmime_new_empty(content, mime_fields); if (mime == NULL) { goto free_mime_fields; } if ((filename != NULL) && (mime->mm_type == MAILMIME_SINGLE)) { /* duplicates the file so that the file can be deleted when the MIME part is done */ dup_filename = dup_file(privacy, filename); if (dup_filename == NULL) { goto free_mime; } r = mailmime_set_body_file(mime, dup_filename); if (r != MAILIMF_NO_ERROR) { free(dup_filename); goto free_mime; } } return mime; free_mime: mailmime_free(mime); goto err; free_mime_fields: mailmime_fields_free(mime_fields); mailmime_content_free(content); goto err; free_content: if (encoding != NULL) mailmime_mechanism_free(encoding); if (content != NULL) mailmime_content_free(content); err: return NULL; }