// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef FDE_XML_H_
#define FDE_XML_H_

class IFDE_XMLNode;
class IFDE_XMLInstruction;
class IFDE_XMLDeclaration;
class IFDE_XMLDeclComment;
class IFDE_XMLDeclCharData;
class IFDE_XMLDeclDocType;
class IFDE_XMLDeclElement;
class IFDE_XMLDeclAttriList;
class IFDE_XMLDeclNotition;
class IFDE_XMLDeclEntity;
class IFDE_XMLElement;
class IFDE_XMLText;
class IFDE_XMLDoc;
class IFDE_XMLParser;
class IFDE_XMLSyntaxParser;
#ifdef __cplusplus
extern "C" {
#endif
enum FDE_XMLNODETYPE {
  FDE_XMLNODE_Unknown = 0,
  FDE_XMLNODE_Instruction,
  FDE_XMLNODE_Element,
  FDE_XMLNODE_Text,
  FDE_XMLNODE_CharData,
};
typedef struct _FDE_XMLNODE {
  int32_t iNodeNum;
  FDE_XMLNODETYPE eNodeType;
} FDE_XMLNODE, *FDE_LPXMLNODE;
typedef FDE_XMLNODE const* FDE_LPCXMLNODE;
typedef CFX_StackTemplate<FDE_XMLNODE> CFDE_XMLNodeStack;
FX_BOOL FDE_IsXMLValidChar(FX_WCHAR ch);
FX_BOOL FDE_IsXMLWhiteSpace(FX_WCHAR ch);
FX_BOOL FDE_IsXMLNameChar(FX_WCHAR ch, FX_BOOL bFirstChar);
#ifdef __cplusplus
}
#endif

