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/xmlparser.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlconstants.h" 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlelement.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlnsstack.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlnsstack.h" 37cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/common.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace buzz { 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgStartElementCallback(void * userData, const char *name, const char **atts) { 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (static_cast<XmlParser *>(userData))->ExpatStartElement(name, atts); 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgEndElementCallback(void * userData, const char *name) { 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (static_cast<XmlParser *>(userData))->ExpatEndElement(name); 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgCharacterDataCallback(void * userData, const char *text, int len) { 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (static_cast<XmlParser *>(userData))->ExpatCharacterData(text, len); 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlDeclCallback(void * userData, const char * ver, const char * enc, int st) { 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (static_cast<XmlParser *>(userData))->ExpatXmlDecl(ver, enc, st); 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::XmlParser(XmlParseHandler *pxph) : 639750eddb6cf86a3958f5fedb4c6ada2d95069919sergeyu@chromium.org pxph_(pxph), sentError_(false) { 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expat_ = XML_ParserCreate(NULL); 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_SetUserData(expat_, this); 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_SetElementHandler(expat_, StartElementCallback, EndElementCallback); 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_SetCharacterDataHandler(expat_, CharacterDataCallback); 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_SetXmlDeclHandler(expat_, XmlDeclCallback); 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::Reset() { 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!XML_ParserReset(expat_, NULL)) { 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_ParserFree(expat_); 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expat_ = XML_ParserCreate(NULL); 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_SetUserData(expat_, this); 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_SetElementHandler(expat_, StartElementCallback, EndElementCallback); 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_SetCharacterDataHandler(expat_, CharacterDataCallback); 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_SetXmlDeclHandler(expat_, XmlDeclCallback); 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.Reset(); 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sentError_ = false; 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic bool 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser_StartsWithXmlns(const char *name) { 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return name[0] == 'x' && 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org name[1] == 'm' && 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org name[2] == 'l' && 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org name[3] == 'n' && 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org name[4] == 's'; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ExpatStartElement(const char *name, const char **atts) { 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char **att; 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.StartElement(); 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (att = atts; *att; att += 2) { 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (XmlParser_StartsWithXmlns(*att)) { 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if ((*att)[5] == '\0') { 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.StartNamespace("", *(att + 1)); 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else if ((*att)[5] == ':') { 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (**(att + 1) == '\0') { 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // In XML 1.0 empty namespace illegal with prefix (not in 1.1) 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.RaiseError(XML_ERROR_SYNTAX); 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.StartNamespace((*att) + 6, *(att + 1)); 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.SetPosition(XML_GetCurrentLineNumber(expat_), 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_GetCurrentColumnNumber(expat_), 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_GetCurrentByteIndex(expat_)); 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pxph_->StartElement(&context_, name, atts); 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ExpatEndElement(const char *name) { 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.EndElement(); 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.SetPosition(XML_GetCurrentLineNumber(expat_), 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_GetCurrentColumnNumber(expat_), 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_GetCurrentByteIndex(expat_)); 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pxph_->EndElement(&context_, name); 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ExpatCharacterData(const char *text, int len) { 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.SetPosition(XML_GetCurrentLineNumber(expat_), 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_GetCurrentColumnNumber(expat_), 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_GetCurrentByteIndex(expat_)); 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pxph_->CharacterData(&context_, text, len); 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ExpatXmlDecl(const char * ver, const char * enc, int standalone) { 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (ver && std::string("1.0") != ver) { 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.RaiseError(XML_ERROR_SYNTAX); 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (standalone == 0) { 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.RaiseError(XML_ERROR_SYNTAX); 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (enc && !((enc[0] == 'U' || enc[0] == 'u') && 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (enc[1] == 'T' || enc[1] == 't') && 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (enc[2] == 'F' || enc[2] == 'f') && 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org enc[3] == '-' && enc[4] =='8')) { 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.RaiseError(XML_ERROR_INCORRECT_ENCODING); 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::Parse(const char *data, size_t len, bool isFinal) { 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (sentError_) 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (XML_Parse(expat_, data, static_cast<int>(len), isFinal) != 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_STATUS_OK) { 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.SetPosition(XML_GetCurrentLineNumber(expat_), 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_GetCurrentColumnNumber(expat_), 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_GetCurrentByteIndex(expat_)); 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org context_.RaiseError(XML_GetErrorCode(expat_)); 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) { 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sentError_ = true; 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pxph_->Error(&context_, context_.RaisedError()); 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::~XmlParser() { 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XML_ParserFree(expat_); 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseXml(XmlParseHandler *pxph, std::string text) { 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser parser(pxph); 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org parser.Parse(text.c_str(), text.length(), true); 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1999750eddb6cf86a3958f5fedb4c6ada2d95069919sergeyu@chromium.orgXmlParser::ParseContext::ParseContext() : 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmlnsstack_(), 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org raised_(XML_ERROR_NONE), 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org line_number_(0), 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org column_number_(0), 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org byte_index_(0) { 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseContext::StartNamespace(const char *prefix, const char *ns) { 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmlnsstack_.AddXmlns(*prefix ? prefix : STR_EMPTY, ns); 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseContext::StartElement() { 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmlnsstack_.PushFrame(); 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseContext::EndElement() { 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmlnsstack_.PopFrame(); 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgQName 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseContext::ResolveQName(const char* qname, bool isAttr) { 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char *c; 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (c = qname; *c; ++c) { 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (*c == ':') { 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::pair<std::string, bool> result = 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmlnsstack_.NsForPrefix(std::string(qname, c - qname)); 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!result.second) 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return QName(); 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return QName(result.first, c + 1); 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (isAttr) 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return QName(STR_EMPTY, qname); 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::pair<std::string, bool> result = xmlnsstack_.NsForPrefix(STR_EMPTY); 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!result.second) 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return QName(); 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return QName(result.first, qname); 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseContext::Reset() { 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmlnsstack_.Reset(); 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org raised_ = XML_ERROR_NONE; 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseContext::SetPosition(int line, int column, 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org long byte_index) { 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org line_number_ = line; 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org column_number_ = column; 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org byte_index_ = byte_index; 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseContext::GetPosition(unsigned long * line, 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org unsigned long * column, 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org unsigned long * byte_index) { 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (line != NULL) { 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *line = static_cast<unsigned long>(line_number_); 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (column != NULL) { 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *column = static_cast<unsigned long>(column_number_); 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (byte_index != NULL) { 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *byte_index = static_cast<unsigned long>(byte_index_); 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgXmlParser::ParseContext::~ParseContext() { 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace buzz 279