PluginPackageQt.cpp revision 5f1ab04193ad0130ca8204aadaceae083aca9881
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Collabora Ltd. All rights reserved. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 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 * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginPackage.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CString.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "npruntime_impl.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDatabase.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDebug.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginPackage::fetchInfo() 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!load()) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPP_GetValueProcPtr gv = (NPP_GetValueProcPtr)m_module->resolve("NP_GetValue"); 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project typedef char *(*NPP_GetMIMEDescriptionProcPtr)(); 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPP_GetMIMEDescriptionProcPtr gm = 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPP_GetMIMEDescriptionProcPtr)m_module->resolve("NP_GetMIMEDescription"); 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!gm || !gv) { 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char *buf = 0; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPError err = gv(0, NPPVpluginNameString, (void *)&buf); 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (err != NPERR_NO_ERROR) { 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_name = buf; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = gv(0, NPPVpluginDescriptionString, (void *)&buf); 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (err != NPERR_NO_ERROR) { 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_description = buf; 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project determineModuleVersionFromDescription(); 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String s = gm(); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<String> types; 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s.split(UChar(';'), false, types); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0; i < types.size(); ++i) { 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<String> mime; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project types[i].split(UChar(':'), true, mime); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mime.size() > 0) { 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<String> exts; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mime.size() > 1) 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mime[1].split(UChar(','), false, exts); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project determineQuirks(mime[0]); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mimeToExtensions.add(mime[0], exts); 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mime.size() > 2) 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mimeToDescriptions.add(mime[0], mime[2]); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginPackage::load() 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isLoaded) { 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadCount++; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_module = new QLibrary((QString)m_path); 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_module->setLoadHints(QLibrary::ResolveAllSymbolsHint); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_module->load()) { 93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project LOG(Plugin, "%s not loaded (%s)", m_path.utf8().data(), 94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_module->errorString().toLatin1().constData()); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoaded = true; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NP_InitializeFuncPtr NP_Initialize; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPError npErr; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NP_Initialize = (NP_InitializeFuncPtr)m_module->resolve("NP_Initialize"); 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_NPP_Shutdown = (NPP_ShutdownProcPtr)m_module->resolve("NP_Shutdown"); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!NP_Initialize || !m_NPP_Shutdown) 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto abort; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs)); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_pluginFuncs.size = sizeof(m_pluginFuncs); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian initializeBrowserFuncs(); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if defined(XP_UNIX) 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project npErr = NP_Initialize(&m_browserFuncs, &m_pluginFuncs); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project npErr = NP_Initialize(&m_browserFuncs); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (npErr != NPERR_NO_ERROR) 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto abort; 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadCount++; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectabort: 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unloadWithoutShutdown(); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 131