1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/*
2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle
3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc.
4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without
6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met:
7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  1. Redistributions of source code must retain the above copyright notice,
9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     this list of conditions and the following disclaimer.
10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  2. Redistributions in binary form must reproduce the above copyright notice,
11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     this list of conditions and the following disclaimer in the documentation
12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     and/or other materials provided with the distribution.
13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  3. The name of the author may not be used to endorse or promote products
14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     derived from this software without specific prior written permission.
15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */
27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef _xmlelement_h_
29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define _xmlelement_h_
30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <iosfwd>
32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string>
33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/scoped_ptr.h"
34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmllite/qname.h"
35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace buzz {
37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochextern const QName QN_EMPTY;
39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochextern const QName QN_XMLNS;
40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlChild;
43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlText;
44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlElement;
45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlAttr;
46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlChild {
48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochfriend class XmlElement;
49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic:
51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlChild * NextChild() { return pNextChild_; }
53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlChild * NextChild() const { return pNextChild_; }
54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  bool IsText() const { return IsTextImpl(); }
56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlElement * AsElement() { return AsElementImpl(); }
58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlElement * AsElement() const { return AsElementImpl(); }
59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlText * AsText() { return AsTextImpl(); }
61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlText * AsText() const { return AsTextImpl(); }
62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprotected:
65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlChild() :
67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    pNextChild_(NULL) {
68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool IsTextImpl() const = 0;
71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual XmlElement * AsElementImpl() const = 0;
72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual XmlText * AsTextImpl() const = 0;
73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~XmlChild();
76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprivate:
78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlChild(const XmlChild & noimpl);
79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlChild * pNextChild_;
81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlText : public XmlChild {
85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic:
86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  explicit XmlText(const std::string & text) :
87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    XmlChild(),
88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    text_(text) {
89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  explicit XmlText(const XmlText & t) :
91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    XmlChild(),
92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    text_(t.text_) {
93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  explicit XmlText(const char * cstr, size_t len) :
95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    XmlChild(),
96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    text_(cstr, len) {
97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~XmlText();
99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const std::string & Text() const { return text_; }
101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void SetText(const std::string & text);
102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddParsedText(const char * buf, int len);
103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddText(const std::string & text);
104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprotected:
106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool IsTextImpl() const;
107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual XmlElement * AsElementImpl() const;
108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual XmlText * AsTextImpl() const;
109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprivate:
111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  std::string text_;
112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlAttr {
115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochfriend class XmlElement;
116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic:
118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlAttr * NextAttr() const { return pNextAttr_; }
119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const QName & Name() const { return name_; }
120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const std::string & Value() const { return value_; }
121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprivate:
123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  explicit XmlAttr(const QName & name, const std::string & value) :
124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    pNextAttr_(NULL),
125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    name_(name),
126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    value_(value) {
127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  explicit XmlAttr(const XmlAttr & att) :
129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    pNextAttr_(NULL),
130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    name_(att.name_),
131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    value_(att.value_) {
132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlAttr * pNextAttr_;
135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  QName name_;
136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  std::string value_;
137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlElement : public XmlChild {
140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic:
141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  explicit XmlElement(const QName & name);
142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  explicit XmlElement(const QName & name, bool useDefaultNs);
143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  explicit XmlElement(const XmlElement & elt);
144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~XmlElement();
146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const QName& Name() const { return name_; }
148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void SetName(const QName& name) { name_ = name; }
149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const std::string & BodyText() const;
151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void SetBodyText(const std::string & text);
152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const QName & FirstElementName() const;
154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlAttr * FirstAttr();
156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlAttr * FirstAttr() const
157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    { return const_cast<XmlElement *>(this)->FirstAttr(); }
158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  //! Attr will return STR_EMPTY if the attribute isn't there:
160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  //! use HasAttr to test presence of an attribute.
161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const std::string & Attr(const QName & name) const;
162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  bool HasAttr(const QName & name) const;
163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void SetAttr(const QName & name, const std::string & value);
164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void ClearAttr(const QName & name);
165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlChild * FirstChild();
167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlChild * FirstChild() const
168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    { return const_cast<XmlElement *>(this)->FirstChild(); }
169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlElement * FirstElement();
171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlElement * FirstElement() const
172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    { return const_cast<XmlElement *>(this)->FirstElement(); }
173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlElement * NextElement();
175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlElement * NextElement() const
176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    { return const_cast<XmlElement *>(this)->NextElement(); }
177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlElement * FirstWithNamespace(const std::string & ns);
179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlElement * FirstWithNamespace(const std::string & ns) const
180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    { return const_cast<XmlElement *>(this)->FirstWithNamespace(ns); }
181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlElement * NextWithNamespace(const std::string & ns);
183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlElement * NextWithNamespace(const std::string & ns) const
184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    { return const_cast<XmlElement *>(this)->NextWithNamespace(ns); }
185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlElement * FirstNamed(const QName & name);
187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlElement * FirstNamed(const QName & name) const
188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    { return const_cast<XmlElement *>(this)->FirstNamed(name); }
189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlElement * NextNamed(const QName & name);
191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const XmlElement * NextNamed(const QName & name) const
192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    { return const_cast<XmlElement *>(this)->NextNamed(name); }
193f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Finds the first element named 'name'.  If that element can't be found then
195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // adds one and returns it.
196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlElement* FindOrAddNamedChild(const QName& name);
197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  const std::string & TextNamed(const QName & name) const;
199f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
200f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void InsertChildAfter(XmlChild * pPredecessor, XmlChild * pNewChild);
201f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void RemoveChildAfter(XmlChild * pPredecessor);
202f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
203f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddParsedText(const char * buf, int len);
204f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Note: CDATA is not supported by XMPP, therefore using this function will
205f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // generate non-XMPP compatible XML.
206f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddCDATAText(const char * buf, int len);
207f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddText(const std::string & text);
208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddText(const std::string & text, int depth);
209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddElement(XmlElement * pelChild);
210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddElement(XmlElement * pelChild, int depth);
211f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddAttr(const QName & name, const std::string & value);
212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void AddAttr(const QName & name, const std::string & value, int depth);
213f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void ClearNamedChildren(const QName & name);
214f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void ClearAttributes();
215f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void ClearChildren();
216f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
217f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  static XmlElement * ForStr(const std::string & str);
218f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  std::string Str() const;
219f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
220f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  void Print(std::ostream * pout, std::string xmlns[], int xmlnsCount) const;
221f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
222f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  bool IsCDATA() const { return cdata_; }
223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprotected:
225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool IsTextImpl() const;
226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual XmlElement * AsElementImpl() const;
227f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual XmlText * AsTextImpl() const;
228f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
229f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprivate:
230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  QName name_;
231f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlAttr * pFirstAttr_;
232f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlAttr * pLastAttr_;
233f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlChild * pFirstChild_;
234f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  XmlChild * pLastChild_;
235f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  bool cdata_;
236f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
237f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
238f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
239f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif
240