forked from qt-creator/qt-creator
Welcomepage: remove rss feed
MultiFeedRssModel gets removed since it is not used anymore. Change-Id: I955e18cc3abb55468b1afdaf9785f74f4b522357 Reviewed-by: Daniel Molkentin <daniel.molkentin@nokia.com>
This commit is contained in:
committed by
Daniel Molkentin
parent
334dc84072
commit
91e23a4bda
@@ -1,236 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
**
|
|
||||||
** 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
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
**
|
|
||||||
** 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)
|
include(welcome_dependencies.pri)
|
||||||
|
|
||||||
HEADERS += welcomeplugin.h \
|
HEADERS += welcomeplugin.h \
|
||||||
welcome_global.h \
|
welcome_global.h
|
||||||
multifeedrssmodel.h
|
|
||||||
|
|
||||||
SOURCES += welcomeplugin.cpp \
|
SOURCES += welcomeplugin.cpp
|
||||||
multifeedrssmodel.cpp
|
|
||||||
|
|
||||||
DEFINES += WELCOME_LIBRARY
|
DEFINES += WELCOME_LIBRARY
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "welcomeplugin.h"
|
#include "welcomeplugin.h"
|
||||||
#include "multifeedrssmodel.h"
|
|
||||||
|
|
||||||
#include <extensionsystem/pluginmanager.h>
|
#include <extensionsystem/pluginmanager.h>
|
||||||
|
|
||||||
@@ -188,26 +187,8 @@ bool sortFunction(Utils::IWelcomePage * a, Utils::IWelcomePage *b)
|
|||||||
return a->priority() < b->priority();
|
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()
|
void WelcomeMode::initPlugins()
|
||||||
|
|||||||
Reference in New Issue
Block a user