summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/tests/compose-msg.c
Side-by-side diff
Diffstat (limited to 'kmicromail/libetpan/tests/compose-msg.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/tests/compose-msg.c317
1 files changed, 317 insertions, 0 deletions
diff --git a/kmicromail/libetpan/tests/compose-msg.c b/kmicromail/libetpan/tests/compose-msg.c
new file mode 100644
index 0000000..f68660b
--- a/dev/null
+++ b/kmicromail/libetpan/tests/compose-msg.c
@@ -0,0 +1,317 @@
+#include <libetpan/libetpan.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define DEST_CHARSET "iso-8859-1"
+
+/* build a mime parameter */
+
+static struct mailmime_parameter *
+mailmime_param_new_with_data(char * name, char * value)
+{
+ char * param_name;
+ char * param_value;
+ struct mailmime_parameter * param;
+
+ param_name = strdup(name);
+ if (param_name == NULL)
+ goto err;
+
+ param_value = strdup(value);
+ if (param_value == NULL)
+ goto free_name;
+
+ param = mailmime_parameter_new(param_name, param_value);
+ if (param == NULL)
+ goto free_value;
+
+ return param;
+
+ free_value:
+ free(param_value);
+ free_name:
+ free(param_name);
+ err:
+ return NULL;
+}
+
+
+/* build sample fields */
+
+static struct mailimf_fields * build_fields(void)
+{
+ struct mailimf_mailbox_list * from;
+ struct mailimf_address_list * to;
+ char * subject;
+ int r;
+ struct mailimf_fields * new_fields;
+
+ /* subject field */
+
+ subject = strdup("this is a sample");
+ if (subject == NULL) {
+ goto err;
+ }
+
+ /* from field */
+
+ from = mailimf_mailbox_list_new_empty();
+ if (from == NULL) {
+ goto free_subject;
+ }
+
+ r = mailimf_mailbox_list_add_parse(from,
+ "DINH Viet Hoa <hoa@sourceforge.net>");
+ if (r != MAILIMF_NO_ERROR) {
+ goto free_from;
+ }
+
+ /* to field */
+
+ to = mailimf_address_list_new_empty();
+ if (to == NULL) {
+ goto free_from;
+ }
+
+ r = mailimf_address_list_add_parse(to,
+ "Paul <claws@thewildbeast.co.uk>");
+ if (r != MAILIMF_NO_ERROR) {
+ goto free_to;
+ }
+
+ new_fields = mailimf_fields_new_with_data(from /* from */,
+ NULL /* sender */, NULL /* reply-to */,
+ to, NULL /* cc */, NULL /* bcc */, NULL /* in-reply-to */,
+ NULL /* references */,
+ subject);
+ if (new_fields == NULL)
+ goto free_to;
+
+ return new_fields;
+
+ free_to:
+ mailimf_address_list_free(to);
+ free_from:
+ mailimf_mailbox_list_free(from);
+ free_subject:
+ free(subject);
+ err:
+ return NULL;
+}
+
+
+
+/* text is a string, build a mime part containing this string */
+
+static struct mailmime * build_body_text(char * text)
+{
+ struct mailmime_fields * mime_fields;
+ struct mailmime * mime_sub;
+ struct mailmime_content * content;
+ struct mailmime_parameter * param;
+ int r;
+
+ /* text/plain part */
+
+ mime_fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT);
+ if (mime_fields == NULL) {
+ goto err;
+ }
+
+ content = mailmime_content_new_with_str("text/plain");
+ if (content == NULL) {
+ goto free_fields;
+ }
+
+ param = mailmime_param_new_with_data("charset", DEST_CHARSET);
+ if (param == NULL) {
+ goto free_content;
+ }
+
+ r = clist_append(content->ct_parameters, param);
+ if (r < 0) {
+ mailmime_parameter_free(param);
+ goto free_content;
+ }
+
+ mime_sub = mailmime_new_empty(content, mime_fields);
+ if (mime_sub == NULL) {
+ goto free_content;
+ }
+
+ r = mailmime_set_body_text(mime_sub, text, strlen(text));
+ if (r != MAILIMF_NO_ERROR) {
+ goto free_mime;
+ }
+
+ return mime_sub;
+
+ free_mime:
+ mailmime_free(mime_sub);
+ goto err;
+ free_content:
+ mailmime_content_free(content);
+ free_fields:
+ mailmime_fields_free(mime_fields);
+ err:
+ return NULL;
+}
+
+
+/* build a mime part containing the given file */
+
+static struct mailmime * build_body_file(char * filename)
+{
+ struct mailmime_fields * mime_fields;
+ struct mailmime * mime_sub;
+ struct mailmime_content * content;
+ struct mailmime_parameter * param;
+ char * dup_filename;
+ int r;
+
+ /* text/plain part */
+
+ dup_filename = strdup(filename);
+ if (dup_filename == NULL)
+ goto err;
+
+ mime_fields =
+ mailmime_fields_new_filename(MAILMIME_DISPOSITION_TYPE_ATTACHMENT,
+ dup_filename, MAILMIME_MECHANISM_BASE64);
+ if (mime_fields == NULL)
+ goto free_dup_filename;
+
+ content = mailmime_content_new_with_str("text/plain");
+ if (content == NULL) {
+ goto free_fields;
+ }
+
+ param = mailmime_param_new_with_data("charset", DEST_CHARSET);
+ if (param == NULL) {
+ goto free_content;
+ }
+
+ r = clist_append(content->ct_parameters, param);
+ if (r < 0) {
+ mailmime_parameter_free(param);
+ goto free_content;
+ }
+
+ mime_sub = mailmime_new_empty(content, mime_fields);
+ if (mime_sub == NULL) {
+ goto free_content;
+ }
+
+ dup_filename = strdup(filename);
+ if (dup_filename == NULL)
+ goto free_mime;
+
+ r = mailmime_set_body_file(mime_sub, dup_filename);
+ if (r != MAILIMF_NO_ERROR) {
+ goto free_mime;
+ }
+
+ return mime_sub;
+
+ free_mime:
+ mailmime_free(mime_sub);
+ goto err;
+ free_content:
+ mailmime_content_free(content);
+ free_fields:
+ mailmime_fields_free(mime_fields);
+ goto err;
+ free_dup_filename:
+ free(dup_filename);
+ err:
+ return NULL;
+}
+
+
+/* build an empty message */
+
+static struct mailmime * build_message(struct mailimf_fields * fields)
+{
+ struct mailmime * mime;
+
+ /* message */
+
+ mime = mailmime_new_message_data(NULL);
+ if (mime == NULL) {
+ goto err;
+ }
+
+ mailmime_set_imf_fields(mime, fields);
+
+ return mime;
+
+ err:
+ return NULL;
+}
+
+
+int main(int argc, char ** argv)
+{
+ struct mailimf_fields * fields;
+ char * text;
+ char * filename;
+ struct mailmime * message;
+ struct mailmime * text_part;
+ struct mailmime * file_part;
+ int r;
+ int col;
+
+ if (argc < 3) {
+ printf("syntax: compose-msg \"text\" filename\n");
+ return 1;
+ }
+
+ fields = build_fields();
+ if (fields == NULL)
+ goto err;
+
+ message = build_message(fields);
+ if (message == NULL)
+ goto free_fields;
+
+ text = argv[1];
+ text_part = build_body_text(text);
+ if (text_part == NULL)
+ goto free_message;
+
+ filename = argv[2];
+ file_part = build_body_file(filename);
+ if (file_part == NULL)
+ goto free_text;
+
+ r = mailmime_smart_add_part(message, text_part);
+ if (r != MAILIMF_NO_ERROR)
+ goto free_file;
+
+ r = mailmime_smart_add_part(message, file_part);
+ if (r != MAILIMF_NO_ERROR)
+ goto free_file_alone;
+
+ col = 0;
+ mailmime_write(stdout, &col, message);
+
+ mailmime_free(message);
+
+ return 0;
+
+ free_file_alone:
+ mailmime_free(file_part);
+ goto free_text;
+ free_file:
+ mailmime_free(file_part);
+ free_text:
+ mailmime_free(text_part);
+ free_message:
+ mailmime_free(message);
+ goto err;
+ free_fields:
+ mailimf_fields_free(fields);
+ err:
+ printf("error memory\n");
+ return 1;
+}