15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2005, Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlelement.h"
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <ostream>
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <sstream>
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string>
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector>
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h"
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/qname.h"
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlparser.h"
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlbuilder.h"
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlprinter.h"
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlconstants.h"
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace buzz {
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlChild::~XmlChild() {
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool XmlText::IsTextImpl() const {
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement* XmlText::AsElementImpl() const {
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlText* XmlText::AsTextImpl() const {
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return const_cast<XmlText *>(this);
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlText::SetText(const std::string& text) {
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  text_ = text;
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlText::AddParsedText(const char* buf, int len) {
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  text_.append(buf, len);
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlText::AddText(const std::string& text) {
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  text_ += text;
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlText::~XmlText() {
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::XmlElement(const QName& name) :
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    name_(name),
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_attr_(NULL),
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_attr_(NULL),
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_child_(NULL),
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_child_(NULL),
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    cdata_(false) {
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::XmlElement(const XmlElement& elt) :
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    XmlChild(),
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    name_(elt.name_),
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_attr_(NULL),
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_attr_(NULL),
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_child_(NULL),
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_child_(NULL),
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    cdata_(false) {
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // copy attributes
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr ** plast_attr = &first_attr_;
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* newAttr = NULL;
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = elt.first_attr_; attr; attr = attr->NextAttr()) {
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    newAttr = new XmlAttr(*attr);
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *plast_attr = newAttr;
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    plast_attr = &(newAttr->next_attr_);
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  last_attr_ = newAttr;
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // copy children
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild ** ppLast = &first_child_;
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* newChild = NULL;
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = elt.first_child_; pChild; pChild = pChild->NextChild()) {
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (pChild->IsText()) {
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      newChild = new XmlText(*(pChild->AsText()));
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    } else {
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      newChild = new XmlElement(*(pChild->AsElement()));
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *ppLast = newChild;
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ppLast = &(newChild->next_child_);
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  last_child_ = newChild;
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cdata_ = elt.cdata_;
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::XmlElement(const QName& name, bool useDefaultNs) :
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  name_(name),
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  first_attr_(useDefaultNs ? new XmlAttr(QN_XMLNS, name.Namespace()) : NULL),
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  last_attr_(first_attr_),
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  first_child_(NULL),
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  last_child_(NULL),
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cdata_(false) {
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool XmlElement::IsTextImpl() const {
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return false;
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement* XmlElement::AsElementImpl() const {
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return const_cast<XmlElement *>(this);
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlText* XmlElement::AsTextImpl() const {
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst std::string XmlElement::BodyText() const {
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (first_child_ && first_child_->IsText() && last_child_ == first_child_) {
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return first_child_->AsText()->Text();
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return std::string();
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::SetBodyText(const std::string& text) {
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (text.empty()) {
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ClearChildren();
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else if (first_child_ == NULL) {
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AddText(text);
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else if (first_child_->IsText() && last_child_ == first_child_) {
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_child_->AsText()->SetText(text);
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ClearChildren();
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AddText(text);
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst QName XmlElement::FirstElementName() const {
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const XmlElement* element = FirstElement();
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (element == NULL)
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return QName();
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return element->Name();
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlAttr* XmlElement::FirstAttr() {
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return first_attr_;
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst std::string XmlElement::Attr(const StaticQName& name) const {
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = first_attr_; attr; attr = attr->next_attr_) {
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (attr->name_ == name)
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return attr->value_;
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return std::string();
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst std::string XmlElement::Attr(const QName& name) const {
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = first_attr_; attr; attr = attr->next_attr_) {
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (attr->name_ == name)
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return attr->value_;
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return std::string();
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool XmlElement::HasAttr(const StaticQName& name) const {
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = first_attr_; attr; attr = attr->next_attr_) {
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (attr->name_ == name)
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return false;
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool XmlElement::HasAttr(const QName& name) const {
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = first_attr_; attr; attr = attr->next_attr_) {
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (attr->name_ == name)
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return false;
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::SetAttr(const QName& name, const std::string& value) {
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = first_attr_; attr; attr = attr->next_attr_) {
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (attr->name_ == name)
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!attr) {
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    attr = new XmlAttr(name, value);
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (last_attr_)
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      last_attr_->next_attr_ = attr;
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    else
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      first_attr_ = attr;
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_attr_ = attr;
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  attr->value_ = value;
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::ClearAttr(const QName& name) {
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* last_attr = NULL;
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = first_attr_; attr; attr = attr->next_attr_) {
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (attr->name_ == name)
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_attr = attr;
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!attr)
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!last_attr)
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_attr_ = attr->next_attr_;
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  else
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_attr->next_attr_ = attr->next_attr_;
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (last_attr_ == attr)
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_attr_ = last_attr;
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  delete attr;
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlChild* XmlElement::FirstChild() {
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return first_child_;
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement* XmlElement::FirstElement() {
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = first_child_; pChild; pChild = pChild->next_child_) {
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText())
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement();
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement* XmlElement::NextElement() {
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = next_child_; pChild; pChild = pChild->next_child_) {
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText())
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement();
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement* XmlElement::FirstWithNamespace(const std::string& ns) {
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = first_child_; pChild; pChild = pChild->next_child_) {
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText() && pChild->AsElement()->Name().Namespace() == ns)
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement();
2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement *
2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::NextWithNamespace(const std::string& ns) {
2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = next_child_; pChild; pChild = pChild->next_child_) {
2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText() && pChild->AsElement()->Name().Namespace() == ns)
2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement();
2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement *
2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::FirstNamed(const QName& name) {
2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = first_child_; pChild; pChild = pChild->next_child_) {
2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText() && pChild->AsElement()->Name() == name)
2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement();
2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement *
3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::FirstNamed(const StaticQName& name) {
3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = first_child_; pChild; pChild = pChild->next_child_) {
3035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText() && pChild->AsElement()->Name() == name)
3045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement();
3055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement *
3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::NextNamed(const QName& name) {
3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = next_child_; pChild; pChild = pChild->next_child_) {
3135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText() && pChild->AsElement()->Name() == name)
3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement();
3155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
3175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement *
3205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::NextNamed(const StaticQName& name) {
3215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
3225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = next_child_; pChild; pChild = pChild->next_child_) {
3235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText() && pChild->AsElement()->Name() == name)
3245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement();
3255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return NULL;
3275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement* XmlElement::FindOrAddNamedChild(const QName& name) {
3305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlElement* child = FirstNamed(name);
3315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!child) {
3325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    child = new XmlElement(name);
3335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AddElement(child);
3345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return child;
3375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst std::string XmlElement::TextNamed(const QName& name) const {
3405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pChild;
3415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pChild = first_child_; pChild; pChild = pChild->next_child_) {
3425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!pChild->IsText() && pChild->AsElement()->Name() == name)
3435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return pChild->AsElement()->BodyText();
3445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return std::string();
3465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::InsertChildAfter(XmlChild* predecessor, XmlChild* next) {
3495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (predecessor == NULL) {
3505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    next->next_child_ = first_child_;
3515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_child_ = next;
3525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  else {
3545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    next->next_child_ = predecessor->next_child_;
3555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    predecessor->next_child_ = next;
3565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::RemoveChildAfter(XmlChild* predecessor) {
3605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* next;
3615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (predecessor == NULL) {
3635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    next = first_child_;
3645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_child_ = next->next_child_;
3655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  else {
3675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    next = predecessor->next_child_;
3685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    predecessor->next_child_ = next->next_child_;
3695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (last_child_ == next)
3725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_child_ = predecessor;
3735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  delete next;
3755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::AddAttr(const QName& name, const std::string& value) {
3785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT(!HasAttr(name));
3795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr ** pprev = last_attr_ ? &(last_attr_->next_attr_) : &first_attr_;
3815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  last_attr_ = (*pprev = new XmlAttr(name, value));
3825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::AddAttr(const QName& name, const std::string& value,
3855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         int depth) {
3865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlElement* element = this;
3875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (depth--) {
3885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    element = element->last_child_->AsElement();
3895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  element->AddAttr(name, value);
3915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::AddParsedText(const char* cstr, int len) {
3945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (len == 0)
3955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
3965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (last_child_ && last_child_->IsText()) {
3985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_child_->AsText()->AddParsedText(cstr, len);
3995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
4005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
4015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild ** pprev = last_child_ ? &(last_child_->next_child_) : &first_child_;
4025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  last_child_ = *pprev = new XmlText(cstr, len);
4035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::AddCDATAText(const char* buf, int len) {
4065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cdata_ = true;
4075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  AddParsedText(buf, len);
4085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::AddText(const std::string& text) {
4115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (text == STR_EMPTY)
4125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
4135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (last_child_ && last_child_->IsText()) {
4155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    last_child_->AsText()->AddText(text);
4165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
4175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
4185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild ** pprev = last_child_ ? &(last_child_->next_child_) : &first_child_;
4195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  last_child_ = *pprev = new XmlText(text);
4205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::AddText(const std::string& text, int depth) {
4235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // note: the first syntax is ambigious for msvc 6
4245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // XmlElement* pel(this);
4255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlElement* element = this;
4265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (depth--) {
4275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    element = element->last_child_->AsElement();
4285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
4295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  element->AddText(text);
4305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::AddElement(XmlElement *child) {
4335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (child == NULL)
4345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
4355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild ** pprev = last_child_ ? &(last_child_->next_child_) : &first_child_;
4375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *pprev = child;
4385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  last_child_ = child;
4395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  child->next_child_ = NULL;
4405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::AddElement(XmlElement *child, int depth) {
4435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlElement* element = this;
4445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (depth--) {
4455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    element = element->last_child_->AsElement();
4465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
4475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  element->AddElement(child);
4485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::ClearNamedChildren(const QName& name) {
4515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* prev_child = NULL;
4525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* next_child;
4535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* child;
4545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (child = FirstChild(); child; child = next_child) {
4555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    next_child = child->NextChild();
4565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!child->IsText() && child->AsElement()->Name() == name)
4575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    {
4585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      RemoveChildAfter(prev_child);
4595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      continue;
4605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
4615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    prev_child = child;
4625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
4635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::ClearAttributes() {
4665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
4675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = first_attr_; attr; ) {
4685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    XmlAttr* to_delete = attr;
4695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    attr = attr->next_attr_;
4705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    delete to_delete;
4715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
4725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  first_attr_ = last_attr_ = NULL;
4735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmlElement::ClearChildren() {
4765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pchild;
4775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pchild = first_child_; pchild; ) {
4785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    XmlChild* to_delete = pchild;
4795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pchild = pchild->next_child_;
4805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    delete to_delete;
4815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
4825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  first_child_ = last_child_ = NULL;
4835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstd::string XmlElement::Str() const {
4865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::stringstream ss;
4875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlPrinter::PrintXml(&ss, this);
4885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return ss.str();
4895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement* XmlElement::ForStr(const std::string& str) {
4925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlBuilder builder;
4935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlParser::ParseXml(&builder, str);
4945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return builder.CreateElement();
4955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement::~XmlElement() {
4985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlAttr* attr;
4995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (attr = first_attr_; attr; ) {
5005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    XmlAttr* to_delete = attr;
5015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    attr = attr->next_attr_;
5025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    delete to_delete;
5035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
5045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlChild* pchild;
5065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (pchild = first_child_; pchild; ) {
5075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    XmlChild* to_delete = pchild;
5085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pchild = pchild->next_child_;
5095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    delete to_delete;
5105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
5115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
5125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace buzz
514