/*
 * Copyright (C) 2005 Mike McCormack
 * Copyright (C) 2005 Vijay Kiran Kamuju
 *
 * 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 <msxmldid.h>

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


[
local,
object,
odl,
dual,
oleautomation,
uuid(65725580-9b5d-11d0-9bfe-00c04fc99c8e)
]
interface IXMLElementCollection : IDispatch
{
    [propput, id(DISPID_XMLELEMENTCOLLECTION_LENGTH)]
    HRESULT length( [in] long v );

    [propget, id(DISPID_XMLELEMENTCOLLECTION_LENGTH)]
    HRESULT length( [retval, out] long *p );

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

    [id(DISPID_XMLELEMENTCOLLECTION_ITEM)]
    HRESULT item(
            [optional, in] VARIANT var1,
            [optional, in] VARIANT var2,
            [retval, out] IDispatch ** ppDisp );
};

[
local,
object,
uuid(3f7f31ac-e15f-11d0-9c25-00c04fc99c8e)
]
interface IXMLElement : IDispatch
{
    [propget, id(DISPID_XMLELEMENT_TAGNAME)]
    HRESULT tagName( [retval, out] BSTR *p);

    [propput, id(DISPID_XMLELEMENT_TAGNAME)]
    HRESULT tagName( [in] BSTR p );

    [propget, id(DISPID_XMLELEMENT_PARENT)]
    HRESULT parent( [retval, out] IXMLElement **parent );

    [id(DISPID_XMLELEMENT_SETATTRIBUTE)]
    HRESULT setAttribute(
            [in] BSTR strPropertyName,
            [in] VARIANT PropertyValue );

    [id(DISPID_XMLELEMENT_GETATTRIBUTE)]
    HRESULT getAttribute(
            [in] BSTR strPropertyName,
            [retval, out] VARIANT *PropertyValue );

    [id(DISPID_XMLELEMENT_REMOVEATTRIBUTE)]
    HRESULT removeAttribute(
            [in] BSTR strPropertyName );

    [propget, id(DISPID_XMLELEMENT_CHILDREN)]
    HRESULT children( [retval, out] IXMLElementCollection **p );

    [propget, id(DISPID_XMLELEMENT_TYPE)]
    HRESULT type( [retval, out] long *p );

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

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

    [id(DISPID_XMLELEMENT_ADDCHILD)]
    HRESULT addChild(
            [in] IXMLElement *pChildElem,
            [in] long lIndex,
            [in] long lreserved );

    [id(DISPID_XMLELEMENT_REMOVECHILD)]
    HRESULT removeChild(
            [in] IXMLElement *pChildElem );
};

[
local,
object,
uuid(f52e2b61-18a1-11d1-b105-00805f49916b)
]
interface IXMLDocument : IDispatch
{
    [propget, id(DISPID_XMLDOCUMENT_ROOT)]
    HRESULT root( [retval, out] IXMLElement **p );

    [propget, id(DISPID_XMLDOCUMENT_FILESIZE)]
    HRESULT fileSize( [retval, out] BSTR *p );

    [propget, id(DISPID_XMLDOCUMENT_FILEMODIFIEDDATE)]
    HRESULT fileModifiedDate( [retval, out] BSTR *p );

    [propget, id(DISPID_XMLDOCUMENT_FILEUPDATEDDATE)]
    HRESULT fileUpdatedDate( [retval, out] BSTR *p );

    [propget, id(DISPID_XMLDOCUMENT_URL)]
    HRESULT URL( [retval, out] BSTR *p );

    [propput, id(DISPID_XMLDOCUMENT_URL)]
    HRESULT URL( [in] BSTR p );

    [propget, id(DISPID_XMLDOCUMENT_MIMETYPE)]
    HRESULT mimeType( [retval, out] BSTR *p );

    [propget, id(DISPID_XMLDOCUMENT_READYSTATE)]
    HRESULT readyState( [retval, out] long *p );

    [propget, id(DISPID_XMLDOCUMENT_CHARSET)]
    HRESULT charset( [retval, out] BSTR *p );

    [propput, id(DISPID_XMLDOCUMENT_CHARSET)]
    HRESULT charset( [in] BSTR p );

    [propget, id(DISPID_XMLDOCUMENT_VERSION)]
    HRESULT version( [retval, out] BSTR *p );

    [propget, id(DISPID_XMLDOCUMENT_DOCTYPE)]
    HRESULT doctype( [retval, out] BSTR *p );

    [propget, id(DISPID_XMLDOCUMENT_DTDURL)]
    HRESULT dtdURl( [retval, out] BSTR *p );

    [id(DISPID_XMLDOCUMENT_CREATEELEMENT)]
    HRESULT createElement(
            [in] VARIANT vType,
            [optional, in] VARIANT var1,
            [retval, out] IXMLElement **ppElem );
};

[
local,
object,
uuid(2B8DE2FF-8D2D-11d1-B2FC-00C04FD915A9)
]
interface IXMLElement2 : IDispatch
{
    [propget, id(DISPID_XMLELEMENT_TAGNAME)]
    HRESULT tagName([retval, out] BSTR *p);

    [propput, id(DISPID_XMLELEMENT_TAGNAME)]
    HRESULT tagName([in] BSTR p);

    [propget, id(DISPID_XMLELEMENT_PARENT)]
    HRESULT parent([retval, out]IXMLElement2 **ppParent);

    [id(DISPID_XMLELEMENT_SETATTRIBUTE)]
    HRESULT setAttribute(
        [in] BSTR strPropertyName,
        [in] VARIANT PropertyValue);

    [id(DISPID_XMLELEMENT_GETATTRIBUTE)]
    HRESULT getAttribute(
        [in] BSTR strPropertyName,
        [retval, out] VARIANT *PropertyValue);

    [id(DISPID_XMLELEMENT_REMOVEATTRIBUTE)]
    HRESULT removeAttribute([in] BSTR strPropertyName);

    [propget, id(DISPID_XMLELEMENT_CHILDREN)]
    HRESULT children([retval, out] IXMLElementCollection **pp);

    [propget, id(DISPID_XMLELEMENT_TYPE)]
    HRESULT type([retval, out] long *plType);

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

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

    [id(DISPID_XMLELEMENT_ADDCHILD)]
    HRESULT addChild(
        [in] IXMLElement2 *pChildElem,
        [in] long lIndex,
        [in] long lReserved);

    [id(DISPID_XMLELEMENT_REMOVECHILD)]
    HRESULT removeChild([in]IXMLElement2 *pChildElem);

    [propget, id(DISPID_XMLELEMENT_ATTRIBUTES)]
    HRESULT attributes([retval, out] IXMLElementCollection **pp); 
};

[
local,
object,
uuid(2B8DE2FE-8D2D-11d1-B2FC-00C04FD915A9)
]
interface IXMLDocument2 : IDispatch
{
    [propget, id(DISPID_XMLDOCUMENT_ROOT)]
    HRESULT root([retval, out] IXMLElement2 **p);

    [propget, id(DISPID_XMLDOCUMENT_FILESIZE)]
    HRESULT fileSize([retval, out] BSTR *p);

    [propget, id(DISPID_XMLDOCUMENT_FILEMODIFIEDDATE)]
    HRESULT fileModifiedDate([retval, out] BSTR *p);

    [propget, id(DISPID_XMLDOCUMENT_FILEUPDATEDDATE)]
    HRESULT fileUpdatedDate([retval, out] BSTR *p);

    [propget, id(DISPID_XMLDOCUMENT_URL)]
    HRESULT URL([retval, out] BSTR *p);

    [propput, id(DISPID_XMLDOCUMENT_URL)]
    HRESULT URL([in] BSTR p);

    [propget, id(DISPID_XMLDOCUMENT_MIMETYPE)]
    HRESULT mimeType([retval, out] BSTR *p);
   
    [propget, id(DISPID_XMLDOCUMENT_READYSTATE)]
    HRESULT readyState([retval, out]long *pl);

    [propget, id(DISPID_XMLDOCUMENT_CHARSET)]
    HRESULT charset([retval, out]BSTR *p);

    [propput, id(DISPID_XMLDOCUMENT_CHARSET)]
    HRESULT charset([in]BSTR p);

    [propget, id(DISPID_XMLDOCUMENT_VERSION)]
    HRESULT version([retval, out]BSTR *p);

    [propget, id(DISPID_XMLDOCUMENT_DOCTYPE)]
    HRESULT doctype([retval, out]BSTR *p);

    [propget, restricted, id(DISPID_XMLDOCUMENT_DTDURL)]
    HRESULT dtdURL([retval, out]BSTR *p);

    [id(DISPID_XMLDOCUMENT_CREATEELEMENT)]
    HRESULT createElement(
        [in] VARIANT vType, 
        [optional, in] VARIANT var, 
        [retval, out] IXMLElement2 **ppElem);

    [propget, id(DISPID_XMLDOCUMENT_ASYNC)]
    HRESULT async([retval, out] VARIANT_BOOL *pf);

    [propput, id(DISPID_XMLDOCUMENT_ASYNC)]
    HRESULT async([in] VARIANT_BOOL f);
};

typedef enum tagXMLEMEM_TYPE {
	XMLELEMTYPE_ELEMENT	= 0,
	XMLELEMTYPE_TEXT 	= 1,
	XMLELEMTYPE_COMMENT	= 2,
	XMLELEMTYPE_DOCUMENT	= 3,
	XMLELEMTYPE_DTD		= 4,
	XMLELEMTYPE_PI		= 5,
	XMLELEMTYPE_OTHER	= 6
} XMLELEM_TYPE;

typedef struct _xml_error {
	UINT _nLine;
	BSTR _pchBuf;
	BSTR _cchBuf;
	UINT _ich;
	BSTR _pszFound;
	BSTR _pszExpected;
	DWORD _reserved1;
	DWORD _reserved2;
} XML_ERROR;

[
local,
object,
uuid(d4d4a0fc-3b73-11d1-b2b4-00c04fb92596)
]
interface IXMLAttribute : IDispatch
{
    [propget, id(DISPID_XMLATTRIBUTE_NAME)]
    HRESULT name( [retval, out] BSTR *p );

    [propget, id(DISPID_XMLATTRIBUTE_VALUE)]
    HRESULT value( [retval, out] BSTR *p );
};

[
local,
object,
uuid(948c5ad3-c58d-11d0-9c0b-00c04fc99c8e)
]
interface IXMLError : IUnknown
{
    HRESULT GetErrorInfo([out]XML_ERROR *pErrorReturn);
};

[
    object,
    local,
    uuid(D9F1E15A-CCDB-11d0-9C0C-00C04FC99C8E)
]
interface IXMLElementNotificationSink : IDispatch
{
    [id(DISPID_XMLNOTIFSINK_CHILDADDED)] 
    HRESULT ChildAdded([in]IDispatch *pChildElem); 
};

[
uuid(cfc399af-d876-11d0-9c10-00c04fc99c8e)
]
coclass XMLDocument
{
    [default] interface IXMLDocument;
};
