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/xmlbuilder.h"
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector>
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <set>
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h"
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlconstants.h"
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlelement.h"
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace buzz {
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::XmlBuilder() :
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pelCurrent_(NULL),
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pelRoot_(NULL),
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pvParents_(new std::vector<XmlElement *>()) {
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::Reset() {
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pelRoot_.reset();
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pelCurrent_ = NULL;
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pvParents_->clear();
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement *
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::BuildElement(XmlParseContext * pctx,
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                              const char * name, const char ** atts) {
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  QName tagName(pctx->ResolveQName(name, false));
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (tagName.IsEmpty())
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return NULL;
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlElement * pelNew = new XmlElement(tagName);
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!*atts)
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return pelNew;
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::set<QName> seenNonlocalAtts;
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (*atts) {
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    QName attName(pctx->ResolveQName(*atts, true));
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (attName.IsEmpty()) {
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      delete pelNew;
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return NULL;
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // verify that namespaced names are unique
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!attName.Namespace().empty()) {
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (seenNonlocalAtts.count(attName)) {
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        delete pelNew;
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        return NULL;
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      seenNonlocalAtts.insert(attName);
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pelNew->AddAttr(attName, std::string(*(atts + 1)));
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    atts += 2;
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return pelNew;
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::StartElement(XmlParseContext * pctx,
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                              const char * name, const char ** atts) {
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmlElement * pelNew = BuildElement(pctx, name, atts);
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (pelNew == NULL) {
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pctx->RaiseError(XML_ERROR_SYNTAX);
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!pelCurrent_) {
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pelCurrent_ = pelNew;
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pelRoot_.reset(pelNew);
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pvParents_->push_back(NULL);
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pelCurrent_->AddElement(pelNew);
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pvParents_->push_back(pelCurrent_);
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pelCurrent_ = pelNew;
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::EndElement(XmlParseContext * pctx, const char * name) {
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  UNUSED(pctx);
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  UNUSED(name);
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pelCurrent_ = pvParents_->back();
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pvParents_->pop_back();
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::CharacterData(XmlParseContext * pctx,
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                               const char * text, int len) {
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  UNUSED(pctx);
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (pelCurrent_) {
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pelCurrent_->AddParsedText(text, len);
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::Error(XmlParseContext * pctx, XML_Error err) {
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  UNUSED(pctx);
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  UNUSED(err);
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pelRoot_.reset(NULL);
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pelCurrent_ = NULL;
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pvParents_->clear();
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement *
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::CreateElement() {
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return pelRoot_.release();
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlElement *
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::BuiltElement() {
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return pelRoot_.get();
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmlBuilder::~XmlBuilder() {
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace buzz
148