| |
| /* |
| * Copyright 2006 The Android Open Source Project |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #include "SkXMLParser.h" |
| #include "SkStream.h" |
| #include "SkTemplates.h" |
| #include "tinyxml.h" |
| |
| static void walk_elem(SkXMLParser* parser, const TiXmlElement* elem) |
| { |
| //printf("walk_elem(%s) ", elem->Value()); |
| |
| parser->startElement(elem->Value()); |
| |
| const TiXmlAttribute* attr = elem->FirstAttribute(); |
| while (attr) |
| { |
| //printf("walk_elem_attr(%s=\"%s\") ", attr->Name(), attr->Value()); |
| |
| parser->addAttribute(attr->Name(), attr->Value()); |
| attr = attr->Next(); |
| } |
| //printf("\n"); |
| |
| const TiXmlNode* node = elem->FirstChild(); |
| while (node) |
| { |
| if (node->ToElement()) |
| walk_elem(parser, node->ToElement()); |
| else if (node->ToText()) |
| parser->text(node->Value(), strlen(node->Value())); |
| node = node->NextSibling(); |
| } |
| |
| parser->endElement(elem->Value()); |
| } |
| |
| static bool load_buf(SkXMLParser* parser, const char buf[]) |
| { |
| TiXmlDocument doc; |
| |
| (void)doc.Parse(buf); |
| if (doc.Error()) |
| { |
| printf("tinyxml error: <%s> row[%d] col[%d]\n", doc.ErrorDesc(), doc.ErrorRow(), doc.ErrorCol()); |
| return false; |
| } |
| |
| walk_elem(parser, doc.RootElement()); |
| return true; |
| } |
| |
| bool SkXMLParser::parse(SkStream& stream) |
| { |
| size_t size = stream.read(NULL, 0); |
| |
| SkAutoMalloc buffer(size + 1); |
| char* buf = (char*)buffer.get(); |
| |
| stream.read(buf, size); |
| buf[size] = 0; |
| |
| return load_buf(this, buf); |
| } |
| |
| bool SkXMLParser::parse(const char doc[], size_t len) |
| { |
| SkAutoMalloc buffer(len + 1); |
| char* buf = (char*)buffer.get(); |
| |
| memcpy(buf, doc, len); |
| buf[len] = 0; |
| |
| return load_buf(this, buf); |
| } |
| |
| void SkXMLParser::GetNativeErrorString(int error, SkString* str) |
| { |
| if (str) |
| str->set("GetNativeErrorString not implemented for TinyXml"); |
| } |