/*
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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;
};
