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 HRESULT node_put_value(xmlnode *This, VARIANT *value)
227 VARIANT string_value;
231 VariantInit(&string_value);
232 hr = VariantChangeType(&string_value, value, 0, VT_BSTR);
234 WARN("Couldn't convert to VT_BSTR\n");
238 str = xmlChar_from_wchar(V_BSTR(&string_value));
239 VariantClear(&string_value);
241 xmlNodeSetContent(This->node, str);
246 static HRESULT WINAPI xmlnode_put_nodeValue(
250 ERR("Should not be called\n");
254 static HRESULT WINAPI xmlnode_get_nodeType(
258 ERR("Should not be called\n");
262 static HRESULT get_node(
268 TRACE("(%p)->(%s %p %p)\n", This, name, node, out );
273 /* if we don't have a doc, use our parent. */
274 if(node && !node->doc && node->parent)
275 node->doc = node->parent->doc;
277 *out = create_node( node );
283 HRESULT node_get_parent(xmlnode *This, IXMLDOMNode **parent)
285 return get_node( This, "parent", This->node->parent, parent );
288 static HRESULT WINAPI xmlnode_get_parentNode(
290 IXMLDOMNode** parent)
292 ERR("Should not be called\n");
296 HRESULT node_get_child_nodes(xmlnode *This, IXMLDOMNodeList **ret)
301 *ret = create_children_nodelist(This->node);
303 return E_OUTOFMEMORY;
308 static HRESULT WINAPI xmlnode_get_childNodes(
310 IXMLDOMNodeList** childList)
312 ERR("Should not be called\n");
316 static HRESULT WINAPI xmlnode_get_firstChild(
318 IXMLDOMNode** firstChild)
320 xmlnode *This = impl_from_IXMLDOMNode( iface );
321 TRACE("(%p)->(%p)\n", This, firstChild);
322 return get_node( This, "firstChild", This->node->children, firstChild );
325 static HRESULT WINAPI xmlnode_get_lastChild(
327 IXMLDOMNode** lastChild)
329 xmlnode *This = impl_from_IXMLDOMNode( iface );
331 TRACE("(%p)->(%p)\n", This, lastChild );
336 switch( This->node->type )
338 /* CDATASection, Comment, PI and Text Nodes do not support lastChild */
340 case XML_CDATA_SECTION_NODE:
342 case XML_COMMENT_NODE:
346 return get_node( This, "lastChild", This->node->last, lastChild );
350 static HRESULT WINAPI xmlnode_get_previousSibling(
352 IXMLDOMNode** previousSibling)
354 xmlnode *This = impl_from_IXMLDOMNode( iface );
356 TRACE("(%p)->(%p)\n", This, previousSibling );
358 if (!previousSibling)
361 switch( This->node->type )
363 /* Attribute, Document and Document Fragment Nodes do not support previousSibling */
364 case XML_DOCUMENT_NODE:
365 case XML_DOCUMENT_FRAG_NODE:
366 case XML_ATTRIBUTE_NODE:
367 *previousSibling = NULL;
370 return get_node( This, "previous", This->node->prev, previousSibling );
374 static HRESULT WINAPI xmlnode_get_nextSibling(
376 IXMLDOMNode** nextSibling)
378 xmlnode *This = impl_from_IXMLDOMNode( iface );
380 TRACE("(%p)->(%p)\n", This, nextSibling );
385 switch( This->node->type )
387 /* Attribute, Document and Document Fragment Nodes do not support nextSibling */
388 case XML_DOCUMENT_NODE:
389 case XML_DOCUMENT_FRAG_NODE:
390 case XML_ATTRIBUTE_NODE:
394 return get_node( This, "next", This->node->next, nextSibling );
398 static HRESULT WINAPI xmlnode_get_attributes(
400 IXMLDOMNamedNodeMap** attributeMap)
402 xmlnode *This = impl_from_IXMLDOMNode( iface );
403 TRACE("(%p)->(%p)\n", This, attributeMap);
408 switch( This->node->type )
410 /* Attribute, CDataSection, Comment, Documents, Documents Fragments,
411 Entity and Text Nodes does not support get_attributes */
412 case XML_ATTRIBUTE_NODE:
413 case XML_CDATA_SECTION_NODE:
414 case XML_COMMENT_NODE:
415 case XML_DOCUMENT_NODE:
416 case XML_DOCUMENT_FRAG_NODE:
417 case XML_ENTITY_NODE:
418 case XML_ENTITY_REF_NODE:
420 *attributeMap = NULL;
423 *attributeMap = create_nodemap( This->iface );
428 static HRESULT WINAPI xmlnode_insertBefore(
430 IXMLDOMNode* newChild,
432 IXMLDOMNode** outNewChild)
434 xmlnode *This = impl_from_IXMLDOMNode( iface );
435 xmlNodePtr before_node, new_child_node;
436 IXMLDOMNode *before = NULL;
440 TRACE("(%p)->(%p var %p)\n",This,newChild,outNewChild);
445 switch(V_VT(&refChild))
452 hr = IUnknown_QueryInterface(V_UNKNOWN(&refChild), &IID_IXMLDOMNode, (LPVOID)&before);
453 if(FAILED(hr)) return hr;
457 hr = IDispatch_QueryInterface(V_DISPATCH(&refChild), &IID_IXMLDOMNode, (LPVOID)&before);
458 if(FAILED(hr)) return hr;
462 FIXME("refChild var type %x\n", V_VT(&refChild));
466 node_obj = get_node_obj(newChild);
468 FIXME("newChild is not our node implementation\n");
472 new_child_node = node_obj->node;
473 TRACE("new_child_node %p This->node %p\n", new_child_node, This->node);
475 if(!new_child_node->parent)
476 if(xmldoc_remove_orphan(new_child_node->doc, new_child_node) != S_OK)
477 WARN("%p is not an orphan of %p\n", new_child_node, new_child_node->doc);
481 node_obj = get_node_obj(before);
482 IXMLDOMNode_Release(before);
484 FIXME("before node is not our node implementation\n");
488 before_node = node_obj->node;
489 xmlAddPrevSibling(before_node, new_child_node);
493 xmlAddChild(This->node, new_child_node);
496 IXMLDOMNode_AddRef(newChild);
498 *outNewChild = newChild;
504 static HRESULT WINAPI xmlnode_replaceChild(
506 IXMLDOMNode* newChild,
507 IXMLDOMNode* oldChild,
508 IXMLDOMNode** outOldChild)
510 xmlnode *This = impl_from_IXMLDOMNode( iface );
511 xmlnode *old_child, *new_child;
512 xmlDocPtr leaving_doc;
513 xmlNode *my_ancestor;
515 TRACE("(%p)->(%p %p %p)\n", This, newChild, oldChild, outOldChild);
517 /* Do not believe any documentation telling that newChild == NULL
518 means removal. It does certainly *not* apply to msxml3! */
519 if(!newChild || !oldChild)
525 old_child = get_node_obj(oldChild);
527 FIXME("oldChild is not our node implementation\n");
531 if(old_child->node->parent != This->node)
533 WARN("childNode %p is not a child of %p\n", oldChild, iface);
537 new_child = get_node_obj(newChild);
539 FIXME("newChild is not our node implementation\n");
543 my_ancestor = This->node;
546 if(my_ancestor == new_child->node)
548 WARN("tried to create loop\n");
551 my_ancestor = my_ancestor->parent;
554 if(!new_child->node->parent)
555 if(xmldoc_remove_orphan(new_child->node->doc, new_child->node) != S_OK)
556 WARN("%p is not an orphan of %p\n", new_child->node, new_child->node->doc);
558 leaving_doc = new_child->node->doc;
559 xmldoc_add_ref(old_child->node->doc);
560 xmlReplaceNode(old_child->node, new_child->node);
561 xmldoc_release(leaving_doc);
563 xmldoc_add_orphan(old_child->node->doc, old_child->node);
567 IXMLDOMNode_AddRef(oldChild);
568 *outOldChild = oldChild;
574 static HRESULT WINAPI xmlnode_removeChild(
576 IXMLDOMNode* childNode,
577 IXMLDOMNode** oldChild)
579 xmlnode *This = impl_from_IXMLDOMNode( iface );
582 TRACE("(%p)->(%p %p)\n", This, childNode, oldChild);
584 if(!childNode) return E_INVALIDARG;
589 child_node = get_node_obj(childNode);
591 FIXME("childNode is not our node implementation\n");
595 if(child_node->node->parent != This->node)
597 WARN("childNode %p is not a child of %p\n", childNode, iface);
601 xmlUnlinkNode(child_node->node);
605 IXMLDOMNode_AddRef(childNode);
606 *oldChild = childNode;
612 static HRESULT WINAPI xmlnode_appendChild(
614 IXMLDOMNode* newChild,
615 IXMLDOMNode** outNewChild)
617 xmlnode *This = impl_from_IXMLDOMNode( iface );
622 TRACE("(%p)->(%p %p)\n", This, newChild, outNewChild);
624 hr = IXMLDOMNode_get_nodeType(newChild, &type);
625 if(FAILED(hr) || type == NODE_ATTRIBUTE) {
626 if(outNewChild) *outNewChild = NULL;
631 return IXMLDOMNode_insertBefore(This->iface, newChild, var, outNewChild);
634 static HRESULT WINAPI xmlnode_hasChildNodes(
636 VARIANT_BOOL* hasChild)
638 xmlnode *This = impl_from_IXMLDOMNode( iface );
640 TRACE("(%p)->(%p)\n", This, hasChild);
644 if (!This->node->children)
646 *hasChild = VARIANT_FALSE;
650 *hasChild = VARIANT_TRUE;
654 static HRESULT WINAPI xmlnode_get_ownerDocument(
656 IXMLDOMDocument** DOMDocument)
658 xmlnode *This = impl_from_IXMLDOMNode( iface );
660 TRACE("(%p)->(%p)\n", This, DOMDocument);
662 return DOMDocument_create_from_xmldoc(This->node->doc, (IXMLDOMDocument3**)DOMDocument);
665 static HRESULT WINAPI xmlnode_cloneNode(
668 IXMLDOMNode** cloneRoot)
670 xmlnode *This = impl_from_IXMLDOMNode( iface );
671 xmlNodePtr pClone = NULL;
672 IXMLDOMNode *pNode = NULL;
674 TRACE("(%p)->(%d %p)\n", This, deep, cloneRoot);
679 pClone = xmlCopyNode(This->node, deep ? 1 : 2);
682 pClone->doc = This->node->doc;
683 xmldoc_add_orphan(pClone->doc, pClone);
685 pNode = create_node(pClone);
688 ERR("Copy failed\n");
696 ERR("Copy failed\n");
703 static HRESULT WINAPI xmlnode_get_nodeTypeString(
707 xmlnode *This = impl_from_IXMLDOMNode( iface );
710 TRACE("(%p)->(%p)\n", This, xmlnodeType );
718 switch( This->node->type )
720 case XML_ATTRIBUTE_NODE:
721 str = (const xmlChar*) "attribute";
723 case XML_CDATA_SECTION_NODE:
724 str = (const xmlChar*) "cdatasection";
726 case XML_COMMENT_NODE:
727 str = (const xmlChar*) "comment";
729 case XML_DOCUMENT_NODE:
730 str = (const xmlChar*) "document";
732 case XML_DOCUMENT_FRAG_NODE:
733 str = (const xmlChar*) "documentfragment";
735 case XML_ELEMENT_NODE:
736 str = (const xmlChar*) "element";
738 case XML_ENTITY_NODE:
739 str = (const xmlChar*) "entity";
741 case XML_ENTITY_REF_NODE:
742 str = (const xmlChar*) "entityreference";
744 case XML_NOTATION_NODE:
745 str = (const xmlChar*) "notation";
748 str = (const xmlChar*) "processinginstruction";
751 str = (const xmlChar*) "text";
754 FIXME("Unknown node type (%d)\n", This->node->type);
755 str = This->node->name;
759 *xmlnodeType = bstr_from_xmlChar( str );
766 static HRESULT WINAPI xmlnode_get_text(
770 xmlnode *This = impl_from_IXMLDOMNode( iface );
774 TRACE("(%p, type %d)->(%p)\n", This, This->node->type, text);
779 pContent = xmlNodeGetContent((xmlNodePtr)This->node);
782 str = bstr_from_xmlChar(pContent);
786 /* Always return a string. */
787 if (!str) str = SysAllocStringLen( NULL, 0 );
789 TRACE("%p %s\n", This, debugstr_w(str) );
795 static HRESULT WINAPI xmlnode_put_text(
799 xmlnode *This = impl_from_IXMLDOMNode( iface );
802 TRACE("(%p)->(%s)\n", This, debugstr_w(text));
804 switch(This->node->type)
806 case XML_DOCUMENT_NODE:
812 str = xmlChar_from_wchar(text);
814 /* Escape the string. */
815 str2 = xmlEncodeEntitiesReentrant(This->node->doc, str);
818 xmlNodeSetContent(This->node, str2);
824 static HRESULT WINAPI xmlnode_get_specified(
826 VARIANT_BOOL* isSpecified)
828 xmlnode *This = impl_from_IXMLDOMNode( iface );
829 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
830 *isSpecified = VARIANT_TRUE;
834 static HRESULT WINAPI xmlnode_get_definition(
836 IXMLDOMNode** definitionNode)
838 xmlnode *This = impl_from_IXMLDOMNode( iface );
839 FIXME("(%p)->(%p)\n", This, definitionNode);
843 static inline BYTE hex_to_byte(xmlChar c)
845 if(c <= '9') return c-'0';
846 if(c <= 'F') return c-'A'+10;
850 static inline BYTE base64_to_byte(xmlChar c)
852 if(c == '+') return 62;
853 if(c == '/') return 63;
854 if(c <= '9') return c-'0'+52;
855 if(c <= 'Z') return c-'A';
859 static inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type)
861 if(!type || !lstrcmpiW(type, szString) ||
862 !lstrcmpiW(type, szNumber) || !lstrcmpiW(type, szUUID))
865 V_BSTR(v) = bstr_from_xmlChar(str);
868 return E_OUTOFMEMORY;
870 else if(!lstrcmpiW(type, szDateTime) || !lstrcmpiW(type, szDateTimeTZ) ||
871 !lstrcmpiW(type, szDate) || !lstrcmpiW(type, szTime) ||
872 !lstrcmpiW(type, szTimeTZ))
882 st.wDayOfWeek = st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
884 V_VT(&src) = VT_BSTR;
885 V_BSTR(&src) = bstr_from_xmlChar(str);
888 return E_OUTOFMEMORY;
891 e = p + SysStringLen(V_BSTR(&src));
893 if(p+4<e && *(p+4)=='-') /* parse date (yyyy-mm-dd) */
896 st.wMonth = atoiW(p+5);
897 st.wDay = atoiW(p+8);
903 if(p+2<e && *(p+2)==':') /* parse time (hh:mm:ss.?) */
906 st.wMinute = atoiW(p+3);
907 st.wSecond = atoiW(p+6);
913 while(isdigitW(*p)) p++;
917 SystemTimeToVariantTime(&st, &date);
921 if(*p == '+') /* parse timezone offset (+hh:mm) */
922 V_DATE(v) += (DOUBLE)atoiW(p+1)/24 + (DOUBLE)atoiW(p+4)/1440;
923 else if(*p == '-') /* parse timezone offset (-hh:mm) */
924 V_DATE(v) -= (DOUBLE)atoiW(p+1)/24 + (DOUBLE)atoiW(p+4)/1440;
928 else if(!lstrcmpiW(type, szBinHex))
933 len = xmlStrlen(str)/2;
937 V_VT(v) = (VT_ARRAY|VT_UI1);
938 V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab);
941 return E_OUTOFMEMORY;
944 ((BYTE*)V_ARRAY(v)->pvData)[i] = (hex_to_byte(str[2*i])<<4)
945 + hex_to_byte(str[2*i+1]);
947 else if(!lstrcmpiW(type, szBinBase64))
952 len = xmlStrlen(str);
953 if(str[len-2] == '=') i = 2;
954 else if(str[len-1] == '=') i = 1;
958 sab.cElements = len/4*3-i;
960 V_VT(v) = (VT_ARRAY|VT_UI1);
961 V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab);
964 return E_OUTOFMEMORY;
966 for(i=0; i<len/4; i++)
968 ((BYTE*)V_ARRAY(v)->pvData)[3*i] = (base64_to_byte(str[4*i])<<2)
969 + (base64_to_byte(str[4*i+1])>>4);
970 if(3*i+1 < sab.cElements)
971 ((BYTE*)V_ARRAY(v)->pvData)[3*i+1] = (base64_to_byte(str[4*i+1])<<4)
972 + (base64_to_byte(str[4*i+2])>>2);
973 if(3*i+2 < sab.cElements)
974 ((BYTE*)V_ARRAY(v)->pvData)[3*i+2] = (base64_to_byte(str[4*i+2])<<6)
975 + base64_to_byte(str[4*i+3]);
983 if(!lstrcmpiW(type, szInt) || !lstrcmpiW(type, szI4))
985 else if(!lstrcmpiW(type, szFixed))
987 else if(!lstrcmpiW(type, szBoolean))
989 else if(!lstrcmpiW(type, szI1))
991 else if(!lstrcmpiW(type, szI2))
993 else if(!lstrcmpiW(type, szIU1))
995 else if(!lstrcmpiW(type, szIU2))
997 else if(!lstrcmpiW(type, szIU4))
999 else if(!lstrcmpiW(type, szR4))
1001 else if(!lstrcmpiW(type, szR8) || !lstrcmpiW(type, szFloat))
1005 FIXME("Type handling not yet implemented\n");
1009 V_VT(&src) = VT_BSTR;
1010 V_BSTR(&src) = bstr_from_xmlChar(str);
1013 return E_OUTOFMEMORY;
1015 hres = VariantChangeTypeEx(v, &src, MAKELCID(MAKELANGID(
1016 LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT),0, V_VT(v));
1024 static HRESULT WINAPI xmlnode_get_nodeTypedValue(
1026 VARIANT* typedValue)
1028 xmlnode *This = impl_from_IXMLDOMNode( iface );
1031 HRESULT hres = S_FALSE;
1033 TRACE("(%p)->(%p)\n", This, typedValue);
1036 return E_INVALIDARG;
1038 V_VT(typedValue) = VT_NULL;
1040 if(This->node->type == XML_ELEMENT_NODE ||
1041 This->node->type == XML_TEXT_NODE ||
1042 This->node->type == XML_ENTITY_REF_NODE)
1043 hres = IXMLDOMNode_get_dataType(This->iface, &type);
1045 if(hres != S_OK && This->node->type != XML_ELEMENT_NODE)
1046 return IXMLDOMNode_get_nodeValue(This->iface, typedValue);
1048 content = xmlNodeGetContent(This->node);
1049 hres = VARIANT_from_xmlChar(content, typedValue,
1050 hres==S_OK ? V_BSTR(&type) : NULL);
1052 VariantClear(&type);
1057 static HRESULT WINAPI xmlnode_put_nodeTypedValue(
1061 xmlnode *This = impl_from_IXMLDOMNode( iface );
1062 FIXME("%p\n", This);
1066 static HRESULT WINAPI xmlnode_get_dataType(
1068 VARIANT* dataTypeName)
1070 xmlnode *This = impl_from_IXMLDOMNode( iface );
1073 TRACE("(%p)->(%p)\n", This, dataTypeName);
1076 return E_INVALIDARG;
1078 /* Attribute, CDATA Section, Comment, Document, Document Fragment,
1079 Entity, Notation, PI, and Text Node are non-typed. */
1080 V_BSTR(dataTypeName) = NULL;
1081 V_VT(dataTypeName) = VT_NULL;
1083 switch ( This->node->type )
1085 case XML_ELEMENT_NODE:
1086 pVal = xmlGetNsProp(This->node, (const xmlChar*)"dt",
1087 (const xmlChar*)"urn:schemas-microsoft-com:datatypes");
1090 V_VT(dataTypeName) = VT_BSTR;
1091 V_BSTR(dataTypeName) = bstr_from_xmlChar( pVal );
1095 case XML_ENTITY_REF_NODE:
1096 FIXME("XML_ENTITY_REF_NODE should return a valid value.\n");
1099 TRACE("Type %d returning NULL\n", This->node->type);
1102 /* non-typed nodes return S_FALSE */
1103 if(V_VT(dataTypeName) == VT_NULL)
1111 static HRESULT WINAPI xmlnode_put_dataType(
1115 xmlnode *This = impl_from_IXMLDOMNode( iface );
1116 HRESULT hr = E_FAIL;
1118 TRACE("(%p)->(%s)\n", This, debugstr_w(dataTypeName));
1120 if(dataTypeName == NULL)
1121 return E_INVALIDARG;
1123 /* An example of this is. The Text in the node needs to be a 0 or 1 for a boolean type.
1124 This applies to changing types (string->bool) or setting a new one
1126 FIXME("Need to Validate the data before allowing a type to be set.\n");
1128 /* Check all supported types. */
1129 if(lstrcmpiW(dataTypeName,szString) == 0 ||
1130 lstrcmpiW(dataTypeName,szNumber) == 0 ||
1131 lstrcmpiW(dataTypeName,szUUID) == 0 ||
1132 lstrcmpiW(dataTypeName,szInt) == 0 ||
1133 lstrcmpiW(dataTypeName,szI4) == 0 ||
1134 lstrcmpiW(dataTypeName,szFixed) == 0 ||
1135 lstrcmpiW(dataTypeName,szBoolean) == 0 ||
1136 lstrcmpiW(dataTypeName,szDateTime) == 0 ||
1137 lstrcmpiW(dataTypeName,szDateTimeTZ) == 0 ||
1138 lstrcmpiW(dataTypeName,szDate) == 0 ||
1139 lstrcmpiW(dataTypeName,szTime) == 0 ||
1140 lstrcmpiW(dataTypeName,szTimeTZ) == 0 ||
1141 lstrcmpiW(dataTypeName,szI1) == 0 ||
1142 lstrcmpiW(dataTypeName,szI2) == 0 ||
1143 lstrcmpiW(dataTypeName,szIU1) == 0 ||
1144 lstrcmpiW(dataTypeName,szIU2) == 0 ||
1145 lstrcmpiW(dataTypeName,szIU4) == 0 ||
1146 lstrcmpiW(dataTypeName,szR4) == 0 ||
1147 lstrcmpiW(dataTypeName,szR8) == 0 ||
1148 lstrcmpiW(dataTypeName,szFloat) == 0 ||
1149 lstrcmpiW(dataTypeName,szBinHex) == 0 ||
1150 lstrcmpiW(dataTypeName,szBinBase64) == 0)
1152 xmlNsPtr pNS = NULL;
1153 xmlAttrPtr pAttr = NULL;
1154 xmlChar* str = xmlChar_from_wchar(dataTypeName);
1156 pAttr = xmlHasNsProp(This->node, (const xmlChar*)"dt",
1157 (const xmlChar*)"urn:schemas-microsoft-com:datatypes");
1160 pAttr = xmlSetNsProp(This->node, pAttr->ns, (const xmlChar*)"dt", str);
1166 pNS = xmlNewNs(This->node, (const xmlChar*)"urn:schemas-microsoft-com:datatypes", (const xmlChar*)"dt");
1169 pAttr = xmlNewNsProp(This->node, pNS, (const xmlChar*)"dt", str);
1172 xmlAddChild(This->node, (xmlNodePtr)pAttr);
1177 ERR("Failed to create Attribute\n");
1180 ERR("Failed to Create Namepsace\n");
1188 static BSTR EnsureCorrectEOL(BSTR sInput)
1195 nLen = lstrlenW(sInput);
1196 /* Count line endings */
1197 for(i=0; i < nLen; i++)
1199 if(sInput[i] == '\n')
1203 TRACE("len=%d, num=%d\n", nLen, nNum);
1205 /* Add linefeed as needed */
1209 sNew = SysAllocStringLen(NULL, nLen + nNum+1);
1210 for(i=0; i < nLen; i++)
1212 if(sInput[i] == '\n')
1214 sNew[i+nPlace] = '\r';
1217 sNew[i+nPlace] = sInput[i];
1220 SysFreeString(sInput);
1227 TRACE("len %d\n", lstrlenW(sNew));
1232 /* Removes encoding information and last character (nullbyte) */
1233 static BSTR EnsureNoEncoding(BSTR sInput)
1235 static const WCHAR wszEncoding[] = {'e','n','c','o','d','i','n','g','='};
1240 while(*pBeg != '\n' && memcmp(pBeg, wszEncoding, sizeof(wszEncoding)))
1245 SysReAllocStringLen(&sInput, sInput, SysStringLen(sInput)-1);
1250 pEnd = pBeg + sizeof(wszEncoding)/sizeof(WCHAR) + 2;
1251 while(*pEnd != '\"') pEnd++;
1254 sNew = SysAllocStringLen(NULL,
1255 pBeg-sInput + SysStringLen(sInput)-(pEnd-sInput)-1);
1256 memcpy(sNew, sInput, (pBeg-sInput)*sizeof(WCHAR));
1257 memcpy(&sNew[pBeg-sInput], pEnd, (SysStringLen(sInput)-(pEnd-sInput)-1)*sizeof(WCHAR));
1259 SysFreeString(sInput);
1264 * We are trying to replicate the same behaviour as msxml by converting
1265 * line endings to \r\n and using indents as \t. The problem is that msxml
1266 * only formats nodes that have a line ending. Using libxml we cannot
1267 * reproduce behaviour exactly.
1270 static HRESULT WINAPI xmlnode_get_xml(
1274 xmlnode *This = impl_from_IXMLDOMNode( iface );
1275 xmlBufferPtr pXmlBuf;
1279 TRACE("(%p %d)->(%p)\n", This, This->node->type, xmlString);
1282 return E_INVALIDARG;
1286 xmldecl = xmldoc_unlink_xmldecl( This->node->doc );
1288 pXmlBuf = xmlBufferCreate();
1291 nSize = xmlNodeDump(pXmlBuf, This->node->doc, This->node, 0, 1);
1294 const xmlChar *pContent;
1297 /* Attribute Nodes return a space in front of their name */
1298 pContent = xmlBufferContent(pXmlBuf);
1299 if( ((const char*)pContent)[0] == ' ')
1300 bstrContent = bstr_from_xmlChar(pContent+1);
1302 bstrContent = bstr_from_xmlChar(pContent);
1304 switch(This->node->type)
1306 case XML_ELEMENT_NODE:
1307 *xmlString = EnsureCorrectEOL(bstrContent);
1309 case XML_DOCUMENT_NODE:
1310 *xmlString = EnsureCorrectEOL(bstrContent);
1311 *xmlString = EnsureNoEncoding(*xmlString);
1314 *xmlString = bstrContent;
1318 xmlBufferFree(pXmlBuf);
1321 xmldoc_link_xmldecl( This->node->doc, xmldecl );
1323 /* Always returns a string. */
1324 if(*xmlString == NULL) *xmlString = SysAllocStringLen( NULL, 0 );
1329 static HRESULT WINAPI xmlnode_transformNode(
1331 IXMLDOMNode* styleSheet,
1334 #ifdef SONAME_LIBXSLT
1335 xmlnode *This = impl_from_IXMLDOMNode( iface );
1336 xmlnode *pStyleSheet = NULL;
1337 xsltStylesheetPtr xsltSS = NULL;
1338 xmlDocPtr result = NULL;
1340 TRACE("(%p)->(%p %p)\n", This, styleSheet, xmlString);
1342 if (!libxslt_handle)
1344 if(!styleSheet || !xmlString)
1345 return E_INVALIDARG;
1349 pStyleSheet = get_node_obj(styleSheet);
1351 FIXME("styleSheet is not our xmlnode implementation\n");
1355 xsltSS = pxsltParseStylesheetDoc( pStyleSheet->node->doc);
1358 result = pxsltApplyStylesheet(xsltSS, This->node->doc, NULL);
1361 const xmlChar *pContent;
1363 if(result->type == XML_HTML_DOCUMENT_NODE)
1365 xmlOutputBufferPtr pOutput = xmlAllocOutputBuffer(NULL);
1368 htmlDocContentDumpOutput(pOutput, result->doc, NULL);
1369 pContent = xmlBufferContent(pOutput->buffer);
1370 *xmlString = bstr_from_xmlChar(pContent);
1371 xmlOutputBufferClose(pOutput);
1376 xmlBufferPtr pXmlBuf;
1379 pXmlBuf = xmlBufferCreate();
1382 nSize = xmlNodeDump(pXmlBuf, NULL, (xmlNodePtr)result, 0, 0);
1385 pContent = xmlBufferContent(pXmlBuf);
1386 *xmlString = bstr_from_xmlChar(pContent);
1388 xmlBufferFree(pXmlBuf);
1393 /* libxslt "helpfully" frees the XML document the stylesheet was
1394 generated from, too */
1396 pxsltFreeStylesheet(xsltSS);
1399 if(*xmlString == NULL)
1400 *xmlString = SysAllocStringLen(NULL, 0);
1404 FIXME("libxslt headers were not found at compile time\n");
1409 static HRESULT WINAPI xmlnode_selectNodes(
1412 IXMLDOMNodeList** resultList)
1414 xmlnode *This = impl_from_IXMLDOMNode( iface );
1416 TRACE("(%p)->(%s %p)\n", This, debugstr_w(queryString), resultList );
1418 return queryresult_create( This->node, queryString, resultList );
1421 static HRESULT WINAPI xmlnode_selectSingleNode(
1424 IXMLDOMNode** resultNode)
1426 xmlnode *This = impl_from_IXMLDOMNode( iface );
1427 IXMLDOMNodeList *list;
1430 TRACE("(%p)->(%s %p)\n", This, debugstr_w(queryString), resultNode );
1433 r = IXMLDOMNode_selectNodes(This->iface, queryString, &list);
1436 r = IXMLDOMNodeList_nextNode(list, resultNode);
1437 IXMLDOMNodeList_Release(list);
1442 static HRESULT WINAPI xmlnode_get_parsed(
1444 VARIANT_BOOL* isParsed)
1446 xmlnode *This = impl_from_IXMLDOMNode( iface );
1447 FIXME("(%p)->(%p) stub!\n", This, isParsed);
1448 *isParsed = VARIANT_TRUE;
1452 static HRESULT WINAPI xmlnode_get_namespaceURI(
1456 xmlnode *This = impl_from_IXMLDOMNode( iface );
1457 HRESULT hr = S_FALSE;
1460 TRACE("(%p)->(%p)\n", This, namespaceURI );
1463 return E_INVALIDARG;
1465 *namespaceURI = NULL;
1467 pNSList = xmlGetNsList(This->node->doc, This->node);
1470 *namespaceURI = bstr_from_xmlChar( pNSList[0]->href );
1479 static HRESULT WINAPI xmlnode_get_prefix(
1483 xmlnode *This = impl_from_IXMLDOMNode( iface );
1484 HRESULT hr = S_FALSE;
1487 TRACE("(%p)->(%p)\n", This, prefixString );
1490 return E_INVALIDARG;
1492 *prefixString = NULL;
1494 pNSList = xmlGetNsList(This->node->doc, This->node);
1497 *prefixString = bstr_from_xmlChar( pNSList[0]->prefix );
1506 static HRESULT WINAPI xmlnode_get_baseName(
1510 xmlnode *This = impl_from_IXMLDOMNode( iface );
1512 HRESULT r = S_FALSE;
1514 TRACE("(%p)->(%p)\n", This, nameString );
1517 return E_INVALIDARG;
1519 switch ( This->node->type )
1521 case XML_ELEMENT_NODE:
1522 case XML_ATTRIBUTE_NODE:
1524 str = bstr_from_xmlChar( This->node->name );
1528 case XML_COMMENT_NODE:
1529 case XML_DOCUMENT_NODE:
1532 ERR("Unhandled type %d\n", This->node->type );
1536 TRACE("returning %08x str = %s\n", r, debugstr_w( str ) );
1542 static HRESULT WINAPI xmlnode_transformNodeToObject(
1544 IXMLDOMNode* stylesheet,
1545 VARIANT outputObject)
1547 xmlnode *This = impl_from_IXMLDOMNode( iface );
1548 FIXME("(%p)->(%p)\n", This, stylesheet);
1552 static const struct IXMLDOMNodeVtbl xmlnode_vtbl =
1554 xmlnode_QueryInterface,
1557 xmlnode_GetTypeInfoCount,
1558 xmlnode_GetTypeInfo,
1559 xmlnode_GetIDsOfNames,
1561 xmlnode_get_nodeName,
1562 xmlnode_get_nodeValue,
1563 xmlnode_put_nodeValue,
1564 xmlnode_get_nodeType,
1565 xmlnode_get_parentNode,
1566 xmlnode_get_childNodes,
1567 xmlnode_get_firstChild,
1568 xmlnode_get_lastChild,
1569 xmlnode_get_previousSibling,
1570 xmlnode_get_nextSibling,
1571 xmlnode_get_attributes,
1572 xmlnode_insertBefore,
1573 xmlnode_replaceChild,
1574 xmlnode_removeChild,
1575 xmlnode_appendChild,
1576 xmlnode_hasChildNodes,
1577 xmlnode_get_ownerDocument,
1579 xmlnode_get_nodeTypeString,
1582 xmlnode_get_specified,
1583 xmlnode_get_definition,
1584 xmlnode_get_nodeTypedValue,
1585 xmlnode_put_nodeTypedValue,
1586 xmlnode_get_dataType,
1587 xmlnode_put_dataType,
1589 xmlnode_transformNode,
1590 xmlnode_selectNodes,
1591 xmlnode_selectSingleNode,
1593 xmlnode_get_namespaceURI,
1595 xmlnode_get_baseName,
1596 xmlnode_transformNodeToObject,
1599 void destroy_xmlnode(xmlnode *This)
1602 xmldoc_release(This->node->doc);
1605 void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispex_static_data_t *dispex_data)
1608 xmldoc_add_ref( node->doc );
1610 This->lpVtbl = &xmlnode_vtbl;
1612 This->iface = node_iface;
1615 init_dispex(&This->dispex, (IUnknown*)This->iface, dispex_data);
1617 This->dispex.outer = NULL;
1622 const IXMLDOMNodeVtbl *lpVtbl;
1626 static inline unknode *impl_from_unkIXMLDOMNode(IXMLDOMNode *iface)
1628 return (unknode *)((char*)iface - FIELD_OFFSET(unknode, lpVtbl));
1631 static HRESULT WINAPI unknode_QueryInterface(
1636 unknode *This = impl_from_unkIXMLDOMNode( iface );
1638 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
1640 if (IsEqualGUID(riid, &IID_IUnknown)) {
1642 }else if (IsEqualGUID( riid, &IID_IDispatch) ||
1643 IsEqualGUID( riid, &IID_IXMLDOMNode)) {
1644 *ppvObject = &This->lpVtbl;
1645 }else if(node_query_interface(&This->node, riid, ppvObject)) {
1646 return *ppvObject ? S_OK : E_NOINTERFACE;
1648 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1650 return E_NOINTERFACE;
1653 IUnknown_AddRef((IUnknown*)*ppvObject);
1657 static ULONG WINAPI unknode_AddRef(
1658 IXMLDOMNode *iface )
1660 unknode *This = impl_from_unkIXMLDOMNode( iface );
1662 return InterlockedIncrement(&This->ref);
1665 static ULONG WINAPI unknode_Release(
1666 IXMLDOMNode *iface )
1668 unknode *This = impl_from_unkIXMLDOMNode( iface );
1671 ref = InterlockedDecrement( &This->ref );
1673 destroy_xmlnode(&This->node);
1680 static HRESULT WINAPI unknode_GetTypeInfoCount(
1684 unknode *This = impl_from_unkIXMLDOMNode( iface );
1686 TRACE("(%p)->(%p)\n", This, pctinfo);
1693 static HRESULT WINAPI unknode_GetTypeInfo(
1697 ITypeInfo** ppTInfo )
1699 unknode *This = impl_from_unkIXMLDOMNode( iface );
1702 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1704 hr = get_typeinfo(IXMLDOMNode_tid, ppTInfo);
1709 static HRESULT WINAPI unknode_GetIDsOfNames(
1712 LPOLESTR* rgszNames,
1717 unknode *This = impl_from_unkIXMLDOMNode( iface );
1719 ITypeInfo *typeinfo;
1722 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1725 if(!rgszNames || cNames == 0 || !rgDispId)
1726 return E_INVALIDARG;
1728 hr = get_typeinfo(IXMLDOMNode_tid, &typeinfo);
1731 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1732 ITypeInfo_Release(typeinfo);
1738 static HRESULT WINAPI unknode_Invoke(
1740 DISPID dispIdMember,
1744 DISPPARAMS* pDispParams,
1745 VARIANT* pVarResult,
1746 EXCEPINFO* pExcepInfo,
1749 unknode *This = impl_from_unkIXMLDOMNode( iface );
1750 ITypeInfo *typeinfo;
1753 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1754 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1756 hr = get_typeinfo(IXMLDOMNode_tid, &typeinfo);
1759 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
1760 pVarResult, pExcepInfo, puArgErr);
1761 ITypeInfo_Release(typeinfo);
1767 static HRESULT WINAPI unknode_get_nodeName(
1771 unknode *This = impl_from_unkIXMLDOMNode( iface );
1773 FIXME("(%p)->(%p)\n", This, p);
1775 return node_get_nodeName(&This->node, p);
1778 static HRESULT WINAPI unknode_get_nodeValue(
1782 unknode *This = impl_from_unkIXMLDOMNode( iface );
1784 FIXME("(%p)->(%p)\n", This, value);
1787 return E_INVALIDARG;
1789 V_VT(value) = VT_NULL;
1793 static HRESULT WINAPI unknode_put_nodeValue(
1797 unknode *This = impl_from_unkIXMLDOMNode( iface );
1798 FIXME("(%p)->(v%d)\n", This, V_VT(&value));
1802 static HRESULT WINAPI unknode_get_nodeType(
1804 DOMNodeType* domNodeType )
1806 unknode *This = impl_from_unkIXMLDOMNode( iface );
1808 FIXME("(%p)->(%p)\n", This, domNodeType);
1810 *domNodeType = This->node.node->type;
1814 static HRESULT WINAPI unknode_get_parentNode(
1816 IXMLDOMNode** parent )
1818 unknode *This = impl_from_unkIXMLDOMNode( iface );
1819 FIXME("(%p)->(%p)\n", This, parent);
1820 if (!parent) return E_INVALIDARG;
1825 static HRESULT WINAPI unknode_get_childNodes(
1827 IXMLDOMNodeList** outList)
1829 unknode *This = impl_from_unkIXMLDOMNode( iface );
1831 TRACE("(%p)->(%p)\n", This, outList);
1833 return node_get_child_nodes(&This->node, outList);
1836 static HRESULT WINAPI unknode_get_firstChild(
1838 IXMLDOMNode** domNode)
1840 unknode *This = impl_from_unkIXMLDOMNode( iface );
1841 return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(&This->node), domNode );
1844 static HRESULT WINAPI unknode_get_lastChild(
1846 IXMLDOMNode** domNode)
1848 unknode *This = impl_from_unkIXMLDOMNode( iface );
1849 return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(&This->node), domNode );
1852 static HRESULT WINAPI unknode_get_previousSibling(
1854 IXMLDOMNode** domNode)
1856 unknode *This = impl_from_unkIXMLDOMNode( iface );
1857 return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(&This->node), domNode );
1860 static HRESULT WINAPI unknode_get_nextSibling(
1862 IXMLDOMNode** domNode)
1864 unknode *This = impl_from_unkIXMLDOMNode( iface );
1865 return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(&This->node), domNode );
1868 static HRESULT WINAPI unknode_get_attributes(
1870 IXMLDOMNamedNodeMap** attributeMap)
1872 unknode *This = impl_from_unkIXMLDOMNode( iface );
1873 return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(&This->node), attributeMap );
1876 static HRESULT WINAPI unknode_insertBefore(
1878 IXMLDOMNode* newNode, VARIANT var1,
1879 IXMLDOMNode** outOldNode)
1881 unknode *This = impl_from_unkIXMLDOMNode( iface );
1882 return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(&This->node), newNode, var1, outOldNode );
1885 static HRESULT WINAPI unknode_replaceChild(
1887 IXMLDOMNode* newNode,
1888 IXMLDOMNode* oldNode,
1889 IXMLDOMNode** outOldNode)
1891 unknode *This = impl_from_unkIXMLDOMNode( iface );
1892 return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(&This->node), newNode, oldNode, outOldNode );
1895 static HRESULT WINAPI unknode_removeChild(
1897 IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
1899 unknode *This = impl_from_unkIXMLDOMNode( iface );
1900 return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode );
1903 static HRESULT WINAPI unknode_appendChild(
1905 IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
1907 unknode *This = impl_from_unkIXMLDOMNode( iface );
1908 return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(&This->node), newNode, outNewNode );
1911 static HRESULT WINAPI unknode_hasChildNodes(
1913 VARIANT_BOOL* pbool)
1915 unknode *This = impl_from_unkIXMLDOMNode( iface );
1916 return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(&This->node), pbool );
1919 static HRESULT WINAPI unknode_get_ownerDocument(
1921 IXMLDOMDocument** domDocument)
1923 unknode *This = impl_from_unkIXMLDOMNode( iface );
1924 return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(&This->node), domDocument );
1927 static HRESULT WINAPI unknode_cloneNode(
1929 VARIANT_BOOL pbool, IXMLDOMNode** outNode)
1931 unknode *This = impl_from_unkIXMLDOMNode( iface );
1932 return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(&This->node), pbool, outNode );
1935 static HRESULT WINAPI unknode_get_nodeTypeString(
1939 unknode *This = impl_from_unkIXMLDOMNode( iface );
1940 return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(&This->node), p );
1943 static HRESULT WINAPI unknode_get_text(
1947 unknode *This = impl_from_unkIXMLDOMNode( iface );
1948 return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(&This->node), p );
1951 static HRESULT WINAPI unknode_put_text(
1955 unknode *This = impl_from_unkIXMLDOMNode( iface );
1956 return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(&This->node), p );
1959 static HRESULT WINAPI unknode_get_specified(
1961 VARIANT_BOOL* pbool)
1963 unknode *This = impl_from_unkIXMLDOMNode( iface );
1964 return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(&This->node), pbool );
1967 static HRESULT WINAPI unknode_get_definition(
1969 IXMLDOMNode** domNode)
1971 unknode *This = impl_from_unkIXMLDOMNode( iface );
1972 return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(&This->node), domNode );
1975 static HRESULT WINAPI unknode_get_nodeTypedValue(
1979 unknode *This = impl_from_unkIXMLDOMNode( iface );
1980 return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
1983 static HRESULT WINAPI unknode_put_nodeTypedValue(
1987 unknode *This = impl_from_unkIXMLDOMNode( iface );
1988 return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
1991 static HRESULT WINAPI unknode_get_dataType(
1995 unknode *This = impl_from_unkIXMLDOMNode( iface );
1996 return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(&This->node), var1 );
1999 static HRESULT WINAPI unknode_put_dataType(
2003 unknode *This = impl_from_unkIXMLDOMNode( iface );
2004 return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(&This->node), p );
2007 static HRESULT WINAPI unknode_get_xml(
2011 unknode *This = impl_from_unkIXMLDOMNode( iface );
2012 return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p );
2015 static HRESULT WINAPI unknode_transformNode(
2017 IXMLDOMNode* domNode, BSTR* p)
2019 unknode *This = impl_from_unkIXMLDOMNode( iface );
2020 return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(&This->node), domNode, p );
2023 static HRESULT WINAPI unknode_selectNodes(
2025 BSTR p, IXMLDOMNodeList** outList)
2027 unknode *This = impl_from_unkIXMLDOMNode( iface );
2028 return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(&This->node), p, outList );
2031 static HRESULT WINAPI unknode_selectSingleNode(
2033 BSTR p, IXMLDOMNode** outNode)
2035 unknode *This = impl_from_unkIXMLDOMNode( iface );
2036 return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(&This->node), p, outNode );
2039 static HRESULT WINAPI unknode_get_parsed(
2041 VARIANT_BOOL* pbool)
2043 unknode *This = impl_from_unkIXMLDOMNode( iface );
2044 return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(&This->node), pbool );
2047 static HRESULT WINAPI unknode_get_namespaceURI(
2051 unknode *This = impl_from_unkIXMLDOMNode( iface );
2052 return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(&This->node), p );
2055 static HRESULT WINAPI unknode_get_prefix(
2059 unknode *This = impl_from_unkIXMLDOMNode( iface );
2060 return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(&This->node), p );
2063 static HRESULT WINAPI unknode_get_baseName(
2067 unknode *This = impl_from_unkIXMLDOMNode( iface );
2068 return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(&This->node), p );
2071 static HRESULT WINAPI unknode_transformNodeToObject(
2073 IXMLDOMNode* domNode, VARIANT var1)
2075 unknode *This = impl_from_unkIXMLDOMNode( iface );
2076 return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(&This->node), domNode, var1 );
2079 static const struct IXMLDOMNodeVtbl unknode_vtbl =
2081 unknode_QueryInterface,
2084 unknode_GetTypeInfoCount,
2085 unknode_GetTypeInfo,
2086 unknode_GetIDsOfNames,
2088 unknode_get_nodeName,
2089 unknode_get_nodeValue,
2090 unknode_put_nodeValue,
2091 unknode_get_nodeType,
2092 unknode_get_parentNode,
2093 unknode_get_childNodes,
2094 unknode_get_firstChild,
2095 unknode_get_lastChild,
2096 unknode_get_previousSibling,
2097 unknode_get_nextSibling,
2098 unknode_get_attributes,
2099 unknode_insertBefore,
2100 unknode_replaceChild,
2101 unknode_removeChild,
2102 unknode_appendChild,
2103 unknode_hasChildNodes,
2104 unknode_get_ownerDocument,
2106 unknode_get_nodeTypeString,
2109 unknode_get_specified,
2110 unknode_get_definition,
2111 unknode_get_nodeTypedValue,
2112 unknode_put_nodeTypedValue,
2113 unknode_get_dataType,
2114 unknode_put_dataType,
2116 unknode_transformNode,
2117 unknode_selectNodes,
2118 unknode_selectSingleNode,
2120 unknode_get_namespaceURI,
2122 unknode_get_baseName,
2123 unknode_transformNodeToObject
2126 IXMLDOMNode *create_node( xmlNodePtr node )
2135 TRACE("type %d\n", node->type);
2138 case XML_ELEMENT_NODE:
2139 pUnk = create_element( node );
2141 case XML_ATTRIBUTE_NODE:
2142 pUnk = create_attribute( node );
2145 pUnk = create_text( node );
2147 case XML_CDATA_SECTION_NODE:
2148 pUnk = create_cdata( node );
2150 case XML_ENTITY_REF_NODE:
2151 pUnk = create_doc_entity_ref( node );
2154 pUnk = create_pi( node );
2156 case XML_COMMENT_NODE:
2157 pUnk = create_comment( node );
2159 case XML_DOCUMENT_NODE:
2160 pUnk = create_domdoc( node );
2162 case XML_DOCUMENT_FRAG_NODE:
2163 pUnk = create_doc_fragment( node );
2168 FIXME("only creating basic node for type %d\n", node->type);
2170 new_node = heap_alloc(sizeof(unknode));
2174 new_node->lpVtbl = &unknode_vtbl;
2176 init_xmlnode(&new_node->node, node, (IXMLDOMNode*)&new_node->lpVtbl, NULL);
2177 pUnk = (IUnknown*)&new_node->lpVtbl;
2181 hr = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMNode, (LPVOID*)&ret);
2182 IUnknown_Release(pUnk);
2183 if(FAILED(hr)) return NULL;