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