Jacek Caban : mshtml: Reimplement nsIURL:: GetDirectory using new helper functions.

Alexandre Julliard julliard at winehq.org
Wed Jan 11 13:40:00 CST 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jan 11 19:41:02 2012 +0100

mshtml: Reimplement nsIURL::GetDirectory using new helper functions.

---

 dlls/mshtml/nsio.c |   77 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 56 insertions(+), 21 deletions(-)

diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 4e31534..1c69a64 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -151,6 +151,31 @@ static const char *debugstr_nsacstr(const nsACString *nsstr)
     return debugstr_a(data);
 }
 
+static nsresult return_wstr_nsacstr(nsACString *ret_str, const WCHAR *str, int len)
+{
+    char *stra;
+    int lena;
+
+    TRACE("returning %s\n", debugstr_wn(str, len));
+
+    if(!*str) {
+        nsACString_SetData(ret_str, "");
+        return NS_OK;
+    }
+
+    lena = WideCharToMultiByte(CP_ACP, 0, str, len, NULL, 0, NULL, NULL);
+    stra = heap_alloc(lena+1);
+    if(!stra)
+        return NS_ERROR_OUT_OF_MEMORY;
+
+    WideCharToMultiByte(CP_ACP, 0, str, len, stra, lena, NULL, NULL);
+    stra[lena] = 0;
+
+    nsACString_SetData(ret_str, stra);
+    heap_free(stra);
+    return NS_OK;
+}
+
 HRESULT nsuri_to_url(LPCWSTR nsuri, BOOL ret_empty, BSTR *ret)
 {
     const WCHAR *ptr = nsuri;
@@ -2543,41 +2568,51 @@ static nsresult NSAPI nsURL_SetQuery(nsIURL *iface, const nsACString *aQuery)
     return NS_OK;
 }
 
-static nsresult NSAPI nsURL_GetDirectory(nsIURL *iface, nsACString *aDirectory)
+static nsresult get_uri_path(nsWineURI *This, BSTR *path, const WCHAR **file, const WCHAR **ext)
 {
-    nsWineURI *This = impl_from_nsIURL(iface);
-    char *dir = NULL;
-    WCHAR *ptr;
-    BSTR path;
+    const WCHAR *ptr;
     HRESULT hres;
 
-    TRACE("(%p)->(%p)\n", This, aDirectory);
-
     if(!ensure_uri(This))
         return NS_ERROR_UNEXPECTED;
 
-    hres = IUri_GetPath(This->uri, &path);
+    hres = IUri_GetPath(This->uri, path);
     if(FAILED(hres))
         return NS_ERROR_FAILURE;
 
-    ptr = strrchrW(path, '/');
-    if(ptr) {
-        if(ptr[1])
-            *ptr = 0;
-        dir = heap_strdupWtoA(path);
-        if(!dir) {
-            SysFreeString(path);
-            return NS_ERROR_OUT_OF_MEMORY;
-        }
+    for(ptr = *path + SysStringLen(*path)-1; ptr > *path && *ptr != '/' && *ptr != '\\'; ptr--);
+    if(*ptr == '/' || *ptr == '\\')
+        ptr++;
+    *file = ptr;
+
+    if(ext) {
+        ptr = strrchrW(ptr, '.');
+        if(!ptr)
+            ptr = *path + SysStringLen(*path);
+        *ext = ptr;
     }
 
-    SysFreeString(path);
-    TRACE("ret %s\n", debugstr_a(dir));
-    nsACString_SetData(aDirectory, dir ? dir : "");
-    heap_free(dir);
     return NS_OK;
 }
 
+static nsresult NSAPI nsURL_GetDirectory(nsIURL *iface, nsACString *aDirectory)
+{
+    nsWineURI *This = impl_from_nsIURL(iface);
+    const WCHAR *file;
+    BSTR path;
+    nsresult nsres;
+
+    TRACE("(%p)->(%p)\n", This, aDirectory);
+
+    nsres = get_uri_path(This, &path, &file, NULL);
+    if(NS_FAILED(nsres))
+        return nsres;
+
+    nsres = return_wstr_nsacstr(aDirectory, path, file-path);
+    SysFreeString(path);
+    return nsres;
+}
+
 static nsresult NSAPI nsURL_SetDirectory(nsIURL *iface, const nsACString *aDirectory)
 {
     nsWineURI *This = impl_from_nsIURL(iface);




More information about the wine-cvs mailing list