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 HRESULT node_get_first_child(xmlnode *This, IXMLDOMNode **ret)
318 return get_node(This, "firstChild", This->node->children, ret);
321 static HRESULT WINAPI xmlnode_get_firstChild(
323 IXMLDOMNode** firstChild)
325 ERR("Should not be called\n");
329 HRESULT node_get_last_child(xmlnode *This, IXMLDOMNode **ret)
331 return get_node(This, "lastChild", This->node->last, ret);
334 static HRESULT WINAPI xmlnode_get_lastChild(
336 IXMLDOMNode** lastChild)
338 ERR("Should not be called\n");
342 HRESULT node_get_previous_sibling(xmlnode *This, IXMLDOMNode **ret)
344 return get_node(This, "previous", This->node->prev, ret);
347 static HRESULT WINAPI xmlnode_get_previousSibling(
349 IXMLDOMNode** previousSibling)
351 ERR("Should not be called\n");
355 HRESULT node_get_next_sibling(xmlnode *This, IXMLDOMNode **ret)
357 return get_node(This, "next", This->node->next, ret);
360 static HRESULT WINAPI xmlnode_get_nextSibling(
362 IXMLDOMNode** nextSibling)
364 ERR("Should not be called\n");
368 static HRESULT WINAPI xmlnode_get_attributes(
370 IXMLDOMNamedNodeMap** attributeMap)
372 ERR("Should not be called\n");
376 HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT *ref_child,
379 xmlNodePtr before_node, new_child_node;
380 IXMLDOMNode *before = NULL;
387 node_obj = get_node_obj(new_child);
389 FIXME("newChild is not our node implementation\n");
393 switch(V_VT(ref_child))
401 hr = IUnknown_QueryInterface(V_UNKNOWN(ref_child), &IID_IXMLDOMNode, (LPVOID)&before);
402 if(FAILED(hr)) return hr;
406 FIXME("refChild var type %x\n", V_VT(ref_child));
410 new_child_node = node_obj->node;
411 TRACE("new_child_node %p This->node %p\n", new_child_node, This->node);
413 if(!new_child_node->parent)
414 if(xmldoc_remove_orphan(new_child_node->doc, new_child_node) != S_OK)
415 WARN("%p is not an orphan of %p\n", new_child_node, new_child_node->doc);
419 node_obj = get_node_obj(before);
420 IXMLDOMNode_Release(before);
422 FIXME("before node is not our node implementation\n");
426 before_node = node_obj->node;
427 xmlAddPrevSibling(before_node, new_child_node);
431 xmlAddChild(This->node, new_child_node);
435 IXMLDOMNode_AddRef(new_child);
443 static HRESULT WINAPI xmlnode_insertBefore(
445 IXMLDOMNode* newChild,
447 IXMLDOMNode** outNewChild)
449 ERR("Should not be called\n");
453 HRESULT node_replace_child(xmlnode *This, IXMLDOMNode *newChild, IXMLDOMNode *oldChild,
456 xmlnode *old_child, *new_child;
457 xmlDocPtr leaving_doc;
458 xmlNode *my_ancestor;
460 /* Do not believe any documentation telling that newChild == NULL
461 means removal. It does certainly *not* apply to msxml3! */
462 if(!newChild || !oldChild)
468 old_child = get_node_obj(oldChild);
470 FIXME("oldChild is not our node implementation\n");
474 if(old_child->node->parent != This->node)
476 WARN("childNode %p is not a child of %p\n", oldChild, This);
480 new_child = get_node_obj(newChild);
482 FIXME("newChild is not our node implementation\n");
486 my_ancestor = This->node;
489 if(my_ancestor == new_child->node)
491 WARN("tried to create loop\n");
494 my_ancestor = my_ancestor->parent;
497 if(!new_child->node->parent)
498 if(xmldoc_remove_orphan(new_child->node->doc, new_child->node) != S_OK)
499 WARN("%p is not an orphan of %p\n", new_child->node, new_child->node->doc);
501 leaving_doc = new_child->node->doc;
502 xmldoc_add_ref(old_child->node->doc);
503 xmlReplaceNode(old_child->node, new_child->node);
504 xmldoc_release(leaving_doc);
506 xmldoc_add_orphan(old_child->node->doc, old_child->node);
510 IXMLDOMNode_AddRef(oldChild);
517 static HRESULT WINAPI xmlnode_replaceChild(
519 IXMLDOMNode* newChild,
520 IXMLDOMNode* oldChild,
521 IXMLDOMNode** outOldChild)
523 ERR("Should not be called\n");
527 static HRESULT WINAPI xmlnode_removeChild(
529 IXMLDOMNode* childNode,
530 IXMLDOMNode** oldChild)
532 xmlnode *This = impl_from_IXMLDOMNode( iface );
535 TRACE("(%p)->(%p %p)\n", This, childNode, oldChild);
537 if(!childNode) return E_INVALIDARG;
542 child_node = get_node_obj(childNode);
544 FIXME("childNode is not our node implementation\n");
548 if(child_node->node->parent != This->node)
550 WARN("childNode %p is not a child of %p\n", childNode, iface);
554 xmlUnlinkNode(child_node->node);
558 IXMLDOMNode_AddRef(childNode);
559 *oldChild = childNode;
565 static HRESULT WINAPI xmlnode_appendChild(
567 IXMLDOMNode* newChild,
568 IXMLDOMNode** outNewChild)
570 xmlnode *This = impl_from_IXMLDOMNode( iface );
575 TRACE("(%p)->(%p %p)\n", This, newChild, outNewChild);
577 hr = IXMLDOMNode_get_nodeType(newChild, &type);
578 if(FAILED(hr) || type == NODE_ATTRIBUTE) {
579 if(outNewChild) *outNewChild = NULL;
584 return IXMLDOMNode_insertBefore(This->iface, newChild, var, outNewChild);
587 static HRESULT WINAPI xmlnode_hasChildNodes(
589 VARIANT_BOOL* hasChild)
591 xmlnode *This = impl_from_IXMLDOMNode( iface );
593 TRACE("(%p)->(%p)\n", This, hasChild);
597 if (!This->node->children)
599 *hasChild = VARIANT_FALSE;
603 *hasChild = VARIANT_TRUE;
607 static HRESULT WINAPI xmlnode_get_ownerDocument(
609 IXMLDOMDocument** DOMDocument)
611 xmlnode *This = impl_from_IXMLDOMNode( iface );
613 TRACE("(%p)->(%p)\n", This, DOMDocument);
615 return DOMDocument_create_from_xmldoc(This->node->doc, (IXMLDOMDocument3**)DOMDocument);
618 static HRESULT WINAPI xmlnode_cloneNode(
621 IXMLDOMNode** cloneRoot)
623 xmlnode *This = impl_from_IXMLDOMNode( iface );
624 xmlNodePtr pClone = NULL;
625 IXMLDOMNode *pNode = NULL;
627 TRACE("(%p)->(%d %p)\n", This, deep, cloneRoot);
632 pClone = xmlCopyNode(This->node, deep ? 1 : 2);
635 pClone->doc = This->node->doc;
636 xmldoc_add_orphan(pClone->doc, pClone);
638 pNode = create_node(pClone);
641 ERR("Copy failed\n");
649 ERR("Copy failed\n");
656 static HRESULT WINAPI xmlnode_get_nodeTypeString(
660 xmlnode *This = impl_from_IXMLDOMNode( iface );
663 TRACE("(%p)->(%p)\n", This, xmlnodeType );
671 switch( This->node->type )
673 case XML_ATTRIBUTE_NODE:
674 str = (const xmlChar*) "attribute";
676 case XML_CDATA_SECTION_NODE:
677 str = (const xmlChar*) "cdatasection";
679 case XML_COMMENT_NODE:
680 str = (const xmlChar*) "comment";
682 case XML_DOCUMENT_NODE:
683 str = (const xmlChar*) "document";
685 case XML_DOCUMENT_FRAG_NODE:
686 str = (const xmlChar*) "documentfragment";
688 case XML_ELEMENT_NODE:
689 str = (const xmlChar*) "element";
691 case XML_ENTITY_NODE:
692 str = (const xmlChar*) "entity";
694 case XML_ENTITY_REF_NODE:
695 str = (const xmlChar*) "entityreference";
697 case XML_NOTATION_NODE:
698 str = (const xmlChar*) "notation";
701 str = (const xmlChar*) "processinginstruction";
704 str = (const xmlChar*) "text";
707 FIXME("Unknown node type (%d)\n", This->node->type);
708 str = This->node->name;
712 *xmlnodeType = bstr_from_xmlChar( str );
719 static HRESULT WINAPI xmlnode_get_text(
723 xmlnode *This = impl_from_IXMLDOMNode( iface );
727 TRACE("(%p, type %d)->(%p)\n", This, This->node->type, text);
732 pContent = xmlNodeGetContent((xmlNodePtr)This->node);
735 str = bstr_from_xmlChar(pContent);
739 /* Always return a string. */
740 if (!str) str = SysAllocStringLen( NULL, 0 );
742 TRACE("%p %s\n", This, debugstr_w(str) );
748 static HRESULT WINAPI xmlnode_put_text(
752 xmlnode *This = impl_from_IXMLDOMNode( iface );
755 TRACE("(%p)->(%s)\n", This, debugstr_w(text));
757 switch(This->node->type)
759 case XML_DOCUMENT_NODE:
765 str = xmlChar_from_wchar(text);
767 /* Escape the string. */
768 str2 = xmlEncodeEntitiesReentrant(This->node->doc, str);
771 xmlNodeSetContent(This->node, str2);
777 static HRESULT WINAPI xmlnode_get_specified(
779 VARIANT_BOOL* isSpecified)
781 xmlnode *This = impl_from_IXMLDOMNode( iface );
782 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
783 *isSpecified = VARIANT_TRUE;
787 static HRESULT WINAPI xmlnode_get_definition(
789 IXMLDOMNode** definitionNode)
791 xmlnode *This = impl_from_IXMLDOMNode( iface );
792 FIXME("(%p)->(%p)\n", This, definitionNode);
796 static inline BYTE hex_to_byte(xmlChar c)
798 if(c <= '9') return c-'0';
799 if(c <= 'F') return c-'A'+10;
803 static inline BYTE base64_to_byte(xmlChar c)
805 if(c == '+') return 62;
806 if(c == '/') return 63;
807 if(c <= '9') return c-'0'+52;
808 if(c <= 'Z') return c-'A';
812 static inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type)
814 if(!type || !lstrcmpiW(type, szString) ||
815 !lstrcmpiW(type, szNumber) || !lstrcmpiW(type, szUUID))
818 V_BSTR(v) = bstr_from_xmlChar(str);
821 return E_OUTOFMEMORY;
823 else if(!lstrcmpiW(type, szDateTime) || !lstrcmpiW(type, szDateTimeTZ) ||
824 !lstrcmpiW(type, szDate) || !lstrcmpiW(type, szTime) ||
825 !lstrcmpiW(type, szTimeTZ))
835 st.wDayOfWeek = st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
837 V_VT(&src) = VT_BSTR;
838 V_BSTR(&src) = bstr_from_xmlChar(str);
841 return E_OUTOFMEMORY;
844 e = p + SysStringLen(V_BSTR(&src));
846 if(p+4<e && *(p+4)=='-') /* parse date (yyyy-mm-dd) */
849 st.wMonth = atoiW(p+5);
850 st.wDay = atoiW(p+8);
856 if(p+2<e && *(p+2)==':') /* parse time (hh:mm:ss.?) */
859 st.wMinute = atoiW(p+3);
860 st.wSecond = atoiW(p+6);
866 while(isdigitW(*p)) p++;
870 SystemTimeToVariantTime(&st, &date);
874 if(*p == '+') /* parse timezone offset (+hh:mm) */
875 V_DATE(v) += (DOUBLE)atoiW(p+1)/24 + (DOUBLE)atoiW(p+4)/1440;
876 else if(*p == '-') /* parse timezone offset (-hh:mm) */
877 V_DATE(v) -= (DOUBLE)atoiW(p+1)/24 + (DOUBLE)atoiW(p+4)/1440;
881 else if(!lstrcmpiW(type, szBinHex))
886 len = xmlStrlen(str)/2;
890 V_VT(v) = (VT_ARRAY|VT_UI1);
891 V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab);
894 return E_OUTOFMEMORY;
897 ((BYTE*)V_ARRAY(v)->pvData)[i] = (hex_to_byte(str[2*i])<<4)
898 + hex_to_byte(str[2*i+1]);
900 else if(!lstrcmpiW(type, szBinBase64))
905 len = xmlStrlen(str);
906 if(str[len-2] == '=') i = 2;
907 else if(str[len-1] == '=') i = 1;
911 sab.cElements = len/4*3-i;
913 V_VT(v) = (VT_ARRAY|VT_UI1);
914 V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab);
917 return E_OUTOFMEMORY;
919 for(i=0; i<len/4; i++)
921 ((BYTE*)V_ARRAY(v)->pvData)[3*i] = (base64_to_byte(str[4*i])<<2)
922 + (base64_to_byte(str[4*i+1])>>4);
923 if(3*i+1 < sab.cElements)
924 ((BYTE*)V_ARRAY(v)->pvData)[3*i+1] = (base64_to_byte(str[4*i+1])<<4)
925 + (base64_to_byte(str[4*i+2])>>2);
926 if(3*i+2 < sab.cElements)
927 ((BYTE*)V_ARRAY(v)->pvData)[3*i+2] = (base64_to_byte(str[4*i+2])<<6)
928 + base64_to_byte(str[4*i+3]);
936 if(!lstrcmpiW(type, szInt) || !lstrcmpiW(type, szI4))
938 else if(!lstrcmpiW(type, szFixed))
940 else if(!lstrcmpiW(type, szBoolean))
942 else if(!lstrcmpiW(type, szI1))
944 else if(!lstrcmpiW(type, szI2))
946 else if(!lstrcmpiW(type, szIU1))
948 else if(!lstrcmpiW(type, szIU2))
950 else if(!lstrcmpiW(type, szIU4))
952 else if(!lstrcmpiW(type, szR4))
954 else if(!lstrcmpiW(type, szR8) || !lstrcmpiW(type, szFloat))
958 FIXME("Type handling not yet implemented\n");
962 V_VT(&src) = VT_BSTR;
963 V_BSTR(&src) = bstr_from_xmlChar(str);
966 return E_OUTOFMEMORY;
968 hres = VariantChangeTypeEx(v, &src, MAKELCID(MAKELANGID(
969 LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT),0, V_VT(v));
977 static HRESULT WINAPI xmlnode_get_nodeTypedValue(
981 xmlnode *This = impl_from_IXMLDOMNode( iface );
984 HRESULT hres = S_FALSE;
986 TRACE("(%p)->(%p)\n", This, typedValue);
991 V_VT(typedValue) = VT_NULL;
993 if(This->node->type == XML_ELEMENT_NODE ||
994 This->node->type == XML_TEXT_NODE ||
995 This->node->type == XML_ENTITY_REF_NODE)
996 hres = IXMLDOMNode_get_dataType(This->iface, &type);
998 if(hres != S_OK && This->node->type != XML_ELEMENT_NODE)
999 return IXMLDOMNode_get_nodeValue(This->iface, typedValue);
1001 content = xmlNodeGetContent(This->node);
1002 hres = VARIANT_from_xmlChar(content, typedValue,
1003 hres==S_OK ? V_BSTR(&type) : NULL);
1005 VariantClear(&type);
1010 static HRESULT WINAPI xmlnode_put_nodeTypedValue(
1014 xmlnode *This = impl_from_IXMLDOMNode( iface );
1015 FIXME("%p\n", This);
1019 static HRESULT WINAPI xmlnode_get_dataType(
1021 VARIANT* dataTypeName)
1023 xmlnode *This = impl_from_IXMLDOMNode( iface );
1026 TRACE("(%p)->(%p)\n", This, dataTypeName);
1029 return E_INVALIDARG;
1031 /* Attribute, CDATA Section, Comment, Document, Document Fragment,
1032 Entity, Notation, PI, and Text Node are non-typed. */
1033 V_BSTR(dataTypeName) = NULL;
1034 V_VT(dataTypeName) = VT_NULL;
1036 switch ( This->node->type )
1038 case XML_ELEMENT_NODE:
1039 pVal = xmlGetNsProp(This->node, (const xmlChar*)"dt",
1040 (const xmlChar*)"urn:schemas-microsoft-com:datatypes");
1043 V_VT(dataTypeName) = VT_BSTR;
1044 V_BSTR(dataTypeName) = bstr_from_xmlChar( pVal );
1048 case XML_ENTITY_REF_NODE:
1049 FIXME("XML_ENTITY_REF_NODE should return a valid value.\n");
1052 TRACE("Type %d returning NULL\n", This->node->type);
1055 /* non-typed nodes return S_FALSE */
1056 if(V_VT(dataTypeName) == VT_NULL)
1064 static HRESULT WINAPI xmlnode_put_dataType(
1068 xmlnode *This = impl_from_IXMLDOMNode( iface );
1069 HRESULT hr = E_FAIL;
1071 TRACE("(%p)->(%s)\n", This, debugstr_w(dataTypeName));
1073 if(dataTypeName == NULL)
1074 return E_INVALIDARG;
1076 /* An example of this is. The Text in the node needs to be a 0 or 1 for a boolean type.
1077 This applies to changing types (string->bool) or setting a new one
1079 FIXME("Need to Validate the data before allowing a type to be set.\n");
1081 /* Check all supported types. */
1082 if(lstrcmpiW(dataTypeName,szString) == 0 ||
1083 lstrcmpiW(dataTypeName,szNumber) == 0 ||
1084 lstrcmpiW(dataTypeName,szUUID) == 0 ||
1085 lstrcmpiW(dataTypeName,szInt) == 0 ||
1086 lstrcmpiW(dataTypeName,szI4) == 0 ||
1087 lstrcmpiW(dataTypeName,szFixed) == 0 ||
1088 lstrcmpiW(dataTypeName,szBoolean) == 0 ||
1089 lstrcmpiW(dataTypeName,szDateTime) == 0 ||
1090 lstrcmpiW(dataTypeName,szDateTimeTZ) == 0 ||
1091 lstrcmpiW(dataTypeName,szDate) == 0 ||
1092 lstrcmpiW(dataTypeName,szTime) == 0 ||
1093 lstrcmpiW(dataTypeName,szTimeTZ) == 0 ||
1094 lstrcmpiW(dataTypeName,szI1) == 0 ||
1095 lstrcmpiW(dataTypeName,szI2) == 0 ||
1096 lstrcmpiW(dataTypeName,szIU1) == 0 ||
1097 lstrcmpiW(dataTypeName,szIU2) == 0 ||
1098 lstrcmpiW(dataTypeName,szIU4) == 0 ||
1099 lstrcmpiW(dataTypeName,szR4) == 0 ||
1100 lstrcmpiW(dataTypeName,szR8) == 0 ||
1101 lstrcmpiW(dataTypeName,szFloat) == 0 ||
1102 lstrcmpiW(dataTypeName,szBinHex) == 0 ||
1103 lstrcmpiW(dataTypeName,szBinBase64) == 0)
1105 xmlChar* str = xmlChar_from_wchar(dataTypeName);
1108 if (!str) return E_OUTOFMEMORY;
1110 attr = xmlHasNsProp(This->node, (const xmlChar*)"dt",
1111 (const xmlChar*)"urn:schemas-microsoft-com:datatypes");
1114 attr = xmlSetNsProp(This->node, attr->ns, (const xmlChar*)"dt", str);
1119 xmlNsPtr ns = xmlNewNs(This->node, (const xmlChar*)"urn:schemas-microsoft-com:datatypes", (const xmlChar*)"dt");
1122 attr = xmlNewNsProp(This->node, ns, (const xmlChar*)"dt", str);
1125 xmlAddChild(This->node, (xmlNodePtr)attr);
1129 ERR("Failed to create Attribute\n");
1132 ERR("Failed to create Namespace\n");
1140 static BSTR EnsureCorrectEOL(BSTR sInput)
1147 nLen = lstrlenW(sInput);
1148 /* Count line endings */
1149 for(i=0; i < nLen; i++)
1151 if(sInput[i] == '\n')
1155 TRACE("len=%d, num=%d\n", nLen, nNum);
1157 /* Add linefeed as needed */
1161 sNew = SysAllocStringLen(NULL, nLen + nNum+1);
1162 for(i=0; i < nLen; i++)
1164 if(sInput[i] == '\n')
1166 sNew[i+nPlace] = '\r';
1169 sNew[i+nPlace] = sInput[i];
1172 SysFreeString(sInput);
1179 TRACE("len %d\n", lstrlenW(sNew));
1184 /* Removes encoding information and last character (nullbyte) */
1185 static BSTR EnsureNoEncoding(BSTR sInput)
1187 static const WCHAR wszEncoding[] = {'e','n','c','o','d','i','n','g','='};
1192 while(*pBeg != '\n' && memcmp(pBeg, wszEncoding, sizeof(wszEncoding)))
1197 SysReAllocStringLen(&sInput, sInput, SysStringLen(sInput)-1);
1202 pEnd = pBeg + sizeof(wszEncoding)/sizeof(WCHAR) + 2;
1203 while(*pEnd != '\"') pEnd++;
1206 sNew = SysAllocStringLen(NULL,
1207 pBeg-sInput + SysStringLen(sInput)-(pEnd-sInput)-1);
1208 memcpy(sNew, sInput, (pBeg-sInput)*sizeof(WCHAR));
1209 memcpy(&sNew[pBeg-sInput], pEnd, (SysStringLen(sInput)-(pEnd-sInput)-1)*sizeof(WCHAR));
1211 SysFreeString(sInput);
1216 * We are trying to replicate the same behaviour as msxml by converting
1217 * line endings to \r\n and using indents as \t. The problem is that msxml
1218 * only formats nodes that have a line ending. Using libxml we cannot
1219 * reproduce behaviour exactly.
1222 static HRESULT WINAPI xmlnode_get_xml(
1226 xmlnode *This = impl_from_IXMLDOMNode( iface );
1227 xmlBufferPtr pXmlBuf;
1231 TRACE("(%p %d)->(%p)\n", This, This->node->type, xmlString);
1234 return E_INVALIDARG;
1238 xmldecl = xmldoc_unlink_xmldecl( This->node->doc );
1240 pXmlBuf = xmlBufferCreate();
1243 nSize = xmlNodeDump(pXmlBuf, This->node->doc, This->node, 0, 1);
1246 const xmlChar *pContent;
1249 /* Attribute Nodes return a space in front of their name */
1250 pContent = xmlBufferContent(pXmlBuf);
1251 if( ((const char*)pContent)[0] == ' ')
1252 bstrContent = bstr_from_xmlChar(pContent+1);
1254 bstrContent = bstr_from_xmlChar(pContent);
1256 switch(This->node->type)
1258 case XML_ELEMENT_NODE:
1259 *xmlString = EnsureCorrectEOL(bstrContent);
1261 case XML_DOCUMENT_NODE:
1262 *xmlString = EnsureCorrectEOL(bstrContent);
1263 *xmlString = EnsureNoEncoding(*xmlString);
1266 *xmlString = bstrContent;
1270 xmlBufferFree(pXmlBuf);
1273 xmldoc_link_xmldecl( This->node->doc, xmldecl );
1275 /* Always returns a string. */
1276 if(*xmlString == NULL) *xmlString = SysAllocStringLen( NULL, 0 );
1281 static HRESULT WINAPI xmlnode_transformNode(
1283 IXMLDOMNode* styleSheet,
1286 #ifdef SONAME_LIBXSLT
1287 xmlnode *This = impl_from_IXMLDOMNode( iface );
1288 xmlnode *pStyleSheet = NULL;
1289 xsltStylesheetPtr xsltSS = NULL;
1290 xmlDocPtr result = NULL;
1292 TRACE("(%p)->(%p %p)\n", This, styleSheet, xmlString);
1294 if (!libxslt_handle)
1296 if(!styleSheet || !xmlString)
1297 return E_INVALIDARG;
1301 pStyleSheet = get_node_obj(styleSheet);
1303 FIXME("styleSheet is not our xmlnode implementation\n");
1307 xsltSS = pxsltParseStylesheetDoc( pStyleSheet->node->doc);
1310 result = pxsltApplyStylesheet(xsltSS, This->node->doc, NULL);
1313 const xmlChar *pContent;
1315 if(result->type == XML_HTML_DOCUMENT_NODE)
1317 xmlOutputBufferPtr pOutput = xmlAllocOutputBuffer(NULL);
1320 htmlDocContentDumpOutput(pOutput, result->doc, NULL);
1321 pContent = xmlBufferContent(pOutput->buffer);
1322 *xmlString = bstr_from_xmlChar(pContent);
1323 xmlOutputBufferClose(pOutput);
1328 xmlBufferPtr pXmlBuf;
1331 pXmlBuf = xmlBufferCreate();
1334 nSize = xmlNodeDump(pXmlBuf, NULL, (xmlNodePtr)result, 0, 0);
1337 pContent = xmlBufferContent(pXmlBuf);
1338 *xmlString = bstr_from_xmlChar(pContent);
1340 xmlBufferFree(pXmlBuf);
1345 /* libxslt "helpfully" frees the XML document the stylesheet was
1346 generated from, too */
1348 pxsltFreeStylesheet(xsltSS);
1351 if(*xmlString == NULL)
1352 *xmlString = SysAllocStringLen(NULL, 0);
1356 FIXME("libxslt headers were not found at compile time\n");
1361 static HRESULT WINAPI xmlnode_selectNodes(
1364 IXMLDOMNodeList** resultList)
1366 xmlnode *This = impl_from_IXMLDOMNode( iface );
1368 TRACE("(%p)->(%s %p)\n", This, debugstr_w(queryString), resultList );
1370 if (!queryString || !resultList) return E_INVALIDARG;
1372 return queryresult_create( This->node, queryString, resultList );
1375 static HRESULT WINAPI xmlnode_selectSingleNode(
1378 IXMLDOMNode** resultNode)
1380 xmlnode *This = impl_from_IXMLDOMNode( iface );
1381 IXMLDOMNodeList *list;
1384 TRACE("(%p)->(%s %p)\n", This, debugstr_w(queryString), resultNode );
1386 r = IXMLDOMNode_selectNodes(This->iface, queryString, &list);
1389 r = IXMLDOMNodeList_nextNode(list, resultNode);
1390 IXMLDOMNodeList_Release(list);
1395 static HRESULT WINAPI xmlnode_get_parsed(
1397 VARIANT_BOOL* isParsed)
1399 xmlnode *This = impl_from_IXMLDOMNode( iface );
1400 FIXME("(%p)->(%p) stub!\n", This, isParsed);
1401 *isParsed = VARIANT_TRUE;
1405 static HRESULT WINAPI xmlnode_get_namespaceURI(
1409 xmlnode *This = impl_from_IXMLDOMNode( iface );
1412 TRACE("(%p)->(%p)\n", This, namespaceURI );
1415 return E_INVALIDARG;
1417 *namespaceURI = NULL;
1419 if ((ns = xmlGetNsList(This->node->doc, This->node)))
1421 if (ns[0]->href) *namespaceURI = bstr_from_xmlChar( ns[0]->href );
1425 TRACE("uri: %s\n", debugstr_w(*namespaceURI));
1427 return *namespaceURI ? S_OK : S_FALSE;
1430 static HRESULT WINAPI xmlnode_get_prefix(
1434 xmlnode *This = impl_from_IXMLDOMNode( iface );
1437 TRACE("(%p)->(%p)\n", This, prefixString );
1440 return E_INVALIDARG;
1442 *prefixString = NULL;
1444 if ((ns = xmlGetNsList(This->node->doc, This->node)))
1446 if (ns[0]->prefix) *prefixString = bstr_from_xmlChar( ns[0]->prefix );
1450 TRACE("prefix: %s\n", debugstr_w(*prefixString));
1452 return *prefixString ? S_OK : S_FALSE;
1455 static HRESULT WINAPI xmlnode_get_baseName(
1459 xmlnode *This = impl_from_IXMLDOMNode( iface );
1461 HRESULT r = S_FALSE;
1463 TRACE("(%p)->(%p)\n", This, nameString );
1466 return E_INVALIDARG;
1468 switch ( This->node->type )
1470 case XML_ELEMENT_NODE:
1471 case XML_ATTRIBUTE_NODE:
1473 str = bstr_from_xmlChar( This->node->name );
1477 case XML_COMMENT_NODE:
1478 case XML_DOCUMENT_NODE:
1481 ERR("Unhandled type %d\n", This->node->type );
1485 TRACE("returning %08x str = %s\n", r, debugstr_w( str ) );
1491 static HRESULT WINAPI xmlnode_transformNodeToObject(
1493 IXMLDOMNode* stylesheet,
1494 VARIANT outputObject)
1496 xmlnode *This = impl_from_IXMLDOMNode( iface );
1497 FIXME("(%p)->(%p)\n", This, stylesheet);
1501 static const struct IXMLDOMNodeVtbl xmlnode_vtbl =
1503 xmlnode_QueryInterface,
1506 xmlnode_GetTypeInfoCount,
1507 xmlnode_GetTypeInfo,
1508 xmlnode_GetIDsOfNames,
1510 xmlnode_get_nodeName,
1511 xmlnode_get_nodeValue,
1512 xmlnode_put_nodeValue,
1513 xmlnode_get_nodeType,
1514 xmlnode_get_parentNode,
1515 xmlnode_get_childNodes,
1516 xmlnode_get_firstChild,
1517 xmlnode_get_lastChild,
1518 xmlnode_get_previousSibling,
1519 xmlnode_get_nextSibling,
1520 xmlnode_get_attributes,
1521 xmlnode_insertBefore,
1522 xmlnode_replaceChild,
1523 xmlnode_removeChild,
1524 xmlnode_appendChild,
1525 xmlnode_hasChildNodes,
1526 xmlnode_get_ownerDocument,
1528 xmlnode_get_nodeTypeString,
1531 xmlnode_get_specified,
1532 xmlnode_get_definition,
1533 xmlnode_get_nodeTypedValue,
1534 xmlnode_put_nodeTypedValue,
1535 xmlnode_get_dataType,
1536 xmlnode_put_dataType,
1538 xmlnode_transformNode,
1539 xmlnode_selectNodes,
1540 xmlnode_selectSingleNode,
1542 xmlnode_get_namespaceURI,
1544 xmlnode_get_baseName,
1545 xmlnode_transformNodeToObject,
1548 void destroy_xmlnode(xmlnode *This)
1551 xmldoc_release(This->node->doc);
1554 void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispex_static_data_t *dispex_data)
1557 xmldoc_add_ref( node->doc );
1559 This->lpVtbl = &xmlnode_vtbl;
1561 This->iface = node_iface;
1564 init_dispex(&This->dispex, (IUnknown*)This->iface, dispex_data);
1566 This->dispex.outer = NULL;
1571 const IXMLDOMNodeVtbl *lpVtbl;
1575 static inline unknode *impl_from_unkIXMLDOMNode(IXMLDOMNode *iface)
1577 return (unknode *)((char*)iface - FIELD_OFFSET(unknode, lpVtbl));
1580 static HRESULT WINAPI unknode_QueryInterface(
1585 unknode *This = impl_from_unkIXMLDOMNode( iface );
1587 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
1589 if (IsEqualGUID(riid, &IID_IUnknown)) {
1591 }else if (IsEqualGUID( riid, &IID_IDispatch) ||
1592 IsEqualGUID( riid, &IID_IXMLDOMNode)) {
1593 *ppvObject = &This->lpVtbl;
1594 }else if(node_query_interface(&This->node, riid, ppvObject)) {
1595 return *ppvObject ? S_OK : E_NOINTERFACE;
1597 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1599 return E_NOINTERFACE;
1602 IUnknown_AddRef((IUnknown*)*ppvObject);
1606 static ULONG WINAPI unknode_AddRef(
1607 IXMLDOMNode *iface )
1609 unknode *This = impl_from_unkIXMLDOMNode( iface );
1611 return InterlockedIncrement(&This->ref);
1614 static ULONG WINAPI unknode_Release(
1615 IXMLDOMNode *iface )
1617 unknode *This = impl_from_unkIXMLDOMNode( iface );
1620 ref = InterlockedDecrement( &This->ref );
1622 destroy_xmlnode(&This->node);
1629 static HRESULT WINAPI unknode_GetTypeInfoCount(
1633 unknode *This = impl_from_unkIXMLDOMNode( iface );
1635 TRACE("(%p)->(%p)\n", This, pctinfo);
1642 static HRESULT WINAPI unknode_GetTypeInfo(
1646 ITypeInfo** ppTInfo )
1648 unknode *This = impl_from_unkIXMLDOMNode( iface );
1651 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1653 hr = get_typeinfo(IXMLDOMNode_tid, ppTInfo);
1658 static HRESULT WINAPI unknode_GetIDsOfNames(
1661 LPOLESTR* rgszNames,
1666 unknode *This = impl_from_unkIXMLDOMNode( iface );
1668 ITypeInfo *typeinfo;
1671 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1674 if(!rgszNames || cNames == 0 || !rgDispId)
1675 return E_INVALIDARG;
1677 hr = get_typeinfo(IXMLDOMNode_tid, &typeinfo);
1680 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1681 ITypeInfo_Release(typeinfo);
1687 static HRESULT WINAPI unknode_Invoke(
1689 DISPID dispIdMember,
1693 DISPPARAMS* pDispParams,
1694 VARIANT* pVarResult,
1695 EXCEPINFO* pExcepInfo,
1698 unknode *This = impl_from_unkIXMLDOMNode( iface );
1699 ITypeInfo *typeinfo;
1702 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1703 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1705 hr = get_typeinfo(IXMLDOMNode_tid, &typeinfo);
1708 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
1709 pVarResult, pExcepInfo, puArgErr);
1710 ITypeInfo_Release(typeinfo);
1716 static HRESULT WINAPI unknode_get_nodeName(
1720 unknode *This = impl_from_unkIXMLDOMNode( iface );
1722 FIXME("(%p)->(%p)\n", This, p);
1724 return node_get_nodeName(&This->node, p);
1727 static HRESULT WINAPI unknode_get_nodeValue(
1731 unknode *This = impl_from_unkIXMLDOMNode( iface );
1733 FIXME("(%p)->(%p)\n", This, value);
1736 return E_INVALIDARG;
1738 V_VT(value) = VT_NULL;
1742 static HRESULT WINAPI unknode_put_nodeValue(
1746 unknode *This = impl_from_unkIXMLDOMNode( iface );
1747 FIXME("(%p)->(v%d)\n", This, V_VT(&value));
1751 static HRESULT WINAPI unknode_get_nodeType(
1753 DOMNodeType* domNodeType )
1755 unknode *This = impl_from_unkIXMLDOMNode( iface );
1757 FIXME("(%p)->(%p)\n", This, domNodeType);
1759 *domNodeType = This->node.node->type;
1763 static HRESULT WINAPI unknode_get_parentNode(
1765 IXMLDOMNode** parent )
1767 unknode *This = impl_from_unkIXMLDOMNode( iface );
1768 FIXME("(%p)->(%p)\n", This, parent);
1769 if (!parent) return E_INVALIDARG;
1774 static HRESULT WINAPI unknode_get_childNodes(
1776 IXMLDOMNodeList** outList)
1778 unknode *This = impl_from_unkIXMLDOMNode( iface );
1780 TRACE("(%p)->(%p)\n", This, outList);
1782 return node_get_child_nodes(&This->node, outList);
1785 static HRESULT WINAPI unknode_get_firstChild(
1787 IXMLDOMNode** domNode)
1789 unknode *This = impl_from_unkIXMLDOMNode( iface );
1791 TRACE("(%p)->(%p)\n", This, domNode);
1793 return node_get_first_child(&This->node, domNode);
1796 static HRESULT WINAPI unknode_get_lastChild(
1798 IXMLDOMNode** domNode)
1800 unknode *This = impl_from_unkIXMLDOMNode( iface );
1802 TRACE("(%p)->(%p)\n", This, domNode);
1804 return node_get_last_child(&This->node, domNode);
1807 static HRESULT WINAPI unknode_get_previousSibling(
1809 IXMLDOMNode** domNode)
1811 unknode *This = impl_from_unkIXMLDOMNode( iface );
1813 TRACE("(%p)->(%p)\n", This, domNode);
1815 return node_get_previous_sibling(&This->node, domNode);
1818 static HRESULT WINAPI unknode_get_nextSibling(
1820 IXMLDOMNode** domNode)
1822 unknode *This = impl_from_unkIXMLDOMNode( iface );
1824 TRACE("(%p)->(%p)\n", This, domNode);
1826 return node_get_next_sibling(&This->node, domNode);
1829 static HRESULT WINAPI unknode_get_attributes(
1831 IXMLDOMNamedNodeMap** attributeMap)
1833 unknode *This = impl_from_unkIXMLDOMNode( iface );
1835 FIXME("(%p)->(%p)\n", This, attributeMap);
1837 return return_null_ptr((void**)attributeMap);
1840 static HRESULT WINAPI unknode_insertBefore(
1842 IXMLDOMNode* newNode, VARIANT refChild,
1843 IXMLDOMNode** outOldNode)
1845 unknode *This = impl_from_unkIXMLDOMNode( iface );
1847 FIXME("(%p)->(%p x%d %p)\n", This, newNode, V_VT(&refChild), outOldNode);
1849 return node_insert_before(&This->node, newNode, &refChild, outOldNode);
1852 static HRESULT WINAPI unknode_replaceChild(
1854 IXMLDOMNode* newNode,
1855 IXMLDOMNode* oldNode,
1856 IXMLDOMNode** outOldNode)
1858 unknode *This = impl_from_unkIXMLDOMNode( iface );
1860 FIXME("(%p)->(%p %p %p)\n", This, newNode, oldNode, outOldNode);
1862 return node_replace_child(&This->node, newNode, oldNode, outOldNode);
1865 static HRESULT WINAPI unknode_removeChild(
1867 IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
1869 unknode *This = impl_from_unkIXMLDOMNode( iface );
1870 return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode );
1873 static HRESULT WINAPI unknode_appendChild(
1875 IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
1877 unknode *This = impl_from_unkIXMLDOMNode( iface );
1878 return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(&This->node), newNode, outNewNode );
1881 static HRESULT WINAPI unknode_hasChildNodes(
1883 VARIANT_BOOL* pbool)
1885 unknode *This = impl_from_unkIXMLDOMNode( iface );
1886 return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(&This->node), pbool );
1889 static HRESULT WINAPI unknode_get_ownerDocument(
1891 IXMLDOMDocument** domDocument)
1893 unknode *This = impl_from_unkIXMLDOMNode( iface );
1894 return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(&This->node), domDocument );
1897 static HRESULT WINAPI unknode_cloneNode(
1899 VARIANT_BOOL pbool, IXMLDOMNode** outNode)
1901 unknode *This = impl_from_unkIXMLDOMNode( iface );
1902 return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(&This->node), pbool, outNode );
1905 static HRESULT WINAPI unknode_get_nodeTypeString(
1909 unknode *This = impl_from_unkIXMLDOMNode( iface );
1910 return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(&This->node), p );
1913 static HRESULT WINAPI unknode_get_text(
1917 unknode *This = impl_from_unkIXMLDOMNode( iface );
1918 return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(&This->node), p );
1921 static HRESULT WINAPI unknode_put_text(
1925 unknode *This = impl_from_unkIXMLDOMNode( iface );
1926 return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(&This->node), p );
1929 static HRESULT WINAPI unknode_get_specified(
1931 VARIANT_BOOL* pbool)
1933 unknode *This = impl_from_unkIXMLDOMNode( iface );
1934 return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(&This->node), pbool );
1937 static HRESULT WINAPI unknode_get_definition(
1939 IXMLDOMNode** domNode)
1941 unknode *This = impl_from_unkIXMLDOMNode( iface );
1942 return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(&This->node), domNode );
1945 static HRESULT WINAPI unknode_get_nodeTypedValue(
1949 unknode *This = impl_from_unkIXMLDOMNode( iface );
1950 return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
1953 static HRESULT WINAPI unknode_put_nodeTypedValue(
1957 unknode *This = impl_from_unkIXMLDOMNode( iface );
1958 return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
1961 static HRESULT WINAPI unknode_get_dataType(
1965 unknode *This = impl_from_unkIXMLDOMNode( iface );
1966 return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(&This->node), var1 );
1969 static HRESULT WINAPI unknode_put_dataType(
1973 unknode *This = impl_from_unkIXMLDOMNode( iface );
1974 return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(&This->node), p );
1977 static HRESULT WINAPI unknode_get_xml(
1981 unknode *This = impl_from_unkIXMLDOMNode( iface );
1982 return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p );
1985 static HRESULT WINAPI unknode_transformNode(
1987 IXMLDOMNode* domNode, BSTR* p)
1989 unknode *This = impl_from_unkIXMLDOMNode( iface );
1990 return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(&This->node), domNode, p );
1993 static HRESULT WINAPI unknode_selectNodes(
1995 BSTR p, IXMLDOMNodeList** outList)
1997 unknode *This = impl_from_unkIXMLDOMNode( iface );
1998 return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(&This->node), p, outList );
2001 static HRESULT WINAPI unknode_selectSingleNode(
2003 BSTR p, IXMLDOMNode** outNode)
2005 unknode *This = impl_from_unkIXMLDOMNode( iface );
2006 return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(&This->node), p, outNode );
2009 static HRESULT WINAPI unknode_get_parsed(
2011 VARIANT_BOOL* pbool)
2013 unknode *This = impl_from_unkIXMLDOMNode( iface );
2014 return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(&This->node), pbool );
2017 static HRESULT WINAPI unknode_get_namespaceURI(
2021 unknode *This = impl_from_unkIXMLDOMNode( iface );
2022 return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(&This->node), p );
2025 static HRESULT WINAPI unknode_get_prefix(
2029 unknode *This = impl_from_unkIXMLDOMNode( iface );
2030 return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(&This->node), p );
2033 static HRESULT WINAPI unknode_get_baseName(
2037 unknode *This = impl_from_unkIXMLDOMNode( iface );
2038 return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(&This->node), p );
2041 static HRESULT WINAPI unknode_transformNodeToObject(
2043 IXMLDOMNode* domNode, VARIANT var1)
2045 unknode *This = impl_from_unkIXMLDOMNode( iface );
2046 return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(&This->node), domNode, var1 );
2049 static const struct IXMLDOMNodeVtbl unknode_vtbl =
2051 unknode_QueryInterface,
2054 unknode_GetTypeInfoCount,
2055 unknode_GetTypeInfo,
2056 unknode_GetIDsOfNames,
2058 unknode_get_nodeName,
2059 unknode_get_nodeValue,
2060 unknode_put_nodeValue,
2061 unknode_get_nodeType,
2062 unknode_get_parentNode,
2063 unknode_get_childNodes,
2064 unknode_get_firstChild,
2065 unknode_get_lastChild,
2066 unknode_get_previousSibling,
2067 unknode_get_nextSibling,
2068 unknode_get_attributes,
2069 unknode_insertBefore,
2070 unknode_replaceChild,
2071 unknode_removeChild,
2072 unknode_appendChild,
2073 unknode_hasChildNodes,
2074 unknode_get_ownerDocument,
2076 unknode_get_nodeTypeString,
2079 unknode_get_specified,
2080 unknode_get_definition,
2081 unknode_get_nodeTypedValue,
2082 unknode_put_nodeTypedValue,
2083 unknode_get_dataType,
2084 unknode_put_dataType,
2086 unknode_transformNode,
2087 unknode_selectNodes,
2088 unknode_selectSingleNode,
2090 unknode_get_namespaceURI,
2092 unknode_get_baseName,
2093 unknode_transformNodeToObject
2096 IXMLDOMNode *create_node( xmlNodePtr node )
2105 TRACE("type %d\n", node->type);
2108 case XML_ELEMENT_NODE:
2109 pUnk = create_element( node );
2111 case XML_ATTRIBUTE_NODE:
2112 pUnk = create_attribute( node );
2115 pUnk = create_text( node );
2117 case XML_CDATA_SECTION_NODE:
2118 pUnk = create_cdata( node );
2120 case XML_ENTITY_REF_NODE:
2121 pUnk = create_doc_entity_ref( node );
2124 pUnk = create_pi( node );
2126 case XML_COMMENT_NODE:
2127 pUnk = create_comment( node );
2129 case XML_DOCUMENT_NODE:
2130 pUnk = create_domdoc( node );
2132 case XML_DOCUMENT_FRAG_NODE:
2133 pUnk = create_doc_fragment( node );
2138 FIXME("only creating basic node for type %d\n", node->type);
2140 new_node = heap_alloc(sizeof(unknode));
2144 new_node->lpVtbl = &unknode_vtbl;
2146 init_xmlnode(&new_node->node, node, (IXMLDOMNode*)&new_node->lpVtbl, NULL);
2147 pUnk = (IUnknown*)&new_node->lpVtbl;
2151 hr = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMNode, (LPVOID*)&ret);
2152 IUnknown_Release(pUnk);
2153 if(FAILED(hr)) return NULL;