mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-19 14:25:27 +00:00
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>
This commit is contained in:
parent
04ad9c885d
commit
ad57871a2c
3 changed files with 36 additions and 33 deletions
|
@ -21,7 +21,7 @@
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <memory>
|
#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,
|
// By making the QNetworkAccessManager static and local to this function,
|
||||||
// only one manager exists for all geo-lookups and it is only initialized
|
// 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());
|
request.setRawHeader("User-Agent", getUserAgent().toUtf8());
|
||||||
QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
|
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
|
// 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
|
// 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
|
// and the reply will be freed. Likewise, when overwriting the pointer with
|
||||||
|
@ -74,41 +72,41 @@ void reverseGeoLookup()
|
||||||
if (geoNames.count() > 0) {
|
if (geoNames.count() > 0) {
|
||||||
QVariantMap firstData = geoNames.at(0).toMap();
|
QVariantMap firstData = geoNames.at(0).toMap();
|
||||||
int ri = 0, l3 = -1, lt = -1;
|
int ri = 0, l3 = -1, lt = -1;
|
||||||
if (ds->taxonomy.category == NULL) {
|
if (taxonomy->category == NULL) {
|
||||||
ds->taxonomy.category = alloc_taxonomy();
|
taxonomy->category = alloc_taxonomy();
|
||||||
} else {
|
} else {
|
||||||
// clear out the data (except for the ocean data)
|
// clear out the data (except for the ocean data)
|
||||||
int ocean;
|
int ocean;
|
||||||
if ((ocean = taxonomy_index_for_category(&ds->taxonomy, TC_OCEAN)) > 0) {
|
if ((ocean = taxonomy_index_for_category(taxonomy, TC_OCEAN)) > 0) {
|
||||||
ds->taxonomy.category[0] = ds->taxonomy.category[ocean];
|
taxonomy->category[0] = taxonomy->category[ocean];
|
||||||
ds->taxonomy.nr = 1;
|
taxonomy->nr = 1;
|
||||||
} else {
|
} else {
|
||||||
// ocean is -1 if there is no such entry, and we didn't copy above
|
// 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
|
// 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
|
// get all the data - OCEAN is special, so start at COUNTRY
|
||||||
for (int j = TC_COUNTRY; j < TC_NR_CATEGORIES; j++) {
|
for (int j = TC_COUNTRY; j < TC_NR_CATEGORIES; j++) {
|
||||||
if (firstData[taxonomy_api_names[j]].isValid()) {
|
if (firstData[taxonomy_api_names[j]].isValid()) {
|
||||||
ds->taxonomy.category[ri].category = j;
|
taxonomy->category[ri].category = j;
|
||||||
ds->taxonomy.category[ri].origin = taxonomy_origin::GEOCODED;
|
taxonomy->category[ri].origin = taxonomy_origin::GEOCODED;
|
||||||
free((void *)ds->taxonomy.category[ri].value);
|
free((void *)taxonomy->category[ri].value);
|
||||||
ds->taxonomy.category[ri].value = copy_qstring(firstData[taxonomy_api_names[j]].toString());
|
taxonomy->category[ri].value = copy_qstring(firstData[taxonomy_api_names[j]].toString());
|
||||||
ri++;
|
ri++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ds->taxonomy.nr = ri;
|
taxonomy->nr = ri;
|
||||||
l3 = taxonomy_index_for_category(&ds->taxonomy, TC_ADMIN_L3);
|
l3 = taxonomy_index_for_category(taxonomy, TC_ADMIN_L3);
|
||||||
lt = taxonomy_index_for_category(&ds->taxonomy, TC_LOCALNAME);
|
lt = taxonomy_index_for_category(taxonomy, TC_LOCALNAME);
|
||||||
if (l3 == -1 && lt != -1) {
|
if (l3 == -1 && lt != -1) {
|
||||||
// basically this means we did get a local name (what we call town), but just like most places
|
// 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,
|
// 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
|
// then we copy the town into the city
|
||||||
ds->taxonomy.category[ri].value = copy_string(ds->taxonomy.category[lt].value);
|
taxonomy->category[ri].value = copy_string(taxonomy->category[lt].value);
|
||||||
ds->taxonomy.category[ri].origin = taxonomy_origin::GEOCOPIED;
|
taxonomy->category[ri].origin = taxonomy_origin::GEOCOPIED;
|
||||||
ds->taxonomy.category[ri].category = TC_ADMIN_L3;
|
taxonomy->category[ri].category = TC_ADMIN_L3;
|
||||||
ds->taxonomy.nr++;
|
taxonomy->nr++;
|
||||||
}
|
}
|
||||||
mark_divelist_changed(true);
|
mark_divelist_changed(true);
|
||||||
} else {
|
} else {
|
||||||
|
@ -121,7 +119,7 @@ void reverseGeoLookup()
|
||||||
reply->abort();
|
reply->abort();
|
||||||
}
|
}
|
||||||
// next check the oceans API to figure out the body of water
|
// 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.
|
reply.reset(rgl.get(request)); // Note: frees old reply.
|
||||||
QObject::connect(&*reply, SIGNAL(finished()), &loop, SLOT(quit()));
|
QObject::connect(&*reply, SIGNAL(finished()), &loop, SLOT(quit()));
|
||||||
timer.start(5000); // 5 secs. timeout
|
timer.start(5000); // 5 secs. timeout
|
||||||
|
@ -147,17 +145,17 @@ void reverseGeoLookup()
|
||||||
QVariantMap oceanName = oceanObject.toMap();
|
QVariantMap oceanName = oceanObject.toMap();
|
||||||
if (oceanName["name"].isValid()) {
|
if (oceanName["name"].isValid()) {
|
||||||
int idx;
|
int idx;
|
||||||
if (ds->taxonomy.category == NULL)
|
if (taxonomy->category == NULL)
|
||||||
ds->taxonomy.category = alloc_taxonomy();
|
taxonomy->category = alloc_taxonomy();
|
||||||
idx = taxonomy_index_for_category(&ds->taxonomy, TC_OCEAN);
|
idx = taxonomy_index_for_category(taxonomy, TC_OCEAN);
|
||||||
if (idx == -1)
|
if (idx == -1)
|
||||||
idx = ds->taxonomy.nr;
|
idx = taxonomy->nr;
|
||||||
if (idx < TC_NR_CATEGORIES) {
|
if (idx < TC_NR_CATEGORIES) {
|
||||||
ds->taxonomy.category[idx].category = TC_OCEAN;
|
taxonomy->category[idx].category = TC_OCEAN;
|
||||||
ds->taxonomy.category[idx].origin = taxonomy_origin::GEOCODED;
|
taxonomy->category[idx].origin = taxonomy_origin::GEOCODED;
|
||||||
ds->taxonomy.category[idx].value = copy_qstring(oceanName["name"].toString());
|
taxonomy->category[idx].value = copy_qstring(oceanName["name"].toString());
|
||||||
if (idx == ds->taxonomy.nr)
|
if (idx == taxonomy->nr)
|
||||||
ds->taxonomy.nr++;
|
taxonomy->nr++;
|
||||||
}
|
}
|
||||||
mark_divelist_changed(true);
|
mark_divelist_changed(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,11 @@
|
||||||
#ifndef DIVESITEHELPERS_H
|
#ifndef DIVESITEHELPERS_H
|
||||||
#define 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
|
#endif // DIVESITEHELPERS_H
|
||||||
|
|
|
@ -330,7 +330,7 @@ void LocationInformationWidget::resetPallete()
|
||||||
|
|
||||||
void LocationInformationWidget::reverseGeocode()
|
void LocationInformationWidget::reverseGeocode()
|
||||||
{
|
{
|
||||||
reverseGeoLookup();
|
reverseGeoLookup(displayed_dive_site.latitude, displayed_dive_site.longitude, &displayed_dive_site.taxonomy);
|
||||||
updateLabels();
|
updateLabels();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue