• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef CORE_FXCRT_XML_CFX_XMLPARSER_H_
8 #define CORE_FXCRT_XML_CFX_XMLPARSER_H_
9 
10 #include <memory>
11 #include <optional>
12 
13 #include "core/fxcrt/retain_ptr.h"
14 #include "core/fxcrt/unowned_ptr.h"
15 #include "core/fxcrt/widestring.h"
16 
17 class CFX_SeekableStreamProxy;
18 class CFX_XMLDocument;
19 class CFX_XMLNode;
20 class IFX_SeekableReadStream;
21 
22 class CFX_XMLParser final {
23  public:
24   static bool IsXMLNameChar(wchar_t ch, bool bFirstChar);
25 
26   explicit CFX_XMLParser(const RetainPtr<IFX_SeekableReadStream>& pStream);
27   ~CFX_XMLParser();
28 
29   std::unique_ptr<CFX_XMLDocument> Parse();
30 
31  private:
32   enum class FDE_XmlSyntaxState {
33     Text,
34     Node,
35     Target,
36     Tag,
37     AttriName,
38     AttriEqualSign,
39     AttriQuotation,
40     AttriValue,
41     CloseInstruction,
42     BreakElement,
43     CloseElement,
44     SkipDeclNode,
45     SkipComment,
46     SkipCommentOrDecl,
47     SkipCData,
48     TargetData
49   };
50 
51   bool DoSyntaxParse(CFX_XMLDocument* doc);
52   WideString GetTextData();
53   void ProcessTextChar(wchar_t ch);
54   void ProcessTargetData();
55 
56   UnownedPtr<CFX_XMLNode> current_node_;
57   RetainPtr<CFX_SeekableStreamProxy> stream_;
58   WideString current_text_;
59   size_t xml_plane_size_ = 1024;
60   std::optional<size_t> entity_start_;
61 };
62 
63 #endif  // CORE_FXCRT_XML_CFX_XMLPARSER_H_
64