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