Jacek Caban : mshtml: Continue searching for Gecko if loading xpcom.
dll failed.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 9 10:37:25 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 3d506d8575a28d2d29ecef53bbcb5c9ad29961e5
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3d506d8575a28d2d29ecef53bbcb5c9ad29961e5
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Aug 9 16:38:42 2006 +0200
mshtml: Continue searching for Gecko if loading xpcom.dll failed.
---
dlls/mshtml/nsembed.c | 104 ++++++++++++++++++++++++++-----------------------
1 files changed, 55 insertions(+), 49 deletions(-)
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 25dc217..77c08b0 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -117,7 +117,53 @@ static void register_nscontainer_class(v
nscontainer_class = RegisterClassExW(&wndclass);
}
-static BOOL get_mozilla_path(PRUnichar *gre_path)
+static BOOL load_xpcom(PRUnichar *gre_path)
+{
+ WCHAR path_env[MAX_PATH];
+ int len;
+
+ static const WCHAR wszPATH[] = {'P','A','T','H',0};
+ static const WCHAR strXPCOM[] = {'x','p','c','o','m','.','d','l','l',0};
+
+ TRACE("(%s)\n", debugstr_w(gre_path));
+
+ /* We have to modify PATH as XPCOM loads other DLLs from this directory. */
+ GetEnvironmentVariableW(wszPATH, path_env, sizeof(path_env)/sizeof(WCHAR));
+ len = strlenW(path_env);
+ path_env[len++] = ';';
+ strcpyW(path_env+len, gre_path);
+ SetEnvironmentVariableW(wszPATH, path_env);
+
+ hXPCOM = LoadLibraryW(strXPCOM);
+ if(!hXPCOM) {
+ WARN("Could not load XPCOM: %ld\n", GetLastError());
+ return FALSE;
+ }
+
+#define NS_DLSYM(func) \
+ func = (typeof(func))GetProcAddress(hXPCOM, #func); \
+ if(!func) \
+ ERR("Could not GetProcAddress(" #func ") failed\n")
+
+ NS_DLSYM(NS_InitXPCOM2);
+ NS_DLSYM(NS_ShutdownXPCOM);
+ NS_DLSYM(NS_GetComponentRegistrar);
+ NS_DLSYM(NS_StringContainerInit);
+ NS_DLSYM(NS_CStringContainerInit);
+ NS_DLSYM(NS_StringContainerFinish);
+ NS_DLSYM(NS_CStringContainerFinish);
+ NS_DLSYM(NS_StringSetData);
+ NS_DLSYM(NS_CStringSetData);
+ NS_DLSYM(NS_NewLocalFile);
+ NS_DLSYM(NS_StringGetData);
+ NS_DLSYM(NS_CStringGetData);
+
+#undef NS_DLSYM
+
+ return TRUE;
+}
+
+static BOOL load_mozilla(PRUnichar *gre_path)
{
DWORD res, type, i, size = MAX_PATH;
HKEY mozilla_key, hkey;
@@ -146,10 +192,10 @@ static BOOL get_mozilla_path(PRUnichar *
}
RegCloseKey(mozilla_key);
- return ret;
+ return ret ? load_xpcom(gre_path) : FALSE;
}
-static BOOL get_mozctl_path(PRUnichar *gre_path)
+static BOOL load_mozctl(PRUnichar *gre_path)
{
HKEY hkey;
DWORD res, type, size = MAX_PATH;
@@ -168,7 +214,7 @@ static BOOL get_mozctl_path(PRUnichar *g
if(res == ERROR_SUCCESS) {
res = RegQueryValueExW(hkey, wszBinDirectoryPath, NULL, &type, (LPBYTE)gre_path, &size);
if(res == ERROR_SUCCESS)
- return TRUE;
+ return load_xpcom(gre_path);
else
ERR("Could not get value %s\n", debugstr_w(wszBinDirectoryPath));
}
@@ -180,7 +226,7 @@ static BOOL get_mozctl_path(PRUnichar *g
WCHAR *ptr;
if((ptr = strrchrW(gre_path, '\\')))
ptr[1] = 0;
- return TRUE;
+ load_xpcom(gre_path);
}else {
ERR("Could not get value of %s\n", debugstr_w(wszMozCtlClsidKey));
}
@@ -191,7 +237,7 @@ static BOOL get_mozctl_path(PRUnichar *g
return FALSE;
}
-static BOOL get_wine_gecko_path(PRUnichar *gre_path)
+static BOOL load_wine_gecko(PRUnichar *gre_path)
{
HKEY hkey;
DWORD res, type, size = MAX_PATH;
@@ -211,7 +257,7 @@ static BOOL get_wine_gecko_path(PRUnicha
if(res != ERROR_SUCCESS || type != REG_SZ)
return FALSE;
- return TRUE;
+ return load_xpcom(gre_path);
}
static void set_profile(void)
@@ -251,12 +297,8 @@ static BOOL load_gecko(void)
nsAString path;
nsIFile *gre_dir;
PRUnichar gre_path[MAX_PATH];
- WCHAR path_env[MAX_PATH];
- int len;
static BOOL tried_load = FALSE;
- static const WCHAR wszPATH[] = {'P','A','T','H',0};
- static const WCHAR strXPCOM[] = {'x','p','c','o','m','.','d','l','l',0};
TRACE("()\n");
@@ -264,50 +306,14 @@ static BOOL load_gecko(void)
return pCompMgr != NULL;
tried_load = TRUE;
- if(!get_wine_gecko_path(gre_path) && !get_mozctl_path(gre_path)
- && !get_mozilla_path(gre_path)) {
+ if(!load_wine_gecko(gre_path) && !load_mozctl(gre_path) && !load_mozilla(gre_path)) {
install_wine_gecko();
- if(!get_wine_gecko_path(gre_path)) {
+ if(!load_wine_gecko(gre_path)) {
MESSAGE("Could not load Mozilla. HTML rendering will be disabled.\n");
return FALSE;
}
}
- TRACE("found path %s\n", debugstr_w(gre_path));
-
- /* We have to modify PATH as XPCOM loads other DLLs from this directory. */
- GetEnvironmentVariableW(wszPATH, path_env, sizeof(path_env)/sizeof(WCHAR));
- len = strlenW(path_env);
- path_env[len++] = ';';
- strcpyW(path_env+len, gre_path);
- SetEnvironmentVariableW(wszPATH, path_env);
-
- hXPCOM = LoadLibraryW(strXPCOM);
- if(!hXPCOM) {
- ERR("Could not load XPCOM: %ld\n", GetLastError());
- return FALSE;
- }
-
-#define NS_DLSYM(func) \
- func = (typeof(func))GetProcAddress(hXPCOM, #func); \
- if(!func) \
- ERR("Could not GetProcAddress(" #func ") failed\n")
-
- NS_DLSYM(NS_InitXPCOM2);
- NS_DLSYM(NS_ShutdownXPCOM);
- NS_DLSYM(NS_GetComponentRegistrar);
- NS_DLSYM(NS_StringContainerInit);
- NS_DLSYM(NS_CStringContainerInit);
- NS_DLSYM(NS_StringContainerFinish);
- NS_DLSYM(NS_CStringContainerFinish);
- NS_DLSYM(NS_StringSetData);
- NS_DLSYM(NS_CStringSetData);
- NS_DLSYM(NS_NewLocalFile);
- NS_DLSYM(NS_StringGetData);
- NS_DLSYM(NS_CStringGetData);
-
-#undef NS_DLSYM
-
NS_StringContainerInit(&path);
NS_StringSetData(&path, gre_path, PR_UINT32_MAX);
nsres = NS_NewLocalFile(&path, FALSE, &gre_dir);
More information about the wine-cvs
mailing list