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