Jacek Caban : mshtml: Use IUriBuilder for IURI::SetQuery implementation.

Alexandre Julliard julliard at winehq.org
Fri Nov 12 11:22:35 CST 2010


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov 12 12:31:41 2010 +0100

mshtml: Use IUriBuilder for IURI::SetQuery implementation.

---

 dlls/mshtml/nsio.c |  137 +++++++++++++++++++++++++++++----------------------
 1 files changed, 78 insertions(+), 59 deletions(-)

diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 578f1b5..91a4659 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -63,8 +63,9 @@ struct  nsWineURI {
     NSContainer *container;
     windowref_t *window_ref;
     nsChannelBSC *channel_bsc;
-    LPWSTR wine_url;
+    BSTR wine_url;
     IUri *uri;
+    IUriBuilder *uri_builder;
     BOOL is_doc_uri;
 };
 
@@ -248,12 +249,12 @@ HRESULT set_wine_url(nsWineURI *This, LPCWSTR url)
     TRACE("(%p)->(%s)\n", This, debugstr_w(url));
 
     if(url) {
-        WCHAR *new_url;
+        BSTR new_url;
 
-        new_url = heap_strdupW(url);
+        new_url = SysAllocString(url);
         if(!new_url)
             return E_OUTOFMEMORY;
-        heap_free(This->wine_url);
+        SysFreeString(This->wine_url);
         This->wine_url = new_url;
     }else {
         heap_free(This->wine_url);
@@ -1529,19 +1530,74 @@ static const nsIHttpChannelInternalVtbl nsHttpChannelInternalVtbl = {
 
 static BOOL ensure_uri(nsWineURI *This)
 {
-    if(!This->uri) {
+    HRESULT hres;
+
+    if(This->uri)
+        return TRUE;
+
+    if(This->uri_builder) {
+        hres = IUriBuilder_CreateUriSimple(This->uri_builder, 0, 0, &This->uri);
+        if(FAILED(hres)) {
+            WARN("CreateUriSimple failed: %08x\n", hres);
+            return FALSE;
+        }
+
+        return TRUE;
+    }
+
+    hres = CreateUri(This->wine_url, 0, 0, &This->uri);
+    if(FAILED(hres)) {
+        WARN("CreateUri failed: %08x\n", hres);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+static void invalidate_uri(nsWineURI *This)
+{
+    if(This->uri) {
+        IUri_Release(This->uri);
+        This->uri = NULL;
+    }
+}
+
+static BOOL ensure_uri_builder(nsWineURI *This)
+{
+    if(!This->uri_builder) {
         HRESULT hres;
 
-        hres = CreateUri(This->wine_url, 0, 0, &This->uri);
+        if(!ensure_uri(This))
+            return FALSE;
+
+        hres = CreateIUriBuilder(This->uri, 0, 0, &This->uri_builder);
         if(FAILED(hres)) {
-            WARN("CreateUri failed: %08x\n", hres);
+            WARN("CreateIUriBulder failed: %08x\n", hres);
             return FALSE;
         }
     }
 
+    invalidate_uri(This);
     return TRUE;
 }
 
+/* Temporary helper */
+static void sync_wine_url(nsWineURI *This)
+{
+    BSTR new_url;
+    HRESULT hres;
+
+    if(!ensure_uri(This))
+        return;
+
+    hres = IUri_GetDisplayUri(This->uri, &new_url);
+    if(FAILED(hres))
+        return;
+
+    SysFreeString(This->wine_url);
+    This->wine_url = new_url;
+}
+
 static nsresult get_uri_string(nsWineURI *This, Uri_PROPERTY prop, nsACString *ret)
 {
     char *vala;
@@ -1568,14 +1624,6 @@ static nsresult get_uri_string(nsWineURI *This, Uri_PROPERTY prop, nsACString *r
     return NS_OK;
 }
 
-static void invalidate_uri(nsWineURI *This)
-{
-    if(This->uri) {
-        IUri_Release(This->uri);
-        This->uri = NULL;
-    }
-}
-
 #define NSURI_THIS(iface) DEFINE_THIS(nsWineURI, IURL, iface)
 
 static nsresult NSAPI nsURI_QueryInterface(nsIURL *iface, nsIIDRef riid, void **result)
@@ -1635,7 +1683,7 @@ static nsrefcnt NSAPI nsURI_Release(nsIURL *iface)
             nsIURI_Release(This->nsuri);
         if(This->uri)
             IUri_Release(This->uri);
-        heap_free(This->wine_url);
+        SysFreeString(This->wine_url);
         heap_free(This);
     }
 
@@ -2189,55 +2237,26 @@ static nsresult NSAPI nsURL_GetQuery(nsIURL *iface, nsACString *aQuery)
 static nsresult NSAPI nsURL_SetQuery(nsIURL *iface, const nsACString *aQuery)
 {
     nsWineURI *This = NSURI_THIS(iface);
-    const WCHAR *ptr1, *ptr2;
-    const char *query;
-    WCHAR *new_url, *ptr;
-    DWORD len, size;
+    const char *querya;
+    WCHAR *query;
+    HRESULT hres;
 
     TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aQuery));
 
-    invalidate_uri(This);
-
-    if(This->nsurl)
-        nsIURL_SetQuery(This->nsurl, aQuery);
-
-    if(!This->wine_url)
-        return NS_OK;
-
-    nsACString_GetData(aQuery, &query);
-    size = len = MultiByteToWideChar(CP_ACP, 0, query, -1, NULL, 0);
-    ptr1 = strchrW(This->wine_url, '?');
-    if(ptr1) {
-        size += ptr1-This->wine_url;
-        ptr2 = strchrW(ptr1, '#');
-        if(ptr2)
-            size += strlenW(ptr2);
-    }else {
-        ptr1 = This->wine_url + strlenW(This->wine_url);
-        ptr2 = NULL;
-        size += strlenW(This->wine_url);
-    }
-
-    if(*query)
-        size++;
+    if(!ensure_uri_builder(This))
+        return NS_ERROR_UNEXPECTED;
 
-    new_url = heap_alloc(size*sizeof(WCHAR));
-    memcpy(new_url, This->wine_url, (ptr1-This->wine_url)*sizeof(WCHAR));
-    ptr = new_url + (ptr1-This->wine_url);
-    if(*query) {
-        *ptr++ = '?';
-        MultiByteToWideChar(CP_ACP, 0, query, -1, ptr, len);
-        ptr += len-1;
-    }
-    if(ptr2)
-        strcpyW(ptr, ptr2);
-    else
-        *ptr = 0;
+    nsACString_GetData(aQuery, &querya);
+    query = heap_strdupAtoW(querya);
+    if(!query)
+        return NS_ERROR_OUT_OF_MEMORY;
 
-    TRACE("setting %s\n", debugstr_w(new_url));
+    hres = IUriBuilder_SetQuery(This->uri_builder, query);
+    heap_free(query);
+    if(FAILED(hres))
+        return NS_ERROR_UNEXPECTED;
 
-    heap_free(This->wine_url);
-    This->wine_url = new_url;
+    sync_wine_url(This);
     return NS_OK;
 }
 




More information about the wine-cvs mailing list