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