Home | History | Annotate | Download | only in xmpp
      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_XMPP_XMPPSTANZAPARSER_H_
     12 #define WEBRTC_LIBJINGLE_XMPP_XMPPSTANZAPARSER_H_
     13 
     14 #include "webrtc/libjingle/xmllite/xmlbuilder.h"
     15 #include "webrtc/libjingle/xmllite/xmlparser.h"
     16 
     17 
     18 namespace buzz {
     19 
     20 class XmlElement;
     21 
     22 class XmppStanzaParseHandler {
     23 public:
     24   virtual ~XmppStanzaParseHandler() {}
     25   virtual void StartStream(const XmlElement * pelStream) = 0;
     26   virtual void Stanza(const XmlElement * pelStanza) = 0;
     27   virtual void EndStream() = 0;
     28   virtual void XmlError() = 0;
     29 };
     30 
     31 class XmppStanzaParser {
     32 public:
     33   XmppStanzaParser(XmppStanzaParseHandler *psph);
     34   bool Parse(const char * data, size_t len, bool isFinal)
     35     { return parser_.Parse(data, len, isFinal); }
     36   void Reset();
     37 
     38 private:
     39   class ParseHandler : public XmlParseHandler {
     40   public:
     41     ParseHandler(XmppStanzaParser * outer) : outer_(outer) {}
     42     virtual void StartElement(XmlParseContext * pctx,
     43                const char * name, const char ** atts)
     44       { outer_->IncomingStartElement(pctx, name, atts); }
     45     virtual void EndElement(XmlParseContext * pctx,
     46                const char * name)
     47       { outer_->IncomingEndElement(pctx, name); }
     48     virtual void CharacterData(XmlParseContext * pctx,
     49                const char * text, int len)
     50       { outer_->IncomingCharacterData(pctx, text, len); }
     51     virtual void Error(XmlParseContext * pctx,
     52                XML_Error errCode)
     53       { outer_->IncomingError(pctx, errCode); }
     54   private:
     55     XmppStanzaParser * const outer_;
     56   };
     57 
     58   friend class ParseHandler;
     59 
     60   void IncomingStartElement(XmlParseContext * pctx,
     61                const char * name, const char ** atts);
     62   void IncomingEndElement(XmlParseContext * pctx,
     63                const char * name);
     64   void IncomingCharacterData(XmlParseContext * pctx,
     65                const char * text, int len);
     66   void IncomingError(XmlParseContext * pctx,
     67                XML_Error errCode);
     68 
     69   XmppStanzaParseHandler * psph_;
     70   ParseHandler innerHandler_;
     71   XmlParser parser_;
     72   int depth_;
     73   XmlBuilder builder_;
     74 
     75  };
     76 
     77 
     78 }
     79 
     80 #endif  // WEBRTC_LIBJINGLE_XMPP_XMPPSTANZAPARSER_H_
     81