// 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 CORE_FXCRT_XML_CFX_SAXREADER_H_
#define CORE_FXCRT_XML_CFX_SAXREADER_H_

#include <memory>
#include <stack>
#include <vector>

#include "core/fxcrt/fx_basic.h"

class CFX_SAXCommentContext;
class CFX_SAXContext;
enum class CFX_SaxMode;

class CFX_SAXItem {
 public:
  enum class Type {
    Unknown = 0,
    Instruction,
    Declaration,
    Comment,
    Tag,
    Text,
    CharData,
  };

  explicit CFX_SAXItem(uint32_t id)
      : m_pNode(nullptr), m_eNode(Type::Unknown), m_dwID(id), m_bSkip(false) {}

  CFX_SAXContext* m_pNode;
  Type m_eNode;
  const uint32_t m_dwID;
  bool m_bSkip;
};

class CFX_SAXFile {
 public:
  CFX_SAXFile();
  ~CFX_SAXFile();

  bool StartFile(const CFX_RetainPtr<IFX_SeekableReadStream>& pFile,
                 uint32_t dwStart,
                 uint32_t dwLen);
  bool ReadNextBlock();
  void Reset();

  CFX_RetainPtr<IFX_SeekableReadStream> m_pFile;
  uint32_t m_dwStart;
  uint32_t m_dwEnd;
  uint32_t m_dwCur;
  uint8_t* m_pBuf;
  uint32_t m_dwBufSize;
  uint32_t m_dwBufIndex;
};

enum CFX_SaxParseMode {
  CFX_SaxParseMode_NotConvert_amp = 1 << 0,
  CFX_SaxParseMode_NotConvert_lt = 1 << 1,
  CFX_SaxParseMode_NotConvert_gt = 1 << 2,
  CFX_SaxParseMode_NotConvert_apos = 1 << 3,
  CFX_SaxParseMode_NotConvert_quot = 1 << 4,
  CFX_SaxParseMode_NotConvert_sharp = 1 << 5,
  CFX_SaxParseMode_NotSkipSpace = 1 << 6
};

class CFX_SAXReader {
 public:
  class HandlerIface {
   public:
    virtual ~HandlerIface() {}
    virtual CFX_SAXContext* OnTagEnter(const CFX_ByteStringC& bsTagName,
                                       CFX_SAXItem::Type eType,
                                       uint32_t dwStartPos) = 0;
    virtual void OnTagAttribute(CFX_SAXContext* pTag,
                                const CFX_ByteStringC& bsAttri,
                                const CFX_ByteStringC& bsValue) = 0;
    virtual void OnTagBreak(CFX_SAXContext* pTag) = 0;
    virtual void OnTagData(CFX_SAXContext* pTag,
                           CFX_SAXItem::Type eType,
                           const CFX_ByteStringC& bsData,
                           uint32_t dwStartPos) = 0;
    virtual void OnTagClose(CFX_SAXContext* pTag, uint32_t dwEndPos) = 0;
    virtual void OnTagEnd(CFX_SAXContext* pTag,
                          const CFX_ByteStringC& bsTagName,
                          uint32_t dwEndPos) = 0;
    virtual void OnTargetData(CFX_SAXContext* pTag,
                              CFX_SAXItem::Type eType,
                              const CFX_ByteStringC& bsData,
                              uint32_t dwStartPos) = 0;
  };

  CFX_SAXReader();
  ~CFX_SAXReader();

  int32_t StartParse(const CFX_RetainPtr<IFX_SeekableReadStream>& pFile,
                     uint32_t dwStart = 0,
                     uint32_t dwLen = -1,
                     uint32_t dwParseMode = 0);
  int32_t ContinueParse(IFX_Pause* pPause = nullptr);
  void SetHandler(HandlerIface* pHandler) { m_pHandler = pHandler; }

 private:
  void ParseInternal();
  void SkipCurrentNode();
  void AppendData(uint8_t ch);
  void AppendName(uint8_t ch);
  void ParseText();
  void ParseNodeStart();
  void ParseInstruction();
  void ParseDeclOrComment();
  void ParseDeclNode();
  void ParseComment();
  void ParseCommentContent();
  void ParseTagName();
  void ParseTagAttributeName();
  void ParseTagAttributeEqual();
  void ParseTagAttributeValue();
  void ParseMaybeClose();
  void ParseTagClose();
  void ParseTagEnd();
  void ParseTargetData();
  void Reset();
  void ClearData();
  void ClearName();
  void AppendToData(uint8_t ch);
  void AppendToName(uint8_t ch);
  void BackUpAndReplaceDataAt(int32_t index, uint8_t ch);
  bool IsEntityStart(uint8_t ch) const;
  bool IsEntityEnd(uint8_t ch) const;
  int32_t CurrentDataIndex() const;
  void Push();
  void Pop();
  CFX_SAXItem* GetCurrentItem() const;
  bool SkipSpace(uint8_t ch);
  void SkipNode();
  void NotifyData();
  void NotifyEnter();
  void NotifyAttribute();
  void NotifyBreak();
  void NotifyClose();
  void NotifyEnd();
  void NotifyTargetData();
  void ReallocDataBuffer();
  void ReallocNameBuffer();
  void ParseChar(uint8_t ch);

  CFX_SAXFile m_File;
  HandlerIface* m_pHandler;
  int32_t m_iState;
  std::stack<std::unique_ptr<CFX_SAXItem>> m_Stack;
  uint32_t m_dwItemID;
  CFX_SaxMode m_eMode;
  CFX_SaxMode m_ePrevMode;
  bool m_bCharData;
  uint8_t m_CurByte;
  uint32_t m_dwDataOffset;
  std::stack<char> m_SkipStack;
  uint8_t m_SkipChar;
  uint32_t m_dwNodePos;
  std::vector<uint8_t> m_Data;
  int32_t m_iEntityStart;  // Index into m_Data.
  std::vector<uint8_t> m_Name;
  uint32_t m_dwParseMode;
  std::unique_ptr<CFX_SAXCommentContext> m_pCommentContext;
};

#endif  // CORE_FXCRT_XML_CFX_SAXREADER_H_
