diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2018-10-11 21:02:55 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2018-10-11 16:25:02 -0700 |
commit | ad57871a2cbb03b0880d33184466e052a20dbd1d (patch) | |
tree | 45260621335dd58acbb32425afb8f5a76fdaf09f | |
parent | 04ad9c885da672b476d3abf4bc33ba172868eb61 (diff) | |
download | subsurface-ad57871a2cbb03b0880d33184466e052a20dbd1d.tar.gz |
Geo lookup: don't pass arguments / result via global object
The reverseGeoLookup() fetches dive-site data via GPS coordinates.
The coordinates and the result were passed via the global
"displayed_dive_site" object. To make data-flow more clear,
pass data as in and out parameters instead.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r-- | core/divesitehelpers.cpp | 60 | ||||
-rw-r--r-- | core/divesitehelpers.h | 7 | ||||
-rw-r--r-- | desktop-widgets/locationinformation.cpp | 2 |
3 files changed, 36 insertions, 33 deletions
diff --git a/core/divesitehelpers.cpp b/core/divesitehelpers.cpp index 264d6ae74..10aab071b 100644 --- a/core/divesitehelpers.cpp +++ b/core/divesitehelpers.cpp @@ -21,7 +21,7 @@ #include <QTimer> #include <memory> -void reverseGeoLookup() +void reverseGeoLookup(degrees_t latitude, degrees_t longitude, taxonomy_data *taxonomy) { // By making the QNetworkAccessManager static and local to this function, // only one manager exists for all geo-lookups and it is only initialized @@ -37,10 +37,8 @@ void reverseGeoLookup() request.setRawHeader("User-Agent", getUserAgent().toUtf8()); QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); - struct dive_site *ds = &displayed_dive_site; - // first check the findNearbyPlaces API from geonames - that should give us country, state, city - request.setUrl(geonamesURL.arg(uiLanguage(NULL).section(QRegExp("[-_ ]"), 0, 0)).arg(ds->latitude.udeg / 1000000.0).arg(ds->longitude.udeg / 1000000.0)); + request.setUrl(geonamesURL.arg(uiLanguage(NULL).section(QRegExp("[-_ ]"), 0, 0)).arg(latitude.udeg / 1000000.0).arg(longitude.udeg / 1000000.0)); // By using a std::unique_ptr<>, we can exit from the function at any point // and the reply will be freed. Likewise, when overwriting the pointer with @@ -74,41 +72,41 @@ void reverseGeoLookup() if (geoNames.count() > 0) { QVariantMap firstData = geoNames.at(0).toMap(); int ri = 0, l3 = -1, lt = -1; - if (ds->taxonomy.category == NULL) { - ds->taxonomy.category = alloc_taxonomy(); + if (taxonomy->category == NULL) { + taxonomy->category = alloc_taxonomy(); } else { // clear out the data (except for the ocean data) int ocean; - if ((ocean = taxonomy_index_for_category(&ds->taxonomy, TC_OCEAN)) > 0) { - ds->taxonomy.category[0] = ds->taxonomy.category[ocean]; - ds->taxonomy.nr = 1; + if ((ocean = taxonomy_index_for_category(taxonomy, TC_OCEAN)) > 0) { + taxonomy->category[0] = taxonomy->category[ocean]; + taxonomy->nr = 1; } else { // ocean is -1 if there is no such entry, and we didn't copy above // if ocean is 0, so the following gets us the correct count - ds->taxonomy.nr = ocean + 1; + taxonomy->nr = ocean + 1; } } // get all the data - OCEAN is special, so start at COUNTRY for (int j = TC_COUNTRY; j < TC_NR_CATEGORIES; j++) { if (firstData[taxonomy_api_names[j]].isValid()) { - ds->taxonomy.category[ri].category = j; - ds->taxonomy.category[ri].origin = taxonomy_origin::GEOCODED; - free((void *)ds->taxonomy.category[ri].value); - ds->taxonomy.category[ri].value = copy_qstring(firstData[taxonomy_api_names[j]].toString()); + taxonomy->category[ri].category = j; + taxonomy->category[ri].origin = taxonomy_origin::GEOCODED; + free((void *)taxonomy->category[ri].value); + taxonomy->category[ri].value = copy_qstring(firstData[taxonomy_api_names[j]].toString()); ri++; } } - ds->taxonomy.nr = ri; - l3 = taxonomy_index_for_category(&ds->taxonomy, TC_ADMIN_L3); - lt = taxonomy_index_for_category(&ds->taxonomy, TC_LOCALNAME); + taxonomy->nr = ri; + l3 = taxonomy_index_for_category(taxonomy, TC_ADMIN_L3); + lt = taxonomy_index_for_category(taxonomy, TC_LOCALNAME); if (l3 == -1 && lt != -1) { // basically this means we did get a local name (what we call town), but just like most places // we didn't get an adminName_3 - which in some regions is the actual city that town belongs to, // then we copy the town into the city - ds->taxonomy.category[ri].value = copy_string(ds->taxonomy.category[lt].value); - ds->taxonomy.category[ri].origin = taxonomy_origin::GEOCOPIED; - ds->taxonomy.category[ri].category = TC_ADMIN_L3; - ds->taxonomy.nr++; + taxonomy->category[ri].value = copy_string(taxonomy->category[lt].value); + taxonomy->category[ri].origin = taxonomy_origin::GEOCOPIED; + taxonomy->category[ri].category = TC_ADMIN_L3; + taxonomy->nr++; } mark_divelist_changed(true); } else { @@ -121,7 +119,7 @@ void reverseGeoLookup() reply->abort(); } // next check the oceans API to figure out the body of water - request.setUrl(geonamesOceanURL.arg(uiLanguage(NULL).section(QRegExp("[-_ ]"), 0, 0)).arg(ds->latitude.udeg / 1000000.0).arg(ds->longitude.udeg / 1000000.0)); + request.setUrl(geonamesOceanURL.arg(uiLanguage(NULL).section(QRegExp("[-_ ]"), 0, 0)).arg(latitude.udeg / 1000000.0).arg(longitude.udeg / 1000000.0)); reply.reset(rgl.get(request)); // Note: frees old reply. QObject::connect(&*reply, SIGNAL(finished()), &loop, SLOT(quit())); timer.start(5000); // 5 secs. timeout @@ -147,17 +145,17 @@ void reverseGeoLookup() QVariantMap oceanName = oceanObject.toMap(); if (oceanName["name"].isValid()) { int idx; - if (ds->taxonomy.category == NULL) - ds->taxonomy.category = alloc_taxonomy(); - idx = taxonomy_index_for_category(&ds->taxonomy, TC_OCEAN); + if (taxonomy->category == NULL) + taxonomy->category = alloc_taxonomy(); + idx = taxonomy_index_for_category(taxonomy, TC_OCEAN); if (idx == -1) - idx = ds->taxonomy.nr; + idx = taxonomy->nr; if (idx < TC_NR_CATEGORIES) { - ds->taxonomy.category[idx].category = TC_OCEAN; - ds->taxonomy.category[idx].origin = taxonomy_origin::GEOCODED; - ds->taxonomy.category[idx].value = copy_qstring(oceanName["name"].toString()); - if (idx == ds->taxonomy.nr) - ds->taxonomy.nr++; + taxonomy->category[idx].category = TC_OCEAN; + taxonomy->category[idx].origin = taxonomy_origin::GEOCODED; + taxonomy->category[idx].value = copy_qstring(oceanName["name"].toString()); + if (idx == taxonomy->nr) + taxonomy->nr++; } mark_divelist_changed(true); } diff --git a/core/divesitehelpers.h b/core/divesitehelpers.h index eabb156f4..a894da60d 100644 --- a/core/divesitehelpers.h +++ b/core/divesitehelpers.h @@ -2,6 +2,11 @@ #ifndef DIVESITEHELPERS_H #define DIVESITEHELPERS_H -void reverseGeoLookup(); +#include "taxonomy.h" +#include "units.h" + +// Perform a reverse geo-lookup and put data in the provided taxonomy field. +// Original data with the exception of OCEAN will be overwritten. +void reverseGeoLookup(degrees_t latitude, degrees_t longitude, taxonomy_data *taxonomy); #endif // DIVESITEHELPERS_H diff --git a/desktop-widgets/locationinformation.cpp b/desktop-widgets/locationinformation.cpp index 67c23510d..7a8381966 100644 --- a/desktop-widgets/locationinformation.cpp +++ b/desktop-widgets/locationinformation.cpp @@ -330,7 +330,7 @@ void LocationInformationWidget::resetPallete() void LocationInformationWidget::reverseGeocode() { - reverseGeoLookup(); + reverseGeoLookup(displayed_dive_site.latitude, displayed_dive_site.longitude, &displayed_dive_site.taxonomy); updateLabels(); } |