15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/platform_mime_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/android/network_library.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/nix/mime_util_xdg.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PlatformMimeUtil::GetPlatformMimeTypeFromExtension( 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& ext, std::string* result) const { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return android::GetMimeTypeFromExtension(ext, result); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PlatformMimeUtil::GetPlatformMimeTypeFromExtension( 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& ext, std::string* result) const { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(thestig): This is a temporary hack until we can fix this 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly in test shell / webkit. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to play dumb and not return application/x-perl here 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to make the reload-subframe-object layout test happy. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ext == "pl") 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dummy_path("foo." + ext); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string out = base::nix::GetFileMimeType(dummy_path); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetFileMimeType likes to return application/octet-stream 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for everything it doesn't know - ignore that. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out == "application/octet-stream" || out.empty()) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetFileMimeType returns image/x-ico because that's what's in the XDG 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mime database. That database is the merger of the Gnome and KDE mime 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // databases. Apparently someone working on KDE in 2001 decided .ico 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resolves to image/x-ico, whereas the rest of the world uses image/x-icon. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FWIW, image/vnd.microsoft.icon is the official IANA assignment. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out == "image/x-ico") 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out = "image/x-icon"; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = out; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_ANDROID) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MimeToExt { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* mime_type; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* ext; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const struct MimeToExt mime_type_ext_map[] = { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"application/pdf", "pdf"}, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"application/x-tar", "tar"}, 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) {"application/zip", "zip"}, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"audio/mpeg", "mp3"}, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"image/gif", "gif"}, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"image/jpeg", "jpg"}, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"image/png", "png"}, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"text/html", "html"}, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"video/mp4", "mp4"}, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"video/mpeg", "mpg"}, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"text/plain", "txt"}, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"text/x-sh", "sh"}, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PlatformMimeUtil::GetPreferredExtensionForMimeType( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& mime_type, base::FilePath::StringType* ext) const { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t x = 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x < (sizeof(mime_type_ext_map) / sizeof(MimeToExt)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x++) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mime_type_ext_map[x].mime_type == mime_type) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ext = mime_type_ext_map[x].ext; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dhg): Fix this the right way by implementing what's said below. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unlike GetPlatformMimeTypeFromExtension, this method doesn't have a 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default list that it uses, but for now we are also returning false since 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this doesn't really matter as much under Linux. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we wanted to do this properly, we would read the mime.cache file which 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has a section where they assign a glob (*.gif) to a mimetype 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (image/gif). We look up the "heaviest" glob for a certain mime type and 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then then try to chop off "*.". 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformMimeUtil::GetPlatformExtensionsForMimeType( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::hash_set<base::FilePath::StringType>* extensions) const { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType ext; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetPreferredExtensionForMimeType(mime_type, &ext)) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions->insert(ext); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 111