Jacek Caban : mshtml: Provide profile directory to Gecko.

Alexandre Julliard julliard at winehq.org
Mon Aug 23 10:50:20 CDT 2010


Module: wine
Branch: master
Commit: 99c4aca480e28fa90d122ab750997e826a87bdd5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=99c4aca480e28fa90d122ab750997e826a87bdd5

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Aug 23 15:07:30 2010 +0200

mshtml: Provide profile directory to Gecko.

---

 dlls/mshtml/Makefile.in |    2 +-
 dlls/mshtml/nsembed.c   |  110 ++++++++++++++++++++++++++++++++++++++++++++++-
 dlls/mshtml/nsiface.idl |   12 +++++
 3 files changed, 122 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in
index 2b46717..224a5fa 100644
--- a/dlls/mshtml/Makefile.in
+++ b/dlls/mshtml/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = mshtml.dll
 IMPORTLIB = mshtml
-IMPORTS   = strmiids uuid urlmon shlwapi ole32 oleaut32 user32 gdi32 advapi32
+IMPORTS   = strmiids uuid urlmon shlwapi shell32 ole32 oleaut32 user32 gdi32 advapi32
 EXTRADEFS = -DCOM_NO_WINDOWS_H
 DELAYIMPORTS = wininet
 
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index b2f14dd..8ea99a2 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -27,6 +27,7 @@
 #include "winuser.h"
 #include "winreg.h"
 #include "ole2.h"
+#include "shlobj.h"
 
 #include "wine/debug.h"
 #include "wine/unicode.h"
@@ -70,6 +71,7 @@ static HINSTANCE hXPCOM = NULL;
 static nsIServiceManager *pServMgr = NULL;
 static nsIComponentManager *pCompMgr = NULL;
 static nsIMemory *nsmem = NULL;
+static nsIFile *profile_directory;
 
 static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e','r',0};
 
@@ -77,6 +79,107 @@ static ATOM nscontainer_class;
 static WCHAR gecko_path[MAX_PATH];
 static unsigned gecko_path_len;
 
+static nsresult NSAPI nsDirectoryServiceProvider_QueryInterface(nsIDirectoryServiceProvider *iface,
+        nsIIDRef riid, void **result)
+{
+    if(IsEqualGUID(&IID_nsISupports, riid)) {
+        TRACE("(IID_nsISupports %p)\n", result);
+        *result = iface;
+    }else if(IsEqualGUID(&IID_nsIDirectoryServiceProvider, riid)) {
+        TRACE("(IID_nsIDirectoryServiceProvider %p)\n", result);
+        *result = iface;
+    }else {
+        WARN("(%s %p)\n", debugstr_guid(riid), result);
+        *result = NULL;
+        return NS_NOINTERFACE;
+    }
+
+    nsISupports_AddRef((nsISupports*)*result);
+    return NS_OK;
+}
+
+static nsrefcnt NSAPI nsDirectoryServiceProvider_AddRef(nsIDirectoryServiceProvider *iface)
+{
+    return 2;
+}
+
+static nsrefcnt NSAPI nsDirectoryServiceProvider_Release(nsIDirectoryServiceProvider *iface)
+{
+    return 1;
+}
+
+static nsresult create_profile_directory(void)
+{
+    static const WCHAR wine_geckoW[] = {'\\','w','i','n','e','_','g','e','c','k','o',0};
+
+    WCHAR path[MAX_PATH + sizeof(wine_geckoW)/sizeof(WCHAR)];
+    nsAString str;
+    PRBool exists;
+    nsresult nsres;
+    HRESULT hres;
+
+    hres = SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_DEFAULT, path);
+    if(FAILED(hres)) {
+        ERR("SHGetFolderPath failed: %08x\n", hres);
+        return NS_ERROR_FAILURE;
+    }
+
+    strcatW(path, wine_geckoW);
+    nsAString_InitDepend(&str, path);
+    nsres = NS_NewLocalFile(&str, FALSE, &profile_directory);
+    nsAString_Finish(&str);
+    if(NS_FAILED(nsres)) {
+        ERR("NS_NewLocalFile failed: %08x\n", nsres);
+        return nsres;
+    }
+
+    nsres = nsIFile_Exists(profile_directory, &exists);
+    if(NS_FAILED(nsres)) {
+        ERR("Exists failed: %08x\n", nsres);
+        return nsres;
+    }
+
+    if(!exists) {
+        nsres = nsIFile_Create(profile_directory, 1, 0700);
+        if(NS_FAILED(nsres))
+            ERR("Create failed: %08x\n", nsres);
+    }
+
+    return nsres;
+}
+
+static nsresult NSAPI nsDirectoryServiceProvider_GetFile(nsIDirectoryServiceProvider *iface,
+        const char *prop, PRBool *persistent, nsIFile **_retval)
+{
+    TRACE("(%s %p %p)\n", debugstr_a(prop), persistent, _retval);
+
+    if(!strcmp(prop, "ProfD")) {
+        if(!profile_directory) {
+            nsresult nsres;
+
+            nsres = create_profile_directory();
+            if(NS_FAILED(nsres))
+                return nsres;
+        }
+
+        return nsIFile_Clone(profile_directory, _retval);
+    }
+
+    return NS_ERROR_FAILURE;
+}
+
+#undef NSWEAKREF_THIS
+
+static const nsIDirectoryServiceProviderVtbl nsDirectoryServiceProviderVtbl = {
+    nsDirectoryServiceProvider_QueryInterface,
+    nsDirectoryServiceProvider_AddRef,
+    nsDirectoryServiceProvider_Release,
+    nsDirectoryServiceProvider_GetFile
+};
+
+static nsIDirectoryServiceProvider nsDirectoryServiceProvider =
+    { &nsDirectoryServiceProviderVtbl };
+
 static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     NSContainer *This;