class IFDE_XMLNode {
 public:
  virtual ~IFDE_XMLNode() {}
  virtual void Release() = 0;
  virtual FDE_XMLNODETYPE GetType() const = 0;
  virtual int32_t CountChildNodes() const = 0;
  virtual IFDE_XMLNode* GetChildNode(int32_t index) const = 0;
  virtual int32_t GetChildNodeIndex(IFDE_XMLNode* pNode) const = 0;
  virtual IFDE_XMLNode* GetPath(const FX_WCHAR* pPath,
                                int32_t iLength = -1,
                                FX_BOOL bQualifiedName = TRUE) const = 0;
  virtual int32_t InsertChildNode(IFDE_XMLNode* pNode, int32_t index = -1) = 0;
  virtual void RemoveChildNode(IFDE_XMLNode* pNode) = 0;
  virtual void DeleteChildren() = 0;
  enum NodeItem {
    Root = 0,
    Parent,
    FirstSibling,
    PriorSibling,
    NextSibling,
    LastSibling,
    FirstNeighbor,
    PriorNeighbor,
    NextNeighbor,
    LastNeighbor,
    FirstChild,
    LastChild
  };
  virtual IFDE_XMLNode* GetNodeItem(NodeItem eItem) const = 0;
  virtual int32_t GetNodeLevel() const = 0;
  virtual FX_BOOL InsertNodeItem(IFDE_XMLNode::NodeItem eItem,
                                 IFDE_XMLNode* pNode) = 0;
  virtual IFDE_XMLNode* RemoveNodeItem(IFDE_XMLNode::NodeItem eItem) = 0;
  virtual IFDE_XMLNode* Clone(FX_BOOL bRecursive) = 0;
  virtual void SaveXMLNode(IFX_Stream* pXMLStream) = 0;
};
class IFDE_XMLInstruction : public IFDE_XMLNode {
 public:
  static IFDE_XMLInstruction* Create(const CFX_WideString& wsTarget);
  virtual void GetTargetName(CFX_WideString& wsTarget) const = 0;
  virtual int32_t CountAttributes() const = 0;
  virtual FX_BOOL GetAttribute(int32_t index,
                               CFX_WideString& wsAttriName,
                               CFX_WideString& wsAttriValue) const = 0;
  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const = 0;
  virtual void GetString(const FX_WCHAR* pwsAttriName,
                         CFX_WideString& wsAttriValue,
                         const FX_WCHAR* pwsDefValue = NULL) const = 0;
  virtual void SetString(const CFX_WideString& wsAttriName,
                         const CFX_WideString& wsAttriValue) = 0;
  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
                             int32_t iDefValue = 0) const = 0;
  virtual void SetInteger(const FX_WCHAR* pwsAttriName,
                          int32_t iAttriValue) = 0;
  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
                            FX_FLOAT fDefValue = 0) const = 0;
  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue) = 0;
  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName) = 0;
  virtual int32_t CountData() const = 0;
  virtual FX_BOOL GetData(int32_t index, CFX_WideString& wsData) const = 0;
  virtual void AppendData(const CFX_WideString& wsData) = 0;
  virtual void RemoveData(int32_t index) = 0;
};
class IFDE_XMLElement : public IFDE_XMLNode {
 public:
  static IFDE_XMLElement* Create(const CFX_WideString& wsTag);
  virtual void GetTagName(CFX_WideString& wsTag) const = 0;
  virtual void GetLocalTagName(CFX_WideString& wsTag) const = 0;
  virtual void GetNamespacePrefix(CFX_WideString& wsPrefix) const = 0;
  virtual void GetNamespaceURI(CFX_WideString& wsNamespace) const = 0;
  virtual int32_t CountAttributes() const = 0;
  virtual FX_BOOL GetAttribute(int32_t index,
                               CFX_WideString& wsAttriName,
                               CFX_WideString& wsAttriValue) const = 0;
  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const = 0;
  virtual void GetString(const FX_WCHAR* pwsAttriName,
                         CFX_WideString& wsAttriValue,
                         const FX_WCHAR* pwsDefValue = NULL) const = 0;
  virtual void SetString(const CFX_WideString& wsAttriName,
                         const CFX_WideString& wsAttriValue) = 0;
  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
                             int32_t iDefValue = 0) const = 0;
  virtual void SetInteger(const FX_WCHAR* pwsAttriName,
                          int32_t iAttriValue) = 0;
  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
                            FX_FLOAT fDefValue = 0) const = 0;
  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue) = 0;
  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName) = 0;
  virtual void GetTextData(CFX_WideString& wsText) const = 0;
  virtual void SetTextData(const CFX_WideString& wsText) = 0;
};
class IFDE_XMLText : public IFDE_XMLNode {
 public:
  static IFDE_XMLText* Create(const CFX_WideString& wsText);
  virtual void GetText(CFX_WideString& wsText) const = 0;
  virtual void SetText(const CFX_WideString& wsText) = 0;
};
class IFDE_XMLDeclaration : public IFDE_XMLNode {
 public:
};
class IFDE_XMLCharData : public IFDE_XMLDeclaration {
 public:
  static IFDE_XMLCharData* Create(const CFX_WideString& wsCData);
  virtual ~IFDE_XMLCharData() {}

