14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#ifndef CORE_FXCRT_XML_CXML_PARSER_H_
8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#define CORE_FXCRT_XML_CXML_PARSER_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm>
1133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann#include <memory>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_stream.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cxml_databufacc.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_UTF8Decoder;
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CXML_Element;
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CXML_Parser {
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXML_Parser();
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CXML_Parser();
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  bool Init(const uint8_t* pBuffer, size_t size);
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ReadNextBlock();
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsEOF();
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool HaveAvailData();
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SkipWhiteSpaces();
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void GetName(ByteString* space, ByteString* name);
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString GetAttrValue();
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t GetCharRef();
3233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  void GetTagName(bool bStartTag,
3333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                  bool* bEndTag,
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                  ByteString* space,
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                  ByteString* name);
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void SkipLiterals(const ByteStringView& str);
3733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  std::unique_ptr<CXML_Element> ParseElement(CXML_Element* pParent,
3833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                             bool bStartTag);
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void InsertContentSegment(bool bCDATA,
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            const WideStringView& content,
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                            CXML_Element* pElement);
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann private:
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::unique_ptr<CXML_Element> ParseElementInternal(CXML_Element* pParent,
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                     bool bStartTag,
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                     int nDepth);
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::unique_ptr<CXML_DataBufAcc> m_pDataAcc;
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FILESIZE m_nOffset;
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const uint8_t* m_pBuffer;
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t m_dwBufferSize;
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FILESIZE m_nBufferOffset;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t m_dwIndex;
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#endif  // CORE_FXCRT_XML_CXML_PARSER_H_
58