/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Authors: Jeffrey Stedfast * * Copyright 2000 Helix Code, Inc. (www.helixcode.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * */ #include #include #include #include "gmime.h" #define ENABLE_ZENTIMER #include "zentimer.h" void test_parser (char *data) { GMimeMessage *message; GMimeStream *stream; char *text; fprintf (stdout, "\nTesting MIME parser...\n\n"); stream = g_mime_stream_mem_new_with_buffer (data, strlen (data)); message = g_mime_parser_construct_message (stream); g_mime_stream_unref (stream); fprintf (stdout, "Test of GMimeHeader:\nTo: %s\n\n", g_mime_message_get_header (message, "To")); text = g_mime_message_to_string (message); fprintf (stdout, "Result should match previous MIME message dump\n\n%s\n", text); g_free (text); g_mime_object_unref (GMIME_OBJECT (message)); } void test_multipart (void) { GMimeMessage *message; GMimeContentType *mime_type; GMimePart *multi_part, *text_part, *html_part; char *body, *text; gboolean is_html; multi_part = g_mime_part_new_with_type ("multipart", "alternative"); /*g_mime_part_set_boundary (multi_part, "spruce1234567890ABCDEFGHIJK");*/ text_part = g_mime_part_new (); mime_type = g_mime_content_type_new ("text", "plain"); g_mime_part_set_content_type (text_part, mime_type); g_mime_part_set_content_id (text_part, "1"); g_mime_part_set_content_header (text_part, "Content-Test", "test-mime"); g_mime_part_set_content_description (text_part, "this is a text part"); g_mime_part_set_content (text_part, "This is the body of my message.\n", strlen ("This is the body of my message.\n")); g_mime_part_add_subpart (multi_part, text_part); html_part = g_mime_part_new (); mime_type = g_mime_content_type_new ("text", "html"); g_mime_part_set_content_type (html_part, mime_type); g_mime_part_set_filename (html_part, "this is a really really long filename that should force gmime to rfc2184 encode it - yay!.html"); g_mime_part_set_content_description (html_part, "this is an html part and stuff"); g_mime_part_set_content (html_part, "\n\t
This is the body of my message.
\n", strlen ("\n\t
This is the body of my message.
\n")); g_mime_part_set_encoding (html_part, GMIME_PART_ENCODING_BASE64); g_mime_part_set_content_id (html_part, "2"); g_mime_part_add_subpart (multi_part, html_part); message = g_mime_message_new (TRUE); g_mime_message_set_sender (message, "\"Jeffrey Stedfast\" "); g_mime_message_set_reply_to (message, "fejj@helixcode.com"); g_mime_message_add_recipient (message, GMIME_RECIPIENT_TYPE_TO, "Federico Mena-Quintero", "federico@helixcode.com"); g_mime_message_set_subject (message, "This is a test message"); g_mime_message_set_header (message, "X-Mailer", "main.c"); g_mime_message_set_mime_part (message, multi_part); text = g_mime_message_to_string (message); fprintf (stdout, "%s\n", text ? text : "(null)"); /* get the body in text/plain */ body = g_mime_message_get_body (message, TRUE, &is_html); fprintf (stdout, "Trying to get message body in plain text format:\n%s\n\n", body ? body : "(null)"); g_free (body); /* get the body in text/html */ body = g_mime_message_get_body (message, FALSE, &is_html); fprintf (stdout, "Trying to get message body in html format:\n%s\n\n", body ? body : "(null)"); g_free (body); if (is_html) fprintf (stdout, "yep...got it in html format\n"); g_mime_object_unref (GMIME_OBJECT (message)); test_parser (text); g_free (text); } void test_onepart (void) { GMimeMessage *message; GMimePart *mime_part; char *body, *text; gboolean is_html; mime_part = g_mime_part_new_with_type ("text", "plain"); g_mime_part_set_content (mime_part, "This is the body of my message.\n", strlen ("This is the body of my message.\n")); message = g_mime_message_new (TRUE); g_mime_message_set_sender (message, "\"Jeffrey Stedfast\" "); g_mime_message_set_reply_to (message, "fejj@helixcode.com"); g_mime_message_add_recipient (message, GMIME_RECIPIENT_TYPE_TO, "Federico Mena-Quintero", "federico@helixcode.com"); g_mime_message_set_subject (message, "This is a test message"); g_mime_message_set_header (message, "X-Mailer", "main.c"); g_mime_message_set_mime_part (message, mime_part); text = g_mime_message_to_string (message); fprintf (stdout, "%s\n", text ? text : "(null)"); body = g_mime_message_get_body (message, TRUE, &is_html); fprintf (stdout, "Trying to get message body:\n%s\n\n", body ? body : "(null)"); g_free (body); g_mime_object_unref (GMIME_OBJECT (message)); test_parser (text); g_free (text); } static char *string = "I have no idea what to test here so I'll just test a " "bunch of crap like this and see what it encodes it as.\r\n" "I'm thinking this line should be really really really long " "so as to test the line wrapping at 76 chars, dontcha think? " "I most certainly do. Lets get some weird chars in here too. " "Lets try: = ċċċċaa\nOkay, now on a side note...uhm, ?= =? and stuff.\n" "danw wanted me to try this next line...so lets give it a shot:\n" "foo \n" "Lets also try some tabs in here like this:\t\tis that 2 tabs? I hope so."; void test_encodings (void) { char *enc, *dec; int pos, state = -1, save = 0; enc = g_strdup ("OT - ich =?ISO-8859-1?Q?wei=DF?=, trotzdem"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_strdup ("OT - ich =?iso-8859-1?b?d2Vp3yw=?= trotzdem"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_strdup ("OT - ich =?ISO-8859-1?Q?wei=DF,?= trotzdem"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_mime_utils_8bit_header_encode ("OT - ich weiß, trotzdem"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_strdup ("=?iso-8859-1?Q?=DE?=:\t=?iso-8859-1?Q?=AD=BE=EF?= spells 0xdeadbeef"); fprintf (stderr, "incorrect: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); enc = g_mime_utils_8bit_header_encode (dec); g_free (dec); fprintf (stderr, "correct: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_strdup ("=?iso-8859-1?q?blablah?="); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_strdup ("=?iso-8859-1?Q?blablah?="); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_mime_utils_8bit_header_encode ("Kristoffer Brċnemyr"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_mime_utils_8bit_header_encode_phrase ("Kristoffer Brċnemyr"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_mime_utils_8bit_header_encode ("ċaċċċaċċ aaaa ċċċċaa"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_mime_utils_8bit_header_encode_phrase ("ċaċċċaċċ aaaa ċċċċaa"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); fprintf (stderr, "test that white space between 8bit words is preserved\n"); enc = g_mime_utils_8bit_header_encode ("ċaċċċaċċ \t ċċċċaa"); fprintf (stderr, "encoded: %s\n", enc); dec = g_mime_utils_8bit_header_decode (enc); fprintf (stderr, "decoded: %s\n", dec); g_free (enc); g_free (dec); enc = g_mime_utils_quote_string ("this is an \"embedded\" quoted string."); fprintf (stderr, "quoted: %s\n", enc); g_mime_utils_unquote_string (enc); fprintf (stderr, "unquoted: %s\n", enc); g_free (enc); enc = g_mime_utils_quote_string ("Jeffrey \"The Fejjinator\" Stedfast"); fprintf (stderr, "quoted: %s\n", enc); g_mime_utils_unquote_string (enc); fprintf (stderr, "unquoted: %s\n", enc); g_free (enc); enc = g_malloc (strlen (string) * 3); pos = g_mime_utils_quoted_encode_close (string, strlen (string), enc, &state, &save); enc[pos] = '\0'; fprintf (stderr, "\nencoded:\n-------\n%s\n-------\n", enc); g_free (enc); } static char *addresses[] = { "fejj@helixcode.com", "Jeffrey Stedfast ", "Jeffrey \"fejj\" Stedfast ", "\"Stedfast, Jeffrey\" ", "fejj@helixcode.com (Jeffrey Stedfast)", "Jeff ", "=?iso-8859-1?q?Kristoffer_Br=E5nemyr?= ", "fpons@mandrakesoft.com (=?iso-8859-1?q?Fran=E7ois?= Pons)", "GNOME Hackers: miguel@gnome.org (Miguel de Icaza), Havoc Pennington ;, fejj@helixcode.com", "Local recipients: phil, joe, alex, bob", "@develop:sblab!att!thumper.bellcore.com!nsb", "\":sysmail\"@ Some-Group. Some-Org,\n Muhammed.(I am the greatest) Ali @(the)Vegas.WBA", "Charles S. Kerr ", /* the '.' in the name part is illegal */ "Charles \"Likes, to, put, commas, in, quoted, strings\" Kerr ", "Charles Kerr, Pan Programmer ", /* bad placement of a comma ;-) */ "Charles Kerr ", "Charles ", /* where'd it go? Hollywood said, "where did *who* go!?" */ "Charles Kerr,, likes illegal commas ", /* ouch this is bad... */ "", " (Charles Kerr)", "fpons@mandrakesoft.com (=?iso-8859-1?q?Fran=E7ois?= Pons likes _'s and \t's too)", "Tġivo Leedjärv ", NULL }; static void dump_addrlist (InternetAddressList *addrlist, int i, gboolean group, gboolean destroy) { InternetAddressList *addr; InternetAddress *ia; addr = addrlist; while (addr) { char *str; ia = addr->address; addr = addr->next; if (i != -1) fprintf (stderr, "Original: %s\n", addresses[i]); if (ia->type == INTERNET_ADDRESS_GROUP) { fprintf (stderr, "Address is a group:\n"); fprintf (stderr, "Name: %s\n", ia->name ? ia->name : ""); dump_addrlist (ia->value.members, -1, TRUE, FALSE); fprintf (stderr, "End of group.\n"); } else if (ia->type == INTERNET_ADDRESS_NAME) { fprintf (stderr, "%sName: %s\n", group ? "\t" : "", ia->name ? ia->name : ""); fprintf (stderr, "%sEMail: %s\n", group ? "\t" : "", ia->value.addr ? ia->value.addr : ""); } str = internet_address_to_string (ia, FALSE); fprintf (stderr, "%sRewritten (display): %s\n", group ? "\t" : "", str ? str : ""); g_free (str); str = internet_address_to_string (ia, TRUE); fprintf (stderr, "%sRewritten (encoded): %s\n\n", group ? "\t" : "", str ? str : ""); g_free (str); } } void test_addresses (void) { int i; for (i = 0; addresses[i]; i++) { InternetAddressList *addrlist; addrlist = internet_address_parse_string (addresses[i]); if (!addrlist) { fprintf (stderr, "failed to parse '%s'.\n", addresses[i]); continue; } dump_addrlist (addrlist, i, FALSE, TRUE); internet_address_list_destroy (addrlist); } } /*#include "date-strings.h"*/ void test_date (void) { int offset = 0; char *in, *out; time_t date; in = "Mon, 17 Jan 1994 11:14:55 -0500"; fprintf (stderr, "date in: [%s]\n", in); date = g_mime_utils_header_decode_date (in, &offset); out = g_mime_utils_header_format_date (date, offset); fprintf (stderr, "date out: [%s]\n", out); g_free (out); in = "Mon, 17 Jan 01 11:14:55 -0500"; fprintf (stderr, "date in: [%s]\n", in); date = g_mime_utils_header_decode_date (in, &offset); out = g_mime_utils_header_format_date (date, offset); fprintf (stderr, "date out: [%s]\n", out); g_free (out); #if 0 { char *string; int i; ZenTimerStart (); for (i = 0; i < num_date_strings; i++) { in = date_strings[i]; printf ("date in: [%s]\n", in); date = g_mime_utils_header_decode_date (in, &offset); out = g_mime_utils_header_format_date (date, offset); printf ("date out: [%s]\n", out); g_free (out); } ZenTimerStop (); string = g_strdup_printf ("date parser (%d dates parsed)", num_date_strings); ZenTimerReport (string); g_free (string); } #endif } int main (int argc, char *argv[]) { g_mime_init (0 /*GMIME_INIT_FLAG_UTF8*/); test_date (); test_onepart (); test_multipart (); test_encodings (); test_addresses (); return 0; }