diff -upr tracker-0.6.6.old/src/trackerd/tracker-email-evolution.c tracker-0.6.6/src/trackerd/tracker-email-evolution.c --- tracker-0.6.6.old/src/trackerd/tracker-email-evolution.c 2008-02-28 23:49:53.000000000 +0000 +++ tracker-0.6.6/src/trackerd/tracker-email-evolution.c 2008-12-15 21:31:43.000000000 +0000 @@ -1450,7 +1450,7 @@ load_uri_and_status_of_mbox_mail_message g_return_if_fail (g_m_message); g_return_if_fail (msg); - field = g_mime_message_get_header (g_m_message, "X-Evolution"); + field = g_mime_object_get_header (GMIME_OBJECT (g_m_message), "X-Evolution"); g_return_if_fail (field); @@ -2478,27 +2478,28 @@ break_multipart_loop: static GSList * add_persons_from_internet_address_list_string_parsing (GSList *list, const gchar *s) { - InternetAddressList *addrs_list, *tmp; + InternetAddressList *addrs_list; + int i, count; g_return_val_if_fail (s, NULL); - addrs_list = internet_address_parse_string (s); + addrs_list = internet_address_list_parse_string (s); + count = internet_address_list_length (addrs_list); - for (tmp = addrs_list; tmp; tmp = tmp->next) { + for (i = 0; i < count; i++) { MailPerson *mp; + InternetAddress *addr; mp = email_allocate_mail_person (); + addr = internet_address_list_get_address (addrs_list, i); - mp->addr = g_strdup (tmp->address->value.addr); - if(tmp->address->name) - mp->name = g_strdup (tmp->address->name); - else - mp->name = g_strdup (tmp->address->value.addr); + mp->name = g_strdup (internet_address_get_name (addr)); + mp->addr = internet_address_to_string (addr, FALSE); list = g_slist_prepend (list, mp); } - internet_address_list_destroy (addrs_list); + g_object_unref (addrs_list); return list; } diff -upr tracker-0.6.6.old/src/trackerd/tracker-email-kmail.c tracker-0.6.6/src/trackerd/tracker-email-kmail.c --- tracker-0.6.6.old/src/trackerd/tracker-email-kmail.c 2008-01-15 04:05:03.000000000 +0000 +++ tracker-0.6.6/src/trackerd/tracker-email-kmail.c 2008-12-15 21:11:22.000000000 +0000 @@ -787,7 +787,7 @@ load_uri_of_mbox_mail_message (GMimeMess This line is at the beginning of each header but GMIME does not give access to it so we reproduce it. */ - field = g_mime_message_get_header (g_m_message, "From"); + field = g_mime_object_get_header (g_m_message, "From"); tmp_from = g_strdup (field); @@ -862,10 +862,10 @@ fill_uri_with_uid_for_imap (GMimeMessage mail_msg->uri = NULL; - /* Currently, "g_mime_message_get_header(g_m_message, "X-UID")" does not work because GMIME + /* Currently, "g_mime_object_get_header(g_m_message, "X-UID")" does not work because GMIME only handles RFC822 headers... So we have to search X-UID header ourself. */ - headers = g_mime_message_get_headers (g_m_message); + headers = g_mime_object_get_headers (g_m_message); g_return_if_fail (headers); pos_uid = strstr (headers, "X-UID"); diff -upr tracker-0.6.6.old/src/trackerd/tracker-email-thunderbird.c tracker-0.6.6/src/trackerd/tracker-email-thunderbird.c --- tracker-0.6.6.old/src/trackerd/tracker-email-thunderbird.c 2008-01-15 04:05:03.000000000 +0000 +++ tracker-0.6.6/src/trackerd/tracker-email-thunderbird.c 2008-12-15 21:34:18.000000000 +0000 @@ -418,26 +418,27 @@ free_parser_data (gpointer user_data) static GSList * add_persons_from_internet_address_list_string_parsing (GSList *list, const gchar *s) { - InternetAddressList *addrs_list, *tmp; + InternetAddressList *addrs_list; + int i, count; g_return_val_if_fail (s, NULL); - addrs_list = internet_address_parse_string (s); + addrs_list = internet_address_list_parse_string (s); + count = internet_address_list_length (addrs_list); - for (tmp = addrs_list; tmp; tmp = tmp->next) { + + for (i = 0; i < count; i++) { MailPerson *mp = email_allocate_mail_person (); + InternetAddress *addr; - mp->addr = g_strdup (tmp->address->value.addr); - if(tmp->address->name) { - mp->name = g_strdup (tmp->address->name); - } else { - mp->name = g_strdup (tmp->address->value.addr); - } + addr = internet_address_list_get_address (addrs_list, i); + mp->name = g_strdup (internet_address_get_name (addr)); + mp->addr = internet_address_to_string (addr, FALSE); list = g_slist_prepend (list, mp); } - internet_address_list_destroy (addrs_list); + g_object_unref (addrs_list); return list; } diff -upr tracker-0.6.6.old/src/trackerd/tracker-email-utils.c tracker-0.6.6/src/trackerd/tracker-email-utils.c --- tracker-0.6.6.old/src/trackerd/tracker-email-utils.c 2008-02-29 00:32:16.000000000 +0000 +++ tracker-0.6.6/src/trackerd/tracker-email-utils.c 2008-12-15 21:28:50.000000000 +0000 @@ -46,8 +46,8 @@ extern Tracker *tracker; static GMimeStream *new_gmime_stream_from_file (const gchar *path, gint flags, off_t start, off_t end); static GSList * add_gmime_references (GSList *list, GMimeMessage *message, const gchar *header); -static GSList * add_recipients (GSList *list, GMimeMessage *message, const gchar *type); -static void find_attachment (GMimeObject *obj, gpointer data); +static GSList * add_recipients (GSList *list, GMimeMessage *message, GMimeRecipientType type); +static void find_attachment (GMimeObject *parent, GMimeObject *obj, gpointer data); @@ -491,6 +491,124 @@ email_free_mail_message (MailMessage *ma g_slice_free (MailMessage, mail_msg); } +static GMimeObject * +handle_multipart_alternative (GMimeMultipart *multipart, gboolean want_plain, gboolean *is_html) +{ + GMimeObject *mime_part, *text_part = NULL; + GMimeContentType *type; + int count, i; + + count = g_mime_multipart_get_count (multipart); + for (i = 0; i < count ; i++) { + mime_part = g_mime_multipart_get_part (multipart, i); + + type = g_mime_object_get_content_type (GMIME_OBJECT (mime_part)); + if (g_mime_content_type_is_type (type, "text", "*")) { + if (!text_part || !g_ascii_strcasecmp (type->subtype, want_plain ? "plain" : "html")) { + *is_html = !g_ascii_strcasecmp (type->subtype, "html"); + text_part = mime_part; + } + } + } + + return text_part; +} + +static GMimeObject * +handle_multipart_mixed (GMimeMultipart *multipart, gboolean want_plain, gboolean *is_html) +{ + GMimeObject *mime_part, *text_part = NULL; + GMimeContentType *type, *first_type = NULL; + GList *subpart; + int count, i; + + count = g_mime_multipart_get_count (multipart); + for (i = 0; i < count ; i++) { + mime_part = g_mime_multipart_get_part (multipart, i); + + type = g_mime_object_get_content_type (mime_part); + if (GMIME_IS_MULTIPART (mime_part)) { + multipart = GMIME_MULTIPART (mime_part); + if (g_mime_content_type_is_type (type, "multipart", "alternative")) { + mime_part = handle_multipart_alternative (multipart, want_plain, is_html); + if (mime_part) + return mime_part; + } else { + mime_part = handle_multipart_mixed (multipart, want_plain, is_html); + if (mime_part && !text_part) + text_part = mime_part; + } + } else if (g_mime_content_type_is_type (type, "text", "*")) { + if (!g_ascii_strcasecmp (type->subtype, want_plain ? "plain" : "html")) { + /* we got what we came for */ + *is_html = !g_ascii_strcasecmp (type->subtype, "html"); + return mime_part; + } + + /* if we haven't yet found a text part or if it is a type we can + 1514 * understand and it is the first of that type, save it */ + if (!text_part || (!g_ascii_strcasecmp (type->subtype, "plain") && (first_type && + g_ascii_strcasecmp (type->subtype, first_type->subtype) != 0))) { + *is_html = !g_ascii_strcasecmp (type->subtype, "html"); + text_part = mime_part; + first_type = type; + } + } + + subpart = subpart->next; + } + + return text_part; +} + +static char * +tracker_mime_message_get_body (const GMimeMessage *message, gboolean want_plain, gboolean *is_html) +{ + GMimeObject *mime_part = NULL; + GMimeContentType *type; + GMimeMultipart *multipart; + char *body = NULL; + + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + g_return_val_if_fail (is_html != NULL, NULL); + + type = g_mime_object_get_content_type (message->mime_part); + if (GMIME_IS_MULTIPART (message->mime_part)) { + /* let's see if we can find a body in the multipart */ + multipart = GMIME_MULTIPART (message->mime_part); + if (g_mime_content_type_is_type (type, "multipart", "alternative")) + mime_part = handle_multipart_alternative (multipart, want_plain, is_html); + else + mime_part = handle_multipart_mixed (multipart, want_plain, is_html); + } else if (g_mime_content_type_is_type (type, "text", "*")) { + /* this *has* to be the message body */ + if (g_mime_content_type_is_type (type, "text", "html")) + *is_html = TRUE; + else + *is_html = FALSE; + + mime_part = message->mime_part; + } + + if (mime_part != NULL) { + GMimeDataWrapper *data_wrapper; + GMimeStream *mime_stream; + gint64 len; + + data_wrapper = g_mime_part_get_content_object (GMIME_PART (mime_part)); + + mime_stream = g_mime_data_wrapper_get_stream (data_wrapper); + len = g_mime_stream_length (mime_stream); + body = g_malloc0 (len + 1); + g_mime_stream_read (mime_stream, body, len); + g_object_unref (mime_stream); + g_object_unref (data_wrapper); + } + + return body; +} + + MailMessage * email_mail_file_parse_next (MailFile *mf, ReadMailHelperFct read_mail_helper, gpointer read_mail_user_data) @@ -539,7 +657,7 @@ email_mail_file_parse_next (MailFile *mf mail_msg->subject = g_strdup (g_mime_message_get_subject (g_m_message)); - mail_msg->body = g_mime_message_get_body (g_m_message, TRUE, &is_html); + mail_msg->body = tracker_mime_message_get_body (g_m_message, TRUE, &is_html); mail_msg->content_type = g_strdup (is_html ? "text/html" : "text/plain"); if (read_mail_helper) { @@ -549,7 +667,7 @@ email_mail_file_parse_next (MailFile *mf mail_msg->attachments = NULL; /* find then save attachments in sys tmp directory of Tracker and save entries in MailMessage struct */ - g_mime_message_foreach_part (g_m_message, find_attachment, mail_msg); + g_mime_message_foreach (g_m_message, find_attachment, mail_msg); g_object_unref (g_m_message); @@ -786,23 +904,23 @@ email_decode_mail_attachment_to_file (co return FALSE; } - filtered_stream = g_mime_stream_filter_new_with_stream (stream_src); + filtered_stream = g_mime_stream_filter_new (stream_src); switch (encoding) { case MIME_ENCODING_BASE64: - filter = g_mime_filter_basic_new_type (GMIME_FILTER_BASIC_BASE64_DEC); + filter = g_mime_filter_basic_new (GMIME_CONTENT_ENCODING_BASE64, FALSE); g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), filter); g_object_unref (filter); break; case MIME_ENCODING_QUOTEDPRINTABLE: - filter = g_mime_filter_basic_new_type (GMIME_FILTER_BASIC_QP_DEC); + filter = g_mime_filter_basic_new (GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE, FALSE); g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), filter); g_object_unref (filter); break; case MIME_ENCODING_UUENCODE: - filter = g_mime_filter_basic_new_type (GMIME_FILTER_BASIC_UU_ENC); + filter = g_mime_filter_basic_new (GMIME_CONTENT_ENCODING_UUENCODE, TRUE); g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), filter); g_object_unref (filter); break; @@ -913,7 +1031,7 @@ new_gmime_stream_from_file (const gchar static GSList * add_gmime_references (GSList *list, GMimeMessage *message, const gchar *header) { - const gchar *tmp = g_mime_message_get_header (message, header); + const gchar *tmp = g_mime_object_get_header (GMIME_OBJECT (message), header); if (tmp) { GMimeReferences *refs; @@ -937,15 +1055,21 @@ add_gmime_references (GSList *list, GMim static GSList * -add_recipients (GSList *list, GMimeMessage *message, const gchar *type) +add_recipients (GSList *list, GMimeMessage *message, GMimeRecipientType type) { - const InternetAddressList *addrs_list; + InternetAddressList *addrs_list; + int i, count; - for (addrs_list = g_mime_message_get_recipients (message, type); addrs_list; addrs_list = addrs_list->next) { + addrs_list = g_mime_message_get_recipients (message, type); + count = internet_address_list_length (addrs_list); + for (i = 0; i < count; i++) { + InternetAddress *addr; MailPerson *mp = email_allocate_mail_person (); - mp->name = g_strdup (addrs_list->address->name); - mp->addr = g_strdup (addrs_list->address->value.addr); + addr = internet_address_list_get_address (addrs_list, i); + + mp->name = g_strdup (internet_address_get_name (addr)); + mp->addr = g_strdup (internet_address_to_string (addr, FALSE)); list = g_slist_prepend (list, mp); } @@ -955,7 +1079,7 @@ add_recipients (GSList *list, GMimeMessa static void -find_attachment (GMimeObject *obj, gpointer data) +find_attachment (GMimeObject *parent, GMimeObject *obj, gpointer data) { GMimePart *part; MailMessage *mail_msg; @@ -969,8 +1093,8 @@ find_attachment (GMimeObject *obj, gpoin GMimeMessage *g_msg = g_mime_message_part_get_message (GMIME_MESSAGE_PART (obj)); if (g_msg) { - g_mime_message_foreach_part (g_msg, find_attachment, data); - g_object_unref (g_msg); + g_mime_message_foreach (g_msg, find_attachment, data); + g_object_unref (obj); } return; @@ -987,20 +1111,20 @@ find_attachment (GMimeObject *obj, gpoin mail_msg = data; - content_disposition = g_mime_part_get_content_disposition (part); + content_disposition = g_mime_object_get_disposition (obj); /* test whether it is a mail attachment */ if (content_disposition && (strcmp (content_disposition, GMIME_DISPOSITION_ATTACHMENT) == 0 || strcmp (content_disposition, GMIME_DISPOSITION_INLINE) == 0)) { - const GMimeContentType *content_type; + GMimeContentType *content_type; MailAttachment *ma; const gchar *filename; gchar *attachment_uri; gint fd; - if (! (content_type = g_mime_part_get_content_type (part))) + if (! (content_type = g_mime_object_get_content_type (obj))) return; filename = g_mime_part_get_filename (part); --- tracker-0.6.6.old/configure.ac 2008-03-03 04:13:34.000000000 +0000 +++ tracker-0.6.6/configure.ac 2008-12-15 21:10:17.000000000 +0000 @@ -65,7 +65,7 @@ AC_SUBST(PANGO_CFLAGS) AC_SUBST(PANGO_LIBS) # Check for GMime -PKG_CHECK_MODULES(GMIME, [ gmime-2.0 >= $GMIME_REQUIRED ]) +PKG_CHECK_MODULES(GMIME, [ gmime-2.4 >= $GMIME_REQUIRED ]) AC_SUBST(GMIME_CFLAGS) AC_SUBST(GMIME_LIBS)