/*
 * Copyright (C) 2011 Alistair Leslie-Hughes
 *
 * 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 header

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

interface IXMLNodeSource;
interface IXMLParser;
interface IXMLNodeFactory;
interface IMoniker;

typedef enum
{
    XML_ELEMENT = 1,
    XML_ATTRIBUTE,
    XML_PI,
    XML_XMLDECL,
    XML_DOCTYPE,
    XML_DTDATTRIBUTE,
    XML_ENTITYDECL,
    XML_ELEMENTDECL,
    XML_ATTLISTDECL,
    XML_NOTATION,
    XML_GROUP,
    XML_INCLUDESECT,
    XML_PCDATA,
    XML_CDATA,
    XML_IGNORESECT,
    XML_COMMENT,
    XML_ENTITYREF,
    XML_WHITESPACE,
    XML_NAME,
    XML_NMTOKEN,
    XML_STRING,
    XML_PEREF,
    XML_MODEL,
    XML_ATTDEF,
    XML_ATTTYPE,
    XML_ATTPRESENCE,
    XML_DTDSUBSET,
    XML_LASTNODETYPE
} XML_NODE_TYPE;

typedef enum
{
    XML_VERSION = XML_LASTNODETYPE,
    XML_ENCODING,
    XML_STANDALONE,
    XML_NS,
    XML_XMLSPACE,
    XML_XMLLANG,
    XML_SYSTEM,
    XML_PUBLIC,
    XML_NDATA,
    XML_AT_CDATA,
    XML_AT_ID,
    XML_AT_IDREF,
    XML_AT_IDREFS,
    XML_AT_ENTITY,
    XML_AT_ENTITIES,
    XML_AT_NMTOKEN,
    XML_AT_NMTOKENS,
    XML_AT_NOTATION,
    XML_AT_REQUIRED,
    XML_AT_IMPLIED,
    XML_AT_FIXED,
    XML_PENTITYDECL,
    XML_EMPTY,
    XML_ANY,
    XML_MIXED,
    XML_SEQUENCE,
    XML_CHOICE,
    XML_STAR,
    XML_PLUS,
    XML_QUESTIONMARK,
    XML_LASTSUBNODETYPE
}
XML_NODE_SUBTYPE;

typedef enum
{
    XML_E_PARSEERRORBASE = 0xC00CE500L,

    XML_E_ENDOFINPUT            = XML_E_PARSEERRORBASE,
    XML_E_MISSINGEQUALS         = 0xC00CE501,
    XML_E_MISSINGQUOTE          = 0xC00CE502,
    XML_E_COMMENTSYNTAX         = 0xC00CE503,
    XML_E_BADSTARTNAMECHAR      = 0xC00CE504,
    XML_E_BADNAMECHAR           = 0xC00CE505,
    XML_E_BADCHARINSTRING       = 0xC00CE506,
    XML_E_XMLDECLSYNTAX         = 0xC00CE507,
    XML_E_BADCHARDATA           = 0xC00CE508,
    XML_E_MISSINGWHITESPACE     = 0xC00CE509,
    XML_E_EXPECTINGTAGEND       = 0xC00CE50A,
    XML_E_BADCHARINDTD          = 0xC00CE50B,
    XML_E_BADCHARINDECL         = 0xC00CE50C,
    XML_E_MISSINGSEMICOLON      = 0xC00CE50D,
    XML_E_BADCHARINENTREF       = 0xC00CE50E,
    XML_E_UNBALANCEDPAREN       = 0xC00CE50F,
    XML_E_EXPECTINGOPENBRACKET  = 0xC00CE510,
    XML_E_BADENDCONDSECT        = 0xC00CE511,
    XML_E_INTERNALERROR         = 0xC00CE512,
    XML_E_UNEXPECTED_WHITESPACE = 0xC00CE513,
    XML_E_INCOMPLETE_ENCODING   = 0xC00CE514,
    XML_E_BADCHARINMIXEDMODEL   = 0xC00CE515,
    XML_E_MISSING_STAR          = 0xC00CE516,
    XML_E_BADCHARINMODEL        = 0xC00CE517,
    XML_E_MISSING_PAREN         = 0xC00CE518,
    XML_E_BADCHARINENUMERATION  = 0xC00CE519,
    XML_E_PIDECLSYNTAX          = 0xC00CE51A,
    XML_E_EXPECTINGCLOSEQUOTE   = 0xC00CE51B,
    XML_E_MULTIPLE_COLONS       = 0xC00CE51C,
    XML_E_INVALID_DECIMAL       = 0xC00CE51D,
    XML_E_INVALID_HEXIDECIMAL   = 0xC00CE51E,
    XML_E_INVALID_UNICODE       = 0xC00CE51F,
    XML_E_WHITESPACEORQUESTIONMARK  = 0xC00CE520,
    XML_E_ENDOFPE               = 0xC00CE521,

    XML_E_TOKEN_ERROR = XML_E_PARSEERRORBASE + 0x50,
    XML_E_SUSPENDED                     =  0xC00CE550,
    XML_E_STOPPED                       = 0xC00CE551,
    XML_E_UNEXPECTEDENDTAG              = 0xC00CE552,
    XML_E_UNCLOSEDTAG                   = 0xC00CE553,
    XML_E_DUPLICATEATTRIBUTE            = 0xC00CE554,
    XML_E_MULTIPLEROOTS                 = 0xC00CE555,
    XML_E_INVALIDATROOTLEVEL            = 0xC00CE556,
    XML_E_BADXMLDECL                    = 0xC00CE557,
    XML_E_MISSINGROOT                   = 0xC00CE558,
    XML_E_UNEXPECTEDEOF                 = 0xC00CE559,
    XML_E_BADPEREFINSUBSET              = 0xC00CE55A,
    XML_E_PE_NESTING                    = 0xC00CE55B,
    XML_E_INVALID_CDATACLOSINGTAG       = 0xC00CE55C,
    XML_E_UNCLOSEDPI                    = 0xC00CE55D,
    XML_E_UNCLOSEDSTARTTAG              = 0xC00CE55E,
    XML_E_UNCLOSEDENDTAG                = 0xC00CE55F,
    XML_E_UNCLOSEDSTRING                = 0xC00CE560,
    XML_E_UNCLOSEDCOMMENT               = 0xC00CE561,
    XML_E_UNCLOSEDDECL                  = 0xC00CE562,
    XML_E_UNCLOSEDMARKUPDECL            = 0xC00CE563,
    XML_E_UNCLOSEDCDATA                 = 0xC00CE564,
    XML_E_BADDECLNAME                   = 0xC00CE565,
    XML_E_BADEXTERNALID                 = 0xC00CE566,
    XML_E_BADELEMENTINDTD               = 0xC00CE567,
    XML_E_RESERVEDNAMESPACE             = 0xC00CE568,
    XML_E_EXPECTING_VERSION             = 0xC00CE569,
    XML_E_EXPECTING_ENCODING            = 0xC00CE56A,
    XML_E_EXPECTING_NAME                = 0xC00CE56B,
    XML_E_UNEXPECTED_ATTRIBUTE          = 0xC00CE56C,
    XML_E_ENDTAGMISMATCH                = 0xC00CE56D,
    XML_E_INVALIDENCODING               = 0xC00CE56E,
    XML_E_INVALIDSWITCH                 = 0xC00CE56F,
    XML_E_EXPECTING_NDATA               = 0xC00CE570,
    XML_E_INVALID_MODEL                 = 0xC00CE571,
    XML_E_INVALID_TYPE                  = 0xC00CE572,
    XML_E_INVALIDXMLSPACE               = 0xC00CE573,
    XML_E_MULTI_ATTR_VALUE              = 0xC00CE574,
    XML_E_INVALID_PRESENCE              = 0xC00CE575,
    XML_E_BADXMLCASE                    = 0xC00CE576,
    XML_E_CONDSECTINSUBSET              = 0xC00CE577,
    XML_E_CDATAINVALID                  = 0xC00CE578,
    XML_E_INVALID_STANDALONE            = 0xC00CE579,
    XML_E_UNEXPECTED_STANDALONE         = 0xC00CE57A,
    XML_E_DOCTYPE_IN_DTD                = 0xC00CE57B,
    XML_E_MISSING_ENTITY                = 0xC00CE57C,
    XML_E_ENTITYREF_INNAME              = 0xC00CE57D,
    XML_E_DOCTYPE_OUTSIDE_PROLOG        = 0xC00CE57E,
    XML_E_INVALID_VERSION               = 0xC00CE57F,
    XML_E_DTDELEMENT_OUTSIDE_DTD        = 0xC00CE580,
    XML_E_DUPLICATEDOCTYPE              = 0xC00CE581,
    XML_E_RESOURCE                      = 0xC00CE582,
    XML_E_MISSINGNAME                   = 0xC00CE583,
    XML_E_LASTERROR                     = 0xC00CE584
} XML_ERROR_CODE;

typedef enum
{
    XMLPARSER_IDLE,
    XMLPARSER_WAITING,
    XMLPARSER_BUSY,
    XMLPARSER_ERROR,
    XMLPARSER_STOPPED,
    XMLPARSER_SUSPENDED
} XML_PARSER_STATE;

typedef enum
{
    XMLFLAG_FLOATINGAMP       = 0x00000001,
    XMLFLAG_SHORTENDTAGS      = 0x00000002,
    XMLFLAG_CASEINSENSITIVE   = 0x00000004,
    XMLFLAG_NONAMESPACES      = 0x00000008,
    XMLFLAG_NOWHITESPACE      = 0x00000010,
    XMLFLAG_IE4QUIRKS         = 0x00000020,
    XMLFLAG_NODTDNODES        = 0x00000040,
    XMLFLAG_IE4COMPATIBILITY  = 0x000000FF,
    XMLFLAG_IE5COMPATIBILITY  = 0x00000100,
    XMLFLAG_SAX               = 0x00000200,
    XMLFLAG_NORMALIZELB       = 0x00000400,
    XMLFLAG_IGNOREENCODING    = 0x00000800,
    XMLFLAG_USEWINHTTP        = 0x00001000,
    XMLFLAG_RUNBUFFERONLY     = 0x00002000,
    XMLFLAG_PROHIBIT_DTD      = 0x00008000
} XML_PARSER_FLAGS;


typedef enum
{
    XMLNF_STARTDOCUMENT,
    XMLNF_STARTDTD,
    XMLNF_ENDDTD,
    XMLNF_STARTDTDSUBSET,
    XMLNF_ENDDTDSUBSET,
    XMLNF_ENDPROLOG,
    XMLNF_STARTENTITY,
    XMLNF_ENDENTITY,
    XMLNF_ENDDOCUMENT,
    XMLNF_DATAAVAILABLE,
    XMLNF_LASTEVENT = XMLNF_DATAAVAILABLE
} XML_NODEFACTORY_EVENT;

typedef struct _XML_NODE_INFO
{
    DWORD           dwSize;
    DWORD           dwType;
    DWORD           dwSubType;
    BOOL            fTerminal;
    const WCHAR*    pwcText;
    ULONG           ulLen;
    ULONG           ulNsPrefixLen;
    PVOID           pNode;
    PVOID           pReserved;
} XML_NODE_INFO;

[
    uuid(d242361c-51a0-11d2-9caf-0060b0ec3d39),
    helpstring("Microsoft XML Parser 1.0"),
    lcid(0x0000),
    version(1.0)
]
library XMLPSR
{
/* importlib("stdole32.tlb"); */
importlib("stdole2.tlb");

