kde-extraapps/kdeplasma-addons/libs/lancelot-datamodels/XbelModel.cpp
2015-02-27 11:02:43 +00:00

163 lines
3.8 KiB
C++

/*
* Copyright (C) 2007, 2008, 2009, 2010 Ivan Cukic <ivan.cukic(at)kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser/Library General Public License version 2,
* or (at your option) any later version, as published by the Free
* Software Foundation
*
* 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/Library General Public License for more details
*
* You should have received a copy of the GNU Lesser/Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "XbelModel.h"
#include <KIcon>
#include <QFile>
namespace Lancelot {
namespace Models {
class XbelModel::Private {
public:
Private(XbelModel * parent)
: q(parent)
{}
void readXbel();
void readFolder();
void readBookmark();
QString filePath;
QXmlStreamReader xmlReader;
XbelModel * const q;
};
XbelModel::XbelModel(QString filePath)
: BaseModel(true), d(new Private(this))
{
d->filePath = filePath;
load();
}
XbelModel::~XbelModel()
{
delete d;
}
void XbelModel::reload()
{
clear();
load();
}
void XbelModel::load()
{
QFile file(d->filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
return;
}
d->xmlReader.setDevice(& file);
while (!d->xmlReader.atEnd()) {
d->xmlReader.readNext();
if (d->xmlReader.isStartElement()) {
if (d->xmlReader.name() == "xbel") {
d->readXbel();
}
}
}
}
void XbelModel::Private::readXbel()
{
while (!xmlReader.atEnd()) {
xmlReader.readNext();
if (xmlReader.isEndElement() &&
xmlReader.name() == "xbel")
break;
if (xmlReader.isStartElement()) {
if (xmlReader.name() == "folder")
readFolder();
else if (xmlReader.name() == "bookmark")
readBookmark();
}
}
}
void XbelModel::Private::readFolder()
{
while (!xmlReader.atEnd()) {
xmlReader.readNext();
if (xmlReader.isEndElement() && xmlReader.name() == "folder") {
break;
}
}
}
void XbelModel::Private::readBookmark()
{
Item bookmarkItem;
bool showBookmark = true;
KUrl url(xmlReader.attributes().value("href").toString());
bookmarkItem.data = url.url();
if (url.isLocalFile()) {
bookmarkItem.description = url.path();
} else {
bookmarkItem.description = url.url();
}
while (!xmlReader.atEnd()) {
xmlReader.readNext();
if (xmlReader.isEndElement() && xmlReader.name() == "bookmark") {
break;
}
if (xmlReader.name() == "title") {
bookmarkItem.title = xmlReader.readElementText();
} else if (xmlReader.name() == "icon") {
QString icon = xmlReader.attributes().value("name").toString();
if (!icon.isEmpty()) {
bookmarkItem.icon = KIcon(icon);
}
} else if (xmlReader.name() == "IsHidden") {
if (xmlReader.readElementText() != "false") {
showBookmark = false;
}
} else if (xmlReader.name() == "isSystemItem") {
// This is a bit dirty, but needed for a translation bug fix...
if (xmlReader.readElementText() == "true") {
bookmarkItem.title = i18n(bookmarkItem.title.toUtf8().data());
}
}
}
if (showBookmark) {
q->add(bookmarkItem);
}
}
} // namespace Models
} // namespace Lancelot
#include "moc_XbelModel.cpp"