diff --git a/src/plugins/welcome/multifeedrssmodel.cpp b/src/plugins/welcome/multifeedrssmodel.cpp deleted file mode 100644 index 9d45aa7dcf4b5777625d253e473a41be1d8b6a6a..0000000000000000000000000000000000000000 --- a/src/plugins/welcome/multifeedrssmodel.cpp +++ /dev/null @@ -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 diff --git a/src/plugins/welcome/multifeedrssmodel.h b/src/plugins/welcome/multifeedrssmodel.h deleted file mode 100644 index 54b569bc2a0efdcee919769841a115275d8be3e3..0000000000000000000000000000000000000000 --- a/src/plugins/welcome/multifeedrssmodel.h +++ /dev/null @@ -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 - - diff --git a/src/plugins/welcome/welcome.pro b/src/plugins/welcome/welcome.pro index 3886aca97383090131b766314756026b87b205eb..482506916b048951a0363466e111fcbd8ca70a43 100644 --- a/src/plugins/welcome/welcome.pro +++ b/src/plugins/welcome/welcome.pro @@ -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 diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index 529dae017c9731b57fca867c823cabbbacb5961b..0809699fbbb247dd4e31704481d662ecb9751f67 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -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()