[
    local,
    object,
    pointer_default(unique),
    helpstring("IXMLNodeFactory Interface"),
    uuid(d242361f-51a0-11d2-9caf-0060b0ec3d39)
]
interface IXMLNodeFactory : IUnknown
{
    HRESULT NotifyEvent([in] IXMLNodeSource* pSource,[in] XML_NODEFACTORY_EVENT iEvt);
    HRESULT BeginChildren([in] IXMLNodeSource* pSource, [in] XML_NODE_INFO* pNodeInfo);
    HRESULT EndChildren([in] IXMLNodeSource* pSource, [in] BOOL fEmpty, [in] XML_NODE_INFO* pNodeInfo);
    HRESULT Error([in] IXMLNodeSource* pSource,[in] HRESULT hrErrorCode,
                [in] USHORT cNumRecs, [in] XML_NODE_INFO** ppNodeInfo);
    HRESULT CreateNode([in] IXMLNodeSource* pSource, [in] PVOID pNodeParent, [in] USHORT cNumRecs,
                [in] XML_NODE_INFO** ppNodeInfo);
};

[
    local,
    object,
    pointer_default(unique),
    uuid(d242361d-51a0-11d2-9caf-0060b0ec3d39)
]
interface IXMLNodeSource : IUnknown
{
    HRESULT SetFactory([in] IXMLNodeFactory* pNodeFactory);
    HRESULT GetFactory([out] IXMLNodeFactory** ppNodeFactory);
    HRESULT Abort([in] BSTR bstrErrorInfo);
    ULONG GetLineNumber();
    ULONG GetLinePosition();
    ULONG GetAbsolutePosition();
    HRESULT GetLineBuffer([out] const WCHAR** ppBuf,[out] ULONG* Len, [out] ULONG* StartPos);
    HRESULT GetLastError();
    HRESULT GetErrorInfo([out] BSTR* pErrorInfo);
    ULONG GetFlags();
    HRESULT GetURL([out] const WCHAR** ppBuf);
};

