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. 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2008-2009 Torch Mobile, Inc. All rights reserved. 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDatabase.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KURL.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginPackage.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <windows.h> 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <shlwapi.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 37d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE) 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// WINCE doesn't support Registry Key Access Rights. The parameter should always be 0 390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#ifndef KEY_ENUMERATE_SUB_KEYS 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define KEY_ENUMERATE_SUB_KEYS 0 410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#endif 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochDWORD SHGetValue(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData) 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch HKEY key; 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (RegOpenKeyEx(hkey, pszSubKey, 0, 0, &key) == ERROR_SUCCESS) { 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch DWORD result = RegQueryValueEx(key, pszValue, 0, pdwType, (LPBYTE)pvData, pcbData); 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RegCloseKey(key); 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return result; 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return ERROR_INVALID_NAME; 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochBOOL PathRemoveFileSpec(LPWSTR moduleFileNameStr) 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!*moduleFileNameStr) 570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return FALSE; 580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LPWSTR lastPos = 0; 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LPWSTR curPos = moduleFileNameStr; 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch do { 620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (*curPos == L'/' || *curPos == L'\\') 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch lastPos = curPos; 640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } while (*++curPos); 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (lastPos == curPos - 1) 670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return FALSE; 680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (lastPos) 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *lastPos = 0; 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch else { 720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch moduleFileNameStr[0] = L'\\'; 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch moduleFileNameStr[1] = 0; 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return TRUE; 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addPluginPathsFromRegistry(HKEY rootKey, HashSet<String>& paths) 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HKEY key; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HRESULT result = RegOpenKeyExW(rootKey, L"Software\\MozillaPlugins", 0, KEY_ENUMERATE_SUB_KEYS, &key); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result != ERROR_SUCCESS) 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wchar_t name[128]; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FILETIME lastModified; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Enumerate subkeys 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0;; i++) { 95e14391e94c850b8bd03680c23b38978db68687a8John Reck DWORD nameLen = WTF_ARRAY_LENGTH(name); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result != ERROR_SUCCESS) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR pathStr[_MAX_PATH]; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD pathStrSize = sizeof(pathStr); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD type; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = SHGetValue(key, name, TEXT("Path"), &type, (LPBYTE)pathStr, &pathStrSize); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result != ERROR_SUCCESS || type != REG_SZ) 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project paths.add(String(pathStr, pathStrSize / sizeof(WCHAR) - 1)); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RegCloseKey(key); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginDatabase::getPluginPathsInDirectories(HashSet<String>& paths) const 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This should be a case insensitive set. 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HashSet<String> uniqueFilenames; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HANDLE hFind = INVALID_HANDLE_VALUE; 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WIN32_FIND_DATAW findFileData; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String oldWMPPluginPath; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String newWMPPluginPath; 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<String>::const_iterator end = m_pluginDirectories.end(); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Vector<String>::const_iterator it = m_pluginDirectories.begin(); it != end; ++it) { 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String pattern = *it + "\\*"; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hFind = FindFirstFileW(pattern.charactersWithNullTermination(), &findFileData); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hFind == INVALID_HANDLE_VALUE) 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project do { 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String filename = String(findFileData.cFileName, wcslen(findFileData.cFileName)); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((!filename.startsWith("np", false) || !filename.endsWith("dll", false)) && 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (!equalIgnoringCase(filename, "Plugin.dll") || !it->endsWith("Shockwave 10", false))) 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String fullPath = *it + "\\" + filename; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!uniqueFilenames.add(fullPath).second) 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project paths.add(fullPath); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (equalIgnoringCase(filename, "npdsplay.dll")) 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldWMPPluginPath = fullPath; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (equalIgnoringCase(filename, "np-mswmp.dll")) 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newWMPPluginPath = fullPath; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } while (FindNextFileW(hFind, &findFileData) != 0); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FindClose(hFind); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addPluginPathsFromRegistry(HKEY_LOCAL_MACHINE, paths); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addPluginPathsFromRegistry(HKEY_CURRENT_USER, paths); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If both the old and new WMP plugin are present in the plugins set, 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we remove the old one so we don't end up choosing the old one. 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!oldWMPPluginPath.isEmpty() && !newWMPPluginPath.isEmpty()) 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project paths.remove(oldWMPPluginPath); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline Vector<int> parseVersionString(const String& versionString) 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<int> version; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned startPos = 0; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned endPos; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (startPos < versionString.length()) { 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (endPos = startPos; endPos < versionString.length(); ++endPos) 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (versionString[endPos] == '.' || versionString[endPos] == '_') 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int versionComponent = versionString.substring(startPos, endPos - startPos).toInt(); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version.append(versionComponent); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project startPos = endPos + 1; 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return version; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This returns whether versionA is higher than versionB 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline bool compareVersions(const Vector<int>& versionA, const Vector<int>& versionB) 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < versionA.size(); i++) { 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (i >= versionB.size()) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (versionA[i] > versionB[i]) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (versionA[i] < versionB[i]) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we come here, the versions are either the same or versionB has an extra component, just return false 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addMozillaPluginDirectories(Vector<String>& directories) 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Enumerate all Mozilla plugin directories in the registry 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HKEY key; 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LONG result; 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Mozilla"), 0, KEY_READ, &key); 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result == ERROR_SUCCESS) { 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR name[128]; 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FILETIME lastModified; 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Enumerate subkeys 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0;; i++) { 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD nameLen = sizeof(name) / sizeof(WCHAR); 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified); 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result != ERROR_SUCCESS) 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String extensionsPath = String(name, nameLen) + "\\Extensions"; 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HKEY extensionsKey; 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Try opening the key 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = RegOpenKeyEx(key, extensionsPath.charactersWithNullTermination(), 0, KEY_READ, &extensionsKey); 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result == ERROR_SUCCESS) { 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Now get the plugins directory 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR pluginsDirectoryStr[_MAX_PATH]; 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD pluginsDirectorySize = sizeof(pluginsDirectoryStr); 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD type; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = RegQueryValueEx(extensionsKey, TEXT("Plugins"), 0, &type, (LPBYTE)&pluginsDirectoryStr, &pluginsDirectorySize); 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result == ERROR_SUCCESS && type == REG_SZ) 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directories.append(String(pluginsDirectoryStr, pluginsDirectorySize / sizeof(WCHAR) - 1)); 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RegCloseKey(extensionsKey); 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RegCloseKey(key); 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addWindowsMediaPlayerPluginDirectory(Vector<String>& directories) 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 253d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE) 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The new WMP Firefox plugin is installed in \PFiles\Plugins if it can't find any Firefox installs 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR pluginDirectoryStr[_MAX_PATH + 1]; 256e14391e94c850b8bd03680c23b38978db68687a8John Reck DWORD pluginDirectorySize = ::ExpandEnvironmentStringsW(TEXT("%SYSTEMDRIVE%\\PFiles\\Plugins"), pluginDirectoryStr, WTF_ARRAY_LENGTH(pluginDirectoryStr)); 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 258e14391e94c850b8bd03680c23b38978db68687a8John Reck if (pluginDirectorySize > 0 && pluginDirectorySize <= WTF_ARRAY_LENGTH(pluginDirectoryStr)) 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directories.append(String(pluginDirectoryStr, pluginDirectorySize - 1)); 2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD type; 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR installationDirectoryStr[_MAX_PATH]; 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD installationDirectorySize = sizeof(installationDirectoryStr); 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HRESULT result = SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\MediaPlayer"), TEXT("Installation Directory"), &type, (LPBYTE)&installationDirectoryStr, &installationDirectorySize); 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result == ERROR_SUCCESS && type == REG_SZ) 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directories.append(String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1)); 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addQuickTimePluginDirectory(Vector<String>& directories) 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD type; 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR installationDirectoryStr[_MAX_PATH]; 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD installationDirectorySize = sizeof(installationDirectoryStr); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HRESULT result = SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Apple Computer, Inc.\\QuickTime"), TEXT("InstallDir"), &type, (LPBYTE)&installationDirectoryStr, &installationDirectorySize); 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result == ERROR_SUCCESS && type == REG_SZ) { 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String pluginDir = String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1) + "\\plugins"; 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directories.append(pluginDir); 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addAdobeAcrobatPluginDirectory(Vector<String>& directories) 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HKEY key; 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HRESULT result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Adobe\\Acrobat Reader"), 0, KEY_READ, &key); 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result != ERROR_SUCCESS) 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR name[128]; 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FILETIME lastModified; 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<int> latestAcrobatVersion; 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String latestAcrobatVersionString; 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Enumerate subkeys 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0;; i++) { 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD nameLen = sizeof(name) / sizeof(WCHAR); 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified); 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result != ERROR_SUCCESS) 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<int> acrobatVersion = parseVersionString(String(name, nameLen)); 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (compareVersions(acrobatVersion, latestAcrobatVersion)) { 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project latestAcrobatVersion = acrobatVersion; 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project latestAcrobatVersionString = String(name, nameLen); 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!latestAcrobatVersionString.isNull()) { 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD type; 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR acrobatInstallPathStr[_MAX_PATH]; 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD acrobatInstallPathSize = sizeof(acrobatInstallPathStr); 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String acrobatPluginKeyPath = "Software\\Adobe\\Acrobat Reader\\" + latestAcrobatVersionString + "\\InstallPath"; 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = SHGetValue(HKEY_LOCAL_MACHINE, acrobatPluginKeyPath.charactersWithNullTermination(), 0, &type, (LPBYTE)acrobatInstallPathStr, &acrobatInstallPathSize); 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result == ERROR_SUCCESS) { 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String acrobatPluginDirectory = String(acrobatInstallPathStr, acrobatInstallPathSize / sizeof(WCHAR) - 1) + "\\browser"; 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directories.append(acrobatPluginDirectory); 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RegCloseKey(key); 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic inline void addJavaPluginDirectory(Vector<String>& directories) 3325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 3335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen HKEY key; 3345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen HRESULT result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\JavaSoft\\Java Plug-in"), 0, KEY_READ, &key); 3355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (result != ERROR_SUCCESS) 3365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 3375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen WCHAR name[128]; 3395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen FILETIME lastModified; 3405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen Vector<int> latestJavaVersion; 3425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen String latestJavaVersionString; 3435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Enumerate subkeys 3455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen for (int i = 0;; i++) { 3465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen DWORD nameLen = sizeof(name) / sizeof(WCHAR); 3475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified); 3485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (result != ERROR_SUCCESS) 3505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen break; 3515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen Vector<int> javaVersion = parseVersionString(String(name, nameLen)); 3535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (compareVersions(javaVersion, latestJavaVersion)) { 3545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen latestJavaVersion = javaVersion; 3555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen latestJavaVersionString = String(name, nameLen); 3565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 3575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 3585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!latestJavaVersionString.isEmpty()) { 3605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen DWORD type; 3615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen WCHAR javaInstallPathStr[_MAX_PATH]; 3625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen DWORD javaInstallPathSize = sizeof(javaInstallPathStr); 3635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen DWORD useNewPluginValue; 3645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen DWORD useNewPluginSize; 3655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen String javaPluginKeyPath = "Software\\JavaSoft\\Java Plug-in\\" + latestJavaVersionString; 3675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen result = SHGetValue(HKEY_LOCAL_MACHINE, javaPluginKeyPath.charactersWithNullTermination(), TEXT("UseNewJavaPlugin"), &type, (LPVOID)&useNewPluginValue, &useNewPluginSize); 3685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (result == ERROR_SUCCESS && useNewPluginValue == 1) { 3705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen result = SHGetValue(HKEY_LOCAL_MACHINE, javaPluginKeyPath.charactersWithNullTermination(), TEXT("JavaHome"), &type, (LPBYTE)javaInstallPathStr, &javaInstallPathSize); 3715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (result == ERROR_SUCCESS) { 3725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen String javaPluginDirectory = String(javaInstallPathStr, javaInstallPathSize / sizeof(WCHAR) - 1) + "\\bin\\new_plugin"; 3735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen directories.append(javaPluginDirectory); 3745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 3755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 3765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 3775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen RegCloseKey(key); 3795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 3805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline String safariPluginsDirectory() 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR moduleFileNameStr[_MAX_PATH]; 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static String pluginsDirectory; 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static bool cachedPluginDirectory = false; 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!cachedPluginDirectory) { 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cachedPluginDirectory = true; 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int moduleFileNameLen = GetModuleFileName(0, moduleFileNameStr, _MAX_PATH); 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!moduleFileNameLen || moduleFileNameLen == _MAX_PATH) 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto exit; 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!PathRemoveFileSpec(moduleFileNameStr)) 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto exit; 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pluginsDirectory = String(moduleFileNameStr) + "\\Plugins"; 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexit: 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pluginsDirectory; 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addMacromediaPluginDirectories(Vector<String>& directories) 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 406d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE) 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR systemDirectoryStr[MAX_PATH]; 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 409e14391e94c850b8bd03680c23b38978db68687a8John Reck if (!GetSystemDirectory(systemDirectoryStr, WTF_ARRAY_LENGTH(systemDirectoryStr))) 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WCHAR macromediaDirectoryStr[MAX_PATH]; 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PathCombine(macromediaDirectoryStr, systemDirectoryStr, TEXT("macromed\\Flash")); 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directories.append(macromediaDirectoryStr); 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PathCombine(macromediaDirectoryStr, systemDirectoryStr, TEXT("macromed\\Shockwave 10")); 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directories.append(macromediaDirectoryStr); 4190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectVector<String> PluginDatabase::defaultPluginDirectories() 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<String> directories; 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String ourDirectory = safariPluginsDirectory(); 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ourDirectory.isNull()) 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directories.append(ourDirectory); 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addQuickTimePluginDirectory(directories); 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addAdobeAcrobatPluginDirectory(directories); 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addMozillaPluginDirectories(directories); 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addWindowsMediaPlayerPluginDirectory(directories); 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addMacromediaPluginDirectories(directories); 4345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if PLATFORM(QT) 4355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen addJavaPluginDirectory(directories); 4365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return directories; 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginDatabase::isPreferredPluginDirectory(const String& directory) 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String ourDirectory = safariPluginsDirectory(); 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ourDirectory.isNull() && !directory.isNull()) 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ourDirectory == directory; 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 452