Alistair Leslie-Hughes : msxml3: Add IObjectWithSite support to IXMLHttpRequest.

Alexandre Julliard julliard at winehq.org
Fri Feb 18 10:50:18 CST 2011


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

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Thu Feb 17 20:26:15 2011 +1100

msxml3: Add IObjectWithSite support to IXMLHttpRequest.

---

 dlls/msxml3/httprequest.c  |   76 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/msxml3/tests/domdoc.c |    5 +++
 2 files changed, 81 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
index 0be4fbb..12eaa08 100644
--- a/dlls/msxml3/httprequest.c
+++ b/dlls/msxml3/httprequest.c
@@ -61,6 +61,7 @@ struct reqheader
 typedef struct
 {
     IXMLHTTPRequest IXMLHTTPRequest_iface;
+    IObjectWithSite IObjectWithSite_iface;
     LONG ref;
 
     READYSTATE state;
@@ -81,6 +82,9 @@ typedef struct
     /* bind callback */
     BindStatusCallback *bsc;
     LONG status;
+
+    /* IObjectWithSite*/
+    IUnknown *site;
 } httprequest;
 
 static inline httprequest *impl_from_IXMLHTTPRequest( IXMLHTTPRequest *iface )
@@ -88,6 +92,11 @@ static inline httprequest *impl_from_IXMLHTTPRequest( IXMLHTTPRequest *iface )
     return CONTAINING_RECORD(iface, httprequest, IXMLHTTPRequest_iface);
 }
 
+static inline httprequest *impl_from_IObjectWithSite(IObjectWithSite *iface)
+{
+    return CONTAINING_RECORD(iface, httprequest, IObjectWithSite_iface);
+}
+
 static void httprequest_setreadystate(httprequest *This, READYSTATE state)
 {
     READYSTATE last = This->state;
@@ -503,6 +512,10 @@ static HRESULT WINAPI httprequest_QueryInterface(IXMLHTTPRequest *iface, REFIID
     {
         *ppvObject = iface;
     }
+    else if (IsEqualGUID(&IID_IObjectWithSite, riid))
+    {
+        *ppvObject = &This->IObjectWithSite_iface;
+    }
     else
     {
         TRACE("Unsupported interface %s\n", debugstr_guid(riid));
@@ -534,6 +547,9 @@ static ULONG WINAPI httprequest_Release(IXMLHTTPRequest *iface)
     {
         struct reqheader *header, *header2;
 
+        if (This->site)
+            IUnknown_Release( This->site );
+
         SysFreeString(This->url);
         SysFreeString(This->user);
         SysFreeString(This->password);
@@ -992,6 +1008,64 @@ static const struct IXMLHTTPRequestVtbl dimimpl_vtbl =
     httprequest_put_onreadystatechange
 };
 
+/* IObjectWithSite */
+static HRESULT WINAPI
+httprequest_ObjectWithSite_QueryInterface( IObjectWithSite* iface, REFIID riid, void** ppvObject )
+{
+    httprequest *This = impl_from_IObjectWithSite(iface);
+    return IXMLHTTPRequest_QueryInterface( (IXMLHTTPRequest *)This, riid, ppvObject );
+}
+
+static ULONG WINAPI httprequest_ObjectWithSite_AddRef( IObjectWithSite* iface )
+{
+    httprequest *This = impl_from_IObjectWithSite(iface);
+    return IXMLHTTPRequest_AddRef((IXMLHTTPRequest *)This);
+}
+
+static ULONG WINAPI httprequest_ObjectWithSite_Release( IObjectWithSite* iface )
+{
+    httprequest *This = impl_from_IObjectWithSite(iface);
+    return IXMLHTTPRequest_Release((IXMLHTTPRequest *)This);
+}
+
+static HRESULT WINAPI httprequest_ObjectWithSite_GetSite( IObjectWithSite *iface, REFIID iid, void **ppvSite )
+{
+    httprequest *This = impl_from_IObjectWithSite(iface);
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid( iid ), ppvSite );
+
+    if ( !This->site )
+        return E_FAIL;
+
+    return IUnknown_QueryInterface( This->site, iid, ppvSite );
+}
+
+static HRESULT WINAPI httprequest_ObjectWithSite_SetSite( IObjectWithSite *iface, IUnknown *punk )
+{
+    httprequest *This = impl_from_IObjectWithSite(iface);
+
+    TRACE("(%p)->(%p)\n", iface, punk);
+
+    if (punk)
+        IUnknown_AddRef( punk );
+
+    if(This->site)
+        IUnknown_Release( This->site );
+
+    This->site = punk;
+
+    return S_OK;
+}
+
+static const IObjectWithSiteVtbl httprequestObjectSite =
+{
+    httprequest_ObjectWithSite_QueryInterface,
+    httprequest_ObjectWithSite_AddRef,
+    httprequest_ObjectWithSite_Release,
+    httprequest_ObjectWithSite_SetSite,
+    httprequest_ObjectWithSite_GetSite
+};
+
 HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, void **ppObj)
 {
     httprequest *req;
@@ -1004,6 +1078,7 @@ HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, void **ppObj)
         return E_OUTOFMEMORY;
 
     req->IXMLHTTPRequest_iface.lpVtbl = &dimimpl_vtbl;
+    req->IObjectWithSite_iface.lpVtbl = &httprequestObjectSite;
     req->ref = 1;
 
     req->async = FALSE;
@@ -1017,6 +1092,7 @@ HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, void **ppObj)
     req->status = 0;
     req->reqheader_size = 0;
     list_init(&req->reqheaders);
+    req->site = NULL;
 
     *ppObj = &req->IXMLHTTPRequest_iface;
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index d34168e..e38d3b5 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -3216,6 +3216,7 @@ static void test_XMLHTTP(void)
     static const CHAR xmltestbodyA[] = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<a>TEST</a>\n";
 
     IXMLHttpRequest *pXMLHttpRequest;
+    IObjectWithSite *pSite;
     BSTR bstrResponse, method, url;
     VARIANT dummy;
     VARIANT async;
@@ -3232,6 +3233,10 @@ static void test_XMLHTTP(void)
         return;
     }
 
+    hr = IXMLHttpRequest_QueryInterface(pXMLHttpRequest, &IID_IObjectWithSite, (void**)&pSite);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    if(hr == S_OK) IObjectWithSite_Release(pSite);
+
     VariantInit(&dummy);
     V_VT(&dummy) = VT_ERROR;
     V_ERROR(&dummy) = DISP_E_MEMBERNOTFOUND;




More information about the wine-cvs mailing list