rsslisting.cpp Example File
xml/rsslisting/rsslisting.cpp
 
 
 
 #include <QtCore>
 #include <QtGui>
 #include <QtNetwork>
 #include "rsslisting.h"
 
 RSSListing::RSSListing(QWidget *parent)
     : QWidget(parent), currentReply(0)
 {
 #ifdef Q_OS_SYMBIAN
     
     QNetworkConfigurationManager manager;
     const bool canStartIAP = manager.capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces;
     
     QNetworkConfiguration cfg = manager.defaultConfiguration();
     if (!cfg.isValid() || !canStartIAP) {
         
         QMessageBox::warning(this, "Error", "No access point");
         return;
     }
     m_session = new QNetworkSession(cfg);
     m_session->open();
     m_session->waitForOpened();
 #endif
     lineEdit = new QLineEdit(this);
     lineEdit->setText("http://labs.qt.nokia.com/blogs/feed");
     fetchButton = new QPushButton(tr("Fetch"), this);
     treeWidget = new QTreeWidget(this);
     connect(treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)),
             this, SLOT(itemActivated(QTreeWidgetItem*)));
     QStringList headerLabels;
     headerLabels << tr("Title") << tr("Link");
     treeWidget->setHeaderLabels(headerLabels);
     treeWidget->header()->setResizeMode(QHeaderView::ResizeToContents);
     connect(&manager, SIGNAL(finished(QNetworkReply*)),
              this, SLOT(finished(QNetworkReply*)));
     connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(fetch()));
     connect(fetchButton, SIGNAL(clicked()), this, SLOT(fetch()));
     QVBoxLayout *layout = new QVBoxLayout(this);
     QHBoxLayout *hboxLayout = new QHBoxLayout;
     hboxLayout->addWidget(lineEdit);
     hboxLayout->addWidget(fetchButton);
     layout->addLayout(hboxLayout);
     layout->addWidget(treeWidget);
     setWindowTitle(tr("RSS listing example"));
 #if !defined(Q_OS_SYMBIAN) && !defined(Q_WS_MAEMO_5)
     resize(640,480);
 #endif
 }
 
 void RSSListing::get(const QUrl &url)
 {
     QNetworkRequest request(url);
     if (currentReply) {
         currentReply->disconnect(this);
         currentReply->deleteLater();
     }
     currentReply = manager.get(request);
     connect(currentReply, SIGNAL(readyRead()), this, SLOT(readyRead()));
     connect(currentReply, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged()));
     connect(currentReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError)));
 }
 
 void RSSListing::fetch()
 {
     lineEdit->setReadOnly(true);
     fetchButton->setEnabled(false);
     treeWidget->clear();
     xml.clear();
     QUrl url(lineEdit->text());
     get(url);
 }
 void RSSListing::metaDataChanged()
 {
     QUrl redirectionTarget = currentReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
     if (redirectionTarget.isValid()) {
         get(redirectionTarget);
     }
 }
 
 void RSSListing::readyRead()
 {
     int statusCode = currentReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
     if (statusCode >= 200 && statusCode < 300) {
         QByteArray data = currentReply->readAll();
         xml.addData(data);
         parseXml();
     }
 }
 
 void RSSListing::finished(QNetworkReply *reply)
 {
     Q_UNUSED(reply);
     lineEdit->setReadOnly(false);
     fetchButton->setEnabled(true);
 }
 
 void RSSListing::parseXml()
 {
     while (!xml.atEnd()) {
         xml.readNext();
         if (xml.isStartElement()) {
             if (xml.name() == "item")
                 linkString = xml.attributes().value("rss:about").toString();
             currentTag = xml.name().toString();
         } else if (xml.isEndElement()) {
             if (xml.name() == "item") {
                 QTreeWidgetItem *item = new QTreeWidgetItem;
                 item->setText(0, titleString);
                 item->setText(1, linkString);
                 treeWidget->addTopLevelItem(item);
                 titleString.clear();
                 linkString.clear();
             }
         } else if (xml.isCharacters() && !xml.isWhitespace()) {
             if (currentTag == "title")
                 titleString += xml.text().toString();
             else if (currentTag == "link")
                 linkString += xml.text().toString();
         }
     }
     if (xml.error() && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) {
         qWarning() << "XML ERROR:" << xml.lineNumber() << ": " << xml.errorString();
     }
 }
 
 void RSSListing::itemActivated(QTreeWidgetItem * item)
 {
     QDesktopServices::openUrl(QUrl(item->text(1)));
 }
 void RSSListing::error(QNetworkReply::NetworkError)
 {
     qWarning("error retrieving RSS feed");
     currentReply->disconnect(this);
     currentReply->deleteLater();
     currentReply = 0;
 }