demos/embedded/flightinfo/flightinfo.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
    41 
    41 
    42 #include <QtCore>
    42 #include <QtCore>
    43 #include <QtGui>
    43 #include <QtGui>
    44 #include <QtNetwork>
    44 #include <QtNetwork>
    45 
    45 
    46 #if defined (Q_OS_SYMBIAN)
       
    47 #include "sym_iap_util.h"
       
    48 #endif
       
    49 
       
    50 #include "ui_form.h"
    46 #include "ui_form.h"
    51 
    47 
    52 #define FLIGHTVIEW_URL "http://mobile.flightview.com/TrackByFlight.aspx"
    48 #define FLIGHTVIEW_URL "http://mobile.flightview.com/TrackByFlight.aspx"
    53 #define FLIGHTVIEW_RANDOM "http://mobile.flightview.com/TrackSampleFlight.aspx"
    49 #define FLIGHTVIEW_RANDOM "http://mobile.flightview.com/TrackSampleFlight.aspx"
    54 
    50 
    98 
    94 
    99     Ui_Form ui;
    95     Ui_Form ui;
   100     QUrl m_url;
    96     QUrl m_url;
   101     QDate m_searchDate;
    97     QDate m_searchDate;
   102     QPixmap m_map;
    98     QPixmap m_map;
       
    99     QNetworkAccessManager m_manager;
       
   100     QList<QNetworkReply *> mapReplies;
   103 
   101 
   104 public:
   102 public:
   105 
   103 
   106     FlightInfo(QMainWindow *parent = 0): QMainWindow(parent) {
   104     FlightInfo(QMainWindow *parent = 0): QMainWindow(parent) {
   107 
   105 
   113         ui.infoBox->hide();
   111         ui.infoBox->hide();
   114         connect(ui.searchButton, SIGNAL(clicked()), SLOT(startSearch()));
   112         connect(ui.searchButton, SIGNAL(clicked()), SLOT(startSearch()));
   115         connect(ui.flightEdit, SIGNAL(returnPressed()), SLOT(startSearch()));
   113         connect(ui.flightEdit, SIGNAL(returnPressed()), SLOT(startSearch()));
   116 
   114 
   117         setWindowTitle("Flight Info");
   115         setWindowTitle("Flight Info");
   118         QTimer::singleShot(0, this, SLOT(delayedInit()));
       
   119 
   116 
   120         // Rendered from the public-domain vectorized aircraft
   117         // Rendered from the public-domain vectorized aircraft
   121         // http://openclipart.org/media/people/Jarno
   118         // http://openclipart.org/media/people/Jarno
   122         m_map = QPixmap(":/aircraft.png");
   119         m_map = QPixmap(":/aircraft.png");
   123 
   120 
   125         QAction *searchYesterdayAction = new QAction("Yesterday's Flight", this);
   122         QAction *searchYesterdayAction = new QAction("Yesterday's Flight", this);
   126         QAction *randomAction = new QAction("Random Flight", this);
   123         QAction *randomAction = new QAction("Random Flight", this);
   127         connect(searchTodayAction, SIGNAL(triggered()), SLOT(today()));
   124         connect(searchTodayAction, SIGNAL(triggered()), SLOT(today()));
   128         connect(searchYesterdayAction, SIGNAL(triggered()), SLOT(yesterday()));
   125         connect(searchYesterdayAction, SIGNAL(triggered()), SLOT(yesterday()));
   129         connect(randomAction, SIGNAL(triggered()), SLOT(randomFlight()));
   126         connect(randomAction, SIGNAL(triggered()), SLOT(randomFlight()));
       
   127         connect(&m_manager, SIGNAL(finished(QNetworkReply*)),
       
   128                 this, SLOT(handleNetworkData(QNetworkReply*)));
   130 #if defined(Q_OS_SYMBIAN)
   129 #if defined(Q_OS_SYMBIAN)
   131         menuBar()->addAction(searchTodayAction);
   130         menuBar()->addAction(searchTodayAction);
   132         menuBar()->addAction(searchYesterdayAction);
   131         menuBar()->addAction(searchYesterdayAction);
   133         menuBar()->addAction(randomAction);
   132         menuBar()->addAction(randomAction);
   134 #else
   133 #else
   138         setContextMenuPolicy(Qt::ActionsContextMenu);
   137         setContextMenuPolicy(Qt::ActionsContextMenu);
   139 #endif
   138 #endif
   140     }
   139     }
   141 
   140 
   142 private slots:
   141 private slots:
   143     void delayedInit() {
       
   144 #if defined(Q_OS_SYMBIAN)
       
   145         qt_SetDefaultIap();
       
   146 #endif
       
   147     }
       
   148 
       
   149 
   142 
   150     void handleNetworkData(QNetworkReply *networkReply) {
   143     void handleNetworkData(QNetworkReply *networkReply) {
   151         if (!networkReply->error()) {
   144         if (!networkReply->error()) {
   152             // Assume UTF-8 encoded
   145             if (!mapReplies.contains(networkReply)) {
   153             QByteArray data = networkReply->readAll();
   146                 // Assume UTF-8 encoded
   154             QString xml = QString::fromUtf8(data);
   147                 QByteArray data = networkReply->readAll();
   155             digest(xml);
   148                 QString xml = QString::fromUtf8(data);
       
   149                 digest(xml);
       
   150             } else {
       
   151                 mapReplies.removeOne(networkReply);
       
   152                 m_map.loadFromData(networkReply->readAll());
       
   153                 update();
       
   154             }
   156         }
   155         }
   157         networkReply->deleteLater();
   156         networkReply->deleteLater();
   158         networkReply->manager()->deleteLater();
       
   159     }
       
   160 
       
   161     void handleMapData(QNetworkReply *networkReply) {
       
   162         if (!networkReply->error()) {
       
   163             m_map.loadFromData(networkReply->readAll());
       
   164             update();
       
   165         }
       
   166         networkReply->deleteLater();
       
   167         networkReply->manager()->deleteLater();
       
   168     }
   157     }
   169 
   158 
   170     void today() {
   159     void today() {
   171         QDateTime timestamp = QDateTime::currentDateTime();
   160         QDateTime timestamp = QDateTime::currentDateTime();
   172         m_searchDate = timestamp.date();
   161         m_searchDate = timestamp.date();
   183     void searchFlight() {
   172     void searchFlight() {
   184         ui.searchBar->show();
   173         ui.searchBar->show();
   185         ui.infoBox->hide();
   174         ui.infoBox->hide();
   186         ui.flightStatus->hide();
   175         ui.flightStatus->hide();
   187         ui.flightName->setText("Enter flight number");
   176         ui.flightName->setText("Enter flight number");
       
   177         ui.flightEdit->setFocus();
       
   178 #ifdef QT_KEYPAD_NAVIGATION
       
   179         ui.flightEdit->setEditFocus(true);
       
   180 #endif
   188         m_map = QPixmap();
   181         m_map = QPixmap();
   189         update();
   182         update();
   190     }
   183     }
   191 
   184 
   192     void startSearch() {
   185     void startSearch() {
   222             // random flight as sample
   215             // random flight as sample
   223             m_url = QUrl(FLIGHTVIEW_RANDOM);
   216             m_url = QUrl(FLIGHTVIEW_RANDOM);
   224             ui.flightName->setText("Getting a random flight...");
   217             ui.flightName->setText("Getting a random flight...");
   225         }
   218         }
   226 
   219 
   227         QNetworkAccessManager *manager = new QNetworkAccessManager(this);
   220         m_manager.get(QNetworkRequest(m_url));
   228         connect(manager, SIGNAL(finished(QNetworkReply*)),
       
   229                 this, SLOT(handleNetworkData(QNetworkReply*)));
       
   230         manager->get(QNetworkRequest(m_url));
       
   231     }
   221     }
   232 
   222 
   233 
   223 
   234 private:
   224 private:
   235 
   225 
   246             QString href = data.mid(i, data.indexOf('\"', i + 8) - i + 1);
   236             QString href = data.mid(i, data.indexOf('\"', i + 8) - i + 1);
   247             QRegExp regex("dpap=([A-Za-z0-9]+)");
   237             QRegExp regex("dpap=([A-Za-z0-9]+)");
   248             regex.indexIn(href);
   238             regex.indexIn(href);
   249             QString airport = regex.cap(1);
   239             QString airport = regex.cap(1);
   250             m_url.addEncodedQueryItem("dpap", QUrl::toPercentEncoding(airport));
   240             m_url.addEncodedQueryItem("dpap", QUrl::toPercentEncoding(airport));
   251             QNetworkAccessManager *manager = new QNetworkAccessManager(this);
   241             m_manager.get(QNetworkRequest(m_url));
   252             connect(manager, SIGNAL(finished(QNetworkReply*)),
       
   253                     this, SLOT(handleNetworkData(QNetworkReply*)));
       
   254             manager->get(QNetworkRequest(m_url));
       
   255             return;
   242             return;
   256         }
   243         }
   257 
   244 
   258         QXmlStreamReader xml(data);
   245         QXmlStreamReader xml(data);
   259         bool inFlightName = false;
   246         bool inFlightName = false;
   285                     if (cn.contains("fieldValue"))
   272                     if (cn.contains("fieldValue"))
   286                         inFieldValue = true;
   273                         inFieldValue = true;
   287                 }
   274                 }
   288                 if (xml.name() == "img" && inFlightMap) {
   275                 if (xml.name() == "img" && inFlightMap) {
   289                     QString src = xml.attributes().value("src").toString();
   276                     QString src = xml.attributes().value("src").toString();
   290                     src.prepend("http://mobile.flightview.com");
   277                     src.prepend("http://mobile.flightview.com/");
   291                     QUrl url = QUrl::fromPercentEncoding(src.toAscii());
   278                     QUrl url = QUrl::fromPercentEncoding(src.toAscii());
   292                     QNetworkAccessManager *manager = new QNetworkAccessManager(this);
   279                     mapReplies.append(m_manager.get(QNetworkRequest(url)));
   293                     connect(manager, SIGNAL(finished(QNetworkReply*)),
       
   294                             this, SLOT(handleMapData(QNetworkReply*)));
       
   295                     manager->get(QNetworkRequest(url));
       
   296                 }
   280                 }
   297             }
   281             }
   298 
   282 
   299             if (xml.tokenType() == QXmlStreamReader::EndElement) {
   283             if (xml.tokenType() == QXmlStreamReader::EndElement) {
   300                 inFlightName &= xml.name() != "h1";
   284                 inFlightName &= xml.name() != "h1";