picplanner/src/webconnection.c

121 wiersze
3.8 KiB
C
Czysty Zwykły widok Historia

2020-06-22 07:38:23 +00:00
#include <webconnection.h>
2020-07-09 14:29:21 +00:00
/* TODO
* From https://nominatim.org/release-docs/develop/api/Search/
* Language of results
* accept-language=<browser language string>
* Preferred language order for showing search results, overrides the value specified in the "Accept-Language" HTTP header.
* Either use a standard RFC2616 accept-language string or a simple comma-separated list of language codes.
*/
2020-06-22 07:38:23 +00:00
/* Below is needes for Curl to cummunicate with Nominatim */
struct MemoryStruct {
char *memory;
size_t size;
};
/* some shit from curl I still dont get... */
size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(ptr == NULL) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
2020-07-09 14:29:21 +00:00
/* TODO
* Make this function look nicer */
2020-06-22 07:38:23 +00:00
struct Output *search_nominatim (const gchar *searchtext){
CURL *curl;
CURLcode res;
struct Output nullOutput = {NULL,0.0,0.0};
struct Output *output = &nullOutput;
struct MemoryStruct chunk;
chunk.memory = malloc(1);
chunk.size = 0;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
/* Bring the entered words into the API form of NOMINATIM see
* https://nominatim.org/release-docs/develop/api/Search/
* for further information */
char *URLsearch = curl_easy_escape(curl, searchtext, 0);
char *URLosm = "https://nominatim.openstreetmap.org/search?q=";
char *URLformat = "&format=geojson";
char *URL = (char *) malloc(1+strlen(URLsearch)+strlen(URLosm)+strlen(URLformat));
strcpy(URL,URLosm);
strcat(URL,URLsearch);
strcat(URL,URLformat);
g_print ("%s\n", URL);
curl_easy_setopt(curl, CURLOPT_URL, URL);
/* Nominatim NEEDS a Useragent! */
curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.58.0");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
{
g_print("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
else
{
/* Convert the JSON file which is handed back by nominatim
* into double variables for the north and east component */
g_print("\nParsing location\n");
json_object *json = json_tokener_parse(chunk.memory);
json_object *jsonFeatures;
json_object *jsonEntry;
json_object *jsonGeometry;
json_object *jsonCoordinates;
json_object *jsonProperties;
json_object *jsonDisplayName;
json_object_object_get_ex(json, "features", &jsonFeatures);
jsonEntry = json_object_array_get_idx(jsonFeatures, 0);
json_object_object_get_ex(jsonEntry, "geometry", &jsonGeometry);
json_object_object_get_ex(jsonGeometry, "coordinates", &jsonCoordinates);
(*output).east = json_object_get_double(json_object_array_get_idx(jsonCoordinates, 0));
(*output).north = json_object_get_double(json_object_array_get_idx(jsonCoordinates, 1));
json_object_object_get_ex(jsonEntry, "properties", &jsonProperties);
json_object_object_get_ex(jsonProperties, "display_name", &jsonDisplayName);
(*output).displayText = json_object_get_string(jsonDisplayName);
/*
* g_print("Display Text: %s, North: %f, East: %f\n",(*output).displayText, (*output).east, (*output).north);
*/
2020-06-22 07:38:23 +00:00
return output;
}
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return output;
}