// 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_CXML_PARSER_H_
#define CORE_FXCRT_XML_CXML_PARSER_H_

#include <algorithm>
#include <memory>

#include "core/fxcrt/fx_stream.h"
#include "core/fxcrt/xml/cxml_databufacc.h"

class CFX_UTF8Decoder;
class CXML_Element;

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

  bool Init(const uint8_t* pBuffer, size_t size);
  bool ReadNextBlock();
  bool IsEOF();
  bool HaveAvailData();
  void SkipWhiteSpaces();
  void GetName(CFX_ByteString* space, CFX_ByteString* name);
  void GetAttrValue(CFX_WideString& value);
  uint32_t GetCharRef();
  void GetTagName(bool bStartTag,
                  bool* bEndTag,
                  CFX_ByteString* space,
                  CFX_ByteString* name);
  void SkipLiterals(const CFX_ByteStringC& str);
  std::unique_ptr<CXML_Element> ParseElement(CXML_Element* pParent,
                                             bool bStartTag);
  void InsertContentSegment(bool bCDATA,
                            const CFX_WideStringC& content,
                            CXML_Element* pElement);
  void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);

 private:
  std::unique_ptr<CXML_Element> ParseElementInternal(CXML_Element* pParent,
                                                     bool bStartTag,
                                                     int nDepth);

  std::unique_ptr<CXML_DataBufAcc> m_pDataAcc;
  FX_FILESIZE m_nOffset;
  const uint8_t* m_pBuffer;
  size_t m_dwBufferSize;
  FX_FILESIZE m_nBufferOffset;
  size_t m_dwIndex;
};

void FX_XML_SplitQualifiedName(const CFX_ByteStringC& bsFullName,
                               CFX_ByteStringC& bsSpace,
                               CFX_ByteStringC& bsName);

#endif  // CORE_FXCRT_XML_CXML_PARSER_H_
