10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004--2005, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlelement.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <ostream> 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <sstream> 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/qname.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlbuilder.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlconstants.h" 38cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/xmllite/xmlparser.h" 39cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/xmllite/xmlprinter.h" 40cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/common.h" 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace buzz { 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlChild::~XmlChild() { 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool XmlText::IsTextImpl() const { 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement* XmlText::AsElementImpl() const { 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlText* XmlText::AsTextImpl() const { 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return const_cast<XmlText *>(this); 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlText::SetText(const std::string& text) { 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org text_ = text; 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlText::AddParsedText(const char* buf, int len) { 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org text_.append(buf, len); 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlText::AddText(const std::string& text) { 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org text_ += text; 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlText::~XmlText() { 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::XmlElement(const QName& name) : 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org name_(name), 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_attr_(NULL), 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr_(NULL), 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_child_(NULL), 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_(NULL), 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cdata_(false) { 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::XmlElement(const XmlElement& elt) : 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild(), 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org name_(elt.name_), 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_attr_(NULL), 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr_(NULL), 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_child_(NULL), 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_(NULL), 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cdata_(false) { 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // copy attributes 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr ** plast_attr = &first_attr_; 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* newAttr = NULL; 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = elt.first_attr_; attr; attr = attr->NextAttr()) { 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org newAttr = new XmlAttr(*attr); 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *plast_attr = newAttr; 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org plast_attr = &(newAttr->next_attr_); 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr_ = newAttr; 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // copy children 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild ** ppLast = &first_child_; 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* newChild = NULL; 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = elt.first_child_; pChild; pChild = pChild->NextChild()) { 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (pChild->IsText()) { 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org newChild = new XmlText(*(pChild->AsText())); 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org newChild = new XmlElement(*(pChild->AsElement())); 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *ppLast = newChild; 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ppLast = &(newChild->next_child_); 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_ = newChild; 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cdata_ = elt.cdata_; 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::XmlElement(const QName& name, bool useDefaultNs) : 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org name_(name), 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_attr_(useDefaultNs ? new XmlAttr(QN_XMLNS, name.Namespace()) : NULL), 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr_(first_attr_), 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_child_(NULL), 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_(NULL), 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cdata_(false) { 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool XmlElement::IsTextImpl() const { 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement* XmlElement::AsElementImpl() const { 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return const_cast<XmlElement *>(this); 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlText* XmlElement::AsTextImpl() const { 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst std::string XmlElement::BodyText() const { 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (first_child_ && first_child_->IsText() && last_child_ == first_child_) { 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return first_child_->AsText()->Text(); 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return std::string(); 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::SetBodyText(const std::string& text) { 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (text.empty()) { 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ClearChildren(); 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (first_child_ == NULL) { 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddText(text); 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (first_child_->IsText() && last_child_ == first_child_) { 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_child_->AsText()->SetText(text); 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ClearChildren(); 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddText(text); 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst QName XmlElement::FirstElementName() const { 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const XmlElement* element = FirstElement(); 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (element == NULL) 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return QName(); 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return element->Name(); 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlAttr* XmlElement::FirstAttr() { 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return first_attr_; 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst std::string XmlElement::Attr(const StaticQName& name) const { 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = first_attr_; attr; attr = attr->next_attr_) { 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (attr->name_ == name) 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return attr->value_; 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return std::string(); 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst std::string XmlElement::Attr(const QName& name) const { 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = first_attr_; attr; attr = attr->next_attr_) { 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (attr->name_ == name) 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return attr->value_; 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return std::string(); 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool XmlElement::HasAttr(const StaticQName& name) const { 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = first_attr_; attr; attr = attr->next_attr_) { 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (attr->name_ == name) 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool XmlElement::HasAttr(const QName& name) const { 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = first_attr_; attr; attr = attr->next_attr_) { 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (attr->name_ == name) 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::SetAttr(const QName& name, const std::string& value) { 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = first_attr_; attr; attr = attr->next_attr_) { 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (attr->name_ == name) 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!attr) { 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org attr = new XmlAttr(name, value); 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (last_attr_) 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr_->next_attr_ = attr; 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_attr_ = attr; 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr_ = attr; 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org attr->value_ = value; 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::ClearAttr(const QName& name) { 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* last_attr = NULL; 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = first_attr_; attr; attr = attr->next_attr_) { 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (attr->name_ == name) 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr = attr; 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!attr) 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!last_attr) 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_attr_ = attr->next_attr_; 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr->next_attr_ = attr->next_attr_; 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (last_attr_ == attr) 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr_ = last_attr; 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete attr; 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlChild* XmlElement::FirstChild() { 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return first_child_; 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement* XmlElement::FirstElement() { 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = first_child_; pChild; pChild = pChild->next_child_) { 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText()) 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement(); 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement* XmlElement::NextElement() { 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = next_child_; pChild; pChild = pChild->next_child_) { 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText()) 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement(); 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement* XmlElement::FirstWithNamespace(const std::string& ns) { 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = first_child_; pChild; pChild = pChild->next_child_) { 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText() && pChild->AsElement()->Name().Namespace() == ns) 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement(); 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement * 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::NextWithNamespace(const std::string& ns) { 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = next_child_; pChild; pChild = pChild->next_child_) { 2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText() && pChild->AsElement()->Name().Namespace() == ns) 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement(); 2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement * 2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::FirstNamed(const QName& name) { 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = first_child_; pChild; pChild = pChild->next_child_) { 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText() && pChild->AsElement()->Name() == name) 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement(); 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement * 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::FirstNamed(const StaticQName& name) { 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = first_child_; pChild; pChild = pChild->next_child_) { 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText() && pChild->AsElement()->Name() == name) 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement(); 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement * 3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::NextNamed(const QName& name) { 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = next_child_; pChild; pChild = pChild->next_child_) { 3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText() && pChild->AsElement()->Name() == name) 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement(); 3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement * 3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::NextNamed(const StaticQName& name) { 3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = next_child_; pChild; pChild = pChild->next_child_) { 3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText() && pChild->AsElement()->Name() == name) 3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement(); 3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement* XmlElement::FindOrAddNamedChild(const QName& name) { 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlElement* child = FirstNamed(name); 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!child) { 3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org child = new XmlElement(name); 3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddElement(child); 3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return child; 3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst std::string XmlElement::TextNamed(const QName& name) const { 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pChild; 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pChild = first_child_; pChild; pChild = pChild->next_child_) { 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pChild->IsText() && pChild->AsElement()->Name() == name) 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return pChild->AsElement()->BodyText(); 3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return std::string(); 3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::InsertChildAfter(XmlChild* predecessor, XmlChild* next) { 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (predecessor == NULL) { 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org next->next_child_ = first_child_; 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_child_ = next; 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else { 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org next->next_child_ = predecessor->next_child_; 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org predecessor->next_child_ = next; 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::RemoveChildAfter(XmlChild* predecessor) { 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* next; 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (predecessor == NULL) { 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org next = first_child_; 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_child_ = next->next_child_; 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else { 3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org next = predecessor->next_child_; 3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org predecessor->next_child_ = next->next_child_; 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (last_child_ == next) 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_ = predecessor; 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete next; 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::AddAttr(const QName& name, const std::string& value) { 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(!HasAttr(name)); 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr ** pprev = last_attr_ ? &(last_attr_->next_attr_) : &first_attr_; 3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_attr_ = (*pprev = new XmlAttr(name, value)); 3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::AddAttr(const QName& name, const std::string& value, 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int depth) { 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlElement* element = this; 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while (depth--) { 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org element = element->last_child_->AsElement(); 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org element->AddAttr(name, value); 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::AddParsedText(const char* cstr, int len) { 3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (len == 0) 3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (last_child_ && last_child_->IsText()) { 3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_->AsText()->AddParsedText(cstr, len); 3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild ** pprev = last_child_ ? &(last_child_->next_child_) : &first_child_; 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_ = *pprev = new XmlText(cstr, len); 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::AddCDATAText(const char* buf, int len) { 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cdata_ = true; 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddParsedText(buf, len); 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::AddText(const std::string& text) { 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (text == STR_EMPTY) 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (last_child_ && last_child_->IsText()) { 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_->AsText()->AddText(text); 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild ** pprev = last_child_ ? &(last_child_->next_child_) : &first_child_; 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_ = *pprev = new XmlText(text); 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::AddText(const std::string& text, int depth) { 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // note: the first syntax is ambigious for msvc 6 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // XmlElement* pel(this); 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlElement* element = this; 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while (depth--) { 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org element = element->last_child_->AsElement(); 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org element->AddText(text); 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::AddElement(XmlElement *child) { 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (child == NULL) 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild ** pprev = last_child_ ? &(last_child_->next_child_) : &first_child_; 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *pprev = child; 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_child_ = child; 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org child->next_child_ = NULL; 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::AddElement(XmlElement *child, int depth) { 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlElement* element = this; 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while (depth--) { 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org element = element->last_child_->AsElement(); 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org element->AddElement(child); 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::ClearNamedChildren(const QName& name) { 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* prev_child = NULL; 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* next_child; 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* child; 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (child = FirstChild(); child; child = next_child) { 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org next_child = child->NextChild(); 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!child->IsText() && child->AsElement()->Name() == name) 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org { 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RemoveChildAfter(prev_child); 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org continue; 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org prev_child = child; 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::ClearAttributes() { 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = first_attr_; attr; ) { 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* to_delete = attr; 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org attr = attr->next_attr_; 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete to_delete; 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_attr_ = last_attr_ = NULL; 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid XmlElement::ClearChildren() { 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pchild; 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pchild = first_child_; pchild; ) { 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* to_delete = pchild; 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pchild = pchild->next_child_; 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete to_delete; 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first_child_ = last_child_ = NULL; 4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstd::string XmlElement::Str() const { 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::stringstream ss; 4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlPrinter::PrintXml(&ss, this); 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return ss.str(); 4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement* XmlElement::ForStr(const std::string& str) { 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, str); 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return builder.CreateElement(); 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlElement::~XmlElement() { 4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* attr; 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (attr = first_attr_; attr; ) { 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlAttr* to_delete = attr; 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org attr = attr->next_attr_; 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete to_delete; 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* pchild; 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (pchild = first_child_; pchild; ) { 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlChild* to_delete = pchild; 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pchild = pchild->next_child_; 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete to_delete; 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace buzz 514