1d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org/* 2d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org * 4d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org * Use of this source code is governed by a BSD-style license 5d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org * in the file PATENTS. All contributing project authors may 8d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org */ 10d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 11d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlparser.h" 12d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 13d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org#include <string> 14d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org#include <vector> 15d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 16d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlconstants.h" 17d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlelement.h" 18d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlnsstack.h" 19d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlnsstack.h" 20d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org#include "webrtc/base/common.h" 21d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 22d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgnamespace buzz { 23d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 24d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 25d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgstatic void 26d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgStartElementCallback(void * userData, const char *name, const char **atts) { 27d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org (static_cast<XmlParser *>(userData))->ExpatStartElement(name, atts); 28d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 29d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 30d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgstatic void 31d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgEndElementCallback(void * userData, const char *name) { 32d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org (static_cast<XmlParser *>(userData))->ExpatEndElement(name); 33d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 34d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 35d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgstatic void 36d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgCharacterDataCallback(void * userData, const char *text, int len) { 37d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org (static_cast<XmlParser *>(userData))->ExpatCharacterData(text, len); 38d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 39d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 40d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgstatic void 41d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlDeclCallback(void * userData, const char * ver, const char * enc, int st) { 42d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org (static_cast<XmlParser *>(userData))->ExpatXmlDecl(ver, enc, st); 43d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 44d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 45d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::XmlParser(XmlParseHandler *pxph) : 46d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org pxph_(pxph), sentError_(false) { 47d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org expat_ = XML_ParserCreate(NULL); 48d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_SetUserData(expat_, this); 49d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_SetElementHandler(expat_, StartElementCallback, EndElementCallback); 50d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_SetCharacterDataHandler(expat_, CharacterDataCallback); 51d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_SetXmlDeclHandler(expat_, XmlDeclCallback); 52d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 53d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 54d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 55d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::Reset() { 56d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (!XML_ParserReset(expat_, NULL)) { 57d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_ParserFree(expat_); 58d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org expat_ = XML_ParserCreate(NULL); 59d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 60d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_SetUserData(expat_, this); 61d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_SetElementHandler(expat_, StartElementCallback, EndElementCallback); 62d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_SetCharacterDataHandler(expat_, CharacterDataCallback); 63d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_SetXmlDeclHandler(expat_, XmlDeclCallback); 64d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.Reset(); 65d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org sentError_ = false; 66d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 67d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 68d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgstatic bool 69d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser_StartsWithXmlns(const char *name) { 70d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return name[0] == 'x' && 71d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org name[1] == 'm' && 72d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org name[2] == 'l' && 73d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org name[3] == 'n' && 74d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org name[4] == 's'; 75d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 76d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 77d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 78d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ExpatStartElement(const char *name, const char **atts) { 79d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) 80d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return; 81d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org const char **att; 82d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.StartElement(); 83d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org for (att = atts; *att; att += 2) { 84d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (XmlParser_StartsWithXmlns(*att)) { 85d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if ((*att)[5] == '\0') { 86d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.StartNamespace("", *(att + 1)); 87d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 88d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org else if ((*att)[5] == ':') { 89d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (**(att + 1) == '\0') { 90d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org // In XML 1.0 empty namespace illegal with prefix (not in 1.1) 91d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.RaiseError(XML_ERROR_SYNTAX); 92d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return; 93d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 94d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.StartNamespace((*att) + 6, *(att + 1)); 95d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 96d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 97d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 98d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.SetPosition(XML_GetCurrentLineNumber(expat_), 99d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_GetCurrentColumnNumber(expat_), 100d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_GetCurrentByteIndex(expat_)); 101d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org pxph_->StartElement(&context_, name, atts); 102d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 103d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 104d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 105d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ExpatEndElement(const char *name) { 106d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) 107d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return; 108d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.EndElement(); 109d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.SetPosition(XML_GetCurrentLineNumber(expat_), 110d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_GetCurrentColumnNumber(expat_), 111d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_GetCurrentByteIndex(expat_)); 112d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org pxph_->EndElement(&context_, name); 113d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 114d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 115d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 116d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ExpatCharacterData(const char *text, int len) { 117d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) 118d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return; 119d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.SetPosition(XML_GetCurrentLineNumber(expat_), 120d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_GetCurrentColumnNumber(expat_), 121d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_GetCurrentByteIndex(expat_)); 122d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org pxph_->CharacterData(&context_, text, len); 123d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 124d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 125d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 126d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ExpatXmlDecl(const char * ver, const char * enc, int standalone) { 127d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) 128d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return; 129d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 130d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (ver && std::string("1.0") != ver) { 131d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.RaiseError(XML_ERROR_SYNTAX); 132d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return; 133d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 134d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 135d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (standalone == 0) { 136d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.RaiseError(XML_ERROR_SYNTAX); 137d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return; 138d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 139d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 140d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (enc && !((enc[0] == 'U' || enc[0] == 'u') && 141d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org (enc[1] == 'T' || enc[1] == 't') && 142d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org (enc[2] == 'F' || enc[2] == 'f') && 143d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org enc[3] == '-' && enc[4] =='8')) { 144d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.RaiseError(XML_ERROR_INCORRECT_ENCODING); 145d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return; 146d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 147d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 148d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 149d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 150d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgbool 151d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::Parse(const char *data, size_t len, bool isFinal) { 152d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (sentError_) 153d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return false; 154d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 155d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (XML_Parse(expat_, data, static_cast<int>(len), isFinal) != 156d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_STATUS_OK) { 157d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.SetPosition(XML_GetCurrentLineNumber(expat_), 158d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_GetCurrentColumnNumber(expat_), 159d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_GetCurrentByteIndex(expat_)); 160d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org context_.RaiseError(XML_GetErrorCode(expat_)); 161d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 162d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 163d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (context_.RaisedError() != XML_ERROR_NONE) { 164d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org sentError_ = true; 165d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org pxph_->Error(&context_, context_.RaisedError()); 166d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return false; 167d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 168d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 169d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return true; 170d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 171d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 172d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::~XmlParser() { 173d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XML_ParserFree(expat_); 174d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 175d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 176d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 177d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseXml(XmlParseHandler *pxph, std::string text) { 178d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org XmlParser parser(pxph); 179d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org parser.Parse(text.c_str(), text.length(), true); 180d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 181d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 182d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::ParseContext() : 183d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org xmlnsstack_(), 184d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org raised_(XML_ERROR_NONE), 185d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org line_number_(0), 186d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org column_number_(0), 187d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org byte_index_(0) { 188d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 189d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 190d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 191d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::StartNamespace(const char *prefix, const char *ns) { 192d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org xmlnsstack_.AddXmlns(*prefix ? prefix : STR_EMPTY, ns); 193d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 194d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 195d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 196d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::StartElement() { 197d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org xmlnsstack_.PushFrame(); 198d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 199d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 200d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 201d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::EndElement() { 202d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org xmlnsstack_.PopFrame(); 203d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 204d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 205d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgQName 206d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::ResolveQName(const char* qname, bool isAttr) { 207d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org const char *c; 208d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org for (c = qname; *c; ++c) { 209d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (*c == ':') { 210d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org const std::pair<std::string, bool> result = 211d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org xmlnsstack_.NsForPrefix(std::string(qname, c - qname)); 212d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (!result.second) 213d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return QName(); 214d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return QName(result.first, c + 1); 215d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 216d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 217d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (isAttr) 218d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return QName(STR_EMPTY, qname); 219d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 220d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org std::pair<std::string, bool> result = xmlnsstack_.NsForPrefix(STR_EMPTY); 221d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (!result.second) 222d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return QName(); 223d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 224d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org return QName(result.first, qname); 225d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 226d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 227d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 228d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::Reset() { 229d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org xmlnsstack_.Reset(); 230d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org raised_ = XML_ERROR_NONE; 231d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 232d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 233d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 234d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::SetPosition(int line, int column, 235d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org long byte_index) { 236d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org line_number_ = line; 237d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org column_number_ = column; 238d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org byte_index_ = byte_index; 239d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 240d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 241d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgvoid 242d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::GetPosition(unsigned long * line, 243d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org unsigned long * column, 244d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org unsigned long * byte_index) { 245d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (line != NULL) { 246d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org *line = static_cast<unsigned long>(line_number_); 247d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 248d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 249d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (column != NULL) { 250d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org *column = static_cast<unsigned long>(column_number_); 251d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 252d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 253d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org if (byte_index != NULL) { 254d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org *byte_index = static_cast<unsigned long>(byte_index_); 255d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org } 256d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 257d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 258d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.orgXmlParser::ParseContext::~ParseContext() { 259d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} 260d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org 261d72a7599d46175ed29fdc0abfb27dc1be56d011bhenrike@webrtc.org} // namespace buzz 262