/*
 * Copyright (C) 2005 Vijay Kiran Kamuju
 * Copyright (C) 2008 Alistair Leslie-Hughes
 * Copyright (C) 2010 Nikolay Sivov for CodeWeavers
 *
 * 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
 */

#pragma makedep regtypelib

#include <msxml2did.h>
#include <idispids.h>

import "unknwn.idl";
import "objidl.idl";
import "oaidl.idl";

[
    uuid(f5078f18-c551-11d3-89b9-0000f81fe221),
    version(2.6),
    helpstring("Microsoft XML, v2.6")
]
library MSXML2
{

importlib("stdole2.tlb");

interface IXMLDOMImplementation;
interface IXMLDOMNode;
interface IXMLDOMDocumentFragment;
interface IXMLDOMDocument;
interface IXMLDOMSchemaCollection;
interface IXMLDOMDocument2;
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;
interface IXTLRuntime;
interface IXSLTemplate;
interface IXSLProcessor;

typedef enum tagDOMNodeType
{
    NODE_INVALID  		= 0,
    NODE_ELEMENT  		= 1,
    NODE_ATTRIBUTE		= 2,
    NODE_TEXT			= 3,
    NODE_CDATA_SECTION		= 4,
    NODE_ENTITY_REFERENCE 	= 5,
    NODE_ENTITY 		= 6,
    NODE_PROCESSING_INSTRUCTION = 7,
    NODE_COMMENT		= 8,
    NODE_DOCUMENT		= 9,
    NODE_DOCUMENT_TYPE		= 10,
    NODE_DOCUMENT_FRAGMENT 	= 11,
    NODE_NOTATION 		= 12
} DOMNodeType;

[
local,
object,
dual,
oleautomation,
uuid (2933BF80-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMNode : IDispatch
{
    [propget, id(DISPID_DOM_NODE_NODENAME)]
    HRESULT nodeName([retval, out] BSTR *p);

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

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

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

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

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

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

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

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

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

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

    [id(DISPID_DOM_NODE_INSERTBEFORE)]
    HRESULT insertBefore(
        [in] IXMLDOMNode *newNode,
        [in] VARIANT var1,
        [retval, out] IXMLDOMNode **outOldNode);

    [id(DISPID_DOM_NODE_REPLACECHILD)]
    HRESULT replaceChild(
        [in] IXMLDOMNode *newNode,
        [in] IXMLDOMNode *oldNode,
        [retval, out] IXMLDOMNode **outOldNode);

    [id(DISPID_DOM_NODE_REMOVECHILD)]
    HRESULT removeChild(
        [in] IXMLDOMNode *domNode,
        [retval, out] IXMLDOMNode **oldNode);

    [id(DISPID_DOM_NODE_APPENDCHILD)]
    HRESULT appendChild(
        [in] IXMLDOMNode *newNode,
        [retval, out] IXMLDOMNode **outNewNode);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    [id(DISPID_XMLDOM_NODE_TRANSFORMNODETOOBJECT)]
    HRESULT transformNodeToObject(
        [in] IXMLDOMNode *domNode,
        [in] VARIANT var1);
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF81-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMDocument : IXMLDOMNode
{
    [propget, id(DISPID_DOM_DOCUMENT_DOCTYPE)]
    HRESULT doctype([retval, out] IXMLDOMDocumentType **docType);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    [propget, id(DISPID_XMLDOM_DOCUMENT_ASYNC)]
    HRESULT async([retval, out] VARIANT_BOOL *pbool);

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

    [id(DISPID_XMLDOM_DOCUMENT_ABORT)]
    HRESULT abort();

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

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

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

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

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

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

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

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

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

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

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

[
local,
object,
dual,
oleautomation,
uuid (373984c8-b845-449b-91e7-45ac83036ade)
]
interface IXMLDOMSchemaCollection : IDispatch
{
    [id(DISPID_XMLDOM_SCHEMACOLLECTION_ADD)]
    HRESULT add(
        [in] BSTR uri,
        [in] VARIANT var);

    [id(DISPID_XMLDOM_SCHEMACOLLECTION_GET)]
    HRESULT get(
        [in] BSTR uri,
        [retval, out] IXMLDOMNode **node);

    [id(DISPID_XMLDOM_SCHEMACOLLECTION_REMOVE)]
    HRESULT remove(
        [in] BSTR uri);

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

    [propget, id(DISPID_VALUE)]
    HRESULT namespaceURI([in] LONG index, [out, retval] BSTR *len);

    [id(DISPID_XMLDOM_SCHEMACOLLECTION_ADDCOLLECTION)]
    HRESULT addCollection(
        [in] IXMLDOMSchemaCollection *otherCollection);

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

[
local,
object,
dual,
oleautomation,
uuid (2933BF95-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMDocument2 : IXMLDOMDocument
{
    [propget, id(DISPID_XMLDOM_DOCUMENT2_NAMESPACES)]
    HRESULT namespaces([retval, out] IXMLDOMSchemaCollection **schemaCollection);

    [propget, id(DISPID_XMLDOM_DOCUMENT2_SCHEMAS)]
    HRESULT schemas([retval, out] VARIANT *var1);

    [propputref, id(DISPID_XMLDOM_DOCUMENT2_SCHEMAS)]
    HRESULT schemas([in] VARIANT var1);

    [id(DISPID_XMLDOM_DOCUMENT2_VALIDATE)]
    HRESULT validate(
        [retval, out] IXMLDOMParseError **err);

    [id(DISPID_XMLDOM_DOCUMENT2_SETPROPERTY)]
    HRESULT setProperty(
        [in] BSTR p,
        [in] VARIANT var);

    [id(DISPID_XMLDOM_DOCUMENT2_GETPROPERTY)]
    HRESULT getProperty(
        [in] BSTR p,
        [retval, out] VARIANT *var);
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF82-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMNodeList : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT item([in] LONG lIndex, [retval, out] IXMLDOMNode **outNode);

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

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

    [id(DISPID_XMLDOM_NODELIST_RESET)]
    HRESULT reset();

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

[
local,
object,
dual,
oleautomation,
uuid (AA634FC7-5888-44a7-A257-3A47150D3A0E)
]
interface IXMLDOMSelection : IXMLDOMNodeList
{
    [propget, id(DISPID_XMLDOM_SELECTION_EXPR)]
    HRESULT expr([retval, out] BSTR *p);

    [propput, id(DISPID_XMLDOM_SELECTION_EXPR)]
    HRESULT expr([in] BSTR p);

    [propget, id(DISPID_XMLDOM_SELECTION_CONTEXT)]
    HRESULT context([retval, out] IXMLDOMNode **ppNode);

    [propputref, id(DISPID_XMLDOM_SELECTION_CONTEXT)]
    HRESULT context([in] IXMLDOMNode * pNode);

    [id(DISPID_XMLDOM_SELECTION_PEEKNODE)]
    HRESULT peekNode(
        [retval, out] IXMLDOMNode **ppNode);

    [id(DISPID_XMLDOM_SELECTION_MATCHES)]
    HRESULT matches(
        [in] IXMLDOMNode *pNode,
        [retval, out] IXMLDOMNode **ppNode);

    [id(DISPID_XMLDOM_SELECTION_REMOVENEXT)]
    HRESULT removeNext(
        [retval, out] IXMLDOMNode **ppNode);

    [id(DISPID_XMLDOM_SELECTION_REMOVEALL)]
    HRESULT removeAll();

    [id(DISPID_XMLDOM_SELECTION_CLONE)]
    HRESULT clone(
        [retval, out] IXMLDOMSelection **ppNode);

    [id(DISPID_XMLDOM_SELECTION_GETPROPERTY)]
    HRESULT getProperty(
        [in] BSTR p,
        [retval, out] VARIANT * var);

    [id(DISPID_XMLDOM_SELECTION_SETPROPERTY)]
    HRESULT setProperty(
        [in] BSTR p,
        [in] VARIANT var);
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF83-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMNamedNodeMap : IDispatch
{
    [id(DISPID_DOM_NAMEDNODEMAP_GETNAMEDITEM)]
    HRESULT getNamedItem(
        [in] BSTR p,
        [retval, out] IXMLDOMNode **outNode);

    [id(DISPID_DOM_NAMEDNODEMAP_SETNAMEDITEM)]
    HRESULT setNamedItem(
        [in] IXMLDOMNode *newNode,
        [retval, out] IXMLDOMNode **outNode);

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

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

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

    [id(DISPID_XMLDOM_NAMEDNODEMAP_GETQUALIFIEDITEM)]
    HRESULT getQualifiedItem(
        [in] BSTR name,
        [in] BSTR uri,
        [retval, out] IXMLDOMNode **outNode);

    [id(DISPID_XMLDOM_NAMEDNODEMAP_REMOVEQUALIFIEDITEM)]
    HRESULT removeQualifiedItem(
        [in] BSTR name,
        [in] BSTR uri,
        [retval, out] IXMLDOMNode **outNode);

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

    [id(DISPID_XMLDOM_NAMEDNODEMAP_RESET)]
    HRESULT reset();

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

[
local,
object,
dual,
oleautomation,
uuid (3efaa413-272f-11d2-836f-0000f87a7782)
]
interface IXMLDOMDocumentFragment : IXMLDOMNode
{
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF84-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMCharacterData : IXMLDOMNode
{
    [propget, id(DISPID_DOM_DATA_DATA)]
    HRESULT data([retval, out] BSTR *p);

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

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

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

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

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

    [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 p);
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF85-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMAttribute : IXMLDOMNode
{
    [propget, id(DISPID_DOM_ATTRIBUTE_GETNAME)]
    HRESULT name([retval, out] BSTR *p);

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

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

[
local,
object,
dual,
oleautomation,
uuid (2933BF86-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMElement : IXMLDOMNode
{
    [propget, id(DISPID_DOM_ELEMENT_GETTAGNAME)]
    HRESULT tagName([retval, out] BSTR *p);

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

    [id(DISPID_DOM_ELEMENT_SETATTRIBUTE)]
    HRESULT setAttribute(
        [in] BSTR p,
        [in] VARIANT var);

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

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

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

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

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

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

[
local,
object,
dual,
oleautomation,
uuid (2933BF87-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMText : IXMLDOMCharacterData
{
    [id(DISPID_DOM_TEXT_SPLITTEXT)]
    HRESULT splitText(
        [in] LONG offset,
        [retval, out] IXMLDOMText **txtNode);
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF88-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMComment : IXMLDOMCharacterData
{
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF89-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMProcessingInstruction : IXMLDOMNode
{
    [propget, id(DISPID_DOM_PI_TARGET)]
    HRESULT target([retval, out] BSTR *p);

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

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

[
local,
object,
dual,
oleautomation,
uuid (2933BF8A-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMCDATASection : IXMLDOMText
{
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF8B-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMDocumentType : IXMLDOMNode
{
    [propget, id(DISPID_DOM_DOCUMENTTYPE_NAME)]
    HRESULT name([retval, out] BSTR *p);

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

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

[
local,
object,
dual,
oleautomation,
uuid (2933BF8C-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMNotation : IXMLDOMNode
{
    [propget, id(DISPID_DOM_NOTATION_PUBLICID)]
    HRESULT publicId([retval, out] VARIANT *id);

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

[
local,
object,
dual,
oleautomation,
uuid (2933BF8D-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMEntity : IXMLDOMNode
{
    [propget, id(DISPID_DOM_ENTITY_PUBLICID)]
    HRESULT publicId([retval, out] VARIANT *id1);

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

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

[
local,
object,
dual,
oleautomation,
uuid (2933BF8E-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMEntityReference : IXMLDOMNode
{
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF8F-7B36-11d2-B20E-00C04F983E60)
]
interface IXMLDOMImplementation : IDispatch
{
    [id(DISPID_DOM_IMPLEMENTATION_HASFEATURE)]
    HRESULT hasFeature(
        [in] BSTR feature,
        [in] BSTR version,
        [retval, out] VARIANT_BOOL *pbool);
}

[
local,
object,
dual,
oleautomation,
uuid (3efaa425-272f-11d2-836f-0000f87a7782)
]
interface IXTLRuntime : IXMLDOMNode
{
    [id(DISPID_XTLRUNTIME_UNIQUEID)]
    HRESULT uniqueID(
        [in]IXMLDOMNode *pNode,
        [retval, out]LONG *pID);

    [id(DISPID_XTLRUNTIME_DEPTH)]
    HRESULT depth(
        [in] IXMLDOMNode *pNode,
        [retval, out]LONG * pDepth);

    [id(DISPID_XTLRUNTIME_CHILDNUMBER)]
    HRESULT childNumber(
        [in]IXMLDOMNode *pNode,
        [retval, out] LONG *pNumber);

    [id(DISPID_XTLRUNTIME_ANCESTORCHILDNUMBER)]
    HRESULT ancestorChildNumber(
        [in]BSTR bstr,
        [in]IXMLDOMNode *pNode,
        [retval, out]LONG *pNumber);

    [id(DISPID_XTLRUNTIME_ABSOLUTECHILDNUMBER)]
    HRESULT absoluteChildNumber(
        [in]IXMLDOMNode *pNode,
        [retval, out]LONG *pNumber);

    [id(DISPID_XTLRUNTIME_FORMATINDEX)]
    HRESULT formatIndex(
        [in] LONG lIndex,
        [in] BSTR bstr,
        [retval, out]BSTR *pbstr);

    [id(DISPID_XTLRUNTIME_FORMATNUMBER)]
    HRESULT formatNumber(
        [in] double dblNumber,
        [in] BSTR bstr,
        [retval, out]BSTR *pbstr);

    [id(DISPID_XTLRUNTIME_FORMATDATE)]
    HRESULT formatDate(
        [in] VARIANT var1,
        [in] BSTR bstr,
        [optional, in] VARIANT var2,
        [retval, out]BSTR *pbstr);

    [id(DISPID_XTLRUNTIME_FORMATTIME)]
    HRESULT formatTime(
        [in] VARIANT var1,
        [in] BSTR bstr,
        [optional, in] VARIANT var2,
        [retval, out]BSTR *pbstr);

}

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

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

[
local,
object,
dual,
oleautomation,
uuid (2933BF92-7B36-11d2-B20E-00C04F983E60)
]
interface IXSLProcessor : IDispatch
{
    [propput, id(DISPID_XMLDOM_PROCESSOR_INPUT)]
    HRESULT input([in] VARIANT var);

    [propget, id(DISPID_XMLDOM_PROCESSOR_INPUT)]
    HRESULT input([retval, out] VARIANT *var);

    [propget, id(DISPID_XMLDOM_PROCESSOR_XSLTEMPLATE)]
    HRESULT ownerTemplate([retval, out] IXSLTemplate **ppTemplate);

    [id(DISPID_XMLDOM_PROCESSOR_SETSTARTMODE)]
    HRESULT setStartMode(
        [in] BSTR p,
        [in, defaultvalue("")] BSTR uri);

    [propget, id(DISPID_XMLDOM_PROCESSOR_STARTMODE)]
    HRESULT startMode([retval, out] BSTR *p);

    [propget, id(DISPID_XMLDOM_PROCESSOR_STARTMODEURI)]
    HRESULT startModeURI([retval, out] BSTR *uri);

    [propput, id(DISPID_XMLDOM_PROCESSOR_OUTPUT)]
    HRESULT output([in] VARIANT var);

    [propget, id(DISPID_XMLDOM_PROCESSOR_OUTPUT)]
    HRESULT output([retval, out] VARIANT *var);

    [id(DISPID_XMLDOM_PROCESSOR_TRANSFORM)]
    HRESULT transform(
        [retval, out] VARIANT_BOOL *pbool);

    [id(DISPID_XMLDOM_PROCESSOR_RESET)]
    HRESULT reset();

    [propget, id(DISPID_XMLDOM_PROCESSOR_READYSTATE)]
    HRESULT readyState([retval, out] LONG *pstate);

    [id(DISPID_XMLDOM_PROCESSOR_ADDPARAMETER)]
    HRESULT addParameter(
        [in] BSTR p,
        [in] VARIANT var,
        [in, defaultvalue("")] BSTR uri);

    [id(DISPID_XMLDOM_PROCESSOR_ADDOBJECT)]
    HRESULT addObject(
        [in] IDispatch* obj,
        [in] BSTR uri);

    [propget, id(DISPID_XMLDOM_PROCESSOR_STYLESHEET)]
    HRESULT stylesheet([retval, out] IXMLDOMNode **node);
}

[
local,
object,
dual,
oleautomation,
uuid (2933BF93-7B36-11d2-B20E-00C04F983E60)
]
interface IXSLTemplate : IDispatch
{
    [propputref, id(DISPID_XMLDOM_TEMPLATE_STYLESHEET)]
    HRESULT stylesheet([in] IXMLDOMNode *node);

    [propget, id(DISPID_XMLDOM_TEMPLATE_STYLESHEET)]
    HRESULT stylesheet([retval, out] IXMLDOMNode **node);

    [id(DISPID_XMLDOM_TEMPLATE_CREATEPROCESSOR)]
    HRESULT createProcessor(
        [retval, out] IXSLProcessor **ppProcessor);
}

[
    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 username, [in,optional] VARIANT password);

    [id(2)]
    HRESULT setRequestHeader([in] BSTR bstrHeader, [in] BSTR bstrValue);

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

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

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

    [id(6)]
    HRESULT abort();

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

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

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

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

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

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

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

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

[
local,
object,
dual,
oleautomation,
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);
}

[
    uuid(F6D90F11-9C73-11D3-B32E-00C04F990BB4)
]
coclass DOMDocument
{
    [default] interface IXMLDOMDocument2;
    [default, source] dispinterface XMLDOMDocumentEvents;
}

[
    helpstring("XML DOM Document 2.6"),
    progid("Msxml2.DOMDocument.2.6"),
    vi_progid("Msxml2.DOMDocument"),
    threading(both),
    uuid(f5078f1b-c551-11d3-89b9-0000f81fe221)
]
coclass DOMDocument26
{
    [default] interface IXMLDOMDocument2;
    [default, source] dispinterface XMLDOMDocumentEvents;
}

[
    uuid(F6D90F12-9C73-11D3-B32E-00C04F990BB4)
]
coclass FreeThreadedDOMDocument
{
    [default] interface IXMLDOMDocument2;
    [default, source] dispinterface XMLDOMDocumentEvents;
}

[
    helpstring("Free Threaded XML DOM Document 2.6"),
    progid("Msxml2.FreeThreadedDOMDocument.2.6"),
    vi_progid("Msxml2.FreeThreadedDOMDocument"),
    threading(both),
    uuid(f5078f1c-c551-11d3-89b9-0000f81fe221)
]
coclass FreeThreadedDOMDocument26
{
    [default] interface IXMLDOMDocument2;
    [default, source] dispinterface XMLDOMDocumentEvents;
}

[
    uuid(f6d90f16-9c73-11d3-b32e-00c04f990bb4)
]
coclass XMLHTTP
{
    [default] interface IXMLHTTPRequest;
}

[
    helpstring("XML HTTP 2.6"),
    progid("Msxml2.XMLHTTP.2.6"),
    vi_progid("Msxml2.XMLHTTP"),
    threading(apartment),
    uuid(f5078f1e-c551-11d3-89b9-0000f81fe221)
]
coclass XMLHTTP26
{
    [default] interface IXMLHTTPRequest;
}

[
    uuid(373984c9-b845-449b-91e7-45ac83036ade)
]
coclass XMLSchemaCache
{
    [default] interface IXMLDOMSchemaCollection;
}

[
    helpstring("XML Schema Cache 2.6"),
    progid("Msxml2.XMLSchemaCache.2.6"),
    vi_progid("Msxml2.XMLSchemaCache"),
    threading(both),
    uuid(f5078f1d-c551-11d3-89b9-0000f81fe221)
]
coclass XMLSchemaCache26
{
    [default] interface IXMLDOMSchemaCollection;
}

[
    uuid(2933BF94-7B36-11d2-B20E-00C04F983E60)
]
coclass XSLTemplate
{
    [default] interface IXSLTemplate;
}

[
    helpstring("XSL Template 2.6"),
    progid("Msxml2.XSLTemplate.2.6"),
    vi_progid("Msxml2.XSLTemplate"),
    threading(both),
    uuid(f5078f21-c551-11d3-89b9-0000f81fe221)
]
coclass XSLTemplate26
{
    [default] interface IXSLTemplate;
}

} /* Library MSXML */
