stationQueryReply = accessManager->post(request, query);
connect(stationQueryReply, SIGNAL(finished()),
SLOT(onStationScheduleFetched()));
+ connect(stationQueryReply, SIGNAL(error(QNetworkReply::NetworkError)),
+ SLOT(onNetworkError(QNetworkReply::NetworkError)));
QStringList recentStations = settings->recentStations();
recentStations.push_front(station);
recentStations.removeDuplicates();
void DataProvider::onStationScheduleFetched()
{
- disconnect(stationQueryReply, SIGNAL(finished()),
- this, SLOT(onStationScheduleFetched()));
+ disconnect(stationQueryReply);
QString name = Settings::instance()->recentStations().front();
stationQueryReply->deleteLater();
stationQueryReply = 0;
}
+
+void DataProvider::onNetworkError(QNetworkReply::NetworkError errorCode)
+{
+ switch (errorCode) {
+ case QNetworkReply::NoError:
+ qDebug() << "No Network error" << errorCode;
+ break;
+ default:
+ qDebug() << "SNetwork error" << errorCode;
+ emit error();
+ break;
+ }
+}
#ifndef DATAPROVIDER_H
#define DATAPROVIDER_H
+#include <QNetworkReply>
#include <QObject>
#include <QSharedPointer>
class QNetworkAccessManager;
-class QNetworkReply;
class QUrl;
class StationScheduleModel;
static DataProvider *instance();
signals:
void stationScheduleReady(const QByteArray &data, const QUrl &url);
+ void error();
public slots:
void fetchStationSchedule(const QString &station, const QString &stationCode = QString());
private slots:
void onStationScheduleFetched(void);
+ void onNetworkError(QNetworkReply::NetworkError errorCode);
private:
QNetworkAccessManager *accessManager;
tools: ToolBarLayout {
id: toolBar
ToolIcon { iconId: "icon-m-toolbar-back"; onClicked: pageStack.pop() }
+ ToolIcon { iconId: "icon-m-toolbar-refresh"; onClicked: updateStation() }
ToolIcon { iconId: "icon-m-toolbar-view-menu"; onClicked: menu.open() }
}
PageHeader {
view.state = "loading"
}
function updateStation() {
+ view.state = "loading"
console.log("Updating station with " + schedule.name + ", " + schedule.code)
schedule.fetch(schedule.name, schedule.code)
}
StationScheduleModel::StationScheduleModel(const QString &name, QObject *parent) :
QAbstractListModel(parent),
- m_name(name)
+ m_name(name),
+ m_error(QString())
{
DataProvider *provider = DataProvider::instance();
connect(provider, SIGNAL(stationScheduleReady(QByteArray,QUrl)),
this, SLOT(parse(QByteArray,QUrl)));
-
+ connect(provider, SIGNAL(error()),
+ this, SLOT(onNetworkError()));
Settings *settings = Settings::instance();
m_scheduleType = settings->showArrivalsPreferred() ? ArrivalSchedule : DepartureSchedule;
}
-QString & StationScheduleModel::name()
+const QString &StationScheduleModel::name()
{
return m_name;
}
}
}
-QString & StationScheduleModel::code()
+const QString &StationScheduleModel::code()
{
return m_code;
}
}
}
+const QString &StationScheduleModel::error()
+{
+ return m_error;
+}
+
+void StationScheduleModel::setError(const QString &error)
+{
+ if (error != m_error) {
+ m_error = error;
+ emit errorChanged();
+ }
+}
+
StationScheduleModel::ScheduleType StationScheduleModel::type()
{
return m_scheduleType;
emit layoutChanged();
}
+void StationScheduleModel::onNetworkError()
+{
+ qDebug()<< "Station Schedule Model got a Network Error";
+ m_error = tr("Network error");
+ emit errorChanged();
+}
+
void StationScheduleModel::fetch(const QString &name, const QString &code)
{
DataProvider *provider = DataProvider::instance();
+ if (!error().isEmpty())
+ setError(QString());
+ m_departureSchedules.clear();
+ m_arrivalSchedules.clear();
provider->fetchStationSchedule(name, code);
setName(name);
setCode(code);
{
Q_UNUSED(parent);
if (m_scheduleType == DepartureSchedule) {
- qDebug() << "schedule.count" << m_departureSchedules.count();
return m_departureSchedules.count();
} else {
- qDebug() << "schedule.count" << m_arrivalSchedules.count();
return m_arrivalSchedules.count();
}
}
QVariant StationScheduleModel::data(const QModelIndex &index, int role) const
{
- qDebug() << "getting data for role" << role;
if (!index.isValid()) {
return QVariant();
}
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString code READ code WRITE setCode NOTIFY codeChanged)
Q_PROPERTY(ScheduleType type READ type WRITE setType NOTIFY typeChanged)
+ Q_PROPERTY(QString error READ error WRITE setError NOTIFY errorChanged)
Q_ENUMS(ScheduleType)
enum StationRoles {
explicit StationScheduleModel(const QString &name = "", QObject *parent = 0);
- QString &name();
+ const QString &name();
void setName(const QString &name);
- QString &code();
+ const QString &code();
void setCode(const QString &code);
ScheduleType type();
int rowCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
+ const QString &error();
+ void setError(const QString &code);
+
signals:
void nameChanged();
void codeChanged();
void typeChanged();
+ void errorChanged();
public slots:
void fetch(const QString &name, const QString &code = QString());
private slots:
void parse(const QByteArray &htmlReply, const QUrl &baseUrl);
+ void onNetworkError(void);
private:
QString m_name;
QString m_code;
+ QString m_error;
QList<StationScheduleItem> m_departureSchedules;
QList<StationScheduleItem> m_arrivalSchedules;
ScheduleType m_scheduleType;