Bug 545080 and bug 537344 - When UNICODE is defined in modules/plugin/base/src, we follow codepaths that aren't right, and the fields of nsPluginInfo are double-converted to UTF8, which is bad, r=josh

This commit is contained in:
Benjamin Smedberg 2010-02-13 16:59:39 -05:00
parent 8e5121242a
commit c78bfb5d4a
4 changed files with 160 additions and 204 deletions

View File

@ -58,24 +58,6 @@ typedef struct structVer
WORD wBuild;
} verBlock;
#ifdef UNICODE
static nsresult
t_NS_NewNativeLocalFile(wchar_t *path, PRBool b, nsILocalFile **retval)
{
return NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(path), b, retval);
}
#endif
#ifndef TEXT
#define TEXT(_x) _x
#endif
static nsresult
t_NS_NewNativeLocalFile(char *path, PRBool b, nsILocalFile **retval)
{
return NS_NewNativeLocalFile(nsDependentCString(path), b, retval);
}
static void
ClearVersion(verBlock *ver)
{
@ -111,7 +93,7 @@ GetFileVersion(LPTSTR szFile, verBlock *vbVersion)
uLen = 0;
if (lpData && GetFileVersionInfo(szFile, dwHandle, dwLen, lpData) != 0) {
if (VerQueryValue(lpData, TEXT("\\"), &lpBuffer, &uLen) != 0) {
if (VerQueryValueW(lpData, L"\\", &lpBuffer, &uLen) != 0) {
lpBuffer2 = (VS_FIXEDFILEINFO *)lpBuffer;
vbVersion->wMajor = HIWORD(lpBuffer2->dwFileVersionMS);
@ -142,7 +124,7 @@ CopyVersion(verBlock *ver1, verBlock *ver2)
// Convert a string version to a version struct
static void
TranslateVersionStr(const TCHAR* szVersion, verBlock *vbVersion)
TranslateVersionStr(const WCHAR* szVersion, verBlock *vbVersion)
{
LPTSTR szNum1 = NULL;
LPTSTR szNum2 = NULL;
@ -150,9 +132,9 @@ TranslateVersionStr(const TCHAR* szVersion, verBlock *vbVersion)
LPTSTR szNum4 = NULL;
LPTSTR szJavaBuild = NULL;
TCHAR *strVer = nsnull;
WCHAR *strVer = nsnull;
if (szVersion) {
strVer = _tcsdup(szVersion);
strVer = wcsdup(szVersion);
}
if (!strVer) {
@ -162,15 +144,15 @@ TranslateVersionStr(const TCHAR* szVersion, verBlock *vbVersion)
}
// Java may be using an underscore instead of a dot for the build ID
szJavaBuild = _tcschr(strVer, '_');
szJavaBuild = wcschr(strVer, '_');
if (szJavaBuild) {
szJavaBuild[0] = '.';
}
szNum1 = _tcstok(strVer, TEXT("."));
szNum2 = _tcstok(NULL, TEXT("."));
szNum3 = _tcstok(NULL, TEXT("."));
szNum4 = _tcstok(NULL, TEXT("."));
szNum1 = wcstok(strVer, L".");
szNum2 = wcstok(NULL, L".");
szNum3 = wcstok(NULL, L".");
szNum4 = wcstok(NULL, L".");
vbVersion->wMajor = szNum1 ? (WORD) _ttoi(szNum1) : 0;
vbVersion->wMinor = szNum2 ? (WORD) _ttoi(szNum2) : 0;
@ -180,14 +162,6 @@ TranslateVersionStr(const TCHAR* szVersion, verBlock *vbVersion)
free(strVer);
}
#ifdef UNICODE
static void
TranslateVersionStr(const char* szVersion, verBlock *vbVersion)
{
TranslateVersionStr(NS_ConvertUTF8toUTF16(szVersion).get(), vbVersion);
}
#endif
// Compare two version struct, return zero if the same
static int
CompareVersion(verBlock vbVersionOld, verBlock vbVersionNew)
@ -252,13 +226,6 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
NS_ENSURE_ARG(charProp);
#ifdef UNICODE
NS_ConvertUTF8toUTF16 tprop(charProp);
const wchar_t *prop = tprop.get();
#else
const char *prop = charProp;
#endif
*_retval = nsnull;
*persistant = PR_FALSE;
@ -281,31 +248,32 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
HKEY keyloc;
long result;
DWORD type;
TCHAR szKey[_MAX_PATH] = TEXT("Software\\Netscape\\Netscape Navigator");
TCHAR path[_MAX_PATH];
WCHAR szKey[_MAX_PATH] = L"Software\\Netscape\\Netscape Navigator";
WCHAR path[_MAX_PATH];
result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, KEY_READ, &keyloc);
result = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, szKey, 0, KEY_READ, &keyloc);
if (result == ERROR_SUCCESS) {
TCHAR current_version[80];
WCHAR current_version[80];
DWORD length = NS_ARRAY_LENGTH(current_version);
result = ::RegQueryValueEx(keyloc, TEXT("CurrentVersion"), NULL, &type,
(LPBYTE)&current_version, &length);
result = ::RegQueryValueExW(keyloc, L"CurrentVersion", NULL, &type,
(LPBYTE)&current_version, &length);
::RegCloseKey(keyloc);
_tcscat(szKey, TEXT("\\"));
_tcscat(szKey, current_version);
_tcscat(szKey, TEXT("\\Main"));
result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, KEY_READ, &keyloc);
wcscat(szKey, L"\\");
wcscat(szKey, current_version);
wcscat(szKey, L"\\Main");
result = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, szKey, 0, KEY_READ, &keyloc);
if (result == ERROR_SUCCESS) {
DWORD pathlen = NS_ARRAY_LENGTH(path);
result = ::RegQueryValueEx(keyloc, TEXT("Plugins Directory"), NULL, &type,
result = ::RegQueryValueExW(keyloc, L"Plugins Directory", NULL, &type,
(LPBYTE)&path, &pathlen);
if (result == ERROR_SUCCESS) {
rv = t_NS_NewNativeLocalFile(path, PR_TRUE, getter_AddRefs(localFile));
rv = NS_NewLocalFile(nsDependentString(path),
PR_TRUE, getter_AddRefs(localFile));
}
::RegCloseKey(keyloc);
@ -316,7 +284,7 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
if (NS_FAILED(prefs->GetCharPref(charProp, getter_Copies(strVer))))
return NS_ERROR_FAILURE;
verBlock minVer;
TranslateVersionStr(strVer.get(), &minVer);
TranslateVersionStr(NS_ConvertASCIItoUTF16(strVer).get(), &minVer);
// Look for the Java OJI plugin via the JRE install path
HKEY baseloc;
@ -329,25 +297,25 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
DWORD pathlen;
verBlock maxVer;
ClearVersion(&maxVer);
TCHAR curKey[_MAX_PATH] = TEXT("Software\\JavaSoft\\Java Runtime Environment");
TCHAR path[_MAX_PATH];
WCHAR curKey[_MAX_PATH] = L"Software\\JavaSoft\\Java Runtime Environment";
WCHAR path[_MAX_PATH];
// Add + 15 to prevent buffer overrun when adding \bin (+ optionally
// \new_plugin)
#define JAVA_PATH_SIZE _MAX_PATH + 15
TCHAR newestPath[JAVA_PATH_SIZE];
const TCHAR mozPath[_MAX_PATH] = TEXT("Software\\mozilla.org\\Mozilla");
TCHAR browserJavaVersion[_MAX_PATH];
WCHAR newestPath[JAVA_PATH_SIZE];
const WCHAR mozPath[_MAX_PATH] = L"Software\\mozilla.org\\Mozilla";
WCHAR browserJavaVersion[_MAX_PATH];
newestPath[0] = 0;
LONG result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, curKey, 0, KEY_READ,
&baseloc);
LONG result = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, curKey, 0, KEY_READ,
&baseloc);
if (ERROR_SUCCESS != result)
return NS_ERROR_FAILURE;
// Look for "BrowserJavaVersion"
if (ERROR_SUCCESS != ::RegQueryValueEx(baseloc, TEXT("BrowserJavaVersion"), NULL,
NULL, (LPBYTE)&browserJavaVersion,
&numChars))
if (ERROR_SUCCESS != ::RegQueryValueExW(baseloc, L"BrowserJavaVersion", NULL,
NULL, (LPBYTE)&browserJavaVersion,
&numChars))
browserJavaVersion[0] = 0;
// We must enumerate through the keys because what if there is
@ -362,7 +330,7 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
// Skip major.minor as it always points to latest in its family
numChars = 0;
for (TCHAR *p = curKey; *p; p++) {
for (WCHAR *p = curKey; *p; p++) {
if (*p == '.') {
numChars++;
}
@ -371,23 +339,23 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
continue;
if (ERROR_SUCCESS == result) {
if (ERROR_SUCCESS == ::RegOpenKeyEx(baseloc, curKey, 0,
KEY_QUERY_VALUE, &keyloc)) {
if (ERROR_SUCCESS == ::RegOpenKeyExW(baseloc, curKey, 0,
KEY_QUERY_VALUE, &keyloc)) {
// We have a sub key
if (ERROR_SUCCESS == ::RegQueryValueEx(keyloc, TEXT("JavaHome"), NULL,
&type, (LPBYTE)&path,
&pathlen)) {
if (ERROR_SUCCESS == ::RegQueryValueExW(keyloc, L"JavaHome", NULL,
&type, (LPBYTE)&path,
&pathlen)) {
verBlock curVer;
TranslateVersionStr(curKey, &curVer);
if (CompareVersion(curVer, minVer) >= 0) {
if (!_tcsncmp(browserJavaVersion, curKey, _MAX_PATH)) {
_tcscpy(newestPath, path);
if (!wcsncmp(browserJavaVersion, curKey, _MAX_PATH)) {
wcscpy(newestPath, path);
::RegCloseKey(keyloc);
break;
}
if (CompareVersion(curVer, maxVer) >= 0) {
_tcscpy(newestPath, path);
wcscpy(newestPath, path);
CopyVersion(&maxVer, &curVer);
}
}
@ -399,6 +367,8 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
::RegCloseKey(baseloc);
static const WCHAR kMozillaVersion[] = NS_L(MOZILLA_VERSION);
// If nothing is found, then don't add \bin dir and don't set
// CurrentVersion for Mozilla
if (newestPath[0] != 0) {
@ -406,24 +376,25 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
NULL, REG_OPTION_NON_VOLATILE,
KEY_SET_VALUE|KEY_QUERY_VALUE,
NULL, &entryloc, NULL)) {
if (ERROR_SUCCESS != ::RegQueryValueEx(entryloc, TEXT("CurrentVersion"), 0,
if (ERROR_SUCCESS != ::RegQueryValueExW(entryloc, L"CurrentVersion", 0,
NULL, NULL, NULL)) {
::RegSetValueEx(entryloc, TEXT("CurrentVersion"), 0, REG_SZ,
(const BYTE*) TEXT(MOZILLA_VERSION),
sizeof(TEXT(MOZILLA_VERSION)));
::RegSetValueExW(entryloc, L"CurrentVersion", 0, REG_SZ,
(const BYTE*) kMozillaVersion,
NS_ARRAY_LENGTH(kMozillaVersion));
}
::RegCloseKey(entryloc);
}
_tcscat(newestPath, TEXT("\\bin"));
wcscat(newestPath, L"\\bin");
// See whether the "new_plugin" directory exists
TCHAR tmpPath[JAVA_PATH_SIZE];
WCHAR tmpPath[JAVA_PATH_SIZE];
nsCOMPtr<nsILocalFile> tmpFile;
_tcscpy(tmpPath, newestPath);
_tcscat(tmpPath, TEXT("\\new_plugin"));
rv = t_NS_NewNativeLocalFile(tmpPath, PR_TRUE, getter_AddRefs(tmpFile));
wcscpy(tmpPath, newestPath);
wcscat(tmpPath, L"\\new_plugin");
rv = NS_NewLocalFile(nsDependentString(tmpPath),
PR_TRUE, getter_AddRefs(tmpFile));
if (NS_SUCCEEDED(rv) && tmpFile) {
PRBool exists = PR_FALSE;
PRBool isDir = PR_FALSE;
@ -432,18 +403,19 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
// Assume we're supposed to use this as the search
// directory for the Java Plug-In instead of the normal
// one
_tcscpy(newestPath, tmpPath);
wcscpy(newestPath, tmpPath);
}
}
rv = t_NS_NewNativeLocalFile(newestPath, PR_TRUE, getter_AddRefs(localFile));
rv = NS_NewLocalFile(nsDependentString(newestPath),
PR_TRUE, getter_AddRefs(localFile));
}
} else if (nsCRT::strcmp(charProp, NS_WIN_QUICKTIME_SCAN_KEY) == 0) {
nsXPIDLCString strVer;
if (NS_FAILED(prefs->GetCharPref(charProp, getter_Copies(strVer))))
return NS_ERROR_FAILURE;
verBlock minVer;
TranslateVersionStr(strVer.get(), &minVer);
TranslateVersionStr(NS_ConvertASCIItoUTF16(strVer).get(), &minVer);
// Look for the Quicktime system installation plugins directory
HKEY keyloc;
@ -451,16 +423,16 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
DWORD type;
verBlock qtVer;
ClearVersion(&qtVer);
TCHAR path[_MAX_PATH];
WCHAR path[_MAX_PATH];
DWORD pathlen = NS_ARRAY_LENGTH(path);
// First we need to check the version of Quicktime via checking
// the EXE's version table
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\QuickTimePlayer.exe"),
0, KEY_READ, &keyloc)) {
if (ERROR_SUCCESS == ::RegQueryValueEx(keyloc, NULL, NULL, &type,
(LPBYTE)&path, &pathlen)) {
if (ERROR_SUCCESS == ::RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\QuickTimePlayer.exe",
0, KEY_READ, &keyloc)) {
if (ERROR_SUCCESS == ::RegQueryValueExW(keyloc, NULL, NULL, &type,
(LPBYTE)&path, &pathlen)) {
GetFileVersion(path, &qtVer);
}
::RegCloseKey(keyloc);
@ -468,17 +440,17 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
if (CompareVersion(qtVer, minVer) < 0)
return rv;
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("software\\Apple Computer, Inc.\\QuickTime"),
if (ERROR_SUCCESS == ::RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"software\\Apple Computer, Inc.\\QuickTime",
0, KEY_READ, &keyloc)) {
DWORD pathlen = NS_ARRAY_LENGTH(path);
result = ::RegQueryValueEx(keyloc, TEXT("InstallDir"), NULL, &type,
(LPBYTE)&path, &pathlen);
_tcscat(path, TEXT("\\Plugins"));
result = ::RegQueryValueExW(keyloc, L"InstallDir", NULL, &type,
(LPBYTE)&path, &pathlen);
wcscat(path, L"\\Plugins");
if (result == ERROR_SUCCESS)
rv = t_NS_NewNativeLocalFile(path, PR_TRUE,
getter_AddRefs(localFile));
rv = NS_NewLocalFile(nsDependentString(path), PR_TRUE,
getter_AddRefs(localFile));
::RegCloseKey(keyloc);
}
} else if (nsCRT::strcmp(charProp, NS_WIN_WMP_SCAN_KEY) == 0) {
@ -486,22 +458,22 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
if (NS_FAILED(prefs->GetCharPref(charProp, getter_Copies(strVer))))
return NS_ERROR_FAILURE;
verBlock minVer;
TranslateVersionStr(strVer.get(), &minVer);
TranslateVersionStr(NS_ConvertASCIItoUTF16(strVer).get(), &minVer);
// Look for Windows Media Player system installation plugins directory
HKEY keyloc;
DWORD type;
verBlock wmpVer;
ClearVersion(&wmpVer);
TCHAR path[_MAX_PATH];
WCHAR path[_MAX_PATH];
DWORD pathlen = NS_ARRAY_LENGTH(path);
// First we need to check the version of WMP
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\wmplayer.exe"),
0, KEY_READ, &keyloc)) {
if (ERROR_SUCCESS == ::RegQueryValueEx(keyloc, NULL, NULL, &type,
(LPBYTE)&path, &pathlen)) {
if (ERROR_SUCCESS == ::RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\wmplayer.exe",
0, KEY_READ, &keyloc)) {
if (ERROR_SUCCESS == ::RegQueryValueExW(keyloc, NULL, NULL, &type,
(LPBYTE)&path, &pathlen)) {
GetFileVersion(path, &wmpVer);
}
::RegCloseKey(keyloc);
@ -509,13 +481,14 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
if (CompareVersion(wmpVer, minVer) < 0)
return rv;
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("software\\Microsoft\\MediaPlayer"), 0,
KEY_READ, &keyloc)) {
if (ERROR_SUCCESS == ::RegQueryValueEx(keyloc, TEXT("Installation Directory"),
if (ERROR_SUCCESS == ::RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"software\\Microsoft\\MediaPlayer", 0,
KEY_READ, &keyloc)) {
if (ERROR_SUCCESS == ::RegQueryValueExW(keyloc, L"Installation Directory",
NULL, &type, (LPBYTE)&path,
&pathlen)) {
rv = t_NS_NewNativeLocalFile(path, PR_TRUE, getter_AddRefs(localFile));
rv = NS_NewLocalFile(nsDependentString(path), PR_TRUE,
getter_AddRefs(localFile));
}
::RegCloseKey(keyloc);
@ -527,7 +500,7 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
}
verBlock minVer;
TranslateVersionStr(strVer.get(), &minVer);
TranslateVersionStr(NS_ConvertASCIItoUTF16(strVer).get(), &minVer);
// Look for Adobe Acrobat system installation plugins directory
HKEY baseloc;
@ -539,17 +512,17 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
DWORD pathlen;
verBlock maxVer;
ClearVersion(&maxVer);
TCHAR curKey[_MAX_PATH] = TEXT("software\\Adobe\\Acrobat Reader");
TCHAR path[_MAX_PATH];
WCHAR curKey[_MAX_PATH] = L"software\\Adobe\\Acrobat Reader";
WCHAR path[_MAX_PATH];
// Add + 8 to prevent buffer overrun when adding \browser
TCHAR newestPath[_MAX_PATH + 8];
WCHAR newestPath[_MAX_PATH + 8];
newestPath[0] = 0;
if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, curKey, 0,
KEY_READ, &baseloc)) {
_tcscpy(curKey, TEXT("software\\Adobe\\Adobe Acrobat"));
if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, curKey, 0,
KEY_READ, &baseloc)) {
if (ERROR_SUCCESS != ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, curKey, 0,
KEY_READ, &baseloc)) {
wcscpy(curKey, L"software\\Adobe\\Adobe Acrobat");
if (ERROR_SUCCESS != ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, curKey, 0,
KEY_READ, &baseloc)) {
return NS_ERROR_FAILURE;
}
}
@ -568,15 +541,15 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
if (ERROR_SUCCESS == result) {
verBlock curVer;
TranslateVersionStr(curKey, &curVer);
_tcscat(curKey, TEXT("\\InstallPath"));
if (ERROR_SUCCESS == ::RegOpenKeyEx(baseloc, curKey, 0,
KEY_QUERY_VALUE, &keyloc)) {
wcscat(curKey, L"\\InstallPath");
if (ERROR_SUCCESS == ::RegOpenKeyExW(baseloc, curKey, 0,
KEY_QUERY_VALUE, &keyloc)) {
// We have a sub key
if (ERROR_SUCCESS == ::RegQueryValueEx(keyloc, NULL, NULL, &type,
(LPBYTE)&path, &pathlen)) {
if (ERROR_SUCCESS == ::RegQueryValueExW(keyloc, NULL, NULL, &type,
(LPBYTE)&path, &pathlen)) {
if (CompareVersion(curVer, maxVer) >= 0 &&
CompareVersion(curVer, minVer) >= 0) {
_tcscpy(newestPath, path);
wcscpy(newestPath, path);
CopyVersion(&maxVer, &curVer);
}
}
@ -589,8 +562,9 @@ nsPluginDirServiceProvider::GetFile(const char *charProp, PRBool *persistant,
::RegCloseKey(baseloc);
if (newestPath[0] != 0) {
_tcscat(newestPath, TEXT("\\browser"));
rv = t_NS_NewNativeLocalFile(newestPath, PR_TRUE, getter_AddRefs(localFile));
wcscat(newestPath, L"\\browser");
rv = NS_NewLocalFile(nsDependentString(newestPath), PR_TRUE,
getter_AddRefs(localFile));
}
}
@ -618,10 +592,10 @@ nsPluginDirServiceProvider::GetPLIDDirectories(nsISimpleEnumerator **aEnumerator
nsresult
nsPluginDirServiceProvider::GetPLIDDirectoriesWithHKEY(HKEY aKey, nsCOMArray<nsILocalFile> &aDirs)
{
TCHAR subkey[_MAX_PATH] = TEXT("Software\\MozillaPlugins");
WCHAR subkey[_MAX_PATH] = L"Software\\MozillaPlugins";
HKEY baseloc;
if (ERROR_SUCCESS != ::RegOpenKeyEx(aKey, subkey, 0, KEY_READ, &baseloc))
if (ERROR_SUCCESS != ::RegOpenKeyExW(aKey, subkey, 0, KEY_READ, &baseloc))
return NS_ERROR_FAILURE;
DWORD index = 0;
@ -632,18 +606,17 @@ nsPluginDirServiceProvider::GetPLIDDirectoriesWithHKEY(HKEY aKey, nsCOMArray<nsI
subkeylen = _MAX_PATH;
HKEY keyloc;
if (ERROR_SUCCESS == ::RegOpenKeyEx(baseloc, subkey, 0, KEY_QUERY_VALUE,
&keyloc)) {
if (ERROR_SUCCESS == ::RegOpenKeyExW(baseloc, subkey, 0, KEY_QUERY_VALUE,
&keyloc)) {
DWORD type;
TCHAR path[_MAX_PATH];
WCHAR path[_MAX_PATH];
DWORD pathlen = NS_ARRAY_LENGTH(path);
if (ERROR_SUCCESS == ::RegQueryValueEx(keyloc, TEXT("Path"), NULL, &type,
(LPBYTE)&path, &pathlen)) {
if (ERROR_SUCCESS == ::RegQueryValueExW(keyloc, L"Path", NULL, &type,
(LPBYTE)&path, &pathlen)) {
nsCOMPtr<nsILocalFile> localFile;
if (NS_SUCCEEDED(t_NS_NewNativeLocalFile(path,
PR_TRUE,
getter_AddRefs(localFile))) &&
if (NS_SUCCEEDED(NS_NewLocalFile(nsDependentString(path), PR_TRUE,
getter_AddRefs(localFile))) &&
localFile)
{
// Some vendors use a path directly to the DLL so chop off

View File

@ -2744,18 +2744,18 @@ nsPluginHost::TrySetUpPluginInstance(const char *aMimeType,
#if defined(XP_WIN) && !defined(WINCE)
static BOOL firstJavaPlugin = FALSE;
BOOL restoreOrigDir = FALSE;
char origDir[_MAX_PATH];
WCHAR origDir[_MAX_PATH];
if (pluginTag->mIsJavaPlugin && !firstJavaPlugin) {
DWORD dw = GetCurrentDirectoryA(_MAX_PATH, origDir);
DWORD dw = GetCurrentDirectoryW(_MAX_PATH, origDir);
NS_ASSERTION(dw <= _MAX_PATH, "Failed to obtain the current directory, which may lead to incorrect class loading");
nsCOMPtr<nsIFile> binDirectory;
result = NS_GetSpecialDirectory(NS_XPCOM_CURRENT_PROCESS_DIR,
getter_AddRefs(binDirectory));
if (NS_SUCCEEDED(result)) {
nsCAutoString path;
binDirectory->GetNativePath(path);
restoreOrigDir = SetCurrentDirectoryA(path.get());
nsAutoString path;
binDirectory->GetPath(path);
restoreOrigDir = SetCurrentDirectoryW(path.get());
}
}
#endif
@ -2763,7 +2763,7 @@ nsPluginHost::TrySetUpPluginInstance(const char *aMimeType,
#if defined(XP_WIN) && !defined(WINCE)
if (!firstJavaPlugin && restoreOrigDir) {
BOOL bCheck = SetCurrentDirectoryA(origDir);
BOOL bCheck = SetCurrentDirectoryW(origDir);
NS_ASSERTION(bCheck, "Error restoring directory");
firstJavaPlugin = TRUE;
}

View File

@ -285,6 +285,9 @@ static nsresult ConvertToUTF8(nsIUnicodeDecoder *aUnicodeDecoder,
nsresult nsPluginTag::EnsureMembersAreUTF8()
{
#ifdef XP_WIN
return NS_OK;
#else
nsresult rv;
nsCOMPtr<nsIPlatformCharset> pcs =
@ -322,6 +325,7 @@ nsresult nsPluginTag::EnsureMembersAreUTF8()
}
}
return NS_OK;
#endif
}
void nsPluginTag::SetHost(nsPluginHost * aHost)

View File

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -53,35 +53,30 @@
#include "winbase.h"
#include "nsString.h"
#include "nsILocalFile.h"
/* Local helper functions */
static char* GetKeyValue(TCHAR* verbuf, TCHAR* key)
static char* GetKeyValue(WCHAR* verbuf, WCHAR* key)
{
TCHAR *buf = NULL;
WCHAR *buf = NULL;
UINT blen;
::VerQueryValue(verbuf, key, (void **)&buf, &blen);
::VerQueryValueW(verbuf, key, (void **)&buf, &blen);
if (buf) {
#ifdef UNICODE
// the return value needs to always be a char *, regardless
// of whether we're UNICODE or not
return PL_strdup(NS_ConvertUTF16toUTF8(buf).get());
#else
return PL_strdup(buf);
#endif
}
return nsnull;
}
static char* GetVersion(TCHAR* verbuf)
static char* GetVersion(WCHAR* verbuf)
{
VS_FIXEDFILEINFO *fileInfo;
UINT fileInfoLen;
::VerQueryValue(verbuf, TEXT("\\"), (void **)&fileInfo, &fileInfoLen);
::VerQueryValueW(verbuf, L"\\", (void **)&fileInfo, &fileInfoLen);
if (fileInfo) {
return PR_smprintf("%ld.%ld.%ld.%ld",
@ -219,47 +214,44 @@ nsPluginFile::~nsPluginFile()
*/
nsresult nsPluginFile::LoadPlugin(PRLibrary* &outLibrary)
{
// How can we convert to a full path names for using with NSPR?
if (!mPlugin)
nsCOMPtr<nsILocalFile> plugin = do_QueryInterface(mPlugin);
if (!plugin)
return NS_ERROR_NULL_POINTER;
nsCAutoString temp;
mPlugin->GetNativePath(temp);
#ifndef WINCE
char* index;
char* pluginFolderPath = PL_strdup(temp.get());
nsAutoString pluginFolderPath;
plugin->GetPath(pluginFolderPath);
index = PL_strrchr(pluginFolderPath, '\\');
if (!index) {
PL_strfree(pluginFolderPath);
PRInt32 idx = pluginFolderPath.RFindChar('\\');
if (kNotFound == idx)
return NS_ERROR_FILE_INVALID_PATH;
}
*index = 0;
pluginFolderPath.SetLength(idx);
BOOL restoreOrigDir = FALSE;
char aOrigDir[MAX_PATH + 1];
DWORD dwCheck = GetCurrentDirectoryA(sizeof(aOrigDir), aOrigDir);
WCHAR aOrigDir[MAX_PATH + 1];
DWORD dwCheck = GetCurrentDirectoryW(MAX_PATH, aOrigDir);
NS_ASSERTION(dwCheck <= MAX_PATH + 1, "Error in Loading plugin");
if (dwCheck <= MAX_PATH + 1) {
restoreOrigDir = SetCurrentDirectoryA(pluginFolderPath);
restoreOrigDir = SetCurrentDirectoryW(pluginFolderPath.get());
NS_ASSERTION(restoreOrigDir, "Error in Loading plugin");
}
#endif
outLibrary = PR_LoadLibrary(temp.get());
nsresult rv = plugin->Load(&outLibrary);
if (NS_FAILED(rv))
outLibrary = NULL;
#ifndef WINCE
if (restoreOrigDir) {
BOOL bCheck = SetCurrentDirectoryA(aOrigDir);
BOOL bCheck = SetCurrentDirectoryW(aOrigDir);
NS_ASSERTION(bCheck, "Error in Loading plugin");
}
PL_strfree(pluginFolderPath);
#endif
return NS_OK;
return rv;
}
/**
@ -269,54 +261,41 @@ nsresult nsPluginFile::GetPluginInfo(nsPluginInfo& info)
{
nsresult rv = NS_OK;
DWORD zerome, versionsize;
TCHAR* verbuf = nsnull;
const TCHAR* path;
WCHAR* verbuf = nsnull;
if (!mPlugin)
return NS_ERROR_NULL_POINTER;
nsCAutoString fullPath;
if (NS_FAILED(rv = mPlugin->GetNativePath(fullPath)))
nsAutoString fullPath;
if (NS_FAILED(rv = mPlugin->GetPath(fullPath)))
return rv;
nsCAutoString fileName;
if (NS_FAILED(rv = mPlugin->GetNativeLeafName(fileName)))
nsAutoString fileName;
if (NS_FAILED(rv = mPlugin->GetLeafName(fileName)))
return rv;
#ifdef UNICODE
NS_ConvertASCIItoUTF16 utf16Path(fullPath);
path = utf16Path.get();
versionsize = ::GetFileVersionInfoSizeW((TCHAR*)path, &zerome);
#else
path = fullPath.get();
versionsize = ::GetFileVersionInfoSize((TCHAR*)path, &zerome);
#endif
versionsize = ::GetFileVersionInfoSizeW(fullPath.get(), &zerome);
if (versionsize > 0)
verbuf = (TCHAR*)PR_Malloc(versionsize);
verbuf = (WCHAR*)PR_Malloc(versionsize);
if (!verbuf)
return NS_ERROR_OUT_OF_MEMORY;
#ifdef UNICODE
if (::GetFileVersionInfoW((LPWSTR)path, NULL, versionsize, verbuf))
#else
if (::GetFileVersionInfo(path, NULL, versionsize, verbuf))
#endif
if (::GetFileVersionInfoW(fullPath.get(), NULL, versionsize, verbuf))
{
info.fName = GetKeyValue(verbuf, TEXT("\\StringFileInfo\\040904E4\\ProductName"));
info.fDescription = GetKeyValue(verbuf, TEXT("\\StringFileInfo\\040904E4\\FileDescription"));
info.fName = GetKeyValue(verbuf, L"\\StringFileInfo\\040904E4\\ProductName");
info.fDescription = GetKeyValue(verbuf, L"\\StringFileInfo\\040904E4\\FileDescription");
char *mimeType = GetKeyValue(verbuf, TEXT("\\StringFileInfo\\040904E4\\MIMEType"));
char *mimeDescription = GetKeyValue(verbuf, TEXT("\\StringFileInfo\\040904E4\\FileOpenName"));
char *extensions = GetKeyValue(verbuf, TEXT("\\StringFileInfo\\040904E4\\FileExtents"));
char *mimeType = GetKeyValue(verbuf, L"\\StringFileInfo\\040904E4\\MIMEType");
char *mimeDescription = GetKeyValue(verbuf, L"\\StringFileInfo\\040904E4\\FileOpenName");
char *extensions = GetKeyValue(verbuf, L"\\StringFileInfo\\040904E4\\FileExtents");
info.fVariantCount = CalculateVariantCount(mimeType);
info.fMimeTypeArray = MakeStringArray(info.fVariantCount, mimeType);
info.fMimeDescriptionArray = MakeStringArray(info.fVariantCount, mimeDescription);
info.fExtensionArray = MakeStringArray(info.fVariantCount, extensions);
info.fFullPath = PL_strdup(fullPath.get());
info.fFileName = PL_strdup(fileName.get());
info.fFullPath = PL_strdup(NS_ConvertUTF16toUTF8(fullPath).get());
info.fFileName = PL_strdup(NS_ConvertUTF16toUTF8(fileName).get());
info.fVersion = GetVersion(verbuf);
PL_strfree(mimeType);