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