/*
 * Copyright (C) 2005 Mike McCormack
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include <xmldomdid.h>
#include <idispids.h>

#if !defined(progid) && !defined(__WIDL__)
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

interface IXMLDOMImplementation;
interface IXMLDOMNode;
interface IXMLDOMDocumentFragment;
interface IXMLDOMDocument;
interface IXMLDOMNodeList;
interface IXMLDOMNamedNodeMap;
interface IXMLDOMCharacterData;
interface IXMLDOMAttribute;
interface IXMLDOMElement;
interface IXMLDOMText;
interface IXMLDOMComment;
interface IXMLDOMProcessingInstruction;
interface IXMLDOMCDATASection;
interface IXMLDOMDocumentType;
interface IXMLDOMNotation;
interface IXMLDOMEntity;
interface IXMLDOMEntityReference;
interface IXMLDOMParseError;

cpp_quote("#ifndef __MSXML_DOMNODETYPE_DEFINED")
cpp_quote("#define __MSXML_DOMNODETYPE_DEFINED")
typedef enum tagDOMNodeType {
    NODE_INVALID,
    NODE_ELEMENT,
    NODE_ATTRIBUTE,
    NODE_TEXT,
    NODE_CDATA_SECTION,
    NODE_ENTITY_REFERENCE,
    NODE_ENTITY,
    NODE_PROCESSING_INSTRUCTION,
    NODE_COMMENT,
    NODE_DOCUMENT,
    NODE_DOCUMENT_TYPE,
    NODE_DOCUMENT_FRAGMENT,
    NODE_NOTATION
} DOMNodeType;
cpp_quote("#endif")

[
local,
object,
odl,
dual,
oleautomation,
/*nonextensible,*/
uuid(2933bf80-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMNode : IDispatch
{
    [propget, id(DISPID_DOM_NODE_NODENAME)]
    HRESULT nodeName( [out,retval] BSTR *name );

    [propget, id(DISPID_DOM_NODE_NODEVALUE)]
    HRESULT nodeValue( [out,retval] VARIANT *value );

    [propput, id(DISPID_DOM_NODE_NODEVALUE)]
    HRESULT nodeValue( [in] VARIANT value );

    [propget, id(DISPID_DOM_NODE_NODETYPE)]
    HRESULT nodeType( [out,retval] DOMNodeType *type );

    [propget, id(DISPID_DOM_NODE_PARENTNODE)]
    HRESULT parentNode( [out,retval] IXMLDOMNode **parent );

    [propget, id(DISPID_DOM_NODE_CHILDNODES)]
    HRESULT childNodes( [out,retval] IXMLDOMNodeList **childList );

    [propget, id(DISPID_DOM_NODE_FIRSTCHILD)]
    HRESULT firstChild( [out,retval] IXMLDOMNode **firstChild );

    [propget, id(DISPID_DOM_NODE_LASTCHILD)]
    HRESULT lastChild( [out,retval] IXMLDOMNode **lastChild );

    [propget, id(DISPID_DOM_NODE_PREVIOUSSIBLING)]
    HRESULT previousSibling( [out,retval] IXMLDOMNode **previousSibling );

    [propget, id(DISPID_DOM_NODE_NEXTSIBLING)]
    HRESULT nextSibling( [out,retval] IXMLDOMNode **nextSibling );

    [propget, id(DISPID_DOM_NODE_ATTRIBUTES)]
    HRESULT attributes( [out,retval] IXMLDOMNamedNodeMap **attributeMap );

    [id(DISPID_DOM_NODE_INSERTBEFORE)]
    HRESULT insertBefore( [in] IXMLDOMNode * newChild,
                          [in] VARIANT refChild,
                          [out,retval] IXMLDOMNode **outNewChild );

    [id(DISPID_DOM_NODE_REPLACECHILD)]
    HRESULT replaceChild( [in] IXMLDOMNode *newChild,
                          [in] IXMLDOMNode *oldChild,
                          [out,retval] IXMLDOMNode **outOldChild );

    [id(DISPID_DOM_NODE_REMOVECHILD)]
    HRESULT removeChild( [in] IXMLDOMNode *childNode,
                         [out,retval] IXMLDOMNode **oldChild );

    [id(DISPID_DOM_NODE_APPENDCHILD)]
    HRESULT appendChild( [in] IXMLDOMNode *newChild,
                         [out,retval] IXMLDOMNode **outNewChild );

    [id(DISPID_DOM_NODE_HASCHILDNODES)]
    HRESULT hasChildNodes( [out,retval] VARIANT_BOOL *hasChild );

    [propget, id(DISPID_DOM_NODE_OWNERDOC)]
    HRESULT ownerDocument( [out,retval] IXMLDOMDocument **DOMDocument );

    [id(DISPID_DOM_NODE_CLONENODE)]
    HRESULT cloneNode( [in] VARIANT_BOOL deep,
                       [out,retval] IXMLDOMNode **cloneRoot );

    [propget, id(DISPID_XMLDOM_NODE_STRINGTYPE)]
    HRESULT nodeTypeString( [out,retval] BSTR *nodeType );

    [propget, id(DISPID_XMLDOM_NODE_TEXT)]
    HRESULT text( [out,retval] BSTR *text );

    [propput, id(DISPID_XMLDOM_NODE_TEXT)]
    HRESULT text( [in] BSTR text );

    [propget, id(DISPID_XMLDOM_NODE_SPECIFIED)]
    HRESULT specified( [out,retval] VARIANT_BOOL *isSpecified );

    [propget, id(DISPID_XMLDOM_NODE_DEFINITION)]
    HRESULT definition( [out,retval] IXMLDOMNode **definitionNode );

    [propget, id(DISPID_XMLDOM_NODE_NODETYPEDVALUE)]
    HRESULT nodeTypedValue( [out,retval] VARIANT *typedValue );

    [propput, id(DISPID_XMLDOM_NODE_NODETYPEDVALUE)]
    HRESULT nodeTypedValue( [in] VARIANT typedValue );

    [propget, id(DISPID_XMLDOM_NODE_DATATYPE)]
    HRESULT dataType( [out,retval] VARIANT *dataTypeName );

    [propput, id(DISPID_XMLDOM_NODE_DATATYPE)]
    HRESULT dataType( [in] BSTR dataTypeName );

    [propget, id(DISPID_XMLDOM_NODE_XML)]
    HRESULT xml( [out,retval] BSTR *xmlString );

    [id(DISPID_XMLDOM_NODE_TRANSFORMNODE)]
    HRESULT transformNode( [in] IXMLDOMNode *styleSheet,
                           [out,retval] BSTR *xmlString );

    [id(DISPID_XMLDOM_NODE_SELECTNODES)]
    HRESULT selectNodes( [in] BSTR queryString,
                         [out,retval] IXMLDOMNodeList **resultList );

    [id(DISPID_XMLDOM_NODE_SELECTSINGLENODE)]
    HRESULT selectSingleNode( [in] BSTR queryString,
                              [out,retval] IXMLDOMNode **resultNode );

    [propget, id(DISPID_XMLDOM_NODE_PARSED)]
    HRESULT parsed( [out,retval] VARIANT_BOOL *isParsed );

    [propget, id(DISPID_XMLDOM_NODE_NAMESPACE)]
    HRESULT namespaceURI( [out,retval] BSTR *namespaceURI );

    [propget, id(DISPID_XMLDOM_NODE_PREFIX)]
    HRESULT prefix( [out,retval] BSTR *prefixString );

    [propget, id(DISPID_XMLDOM_NODE_BASENAME)]
    HRESULT baseName( [out,retval] BSTR *nameString );

    [id(DISPID_XMLDOM_NODE_TRANSFORMNODETOOBJECT)]
    HRESULT transformNodeToObject( [in] IXMLDOMNode *stylesheet,
                                   [in] VARIANT outputObject );
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf81-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMDocument : IXMLDOMNode
{
    [propget, id(DISPID_DOM_DOCUMENT_DOCTYPE)]
    HRESULT doctype( [out,retval] IXMLDOMDocumentType **documentType );

    [propget, id(DISPID_DOM_DOCUMENT_IMPLEMENTATION)]
    HRESULT implementation( [out,retval] IXMLDOMImplementation **impl );

    [propget, id(DISPID_DOM_DOCUMENT_DOCUMENTELEMENT)]
    HRESULT documentElement( [out,retval] IXMLDOMElement **DOMElement );

    [propputref, id(DISPID_DOM_DOCUMENT_DOCUMENTELEMENT)]
    HRESULT documentElement( [in] IXMLDOMElement *DOMElement );

    [id(DISPID_DOM_DOCUMENT_CREATEELEMENT)]
    HRESULT createElement( [in] BSTR tagname,
                           [out,retval] IXMLDOMElement **element );

    [id(DISPID_DOM_DOCUMENT_CREATEDOCUMENTFRAGMENT)]
    HRESULT createDocumentFragment( [out,retval] IXMLDOMDocumentFragment **docFrag );

    [id(DISPID_DOM_DOCUMENT_CREATETEXTNODE)]
    HRESULT createTextNode( [in] BSTR data,
                            [out,retval] IXMLDOMText **text );

    [id(DISPID_DOM_DOCUMENT_CREATECOMMENT)]
    HRESULT createComment( [in] BSTR data,
                           [out,retval] IXMLDOMComment **comment );

    [id(DISPID_DOM_DOCUMENT_CREATECDATASECTION)]
    HRESULT createCDATASection( [in] BSTR data,
                                [out,retval] IXMLDOMCDATASection **cdata );

    [id(DISPID_DOM_DOCUMENT_CREATEPROCESSINGINSTRUCTION)]
    HRESULT createProcessingInstruction( [in] BSTR target,
                                         [in] BSTR data,
                                         [out,retval] IXMLDOMProcessingInstruction **pi );

    [id(DISPID_DOM_DOCUMENT_CREATEATTRIBUTE)]
    HRESULT createAttribute( [in] BSTR name,
                             [out,retval] IXMLDOMAttribute **attribute );

    [id(DISPID_DOM_DOCUMENT_CREATEENTITYREFERENCE)]
    HRESULT createEntityReference( [in] BSTR name,
                                   [out,retval] IXMLDOMEntityReference **entityRef );

    [id(DISPID_DOM_DOCUMENT_GETELEMENTSBYTAGNAME)]
    HRESULT getElementsByTagName( [in] BSTR tagName,
                                  [out,retval] IXMLDOMNodeList **resultList );

    [id(DISPID_XMLDOM_DOCUMENT_CREATENODE)]
    HRESULT createNode( [in] VARIANT Type,
                        [in] BSTR name,
                        [in] BSTR namespaceURI,
                        [out,retval] IXMLDOMNode **node );

    [id(DISPID_XMLDOM_DOCUMENT_NODEFROMID)]
    HRESULT nodeFromID( [in] BSTR idString,
                        [out,retval] IXMLDOMNode **node );

    [id(DISPID_XMLDOM_DOCUMENT_LOAD)]
    HRESULT load( [in] VARIANT xmlSource,
                  [out,retval] VARIANT_BOOL *isSuccessful );

    [propget, id(DISPID_READYSTATE)]
    HRESULT readyState( [out,retval] LONG *value );

    [propget, id(DISPID_XMLDOM_DOCUMENT_PARSEERROR)]
    HRESULT parseError( [out,retval] IXMLDOMParseError **errorObj );

    [propget, id(DISPID_XMLDOM_DOCUMENT_URL)]
    HRESULT url( [out,retval] BSTR *urlString );

    /* FIXME: these is meant to be async, but widl parses that as a keyword */
    [propget, id(DISPID_XMLDOM_DOCUMENT_ASYNC)]
    HRESULT async( [out,retval] VARIANT_BOOL *isAsync );

    [propput, id(DISPID_XMLDOM_DOCUMENT_ASYNC)]
    HRESULT async( [in] VARIANT_BOOL isAsync );

    [id(DISPID_XMLDOM_DOCUMENT_ABORT)]
    HRESULT abort();

    [id(DISPID_XMLDOM_DOCUMENT_LOADXML)]
    HRESULT loadXML( [in] BSTR bstrXML,
                     [out,retval] VARIANT_BOOL *isSuccessful );

    [id(DISPID_XMLDOM_DOCUMENT_SAVE)]
    HRESULT save( [in] VARIANT destination );

    [propget, id(DISPID_XMLDOM_DOCUMENT_VALIDATE)]
    HRESULT validateOnParse( [out,retval] VARIANT_BOOL *isValidating );

    [propput, id(DISPID_XMLDOM_DOCUMENT_VALIDATE)]
    HRESULT validateOnParse( [in] VARIANT_BOOL isValidating );

    [propget, id(DISPID_XMLDOM_DOCUMENT_RESOLVENAMESPACE)]
    HRESULT resolveExternals( [out,retval] VARIANT_BOOL *isResolving );

    [propput, id(DISPID_XMLDOM_DOCUMENT_RESOLVENAMESPACE)]
    HRESULT resolveExternals( [in] VARIANT_BOOL isValidating );

    [propget, id(DISPID_XMLDOM_DOCUMENT_PRESERVEWHITESPACE)]
    HRESULT preserveWhiteSpace( [out,retval] VARIANT_BOOL *isPreserving );

    [propput, id(DISPID_XMLDOM_DOCUMENT_PRESERVEWHITESPACE)]
    HRESULT preserveWhiteSpace( [in] VARIANT_BOOL isPreserving );

    [propput, id(DISPID_XMLDOM_DOCUMENT_ONREADYSTATECHANGE)]
    HRESULT onreadystatechange( [in] VARIANT readystatechangeSink );

    [propput, id(DISPID_XMLDOM_DOCUMENT_ONDATAAVAILABLE)]
    HRESULT ondataavailable( [in] VARIANT ondataavailableSink );

    [propput, id(DISPID_XMLDOM_DOCUMENT_ONTRANSFORMNODE)]
    HRESULT ontransformnode( [in] VARIANT ontransformnodeSink );
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf82-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMNodeList : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT item( [in] LONG index,
                  [out,retval] IXMLDOMNode **listItem );

    [propget, id(DISPID_DOM_NODELIST_LENGTH)]
    HRESULT length( [out,retval] LONG *listLength );

    [id(DISPID_XMLDOM_NODELIST_NEXTNODE)]
    HRESULT nextNode( [out,retval] IXMLDOMNode **nextItem );

    [id(DISPID_XMLDOM_NODELIST_RESET)]
    HRESULT reset();

    [id(DISPID_NEWENUM)]
    HRESULT _newEnum( [out,retval] IUnknown **ppUnk );
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf83-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMNamedNodeMap : IDispatch
{
    [id(DISPID_DOM_NAMEDNODEMAP_GETNAMEDITEM)]
    HRESULT getNamedItem( [in] BSTR name,
                          [out,retval] IXMLDOMNode **namedItem );

    [id(DISPID_DOM_NAMEDNODEMAP_SETNAMEDITEM)]
    HRESULT setNamedItem( [in] IXMLDOMNode *newItem,
                          [out,retval] IXMLDOMNode **namedItem );

    [id(DISPID_DOM_NAMEDNODEMAP_REMOVENAMEDITEM)]
    HRESULT removeNamedItem( [in] BSTR name,
                             [out,retval] IXMLDOMNode **namedItem );

    [propget, id(DISPID_VALUE)]
    HRESULT item( [in] LONG index,
                  [out,retval] IXMLDOMNode **listItem );

    [propget, id(DISPID_DOM_NODELIST_LENGTH)]
    HRESULT length( [out,retval] LONG *listLength );

    [id(DISPID_XMLDOM_NAMEDNODEMAP_GETQUALIFIEDITEM)]
    HRESULT getQualifiedItem( [in] BSTR baseName,
                              [in] BSTR namespaceURI,
                              [out,retval] IXMLDOMNode **qualifiedItem );

    [id(DISPID_XMLDOM_NAMEDNODEMAP_REMOVEQUALIFIEDITEM)]
    HRESULT removeQualifiedItem( [in] BSTR baseName,
                                 [in] BSTR namespaceURI,
                                 [out,retval] IXMLDOMNode **qualifiedItem );

    [id(DISPID_XMLDOM_NAMEDNODEMAP_NEXTNODE)]
    HRESULT nextNode( [out,retval] IXMLDOMNode **nextItem );

    [id(DISPID_XMLDOM_NAMEDNODEMAP_RESET)]
    HRESULT reset();

    [id(DISPID_NEWENUM)]
    HRESULT _newEnum( [out,retval] IUnknown **ppUnk );
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(3efaa413-272f-11d2-836f-0000f87a7782),
pointer_default(unique)
]
interface IXMLDOMDocumentFragment : IXMLDOMNode
{
    /* empty */
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf84-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMCharacterData : IXMLDOMNode
{
    [propget, id(DISPID_DOM_DATA_DATA)]
    HRESULT data( [out,retval] BSTR *data );

    [propput, id(DISPID_DOM_DATA_DATA)]
    HRESULT data( [in] BSTR data );

    [propget, id(DISPID_DOM_DATA_LENGTH)]
    HRESULT length( [out,retval] LONG *dataLength );

    [id(DISPID_DOM_DATA_SUBSTRING)]
    HRESULT substringData( [in] LONG offset,
                           [in] LONG count,
                           [out,retval] BSTR *data );

    [id(DISPID_DOM_DATA_APPEND)]
    HRESULT appendData( [in] BSTR data );

    [id(DISPID_DOM_DATA_INSERT)]
    HRESULT insertData( [in] LONG offset,
                        [in] BSTR data );

    [id(DISPID_DOM_DATA_DELETE)]
    HRESULT deleteData( [in] LONG offset,
                        [in] LONG count );

    [id(DISPID_DOM_DATA_REPLACE)]
    HRESULT replaceData( [in] LONG offset,
                         [in] LONG count,
                         [in] BSTR data );
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf85-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMAttribute : IXMLDOMNode
{
    [propget,id(DISPID_DOM_ATTRIBUTE_GETNAME)]
    HRESULT name( [out,retval] BSTR *attributeName );

    [propget,id(DISPID_DOM_ATTRIBUTE_VALUE)]
    HRESULT value( [out,retval] VARIANT *attributeValue );

    [propput,id(DISPID_DOM_ATTRIBUTE_VALUE)]
    HRESULT value( [in] VARIANT attributeValue );
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf86-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMElement : IXMLDOMNode
{
    [propget, id(DISPID_DOM_ELEMENT_GETTAGNAME)]
    HRESULT tagName( [out,retval] BSTR *tagName );

    [id(DISPID_DOM_ELEMENT_GETATTRIBUTE)]
    HRESULT getAttribute( [in] BSTR name,
                          [out,retval] VARIANT * value );

    [id(DISPID_DOM_ELEMENT_SETATTRIBUTE)]
    HRESULT setAttribute( [in] BSTR name,
                          [in] VARIANT value );

    [id(DISPID_DOM_ELEMENT_REMOVEATTRIBUTE)]
    HRESULT removeAttribute( [in] BSTR name );

    [id(DISPID_DOM_ELEMENT_GETATTRIBUTENODE)]
    HRESULT getAttributeNode( [in] BSTR name,
                              [out, retval] IXMLDOMAttribute ** attributeNode );

    [id(DISPID_DOM_ELEMENT_SETATTRIBUTENODE)]
    HRESULT setAttributeNode( [in] IXMLDOMAttribute *DOMAttribute,
                              [out, retval] IXMLDOMAttribute ** attributeNode );

    [id(DISPID_DOM_ELEMENT_REMOVEATTRIBUTENODE)]
    HRESULT removeAttributeNode( [in] IXMLDOMAttribute *DOMAttribute,
                              [out, retval] IXMLDOMAttribute ** attributeNode );

    [id(DISPID_DOM_ELEMENT_GETELEMENTSBYTAGNAME)]
    HRESULT getElementsByTagName( [in] BSTR tagName,
                              [out, retval] IXMLDOMNodeList ** resultList );

    [id(DISPID_DOM_ELEMENT_NORMALIZE)]
    HRESULT normalize();
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf87-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMText : IXMLDOMCharacterData
{
    [id(DISPID_DOM_TEXT_SPLITTEXT)]
    HRESULT splitText( [in] LONG offset,
                       [out,retval] IXMLDOMText **rightHandTextNode );
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf88-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMComment : IXMLDOMCharacterData
{
    /* empty */
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf89-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMProcessingInstruction : IXMLDOMNode
{
    [propget, id(DISPID_DOM_PI_TARGET)]
    HRESULT target( [out, retval] BSTR *name );

    [propget, id(DISPID_DOM_PI_DATA)]
    HRESULT data( [out, retval] BSTR *value );

    [propput, id(DISPID_DOM_PI_DATA)]
    HRESULT data( [in] BSTR value );
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf8a-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMCDATASection : IXMLDOMText
{
    /* empty */
}

[
local,
object,
odl,
dual,
/*nonextensible,*/
oleautomation,
uuid(2933bf8b-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMDocumentType : IXMLDOMNode
{
    [propget, id(DISPID_DOM_DOCUMENTTYPE_NAME)]
    HRESULT name( [out,retval] BSTR *rootName );

    [propget, id(DISPID_DOM_DOCUMENTTYPE_ENTITIES)]
    HRESULT entities( [out,retval] IXMLDOMNamedNodeMap **entityMap );

    [propget, id(DISPID_DOM_DOCUMENTTYPE_NOTATIONS)]
    HRESULT notations( [out,retval] IXMLDOMNamedNodeMap **notationMap );
}

[
local,
object,
odl,
dual,
nonextensible,
oleautomation,
uuid(2933bf8c-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMNotation : IXMLDOMNode
{
    [propget, id(DISPID_DOM_NOTATION_PUBLICID)]
    HRESULT publicId([out, retval] VARIANT *publicId);

    [propget, id(DISPID_DOM_NOTATION_SYSTEMID)]
    HRESULT systemId([out, retval] VARIANT *systemId);
}

[
local,
object,
odl,
dual,
nonextensible,
oleautomation,
uuid(2933bf8d-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMEntity : IXMLDOMNode
{
    [propget, id(DISPID_DOM_ENTITY_PUBLICID)]
    HRESULT publicId([out, retval] VARIANT *publicId);

    [propget, id(DISPID_DOM_ENTITY_SYSTEMID)]
    HRESULT systemId([out, retval] VARIANT *systemId);

    [propget, id(DISPID_DOM_ENTITY_NOTATIONNAME)]
    HRESULT notationName([out, retval] BSTR *name);
}

[
local,
object,
odl,
dual,
nonextensible,
oleautomation,
uuid(2933bf8e-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMEntityReference : IXMLDOMNode
{
}

[
local,
object,
odl,
dual,
nonextensible,
oleautomation,
uuid(2933bf8f-7b36-11d2-b20e-00c04f983e60),
pointer_default(unique)
]
interface IXMLDOMImplementation : IDispatch
{
    [id(DISPID_DOM_IMPLEMENTATION_HASFEATURE)]
    HRESULT hasFeature([in] BSTR feature, [in] BSTR version, [out, retval] VARIANT_BOOL *pbool);
}

[
local,
object,
odl,
dual,
oleautomation,
/*nonextensible,*/
helpstring("structure for reporting parse errors"),
pointer_default(unique),
uuid (3efaa426-272f-11d2-836f-0000f87a7782)
]
interface IXMLDOMParseError : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT errorCode([retval, out] LONG *errCode);

    [propget, id(DISPID_DOM_ERROR_URL)]
    HRESULT url([retval, out] BSTR *p);

    [propget, id(DISPID_DOM_ERROR_REASON)]
    HRESULT reason([retval, out] BSTR *p);

    [propget, id(DISPID_DOM_ERROR_SRCTEXT)]
    HRESULT srcText([retval, out] BSTR *p);

    [propget, id(DISPID_DOM_ERROR_LINE)]
    HRESULT line([retval, out] LONG *lineNo);

    [propget, id(DISPID_DOM_ERROR_LINEPOS)]
    HRESULT linepos([retval, out] LONG * linePos);

    [propget, id(DISPID_DOM_ERROR_FILEPOS)]
    HRESULT filepos([retval, out] LONG * filePos);
}

[
    hidden,
    uuid(3efaa427-272f-11d2-836f-0000f87a7782)
]
dispinterface XMLDOMDocumentEvents
{
    properties:
    methods:
    [id(DISPID_XMLDOMEVENT_ONDATAAVAILABLE)]
    HRESULT ondataavailable();

    [id(DISPID_XMLDOMEVENT_ONREADYSTATECHANGE)]
    HRESULT onreadystatechange();
}

[
    helpstring("XML DOM Document"),
    progid("Microsoft.XMLDOM.1.0"),
    vi_progid("Microsoft.XMLDOM"),
    threading(both),
    version(1.0),
    uuid(2933bf90-7b36-11d2-b20e-00c04f983e60)
]
coclass DOMDocument
{
    [default] interface IXMLDOMDocument;
    [default, source] dispinterface XMLDOMDocumentEvents;
}

[
    helpstring("Free Threaded XML DOM Document"),
    progid("Microsoft.FreeThreadedXMLDOM.1.0"),
    vi_progid("Microsoft.FreeThreadedXMLDOM"),
    threading(both),
    version(1.0),
    uuid(2933bf91-7b36-11d2-b20e-00c04f983e60)
]
coclass DOMFreeThreadedDocument
{
    [default] interface IXMLDOMDocument;
    [default, source] dispinterface XMLDOMDocumentEvents;
}

[
object,
uuid(ed8c108d-4349-11d2-91a4-00c04f7969e8),
odl,
dual,
oleautomation,
pointer_default(unique)
]
interface IXMLHttpRequest : IDispatch
{
    [id(1)]
    HRESULT open([in] BSTR bstrMethod, [in] BSTR bstrUrl,
                 [in, optional] VARIANT varAsync,
                 [in, optional] VARIANT varUser,
                 [in, optional] VARIANT varPassword);
    [id(2)]
    HRESULT setRequestHeader([in] BSTR bstrHeader, [in] BSTR bstrValue);

    [id(3)]
    HRESULT getResponseHeader([in] BSTR bstrHeader, [out, retval] BSTR *pbstrValue);

    [id(4)]
    HRESULT getAllResponseHeaders([out, retval] BSTR *pbstrHeaders);

    [id(5)]
    HRESULT send([in, optional] VARIANT varBody);

    [id(6)]
    HRESULT abort();

    [propget, id(7)]
    HRESULT status([out, retval] LONG *plStatus);

    [propget, id(8)]
    HRESULT statusText([out, retval] BSTR *bstrStatus);

    [propget, id(9)]
    HRESULT responseXML([out, retval] IDispatch **ppBody);

    [propget, id(10)]
    HRESULT responseText([out, retval] BSTR *pbstrBody);

    [propget, id(11)]
    HRESULT responseBody([out, retval] VARIANT *pvarBody);

    [propget, id(12)]
    HRESULT responseStream([out, retval] VARIANT *pvarBody);

    [propget, id(13)]
    HRESULT readyState([out, retval] LONG *plState);

    [propput, id(14)]
    HRESULT onreadystatechange([in] IDispatch *pReadyStateSink);
}

[
    helpstring("XML HTTP Request"),
    progid("Microsoft.XMLHTTP.1.0"),
    vi_progid("Microsoft.XMLHTTP"),
    threading(apartment),
    version(1.0),
    uuid(ed8c108e-4349-11d2-91a4-00c04f7969e8)
]
coclass XMLHTTPRequest
{
    [default] interface IXMLHttpRequest;
}
