static cache_entry* cache_entry_from_url(VARIANT url, xmlChar const* nsURI, MSXML_VERSION version) { cache_entry* entry; IXMLDOMDocument3* domdoc = NULL; xmlDocPtr doc = NULL; HRESULT hr = DOMDocument_create(version, (void**)&domdoc); VARIANT_BOOL b = VARIANT_FALSE; CacheEntryType type = CacheEntryType_Invalid; if (hr != S_OK) { FIXME("failed to create domdoc\n"); return NULL; } assert(domdoc != NULL); assert(V_VT(&url) == VT_BSTR); hr = IXMLDOMDocument3_load(domdoc, url, &b); if (hr != S_OK) { ERR("IXMLDOMDocument3_load() returned 0x%08x\n", hr); if (b != VARIANT_TRUE) { FIXME("Failed to load doc at %s\n", debugstr_w(V_BSTR(&url))); IXMLDOMDocument3_Release(domdoc); return NULL; } } doc = xmlNodePtr_from_domnode((IXMLDOMNode*)domdoc, XML_DOCUMENT_NODE)->doc; type = cache_type_from_xmlDocPtr(doc); switch (type) { case CacheEntryType_XSD: entry = cache_entry_from_xsd_doc(doc, nsURI, version); break; case CacheEntryType_XDR: entry = cache_entry_from_xdr_doc(doc, nsURI, version); break; default: entry = NULL; FIXME("invalid schema\n"); break; } IXMLDOMDocument3_Release(domdoc); return entry; }
static HRESULT WINAPI httprequest_get_responseXML(IXMLHTTPRequest *iface, IDispatch **body) { httprequest *This = impl_from_IXMLHTTPRequest( iface ); IXMLDOMDocument3 *doc; HRESULT hr; BSTR str; TRACE("(%p)->(%p)\n", This, body); if (!body) return E_INVALIDARG; if (This->state != READYSTATE_COMPLETE) return E_FAIL; hr = DOMDocument_create(MSXML_DEFAULT, NULL, (void**)&doc); if (hr != S_OK) return hr; hr = IXMLHTTPRequest_get_responseText(iface, &str); if (hr == S_OK) { VARIANT_BOOL ok; hr = IXMLDOMDocument3_loadXML(doc, str, &ok); SysFreeString(str); } IXMLDOMDocument3_QueryInterface(doc, &IID_IDispatch, (void**)body); IXMLDOMDocument3_Release(doc); return hr; }
static HRESULT WINAPI domattr_get_nodeTypedValue( IXMLDOMAttribute *iface, VARIANT* value) { domattr *This = impl_from_IXMLDOMAttribute( iface ); IXMLDOMDocument *doc; HRESULT hr; TRACE("(%p)->(%p)\n", This, value); hr = IXMLDOMAttribute_get_ownerDocument(iface, &doc); if (hr == S_OK) { IXMLDOMDocument3 *doc3; hr = IXMLDOMDocument_QueryInterface(doc, &IID_IXMLDOMDocument3, (void**)&doc3); IXMLDOMDocument_Release(doc); if (hr == S_OK) { VARIANT schemas; hr = IXMLDOMDocument3_get_schemas(doc3, &schemas); IXMLDOMDocument3_Release(doc3); if (hr != S_OK) return IXMLDOMAttribute_get_value(iface, value); else { FIXME("need to query schema for attribute type\n"); VariantClear(&schemas); } } } return return_null_var(value); }
static inline HRESULT handle_xml_load(BindStatusCallback *This) { static const WCHAR selectW[] = {'p','r','o','c','e','s','s','i','n','g','-', 'i','n','s','t','r','u','c','t','i','o','n','(','\'','x','m','l', '-','s','t','y','l','e','s','h','e','e','t','\'',')',0}; static const WCHAR hrefW[] = {'h','r','e','f','=',0}; IXMLDOMDocument3 *xml = NULL, *xsl = NULL; IXMLDOMNode *stylesheet; IBindCtx *pbc; IMoniker *mon; LPOLESTR xsl_url; LARGE_INTEGER off; VARIANT_BOOL succ; VARIANT var; WCHAR *href = NULL, *p; BSTR bstr; HRESULT hres; off.QuadPart = 0; hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL); if(FAILED(hres)) return display_error_page(This); hres = DOMDocument_create(MSXML_DEFAULT, NULL, (void**)&xml); if(FAILED(hres)) return display_error_page(This); V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)This->stream; hres = IXMLDOMDocument3_load(xml, var, &succ); if(FAILED(hres) || !succ) { IXMLDOMDocument3_Release(xml); return display_error_page(This); } V_VT(&var) = VT_EMPTY; bstr = SysAllocString(selectW); hres = IXMLDOMDocument3_selectSingleNode(xml, bstr, &stylesheet); SysFreeString(bstr); if(hres != S_OK) { IXMLDOMDocument3_Release(xml); return display_error_page(This); } hres = IXMLDOMNode_get_nodeValue(stylesheet, &var); IXMLDOMNode_Release(stylesheet); if(SUCCEEDED(hres) && V_VT(&var)!=VT_BSTR) { FIXME("Variant type %d not supported\n", V_VT(&var)); VariantClear(&var); hres = E_FAIL; } if(FAILED(hres)) { IXMLDOMDocument3_Release(xml); return display_error_page(This); } /* TODO: fix parsing processing instruction value */ if((p = strstrW(V_BSTR(&var), hrefW))) { p += sizeof(hrefW)/sizeof(WCHAR)-1; if(*p!='\'' && *p!='\"') p = NULL; else { href = p+1; p = strchrW(href, *p); } } if(p) { *p = 0; } else { VariantClear(&var); IXMLDOMDocument3_Release(xml); return display_error_page(This); } hres = CreateURLMonikerEx(This->mon, href, &mon, 0); VariantClear(&var); if(FAILED(hres)) { IXMLDOMDocument3_Release(xml); return display_error_page(This); } hres = CreateBindCtx(0, &pbc); if(SUCCEEDED(hres)) { hres = IMoniker_GetDisplayName(mon, pbc, NULL, &xsl_url); IMoniker_Release(mon); IBindCtx_Release(pbc); } if(FAILED(hres)) { IXMLDOMDocument3_Release(xml); return display_error_page(This); } V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(xsl_url); CoTaskMemFree(xsl_url); if(!V_BSTR(&var)) { IXMLDOMDocument3_Release(xml); return display_error_page(This); } hres = DOMDocument_create(MSXML_DEFAULT, NULL, (void**)&xsl); if(FAILED(hres)) { VariantClear(&var); IXMLDOMDocument3_Release(xml); return display_error_page(This); } /* TODO: do the binding asynchronously */ hres = IXMLDOMDocument3_load(xsl, var, &succ); VariantClear(&var); if(FAILED(hres) || !succ) { IXMLDOMDocument3_Release(xsl); IXMLDOMDocument3_Release(xml); return display_error_page(This); } hres = IXMLDOMDocument3_transformNode(xml, (IXMLDOMNode*)xsl, &bstr); IXMLDOMDocument3_Release(xsl); IXMLDOMDocument3_Release(xml); if(FAILED(hres)) return display_error_page(This); hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL); if(FAILED(hres)) { SysFreeString(bstr); return display_error_page(This); } hres = IStream_Write(This->stream, (BYTE*)bstr, SysStringLen(bstr)*sizeof(WCHAR), NULL); SysFreeString(bstr); if(FAILED(hres)) return display_error_page(This); return report_data(This); }