18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebCoreURLResponse.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "MIMETypeRegistry.h" 332bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "WebCoreSystemInterface.h" 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <wtf/Assertions.h> 350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <wtf/RetainPtr.h> 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 372bde8e466a4451c7319e3a072d118917957d6554Steve Blocknamespace WebCore { 382bde8e466a4451c7319e3a072d118917957d6554Steve Block 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// <rdar://problem/5321972> Plain text document from HTTP server detected as application/octet-stream 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// When we sniff a resource as application/octet-stream but the http response headers had "text/plain", 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// we have a hard decision to make about which of the two generic MIME types to go with. 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// When the URL's extension is a known binary type, we'll go with application/octet-stream. 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// Otherwise, we'll trust the server. 442bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic CFSetRef createBinaryExtensionsSet() 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 462bde8e466a4451c7319e3a072d118917957d6554Steve Block CFStringRef extensions[] = { 472bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("3g2"), 482bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("3gp"), 492bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ai"), 502bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("aif"), 512bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("aifc"), 522bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("aiff"), 532bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("au"), 542bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("avi"), 552bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("bcpio"), 562bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("bin"), 572bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("bmp"), 582bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("boz"), 592bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("bpk"), 602bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("bz"), 612bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("bz2"), 622bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("chm"), 632bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("class"), 642bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("com"), 652bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("cpio"), 662bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dcr"), 672bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dir"), 682bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dist"), 692bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("distz"), 702bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dll"), 712bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dmg"), 722bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dms"), 732bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("doc"), 742bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dot"), 752bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dump"), 762bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dv"), 772bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dvi"), 782bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dxr"), 792bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("elc"), 802bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("eot"), 812bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("eps"), 822bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("exe"), 832bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fgd"), 842bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("gif"), 852bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("gtar"), 862bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("h261"), 872bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("h263"), 882bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("h264"), 892bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ico"), 902bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ims"), 912bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("indd"), 922bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("iso"), 932bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("jp2"), 942bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("jpe"), 952bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("jpeg"), 962bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("jpg"), 972bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("jpgm"), 982bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("jpgv"), 992bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("jpm"), 1002bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("kar"), 1012bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("kmz"), 1022bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("lha"), 1032bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("lrm"), 1042bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("lzh"), 1052bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m1v"), 1062bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m2a"), 1072bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m2v"), 1082bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m3a"), 1092bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m3u"), 1102bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m4a"), 1112bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m4p"), 1122bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m4v"), 1132bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mdb"), 1142bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mid"), 1152bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("midi"), 1162bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mj2"), 1172bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mjp2"), 1182bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mov"), 1192bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("movie"), 1202bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mp2"), 1212bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mp2a"), 1222bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mp3"), 1232bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mp4"), 1242bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mp4a"), 1252bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mp4s"), 1262bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mp4v"), 1272bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mpe"), 1282bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mpeg"), 1292bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mpg"), 1302bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mpg4"), 1312bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mpga"), 1322bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mpp"), 1332bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mpt"), 1342bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("msi"), 1352bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ogg"), 1362bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("otf"), 1372bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pct"), 1382bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pdf"), 1392bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pfa"), 1402bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pfb"), 1412bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pic"), 1422bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pict"), 1432bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pkg"), 1442bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("png"), 1452bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pot"), 1462bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pps"), 1472bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ppt"), 1482bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ps"), 1492bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("psd"), 1502bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qt"), 1512bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qti"), 1522bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qtif"), 1532bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qwd"), 1542bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qwt"), 1552bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qxb"), 1562bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qxd"), 1572bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qxl"), 1582bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qxp"), 1592bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("qxt"), 1602bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ra"), 1612bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ram"), 1622bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("rm"), 1632bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("rmi"), 1642bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("rmp"), 1652bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("scpt"), 1662bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("sit"), 1672bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("sitx"), 1682bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("snd"), 1692bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("so"), 1702bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("swf"), 1712bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("tar"), 1722bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("tif"), 1732bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("tiff"), 1742bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ttf"), 1752bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wav"), 1762bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wcm"), 1772bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wdb"), 1782bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wks"), 1792bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wm"), 1802bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wma"), 1812bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmd"), 1822bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmf"), 1832bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmv"), 1842bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmx"), 1852bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmz"), 1862bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wpd"), 1872bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wpl"), 1882bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wps"), 1892bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wvx"), 1902bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xla"), 1912bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xlc"), 1922bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xlm"), 1932bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xls"), 1942bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xlt"), 1952bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xlw"), 1962bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xps"), 1972bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("zip") 1982bde8e466a4451c7319e3a072d118917957d6554Steve Block }; 1992bde8e466a4451c7319e3a072d118917957d6554Steve Block return CFSetCreate(kCFAllocatorDefault, (const void **)&extensions, sizeof(extensions)/sizeof(CFStringRef), &kCFTypeSetCallBacks); 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// <rdar://problem/7007389> CoreTypes UTI map is missing 100+ file extensions that GateKeeper knew about 2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// When we disabled content sniffing for file URLs we caused problems with these 100+ extensions that CoreTypes 2040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// doesn't know about. 2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// If CoreTypes is ever brought up to speed we can remove this table and associated code. 2062bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic CFDictionaryRef createExtensionToMIMETypeMap() 2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2082bde8e466a4451c7319e3a072d118917957d6554Steve Block CFStringRef keys[] = { 2092bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ai"), 2102bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("asc"), 2112bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("bcpio"), 2122bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("bmp"), 2132bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("cdf"), 2142bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("class"), 2152bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("cpgz"), 2162bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("cpio"), 2172bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("cpt"), 2182bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("csh"), 2192bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("css"), 2202bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dcr"), 2212bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dir"), 2222bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dmg"), 2232bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dms"), 2242bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dvi"), 2252bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("dxr"), 2262bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("eps"), 2272bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("etx"), 2282bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ez"), 2292bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fdf"), 2302bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fla"), 2312bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fp"), 2322bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fp2"), 2332bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fp3"), 2342bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fp4"), 2352bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fp5"), 2362bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("fp6"), 2372bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("hdf"), 2382bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ice"), 2392bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ico"), 2402bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ics"), 2412bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ief"), 2422bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("iges"), 2432bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("igs"), 2442bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("iso"), 2452bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("jhtml"), 2462bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("latex"), 2472bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("lha"), 2482bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("lzh"), 2492bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m3u"), 2502bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("m4p"), 2512bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mac"), 2522bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("man"), 2532bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("me"), 2542bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mesh"), 2552bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mif"), 2562bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("movie"), 2572bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mp2"), 2582bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mpga"), 2592bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ms"), 2602bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("msh"), 2612bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("mxu"), 2622bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("nc"), 2632bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("oda"), 2642bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pbm"), 2652bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pcx"), 2662bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pdb"), 2672bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pgm"), 2682bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pgn"), 2692bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pls"), 2702bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pnm"), 2712bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pnt"), 2722bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("pntg"), 2732bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ppm"), 2742bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ras"), 2752bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("rgb"), 2762bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("roff"), 2772bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("rpm"), 2782bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("rtx"), 2792bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("sgm"), 2802bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("sgml"), 2812bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("sh"), 2822bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("shar"), 2832bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("silo"), 2842bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("skd"), 2852bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("skm"), 2862bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("skp"), 2872bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("skt"), 2882bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("smi"), 2892bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("so"), 2902bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("spl"), 2912bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("src"), 2922bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("sv4cpio"), 2932bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("sv4crc"), 2942bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("swf"), 2952bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("t"), 2962bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("targa"), 2972bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("tcl"), 2982bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("tex"), 2992bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("texi"), 3002bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("texinfo"), 3012bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("tgz"), 3022bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("torrent"), 3032bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("tr"), 3042bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("tsv"), 3052bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("ustar"), 3062bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("vcd"), 3072bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("vrml"), 3082bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wbmp"), 3092bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wbxml"), 3102bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("webarchive"), 3112bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmd"), 3122bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wml"), 3132bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmlc"), 3142bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmls"), 3152bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wmlsc"), 3162bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("wrl"), 3172bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xdp"), 3182bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xfd"), 3192bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xfdf"), 3202bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xpm"), 3212bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xsl"), 3222bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xwd"), 3232bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("xyz"), 3242bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("z") 3252bde8e466a4451c7319e3a072d118917957d6554Steve Block }; 3262bde8e466a4451c7319e3a072d118917957d6554Steve Block 3272bde8e466a4451c7319e3a072d118917957d6554Steve Block CFStringRef values[] = { 3282bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/postscript"), 3292bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/plain"), 3302bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-bcpio"), 3312bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/bmp"), 3322bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-netcdf"), 3332bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/octet-stream"), 3342bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-gzip"), 3352bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-cpio"), 3362bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/mac-compactpro"), 3372bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-csh"), 3382bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/css"), 3392bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-director"), 3402bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-director"), 3412bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-diskcopy"), 3422bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/octet-stream"), 3432bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-dvi"), 3442bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-director"), 3452bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/postscript"), 3462bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/x-setext"), 3472bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/andrew-inset"), 3482bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/vnd.fdf"), 3492bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/octet-stream"), 3502bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-filemaker"), 3512bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-filemaker"), 3522bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-filemaker"), 3532bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-filemaker"), 3542bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-filemaker"), 3552bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-filemaker"), 3562bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-hdf"), 3572bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("x-conference/x-cooltalk"), 3582bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-icon"), 3592bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/calendar"), 3602bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/ief"), 3612bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("model/iges"), 3622bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("model/iges"), 3632bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/octet-stream"), 3642bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/html"), 3652bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-latex"), 3662bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/octet-stream"), 3672bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/octet-stream"), 3682bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("audio/x-mpegurl"), 3692bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("audio/x-m4p"), 3702bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-macpaint"), 3712bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-troff-man"), 3722bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-troff-me"), 3732bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("model/mesh"), 3742bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/vnd.mif"), 3752bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("video/x-sgi-movie"), 3762bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("audio/mpeg"), 3772bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("audio/mpeg"), 3782bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-troff-ms"), 3792bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("model/mesh"), 3802bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("video/vnd.mpegurl"), 3812bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-netcdf"), 3822bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/oda"), 3832bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-portable-bitmap"), 3842bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-pcx"), 3852bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("chemical/x-pdb"), 3862bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-portable-graymap"), 3872bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-chess-pgn"), 3882bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("audio/scpls"), 3892bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-portable-anymap"), 3902bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-macpaint"), 3912bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-macpaint"), 3922bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-portable-pixmap"), 3932bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-cmu-raster"), 3942bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-rgb"), 3952bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-troff"), 3962bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("audio/x-pn-realaudio-plugin"), 3972bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/richtext"), 3982bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/sgml"), 3992bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/sgml"), 4002bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-sh"), 4012bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-shar"), 4022bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("model/mesh"), 4032bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-koan"), 4042bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-koan"), 4052bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-koan"), 4062bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-koan"), 4072bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-diskcopy"), 4082bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/octet-stream"), 4092bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-futuresplash"), 4102bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-wais-source"), 4112bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-sv4cpio"), 4122bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-sv4crc"), 4132bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-shockwave-flash"), 4142bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-troff"), 4152bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-targa"), 4162bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-tcl"), 4172bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-tex"), 4182bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-texinfo"), 4192bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-texinfo"), 4202bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-gzip"), 4212bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-bittorrent"), 4222bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-troff"), 4232bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/tab-separated-values"), 4242bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-ustar"), 4252bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-cdlink"), 4262bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("model/vrml"), 4272bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/vnd.wap.wbmp"), 4282bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/vnd.wap.wbxml"), 4292bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-webarchive"), 4302bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-ms-wmd"), 4312bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/vnd.wap.wml"), 4322bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/vnd.wap.wmlc"), 4332bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/vnd.wap.wmlscript"), 4342bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/vnd.wap.wmlscriptc"), 4352bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("model/vrml"), 4362bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/vnd.adobe.xdp+xml"), 4372bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/vnd.adobe.xfd+xml"), 4382bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/vnd.adobe.xfdf"), 4392bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-xpixmap"), 4402bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("text/xml"), 4412bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("image/x-xwindowdump"), 4422bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("chemical/x-xyz"), 4432bde8e466a4451c7319e3a072d118917957d6554Steve Block CFSTR("application/x-compress") 4442bde8e466a4451c7319e3a072d118917957d6554Steve Block }; 4452bde8e466a4451c7319e3a072d118917957d6554Steve Block 4462bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(sizeof(keys) == sizeof(values)); 4472bde8e466a4451c7319e3a072d118917957d6554Steve Block return CFDictionaryCreate(kCFAllocatorDefault, (const void**)&keys, (const void**)&values, sizeof(keys)/sizeof(CFStringRef), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 4480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4502bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic RetainPtr<CFStringRef> mimeTypeFromUTITree(CFStringRef uti) 4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Check if this UTI has a MIME type. 4530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RetainPtr<CFStringRef> mimeType(AdoptCF, UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)); 4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (mimeType) 4552bde8e466a4451c7319e3a072d118917957d6554Steve Block return mimeType.get(); 4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If not, walk the ancestory of this UTI via its "ConformsTo" tags and return the first MIME type we find. 4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RetainPtr<CFDictionaryRef> decl(AdoptCF, UTTypeCopyDeclaration(uti)); 4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!decl) 4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return nil; 4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CFTypeRef value = CFDictionaryGetValue(decl.get(), kUTTypeConformsToKey); 4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!value) 4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return nil; 4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CFTypeID typeID = CFGetTypeID(value); 4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (typeID == CFStringGetTypeID()) 4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return mimeTypeFromUTITree((CFStringRef)value); 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (typeID == CFArrayGetTypeID()) { 4700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CFArrayRef newTypes = (CFArrayRef)value; 4710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CFIndex count = CFArrayGetCount(newTypes); 4720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch for (CFIndex i = 0; i < count; ++i) { 4730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CFTypeRef object = CFArrayGetValueAtIndex(newTypes, i); 4740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (CFGetTypeID(object) != CFStringGetTypeID()) 4750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch continue; 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4772bde8e466a4451c7319e3a072d118917957d6554Steve Block if (RetainPtr<CFStringRef> mimeType = mimeTypeFromUTITree((CFStringRef)object)) 4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return mimeType; 4790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 4810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return nil; 4830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 4840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4852bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid adjustMIMETypeIfNecessary(CFURLResponseRef cfResponse) 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4872bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<CFStringRef> result = wkGetCFURLResponseMIMEType(cfResponse); 4882bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<CFStringRef> originalResult = result; 4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!result) { 4912bde8e466a4451c7319e3a072d118917957d6554Steve Block CFURLRef url = wkGetCFURLResponseURL(cfResponse); 4922bde8e466a4451c7319e3a072d118917957d6554Steve Block NSURL *nsURL = (NSURL *)url; 4932bde8e466a4451c7319e3a072d118917957d6554Steve Block if ([nsURL isFileURL]) { 4942bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<CFStringRef> extension(AdoptCF, CFURLCopyPathExtension(url)); 4952bde8e466a4451c7319e3a072d118917957d6554Steve Block if (extension) { 4960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // <rdar://problem/7007389> CoreTypes UTI map is missing 100+ file extensions that GateKeeper knew about 4970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // When this radar is resolved, we can remove this file:// url specific code. 4982bde8e466a4451c7319e3a072d118917957d6554Steve Block static CFDictionaryRef extensionMap = createExtensionToMIMETypeMap(); 4992bde8e466a4451c7319e3a072d118917957d6554Steve Block CFMutableStringRef mutableExtension = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, extension.get()); 5002bde8e466a4451c7319e3a072d118917957d6554Steve Block CFStringLowercase(mutableExtension, NULL); 5012bde8e466a4451c7319e3a072d118917957d6554Steve Block extension.adoptCF(mutableExtension); 5022bde8e466a4451c7319e3a072d118917957d6554Steve Block result = (CFStringRef) CFDictionaryGetValue(extensionMap, extension.get()); 5030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!result) { 5050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If the Gatekeeper-based map doesn't have a MIME type, we'll try to figure out what it should be by 5060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // looking up the file extension in the UTI maps. 5072bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<CFStringRef> uti(AdoptCF, UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, extension.get(), 0)); 5080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch result = mimeTypeFromUTITree(uti.get()); 5090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 5100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 5110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 5120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 5130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!result) { 5152bde8e466a4451c7319e3a072d118917957d6554Steve Block static CFStringRef defaultMIMETypeString = WebCore::defaultMIMEType().createCFString(); 5160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch result = defaultMIMETypeString; 5170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 5180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // <rdar://problem/5321972> Plain text document from HTTP server detected as application/octet-stream 5200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Make the best guess when deciding between "generic binary" and "generic text" using a table of known binary MIME types. 5212bde8e466a4451c7319e3a072d118917957d6554Steve Block if (CFStringCompare(result.get(), CFSTR("application/octet-stream"), 0) == kCFCompareEqualTo) { 5222bde8e466a4451c7319e3a072d118917957d6554Steve Block CFHTTPMessageRef message = wkGetCFURLResponseHTTPResponse(cfResponse); 5232bde8e466a4451c7319e3a072d118917957d6554Steve Block if (message) { 5242bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<CFStringRef> contentType(AdoptCF, CFHTTPMessageCopyHeaderFieldValue(message, CFSTR("Content-Type"))); 5252bde8e466a4451c7319e3a072d118917957d6554Steve Block if (contentType && CFStringHasPrefix(contentType.get(), CFSTR("text/plain"))) { 5262bde8e466a4451c7319e3a072d118917957d6554Steve Block static CFSetRef binaryExtensions = createBinaryExtensionsSet(); 5272bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<NSString> suggestedFilename(AdoptNS, (NSString *)wkCopyCFURLResponseSuggestedFilename(cfResponse)); 5282bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!CFSetContainsValue(binaryExtensions, (CFStringRef) [[suggestedFilename.get() pathExtension] lowercaseString])) 5292bde8e466a4451c7319e3a072d118917957d6554Steve Block result = CFSTR("text/plain"); 5302bde8e466a4451c7319e3a072d118917957d6554Steve Block } 5312bde8e466a4451c7319e3a072d118917957d6554Steve Block } 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifdef BUILDING_ON_LEOPARD 5350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Workaround for <rdar://problem/5539824> 5362bde8e466a4451c7319e3a072d118917957d6554Steve Block if (CFStringCompare(result.get(), CFSTR("text/xml"), 0) == kCFCompareEqualTo) 5372bde8e466a4451c7319e3a072d118917957d6554Steve Block result = CFSTR("application/xml"); 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 5390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 540231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (result != originalResult) 5412bde8e466a4451c7319e3a072d118917957d6554Steve Block wkSetCFURLResponseMIMEType(cfResponse, result.get()); 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5442bde8e466a4451c7319e3a072d118917957d6554Steve Block} 545