Commit 91e23a4b authored by Thomas Hartmann's avatar Thomas Hartmann Committed by Daniel Molkentin
Browse files

Welcomepage: remove rss feed



MultiFeedRssModel gets removed since it is not used anymore.

Change-Id: I955e18cc3abb55468b1afdaf9785f74f4b522357
Reviewed-by: default avatarDaniel Molkentin <daniel.molkentin@nokia.com>
parent 334dc840
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#include "multifeedrssmodel.h"
#include <QtCore/QTimer>
#include <QtCore/QThread>
#include <QtCore/QXmlStreamReader>
#include <QtCore/QCoreApplication>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <utils/networkaccessmanager.h>
#include <QDebug>
namespace Welcome {
namespace Internal {
QString shortenHtml(QString html)
{
html.replace(QLatin1String("<a"), QLatin1String("<i"));
html.replace(QLatin1String("</a"), QLatin1String("</i"));
int firstParaEnd = html.indexOf(QLatin1String("</p>")); // XHTML
if (firstParaEnd < 0) {
const QString paraStart = QLatin1String("<p>");
firstParaEnd = html.indexOf(paraStart);
if (firstParaEnd > 0)
firstParaEnd = html.indexOf(paraStart, firstParaEnd + paraStart.size());
}
const int firstParaEndBr = html.indexOf(QLatin1String("<br"));
int truncationPos = html.size();
if (firstParaEnd > 0 && firstParaEnd < truncationPos)
truncationPos = firstParaEnd;
if (firstParaEndBr > 0 && firstParaEndBr < truncationPos)
truncationPos = firstParaEndBr;
if (truncationPos < html.size())
html.truncate(truncationPos);
return html;
}
class RssReader {
public:
Internal::RssItem parseItem() {
RssItem item;
item.source = requestUrl;
item.blogIcon = blogIcon;
item.blogName = blogName;
while (!streamReader.atEnd()) {
switch (streamReader.readNext()) {
case QXmlStreamReader::StartElement:
if (streamReader.name() == QLatin1String("title"))
item.title = streamReader.readElementText();
else if (streamReader.name() == QLatin1String("link"))
item.link = streamReader.readElementText();
else if (streamReader.name() == QLatin1String("pubDate")) {
QString dateStr = streamReader.readElementText();
// fixme: honor time zone!
const int plusPos = dateStr.indexOf(QLatin1Char('+'));
if (plusPos > 0)
dateStr.truncate(plusPos - 1);
item.pubDate = QDateTime::fromString(dateStr, QLatin1String("ddd, dd MMM yyyy HH:mm:ss"));
}
else if (streamReader.name() == QLatin1String("description"))
item.description = shortenHtml(streamReader.readElementText());
break;
case QXmlStreamReader::EndElement:
if (streamReader.name() == QLatin1String("item"))
return item;
break;
default:
break;
}
}
return RssItem();
}
Internal::RssItemList parse(QNetworkReply *reply) {
QUrl source = reply->request().url();
requestUrl = source.toString();
streamReader.setDevice(reply);
Internal::RssItemList list;
while (!streamReader.atEnd()) {
switch (streamReader.readNext()) {
case QXmlStreamReader::StartElement:
if (streamReader.name() == QLatin1String("item"))
list.append(parseItem());
else if (streamReader.name() == QLatin1String("title"))
blogName = streamReader.readElementText();
else if (streamReader.name() == QLatin1String("link")) {
if (!streamReader.namespaceUri().isEmpty())
break;
QString favIconString(streamReader.readElementText());
QUrl favIconUrl(favIconString);
favIconUrl.setPath(QLatin1String("favicon.ico"));
blogIcon = favIconUrl.toString();
}
break;
default:
break;
}
}
return list;
}
private:
QXmlStreamReader streamReader;
QString requestUrl;
QString blogIcon;
QString blogName;
};
} // namespace Internal
MultiFeedRssModel::MultiFeedRssModel(QObject *parent) :
QAbstractListModel(parent),
m_networkAccessManager(new Utils::NetworkAccessManager),
m_articleCount(0)
{
//m_namThread = new QThread;
//m_networkAccessManager->moveToThread(m_namThread);
connect(m_networkAccessManager, SIGNAL(finished(QNetworkReply*)),
SLOT(appendFeedData(QNetworkReply*)), Qt::QueuedConnection);
//m_namThread->start();
//qDebug() << "MainThread" << QThread::currentThread();
QHash<int, QByteArray> roleNames;
roleNames[TitleRole] = "title";
roleNames[DescriptionRole] = "description";
roleNames[PubDateRole] = "pubDate";
roleNames[LinkRole] = "link";
roleNames[BlogNameRole] = "blogName";
roleNames[BlogIconRole] = "blogIcon";
setRoleNames(roleNames);
}
MultiFeedRssModel::~MultiFeedRssModel()
{
//m_namThread->exit();
//delete m_namThread;
}
void MultiFeedRssModel::addFeed(const QString& feed)
{
QMetaObject::invokeMethod(m_networkAccessManager, "getUrl",
Qt::QueuedConnection, Q_ARG(QUrl, feed));
}
bool sortForPubDate(const Internal::RssItem& item1, const Internal::RssItem& item2)
{
return item1.pubDate > item2.pubDate;
}
void MultiFeedRssModel::appendFeedData(QNetworkReply *reply)
{
Internal::RssReader reader;
m_aggregatedFeed.append(reader.parse(reply));
qSort(m_aggregatedFeed.begin(), m_aggregatedFeed.end(), sortForPubDate);
setArticleCount(m_aggregatedFeed.size());
reset();
}
void MultiFeedRssModel::removeFeed(const QString &feed)
{
QMutableListIterator<Internal::RssItem> it(m_aggregatedFeed);
while (it.hasNext()) {
Internal::RssItem item = it.next();
if (item.source == feed)
it.remove();
}
setArticleCount(m_aggregatedFeed.size());
}
int MultiFeedRssModel::rowCount(const QModelIndex &) const
{
return m_aggregatedFeed.size();
}
QVariant MultiFeedRssModel::data(const QModelIndex &index, int role) const
{
Internal::RssItem item = m_aggregatedFeed.at(index.row());
switch (role) {
case Qt::DisplayRole: // fall through
case TitleRole:
return item.title;
case DescriptionRole:
return item.description;
case PubDateRole:
return item.pubDate;
case LinkRole:
return item.link;
case BlogNameRole:
return item.blogName;
case BlogIconRole:
return item.blogIcon;
}
return QVariant();
}
} // namespace Utils
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef MULTIFEEDRSSMODEL_H
#define MULTIFEEDRSSMODEL_H
#include "welcome_global.h"
#include <QtCore/QAbstractListModel>
#include <QtCore/QStringList>
#include <QtCore/QDateTime>
QT_BEGIN_NAMESPACE
class QThread;
class QNetworkReply;
class QNetworkAccessManager;
QT_END_NAMESPACE
namespace Welcome {
namespace Internal {
struct RssItem {
QString source;
QString title;
QString link;
QString description;
QString blogName;
QString blogIcon;
QDateTime pubDate;
};
typedef QList<RssItem> RssItemList;
} // namespace Internal
class NetworkAccessManager;
enum RssRoles { TitleRole = Qt::UserRole+1, DescriptionRole, LinkRole,
PubDateRole, BlogNameRole, BlogIconRole };
class MultiFeedRssModel : public QAbstractListModel {
Q_OBJECT
Q_PROPERTY(int articleCount READ articleCount WRITE setArticleCount NOTIFY articleCountChanged)
public:
explicit MultiFeedRssModel(QObject *parent);
~MultiFeedRssModel();
void addFeed(const QString& feed);
void removeFeed(const QString& feed);
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
int articleCount() const { return m_articleCount; }
public slots:
void setArticleCount(int arg)
{
if (m_articleCount != arg) {
m_articleCount = arg;
emit articleCountChanged(arg);
}
}
signals:
void articleCountChanged(int arg);
private slots:
void appendFeedData(QNetworkReply *reply);
private:
QStringList m_sites;
Internal::RssItemList m_aggregatedFeed;
QNetworkAccessManager *m_networkAccessManager;
QThread *m_namThread;
int m_articleCount;
};
} // namespace Utils
#endif // MULTIFEEDRSSMODEL_H
......@@ -6,11 +6,9 @@ include(../../qtcreatorplugin.pri)
include(welcome_dependencies.pri)
HEADERS += welcomeplugin.h \
welcome_global.h \
multifeedrssmodel.h
welcome_global.h
SOURCES += welcomeplugin.cpp \
multifeedrssmodel.cpp
SOURCES += welcomeplugin.cpp
DEFINES += WELCOME_LIBRARY
......
......@@ -31,7 +31,6 @@
**************************************************************************/
#include "welcomeplugin.h"
#include "multifeedrssmodel.h"
#include <extensionsystem/pluginmanager.h>
......@@ -188,26 +187,8 @@ bool sortFunction(Utils::IWelcomePage * a, Utils::IWelcomePage *b)
return a->priority() < b->priority();
}
void WelcomeMode::facilitateQml(QDeclarativeEngine *engine)
void WelcomeMode::facilitateQml(QDeclarativeEngine * /*engine*/)
{
const QString feedGroupName = QLatin1String("Feeds");
MultiFeedRssModel *rssModel = new MultiFeedRssModel(this);
QSettings *settings = Core::ICore::instance()->settings();
if (settings->childGroups().contains(feedGroupName)) {
int size = settings->beginReadArray(feedGroupName);
const QString url = QLatin1String("url");
for (int i = 0; i < size; ++i) {
settings->setArrayIndex(i);
rssModel->addFeed(settings->value(url).toString());
}
settings->endArray();
} else {
rssModel->addFeed(QLatin1String("http://labs.trolltech.com/blogs/feed"));
rssModel->addFeed(QLatin1String("http://feeds.feedburner.com/TheQtBlog?format=xml"));
}
engine->rootContext()->setContextProperty(QLatin1String("aggregatedFeedsModel"), rssModel);
}
void WelcomeMode::initPlugins()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment