/* * 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.getLength(); 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"); }