Updating branch refs/heads/master to 459b807035f31ada628516d90e361a49174a57fc (commit) from 48e82afe7ec5f175fb10105db5b4489a39208ebd (commit)
commit 459b807035f31ada628516d90e361a49174a57fc Author: Christian Dywan <christ...@twotoasts.de> Date: Mon Jul 19 22:42:19 2010 +0200 Refactor content type parsing and handle inner boundaries For now, nested message parts are simply appended. Also watch out for '; ' as opposed to ';' at line endings. postler/postler-content.vala | 121 ++++++++++++++++++++++++------------------ 1 files changed, 70 insertions(+), 51 deletions(-) diff --git a/postler/postler-content.vala b/postler/postler-content.vala index f911131..172daa0 100644 --- a/postler/postler-content.vala +++ b/postler/postler-content.vala @@ -366,6 +366,33 @@ public class Postler.Content : WebKit.WebView { return true; } + static void parse_content_type (string? content_type, ref string charset, + ref string boundary, ref string mime_type) { + + if (content_type == null) + return; + + string[] parts = content_type.split_set ("; "); + string filename = null; + foreach (var part in parts) { + if (part.has_prefix ("charset=")) + charset = part.substring (8, part.length - 8); + else if (part.has_prefix ("name=")) + filename = part.substring (5, part.length - 5); + else if (part.has_prefix ("boundary=")) + boundary = part.substring (9, part.length - 9); + else if (part != "" && !part.contains ("=")) + mime_type = ascii_strdown (part); + } + + if (mime_type == "application/octet-stream" && filename != null) { + filename = filename.replace ("\"", " ").strip (); + uchar[] data = {}; + bool uncertain; + mime_type = g_content_type_guess (filename, data, out uncertain); + } + } + public bool display (string location) { last_location = location; subject = _("(No subject)"); @@ -397,17 +424,9 @@ public class Postler.Content : WebKit.WebView { body.append (line + "\n"); } - if (content_type != null) { - parts = content_type.split_set ("; "); - foreach (var part in parts) { - if (part.has_prefix ("charset=")) - charset = part.substring (8, part.length - 8); - else if (part != "" && !part.contains ("=")) - mime_type = ascii_strdown (part); - } - } - if (charset == null) - charset = default_charset; + string? boundary = null; + parse_content_type (content_type, ref charset, ref boundary, + ref mime_type); /* FIXME view_source_mode requires WebKitGTK+ 1.1.something */ set_view_source_mode (true); @@ -431,7 +450,9 @@ public class Postler.Content : WebKit.WebView { while ((line = stream.read_line (null, null)) != null) { if (line == "") break; - if (line.has_suffix (",") || line.has_suffix (";")) { + if (line.has_suffix (",") + || line.has_suffix (";") + || line.has_suffix ("; ")) { previous_line += line; continue; } @@ -515,29 +536,8 @@ public class Postler.Content : WebKit.WebView { if (reply != "") reply = linkify_address (reply, arguments); - string boundary = null; - if (content_type != null) { - parts = content_type.split_set ("; "); - string filename = null; - foreach (var part in parts) { - if (part.has_prefix ("charset=")) - charset = part.substring (8, part.length - 8); - else if (part.has_prefix ("name=")) - filename = part.substring (5, part.length - 5); - else if (part.has_prefix ("boundary=")) - boundary = part.substring (9, part.length - 9); - else if (part != "" && !part.contains ("=")) - mime_type = ascii_strdown (part); - } - - if (mime_type == "application/octet-stream" && filename != null) { - filename = filename.replace ("\"", " ").strip (); - uchar[] data = {}; - bool uncertain; - mime_type = g_content_type_guess (filename, - data, out uncertain); - } - } + string? boundary = null; + parse_content_type (content_type, ref charset, ref boundary, ref mime_type); uint multipart = mime_type.has_prefix ("multipart/") ? 1 : 0; if (multipart > 0 && boundary != null) @@ -564,10 +564,20 @@ public class Postler.Content : WebKit.WebView { bool plain_text = mime_type == "text/plain"; bool in_quote = false; bool in_signature = false; + string inner_boundary = ""; while ((line = stream.read_line (null, null)) != null) { if (multipart > 0) { if (line.has_prefix ("--")) { - if (line == "--" + boundary) { + if (line == "--" + inner_boundary) { + body += new GLib.StringBuilder (); + mime_types += "text/plain"; + plain_text = true; + body_parts++; + multipart = 2; + continue; + } else if (line == "--" + boundary) { + /* TODO: Merge inner text parts */ + inner_boundary = ""; body += new GLib.StringBuilder (); mime_types += "text/plain"; plain_text = true; @@ -577,21 +587,30 @@ public class Postler.Content : WebKit.WebView { } } else if (multipart == 2) { - parts = line.split (":", 2); - if (parts[0] != null) { - string field = ascii_strdown (parts[0]); - if (field == "content-type") { - string ctype = parts[1].strip (); - parts = ctype.split_set ("; "); - mime_types[body_parts] = ascii_strdown (parts[0].strip ()); - if (mime_types[body_parts] != "text/plain") - plain_text = false; - continue; - } - else if (field == "content-transfer-encoding") { - /* TODO: Handle encoding */ - continue; - } + /* Content-Type can span over multiple lines */ + if (mime_types[body_parts].has_suffix (";")) + parts = { "content-type", + mime_types[body_parts] + line }; + else + parts = line.split (":", 2); + + string field = ascii_strdown (parts[0] ?? ""); + if (field == "content-type") { + string cset = default_charset; + string mtype = "text/plain"; + parse_content_type (parts[1].strip (), ref cset, + ref inner_boundary, ref mtype); + + if (line.chomp ().has_suffix (";")) + mtype += ";"; + if (mtype != "text/plain") + plain_text = false; + mime_types[body_parts] = mtype; + continue; + } + else if (field == "content-transfer-encoding") { + /* TODO: Handle encoding */ + continue; } } else if (multipart == 1) _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits