From 105df4c61a392cd57d34c2692d02148dc5726958 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Sat, 23 Oct 2010 16:28:07 +0000 Subject: [PATCH] It turns out that not every android release has a good extension to mimetype mapping. restore our previous hardcoded mime database as a fallback --- .../fsck/k9/mail/internet/MimeUtility.java | 230 +++++++++++++++++- 1 file changed, 219 insertions(+), 11 deletions(-) diff --git a/src/com/fsck/k9/mail/internet/MimeUtility.java b/src/com/fsck/k9/mail/internet/MimeUtility.java index 385e0ebf4..4b9ed167c 100644 --- a/src/com/fsck/k9/mail/internet/MimeUtility.java +++ b/src/com/fsck/k9/mail/internet/MimeUtility.java @@ -22,6 +22,207 @@ public class MimeUtility { public static final String DEFAULT_ATTACHMENT_MIME_TYPE = "application/octet-stream"; + + + /* + * http://www.w3schools.com/media/media_mimeref.asp + * + png + */ + public static final String[][] MIME_TYPE_BY_EXTENSION_MAP = new String[][] + { + { "", "application/octet-stream" }, + { "323", "text/h323"}, + { "acx", "application/internet-property-stream"}, + { "ai", "application/postscript"}, + { "aif", "audio/x-aiff"}, + { "aifc", "audio/x-aiff"}, + { "aiff", "audio/x-aiff"}, + { "asf", "video/x-ms-asf"}, + { "asr", "video/x-ms-asf"}, + { "asx", "video/x-ms-asf"}, + { "au", "audio/basic"}, + { "avi", "video/x-msvideo"}, + { "axs", "application/olescript"}, + { "bas", "text/plain"}, + { "bcpio", "application/x-bcpio"}, + { "bin", "application/octet-stream"}, + { "bmp", "image/bmp"}, + { "c", "text/plain"}, + { "cat", "application/vnd.ms-pkiseccat"}, + { "cdf", "application/x-cdf"}, + { "cer", "application/x-x509-ca-cert"}, + { "class", "application/octet-stream"}, + { "clp", "application/x-msclip"}, + { "cmx", "image/x-cmx"}, + { "cod", "image/cis-cod"}, + { "cpio", "application/x-cpio"}, + { "crd", "application/x-mscardfile"}, + { "crl", "application/pkix-crl"}, + { "crt", "application/x-x509-ca-cert"}, + { "csh", "application/x-csh"}, + { "css", "text/css"}, + { "dcr", "application/x-director"}, + { "der", "application/x-x509-ca-cert"}, + { "dir", "application/x-director"}, + { "dll", "application/x-msdownload"}, + { "dms", "application/octet-stream"}, + { "doc", "application/msword"}, + { "dot", "application/msword"}, + { "dvi", "application/x-dvi"}, + { "dxr", "application/x-director"}, + { "eps", "application/postscript"}, + { "etx", "text/x-setext"}, + { "evy", "application/envoy"}, + { "exe", "application/octet-stream"}, + { "fif", "application/fractals"}, + { "flr", "x-world/x-vrml"}, + { "gif", "image/gif"}, + { "gtar", "application/x-gtar"}, + { "gz", "application/x-gzip"}, + { "h", "text/plain"}, + { "hdf", "application/x-hdf"}, + { "hlp", "application/winhlp"}, + { "hqx", "application/mac-binhex40"}, + { "hta", "application/hta"}, + { "htc", "text/x-component"}, + { "htm", "text/html"}, + { "html", "text/html"}, + { "htt", "text/webviewhtml"}, + { "ico", "image/x-icon"}, + { "ief", "image/ief"}, + { "iii", "application/x-iphone"}, + { "ins", "application/x-internet-signup"}, + { "isp", "application/x-internet-signup"}, + { "jfif", "image/pipeg"}, + { "jpe", "image/jpeg"}, + { "jpeg", "image/jpeg"}, + { "jpg", "image/jpeg"}, + { "js", "application/x-javascript"}, + { "latex", "application/x-latex"}, + { "lha", "application/octet-stream"}, + { "lsf", "video/x-la-asf"}, + { "lsx", "video/x-la-asf"}, + { "lzh", "application/octet-stream"}, + { "m13", "application/x-msmediaview"}, + { "m14", "application/x-msmediaview"}, + { "m3u", "audio/x-mpegurl"}, + { "man", "application/x-troff-man"}, + { "mdb", "application/x-msaccess"}, + { "me", "application/x-troff-me"}, + { "mht", "message/rfc822"}, + { "mhtml", "message/rfc822"}, + { "mid", "audio/mid"}, + { "mny", "application/x-msmoney"}, + { "mov", "video/quicktime"}, + { "movie", "video/x-sgi-movie"}, + { "mp2", "video/mpeg"}, + { "mp3", "audio/mpeg"}, + { "mpa", "video/mpeg"}, + { "mpe", "video/mpeg"}, + { "mpeg", "video/mpeg"}, + { "mpg", "video/mpeg"}, + { "mpp", "application/vnd.ms-project"}, + { "mpv2", "video/mpeg"}, + { "ms", "application/x-troff-ms"}, + { "mvb", "application/x-msmediaview"}, + { "nws", "message/rfc822"}, + { "oda", "application/oda"}, + { "p10", "application/pkcs10"}, + { "p12", "application/x-pkcs12"}, + { "p7b", "application/x-pkcs7-certificates"}, + { "p7c", "application/x-pkcs7-mime"}, + { "p7m", "application/x-pkcs7-mime"}, + { "p7r", "application/x-pkcs7-certreqresp"}, + { "p7s", "application/x-pkcs7-signature"}, + { "pbm", "image/x-portable-bitmap"}, + { "pdf", "application/pdf"}, + { "pfx", "application/x-pkcs12"}, + { "pgm", "image/x-portable-graymap"}, + { "pko", "application/ynd.ms-pkipko"}, + { "pma", "application/x-perfmon"}, + { "pmc", "application/x-perfmon"}, + { "pml", "application/x-perfmon"}, + { "pmr", "application/x-perfmon"}, + { "pmw", "application/x-perfmon"}, + { "png", "image/png"}, + { "pnm", "image/x-portable-anymap"}, + { "pot,", "application/vnd.ms-powerpoint"}, + { "ppm", "image/x-portable-pixmap"}, + { "pps", "application/vnd.ms-powerpoint"}, + { "ppt", "application/vnd.ms-powerpoint"}, + { "prf", "application/pics-rules"}, + { "ps", "application/postscript"}, + { "pub", "application/x-mspublisher"}, + { "qt", "video/quicktime"}, + { "ra", "audio/x-pn-realaudio"}, + { "ram", "audio/x-pn-realaudio"}, + { "ras", "image/x-cmu-raster"}, + { "rgb", "image/x-rgb"}, + { "rmi", "audio/mid"}, + { "roff", "application/x-troff"}, + { "rtf", "application/rtf"}, + { "rtx", "text/richtext"}, + { "scd", "application/x-msschedule"}, + { "sct", "text/scriptlet"}, + { "setpay", "application/set-payment-initiation"}, + { "setreg", "application/set-registration-initiation"}, + { "sh", "application/x-sh"}, + { "shar", "application/x-shar"}, + { "sit", "application/x-stuffit"}, + { "snd", "audio/basic"}, + { "spc", "application/x-pkcs7-certificates"}, + { "spl", "application/futuresplash"}, + { "src", "application/x-wais-source"}, + { "sst", "application/vnd.ms-pkicertstore"}, + { "stl", "application/vnd.ms-pkistl"}, + { "stm", "text/html"}, + { "svg", "image/svg+xml"}, + { "sv4cpio","application/x-sv4cpio"}, + { "sv4crc", "application/x-sv4crc"}, + { "swf", "application/x-shockwave-flash"}, + { "t", "application/x-troff"}, + { "tar", "application/x-tar"}, + { "tcl", "application/x-tcl"}, + { "tex", "application/x-tex"}, + { "texi", "application/x-texinfo"}, + { "texinfo","application/x-texinfo"}, + { "tgz", "application/x-compressed"}, + { "tif", "image/tiff"}, + { "tiff", "image/tiff"}, + { "tr", "application/x-troff"}, + { "trm", "application/x-msterminal"}, + { "tsv", "text/tab-separated-values"}, + { "txt", "text/plain"}, + { "uls", "text/iuls"}, + { "ustar", "application/x-ustar"}, + { "vcf", "text/x-vcard"}, + { "vrml", "x-world/x-vrml"}, + { "wav", "audio/x-wav"}, + { "wcm", "application/vnd.ms-works"}, + { "wdb", "application/vnd.ms-works"}, + { "wks", "application/vnd.ms-works"}, + { "wmf", "application/x-msmetafile"}, + { "wps", "application/vnd.ms-works"}, + { "wri", "application/x-mswrite"}, + { "wrl", "x-world/x-vrml"}, + { "wrz", "x-world/x-vrml"}, + { "xaf", "x-world/x-vrml"}, + { "xbm", "image/x-xbitmap"}, + { "xla", "application/vnd.ms-excel"}, + { "xlc", "application/vnd.ms-excel"}, + { "xlm", "application/vnd.ms-excel"}, + { "xls", "application/vnd.ms-excel"}, + { "xlt", "application/vnd.ms-excel"}, + { "xlw", "application/vnd.ms-excel"}, + { "xof", "x-world/x-vrml"}, + { "xpm", "image/x-xpixmap"}, + { "xwd", "image/x-xwindowdump"}, + { "z", "application/x-compress"}, + { "zip", "application/zip"} + }; + + + public static String unfold(String s) { if (s == null) @@ -235,8 +436,7 @@ public class MimeUtility */ public static boolean mimeTypeMatches(String mimeType, String matchAgainst) { - Pattern p = Pattern.compile(matchAgainst.replaceAll("\\*", "\\.\\*"), - Pattern.CASE_INSENSITIVE); + Pattern p = Pattern.compile(matchAgainst.replaceAll("\\*", "\\.\\*"), Pattern.CASE_INSENSITIVE); return p.matcher(mimeType).matches(); } @@ -271,7 +471,7 @@ public class MimeUtility if (contentTransferEncoding != null) { contentTransferEncoding = - MimeUtility.getHeaderParameter(contentTransferEncoding, null); + MimeUtility.getHeaderParameter(contentTransferEncoding, null); if ("quoted-printable".equalsIgnoreCase(contentTransferEncoding)) { in = new QuotedPrintableInputStream(in); @@ -300,7 +500,7 @@ public class MimeUtility * @throws MessagingException */ public static void collectParts(Part part, ArrayList viewables, - ArrayList attachments) throws MessagingException + ArrayList attachments) throws MessagingException { /* * If the part is Multipart but not alternative it's either mixed or @@ -354,8 +554,7 @@ public class MimeUtility /* * A best guess that this part is intended to be an attachment and not inline. */ - boolean attachment = ("attachment".equalsIgnoreCase(dispositionType) - || (dispositionFilename != null)); + boolean attachment = ("attachment".equalsIgnoreCase(dispositionType) || (dispositionFilename != null)); if ((!attachment) && (part.getMimeType().equalsIgnoreCase("text/html"))) { @@ -382,20 +581,29 @@ public class MimeUtility public static String getMimeTypeByExtension(String filename) { String returnedType = null; - if (filename != null - && filename.lastIndexOf('.') != -1) + String extension = null; + + if (filename != null && filename.lastIndexOf('.') != -1) { - String extension = filename.substring(filename.lastIndexOf('.')+1).toLowerCase(); + extension = filename.substring(filename.lastIndexOf('.')+1).toLowerCase(); returnedType = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } if (returnedType != null) { return returnedType; } - else + else if (extension != null) { - return DEFAULT_ATTACHMENT_MIME_TYPE; + for (String[] contentTypeMapEntry : MIME_TYPE_BY_EXTENSION_MAP) + { + if (contentTypeMapEntry[0].equals(extension)) + { + return contentTypeMapEntry[1]; + } + } } + + return DEFAULT_ATTACHMENT_MIME_TYPE; }