3 * Copyright 2004--2005, Google Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #ifndef TALK_XMLLITE_XMLPARSER_H_
29 #define TALK_XMLLITE_XMLPARSER_H_
33 #include "talk/xmllite/xmlnsstack.h"
34 #ifdef EXPAT_RELATIVE_PATH
37 #include "third_party/expat/v2_0_1/Source/lib/expat.h"
38 #endif // EXPAT_RELATIVE_PATH
40 struct XML_ParserStruct;
41 typedef struct XML_ParserStruct* XML_Parser;
45 class XmlParseHandler;
46 class XmlParseContext;
49 class XmlParseContext {
51 virtual ~XmlParseContext() {}
52 virtual QName ResolveQName(const char * qname, bool isAttr) = 0;
53 virtual void RaiseError(XML_Error err) = 0;
54 virtual void GetPosition(unsigned long * line, unsigned long * column,
55 unsigned long * byte_index) = 0;
58 class XmlParseHandler {
60 virtual ~XmlParseHandler() {}
61 virtual void StartElement(XmlParseContext * pctx,
62 const char * name, const char ** atts) = 0;
63 virtual void EndElement(XmlParseContext * pctx,
64 const char * name) = 0;
65 virtual void CharacterData(XmlParseContext * pctx,
66 const char * text, int len) = 0;
67 virtual void Error(XmlParseContext * pctx,
68 XML_Error errorCode) = 0;
73 static void ParseXml(XmlParseHandler * pxph, std::string text);
75 explicit XmlParser(XmlParseHandler * pxph);
76 bool Parse(const char * data, size_t len, bool isFinal);
81 void ExpatStartElement(const char * name, const char ** atts);
82 void ExpatEndElement(const char * name);
83 void ExpatCharacterData(const char * text, int len);
84 void ExpatXmlDecl(const char * ver, const char * enc, int standalone);
88 class ParseContext : public XmlParseContext {
91 virtual ~ParseContext();
92 virtual QName ResolveQName(const char * qname, bool isAttr);
93 virtual void RaiseError(XML_Error err) { if (!raised_) raised_ = err; }
94 virtual void GetPosition(unsigned long * line, unsigned long * column,
95 unsigned long * byte_index);
96 XML_Error RaisedError() { return raised_; }
101 void StartNamespace(const char * prefix, const char * ns);
102 void SetPosition(int line, int column, long byte_index);
105 XmlnsStack xmlnsstack_;
107 XML_Size line_number_;
108 XML_Size column_number_;
109 XML_Index byte_index_;
112 ParseContext context_;
114 XmlParseHandler * pxph_;
120 #endif // TALK_XMLLITE_XMLPARSER_H_