Jacek Caban : msxml3: Use IUri for storing XMLHTTPRequest URL.

Alexandre Julliard julliard at winehq.org
Thu Dec 6 16:25:10 CST 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Dec  6 14:24:46 2012 +0100

msxml3: Use IUri for storing XMLHTTPRequest URL.

---

 dlls/msxml3/httprequest.c |  100 +++++++++++++++++++++++++-------------------
 1 files changed, 57 insertions(+), 43 deletions(-)

diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
index 7fbb836..848a470 100644
--- a/dlls/msxml3/httprequest.c
+++ b/dlls/msxml3/httprequest.c
@@ -82,8 +82,8 @@ typedef struct
     /* request */
     BINDVERB verb;
     BSTR custom;
-    BSTR siteurl;
-    BSTR url;
+    IUri *uri;
+    IUri *base_uri;
     BOOL async;
     struct list reqheaders;
     /* cached resulting custom request headers string length in WCHARs */
@@ -736,7 +736,7 @@ static HRESULT BindStatusCallback_create(httprequest* This, BindStatusCallback *
     {
         IMoniker *moniker;
 
-        hr = CreateURLMoniker(NULL, This->url, &moniker);
+        hr = CreateURLMonikerEx2(NULL, This->uri, &moniker, URL_MK_UNIFORM);
         if (hr == S_OK)
         {
             IStream *stream;
@@ -772,10 +772,14 @@ static HRESULT httprequest_open(httprequest *This, BSTR method, BSTR url,
     if (!method || !url) return E_INVALIDARG;
 
     /* free previously set data */
-    SysFreeString(This->url);
+    if(This->uri) {
+        IUri_Release(This->uri);
+        This->uri = NULL;
+    }
+
     SysFreeString(This->user);
     SysFreeString(This->password);
-    This->url = This->user = This->password = NULL;
+    This->user = This->password = NULL;
 
     if (!strcmpiW(method, MethodGetW))
     {
@@ -802,22 +806,14 @@ static HRESULT httprequest_open(httprequest *This, BSTR method, BSTR url,
         return E_FAIL;
     }
 
-    /* try to combine with site url */
-    if (This->siteurl && PathIsRelativeW(url))
-    {
-        DWORD len = INTERNET_MAX_URL_LENGTH;
-        WCHAR *fullW = heap_alloc(len*sizeof(WCHAR));
-
-        hr = UrlCombineW(This->siteurl, url, fullW, &len, 0);
-        if (hr == S_OK)
-        {
-            TRACE("combined url %s\n", debugstr_w(fullW));
-            This->url = SysAllocString(fullW);
-        }
-        heap_free(fullW);
-    }
+    if(This->base_uri)
+        hr = CoInternetCombineUrlEx(This->base_uri, url, 0, &This->uri, 0);
     else
-        This->url = SysAllocString(url);
+        hr = CreateUri(url, 0, 0, &This->uri);
+    if(FAILED(hr)) {
+        WARN("Could not create IUri object: %08x\n", hr);
+        return hr;
+    }
 
     VariantInit(&is_async);
     hr = VariantChangeType(&is_async, &async, 0, VT_BOOL);
@@ -1141,10 +1137,12 @@ static void httprequest_release(httprequest *This)
 
     if (This->site)
         IUnknown_Release( This->site );
+    if (This->uri)
+        IUri_Release(This->uri);
+    if (This->base_uri)
+        IUri_Release(This->base_uri);
 
     SysFreeString(This->custom);
-    SysFreeString(This->siteurl);
-    SysFreeString(This->url);
     SysFreeString(This->user);
     SysFreeString(This->password);
 
@@ -1444,6 +1442,38 @@ static HRESULT WINAPI httprequest_ObjectWithSite_GetSite( IObjectWithSite *iface
     return IUnknown_QueryInterface( This->site, iid, ppvSite );
 }
 
+static void get_base_uri(httprequest *This)
+{
+    IServiceProvider *provider;
+    IHTMLDocument2 *doc;
+    IUri *uri;
+    BSTR url;
+    HRESULT hr;
+
+    hr = IUnknown_QueryInterface(This->site, &IID_IServiceProvider, (void**)&provider);
+    if(FAILED(hr))
+        return;
+
+    hr = IServiceProvider_QueryService(provider, &SID_SContainerDispatch, &IID_IHTMLDocument2, (void**)&doc);
+    IServiceProvider_Release(provider);
+    if(FAILED(hr))
+        return;
+
+    hr = IHTMLDocument2_get_URL(doc, &url);
+    IHTMLDocument2_Release(doc);
+    if(FAILED(hr) || !url || !*url)
+        return;
+
+    TRACE("host url %s\n", debugstr_w(url));
+
+    hr = CreateUri(url, 0, 0, &uri);
+    SysFreeString(url);
+    if(FAILED(hr))
+        return;
+
+    This->base_uri = uri;
+}
+
 static HRESULT WINAPI httprequest_ObjectWithSite_SetSite( IObjectWithSite *iface, IUnknown *punk )
 {
     httprequest *This = impl_from_IObjectWithSite(iface);
@@ -1452,32 +1482,15 @@ static HRESULT WINAPI httprequest_ObjectWithSite_SetSite( IObjectWithSite *iface
 
     if(This->site)
         IUnknown_Release( This->site );
+    if(This->base_uri)
+        IUri_Release(This->base_uri);
 
-    SysFreeString(This->siteurl);
-    This->siteurl = NULL;
     This->site = punk;
 
     if (punk)
     {
-        IServiceProvider *provider;
-        HRESULT hr;
-
         IUnknown_AddRef( punk );
-
-        hr = IUnknown_QueryInterface(This->site, &IID_IServiceProvider, (void**)&provider);
-        if (hr == S_OK)
-        {
-            IHTMLDocument2 *doc;
-
-            hr = IServiceProvider_QueryService(provider, &SID_SContainerDispatch, &IID_IHTMLDocument2, (void**)&doc);
-            if (hr == S_OK)
-            {
-                hr = IHTMLDocument2_get_URL(doc, &This->siteurl);
-                IHTMLDocument2_Release(doc);
-                TRACE("host url %s, 0x%08x\n", debugstr_w(This->siteurl), hr);
-            }
-            IServiceProvider_Release(provider);
-        }
+        get_base_uri(This);
     }
 
     return S_OK;
@@ -1831,7 +1844,8 @@ static void init_httprequest(httprequest *req)
     req->async = FALSE;
     req->verb = -1;
     req->custom = NULL;
-    req->url = req->siteurl = req->user = req->password = NULL;
+    req->uri = req->base_uri = NULL;
+    req->user = req->password = NULL;
 
     req->state = READYSTATE_UNINITIALIZED;
     req->sink = NULL;




More information about the wine-cvs mailing list