2 * DOM Document implementation
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
38 #include "wine/debug.h"
40 #include "msxml_private.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(msxml
);
47 const struct IBindStatusCallbackVtbl
*lpVtbl
;
50 static HRESULT WINAPI
bsc_QueryInterface(
51 IBindStatusCallback
*iface
,
55 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
56 IsEqualGUID(riid
, &IID_IBindStatusCallback
))
58 IBindStatusCallback_AddRef( iface
);
63 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
67 static ULONG WINAPI
bsc_AddRef(
68 IBindStatusCallback
*iface
)
73 static ULONG WINAPI
bsc_Release(
74 IBindStatusCallback
*iface
)
79 static HRESULT WINAPI
bsc_OnStartBinding(
80 IBindStatusCallback
* iface
,
87 static HRESULT WINAPI
bsc_GetPriority(
88 IBindStatusCallback
* iface
,
94 static HRESULT WINAPI
bsc_OnLowResource(
95 IBindStatusCallback
* iface
,
101 static HRESULT WINAPI
bsc_OnProgress(
102 IBindStatusCallback
* iface
,
106 LPCWSTR szStatusText
)
111 static HRESULT WINAPI
bsc_OnStopBinding(
112 IBindStatusCallback
* iface
,
119 static HRESULT WINAPI
bsc_GetBindInfo(
120 IBindStatusCallback
* iface
,
124 *grfBINDF
= BINDF_RESYNCHRONIZE
;
129 static HRESULT WINAPI
bsc_OnDataAvailable(
130 IBindStatusCallback
* iface
,
133 FORMATETC
* pformatetc
,
139 static HRESULT WINAPI
bsc_OnObjectAvailable(
140 IBindStatusCallback
* iface
,
147 static const struct IBindStatusCallbackVtbl bsc_vtbl
=
159 bsc_OnObjectAvailable
162 static bsc domdoc_bsc
= { &bsc_vtbl
};
164 typedef struct _domdoc
166 const struct IXMLDOMDocument2Vtbl
*lpVtbl
;
169 VARIANT_BOOL validating
;
170 VARIANT_BOOL resolving
;
171 VARIANT_BOOL preserving
;
174 IXMLDOMSchemaCollection
*schema
;
178 LONG
xmldoc_add_ref(xmlDocPtr doc
)
180 LONG ref
= InterlockedIncrement((LONG
*)&doc
->_private
);
185 LONG
xmldoc_release(xmlDocPtr doc
)
187 LONG ref
= InterlockedDecrement((LONG
*)&doc
->_private
);
191 TRACE("freeing docptr %p\n", doc
);
198 static inline domdoc
*impl_from_IXMLDOMDocument2( IXMLDOMDocument2
*iface
)
200 return (domdoc
*)((char*)iface
- FIELD_OFFSET(domdoc
, lpVtbl
));
203 static inline xmlDocPtr
get_doc( domdoc
*This
)
205 return (xmlDocPtr
) xmlNodePtr_from_domnode( This
->node
, XML_DOCUMENT_NODE
);
208 static HRESULT WINAPI
domdoc_QueryInterface( IXMLDOMDocument2
*iface
, REFIID riid
, void** ppvObject
)
210 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
212 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
214 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
215 IsEqualGUID( riid
, &IID_IXMLDOMDocument
) ||
216 IsEqualGUID( riid
, &IID_IXMLDOMDocument2
) )
220 else if ( IsEqualGUID( riid
, &IID_IXMLDOMNode
) ||
221 IsEqualGUID( riid
, &IID_IDispatch
) )
223 return IUnknown_QueryInterface(This
->node_unk
, riid
, ppvObject
);
227 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
228 return E_NOINTERFACE
;
231 IXMLDOMDocument_AddRef( iface
);
237 static ULONG WINAPI
domdoc_AddRef(
238 IXMLDOMDocument2
*iface
)
240 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
241 TRACE("%p\n", This
);
242 return InterlockedIncrement( &This
->ref
);
246 static ULONG WINAPI
domdoc_Release(
247 IXMLDOMDocument2
*iface
)
249 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
252 TRACE("%p\n", This
);
254 ref
= InterlockedDecrement( &This
->ref
);
257 IUnknown_Release( This
->node_unk
);
258 if(This
->schema
) IXMLDOMSchemaCollection_Release( This
->schema
);
259 HeapFree( GetProcessHeap(), 0, This
);
265 static HRESULT WINAPI
domdoc_GetTypeInfoCount( IXMLDOMDocument2
*iface
, UINT
* pctinfo
)
271 static HRESULT WINAPI
domdoc_GetTypeInfo(
272 IXMLDOMDocument2
*iface
,
273 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
279 static HRESULT WINAPI
domdoc_GetIDsOfNames(
280 IXMLDOMDocument2
*iface
,
292 static HRESULT WINAPI
domdoc_Invoke(
293 IXMLDOMDocument2
*iface
,
298 DISPPARAMS
* pDispParams
,
300 EXCEPINFO
* pExcepInfo
,
308 static HRESULT WINAPI
domdoc_get_nodeName(
309 IXMLDOMDocument2
*iface
,
312 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
313 return IXMLDOMNode_get_nodeName( This
->node
, name
);
317 static HRESULT WINAPI
domdoc_get_nodeValue(
318 IXMLDOMDocument2
*iface
,
321 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
322 return IXMLDOMNode_get_nodeValue( This
->node
, value
);
326 static HRESULT WINAPI
domdoc_put_nodeValue(
327 IXMLDOMDocument2
*iface
,
330 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
331 return IXMLDOMNode_put_nodeValue( This
->node
, value
);
335 static HRESULT WINAPI
domdoc_get_nodeType(
336 IXMLDOMDocument2
*iface
,
339 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
340 return IXMLDOMNode_get_nodeType( This
->node
, type
);
344 static HRESULT WINAPI
domdoc_get_parentNode(
345 IXMLDOMDocument2
*iface
,
346 IXMLDOMNode
** parent
)
348 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
349 return IXMLDOMNode_get_parentNode( This
->node
, parent
);
353 static HRESULT WINAPI
domdoc_get_childNodes(
354 IXMLDOMDocument2
*iface
,
355 IXMLDOMNodeList
** childList
)
357 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
358 return IXMLDOMNode_get_childNodes( This
->node
, childList
);
362 static HRESULT WINAPI
domdoc_get_firstChild(
363 IXMLDOMDocument2
*iface
,
364 IXMLDOMNode
** firstChild
)
366 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
367 return IXMLDOMNode_get_firstChild( This
->node
, firstChild
);
371 static HRESULT WINAPI
domdoc_get_lastChild(
372 IXMLDOMDocument2
*iface
,
373 IXMLDOMNode
** lastChild
)
375 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
376 return IXMLDOMNode_get_lastChild( This
->node
, lastChild
);
380 static HRESULT WINAPI
domdoc_get_previousSibling(
381 IXMLDOMDocument2
*iface
,
382 IXMLDOMNode
** previousSibling
)
384 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
385 return IXMLDOMNode_get_previousSibling( This
->node
, previousSibling
);
389 static HRESULT WINAPI
domdoc_get_nextSibling(
390 IXMLDOMDocument2
*iface
,
391 IXMLDOMNode
** nextSibling
)
393 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
394 return IXMLDOMNode_get_nextSibling( This
->node
, nextSibling
);
398 static HRESULT WINAPI
domdoc_get_attributes(
399 IXMLDOMDocument2
*iface
,
400 IXMLDOMNamedNodeMap
** attributeMap
)
402 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
403 return IXMLDOMNode_get_attributes( This
->node
, attributeMap
);
407 static HRESULT WINAPI
domdoc_insertBefore(
408 IXMLDOMDocument2
*iface
,
409 IXMLDOMNode
* newChild
,
411 IXMLDOMNode
** outNewChild
)
413 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
414 return IXMLDOMNode_insertBefore( This
->node
, newChild
, refChild
, outNewChild
);
418 static HRESULT WINAPI
domdoc_replaceChild(
419 IXMLDOMDocument2
*iface
,
420 IXMLDOMNode
* newChild
,
421 IXMLDOMNode
* oldChild
,
422 IXMLDOMNode
** outOldChild
)
424 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
425 return IXMLDOMNode_replaceChild( This
->node
, newChild
, oldChild
, outOldChild
);
429 static HRESULT WINAPI
domdoc_removeChild(
430 IXMLDOMDocument2
*iface
,
431 IXMLDOMNode
* childNode
,
432 IXMLDOMNode
** oldChild
)
434 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
435 return IXMLDOMNode_removeChild( This
->node
, childNode
, oldChild
);
439 static HRESULT WINAPI
domdoc_appendChild(
440 IXMLDOMDocument2
*iface
,
441 IXMLDOMNode
* newChild
,
442 IXMLDOMNode
** outNewChild
)
444 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
445 return IXMLDOMNode_appendChild( This
->node
, newChild
, outNewChild
);
449 static HRESULT WINAPI
domdoc_hasChildNodes(
450 IXMLDOMDocument2
*iface
,
451 VARIANT_BOOL
* hasChild
)
453 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
454 return IXMLDOMNode_hasChildNodes( This
->node
, hasChild
);
458 static HRESULT WINAPI
domdoc_get_ownerDocument(
459 IXMLDOMDocument2
*iface
,
460 IXMLDOMDocument
** DOMDocument
)
462 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
463 return IXMLDOMNode_get_ownerDocument( This
->node
, DOMDocument
);
467 static HRESULT WINAPI
domdoc_cloneNode(
468 IXMLDOMDocument2
*iface
,
470 IXMLDOMNode
** cloneRoot
)
472 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
473 return IXMLDOMNode_cloneNode( This
->node
, deep
, cloneRoot
);
477 static HRESULT WINAPI
domdoc_get_nodeTypeString(
478 IXMLDOMDocument2
*iface
,
481 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
482 return IXMLDOMNode_get_nodeTypeString( This
->node
, nodeType
);
486 static HRESULT WINAPI
domdoc_get_text(
487 IXMLDOMDocument2
*iface
,
490 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
491 return IXMLDOMNode_get_text( This
->node
, text
);
495 static HRESULT WINAPI
domdoc_put_text(
496 IXMLDOMDocument2
*iface
,
499 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
500 return IXMLDOMNode_put_text( This
->node
, text
);
504 static HRESULT WINAPI
domdoc_get_specified(
505 IXMLDOMDocument2
*iface
,
506 VARIANT_BOOL
* isSpecified
)
508 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
509 return IXMLDOMNode_get_specified( This
->node
, isSpecified
);
513 static HRESULT WINAPI
domdoc_get_definition(
514 IXMLDOMDocument2
*iface
,
515 IXMLDOMNode
** definitionNode
)
517 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
518 return IXMLDOMNode_get_definition( This
->node
, definitionNode
);
522 static HRESULT WINAPI
domdoc_get_nodeTypedValue(
523 IXMLDOMDocument2
*iface
,
524 VARIANT
* typedValue
)
526 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
527 return IXMLDOMNode_get_nodeTypedValue( This
->node
, typedValue
);
530 static HRESULT WINAPI
domdoc_put_nodeTypedValue(
531 IXMLDOMDocument2
*iface
,
534 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
535 return IXMLDOMNode_put_nodeTypedValue( This
->node
, typedValue
);
539 static HRESULT WINAPI
domdoc_get_dataType(
540 IXMLDOMDocument2
*iface
,
541 VARIANT
* dataTypeName
)
543 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
544 return IXMLDOMNode_get_dataType( This
->node
, dataTypeName
);
548 static HRESULT WINAPI
domdoc_put_dataType(
549 IXMLDOMDocument2
*iface
,
552 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
553 return IXMLDOMNode_put_dataType( This
->node
, dataTypeName
);
557 static HRESULT WINAPI
domdoc_get_xml(
558 IXMLDOMDocument2
*iface
,
561 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
562 return IXMLDOMNode_get_xml( This
->node
, xmlString
);
566 static HRESULT WINAPI
domdoc_transformNode(
567 IXMLDOMDocument2
*iface
,
568 IXMLDOMNode
* styleSheet
,
571 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
572 return IXMLDOMNode_transformNode( This
->node
, styleSheet
, xmlString
);
576 static HRESULT WINAPI
domdoc_selectNodes(
577 IXMLDOMDocument2
*iface
,
579 IXMLDOMNodeList
** resultList
)
581 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
582 return IXMLDOMNode_selectNodes( This
->node
, queryString
, resultList
);
586 static HRESULT WINAPI
domdoc_selectSingleNode(
587 IXMLDOMDocument2
*iface
,
589 IXMLDOMNode
** resultNode
)
591 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
592 return IXMLDOMNode_selectSingleNode( This
->node
, queryString
, resultNode
);
596 static HRESULT WINAPI
domdoc_get_parsed(
597 IXMLDOMDocument2
*iface
,
598 VARIANT_BOOL
* isParsed
)
600 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
601 return IXMLDOMNode_get_parsed( This
->node
, isParsed
);
605 static HRESULT WINAPI
domdoc_get_namespaceURI(
606 IXMLDOMDocument2
*iface
,
609 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
610 return IXMLDOMNode_get_namespaceURI( This
->node
, namespaceURI
);
614 static HRESULT WINAPI
domdoc_get_prefix(
615 IXMLDOMDocument2
*iface
,
618 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
619 return IXMLDOMNode_get_prefix( This
->node
, prefixString
);
623 static HRESULT WINAPI
domdoc_get_baseName(
624 IXMLDOMDocument2
*iface
,
627 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
628 return IXMLDOMNode_get_baseName( This
->node
, nameString
);
632 static HRESULT WINAPI
domdoc_transformNodeToObject(
633 IXMLDOMDocument2
*iface
,
634 IXMLDOMNode
* stylesheet
,
635 VARIANT outputObject
)
637 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
638 return IXMLDOMNode_transformNodeToObject( This
->node
, stylesheet
, outputObject
);
642 static HRESULT WINAPI
domdoc_get_doctype(
643 IXMLDOMDocument2
*iface
,
644 IXMLDOMDocumentType
** documentType
)
651 static HRESULT WINAPI
domdoc_get_implementation(
652 IXMLDOMDocument2
*iface
,
653 IXMLDOMImplementation
** impl
)
659 static HRESULT WINAPI
domdoc_get_documentElement(
660 IXMLDOMDocument2
*iface
,
661 IXMLDOMElement
** DOMElement
)
663 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
664 xmlDocPtr xmldoc
= NULL
;
665 xmlNodePtr root
= NULL
;
666 IXMLDOMNode
*element_node
;
673 xmldoc
= get_doc( This
);
675 root
= xmlDocGetRootElement( xmldoc
);
679 element_node
= create_node( root
);
680 if(!element_node
) return S_FALSE
;
682 hr
= IXMLDOMNode_QueryInterface(element_node
, &IID_IXMLDOMElement
, (LPVOID
*)DOMElement
);
683 IXMLDOMNode_Release(element_node
);
689 static HRESULT WINAPI
domdoc_documentElement(
690 IXMLDOMDocument2
*iface
,
691 IXMLDOMElement
* DOMElement
)
698 static HRESULT WINAPI
domdoc_createElement(
699 IXMLDOMDocument2
*iface
,
701 IXMLDOMElement
** element
)
704 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
709 TRACE("%p->(%s,%p)\n", iface
, debugstr_w(tagname
), element
);
711 xml_name
= xmlChar_from_wchar((WCHAR
*)tagname
);
712 xmlnode
= xmlNewDocNode(get_doc(This
), NULL
, xml_name
, NULL
);
714 TRACE("created xmlptr %p\n", xmlnode
);
715 elem_unk
= create_element(xmlnode
, NULL
);
716 HeapFree(GetProcessHeap(), 0, xml_name
);
718 hr
= IUnknown_QueryInterface(elem_unk
, &IID_IXMLDOMElement
, (void **)element
);
719 IUnknown_Release(elem_unk
);
720 TRACE("returning %p\n", *element
);
725 static HRESULT WINAPI
domdoc_createDocumentFragment(
726 IXMLDOMDocument2
*iface
,
727 IXMLDOMDocumentFragment
** docFrag
)
734 static HRESULT WINAPI
domdoc_createTextNode(
735 IXMLDOMDocument2
*iface
,
744 static HRESULT WINAPI
domdoc_createComment(
745 IXMLDOMDocument2
*iface
,
747 IXMLDOMComment
** comment
)
754 static HRESULT WINAPI
domdoc_createCDATASection(
755 IXMLDOMDocument2
*iface
,
757 IXMLDOMCDATASection
** cdata
)
764 static HRESULT WINAPI
domdoc_createProcessingInstruction(
765 IXMLDOMDocument2
*iface
,
768 IXMLDOMProcessingInstruction
** pi
)
770 #ifdef HAVE_XMLNEWDOCPI
772 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
773 xmlChar
*xml_target
, *xml_content
;
775 TRACE("%p->(%s %s %p)\n", iface
, debugstr_w(target
), debugstr_w(data
), pi
);
777 xml_target
= xmlChar_from_wchar((WCHAR
*)target
);
778 xml_content
= xmlChar_from_wchar((WCHAR
*)data
);
780 xmlnode
= xmlNewDocPI(get_doc(This
), xml_target
, xml_content
);
781 TRACE("created xmlptr %p\n", xmlnode
);
782 *pi
= (IXMLDOMProcessingInstruction
*)create_pi(xmlnode
);
784 HeapFree(GetProcessHeap(), 0, xml_content
);
785 HeapFree(GetProcessHeap(), 0, xml_target
);
789 FIXME("Libxml 2.6.15 or greater required.\n");
795 static HRESULT WINAPI
domdoc_createAttribute(
796 IXMLDOMDocument2
*iface
,
798 IXMLDOMAttribute
** attribute
)
805 static HRESULT WINAPI
domdoc_createEntityReference(
806 IXMLDOMDocument2
*iface
,
808 IXMLDOMEntityReference
** entityRef
)
815 static HRESULT WINAPI
domdoc_getElementsByTagName(
816 IXMLDOMDocument2
*iface
,
818 IXMLDOMNodeList
** resultList
)
820 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
822 TRACE("(%p)->(%s, %p)\n", This
, debugstr_w(tagName
), resultList
);
824 name
= xmlChar_from_wchar((WCHAR
*)tagName
);
825 *resultList
= create_filtered_nodelist((xmlNodePtr
)get_doc(This
), name
, TRUE
);
826 HeapFree(GetProcessHeap(), 0, name
);
828 if(!*resultList
) return S_FALSE
;
832 static DOMNodeType
get_node_type(VARIANT Type
)
834 if(V_VT(&Type
) == VT_I4
)
837 FIXME("Unsupported variant type %x\n", V_VT(&Type
));
841 static HRESULT WINAPI
domdoc_createNode(
842 IXMLDOMDocument2
*iface
,
848 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
849 DOMNodeType node_type
;
850 xmlNodePtr xmlnode
= NULL
;
853 TRACE("(%p)->(type,%s,%s,%p)\n", This
, debugstr_w(name
), debugstr_w(namespaceURI
), node
);
855 node_type
= get_node_type(Type
);
856 TRACE("node_type %d\n", node_type
);
858 xml_name
= xmlChar_from_wchar((WCHAR
*)name
);
863 xmlnode
= xmlNewDocNode(get_doc(This
), NULL
, xml_name
, NULL
);
864 *node
= create_node(xmlnode
);
865 TRACE("created %p\n", xmlnode
);
869 FIXME("unhandled node type %d\n", node_type
);
873 HeapFree(GetProcessHeap(), 0, xml_name
);
881 static HRESULT WINAPI
domdoc_nodeFromID(
882 IXMLDOMDocument2
*iface
,
890 static xmlDocPtr
doparse( char *ptr
, int len
)
892 #ifdef HAVE_XMLREADMEMORY
894 * use xmlReadMemory if possible so we can suppress
895 * writing errors to stderr
897 return xmlReadMemory( ptr
, len
, NULL
, NULL
,
898 XML_PARSE_NOERROR
| XML_PARSE_NOWARNING
| XML_PARSE_NOBLANKS
);
900 return xmlParseMemory( ptr
, len
);
904 static xmlDocPtr
doread( LPWSTR filename
)
906 xmlDocPtr xmldoc
= NULL
;
909 IStream
*stream
, *memstream
;
910 WCHAR url
[INTERNET_MAX_URL_LENGTH
];
914 TRACE("%s\n", debugstr_w( filename
));
916 if(!PathIsURLW(filename
))
918 WCHAR fullpath
[MAX_PATH
];
919 DWORD needed
= sizeof(url
)/sizeof(WCHAR
);
921 if(!PathSearchAndQualifyW(filename
, fullpath
, sizeof(fullpath
)/sizeof(WCHAR
)))
923 WARN("can't find path\n");
927 if(FAILED(UrlCreateFromPathW(fullpath
, url
, &needed
, 0)))
929 ERR("can't create url from path\n");
935 hr
= CreateBindCtx(0, &pbc
);
938 hr
= RegisterBindStatusCallback(pbc
, (IBindStatusCallback
*)&domdoc_bsc
.lpVtbl
, NULL
, 0);
942 hr
= CreateURLMoniker(NULL
, filename
, &moniker
);
945 hr
= IMoniker_BindToStorage(moniker
, pbc
, NULL
, &IID_IStream
, (LPVOID
*)&stream
);
946 IMoniker_Release(moniker
);
949 IBindCtx_Release(pbc
);
954 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &memstream
);
957 IStream_Release(stream
);
963 IStream_Read(stream
, buf
, sizeof(buf
), &read
);
964 hr
= IStream_Write(memstream
, buf
, read
, &written
);
965 } while(SUCCEEDED(hr
) && written
!= 0 && read
!= 0);
970 hr
= GetHGlobalFromStream(memstream
, &hglobal
);
973 DWORD len
= GlobalSize(hglobal
);
974 char *ptr
= GlobalLock(hglobal
);
976 xmldoc
= doparse( ptr
, len
);
977 GlobalUnlock(hglobal
);
980 IStream_Release(memstream
);
981 IStream_Release(stream
);
985 static HRESULT WINAPI
domdoc_load(
986 IXMLDOMDocument2
*iface
,
988 VARIANT_BOOL
* isSuccessful
)
990 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
991 LPWSTR filename
= NULL
;
992 xmlDocPtr xmldoc
= NULL
;
993 HRESULT hr
= S_FALSE
;
995 TRACE("type %d\n", V_VT(&xmlSource
) );
997 *isSuccessful
= VARIANT_FALSE
;
999 assert( This
->node
);
1001 attach_xmlnode(This
->node
, NULL
);
1003 switch( V_VT(&xmlSource
) )
1006 filename
= V_BSTR(&xmlSource
);
1011 xmldoc
= doread( filename
);
1014 This
->error
= E_FAIL
;
1017 hr
= This
->error
= S_OK
;
1018 *isSuccessful
= VARIANT_TRUE
;
1023 xmldoc
= xmlNewDoc(NULL
);
1025 xmldoc
->_private
= 0;
1026 attach_xmlnode(This
->node
, (xmlNodePtr
) xmldoc
);
1032 static HRESULT WINAPI
domdoc_get_readyState(
1033 IXMLDOMDocument2
*iface
,
1041 static HRESULT WINAPI
domdoc_get_parseError(
1042 IXMLDOMDocument2
*iface
,
1043 IXMLDOMParseError
** errorObj
)
1045 BSTR error_string
= NULL
;
1046 static const WCHAR err
[] = {'e','r','r','o','r',0};
1047 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1049 FIXME("(%p)->(%p): creating a dummy parseError\n", iface
, errorObj
);
1052 error_string
= SysAllocString(err
);
1054 *errorObj
= create_parseError(This
->error
, NULL
, error_string
, NULL
, 0, 0, 0);
1055 if(!*errorObj
) return E_OUTOFMEMORY
;
1060 static HRESULT WINAPI
domdoc_get_url(
1061 IXMLDOMDocument2
*iface
,
1069 static HRESULT WINAPI
domdoc_get_async(
1070 IXMLDOMDocument2
*iface
,
1071 VARIANT_BOOL
* isAsync
)
1073 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1075 TRACE("%p <- %d\n", isAsync
, This
->async
);
1076 *isAsync
= This
->async
;
1081 static HRESULT WINAPI
domdoc_put_async(
1082 IXMLDOMDocument2
*iface
,
1083 VARIANT_BOOL isAsync
)
1085 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1087 TRACE("%d\n", isAsync
);
1088 This
->async
= isAsync
;
1093 static HRESULT WINAPI
domdoc_abort(
1094 IXMLDOMDocument2
*iface
)
1101 static BOOL
bstr_to_utf8( BSTR bstr
, char **pstr
, int *plen
)
1103 UINT len
, blen
= SysStringLen( bstr
);
1106 len
= WideCharToMultiByte( CP_UTF8
, 0, bstr
, blen
, NULL
, 0, NULL
, NULL
);
1107 str
= HeapAlloc( GetProcessHeap(), 0, len
);
1110 WideCharToMultiByte( CP_UTF8
, 0, bstr
, blen
, str
, len
, NULL
, NULL
);
1116 static HRESULT WINAPI
domdoc_loadXML(
1117 IXMLDOMDocument2
*iface
,
1119 VARIANT_BOOL
* isSuccessful
)
1121 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1122 xmlDocPtr xmldoc
= NULL
;
1125 HRESULT hr
= S_FALSE
;
1127 TRACE("%p %s %p\n", This
, debugstr_w( bstrXML
), isSuccessful
);
1129 assert ( This
->node
);
1131 attach_xmlnode( This
->node
, NULL
);
1135 *isSuccessful
= VARIANT_FALSE
;
1137 if ( bstrXML
&& bstr_to_utf8( bstrXML
, &str
, &len
) )
1139 xmldoc
= doparse( str
, len
);
1140 HeapFree( GetProcessHeap(), 0, str
);
1142 This
->error
= E_FAIL
;
1145 hr
= This
->error
= S_OK
;
1146 *isSuccessful
= VARIANT_TRUE
;
1151 xmldoc
= xmlNewDoc(NULL
);
1153 xmldoc
->_private
= 0;
1154 attach_xmlnode( This
->node
, (xmlNodePtr
) xmldoc
);
1160 static HRESULT WINAPI
domdoc_save(
1161 IXMLDOMDocument2
*iface
,
1162 VARIANT destination
)
1164 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1171 TRACE("(%p)->(var(vt %x, %s))\n", This
, V_VT(&destination
),
1172 V_VT(&destination
) == VT_BSTR
? debugstr_w(V_BSTR(&destination
)) : NULL
);
1174 if(V_VT(&destination
) != VT_BSTR
)
1176 FIXME("Unhandled vt %x\n", V_VT(&destination
));
1180 handle
= CreateFileW( V_BSTR(&destination
), GENERIC_WRITE
, 0,
1181 NULL
, CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
1182 if( handle
== INVALID_HANDLE_VALUE
)
1184 WARN("failed to create file\n");
1188 xmlDocDumpMemory(get_doc(This
), &mem
, &size
);
1189 if(!WriteFile(handle
, mem
, (DWORD
)size
, &written
, NULL
) || written
!= (DWORD
)size
)
1191 WARN("write error\n");
1196 CloseHandle(handle
);
1200 static HRESULT WINAPI
domdoc_get_validateOnParse(
1201 IXMLDOMDocument2
*iface
,
1202 VARIANT_BOOL
* isValidating
)
1204 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1206 TRACE("%p <- %d\n", isValidating
, This
->validating
);
1207 *isValidating
= This
->validating
;
1212 static HRESULT WINAPI
domdoc_put_validateOnParse(
1213 IXMLDOMDocument2
*iface
,
1214 VARIANT_BOOL isValidating
)
1216 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1218 TRACE("%d\n", isValidating
);
1219 This
->validating
= isValidating
;
1224 static HRESULT WINAPI
domdoc_get_resolveExternals(
1225 IXMLDOMDocument2
*iface
,
1226 VARIANT_BOOL
* isResolving
)
1228 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1230 TRACE("%p <- %d\n", isResolving
, This
->resolving
);
1231 *isResolving
= This
->resolving
;
1236 static HRESULT WINAPI
domdoc_put_resolveExternals(
1237 IXMLDOMDocument2
*iface
,
1238 VARIANT_BOOL isResolving
)
1240 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1242 TRACE("%d\n", isResolving
);
1243 This
->resolving
= isResolving
;
1248 static HRESULT WINAPI
domdoc_get_preserveWhiteSpace(
1249 IXMLDOMDocument2
*iface
,
1250 VARIANT_BOOL
* isPreserving
)
1252 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1254 TRACE("%p <- %d\n", isPreserving
, This
->preserving
);
1255 *isPreserving
= This
->preserving
;
1260 static HRESULT WINAPI
domdoc_put_preserveWhiteSpace(
1261 IXMLDOMDocument2
*iface
,
1262 VARIANT_BOOL isPreserving
)
1264 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1266 TRACE("%d\n", isPreserving
);
1267 This
->preserving
= isPreserving
;
1272 static HRESULT WINAPI
domdoc_put_onReadyStateChange(
1273 IXMLDOMDocument2
*iface
,
1274 VARIANT readyStateChangeSink
)
1281 static HRESULT WINAPI
domdoc_put_onDataAvailable(
1282 IXMLDOMDocument2
*iface
,
1283 VARIANT onDataAvailableSink
)
1289 static HRESULT WINAPI
domdoc_put_onTransformNode(
1290 IXMLDOMDocument2
*iface
,
1291 VARIANT onTransformNodeSink
)
1297 static HRESULT WINAPI
domdoc_get_namespaces(
1298 IXMLDOMDocument2
* iface
,
1299 IXMLDOMSchemaCollection
** schemaCollection
)
1305 static HRESULT WINAPI
domdoc_get_schemas(
1306 IXMLDOMDocument2
* iface
,
1309 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1310 HRESULT hr
= S_FALSE
;
1311 IXMLDOMSchemaCollection
*cur_schema
= This
->schema
;
1313 TRACE("(%p)->(%p)\n", This
, var1
);
1315 VariantInit(var1
); /* Test shows we don't call VariantClear here */
1316 V_VT(var1
) = VT_NULL
;
1320 hr
= IXMLDOMSchemaCollection_QueryInterface(cur_schema
, &IID_IDispatch
, (void**)&V_DISPATCH(var1
));
1322 V_VT(var1
) = VT_DISPATCH
;
1327 static HRESULT WINAPI
domdoc_putref_schemas(
1328 IXMLDOMDocument2
* iface
,
1331 domdoc
*This
= impl_from_IXMLDOMDocument2( iface
);
1332 HRESULT hr
= E_FAIL
;
1333 IXMLDOMSchemaCollection
*new_schema
= NULL
;
1335 FIXME("(%p): semi-stub\n", This
);
1339 hr
= IUnknown_QueryInterface(V_UNKNOWN(&var1
), &IID_IXMLDOMSchemaCollection
, (void**)&new_schema
);
1343 hr
= IDispatch_QueryInterface(V_DISPATCH(&var1
), &IID_IXMLDOMSchemaCollection
, (void**)&new_schema
);
1352 WARN("Can't get schema from vt %x\n", V_VT(&var1
));
1357 IXMLDOMSchemaCollection
*old_schema
= InterlockedExchangePointer((void**)&This
->schema
, new_schema
);
1358 if(old_schema
) IXMLDOMSchemaCollection_Release(old_schema
);
1364 static HRESULT WINAPI
domdoc_validate(
1365 IXMLDOMDocument2
* iface
,
1366 IXMLDOMParseError
** err
)
1372 static HRESULT WINAPI
domdoc_setProperty(
1373 IXMLDOMDocument2
* iface
,
1381 static HRESULT WINAPI
domdoc_getProperty(
1382 IXMLDOMDocument2
* iface
,
1390 static const struct IXMLDOMDocument2Vtbl domdoc_vtbl
=
1392 domdoc_QueryInterface
,
1395 domdoc_GetTypeInfoCount
,
1397 domdoc_GetIDsOfNames
,
1399 domdoc_get_nodeName
,
1400 domdoc_get_nodeValue
,
1401 domdoc_put_nodeValue
,
1402 domdoc_get_nodeType
,
1403 domdoc_get_parentNode
,
1404 domdoc_get_childNodes
,
1405 domdoc_get_firstChild
,
1406 domdoc_get_lastChild
,
1407 domdoc_get_previousSibling
,
1408 domdoc_get_nextSibling
,
1409 domdoc_get_attributes
,
1410 domdoc_insertBefore
,
1411 domdoc_replaceChild
,
1414 domdoc_hasChildNodes
,
1415 domdoc_get_ownerDocument
,
1417 domdoc_get_nodeTypeString
,
1420 domdoc_get_specified
,
1421 domdoc_get_definition
,
1422 domdoc_get_nodeTypedValue
,
1423 domdoc_put_nodeTypedValue
,
1424 domdoc_get_dataType
,
1425 domdoc_put_dataType
,
1427 domdoc_transformNode
,
1429 domdoc_selectSingleNode
,
1431 domdoc_get_namespaceURI
,
1433 domdoc_get_baseName
,
1434 domdoc_transformNodeToObject
,
1436 domdoc_get_implementation
,
1437 domdoc_get_documentElement
,
1438 domdoc_documentElement
,
1439 domdoc_createElement
,
1440 domdoc_createDocumentFragment
,
1441 domdoc_createTextNode
,
1442 domdoc_createComment
,
1443 domdoc_createCDATASection
,
1444 domdoc_createProcessingInstruction
,
1445 domdoc_createAttribute
,
1446 domdoc_createEntityReference
,
1447 domdoc_getElementsByTagName
,
1451 domdoc_get_readyState
,
1452 domdoc_get_parseError
,
1459 domdoc_get_validateOnParse
,
1460 domdoc_put_validateOnParse
,
1461 domdoc_get_resolveExternals
,
1462 domdoc_put_resolveExternals
,
1463 domdoc_get_preserveWhiteSpace
,
1464 domdoc_put_preserveWhiteSpace
,
1465 domdoc_put_onReadyStateChange
,
1466 domdoc_put_onDataAvailable
,
1467 domdoc_put_onTransformNode
,
1468 domdoc_get_namespaces
,
1470 domdoc_putref_schemas
,
1476 HRESULT
DOMDocument_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1482 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
1484 doc
= HeapAlloc( GetProcessHeap(), 0, sizeof (*doc
) );
1486 return E_OUTOFMEMORY
;
1488 doc
->lpVtbl
= &domdoc_vtbl
;
1491 doc
->validating
= 0;
1493 doc
->preserving
= 0;
1497 xmldoc
= xmlNewDoc(NULL
);
1500 HeapFree(GetProcessHeap(), 0, doc
);
1501 return E_OUTOFMEMORY
;
1504 xmldoc
->_private
= 0;
1506 doc
->node_unk
= create_basic_node( (xmlNodePtr
)xmldoc
, (IUnknown
*)&doc
->lpVtbl
);
1510 HeapFree(GetProcessHeap(), 0, doc
);
1514 hr
= IUnknown_QueryInterface(doc
->node_unk
, &IID_IXMLDOMNode
, (LPVOID
*)&doc
->node
);
1517 IUnknown_Release(doc
->node_unk
);
1518 HeapFree( GetProcessHeap(), 0, doc
);
1521 /* The ref on doc->node is actually looped back into this object, so release it */
1522 IXMLDOMNode_Release(doc
->node
);
1524 *ppObj
= &doc
->lpVtbl
;
1526 TRACE("returning iface %p\n", *ppObj
);
1532 HRESULT
DOMDocument_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1534 MESSAGE("This program tried to use a DOMDocument object, but\n"
1535 "libxml2 support was not present at compile time.\n");