[
    local,
    object,
    pointer_default(unique),
    helpstring("IXMLParser Interface"),
    uuid(d242361e-51a0-11d2-9caf-0060b0ec3d39)
]
interface IXMLParser : IXMLNodeSource
{
    HRESULT SetURL([in] const WCHAR* pszBaseUrl,[in] const WCHAR* pszRelativeUrl,[in] BOOL fAsync);
    HRESULT Load([in] BOOL fFullyAvailable, [in] IMoniker *pimkName, [in] LPBC pibc, [in] DWORD grfMode);
    HRESULT SetInput([in] IUnknown *pStm);
    HRESULT PushData([in] const char* pData, [in] ULONG ulChars, [in] BOOL fLastBuffer);
    HRESULT LoadDTD([in] const WCHAR* pszBaseUrl, [in] const WCHAR* pszRelativeUrl);
    HRESULT LoadEntity([in] const WCHAR* pszBaseUrl, [in] const WCHAR* pszRelativeUrl, [in] BOOL fpe);
    HRESULT ParseEntity([in] const WCHAR* pwcText, [in] ULONG ulLen, [in] BOOL fpe);
    HRESULT ExpandEntity([in] const WCHAR* pwcText, [in] ULONG ulLen);
    HRESULT SetRoot([in] PVOID pRoot);
    HRESULT GetRoot([in] PVOID* ppRoot);
    HRESULT Run([in] long lChars);
    HRESULT GetParserState();
    HRESULT Suspend();
    HRESULT Reset();
    HRESULT SetFlags([in] ULONG iFlags);
    HRESULT SetSecureBaseURL([in] const WCHAR* pszBaseUrl);
    HRESULT GetSecureBaseURL([out] const WCHAR** ppwcBuf);
};

}

