static void cache_index(void* data /* ignored */, void* index, xmlChar* name) { cache_index_data* index_data = (cache_index_data*)index; if (index_data->index-- == 0) *index_data->out = bstr_from_xmlChar(name); }
HRESULT node_get_base_name(xmlnode *This, BSTR *name) { if (!name) return E_INVALIDARG; *name = bstr_from_xmlChar(This->node->name); if (!*name) return E_OUTOFMEMORY; TRACE("returning %s\n", debugstr_w(*name)); return S_OK; }
static HRESULT WINAPI xmldoc_get_version(IXMLDocument *iface, BSTR *p) { xmldoc *This = impl_from_IXMLDocument(iface); TRACE("(%p, %p)\n", This, p); if (!p) return E_INVALIDARG; *p = bstr_from_xmlChar(This->xmldoc->version); return S_OK; }
static HRESULT WINAPI domtext_get_data( IXMLDOMText *iface, BSTR *p) { domtext *This = impl_from_IXMLDOMText( iface ); if(!p) return E_INVALIDARG; *p = bstr_from_xmlChar(This->node.node->content); return S_OK; }
static void *wineXmlOpenCallback (char const * filename) { BSTR sFilename = bstr_from_xmlChar( (const xmlChar*)filename); HANDLE hFile; TRACE("%s\n", debugstr_w(sFilename)); hFile = CreateFileW(sFilename, GENERIC_READ,FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) hFile = 0; SysFreeString(sFilename); return hFile; }
HRESULT node_get_content(xmlnode *This, VARIANT *value) { xmlChar *content; if(!value) return E_INVALIDARG; content = xmlNodeGetContent(This->node); V_VT(value) = VT_BSTR; V_BSTR(value) = bstr_from_xmlChar( content ); xmlFree(content); TRACE("%p returned %s\n", This, debugstr_w(V_BSTR(value))); return S_OK; }
HRESULT node_get_prefix(xmlnode *This, BSTR *prefix) { xmlNsPtr ns = This->node->ns; if (!prefix) return E_INVALIDARG; *prefix = NULL; if (ns && ns->prefix) *prefix = bstr_from_xmlChar(ns->prefix); TRACE("prefix: %s\n", debugstr_w(*prefix)); return *prefix ? S_OK : S_FALSE; }
static HRESULT WINAPI domtext_get_nodeValue( IXMLDOMText *iface, VARIANT* value ) { domtext *This = impl_from_IXMLDOMText( iface ); TRACE("(%p)->(%p)\n", This, value); if(!value) return E_INVALIDARG; V_VT(value) = VT_BSTR; V_BSTR(value) = bstr_from_xmlChar(This->node.node->content); return S_OK; }
static HRESULT WINAPI xmlelem_get_tagName(IXMLElement *iface, BSTR *p) { xmlelem *This = impl_from_IXMLElement(iface); TRACE("(%p, %p)\n", iface, p); if (!p) return E_INVALIDARG; *p = bstr_from_xmlChar(This->node->name); CharUpperBuffW(*p, SysStringLen(*p)); TRACE("returning %s\n", debugstr_w(*p)); return S_OK; }
HRESULT node_get_namespaceURI(xmlnode *This, BSTR *namespaceURI) { xmlNsPtr ns = This->node->ns; if(!namespaceURI) return E_INVALIDARG; *namespaceURI = NULL; if (ns && ns->href) *namespaceURI = bstr_from_xmlChar(ns->href); TRACE("uri: %s\n", debugstr_w(*namespaceURI)); return *namespaceURI ? S_OK : S_FALSE; }
static HRESULT WINAPI xmlelem_get_text(IXMLElement *iface, BSTR *p) { xmlelem *This = impl_from_IXMLElement(iface); xmlChar *content; TRACE("(%p, %p)\n", iface, p); if (!p) return E_INVALIDARG; content = xmlNodeGetContent(This->node); *p = bstr_from_xmlChar(content); TRACE("returning %s\n", debugstr_w(*p)); xmlFree(content); return S_OK; }
static HRESULT WINAPI xmldoc_get_doctype(IXMLDocument *iface, BSTR *p) { xmldoc *This = impl_from_IXMLDocument(iface); xmlDtd *dtd; TRACE("(%p, %p)\n", This, p); if (!p) return E_INVALIDARG; dtd = xmlGetIntSubset(This->xmldoc); if (!dtd) return S_FALSE; *p = bstr_from_xmlChar(dtd->name); CharUpperBuffW(*p, SysStringLen(*p)); return S_OK; }
static HRESULT WINAPI xmlelem_get_tagName(IXMLElement *iface, BSTR *p) { xmlelem *This = impl_from_IXMLElement(iface); BSTR temp; TRACE("(%p, %p)\n", iface, p); if (!p) return E_INVALIDARG; temp = bstr_from_xmlChar(This->node->name); *p = str_dup_upper(temp); SysFreeString(temp); TRACE("returning %s\n", debugstr_w(*p)); return S_OK; }
static HRESULT WINAPI domcomment_substringData( IXMLDOMComment *iface, long offset, long count, BSTR *p) { domcomment *This = impl_from_IXMLDOMComment( iface ); xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node ); xmlChar *pContent; long nLength = 0; HRESULT hr = S_FALSE; TRACE("%p\n", iface); if(!p) return E_INVALIDARG; *p = NULL; if(offset < 0 || count < 0) return E_INVALIDARG; if(count == 0) return hr; pContent = xmlNodeGetContent(pDOMNode->node); if(pContent) { nLength = xmlStrlen(pContent); if( offset < nLength) { BSTR sContent = bstr_from_xmlChar(pContent); if(offset + count > nLength) *p = SysAllocString(&sContent[offset]); else *p = SysAllocStringLen(&sContent[offset], count); SysFreeString(sContent); hr = S_OK; } xmlFree(pContent); } return hr; }
static HRESULT WINAPI schema_cache_get_namespaceURI(IXMLDOMSchemaCollection2* iface, LONG index, BSTR* uri) { schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface); TRACE("(%p)->(%i %p)\n", This, index, uri); if (!uri) return E_POINTER; if (This->version == MSXML6) *uri = NULL; if (index >= This->count) return E_FAIL; *uri = bstr_from_xmlChar(This->uris[index]); return S_OK; }
static HRESULT WINAPI xmlelem_getAttribute(IXMLElement *iface, BSTR strPropertyName, VARIANT *PropertyValue) { xmlelem *This = impl_from_IXMLElement(iface); xmlChar *val = NULL, *name; xmlAttrPtr ptr; TRACE("(%p, %s, %p)\n", iface, debugstr_w(strPropertyName), PropertyValue); if (!PropertyValue) return E_INVALIDARG; VariantInit(PropertyValue); V_BSTR(PropertyValue) = NULL; if (!strPropertyName) return E_INVALIDARG; name = xmlChar_from_wchar(strPropertyName); ptr = This->node->properties; while (ptr) { if (!lstrcmpiA((LPSTR)name, (LPCSTR)ptr->name)) { val = xmlNodeListGetString(ptr->doc, ptr->children, 1); break; } ptr = ptr->next; } if (val) { V_VT(PropertyValue) = VT_BSTR; V_BSTR(PropertyValue) = bstr_from_xmlChar(val); } HeapFree(GetProcessHeap(), 0, name); xmlFree(val); TRACE("returning %s\n", debugstr_w(V_BSTR(PropertyValue))); return (val) ? S_OK : S_FALSE; }
HRESULT node_get_text(const xmlnode *This, BSTR *text) { BSTR str = NULL; xmlChar *content; if (!text) return E_INVALIDARG; content = do_get_text(This->node); if (content) { str = bstr_from_xmlChar(content); xmlFree(content); } /* Always return a string. */ if (!str) str = SysAllocStringLen( NULL, 0 ); TRACE("%p %s\n", This, debugstr_w(str) ); *text = str; return S_OK; }
/* * We are trying to replicate the same behaviour as msxml by converting * line endings to \r\n and using indents as \t. The problem is that msxml * only formats nodes that have a line ending. Using libxml we cannot * reproduce behaviour exactly. * */ HRESULT node_get_xml(xmlnode *This, BOOL ensure_eol, BSTR *ret) { xmlBufferPtr xml_buf; xmlNodePtr xmldecl; int size; if(!ret) return E_INVALIDARG; *ret = NULL; xml_buf = xmlBufferCreate(); if(!xml_buf) return E_OUTOFMEMORY; xmldecl = xmldoc_unlink_xmldecl( This->node->doc ); size = xmlNodeDump(xml_buf, This->node->doc, This->node, 0, 1); if(size > 0) { const xmlChar *buf_content; BSTR content; /* Attribute Nodes return a space in front of their name */ buf_content = xmlBufferContent(xml_buf); content = bstr_from_xmlChar(buf_content + (buf_content[0] == ' ' ? 1 : 0)); if(ensure_eol) content = EnsureCorrectEOL(content); *ret = content; }else { *ret = SysAllocStringLen(NULL, 0); } xmlBufferFree(xml_buf); xmldoc_link_xmldecl( This->node->doc, xmldecl ); return *ret ? S_OK : E_OUTOFMEMORY; }
static HRESULT WINAPI xmlelem_getAttribute(IXMLElement *iface, BSTR name, VARIANT *value) { static const WCHAR xmllangW[] = { 'x','m','l',':','l','a','n','g',0 }; xmlelem *This = impl_from_IXMLElement(iface); xmlChar *val = NULL; TRACE("(%p)->(%s, %p)\n", This, debugstr_w(name), value); if (!value) return E_INVALIDARG; VariantInit(value); V_BSTR(value) = NULL; if (!name) return E_INVALIDARG; /* case for xml:lang attribute */ if (!lstrcmpiW(name, xmllangW)) { xmlNsPtr ns; ns = xmlSearchNs(This->node->doc, This->node, (xmlChar*)"xml"); val = xmlGetNsProp(This->node, (xmlChar*)"lang", ns->href); } else { xmlAttrPtr attr; xmlChar *xml_name; xml_name = xmlchar_from_wchar(name); attr = This->node->properties; while (attr) { BSTR attr_name; attr_name = bstr_from_xmlChar(attr->name); if (!lstrcmpiW(name, attr_name)) { val = xmlNodeListGetString(attr->doc, attr->children, 1); SysFreeString(attr_name); break; } attr = attr->next; SysFreeString(attr_name); } heap_free(xml_name); } if (val) { V_VT(value) = VT_BSTR; V_BSTR(value) = bstr_from_xmlChar(val); } xmlFree(val); TRACE("returning %s\n", debugstr_w(V_BSTR(value))); return (val) ? S_OK : S_FALSE; }
static HRESULT WINAPI domcomment_insertData( IXMLDOMComment *iface, long offset, BSTR p) { domcomment *This = impl_from_IXMLDOMComment( iface ); xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node ); xmlChar *pXmlContent; BSTR sNewString; HRESULT hr = S_FALSE; long nLength = 0, nLengthP = 0; xmlChar *str = NULL; TRACE("%p\n", This); /* If have a NULL or empty string, don't do anything. */ if(SysStringLen(p) == 0) return S_OK; if(offset < 0) { return E_INVALIDARG; } pXmlContent = xmlNodeGetContent(pDOMNode->node); if(pXmlContent) { BSTR sContent = bstr_from_xmlChar( pXmlContent ); nLength = SysStringLen(sContent); nLengthP = SysStringLen(p); if(nLength < offset) { SysFreeString(sContent); xmlFree(pXmlContent); return E_INVALIDARG; } sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1); if(sNewString) { if(offset > 0) memcpy(sNewString, sContent, offset * sizeof(WCHAR)); memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR)); if(offset+nLengthP < nLength) memcpy(&sNewString[offset+nLengthP], &sContent[offset], (nLength-offset) * sizeof(WCHAR)); sNewString[nLengthP + nLength] = 0; str = xmlChar_from_wchar((WCHAR*)sNewString); if(str) { xmlNodeSetContent(pDOMNode->node, str); hr = S_OK; } SysFreeString(sNewString); } SysFreeString(sContent); xmlFree(pXmlContent); } return hr; }
HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR *p) { #ifdef SONAME_LIBXSLT xsltStylesheetPtr xsltSS; xmlnode *sheet; if (!libxslt_handle) return E_NOTIMPL; if (!stylesheet || !p) return E_INVALIDARG; *p = NULL; sheet = get_node_obj(stylesheet); if(!sheet) return E_FAIL; xsltSS = pxsltParseStylesheetDoc(sheet->node->doc); if(xsltSS) { xmlDocPtr result = pxsltApplyStylesheet(xsltSS, This->node->doc, NULL); if(result) { const xmlChar *content; if(result->type == XML_HTML_DOCUMENT_NODE) { xmlOutputBufferPtr output = xmlAllocOutputBuffer(NULL); if (output) { htmldoc_dumpcontent(output, result->doc); content = xmlBufferContent(output->buffer); *p = bstr_from_xmlChar(content); xmlOutputBufferClose(output); } } else { xmlBufferPtr buf = xmlBufferCreate(); if (buf) { int size = xmlNodeDump(buf, NULL, (xmlNodePtr)result, 0, 0); if(size > 0) { content = xmlBufferContent(buf); *p = bstr_from_xmlChar(content); } xmlBufferFree(buf); } } xmlFreeDoc(result); } /* libxslt "helpfully" frees the XML document the stylesheet was generated from, too */ xsltSS->doc = NULL; pxsltFreeStylesheet(xsltSS); } if(!*p) *p = SysAllocStringLen(NULL, 0); return S_OK; #else FIXME("libxslt headers were not found at compile time\n"); return E_NOTIMPL; #endif }