1 /* 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 40 struct XML_ParserStruct; 41 typedef struct XML_ParserStruct* XML_Parser; 42 43 namespace buzz { 44 45 class XmlParseHandler; 46 class XmlParseContext; 47 class XmlParser; 48 49 class XmlParseContext { 50 public: 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 58 class XmlParseHandler { 59 public: 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 71 class XmlParser { 72 public: 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 86 private: 87 88 class ParseContext : public XmlParseContext { 89 public: 90 ParseContext(XmlParser * parser); 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_; } 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: 105 const XmlParser * parser_; 106 XmlnsStack xmlnsstack_; 107 XML_Error raised_; 108 XML_Size line_number_; 109 XML_Size column_number_; 110 XML_Index byte_index_; 111 }; 112 113 ParseContext context_; 114 XML_Parser expat_; 115 XmlParseHandler * pxph_; 116 bool sentError_; 117 }; 118 119 } // namespace buzz 120 121 #endif // TALK_XMLLITE_XMLPARSER_H_ 122