mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
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:
parent
8e5121242a
commit
c78bfb5d4a
@ -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)¤t_version, &length);
|
||||
result = ::RegQueryValueExW(keyloc, L"CurrentVersion", NULL, &type,
|
||||
(LPBYTE)¤t_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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user