4 * Copyright 2005 Mike McCormack
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
34 #include "msxml_private.h"
37 # include <libxml/HTMLtree.h>
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
46 static const WCHAR szBinBase64[] = {'b','i','n','.','b','a','s','e','6','4',0};
47 static const WCHAR szString[] = {'s','t','r','i','n','g',0};
48 static const WCHAR szNumber[] = {'n','u','m','b','e','r',0};
49 static const WCHAR szInt[] = {'I','n','t',0};
50 static const WCHAR szFixed[] = {'F','i','x','e','d','.','1','4','.','4',0};
51 static const WCHAR szBoolean[] = {'B','o','o','l','e','a','n',0};
52 static const WCHAR szDateTime[] = {'d','a','t','e','T','i','m','e',0};
53 static const WCHAR szDateTimeTZ[] = {'d','a','t','e','T','i','m','e','.','t','z',0};
54 static const WCHAR szDate[] = {'D','a','t','e',0};
55 static const WCHAR szTime[] = {'T','i','m','e',0};
56 static const WCHAR szTimeTZ[] = {'T','i','m','e','.','t','z',0};
57 static const WCHAR szI1[] = {'i','1',0};
58 static const WCHAR szI2[] = {'i','2',0};
59 static const WCHAR szI4[] = {'i','4',0};
60 static const WCHAR szIU1[] = {'u','i','1',0};
61 static const WCHAR szIU2[] = {'u','i','2',0};
62 static const WCHAR szIU4[] = {'u','i','4',0};
63 static const WCHAR szR4[] = {'r','4',0};
64 static const WCHAR szR8[] = {'r','8',0};
65 static const WCHAR szFloat[] = {'f','l','o','a','t',0};
66 static const WCHAR szUUID[] = {'u','u','i','d',0};
67 static const WCHAR szBinHex[] = {'b','i','n','.','h','e','x',0};
69 static const IID IID_xmlnode = {0x4f2f4ba2,0xb822,0x11df,{0x8b,0x8a,0x68,0x50,0xdf,0xd7,0x20,0x85}};
71 xmlNodePtr xmlNodePtr_from_domnode( IXMLDOMNode *iface, xmlElementType type )
77 This = get_node_obj( iface );
78 if ( !This || !This->node )
80 if ( type && This->node->type != type )
85 BOOL node_query_interface(xmlnode *This, REFIID riid, void **ppv)
87 if(IsEqualGUID(&IID_xmlnode, riid)) {
88 TRACE("(%p)->(IID_xmlnode %p)\n", This, ppv);
93 if(This->dispex.outer)
94 return dispex_query_interface(&This->dispex, riid, ppv);
99 xmlnode *get_node_obj(IXMLDOMNode *node)
104 hres = IXMLDOMNode_QueryInterface(node, &IID_xmlnode, (void**)&obj);
105 return SUCCEEDED(hres) ? obj : NULL;
108 static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
110 return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
113 static HRESULT WINAPI xmlnode_QueryInterface(
118 ERR("Should not be called\n");
119 return E_NOINTERFACE;
122 static ULONG WINAPI xmlnode_AddRef(
125 ERR("Should not be called\n");
129 static ULONG WINAPI xmlnode_Release(
132 ERR("Should not be called\n");
136 static HRESULT WINAPI xmlnode_GetTypeInfoCount(
140 ERR("Should not be called\n");
144 static HRESULT WINAPI xmlnode_GetTypeInfo(
148 ITypeInfo** ppTInfo )
150 ERR("Should not be called\n");
154 static HRESULT WINAPI xmlnode_GetIDsOfNames(
162 ERR("Should not be called\n");
166 static HRESULT WINAPI xmlnode_Invoke(
172 DISPPARAMS* pDispParams,
174 EXCEPINFO* pExcepInfo,
177 ERR("Should not be called\n");
181 HRESULT node_get_nodeName(xmlnode *This, BSTR *name)
186 *name = bstr_from_xmlChar(This->node->name);
193 static HRESULT WINAPI xmlnode_get_nodeName(
197 ERR("Should not be called\n");
201 HRESULT node_get_content(xmlnode *This, VARIANT *value)
208 content = xmlNodeGetContent(This->node);
209 V_VT(value) = VT_BSTR;
210 V_BSTR(value) = bstr_from_xmlChar( content );
213 TRACE("%p returned %s\n", This, debugstr_w(V_BSTR(value)));
217 static HRESULT WINAPI xmlnode_get_nodeValue(
221 ERR("Should not be called\n");
225 static HRESULT WINAPI xmlnode_put_nodeValue(
229 xmlnode *This = impl_from_IXMLDOMNode( iface );
232 TRACE("%p type(%d)\n", This, This->node->type);
234 /* Document, Document Fragment, Document Type, Element,
235 Entity, Entity Reference, Notation aren't supported. */
236 switch ( This->node->type )
238 case XML_ATTRIBUTE_NODE:
239 case XML_CDATA_SECTION_NODE:
240 case XML_COMMENT_NODE:
244 VARIANT string_value;
247 VariantInit(&string_value);
248 hr = VariantChangeType(&string_value, &value, 0, VT_BSTR);
251 VariantClear(&string_value);
252 WARN("Couldn't convert to VT_BSTR\n");
256 str = xmlChar_from_wchar(V_BSTR(&string_value));
257 VariantClear(&string_value);
259 xmlNodeSetContent(This->node, str);
265 /* Do nothing for unsupported types. */
273 static HRESULT WINAPI xmlnode_get_nodeType(
277 xmlnode *This = impl_from_IXMLDOMNode( iface );
279 TRACE("(%p)->(%p)\n", This, type);
281 assert( (int)NODE_ELEMENT == (int)XML_ELEMENT_NODE );
282 assert( (int)NODE_NOTATION == (int)XML_NOTATION_NODE );
284 *type = This->node->type;
289 static HRESULT get_node(
295 TRACE("(%p)->(%s %p %p)\n", This, name, node, out );
300 /* if we don't have a doc, use our parent. */
301 if(node && !node->doc && node->parent)
302 node->doc = node->parent->doc;
304 *out = create_node( node );
310 static HRESULT WINAPI xmlnode_get_parentNode(
312 IXMLDOMNode** parent)
314 xmlnode *This = impl_from_IXMLDOMNode( iface );
315 return get_node( This, "parent", This->node->parent, parent );
318 static HRESULT WINAPI xmlnode_get_childNodes(
320 IXMLDOMNodeList** childList)
322 xmlnode *This = impl_from_IXMLDOMNode( iface );
324 TRACE("(%p)->(%p)\n", This, childList );
329 *childList = create_children_nodelist(This->node);
330 if (*childList == NULL)
331 return E_OUTOFMEMORY;
336 static HRESULT WINAPI xmlnode_get_firstChild(
338 IXMLDOMNode** firstChild)
340 xmlnode *This = impl_from_IXMLDOMNode( iface );
341 TRACE("(%p)->(%p)\n", This, firstChild);
342 return get_node( This, "firstChild", This->node->children, firstChild );
345 static HRESULT WINAPI xmlnode_get_lastChild(
347 IXMLDOMNode** lastChild)
349 xmlnode *This = impl_from_IXMLDOMNode( iface );
351 TRACE("(%p)->(%p)\n", This, lastChild );
356 switch( This->node->type )
358 /* CDATASection, Comment, PI and Text Nodes do not support lastChild */
360 case XML_CDATA_SECTION_NODE:
362 case XML_COMMENT_NODE:
366 return get_node( This, "lastChild", This->node->last, lastChild );
370 static HRESULT WINAPI xmlnode_get_previousSibling(
372 IXMLDOMNode** previousSibling)
374 xmlnode *This = impl_from_IXMLDOMNode( iface );
376 TRACE("(%p)->(%p)\n", This, previousSibling );
378 if (!previousSibling)
381 switch( This->node->type )
383 /* Attribute, Document and Document Fragment Nodes do not support previousSibling */
384 case XML_DOCUMENT_NODE:
385 case XML_DOCUMENT_FRAG_NODE:
386 case XML_ATTRIBUTE_NODE:
387 *previousSibling = NULL;
390 return get_node( This, "previous", This->node->prev, previousSibling );
394 static HRESULT WINAPI xmlnode_get_nextSibling(
396 IXMLDOMNode** nextSibling)
398 xmlnode *This = impl_from_IXMLDOMNode( iface );
400 TRACE("(%p)->(%p)\n", This, nextSibling );
405 switch( This->node->type )
407 /* Attribute, Document and Document Fragment Nodes do not support nextSibling */
408 case XML_DOCUMENT_NODE:
409 case XML_DOCUMENT_FRAG_NODE:
410 case XML_ATTRIBUTE_NODE:
414 return get_node( This, "next", This->node->next, nextSibling );
418 static HRESULT WINAPI xmlnode_get_attributes(
420 IXMLDOMNamedNodeMap** attributeMap)
422 xmlnode *This = impl_from_IXMLDOMNode( iface );
423 TRACE("(%p)->(%p)\n", This, attributeMap);
428 switch( This->node->type )
430 /* Attribute, CDataSection, Comment, Documents, Documents Fragments,
431 Entity and Text Nodes does not support get_attributes */
432 case XML_ATTRIBUTE_NODE:
433 case XML_CDATA_SECTION_NODE:
434 case XML_COMMENT_NODE:
435 case XML_DOCUMENT_NODE:
436 case XML_DOCUMENT_FRAG_NODE:
437 case XML_ENTITY_NODE:
438 case XML_ENTITY_REF_NODE:
440 *attributeMap = NULL;
443 *attributeMap = create_nodemap( This->iface );
448 static HRESULT WINAPI xmlnode_insertBefore(
450 IXMLDOMNode* newChild,
452 IXMLDOMNode** outNewChild)
454 xmlnode *This = impl_from_IXMLDOMNode( iface );
455 xmlNodePtr before_node, new_child_node;
456 IXMLDOMNode *before = NULL;
460 TRACE("(%p)->(%p var %p)\n",This,newChild,outNewChild);
465 switch(V_VT(&refChild))
472 hr = IUnknown_QueryInterface(V_UNKNOWN(&refChild), &IID_IXMLDOMNode, (LPVOID)&before);
473 if(FAILED(hr)) return hr;
477 hr = IDispatch_QueryInterface(V_DISPATCH(&refChild), &IID_IXMLDOMNode, (LPVOID)&before);
478 if(FAILED(hr)) return hr;
482 FIXME("refChild var type %x\n", V_VT(&refChild));
486 node_obj = get_node_obj(newChild);
488 FIXME("newChild is not our node implementation\n");
492 new_child_node = node_obj->node;
493 TRACE("new_child_node %p This->node %p\n", new_child_node, This->node);
495 if(!new_child_node->parent)
496 if(xmldoc_remove_orphan(new_child_node->doc, new_child_node) != S_OK)
497 WARN("%p is not an orphan of %p\n", new_child_node, new_child_node->doc);
501 node_obj = get_node_obj(before);
502 IXMLDOMNode_Release(before);
504 FIXME("before node is not our node implementation\n");
508 before_node = node_obj->node;
509 xmlAddPrevSibling(before_node, new_child_node);
513 xmlAddChild(This->node, new_child_node);
516 IXMLDOMNode_AddRef(newChild);
518 *outNewChild = newChild;
524 static HRESULT WINAPI xmlnode_replaceChild(
526 IXMLDOMNode* newChild,
527 IXMLDOMNode* oldChild,
528 IXMLDOMNode** outOldChild)
530 xmlnode *This = impl_from_IXMLDOMNode( iface );
531 xmlnode *old_child, *new_child;
532 xmlDocPtr leaving_doc;
533 xmlNode *my_ancestor;
535 TRACE("(%p)->(%p %p %p)\n", This, newChild, oldChild, outOldChild);
537 /* Do not believe any documentation telling that newChild == NULL
538 means removal. It does certainly *not* apply to msxml3! */
539 if(!newChild || !oldChild)
545 old_child = get_node_obj(oldChild);
547 FIXME("oldChild is not our node implementation\n");
551 if(old_child->node->parent != This->node)
553 WARN("childNode %p is not a child of %p\n", oldChild, iface);
557 new_child = get_node_obj(newChild);
559 FIXME("newChild is not our node implementation\n");
563 my_ancestor = This->node;
566 if(my_ancestor == new_child->node)
568 WARN("tried to create loop\n");
571 my_ancestor = my_ancestor->parent;
574 if(!new_child->node->parent)
575 if(xmldoc_remove_orphan(new_child->node->doc, new_child->node) != S_OK)
576 WARN("%p is not an orphan of %p\n", new_child->node, new_child->node->doc);
578 leaving_doc = new_child->node->doc;
579 xmldoc_add_ref(old_child->node->doc);
580 xmlReplaceNode(old_child->node, new_child->node);
581 xmldoc_release(leaving_doc);
583 xmldoc_add_orphan(old_child->node->doc, old_child->node);
587 IXMLDOMNode_AddRef(oldChild);
588 *outOldChild = oldChild;
594 static HRESULT WINAPI xmlnode_removeChild(
596 IXMLDOMNode* childNode,
597 IXMLDOMNode** oldChild)
599 xmlnode *This = impl_from_IXMLDOMNode( iface );
602 TRACE("(%p)->(%p %p)\n", This, childNode, oldChild);
604 if(!childNode) return E_INVALIDARG;
609 child_node = get_node_obj(childNode);
611 FIXME("childNode is not our node implementation\n");
615 if(child_node->node->parent != This->node)
617 WARN("childNode %p is not a child of %p\n", childNode, iface);
621 xmlUnlinkNode(child_node->node);
625 IXMLDOMNode_AddRef(childNode);
626 *oldChild = childNode;
632 static HRESULT WINAPI xmlnode_appendChild(
634 IXMLDOMNode* newChild,
635 IXMLDOMNode** outNewChild)
637 xmlnode *This = impl_from_IXMLDOMNode( iface );
642 TRACE("(%p)->(%p %p)\n", This, newChild, outNewChild);
644 hr = IXMLDOMNode_get_nodeType(newChild, &type);
645 if(FAILED(hr) || type == NODE_ATTRIBUTE) {
646 if(outNewChild) *outNewChild = NULL;
651 return IXMLDOMNode_insertBefore(This->iface, newChild, var, outNewChild);
654 static HRESULT WINAPI xmlnode_hasChildNodes(
656 VARIANT_BOOL* hasChild)
658 xmlnode *This = impl_from_IXMLDOMNode( iface );
660 TRACE("(%p)->(%p)\n", This, hasChild);
664 if (!This->node->children)
666 *hasChild = VARIANT_FALSE;
670 *hasChild = VARIANT_TRUE;
674 static HRESULT WINAPI xmlnode_get_ownerDocument(
676 IXMLDOMDocument** DOMDocument)
678 xmlnode *This = impl_from_IXMLDOMNode( iface );
680 TRACE("(%p)->(%p)\n", This, DOMDocument);
682 return DOMDocument_create_from_xmldoc(This->node->doc, (IXMLDOMDocument3**)DOMDocument);
685 static HRESULT WINAPI xmlnode_cloneNode(
688 IXMLDOMNode** cloneRoot)
690 xmlnode *This = impl_from_IXMLDOMNode( iface );
691 xmlNodePtr pClone = NULL;
692 IXMLDOMNode *pNode = NULL;
694 TRACE("(%p)->(%d %p)\n", This, deep, cloneRoot);
699 pClone = xmlCopyNode(This->node, deep ? 1 : 2);
702 pClone->doc = This->node->doc;
703 xmldoc_add_orphan(pClone->doc, pClone);
705 pNode = create_node(pClone);
708 ERR("Copy failed\n");
716 ERR("Copy failed\n");
723 static HRESULT WINAPI xmlnode_get_nodeTypeString(
727 xmlnode *This = impl_from_IXMLDOMNode( iface );
730 TRACE("(%p)->(%p)\n", This, xmlnodeType );
738 switch( This->node->type )
740 case XML_ATTRIBUTE_NODE:
741 str = (const xmlChar*) "attribute";
743 case XML_CDATA_SECTION_NODE:
744 str = (const xmlChar*) "cdatasection";
746 case XML_COMMENT_NODE:
747 str = (const xmlChar*) "comment";
749 case XML_DOCUMENT_NODE:
750 str = (const xmlChar*) "document";
752 case XML_DOCUMENT_FRAG_NODE:
753 str = (const xmlChar*) "documentfragment";
755 case XML_ELEMENT_NODE:
756 str = (const xmlChar*) "element";
758 case XML_ENTITY_NODE:
759 str = (const xmlChar*) "entity";
761 case XML_ENTITY_REF_NODE:
762 str = (const xmlChar*) "entityreference";
764 case XML_NOTATION_NODE:
765 str = (const xmlChar*) "notation";
768 str = (const xmlChar*) "processinginstruction";
771 str = (const xmlChar*) "text";
774 FIXME("Unknown node type (%d)\n", This->node->type);
775 str = This->node->name;
779 *xmlnodeType = bstr_from_xmlChar( str );
786 static HRESULT WINAPI xmlnode_get_text(
790 xmlnode *This = impl_from_IXMLDOMNode( iface );
794 TRACE("(%p, type %d)->(%p)\n", This, This->node->type, text);
799 pContent = xmlNodeGetContent((xmlNodePtr)This->node);
802 str = bstr_from_xmlChar(pContent);
806 /* Always return a string. */
807 if (!str) str = SysAllocStringLen( NULL, 0 );
809 TRACE("%p %s\n", This, debugstr_w(str) );
815 static HRESULT WINAPI xmlnode_put_text(
819 xmlnode *This = impl_from_IXMLDOMNode( iface );
822 TRACE("(%p)->(%s)\n", This, debugstr_w(text));
824 switch(This->node->type)
826 case XML_DOCUMENT_NODE:
832 str = xmlChar_from_wchar(text);
834 /* Escape the string. */
835 str2 = xmlEncodeEntitiesReentrant(This->node->doc, str);
838 xmlNodeSetContent(This->node, str2);
844 static HRESULT WINAPI xmlnode_get_specified(
846 VARIANT_BOOL* isSpecified)
848 xmlnode *This = impl_from_IXMLDOMNode( iface );
849 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
850 *isSpecified = VARIANT_TRUE;
854 static HRESULT WINAPI xmlnode_get_definition(
856 IXMLDOMNode** definitionNode)
858 xmlnode *This = impl_from_IXMLDOMNode( iface );
859 FIXME("(%p)->(%p)\n", This, definitionNode);
863 static inline BYTE hex_to_byte(xmlChar c)
865 if(c <= '9') return c-'0';
866 if(c <= 'F') return c-'A'+10;
870 static inline BYTE base64_to_byte(xmlChar c)
872 if(c == '+') return 62;
873 if(c == '/') return 63;
874 if(c <= '9') return c-'0'+52;
875 if(c <= 'Z') return c-'A';
879 static inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type)
881 if(!type || !lstrcmpiW(type, szString) ||
882 !lstrcmpiW(type, szNumber) || !lstrcmpiW(type, szUUID))
885 V_BSTR(v) = bstr_from_xmlChar(str);
888 return E_OUTOFMEMORY;
890 else if(!lstrcmpiW(type, szDateTime) || !lstrcmpiW(type, szDateTimeTZ) ||
891 !lstrcmpiW(type, szDate) || !lstrcmpiW(type, szTime) ||
892 !lstrcmpiW(type, szTimeTZ))
902 st.wDayOfWeek = st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
904 V_VT(&src) = VT_BSTR;
905 V_BSTR(&src) = bstr_from_xmlChar(str);
908 return E_OUTOFMEMORY;
911 e = p + SysStringLen(V_BSTR(&src));
913 if(p+4<e && *(p+4)=='-') /* parse date (yyyy-mm-dd) */
916 st.wMonth = atoiW(p+5);
917 st.wDay = atoiW(p+8);
923 if(p+2<e && *(p+2)==':') /* parse time (hh:mm:ss.?) */
926 st.wMinute = atoiW(p+3);
927 st.wSecond = atoiW(p+6);
933 while(isdigitW(*p)) p++;
937 SystemTimeToVariantTime(&st, &date);
941 if(*p == '+') /* parse timezone offset (+hh:mm) */
942 V_DATE(v) += (DOUBLE)atoiW(p+1)/24 + (DOUBLE)atoiW(p+4)/1440;
943 else if(*p == '-') /* parse timezone offset (-hh:mm) */
944 V_DATE(v) -= (DOUBLE)atoiW(p+1)/24 + (DOUBLE)atoiW(p+4)/1440;
948 else if(!lstrcmpiW(type, szBinHex))
953 len = xmlStrlen(str)/2;
957 V_VT(v) = (VT_ARRAY|VT_UI1);
958 V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab);
961 return E_OUTOFMEMORY;
964 ((BYTE*)V_ARRAY(v)->pvData)[i] = (hex_to_byte(str[2*i])<<4)
965 + hex_to_byte(str[2*i+1]);
967 else if(!lstrcmpiW(type, szBinBase64))
972 len = xmlStrlen(str);
973 if(str[len-2] == '=') i = 2;
974 else if(str[len-1] == '=') i = 1;
978 sab.cElements = len/4*3-i;
980 V_VT(v) = (VT_ARRAY|VT_UI1);
981 V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab);
984 return E_OUTOFMEMORY;
986 for(i=0; i<len/4; i++)
988 ((BYTE*)V_ARRAY(v)->pvData)[3*i] = (base64_to_byte(str[4*i])<<2)
989 + (base64_to_byte(str[4*i+1])>>4);
990 if(3*i+1 < sab.cElements)
991 ((BYTE*)V_ARRAY(v)->pvData)[3*i+1] = (base64_to_byte(str[4*i+1])<<4)
992 + (base64_to_byte(str[4*i+2])>>2);
993 if(3*i+2 < sab.cElements)
994 ((BYTE*)V_ARRAY(v)->pvData)[3*i+2] = (base64_to_byte(str[4*i+2])<<6)
995 + base64_to_byte(str[4*i+3]);
1003 if(!lstrcmpiW(type, szInt) || !lstrcmpiW(type, szI4))
1005 else if(!lstrcmpiW(type, szFixed))
1007 else if(!lstrcmpiW(type, szBoolean))
1009 else if(!lstrcmpiW(type, szI1))
1011 else if(!lstrcmpiW(type, szI2))
1013 else if(!lstrcmpiW(type, szIU1))
1015 else if(!lstrcmpiW(type, szIU2))
1017 else if(!lstrcmpiW(type, szIU4))
1019 else if(!lstrcmpiW(type, szR4))
1021 else if(!lstrcmpiW(type, szR8) || !lstrcmpiW(type, szFloat))
1025 FIXME("Type handling not yet implemented\n");
1029 V_VT(&src) = VT_BSTR;
1030 V_BSTR(&src) = bstr_from_xmlChar(str);
1033 return E_OUTOFMEMORY;
1035 hres = VariantChangeTypeEx(v, &src, MAKELCID(MAKELANGID(
1036 LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT),0, V_VT(v));
1044 static HRESULT WINAPI xmlnode_get_nodeTypedValue(
1046 VARIANT* typedValue)
1048 xmlnode *This = impl_from_IXMLDOMNode( iface );
1051 HRESULT hres = S_FALSE;
1053 TRACE("(%p)->(%p)\n", This, typedValue);
1056 return E_INVALIDARG;
1058 V_VT(typedValue) = VT_NULL;
1060 if(This->node->type == XML_ELEMENT_NODE ||
1061 This->node->type == XML_TEXT_NODE ||
1062 This->node->type == XML_ENTITY_REF_NODE)
1063 hres = IXMLDOMNode_get_dataType(This->iface, &type);
1065 if(hres != S_OK && This->node->type != XML_ELEMENT_NODE)
1066 return IXMLDOMNode_get_nodeValue(This->iface, typedValue);
1068 content = xmlNodeGetContent(This->node);
1069 hres = VARIANT_from_xmlChar(content, typedValue,
1070 hres==S_OK ? V_BSTR(&type) : NULL);
1072 VariantClear(&type);
1077 static HRESULT WINAPI xmlnode_put_nodeTypedValue(
1081 xmlnode *This = impl_from_IXMLDOMNode( iface );
1082 FIXME("%p\n", This);
1086 static HRESULT WINAPI xmlnode_get_dataType(
1088 VARIANT* dataTypeName)
1090 xmlnode *This = impl_from_IXMLDOMNode( iface );
1093 TRACE("(%p)->(%p)\n", This, dataTypeName);
1096 return E_INVALIDARG;
1098 /* Attribute, CDATA Section, Comment, Document, Document Fragment,
1099 Entity, Notation, PI, and Text Node are non-typed. */
1100 V_BSTR(dataTypeName) = NULL;
1101 V_VT(dataTypeName) = VT_NULL;
1103 switch ( This->node->type )
1105 case XML_ELEMENT_NODE:
1106 pVal = xmlGetNsProp(This->node, (const xmlChar*)"dt",
1107 (const xmlChar*)"urn:schemas-microsoft-com:datatypes");
1110 V_VT(dataTypeName) = VT_BSTR;
1111 V_BSTR(dataTypeName) = bstr_from_xmlChar( pVal );
1115 case XML_ENTITY_REF_NODE:
1116 FIXME("XML_ENTITY_REF_NODE should return a valid value.\n");
1119 TRACE("Type %d returning NULL\n", This->node->type);
1122 /* non-typed nodes return S_FALSE */
1123 if(V_VT(dataTypeName) == VT_NULL)
1131 static HRESULT WINAPI xmlnode_put_dataType(
1135 xmlnode *This = impl_from_IXMLDOMNode( iface );
1136 HRESULT hr = E_FAIL;
1138 TRACE("(%p)->(%s)\n", This, debugstr_w(dataTypeName));
1140 if(dataTypeName == NULL)
1141 return E_INVALIDARG;
1143 /* An example of this is. The Text in the node needs to be a 0 or 1 for a boolean type.
1144 This applies to changing types (string->bool) or setting a new one
1146 FIXME("Need to Validate the data before allowing a type to be set.\n");
1148 /* Check all supported types. */
1149 if(lstrcmpiW(dataTypeName,szString) == 0 ||
1150 lstrcmpiW(dataTypeName,szNumber) == 0 ||
1151 lstrcmpiW(dataTypeName,szUUID) == 0 ||
1152 lstrcmpiW(dataTypeName,szInt) == 0 ||
1153 lstrcmpiW(dataTypeName,szI4) == 0 ||
1154 lstrcmpiW(dataTypeName,szFixed) == 0 ||
1155 lstrcmpiW(dataTypeName,szBoolean) == 0 ||
1156 lstrcmpiW(dataTypeName,szDateTime) == 0 ||
1157 lstrcmpiW(dataTypeName,szDateTimeTZ) == 0 ||
1158 lstrcmpiW(dataTypeName,szDate) == 0 ||
1159 lstrcmpiW(dataTypeName,szTime) == 0 ||
1160 lstrcmpiW(dataTypeName,szTimeTZ) == 0 ||
1161 lstrcmpiW(dataTypeName,szI1) == 0 ||
1162 lstrcmpiW(dataTypeName,szI2) == 0 ||
1163 lstrcmpiW(dataTypeName,szIU1) == 0 ||
1164 lstrcmpiW(dataTypeName,szIU2) == 0 ||
1165 lstrcmpiW(dataTypeName,szIU4) == 0 ||
1166 lstrcmpiW(dataTypeName,szR4) == 0 ||
1167 lstrcmpiW(dataTypeName,szR8) == 0 ||
1168 lstrcmpiW(dataTypeName,szFloat) == 0 ||
1169 lstrcmpiW(dataTypeName,szBinHex) == 0 ||
1170 lstrcmpiW(dataTypeName,szBinBase64) == 0)
1172 xmlNsPtr pNS = NULL;
1173 xmlAttrPtr pAttr = NULL;
1174 xmlChar* str = xmlChar_from_wchar(dataTypeName);
1176 pAttr = xmlHasNsProp(This->node, (const xmlChar*)"dt",
1177 (const xmlChar*)"urn:schemas-microsoft-com:datatypes");
1180 pAttr = xmlSetNsProp(This->node, pAttr->ns, (const xmlChar*)"dt", str);
1186 pNS = xmlNewNs(This->node, (const xmlChar*)"urn:schemas-microsoft-com:datatypes", (const xmlChar*)"dt");
1189 pAttr = xmlNewNsProp(This->node, pNS, (const xmlChar*)"dt", str);
1192 xmlAddChild(This->node, (xmlNodePtr)pAttr);
1197 ERR("Failed to create Attribute\n");
1200 ERR("Failed to Create Namepsace\n");
1208 static BSTR EnsureCorrectEOL(BSTR sInput)
1215 nLen = lstrlenW(sInput);
1216 /* Count line endings */
1217 for(i=0; i < nLen; i++)
1219 if(sInput[i] == '\n')
1223 TRACE("len=%d, num=%d\n", nLen, nNum);
1225 /* Add linefeed as needed */
1229 sNew = SysAllocStringLen(NULL, nLen + nNum+1);
1230 for(i=0; i < nLen; i++)
1232 if(sInput[i] == '\n')
1234 sNew[i+nPlace] = '\r';
1237 sNew[i+nPlace] = sInput[i];
1240 SysFreeString(sInput);
1247 TRACE("len %d\n", lstrlenW(sNew));
1252 /* Removes encoding information and last character (nullbyte) */
1253 static BSTR EnsureNoEncoding(BSTR sInput)
1255 static const WCHAR wszEncoding[] = {'e','n','c','o','d','i','n','g','='};
1260 while(*pBeg != '\n' && memcmp(pBeg, wszEncoding, sizeof(wszEncoding)))
1265 SysReAllocStringLen(&sInput, sInput, SysStringLen(sInput)-1);
1270 pEnd = pBeg + sizeof(wszEncoding)/sizeof(WCHAR) + 2;
1271 while(*pEnd != '\"') pEnd++;
1274 sNew = SysAllocStringLen(NULL,
1275 pBeg-sInput + SysStringLen(sInput)-(pEnd-sInput)-1);
1276 memcpy(sNew, sInput, (pBeg-sInput)*sizeof(WCHAR));
1277 memcpy(&sNew[pBeg-sInput], pEnd, (SysStringLen(sInput)-(pEnd-sInput)-1)*sizeof(WCHAR));
1279 SysFreeString(sInput);
1284 * We are trying to replicate the same behaviour as msxml by converting
1285 * line endings to \r\n and using indents as \t. The problem is that msxml
1286 * only formats nodes that have a line ending. Using libxml we cannot
1287 * reproduce behaviour exactly.
1290 static HRESULT WINAPI xmlnode_get_xml(
1294 xmlnode *This = impl_from_IXMLDOMNode( iface );
1295 xmlBufferPtr pXmlBuf;
1299 TRACE("(%p %d)->(%p)\n", This, This->node->type, xmlString);
1302 return E_INVALIDARG;
1306 xmldecl = xmldoc_unlink_xmldecl( This->node->doc );
1308 pXmlBuf = xmlBufferCreate();
1311 nSize = xmlNodeDump(pXmlBuf, This->node->doc, This->node, 0, 1);
1314 const xmlChar *pContent;
1317 /* Attribute Nodes return a space in front of their name */
1318 pContent = xmlBufferContent(pXmlBuf);
1319 if( ((const char*)pContent)[0] == ' ')
1320 bstrContent = bstr_from_xmlChar(pContent+1);
1322 bstrContent = bstr_from_xmlChar(pContent);
1324 switch(This->node->type)
1326 case XML_ELEMENT_NODE:
1327 *xmlString = EnsureCorrectEOL(bstrContent);
1329 case XML_DOCUMENT_NODE:
1330 *xmlString = EnsureCorrectEOL(bstrContent);
1331 *xmlString = EnsureNoEncoding(*xmlString);
1334 *xmlString = bstrContent;
1338 xmlBufferFree(pXmlBuf);
1341 xmldoc_link_xmldecl( This->node->doc, xmldecl );
1343 /* Always returns a string. */
1344 if(*xmlString == NULL) *xmlString = SysAllocStringLen( NULL, 0 );
1349 static HRESULT WINAPI xmlnode_transformNode(
1351 IXMLDOMNode* styleSheet,
1354 #ifdef SONAME_LIBXSLT
1355 xmlnode *This = impl_from_IXMLDOMNode( iface );
1356 xmlnode *pStyleSheet = NULL;
1357 xsltStylesheetPtr xsltSS = NULL;
1358 xmlDocPtr result = NULL;
1360 TRACE("(%p)->(%p %p)\n", This, styleSheet, xmlString);
1362 if (!libxslt_handle)
1364 if(!styleSheet || !xmlString)
1365 return E_INVALIDARG;
1369 pStyleSheet = get_node_obj(styleSheet);
1371 FIXME("styleSheet is not our xmlnode implementation\n");
1375 xsltSS = pxsltParseStylesheetDoc( pStyleSheet->node->doc);
1378 result = pxsltApplyStylesheet(xsltSS, This->node->doc, NULL);
1381 const xmlChar *pContent;
1383 if(result->type == XML_HTML_DOCUMENT_NODE)
1385 xmlOutputBufferPtr pOutput = xmlAllocOutputBuffer(NULL);
1388 htmlDocContentDumpOutput(pOutput, result->doc, NULL);
1389 pContent = xmlBufferContent(pOutput->buffer);
1390 *xmlString = bstr_from_xmlChar(pContent);
1391 xmlOutputBufferClose(pOutput);
1396 xmlBufferPtr pXmlBuf;
1399 pXmlBuf = xmlBufferCreate();
1402 nSize = xmlNodeDump(pXmlBuf, NULL, (xmlNodePtr)result, 0, 0);
1405 pContent = xmlBufferContent(pXmlBuf);
1406 *xmlString = bstr_from_xmlChar(pContent);
1408 xmlBufferFree(pXmlBuf);
1413 /* libxslt "helpfully" frees the XML document the stylesheet was
1414 generated from, too */
1416 pxsltFreeStylesheet(xsltSS);
1419 if(*xmlString == NULL)
1420 *xmlString = SysAllocStringLen(NULL, 0);
1424 FIXME("libxslt headers were not found at compile time\n");
1429 static HRESULT WINAPI xmlnode_selectNodes(
1432 IXMLDOMNodeList** resultList)
1434 xmlnode *This = impl_from_IXMLDOMNode( iface );
1436 TRACE("(%p)->(%s %p)\n", This, debugstr_w(queryString), resultList );
1438 return queryresult_create( This->node, queryString, resultList );
1441 static HRESULT WINAPI xmlnode_selectSingleNode(
1444 IXMLDOMNode** resultNode)
1446 xmlnode *This = impl_from_IXMLDOMNode( iface );
1447 IXMLDOMNodeList *list;
1450 TRACE("(%p)->(%s %p)\n", This, debugstr_w(queryString), resultNode );
1453 r = IXMLDOMNode_selectNodes(This->iface, queryString, &list);
1456 r = IXMLDOMNodeList_nextNode(list, resultNode);
1457 IXMLDOMNodeList_Release(list);
1462 static HRESULT WINAPI xmlnode_get_parsed(
1464 VARIANT_BOOL* isParsed)
1466 xmlnode *This = impl_from_IXMLDOMNode( iface );
1467 FIXME("(%p)->(%p) stub!\n", This, isParsed);
1468 *isParsed = VARIANT_TRUE;
1472 static HRESULT WINAPI xmlnode_get_namespaceURI(
1476 xmlnode *This = impl_from_IXMLDOMNode( iface );
1477 HRESULT hr = S_FALSE;
1480 TRACE("(%p)->(%p)\n", This, namespaceURI );
1483 return E_INVALIDARG;
1485 *namespaceURI = NULL;
1487 pNSList = xmlGetNsList(This->node->doc, This->node);
1490 *namespaceURI = bstr_from_xmlChar( pNSList[0]->href );
1499 static HRESULT WINAPI xmlnode_get_prefix(
1503 xmlnode *This = impl_from_IXMLDOMNode( iface );
1504 HRESULT hr = S_FALSE;
1507 TRACE("(%p)->(%p)\n", This, prefixString );
1510 return E_INVALIDARG;
1512 *prefixString = NULL;
1514 pNSList = xmlGetNsList(This->node->doc, This->node);
1517 *prefixString = bstr_from_xmlChar( pNSList[0]->prefix );
1526 static HRESULT WINAPI xmlnode_get_baseName(
1530 xmlnode *This = impl_from_IXMLDOMNode( iface );
1532 HRESULT r = S_FALSE;
1534 TRACE("(%p)->(%p)\n", This, nameString );
1537 return E_INVALIDARG;
1539 switch ( This->node->type )
1541 case XML_ELEMENT_NODE:
1542 case XML_ATTRIBUTE_NODE:
1544 str = bstr_from_xmlChar( This->node->name );
1548 case XML_COMMENT_NODE:
1549 case XML_DOCUMENT_NODE:
1552 ERR("Unhandled type %d\n", This->node->type );
1556 TRACE("returning %08x str = %s\n", r, debugstr_w( str ) );
1562 static HRESULT WINAPI xmlnode_transformNodeToObject(
1564 IXMLDOMNode* stylesheet,
1565 VARIANT outputObject)
1567 xmlnode *This = impl_from_IXMLDOMNode( iface );
1568 FIXME("(%p)->(%p)\n", This, stylesheet);
1572 static const struct IXMLDOMNodeVtbl xmlnode_vtbl =
1574 xmlnode_QueryInterface,
1577 xmlnode_GetTypeInfoCount,
1578 xmlnode_GetTypeInfo,
1579 xmlnode_GetIDsOfNames,
1581 xmlnode_get_nodeName,
1582 xmlnode_get_nodeValue,
1583 xmlnode_put_nodeValue,
1584 xmlnode_get_nodeType,
1585 xmlnode_get_parentNode,
1586 xmlnode_get_childNodes,
1587 xmlnode_get_firstChild,
1588 xmlnode_get_lastChild,
1589 xmlnode_get_previousSibling,
1590 xmlnode_get_nextSibling,
1591 xmlnode_get_attributes,
1592 xmlnode_insertBefore,
1593 xmlnode_replaceChild,
1594 xmlnode_removeChild,
1595 xmlnode_appendChild,
1596 xmlnode_hasChildNodes,
1597 xmlnode_get_ownerDocument,
1599 xmlnode_get_nodeTypeString,
1602 xmlnode_get_specified,
1603 xmlnode_get_definition,
1604 xmlnode_get_nodeTypedValue,
1605 xmlnode_put_nodeTypedValue,
1606 xmlnode_get_dataType,
1607 xmlnode_put_dataType,
1609 xmlnode_transformNode,
1610 xmlnode_selectNodes,
1611 xmlnode_selectSingleNode,
1613 xmlnode_get_namespaceURI,
1615 xmlnode_get_baseName,
1616 xmlnode_transformNodeToObject,
1619 void destroy_xmlnode(xmlnode *This)
1622 xmldoc_release(This->node->doc);
1625 void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispex_static_data_t *dispex_data)
1628 xmldoc_add_ref( node->doc );
1630 This->lpVtbl = &xmlnode_vtbl;
1632 This->iface = node_iface;
1635 init_dispex(&This->dispex, (IUnknown*)This->iface, dispex_data);
1637 This->dispex.outer = NULL;
1642 const IXMLDOMNodeVtbl *lpVtbl;
1646 static inline unknode *impl_from_unkIXMLDOMNode(IXMLDOMNode *iface)
1648 return (unknode *)((char*)iface - FIELD_OFFSET(unknode, lpVtbl));
1651 static HRESULT WINAPI unknode_QueryInterface(
1656 unknode *This = impl_from_unkIXMLDOMNode( iface );
1658 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
1660 if (IsEqualGUID(riid, &IID_IUnknown)) {
1662 }else if (IsEqualGUID( riid, &IID_IDispatch) ||
1663 IsEqualGUID( riid, &IID_IXMLDOMNode)) {
1664 *ppvObject = &This->lpVtbl;
1665 }else if(node_query_interface(&This->node, riid, ppvObject)) {
1666 return *ppvObject ? S_OK : E_NOINTERFACE;
1668 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1670 return E_NOINTERFACE;
1673 IUnknown_AddRef((IUnknown*)*ppvObject);
1677 static ULONG WINAPI unknode_AddRef(
1678 IXMLDOMNode *iface )
1680 unknode *This = impl_from_unkIXMLDOMNode( iface );
1682 return InterlockedIncrement(&This->ref);
1685 static ULONG WINAPI unknode_Release(
1686 IXMLDOMNode *iface )
1688 unknode *This = impl_from_unkIXMLDOMNode( iface );
1691 ref = InterlockedDecrement( &This->ref );
1693 destroy_xmlnode(&This->node);
1700 static HRESULT WINAPI unknode_GetTypeInfoCount(
1704 unknode *This = impl_from_unkIXMLDOMNode( iface );
1706 TRACE("(%p)->(%p)\n", This, pctinfo);
1713 static HRESULT WINAPI unknode_GetTypeInfo(
1717 ITypeInfo** ppTInfo )
1719 unknode *This = impl_from_unkIXMLDOMNode( iface );
1722 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1724 hr = get_typeinfo(IXMLDOMNode_tid, ppTInfo);
1729 static HRESULT WINAPI unknode_GetIDsOfNames(
1732 LPOLESTR* rgszNames,
1737 unknode *This = impl_from_unkIXMLDOMNode( iface );
1739 ITypeInfo *typeinfo;
1742 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1745 if(!rgszNames || cNames == 0 || !rgDispId)
1746 return E_INVALIDARG;
1748 hr = get_typeinfo(IXMLDOMNode_tid, &typeinfo);
1751 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1752 ITypeInfo_Release(typeinfo);
1758 static HRESULT WINAPI unknode_Invoke(
1760 DISPID dispIdMember,
1764 DISPPARAMS* pDispParams,
1765 VARIANT* pVarResult,
1766 EXCEPINFO* pExcepInfo,
1769 unknode *This = impl_from_unkIXMLDOMNode( iface );
1770 ITypeInfo *typeinfo;
1773 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1774 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1776 hr = get_typeinfo(IXMLDOMNode_tid, &typeinfo);
1779 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
1780 pVarResult, pExcepInfo, puArgErr);
1781 ITypeInfo_Release(typeinfo);
1787 static HRESULT WINAPI unknode_get_nodeName(
1791 unknode *This = impl_from_unkIXMLDOMNode( iface );
1793 FIXME("(%p)->(%p)\n", This, p);
1795 return node_get_nodeName(&This->node, p);
1798 static HRESULT WINAPI unknode_get_nodeValue(
1802 unknode *This = impl_from_unkIXMLDOMNode( iface );
1804 FIXME("(%p)->(%p)\n", This, value);
1807 return E_INVALIDARG;
1809 V_VT(value) = VT_NULL;
1813 static HRESULT WINAPI unknode_put_nodeValue(
1817 unknode *This = impl_from_unkIXMLDOMNode( iface );
1818 return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), var1 );
1821 static HRESULT WINAPI unknode_get_nodeType(
1823 DOMNodeType* domNodeType )
1825 unknode *This = impl_from_unkIXMLDOMNode( iface );
1826 return IXMLDOMNode_get_nodeType( IXMLDOMNode_from_impl(&This->node), domNodeType );
1829 static HRESULT WINAPI unknode_get_parentNode(
1831 IXMLDOMNode** parent )
1833 unknode *This = impl_from_unkIXMLDOMNode( iface );
1834 TRACE("(%p)->(%p)\n", This, parent);
1835 if (!parent) return E_INVALIDARG;
1840 static HRESULT WINAPI unknode_get_childNodes(
1842 IXMLDOMNodeList** outList)
1844 unknode *This = impl_from_unkIXMLDOMNode( iface );
1845 return IXMLDOMNode_get_childNodes( IXMLDOMNode_from_impl(&This->node), outList );
1848 static HRESULT WINAPI unknode_get_firstChild(
1850 IXMLDOMNode** domNode)
1852 unknode *This = impl_from_unkIXMLDOMNode( iface );
1853 return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(&This->node), domNode );
1856 static HRESULT WINAPI unknode_get_lastChild(
1858 IXMLDOMNode** domNode)
1860 unknode *This = impl_from_unkIXMLDOMNode( iface );
1861 return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(&This->node), domNode );
1864 static HRESULT WINAPI unknode_get_previousSibling(
1866 IXMLDOMNode** domNode)
1868 unknode *This = impl_from_unkIXMLDOMNode( iface );
1869 return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(&This->node), domNode );
1872 static HRESULT WINAPI unknode_get_nextSibling(
1874 IXMLDOMNode** domNode)
1876 unknode *This = impl_from_unkIXMLDOMNode( iface );
1877 return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(&This->node), domNode );
1880 static HRESULT WINAPI unknode_get_attributes(
1882 IXMLDOMNamedNodeMap** attributeMap)
1884 unknode *This = impl_from_unkIXMLDOMNode( iface );
1885 return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(&This->node), attributeMap );
1888 static HRESULT WINAPI unknode_insertBefore(
1890 IXMLDOMNode* newNode, VARIANT var1,
1891 IXMLDOMNode** outOldNode)
1893 unknode *This = impl_from_unkIXMLDOMNode( iface );
1894 return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(&This->node), newNode, var1, outOldNode );
1897 static HRESULT WINAPI unknode_replaceChild(
1899 IXMLDOMNode* newNode,
1900 IXMLDOMNode* oldNode,
1901 IXMLDOMNode** outOldNode)
1903 unknode *This = impl_from_unkIXMLDOMNode( iface );
1904 return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(&This->node), newNode, oldNode, outOldNode );
1907 static HRESULT WINAPI unknode_removeChild(
1909 IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
1911 unknode *This = impl_from_unkIXMLDOMNode( iface );
1912 return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode );
1915 static HRESULT WINAPI unknode_appendChild(
1917 IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
1919 unknode *This = impl_from_unkIXMLDOMNode( iface );
1920 return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(&This->node), newNode, outNewNode );
1923 static HRESULT WINAPI unknode_hasChildNodes(
1925 VARIANT_BOOL* pbool)
1927 unknode *This = impl_from_unkIXMLDOMNode( iface );
1928 return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(&This->node), pbool );
1931 static HRESULT WINAPI unknode_get_ownerDocument(
1933 IXMLDOMDocument** domDocument)
1935 unknode *This = impl_from_unkIXMLDOMNode( iface );
1936 return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(&This->node), domDocument );
1939 static HRESULT WINAPI unknode_cloneNode(
1941 VARIANT_BOOL pbool, IXMLDOMNode** outNode)
1943 unknode *This = impl_from_unkIXMLDOMNode( iface );
1944 return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(&This->node), pbool, outNode );
1947 static HRESULT WINAPI unknode_get_nodeTypeString(
1951 unknode *This = impl_from_unkIXMLDOMNode( iface );
1952 return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(&This->node), p );
1955 static HRESULT WINAPI unknode_get_text(
1959 unknode *This = impl_from_unkIXMLDOMNode( iface );
1960 return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(&This->node), p );
1963 static HRESULT WINAPI unknode_put_text(
1967 unknode *This = impl_from_unkIXMLDOMNode( iface );
1968 return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(&This->node), p );
1971 static HRESULT WINAPI unknode_get_specified(
1973 VARIANT_BOOL* pbool)
1975 unknode *This = impl_from_unkIXMLDOMNode( iface );
1976 return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(&This->node), pbool );
1979 static HRESULT WINAPI unknode_get_definition(
1981 IXMLDOMNode** domNode)
1983 unknode *This = impl_from_unkIXMLDOMNode( iface );
1984 return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(&This->node), domNode );
1987 static HRESULT WINAPI unknode_get_nodeTypedValue(
1991 unknode *This = impl_from_unkIXMLDOMNode( iface );
1992 return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
1995 static HRESULT WINAPI unknode_put_nodeTypedValue(
1999 unknode *This = impl_from_unkIXMLDOMNode( iface );
2000 return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
2003 static HRESULT WINAPI unknode_get_dataType(
2007 unknode *This = impl_from_unkIXMLDOMNode( iface );
2008 return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(&This->node), var1 );
2011 static HRESULT WINAPI unknode_put_dataType(
2015 unknode *This = impl_from_unkIXMLDOMNode( iface );
2016 return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(&This->node), p );
2019 static HRESULT WINAPI unknode_get_xml(
2023 unknode *This = impl_from_unkIXMLDOMNode( iface );
2024 return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p );
2027 static HRESULT WINAPI unknode_transformNode(
2029 IXMLDOMNode* domNode, BSTR* p)
2031 unknode *This = impl_from_unkIXMLDOMNode( iface );
2032 return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(&This->node), domNode, p );
2035 static HRESULT WINAPI unknode_selectNodes(
2037 BSTR p, IXMLDOMNodeList** outList)
2039 unknode *This = impl_from_unkIXMLDOMNode( iface );
2040 return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(&This->node), p, outList );
2043 static HRESULT WINAPI unknode_selectSingleNode(
2045 BSTR p, IXMLDOMNode** outNode)
2047 unknode *This = impl_from_unkIXMLDOMNode( iface );
2048 return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(&This->node), p, outNode );
2051 static HRESULT WINAPI unknode_get_parsed(
2053 VARIANT_BOOL* pbool)
2055 unknode *This = impl_from_unkIXMLDOMNode( iface );
2056 return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(&This->node), pbool );
2059 static HRESULT WINAPI unknode_get_namespaceURI(
2063 unknode *This = impl_from_unkIXMLDOMNode( iface );
2064 return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(&This->node), p );
2067 static HRESULT WINAPI unknode_get_prefix(
2071 unknode *This = impl_from_unkIXMLDOMNode( iface );
2072 return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(&This->node), p );
2075 static HRESULT WINAPI unknode_get_baseName(
2079 unknode *This = impl_from_unkIXMLDOMNode( iface );
2080 return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(&This->node), p );
2083 static HRESULT WINAPI unknode_transformNodeToObject(
2085 IXMLDOMNode* domNode, VARIANT var1)
2087 unknode *This = impl_from_unkIXMLDOMNode( iface );
2088 return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(&This->node), domNode, var1 );
2091 static const struct IXMLDOMNodeVtbl unknode_vtbl =
2093 unknode_QueryInterface,
2096 unknode_GetTypeInfoCount,
2097 unknode_GetTypeInfo,
2098 unknode_GetIDsOfNames,
2100 unknode_get_nodeName,
2101 unknode_get_nodeValue,
2102 unknode_put_nodeValue,
2103 unknode_get_nodeType,
2104 unknode_get_parentNode,
2105 unknode_get_childNodes,
2106 unknode_get_firstChild,
2107 unknode_get_lastChild,
2108 unknode_get_previousSibling,
2109 unknode_get_nextSibling,
2110 unknode_get_attributes,
2111 unknode_insertBefore,
2112 unknode_replaceChild,
2113 unknode_removeChild,
2114 unknode_appendChild,
2115 unknode_hasChildNodes,
2116 unknode_get_ownerDocument,
2118 unknode_get_nodeTypeString,
2121 unknode_get_specified,
2122 unknode_get_definition,
2123 unknode_get_nodeTypedValue,
2124 unknode_put_nodeTypedValue,
2125 unknode_get_dataType,
2126 unknode_put_dataType,
2128 unknode_transformNode,
2129 unknode_selectNodes,
2130 unknode_selectSingleNode,
2132 unknode_get_namespaceURI,
2134 unknode_get_baseName,
2135 unknode_transformNodeToObject
2138 IXMLDOMNode *create_node( xmlNodePtr node )
2147 TRACE("type %d\n", node->type);
2150 case XML_ELEMENT_NODE:
2151 pUnk = create_element( node );
2153 case XML_ATTRIBUTE_NODE:
2154 pUnk = create_attribute( node );
2157 pUnk = create_text( node );
2159 case XML_CDATA_SECTION_NODE:
2160 pUnk = create_cdata( node );
2162 case XML_ENTITY_REF_NODE:
2163 pUnk = create_doc_entity_ref( node );
2166 pUnk = create_pi( node );
2168 case XML_COMMENT_NODE:
2169 pUnk = create_comment( node );
2171 case XML_DOCUMENT_NODE:
2172 pUnk = create_domdoc( node );
2174 case XML_DOCUMENT_FRAG_NODE:
2175 pUnk = create_doc_fragment( node );
2180 FIXME("only creating basic node for type %d\n", node->type);
2182 new_node = heap_alloc(sizeof(unknode));
2186 new_node->lpVtbl = &unknode_vtbl;
2188 init_xmlnode(&new_node->node, node, (IXMLDOMNode*)&new_node->lpVtbl, NULL);
2189 pUnk = (IUnknown*)&new_node->lpVtbl;
2193 hr = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMNode, (LPVOID*)&ret);
2194 IUnknown_Release(pUnk);
2195 if(FAILED(hr)) return NULL;