@@ -424,7 +527,7 @@ static BOOL init_xpcom(const PRUnichar *gre_path)
         return FALSE;
     }
 
-    nsres = NS_InitXPCOM2(&pServMgr, gre_dir, NULL);
+    nsres = NS_InitXPCOM2(&pServMgr, gre_dir, &nsDirectoryServiceProvider);
     if(NS_FAILED(nsres)) {
         ERR("NS_InitXPCOM2 failed: %08x\n", nsres);
         FreeLibrary(hXPCOM);
@@ -785,6 +888,11 @@ void close_gecko(void)
 
     release_nsio();
 
+    if(profile_directory) {
+        nsIFile_Release(profile_directory);
+        profile_directory = NULL;
+    }
+
     if(pCompMgr)
         nsIComponentManager_Release(pCompMgr);
 
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index ab50ee1..5b4ab6a 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -1917,6 +1917,8 @@ interface nsIFile : nsISupports
     nsresult SetPermissionsOfLink(PRUint32 pPermissions);
     nsresult GetLastModifiedTime(PRInt64 *aLastModifiedTime);
     nsresult SetLastModifiedTime(PRInt64 aLastModifiedTime);
+    nsresult GetLastModifiedTimeOfLink(PRInt64 *aLastModifiedTimeOfLink);
+    nsresult SetLastModifiedTimeOfLink(PRInt64 aLastModifiedTimeOfLink);
     nsresult GetFileSize(PRInt64 *aFileSize);
     nsresult SetFileSize(PRInt64 aFileSize);
     nsresult GetFileSizeOfLink(PRInt64 *aFileSizeOfLink);
@@ -1970,6 +1972,16 @@ interface nsIPrefBranch : nsISupports
 
 [
     object,
+    uuid(bbf8cab0-d43a-11d3-8cc2-00609792278c),
+    local
+]
+interface nsIDirectoryServiceProvider : nsISupports
+{
+    nsresult GetFile(const char *prop, PRBool *persistent, nsIFile **_retval);
+}
+
+[
+    object,
     uuid(15fd6940-8ea7-11d3-93ad-00104ba0fd40),
     local
 ]




More information about the wine-cvs mailing list