/*
 * 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 register

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;
}
