blob: 4a79858e42f0d882706cb187e92240666f04c84f [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
2 * libjingle
3 * Copyright 2004--2005, Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
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.
15 *
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.
26 */
27
28#ifndef TALK_XMLLITE_XMLPARSER_H_
29#define TALK_XMLLITE_XMLPARSER_H_
30
31#include <string>
32
33#include "talk/xmllite/xmlnsstack.h"
34#ifdef EXPAT_RELATIVE_PATH
35#include "expat.h"
36#else
37#include "third_party/expat/v2_0_1/Source/lib/expat.h"
38#endif // EXPAT_RELATIVE_PATH
39
40struct XML_ParserStruct;
41typedef struct XML_ParserStruct* XML_Parser;
42
43namespace buzz {
44
45class XmlParseHandler;
46class XmlParseContext;
47class XmlParser;
48
49class XmlParseContext {
50public:
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;
56};
57
58class XmlParseHandler {
59public:
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;
69};
70
71class XmlParser {
72public:
73 static void ParseXml(XmlParseHandler * pxph, std::string text);
74
75 explicit XmlParser(XmlParseHandler * pxph);
76 bool Parse(const char * data, size_t len, bool isFinal);
77 void Reset();
78 virtual ~XmlParser();
79
80 // expat callbacks
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);
85
86private:
87
88 class ParseContext : public XmlParseContext {
89 public:
sergeyu@chromium.orge42b8ab2014-03-25 00:31:35 +000090 ParseContext();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091 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_; }
97 void Reset();
98
99 void StartElement();
100 void EndElement();
101 void StartNamespace(const char * prefix, const char * ns);
102 void SetPosition(int line, int column, long byte_index);
103
104 private:
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000105 XmlnsStack xmlnsstack_;
106 XML_Error raised_;
107 XML_Size line_number_;
108 XML_Size column_number_;
109 XML_Index byte_index_;
110 };
111
112 ParseContext context_;
113 XML_Parser expat_;
114 XmlParseHandler * pxph_;
115 bool sentError_;
116};
117
118} // namespace buzz
119
120#endif // TALK_XMLLITE_XMLPARSER_H_