Index: third_party/libjingle_xmpp/xmpp/xmppstanzaparser.cc |
diff --git a/third_party/libjingle_xmpp/xmpp/xmppstanzaparser.cc b/third_party/libjingle_xmpp/xmpp/xmppstanzaparser.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1d7a678bd2f86ee688e0b7db71353b10631ca73e |
--- /dev/null |
+++ b/third_party/libjingle_xmpp/xmpp/xmppstanzaparser.cc |
@@ -0,0 +1,83 @@ |
+// Copyright 2004 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "third_party/libjingle_xmpp/xmpp/xmppstanzaparser.h" |
+ |
+#include "third_party/libjingle_xmpp/xmllite/xmlelement.h" |
+#include "third_party/libjingle_xmpp/xmpp/constants.h" |
+#include "webrtc/base/common.h" |
+#ifdef EXPAT_RELATIVE_PATH |
+#include "expat.h" |
+#else |
+#include "third_party/expat/v2_0_1/Source/lib/expat.h" |
+#endif |
+ |
+namespace buzz { |
+ |
+XmppStanzaParser::XmppStanzaParser(XmppStanzaParseHandler *psph) : |
+ psph_(psph), |
+ innerHandler_(this), |
+ parser_(&innerHandler_), |
+ depth_(0), |
+ builder_() { |
+} |
+ |
+void |
+XmppStanzaParser::Reset() { |
+ parser_.Reset(); |
+ depth_ = 0; |
+ builder_.Reset(); |
+} |
+ |
+void |
+XmppStanzaParser::IncomingStartElement( |
+ XmlParseContext * pctx, const char * name, const char ** atts) { |
+ if (depth_++ == 0) { |
+ XmlElement * pelStream = XmlBuilder::BuildElement(pctx, name, atts); |
+ if (pelStream == NULL) { |
+ pctx->RaiseError(XML_ERROR_SYNTAX); |
+ return; |
+ } |
+ psph_->StartStream(pelStream); |
+ delete pelStream; |
+ return; |
+ } |
+ |
+ builder_.StartElement(pctx, name, atts); |
+} |
+ |
+void |
+XmppStanzaParser::IncomingCharacterData( |
+ XmlParseContext * pctx, const char * text, int len) { |
+ if (depth_ > 1) { |
+ builder_.CharacterData(pctx, text, len); |
+ } |
+} |
+ |
+void |
+XmppStanzaParser::IncomingEndElement( |
+ XmlParseContext * pctx, const char * name) { |
+ if (--depth_ == 0) { |
+ psph_->EndStream(); |
+ return; |
+ } |
+ |
+ builder_.EndElement(pctx, name); |
+ |
+ if (depth_ == 1) { |
+ XmlElement *element = builder_.CreateElement(); |
+ psph_->Stanza(element); |
+ delete element; |
+ } |
+} |
+ |
+void |
+XmppStanzaParser::IncomingError( |
+ XmlParseContext * pctx, XML_Error errCode) { |
+ RTC_UNUSED(pctx); |
+ RTC_UNUSED(errCode); |
+ psph_->XmlError(); |
+} |
+ |
+} |