148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org/*
248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *
448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org */
1048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
1148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#ifndef WEBRTC_LIBJINGLE_XMLLITE_XMLELEMENT_H_
1248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#define WEBRTC_LIBJINGLE_XMLLITE_XMLELEMENT_H_
1348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
1448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include <iosfwd>
1548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include <string>
1648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
1748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/libjingle/xmllite/qname.h"
1848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/base/scoped_ptr.h"
1948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
2048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgnamespace buzz {
2148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
2248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlChild;
2348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlText;
2448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlElement;
2548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlAttr;
2648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
2748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlChild {
2848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org public:
2948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlChild* NextChild() { return next_child_; }
3048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlChild* NextChild() const { return next_child_; }
3148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
3248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  bool IsText() const { return IsTextImpl(); }
3348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
3448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* AsElement() { return AsElementImpl(); }
3548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* AsElement() const { return AsElementImpl(); }
3648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
3748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlText* AsText() { return AsTextImpl(); }
3848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlText* AsText() const { return AsTextImpl(); }
3948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
4048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
4148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org protected:
4248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlChild() :
4348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    next_child_(NULL) {
4448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
4548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
4648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual bool IsTextImpl() const = 0;
4748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual XmlElement* AsElementImpl() const = 0;
4848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual XmlText* AsTextImpl() const = 0;
4948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
5048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
5148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual ~XmlChild();
5248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
5348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org private:
5448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  friend class XmlElement;
5548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
5648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlChild(const XmlChild& noimpl);
5748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
5848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlChild* next_child_;
5948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org};
6048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
6148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlText : public XmlChild {
6248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org public:
6348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  explicit XmlText(const std::string& text) :
6448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    XmlChild(),
6548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    text_(text) {
6648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
6748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  explicit XmlText(const XmlText& t) :
6848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    XmlChild(),
6948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    text_(t.text_) {
7048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
7148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  explicit XmlText(const char* cstr, size_t len) :
7248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    XmlChild(),
7348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    text_(cstr, len) {
7448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
7548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual ~XmlText();
7648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
7748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const std::string& Text() const { return text_; }
7848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void SetText(const std::string& text);
7948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddParsedText(const char* buf, int len);
8048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddText(const std::string& text);
8148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
8248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org protected:
8348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual bool IsTextImpl() const;
8448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual XmlElement* AsElementImpl() const;
8548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual XmlText* AsTextImpl() const;
8648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
8748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org private:
8848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  std::string text_;
8948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org};
9048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
9148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlAttr {
9248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org public:
9348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlAttr* NextAttr() const { return next_attr_; }
9448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const QName& Name() const { return name_; }
9548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const std::string& Value() const { return value_; }
9648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
9748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org private:
9848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  friend class XmlElement;
9948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
10048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  explicit XmlAttr(const QName& name, const std::string& value) :
10148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    next_attr_(NULL),
10248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    name_(name),
10348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    value_(value) {
10448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
10548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  explicit XmlAttr(const XmlAttr& att) :
10648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    next_attr_(NULL),
10748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    name_(att.name_),
10848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    value_(att.value_) {
10948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
11048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
11148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlAttr* next_attr_;
11248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  QName name_;
11348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  std::string value_;
11448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org};
11548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
11648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlElement : public XmlChild {
11748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org public:
11848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  explicit XmlElement(const QName& name);
11948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  explicit XmlElement(const QName& name, bool useDefaultNs);
12048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  explicit XmlElement(const XmlElement& elt);
12148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
12248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual ~XmlElement();
12348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
12448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const QName& Name() const { return name_; }
12548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void SetName(const QName& name) { name_ = name; }
12648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
12748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const std::string BodyText() const;
12848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void SetBodyText(const std::string& text);
12948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
13048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const QName FirstElementName() const;
13148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
13248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlAttr* FirstAttr();
13348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlAttr* FirstAttr() const
13448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    { return const_cast<XmlElement *>(this)->FirstAttr(); }
13548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
13648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  // Attr will return an empty string if the attribute isn't there:
13748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  // use HasAttr to test presence of an attribute.
13848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const std::string Attr(const StaticQName& name) const;
13948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const std::string Attr(const QName& name) const;
14048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  bool HasAttr(const StaticQName& name) const;
14148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  bool HasAttr(const QName& name) const;
14248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void SetAttr(const QName& name, const std::string& value);
14348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void ClearAttr(const QName& name);
14448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
14548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlChild* FirstChild();
14648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlChild* FirstChild() const {
14748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->FirstChild();
14848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
14948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
15048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* FirstElement();
15148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* FirstElement() const {
15248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->FirstElement();
15348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
15448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
15548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* NextElement();
15648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* NextElement() const {
15748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->NextElement();
15848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
15948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
16048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* FirstWithNamespace(const std::string& ns);
16148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* FirstWithNamespace(const std::string& ns) const {
16248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->FirstWithNamespace(ns);
16348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
16448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
16548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* NextWithNamespace(const std::string& ns);
16648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* NextWithNamespace(const std::string& ns) const {
16748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->NextWithNamespace(ns);
16848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
16948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
17048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* FirstNamed(const StaticQName& name);
17148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* FirstNamed(const StaticQName& name) const {
17248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->FirstNamed(name);
17348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
17448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
17548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* FirstNamed(const QName& name);
17648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* FirstNamed(const QName& name) const {
17748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->FirstNamed(name);
17848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
17948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
18048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* NextNamed(const StaticQName& name);
18148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* NextNamed(const StaticQName& name) const {
18248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->NextNamed(name);
18348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
18448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
18548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* NextNamed(const QName& name);
18648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const XmlElement* NextNamed(const QName& name) const {
18748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    return const_cast<XmlElement *>(this)->NextNamed(name);
18848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  }
18948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
19048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  // Finds the first element named 'name'.  If that element can't be found then
19148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  // adds one and returns it.
19248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlElement* FindOrAddNamedChild(const QName& name);
19348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
19448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  const std::string TextNamed(const QName& name) const;
19548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
19648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void InsertChildAfter(XmlChild* predecessor, XmlChild* new_child);
19748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void RemoveChildAfter(XmlChild* predecessor);
19848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
19948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddParsedText(const char* buf, int len);
20048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  // Note: CDATA is not supported by XMPP, therefore using this function will
20148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  // generate non-XMPP compatible XML.
20248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddCDATAText(const char* buf, int len);
20348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddText(const std::string& text);
20448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddText(const std::string& text, int depth);
20548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddElement(XmlElement* child);
20648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddElement(XmlElement* child, int depth);
20748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddAttr(const QName& name, const std::string& value);
20848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void AddAttr(const QName& name, const std::string& value, int depth);
20948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void ClearNamedChildren(const QName& name);
21048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void ClearAttributes();
21148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  void ClearChildren();
21248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
21348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  static XmlElement* ForStr(const std::string& str);
21448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  std::string Str() const;
21548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
21648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  bool IsCDATA() const { return cdata_; }
21748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
21848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org protected:
21948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual bool IsTextImpl() const;
22048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual XmlElement* AsElementImpl() const;
22148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  virtual XmlText* AsTextImpl() const;
22248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
22348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org private:
22448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  QName name_;
22548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlAttr* first_attr_;
22648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlAttr* last_attr_;
22748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlChild* first_child_;
22848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlChild* last_child_;
22948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  bool cdata_;
23048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org};
23148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
23248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}  // namespace buzz
23348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
23448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#endif  // WEBRTC_LIBJINGLE_XMLLITE_XMLELEMENT_H_
235