summaryrefslogtreecommitdiffstats
path: root/qt-mobile
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2015-11-18 13:14:19 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-11-18 13:14:19 -0800
commit74b15922f306872d948e722d6f2a0bb18f978436 (patch)
treeb9a75d611accff8a725b604cb7ea4114fd8ea890 /qt-mobile
parent18e52c1da402138a2204419bb008beb7271333bb (diff)
downloadsubsurface-74b15922f306872d948e722d6f2a0bb18f978436.tar.gz
Location service: retrieve the userid using the cloud storage API
This should actually not be in the mobile section at all. This needs to be available on the desktop as well. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-mobile')
-rw-r--r--qt-mobile/gpslocation.cpp48
-rw-r--r--qt-mobile/gpslocation.h2
-rw-r--r--qt-mobile/qmlmanager.cpp24
3 files changed, 73 insertions, 1 deletions
diff --git a/qt-mobile/gpslocation.cpp b/qt-mobile/gpslocation.cpp
index 7ce60b4a6..f78a482a0 100644
--- a/qt-mobile/gpslocation.cpp
+++ b/qt-mobile/gpslocation.cpp
@@ -11,6 +11,9 @@
#include <QApplication>
#include <QTimer>
+#define GPS_FIX_ADD_URL "http://api.subsurface-divelog.org/api/dive/add/"
+#define GET_WEBSERVICE_UID_URL "https://cloud.subsurface-divelog.org/webuserid/"
+
GpsLocation::GpsLocation(QObject *parent)
{
// create a QSettings object that's separate from the main application settings
@@ -79,6 +82,44 @@ void GpsLocation::status(QString msg)
qmlUiShowMessage(qPrintable(msg));
}
+QString GpsLocation::getUserid(QString user, QString passwd)
+{
+ qDebug() << "called getUserid";
+ QEventLoop loop;
+ QTimer timer;
+ timer.setSingleShot(true);
+
+ QNetworkAccessManager *manager = new QNetworkAccessManager(qApp);
+ QUrl url(GET_WEBSERVICE_UID_URL);
+ QString data;
+ data = user + " " + passwd;
+ QNetworkRequest request;
+ request.setUrl(url);
+ request.setRawHeader("Accept", "text/html");
+ request.setRawHeader("Content-type", "application/x-www-form-urlencoded");
+ reply = manager->post(request, data.toUtf8());
+ 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() == QNetworkReply::NoError) {
+ QString result = reply->readAll();
+ status(QString("received ") + result);
+ result.remove("WebserviceID:");
+ reply->deleteLater();
+ return result;
+ }
+ } else {
+ status("Getting Web service ID timed out");
+ }
+ reply->deleteLater();
+ return QString();
+}
+
int GpsLocation::getGpsNum() const
{
return geoSettings->value("count", 0).toInt();
@@ -223,6 +264,11 @@ void GpsLocation::postError(QNetworkReply::NetworkError error)
status(QString("error when sending a GPS fix: %1").arg(reply->errorString()));
}
+void GpsLocation::getUseridError(QNetworkReply::NetworkError error)
+{
+ status(QString("error when retrieving Subsurface webservice user id: %1").arg(reply->errorString()));
+}
+
void GpsLocation::uploadToServer()
{
// we want to do this one at a time (the server prefers that)
@@ -231,7 +277,7 @@ void GpsLocation::uploadToServer()
timer.setSingleShot(true);
QNetworkAccessManager *manager = new QNetworkAccessManager(qApp);
- QUrl url("http://api.subsurface-divelog.org/api/dive/add/");
+ QUrl url(GPS_FIX_ADD_URL);
int count = geoSettings->value("count", 0).toInt();
for (int i = 0; i < count; i++) {
QDateTime dt;
diff --git a/qt-mobile/gpslocation.h b/qt-mobile/gpslocation.h
index ff7aa1ea4..d00fbae6a 100644
--- a/qt-mobile/gpslocation.h
+++ b/qt-mobile/gpslocation.h
@@ -16,6 +16,7 @@ public:
GpsLocation(QObject *parent);
bool applyLocations();
int getGpsNum() const;
+ QString getUserid(QString user, QString passwd);
private:
QGeoPositionInfo lastPos;
@@ -32,6 +33,7 @@ public slots:
void updateTimeout();
void uploadToServer();
void postError(QNetworkReply::NetworkError error);
+ void getUseridError(QNetworkReply::NetworkError error);
void clearGpsData();
};
diff --git a/qt-mobile/qmlmanager.cpp b/qt-mobile/qmlmanager.cpp
index bbc5939c7..da6b01b1c 100644
--- a/qt-mobile/qmlmanager.cpp
+++ b/qt-mobile/qmlmanager.cpp
@@ -25,6 +25,12 @@ QMLManager::QMLManager() :
setCloudUserName(prefs.cloud_storage_email);
setCloudPassword(prefs.cloud_storage_password);
setSaveCloudPassword(prefs.save_password_local);
+ // if the cloud credentials are valid, we should get the GPS Webservice ID as well
+ if (!same_string(prefs.cloud_storage_email, "") &&
+ !same_string(prefs.cloud_storage_password, "") &&
+ same_string(prefs.userid, ""))
+ locationProvider->getUserid(prefs.cloud_storage_email, prefs.cloud_storage_password);
+
setDistanceThreshold(prefs.distance_threshold);
setTimeThreshold(prefs.time_threshold / 60);
if (!same_string(prefs.cloud_storage_email, "") && !same_string(prefs.cloud_storage_password, ""))
@@ -38,6 +44,7 @@ QMLManager::~QMLManager()
void QMLManager::savePreferences()
{
QSettings s;
+ bool cloudCredentialsChanged = false;
s.beginGroup("LocationService");
s.setValue("time_threshold", timeThreshold() * 60);
prefs.time_threshold = timeThreshold() * 60;
@@ -53,15 +60,32 @@ void QMLManager::savePreferences()
if (!same_string(prefs.cloud_storage_email, qPrintable(cloudUserName()))) {
free(prefs.cloud_storage_email);
prefs.cloud_storage_email = strdup(qPrintable(cloudUserName()));
+ cloudCredentialsChanged = true;
}
if (saveCloudPassword() != prefs.save_password_local)
prefs.save_password_local = saveCloudPassword();
+
+ cloudCredentialsChanged |= !same_string(prefs.cloud_storage_password, qPrintable(cloudPassword()));
+
if (saveCloudPassword()) {
if (!same_string(prefs.cloud_storage_password, qPrintable(cloudPassword()))) {
free(prefs.cloud_storage_password);
prefs.cloud_storage_password = strdup(qPrintable(cloudPassword()));
}
}
+ // if the cloud credentials are valid, we should get the GPS Webservice ID as well
+ if (!same_string(prefs.cloud_storage_email, "") &&
+ !same_string(prefs.cloud_storage_password, "")) {
+ if (same_string(prefs.userid, "") || cloudCredentialsChanged) {
+ QString userid = locationProvider->getUserid(prefs.cloud_storage_email, prefs.cloud_storage_password);
+ if (!userid.isEmpty()) {
+ // overwrite the existing userid
+ free(prefs.userid);
+ prefs.userid = strdup(qPrintable(userid));
+ s.setValue("subsurface_webservice_uid", prefs.userid);
+ }
+ }
+ }
}
void QMLManager::loadDives()