Home | History | Annotate | Download | only in xmllite
      1 /*
      2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_LIBJINGLE_XMLLITE_XMLPARSER_H_
     12 #define WEBRTC_LIBJINGLE_XMLLITE_XMLPARSER_H_
     13 
     14 #include <string>
     15 
     16 #include "webrtc/libjingle/xmllite/xmlnsstack.h"
     17 #ifdef EXPAT_RELATIVE_PATH
     18 #include "expat.h"
     19 #else
     20 #include "third_party/expat/v2_0_1/Source/lib/expat.h"
     21 #endif  // EXPAT_RELATIVE_PATH
     22 
     23 struct XML_ParserStruct;
     24 typedef struct XML_ParserStruct* XML_Parser;
     25 
     26 namespace buzz {
     27 
     28 class XmlParseHandler;
     29 class XmlParseContext;
     30 class XmlParser;
     31 
     32 class XmlParseContext {
     33 public:
     34   virtual ~XmlParseContext() {}
     35   virtual QName ResolveQName(const char * qname, bool isAttr) = 0;
     36   virtual void RaiseError(XML_Error err) = 0;
     37   virtual void GetPosition(unsigned long * line, unsigned long * column,
     38                            unsigned long * byte_index) = 0;
     39 };
     40 
     41 class XmlParseHandler {
     42 public:
     43   virtual ~XmlParseHandler() {}
     44   virtual void StartElement(XmlParseContext * pctx,
     45                const char * name, const char ** atts) = 0;
     46   virtual void EndElement(XmlParseContext * pctx,
     47                const char * name) = 0;
     48   virtual void CharacterData(XmlParseContext * pctx,
     49                const char * text, int len) = 0;
     50   virtual void Error(XmlParseContext * pctx,
     51                XML_Error errorCode) = 0;
     52 };
     53 
     54 class XmlParser {
     55 public:
     56   static void ParseXml(XmlParseHandler * pxph, std::string text);
     57 
     58   explicit XmlParser(XmlParseHandler * pxph);
     59   bool Parse(const char * data, size_t len, bool isFinal);
     60   void Reset();
     61   virtual ~XmlParser();
     62 
     63   // expat callbacks
     64   void ExpatStartElement(const char * name, const char ** atts);
     65   void ExpatEndElement(const char * name);
     66   void ExpatCharacterData(const char * text, int len);
     67   void ExpatXmlDecl(const char * ver, const char * enc, int standalone);
     68 
     69 private:
     70 
     71   class ParseContext : public XmlParseContext {
     72   public:
     73     ParseContext();
     74     virtual ~ParseContext();
     75     virtual QName ResolveQName(const char * qname, bool isAttr);
     76     virtual void RaiseError(XML_Error err) { if (!raised_) raised_ = err; }
     77     virtual void GetPosition(unsigned long * line, unsigned long * column,
     78                              unsigned long * byte_index);
     79     XML_Error RaisedError() { return raised_; }
     80     void Reset();
     81 
     82     void StartElement();
     83     void EndElement();
     84     void StartNamespace(const char * prefix, const char * ns);
     85     void SetPosition(int line, int column, long byte_index);
     86 
     87   private:
     88     XmlnsStack xmlnsstack_;
     89     XML_Error raised_;
     90     XML_Size line_number_;
     91     XML_Size column_number_;
     92     XML_Index byte_index_;
     93   };
     94 
     95   ParseContext context_;
     96   XML_Parser expat_;
     97   XmlParseHandler * pxph_;
     98   bool sentError_;
     99 };
    100 
    101 }  // namespace buzz
    102 
    103 #endif  // WEBRTC_LIBJINGLE_XMLLITE_XMLPARSER_H_
    104