[
    helpstring("XML Parser"),
    uuid(f5078f19-c551-11d3-89b9-0000f81fe221),
    threading(both),
    progid("Msxml2.XMLParser"),
    vi_progid("Msxml2.XMLParser"),
    version(3.0)
]
coclass XMLParser
{
    [default] interface IXMLParser;
};

[
    helpstring("XML Parser 2.6"),
    uuid(f5078f20-c551-11d3-89b9-0000f81fe221),
    threading(both),
    progid("Msxml2.XMLParser.2.6"),
    vi_progid("Msxml2.XMLParser"),
    version(2.6)
]
coclass XMLParser26
{
    [default] interface IXMLParser;
};

[
    helpstring("XML Parser 3.0"),
    uuid(f5078f31-c551-11d3-89b9-0000f81fe221),
    threading(both),
    progid("Msxml2.XMLParser.3.0"),
    vi_progid("Msxml2.XMLParser"),
    version(3.0)
]
coclass XMLParser30
{
    [default] interface IXMLParser;
};

[
    helpstring("XML Document"),
    threading(apartment),
    uuid(48123bc4-99d9-11d1-a6b3-00c04fd91555),
    progid("xmlfile"),
    version(1.0)
]
coclass XMLView
{
    interface IPersistMoniker;
    interface IPersistHistory;
    interface IOleCommandTarget;
    interface IOleObject;
}
