static HRESULT WINAPI HTMLXMLHttpRequest_setRequestHeader(IHTMLXMLHttpRequest *iface, BSTR bstrHeader, BSTR bstrValue) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); char *header_u, *value_u; nsACString header, value; nsresult nsres; TRACE("(%p)->(%s %s)\n", This, debugstr_w(bstrHeader), debugstr_w(bstrValue)); header_u = heap_strdupWtoU(bstrHeader); if(bstrHeader && !header_u) return E_OUTOFMEMORY; value_u = heap_strdupWtoU(bstrValue); if(bstrValue && !value_u) { heap_free(header_u); return E_OUTOFMEMORY; } nsACString_InitDepend(&header, header_u); nsACString_InitDepend(&value, value_u); nsres = nsIXMLHttpRequest_SetRequestHeader(This->nsxhr, &header, &value); nsACString_Finish(&header); nsACString_Finish(&value); heap_free(header_u); heap_free(value_u); if(NS_FAILED(nsres)) { ERR("SetRequestHeader failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_GetTypeInfo(IHTMLXMLHttpRequest *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); return IDispatchEx_GetTypeInfo(&This->event_target.dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); }
static HRESULT WINAPI HTMLXMLHttpRequest_getAllResponseHeaders(IHTMLXMLHttpRequest *iface, BSTR *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); nsACString nscstr; nsresult nsres; HRESULT hres; LONG state; TRACE("(%p)->(%p)\n", This, p); if(!p) return E_POINTER; hres = IHTMLXMLHttpRequest_get_readyState(iface, &state); if(FAILED(hres)) return hres; if(state < 2) { *p = NULL; return E_FAIL; } nsACString_Init(&nscstr, NULL); nsres = nsIXMLHttpRequest_GetAllResponseHeaders(This->nsxhr, &nscstr); return return_nscstr(nsres, &nscstr, p); }
static HRESULT WINAPI HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest *iface, BSTR bstrHeader, BSTR *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); nsACString header, ret; char *cstr; nsresult nsres; HRESULT hres; LONG state; TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrHeader), p); if(!p) return E_POINTER; if(!bstrHeader) return E_INVALIDARG; hres = IHTMLXMLHttpRequest_get_readyState(iface, &state); if(FAILED(hres)) return hres; if(state < 2) { *p = NULL; return E_FAIL; } cstr = heap_strdupWtoU(bstrHeader); nsACString_InitDepend(&header, cstr); nsACString_Init(&ret, NULL); nsres = nsIXMLHttpRequest_GetResponseHeader(This->nsxhr, &header, &ret); nsACString_Finish(&header); heap_free(cstr); return return_nscstr(nsres, &ret, p); }
static HRESULT WINAPI HTMLXMLHttpRequest_send(IHTMLXMLHttpRequest *iface, VARIANT varBody) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); nsresult nsres; TRACE("(%p)->(%s)\n", This, debugstr_variant(&varBody)); switch(V_VT(&varBody)) { case VT_NULL: case VT_EMPTY: case VT_ERROR: break; default: FIXME("varBody(%s) unsupported\n", debugstr_variant(&varBody)); return E_FAIL; } nsres = nsIXMLHttpRequest_Send(This->nsxhr, NULL); if(NS_FAILED(nsres)) { ERR("nsIXMLHttpRequest_Send failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_put_onreadystatechange(IHTMLXMLHttpRequest *iface, VARIANT v) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); return set_event_handler(&This->event_target, EVENTID_READYSTATECHANGE, &v); }
static HRESULT WINAPI HTMLXMLHttpRequest_get_onreadystatechange(IHTMLXMLHttpRequest *iface, VARIANT *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); TRACE("(%p)->(%p)\n", This, p); return get_event_handler(&This->event_target, EVENTID_READYSTATECHANGE, p); }
static HRESULT WINAPI HTMLXMLHttpRequest_Invoke(IHTMLXMLHttpRequest *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); return IDispatchEx_Invoke(&This->event_target.dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); }
static HRESULT WINAPI HTMLXMLHttpRequest_GetIDsOfNames(IHTMLXMLHttpRequest *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); return IDispatchEx_GetIDsOfNames(&This->event_target.dispex.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); }
static ULONG WINAPI HTMLXMLHttpRequest_AddRef(IHTMLXMLHttpRequest *iface) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); return ref; }
static HRESULT WINAPI HTMLXMLHttpRequest_get_responseText(IHTMLXMLHttpRequest *iface, BSTR *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); nsAString nsstr; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); if(!p) return E_POINTER; nsAString_Init(&nsstr, NULL); nsres = nsIXMLHttpRequest_GetResponseText(This->nsxhr, &nsstr); return return_nsstr(nsres, &nsstr, p); }
static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); nsresult nsres; TRACE("(%p)->()\n", This); nsres = nsIXMLHttpRequest_SlowAbort(This->nsxhr); if(NS_FAILED(nsres)) { ERR("nsIXMLHttpRequest_SlowAbort failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static ULONG WINAPI HTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest *iface) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { if(This->event_listener) detach_xhr_event_listener(This->event_listener); release_dispex(&This->event_target.dispex); nsIXMLHttpRequest_Release(This->nsxhr); heap_free(This); } return ref; }
static HRESULT WINAPI HTMLXMLHttpRequest_get_readyState(IHTMLXMLHttpRequest *iface, LONG *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); UINT16 val; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); if(!p) return E_POINTER; nsres = nsIXMLHttpRequest_GetReadyState(This->nsxhr, &val); if(NS_FAILED(nsres)) { ERR("nsIXMLHttpRequest_GetReadyState failed: %08x\n", nsres); return E_FAIL; } *p = val; return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_send(IHTMLXMLHttpRequest *iface, VARIANT varBody) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); nsIWritableVariant *nsbody = NULL; nsresult nsres = NS_OK; TRACE("(%p)->(%s)\n", This, debugstr_variant(&varBody)); switch(V_VT(&varBody)) { case VT_NULL: case VT_EMPTY: case VT_ERROR: break; case VT_BSTR: { nsAString nsstr; nsbody = create_nsvariant(); if(!nsbody) return E_OUTOFMEMORY; nsAString_InitDepend(&nsstr, V_BSTR(&varBody)); nsres = nsIWritableVariant_SetAsAString(nsbody, &nsstr); nsAString_Finish(&nsstr); break; } default: FIXME("unsupported body type %s\n", debugstr_variant(&varBody)); return E_NOTIMPL; } if(NS_SUCCEEDED(nsres)) nsres = nsIXMLHttpRequest_Send(This->nsxhr, (nsIVariant*)nsbody); if(nsbody) nsIWritableVariant_Release(nsbody); if(NS_FAILED(nsres)) { ERR("nsIXMLHttpRequest_Send failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_get_status(IHTMLXMLHttpRequest *iface, LONG *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); DWORD val; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); if(!p) return E_POINTER; nsres = nsIXMLHttpRequest_GetStatus(This->nsxhr, &val); if(NS_FAILED(nsres)) { ERR("nsIXMLHttpRequest_GetStatus failed: %08x\n", nsres); return E_FAIL; } *p = val; if(val == 0) return E_FAIL; /* WinAPI thinks this is an error */ return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *iface, IDispatch **p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); IXMLDOMDocument *xmldoc = NULL; BSTR str; HRESULT hres; VARIANT_BOOL vbool; IObjectSafety *safety; TRACE("(%p)->(%p)\n", This, p); hres = CoCreateInstance(&CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&xmldoc); if(FAILED(hres)) { ERR("CoCreateInstance failed: %08x\n", hres); return hres; } hres = IHTMLXMLHttpRequest_get_responseText(iface, &str); if(FAILED(hres)) { IXMLDOMDocument_Release(xmldoc); ERR("get_responseText failed: %08x\n", hres); return hres; } hres = IXMLDOMDocument_loadXML(xmldoc, str, &vbool); SysFreeString(str); if(hres != S_OK || vbool != VARIANT_TRUE) WARN("loadXML failed: %08x, returning an empty xmldoc\n", hres); hres = IXMLDOMDocument_QueryInterface(xmldoc, &IID_IObjectSafety, (void**)&safety); assert(SUCCEEDED(hres)); hres = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER); assert(SUCCEEDED(hres)); IObjectSafety_Release(safety); *p = (IDispatch*)xmldoc; return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest *iface, REFIID riid, void **ppv) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); if(IsEqualGUID(&IID_IUnknown, riid)) { *ppv = &This->IHTMLXMLHttpRequest_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { *ppv = &This->IHTMLXMLHttpRequest_iface; }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequest, riid)) { *ppv = &This->IHTMLXMLHttpRequest_iface; }else if(dispex_query_interface(&This->event_target.dispex, riid, ppv)) { return *ppv ? S_OK : E_NOINTERFACE; }else { *ppv = NULL; WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); return E_NOINTERFACE; } IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_setRequestHeader(IHTMLXMLHttpRequest *iface, BSTR bstrHeader, BSTR bstrValue) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); FIXME("(%p)->(%s %s)\n", This, debugstr_w(bstrHeader), debugstr_w(bstrValue)); return E_NOTIMPL; }
static HRESULT WINAPI HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest *iface, BSTR bstrHeader, BSTR *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(bstrHeader), p); return E_NOTIMPL; }
static HRESULT WINAPI HTMLXMLHttpRequest_getAllResponseHeaders(IHTMLXMLHttpRequest *iface, BSTR *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); FIXME("(%p)->(%p)\n", This, p); return E_NOTIMPL; }
static HRESULT WINAPI HTMLXMLHttpRequest_open(IHTMLXMLHttpRequest *iface, BSTR bstrMethod, BSTR bstrUrl, VARIANT varAsync, VARIANT varUser, VARIANT varPassword) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); nsACString method, url; nsAString user, password; nsresult nsres; HRESULT hres; TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_w(bstrMethod), debugstr_w(bstrUrl), debugstr_variant(&varAsync), debugstr_variant(&varUser), debugstr_variant(&varPassword)); if(V_VT(&varAsync) != VT_BOOL) { FIXME("varAsync not supported: %s\n", debugstr_variant(&varAsync)); return E_FAIL; } /* Note: Starting with Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), * synchronous requests on the main thread have been deprecated due to the negative * effects to the user experience. */ if(!V_BOOL(&varAsync)) { FIXME("Synchronous request is not supported yet\n"); return E_FAIL; } hres = variant_to_nsastr(varUser, &user); if(FAILED(hres)) return hres; hres = variant_to_nsastr(varPassword, &password); if(FAILED(hres)) { nsAString_Finish(&user); return hres; } hres = bstr_to_nsacstr(bstrMethod, &method); if(FAILED(hres)) { nsAString_Finish(&user); nsAString_Finish(&password); return hres; } hres = bstr_to_nsacstr(bstrUrl, &url); if(FAILED(hres)) { nsAString_Finish(&user); nsAString_Finish(&password); nsACString_Finish(&method); return hres; } nsres = nsIXMLHttpRequest_Open(This->nsxhr, &method, &url, TRUE, &user, &password, 0); nsACString_Finish(&method); nsACString_Finish(&url); nsAString_Finish(&user); nsAString_Finish(&password); if(NS_FAILED(nsres)) { ERR("nsIXMLHttpRequest_Open failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); FIXME("(%p)->()\n", This); return E_NOTIMPL; }
static HRESULT WINAPI HTMLXMLHttpRequest_get_statusText(IHTMLXMLHttpRequest *iface, BSTR *p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); FIXME("(%p)->(%p)\n", This, p); return E_NOTIMPL; }
static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *iface, IDispatch **p) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); FIXME("(%p)->(%p)\n", This, p); return E_NOTIMPL; }
static HRESULT WINAPI HTMLXMLHttpRequest_GetTypeInfoCount(IHTMLXMLHttpRequest *iface, UINT *pctinfo) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); return IDispatchEx_GetTypeInfoCount(&This->event_target.dispex.IDispatchEx_iface, pctinfo); }