15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Copyright (C) 2000 Harri Porten (porten@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Copyright (C) 2000 Daniel Molkentin (molkentin@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Copyright (C) 2000 Stefan Schimanski (schimmi@kde.org) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All Rights Reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) This library is free software; you can redistribute it and/or 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) modify it under the terms of the GNU Library General Public 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) License as published by the Free Software Foundation; either 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) version 2 of the License, or (at your option) any later version. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) This library is distributed in the hope that it will be useful, 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) but WITHOUT ANY WARRANTY; without even the implied warranty of 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Library General Public License for more details. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) You should have received a copy of the GNU Library General Public License 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) along with this library; see the file COPYING.LIB. If not, write to 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Boston, MA 02110-1301, USA. 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/plugins/PluginData.h" 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/plugins/PluginListBuilder.h" 285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class PluginCache { 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)public: 3451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) PluginCache() : m_loaded(false), m_refresh(false) { } 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ~PluginCache() { reset(false); } 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void reset(bool refresh) 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_plugins.clear(); 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_loaded = false; 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_refresh = refresh; 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const Vector<PluginInfo>& plugins() 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!m_loaded) { 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) PluginListBuilder builder(&m_plugins); 4851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) blink::Platform::current()->getPluginList(m_refresh, &builder); 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_loaded = true; 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_refresh = false; 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return m_plugins; 5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)private: 5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<PluginInfo> m_plugins; 5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) bool m_loaded; 5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) bool m_refresh; 5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}; 6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static PluginCache& pluginCache() 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) DEFINE_STATIC_LOCAL(PluginCache, cache, ()); 6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return cache; 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PluginData::PluginData(const Page* page) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) initPlugins(page); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < m_plugins.size(); ++i) { 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const PluginInfo& plugin = m_plugins[i]; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned j = 0; j < plugin.mimes.size(); ++j) { 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_mimes.append(plugin.mimes[j]); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_mimePluginIndices.append(i); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool PluginData::supportsMimeType(const String& mimeType) const 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < m_mimes.size(); ++i) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mimes[i].type == mimeType) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const PluginInfo* PluginData::pluginInfoForMimeType(const String& mimeType) const 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < m_mimes.size(); ++i) { 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MimeClassInfo& info = m_mimes[i]; 9202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (info.type == mimeType) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return &m_plugins[m_mimePluginIndices[i]]; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String PluginData::pluginNameForMimeType(const String& mimeType) const 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (const PluginInfo* info = pluginInfoForMimeType(mimeType)) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info->name; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String(); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String PluginData::pluginFileForMimeType(const String& mimeType) const 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (const PluginInfo* info = pluginInfoForMimeType(mimeType)) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info->file; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void PluginData::initPlugins(const Page*) 11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 11653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const Vector<PluginInfo>& plugins = pluginCache().plugins(); 11753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < plugins.size(); ++i) 11853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_plugins.append(plugins[i]); 11953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 12053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void PluginData::refresh() 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) pluginCache().reset(true); 12453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) pluginCache().plugins(); // Force the plugins to be reloaded now. 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)String getPluginMimeTypeFromExtension(const String& extension) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const Vector<PluginInfo>& plugins = pluginCache().plugins(); 13053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < plugins.size(); ++i) { 13153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t j = 0; j < plugins[i].mimes.size(); ++j) { 13253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const MimeClassInfo& mime = plugins[i].mimes[j]; 13353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const Vector<String>& extensions = mime.extensions; 13453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t k = 0; k < extensions.size(); ++k) { 13553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (extension == extensions[k]) 13653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return mime.type; 13753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 13853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 13953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 14053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return String(); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 144