  virtual void GetCharData(CFX_WideString& wsCData) const = 0;
  virtual void SetCharData(const CFX_WideString& wsCData) = 0;
};
typedef struct _FDE_XMLREADERHANDLER {
  void* pData;

  void (*OnTagEnter)(_FDE_XMLREADERHANDLER* pThis,
                     FDE_XMLNODETYPE eType,
                     const CFX_WideString& wsTagName);
  void (*OnTagBreak)(_FDE_XMLREADERHANDLER* pThis,
                     const CFX_WideString& wsTagName);
  void (*OnTagClose)(_FDE_XMLREADERHANDLER* pThis,
                     const CFX_WideString& wsTagName);
  void (*OnAttribute)(_FDE_XMLREADERHANDLER* pThis,
                      const CFX_WideString& wsName,
                      const CFX_WideString& wsValue);
  void (*OnData)(_FDE_XMLREADERHANDLER* pThis,
                 FDE_XMLNODETYPE eType,
                 const CFX_WideString& wsValue);
} FDE_XMLREADERHANDLER, *FDE_LPXMLREADERHANDLER;
class IFDE_XMLDoc {
 public:
  static IFDE_XMLDoc* Create();
  virtual ~IFDE_XMLDoc() {}
  virtual void Release() = 0;
  virtual FX_BOOL LoadXML(IFX_Stream* pXMLStream,
                          int32_t iXMLPlaneSize = 8192,
                          int32_t iTextDataSize = 256,
                          FDE_LPXMLREADERHANDLER pHandler = NULL) = 0;
  virtual FX_BOOL LoadXML(IFDE_XMLParser* pXMLParser) = 0;
  virtual int32_t DoLoad(IFX_Pause* pPause = NULL) = 0;
  virtual void CloseXML() = 0;
  virtual IFDE_XMLNode* GetRoot() const = 0;
  virtual void SaveXML(IFX_Stream* pXMLStream = NULL,
                       FX_BOOL bSaveBOM = TRUE) = 0;
  virtual void SaveXMLNode(IFX_Stream* pXMLStream, IFDE_XMLNode* pNode) = 0;
};
class IFDE_XMLParser {
 public:
  virtual ~IFDE_XMLParser() {}
  virtual void Release() = 0;
  virtual int32_t DoParser(IFX_Pause* pPause) = 0;
};
#define FDE_XMLSYNTAXSTATUS_None 0x00
#define FDE_XMLSYNTAXSTATUS_InstructionOpen 0x01
#define FDE_XMLSYNTAXSTATUS_InstructionClose 0x02
#define FDE_XMLSYNTAXSTATUS_ElementOpen 0x03
#define FDE_XMLSYNTAXSTATUS_ElementBreak 0x04
#define FDE_XMLSYNTAXSTATUS_ElementClose 0x05
#define FDE_XMLSYNTAXSTATUS_TargetName 0x06
#define FDE_XMLSYNTAXSTATUS_TagName 0x07
#define FDE_XMLSYNTAXSTATUS_AttriName 0x08
#define FDE_XMLSYNTAXSTATUS_AttriValue 0x09
#define FDE_XMLSYNTAXSTATUS_Text 0x0A
#define FDE_XMLSYNTAXSTATUS_CData 0x0B
#define FDE_XMLSYNTAXSTATUS_TargetData 0x0C
#define FDE_XMLSYNTAXSTATUS_Error 0xFE
#define FDE_XMLSYNTAXSTATUS_EOS 0xFF
class IFDE_XMLSyntaxParser {
 public:
  static IFDE_XMLSyntaxParser* Create();
  virtual ~IFDE_XMLSyntaxParser() {}
  virtual void Release() = 0;
  virtual void Init(IFX_Stream* pStream,
                    int32_t iXMLPlaneSize,
                    int32_t iTextDataSize = 256) = 0;
  virtual FX_DWORD DoSyntaxParse() = 0;
  virtual int32_t GetStatus() const = 0;
  virtual int32_t GetCurrentPos() const = 0;
  virtual FX_FILESIZE GetCurrentBinaryPos() const = 0;
  virtual int32_t GetCurrentNodeNumber() const = 0;
  virtual int32_t GetLastNodeNumber() const = 0;
  virtual void GetTargetName(CFX_WideString& wsTarget) const = 0;
  virtual void GetTagName(CFX_WideString& wsTag) const = 0;
  virtual void GetAttributeName(CFX_WideString& wsAttriName) const = 0;
  virtual void GetAttributeValue(CFX_WideString& wsAttriValue) const = 0;
  virtual void GetTextData(CFX_WideString& wsText) const = 0;
  virtual void GetTargetData(CFX_WideString& wsData) const = 0;
};

#endif  // FDE_XML_H_
