1/* 2 * Copyright (C) 2009, 2010, 2011, 2012 Research In Motion Limited. All rights reserved. 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19#include "config.h" 20#include "RSS10Parser.h" 21 22#include "BlackBerryPlatformAssert.h" 23#include "libxml/parser.h" 24#include "libxml/xmlwriter.h" 25 26namespace WebCore { 27 28RSS10Parser::RSS10Parser() 29{ 30} 31 32bool RSS10Parser::parseBuffer(const char* buffer, int length, const char* url, const char* encoding) 33{ 34 return parseXmlDoc(xmlReadMemory(buffer, length, url, encoding, XML_PARSE_NOBLANKS | XML_PARSE_NONET)); 35} 36 37bool RSS10Parser::parseXmlDoc(xmlDocPtr doc) 38{ 39 if (!doc) 40 return false; 41 42 xmlNode* node = xmlDocGetRootElement(doc); 43 if (!node) { 44 xmlFreeDoc(doc); 45 return false; 46 } 47 48 for (; node; node = node->next) { 49 String name(reinterpret_cast<const char*>(node->name)); 50 51 if (name == "RDF") { 52 xmlNode* childnode = node->children; 53 for (; childnode; childnode = childnode->next) { 54 if (childnode->type == XML_ELEMENT_NODE) { 55 name = String(reinterpret_cast<const char*>(childnode->name)); 56 name.makeLower(); 57 if (name == "channel") { 58 BLACKBERRY_ASSERT(!m_root); 59 if (!m_root) 60 m_root = parseFeed(childnode->children); 61 } else if (name == "item") { 62 BLACKBERRY_ASSERT(m_root); 63 if (m_root) { 64 RSSItem* item = parseItem(childnode->children); 65 if (item) 66 m_root->m_items.append(item); 67 } 68 } 69 } 70 } 71 } 72 } 73 74 xmlFreeDoc(doc); 75 76 return m_root; 77} 78 79bool RSS10Parser::parseItemBaseAttribute(RSSItemBase* item, const String& name, xmlNode* node) 80{ 81 if (name == "link") 82 item->m_link = textFromXMLNode(node); 83 else if (name == "title") 84 item->m_title = textFromXMLNode(node); 85 else if (name == "description") 86 item->m_description = textFromXMLNode(node); 87 else 88 return false; 89 90 return true; 91} 92 93RSSItem* RSS10Parser::parseItem(xmlNode* node) 94{ 95 BLACKBERRY_ASSERT(node); 96 97 RSSItem* item = new RSSItem(); 98 99 for (; node; node = node->next) { 100 String name(reinterpret_cast<const char*>(node->name)); 101 name.makeLower(); 102 103 parseItemBaseAttribute(item, name, node); 104 } 105 106 return item; 107} 108 109RSSFeed* RSS10Parser::parseFeed(xmlNode* node) 110{ 111 BLACKBERRY_ASSERT(node); 112 113 RSSFeed* feed = new RSSFeed(); 114 115 for (; node; node = node->next) { 116 String name(reinterpret_cast<const char*>(node->name)); 117 name.makeLower(); 118 119 parseItemBaseAttribute(feed, name, node); 120 } 121 122 return feed; 123} 124 125} // namespace WebCore 126