diff -r 6b5f25f057c2 -r 1d51612454b5 bookmarks/xbelreader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bookmarks/xbelreader.cpp Fri Sep 17 12:10:47 2010 -0400 @@ -0,0 +1,201 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License as published by +* the Free Software Foundation, version 2.1 of the License. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, +* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/". +* +*/ +#include +#include +#include + +#include "xbelreader.h" +#include "BookmarksManager.h" + +XbelReader::XbelReader(BookmarksManager *bmgr) : + m_bmgr(bmgr), m_xml(new QXmlStreamReader) +{ +} + +XbelReader::~XbelReader() { + if(m_xml) delete m_xml; +} + +bool XbelReader::read(QIODevice *device) +{ + if(!device) { + m_xml->raiseError(QObject::tr("Invalid Device passed into XBEL Reader.")); + } + if(!m_bmgr) { + m_xml->raiseError(QObject::tr("Invalid BookmarkManager passed into XBEL Reader.")); + } else { + m_xml->setDevice(device); + if(m_xml->readNextStartElement()) { + if(m_xml->name() == "xbel" && + m_xml->attributes().value("version") == "1.0") + readXBEL(); + else + m_xml->raiseError(QObject::tr("The file is not an XBEL version 1.0 file.")); + } else + m_xml->raiseError(QObject::tr("The file is not an XBEL version 1.0 file.")); + } + + return !m_xml->error(); +} + +/** + * This function should be called before reading any xml elements + * It attempts to validate that the file being read is actually an + * xbel file. + * @return whether the file is an XBEL file. + */ +bool XbelReader::isValidXbel() +{ + // The xbel element must exist and must be version 1.0 + return true; +} + +QString XbelReader::errorString() const +{ + return QObject::tr("%1\nLine %2, column %3") + .arg(m_xml->errorString()) + .arg(m_xml->lineNumber()) + .arg(m_xml->columnNumber()); +} + +void XbelReader::readXBEL() +{ + QString folder = ""; + QList folders; + while (m_xml->readNextStartElement()) { + if (m_xml->name() == "folder") + readFolder(folders); + else if (m_xml->name() == "bookmark") + readBookmark(folders); + else + m_xml->skipCurrentElement(); + } +} + +QString XbelReader::readFolder(QList& parentFolders) +{ + QString folderName = ""; + + while (m_xml->readNextStartElement()) { + if (m_xml->name() == "title") + folderName = m_xml->readElementText(); + else if (m_xml->name() == "folder") { + QList folders; + folders = folders + parentFolders; + if(!folderName.isEmpty()) + folders.append(folderName); + readFolder(folders); + } else if (m_xml->name() == "bookmark") { + QList folders; + folders = folders + parentFolders; + if(!folderName.isEmpty()) + folders.append(folderName); + readBookmark(folders); + } else + m_xml->skipCurrentElement(); + } + return folderName; +} + +void XbelReader::readBookmark(QList& parentFolders) +{ + QXmlStreamAttributes attrs = m_xml->attributes(); + + // if there is no URL attribute skip this bookmark. + if(!attrs.hasAttribute("href")) { + m_xml->skipCurrentElement(); + return; + } + + QString url = attrs.value("href").toString(); + QString title = "Untitled"; + QString desc = ""; + QList tags; + tags = tags + parentFolders; + + while (m_xml->readNextStartElement()) { + if (m_xml->name() == "title") + title = m_xml->readElementText(); + else if(m_xml->name() == "desc") + desc = m_xml->readElementText(); + else if(m_xml->name() == "info") + readInfo(tags); + else + m_xml->skipCurrentElement(); + } + + int bmID = m_bmgr->addBookmark(title, url); + if (bmID > 0) { + QList::iterator iter; + for (iter = tags.begin(); iter != tags.end(); ++iter) + m_bmgr->addTag(bmID, *iter); + } +} + +/** + * Reads the info element. + * @param tags - A reference to a list of string tags + */ +void XbelReader::readInfo(QList& tags) +{ + QString owner = "http://www.nokia.com"; + while(m_xml->readNextStartElement()) { + if(m_xml->name() == "metadata") + readMetadata(tags, owner); + else + m_xml->skipCurrentElement(); + } +} + +/** + * This function reads the metadata XBEL tag. + * @param tags - A reference to a list of strings. This is passed into + * readTags. + * @param owner - A reference to the owner string. This is to allow for + * future support for this attribute. + */ +void XbelReader::readMetadata(QList& tags, QString &owner) +{ + if(m_xml->attributes().hasAttribute("owner")) + owner = m_xml->attributes().value("owner").toString(); + while(m_xml->readNextStartElement()) { + if(m_xml->name() == "tags") + readTags(tags); + else + m_xml->skipCurrentElement(); + } + +} + +/** + * Reads the tags and tag attributes, adding all tags found to + * the list of string tags passed into the function. + * @param tags - Reference to a list of string tags. + */ +void XbelReader::readTags(QList& tags) +{ + while(m_xml->readNextStartElement()) { + if(m_xml->name() == "tag") + tags.append(m_xml->readElementText()); + else + m_xml->skipCurrentElement(); + } + +} +