aboutsummaryrefslogtreecommitdiff
path: root/libsylph
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2013-09-13 09:13:15 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2013-09-13 09:13:15 +0000
commit9b801d5b1903a5f7939bb9b0cb68d0058217f668 (patch)
tree922994cc41ec3e00b6f4d1b0133c2178e2a3f76a /libsylph
parentaf662f794d118ff080b616c5315b3a1f831fb4a3 (diff)
distinguish icon for HTML mail and other mail with attachments on summaryview (#84).
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@3281 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'libsylph')
-rw-r--r--libsylph/procheader.c33
-rw-r--r--libsylph/procmime.c28
-rw-r--r--libsylph/procmime.h1
-rw-r--r--libsylph/procmsg.h4
4 files changed, 62 insertions, 4 deletions
diff --git a/libsylph/procheader.c b/libsylph/procheader.c
index a06ac701..93ef99e7 100644
--- a/libsylph/procheader.c
+++ b/libsylph/procheader.c
@@ -688,9 +688,14 @@ MsgInfo *procheader_parse_stream(FILE *fp, MsgFlags flags, gboolean full)
case H_CONTENT_TYPE:
if (!g_ascii_strncasecmp(hp, "multipart", 9)) {
MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MIME);
- } else if (!charset) {
- procmime_scan_content_type_str
- (hp, NULL, &charset, NULL, NULL);
+ } else {
+ if (!g_ascii_strncasecmp(hp, "text/html", 9)) {
+ MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MIME_HTML);
+ }
+ if (!charset) {
+ procmime_scan_content_type_str
+ (hp, NULL, &charset, NULL, NULL);
+ }
}
break;
case H_SEEN:
@@ -740,6 +745,28 @@ MsgInfo *procheader_parse_stream(FILE *fp, MsgFlags flags, gboolean full)
msginfo->inreplyto =
g_strdup((gchar *)msginfo->references->data);
+ if (MSG_IS_MIME(msginfo->flags)) {
+ MimeInfo *mimeinfo, *part;
+ gboolean has_html = FALSE;
+
+ part = mimeinfo = procmime_scan_message_stream(fp);
+ while (part) {
+ if (part->mime_type != MIME_TEXT &&
+ part->mime_type != MIME_TEXT_HTML &&
+ part->mime_type != MIME_MULTIPART)
+ break;
+ if (part->mime_type == MIME_TEXT_HTML)
+ has_html = TRUE;
+ part = procmime_mimeinfo_next(part);
+ }
+
+ if (has_html && !part) {
+ MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MIME_HTML);
+ }
+
+ procmime_mimeinfo_free_all(mimeinfo);
+ }
+
g_free(charset);
return msginfo;
diff --git a/libsylph/procmime.c b/libsylph/procmime.c
index e2c7fdb4..9c5020a2 100644
--- a/libsylph/procmime.c
+++ b/libsylph/procmime.c
@@ -210,6 +210,34 @@ MimeInfo *procmime_scan_message(MsgInfo *msginfo)
return mimeinfo;
}
+MimeInfo *procmime_scan_message_stream(FILE *fp)
+{
+ MimeInfo *mimeinfo;
+ glong fpos;
+
+ g_return_val_if_fail(fp != NULL, NULL);
+
+ if (fseek(fp, 0L, SEEK_SET) < 0) {
+ FILE_OP_ERROR("procmime_scan_message_stream()", "fseek");
+ return NULL;
+ }
+
+ mimeinfo = procmime_scan_mime_header(fp);
+
+ if (mimeinfo) {
+ fpos = ftell(fp);
+ mimeinfo->content_size = get_left_file_size(fp);
+ mimeinfo->size = fpos + mimeinfo->content_size;
+ if (mimeinfo->encoding_type == ENC_BASE64)
+ mimeinfo->content_size = mimeinfo->content_size / 4 * 3;
+ if (mimeinfo->mime_type == MIME_MULTIPART ||
+ mimeinfo->mime_type == MIME_MESSAGE_RFC822)
+ procmime_scan_multipart_message(mimeinfo, fp);
+ }
+
+ return mimeinfo;
+}
+
void procmime_scan_multipart_message(MimeInfo *mimeinfo, FILE *fp)
{
gchar *p;
diff --git a/libsylph/procmime.h b/libsylph/procmime.h
index a439ed1e..1247601d 100644
--- a/libsylph/procmime.h
+++ b/libsylph/procmime.h
@@ -142,6 +142,7 @@ void procmime_mimeinfo_replace (MimeInfo *old,
MimeInfo *procmime_mimeinfo_next (MimeInfo *mimeinfo);
MimeInfo *procmime_scan_message (MsgInfo *msginfo);
+MimeInfo *procmime_scan_message_stream (FILE *fp);
void procmime_scan_multipart_message (MimeInfo *mimeinfo,
FILE *fp);
diff --git a/libsylph/procmsg.h b/libsylph/procmsg.h
index 92a6be8b..a309bc8d 100644
--- a/libsylph/procmsg.h
+++ b/libsylph/procmsg.h
@@ -89,13 +89,14 @@ typedef guint32 MsgPermFlags;
#define MSG_IMAP (1U << 19)
#define MSG_NEWS (1U << 20)
#define MSG_SIGNED (1U << 21)
+#define MSG_MIME_HTML (1U << 26)
#define MSG_FLAG_CHANGED (1U << 27)
#define MSG_CACHED (1U << 28)
#define MSG_MIME (1U << 29)
#define MSG_INVALID (1U << 30)
#define MSG_RECEIVED (1U << 31)
-#define MSG_CACHED_FLAG_MASK (MSG_MIME)
+#define MSG_CACHED_FLAG_MASK (MSG_MIME|MSG_MIME_HTML)
typedef guint32 MsgTmpFlags;
@@ -131,6 +132,7 @@ typedef guint32 MsgTmpFlags;
#define MSG_IS_IMAP(msg) (((msg).tmp_flags & MSG_IMAP) != 0)
#define MSG_IS_NEWS(msg) (((msg).tmp_flags & MSG_NEWS) != 0)
#define MSG_IS_SIGNED(msg) (((msg).tmp_flags & MSG_SIGNED) != 0)
+#define MSG_IS_MIME_HTML(msg) (((msg).tmp_flags & MSG_MIME_HTML) != 0)
#define MSG_IS_FLAG_CHANGED(msg) (((msg).tmp_flags & MSG_FLAG_CHANGED) != 0)
#define MSG_IS_CACHED(msg) (((msg).tmp_flags & MSG_CACHED) != 0)
#define MSG_IS_MIME(msg) (((msg).tmp_flags & MSG_MIME) != 0)