diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2015-11-18 13:14:19 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-11-18 13:14:19 -0800 |
commit | 74b15922f306872d948e722d6f2a0bb18f978436 (patch) | |
tree | b9a75d611accff8a725b604cb7ea4114fd8ea890 /qt-mobile | |
parent | 18e52c1da402138a2204419bb008beb7271333bb (diff) | |
download | subsurface-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.cpp | 48 | ||||
-rw-r--r-- | qt-mobile/gpslocation.h | 2 | ||||
-rw-r--r-- | qt-mobile/qmlmanager.cpp | 24 |
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() |