summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2016-01-07 21:32:24 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2016-01-07 21:32:24 -0800
commit1c66e399fa1f3549a9c3349d3a3f13000bb0d353 (patch)
tree783c63bd022fbfd82af6c78d8faf571c950b19e0
parent0d9b22cf940463d670e42ea8321c18a69cbf0f26 (diff)
downloadsubsurface-1c66e399fa1f3549a9c3349d3a3f13000bb0d353.tar.gz
Download gps locations in the mobile app
This is not the same as the existing download to apply the gps fixes to the dive list. This allows us to download and store the GPS fixes in the settings. I may end up changing things around to have a shared implementation for downloading the GPS fixes, but for now this seemed easier. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--subsurface-core/gpslocation.cpp83
-rw-r--r--subsurface-core/gpslocation.h1
2 files changed, 84 insertions, 0 deletions
diff --git a/subsurface-core/gpslocation.cpp b/subsurface-core/gpslocation.cpp
index 6106dd358..c2f8b0e2f 100644
--- a/subsurface-core/gpslocation.cpp
+++ b/subsurface-core/gpslocation.cpp
@@ -10,8 +10,12 @@
#include <QUrlQuery>
#include <QApplication>
#include <QTimer>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
#define GPS_FIX_ADD_URL "http://api.subsurface-divelog.org/api/dive/add/"
+#define GPS_FIX_DOWNLOAD_URL "http://api.subsurface-divelog.org/api/dive/get/"
#define GET_WEBSERVICE_UID_URL "https://cloud.subsurface-divelog.org/webuserid/"
GpsLocation *GpsLocation::m_Instance = NULL;
@@ -396,3 +400,82 @@ void GpsLocation::uploadToServer()
geoSettings->setValue(QString("gpsFix%1_uploaded").arg(i), 1);
}
}
+
+void GpsLocation::downloadFromServer()
+{
+ QEventLoop loop;
+ QTimer timer;
+ timer.setSingleShot(true);
+ QNetworkAccessManager *manager = new QNetworkAccessManager(qApp);
+ QUrl url(QString(GPS_FIX_DOWNLOAD_URL "?login=%1").arg(prefs.userid));
+ QNetworkRequest request;
+ request.setUrl(url);
+ request.setRawHeader("User-Agent", getUserAgent().toUtf8());
+ request.setRawHeader("Accept", "text/json");
+ request.setRawHeader("Content-type", "text/html");
+ qDebug() << "downloadFromServer accessing" << url;
+ reply = manager->get(request);
+ connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
+ connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
+ connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
+ this, SLOT(getUseridError(QNetworkReply::NetworkError)));
+ timer.start(10000);
+ loop.exec();
+ if (timer.isActive()) {
+ timer.stop();
+ if (!reply->error()) {
+ QString response = reply->readAll();
+ QJsonDocument json = QJsonDocument::fromJson(response.toLocal8Bit());
+ QJsonObject object = json.object();
+ if (object.value("download").toString() != "ok") {
+ qDebug() << "problems downloading GPS fixes";
+ return;
+ }
+ // create a table with the GPS information
+ QHash<int, struct gpsTracker> gpsFixes;
+ int existing = geoSettings->value("count", 0).toInt();
+ for (int i = 0; i < existing; i++) {
+ struct gpsTracker gt;
+ gt.latitude.udeg = geoSettings->value(QString("gpsFix%1_lat").arg(i)).toInt();
+ gt.longitude.udeg = geoSettings->value(QString("gpsFix%1_lon").arg(i)).toInt();
+ gt.when = geoSettings->value(QString("gpsFix%1_time").arg(i)).toULongLong();
+ gpsFixes.insert(gt.when, gt);
+ }
+ qDebug() << "already have" << gpsFixes.count() << "GPS fixes";
+ QJsonArray dives = object.value("dives").toArray();
+ qDebug() << dives.count() << "GPS fixes downloaded";
+ for (int i = 0; i < dives.count(); i++) {
+ QJsonObject fix = dives[i].toObject();
+ QString date = fix.value("date").toString();
+ QString time = fix.value("time").toString();
+ QString name = fix.value("name").toString();
+ QString latitude = fix.value("latitude").toString();
+ QString longitude = fix.value("longitude").toString();
+ QDateTime timestamp = QDateTime::fromString(date + " " + time, "yyyy-M-d hh:m:s");
+
+ struct gpsTracker gt;
+ gt.when = timestamp.toMSecsSinceEpoch() / 1000 + gettimezoneoffset(timestamp.toMSecsSinceEpoch() / 1000);
+ gt.latitude.udeg = latitude.toDouble() * 1000000;
+ gt.longitude.udeg = longitude.toDouble() * 1000000;
+ gt.name = name;
+ gpsFixes.insert(gt.when, gt);
+ }
+ QList<int> keys = gpsFixes.keys();
+ qSort(keys);
+ for (int i = 0; i < keys.count(); i++) {
+ struct gpsTracker gt = gpsFixes.value(keys[i]);
+ geoSettings->setValue(QString("gpsFix%1_time").arg(i), (uint64_t)gt.when);
+ geoSettings->setValue(QString("gpsFix%1_name").arg(i), gt.name);
+ geoSettings->setValue(QString("gpsFix%1_lat").arg(i), gt.latitude.udeg);
+ geoSettings->setValue(QString("gpsFix%1_lon").arg(i), gt.longitude.udeg);
+ }
+ geoSettings->setValue("count", keys.count());
+ } else {
+ qDebug() << "network error" << reply->error() << reply->errorString() << reply->readAll();
+ }
+ } else {
+ qDebug() << "download timed out";
+ status("Download from server timed out");
+ }
+ reply->deleteLater();
+}
diff --git a/subsurface-core/gpslocation.h b/subsurface-core/gpslocation.h
index d595c877e..2d2d915d0 100644
--- a/subsurface-core/gpslocation.h
+++ b/subsurface-core/gpslocation.h
@@ -46,6 +46,7 @@ public slots:
void newPosition(QGeoPositionInfo pos);
void updateTimeout();
void uploadToServer();
+ void downloadFromServer();
void postError(QNetworkReply::NetworkError error);
void getUseridError(QNetworkReply::NetworkError error);
void clearGpsData();