19 |
|
|
20 |
#include "appdata.h" |
#include "appdata.h" |
21 |
|
|
|
#include <curl/curl.h> |
|
|
#include <curl/types.h> /* new for v7 */ |
|
|
#include <curl/easy.h> /* new for v7 */ |
|
|
|
|
22 |
#include <libxml/parser.h> |
#include <libxml/parser.h> |
23 |
#include <libxml/tree.h> |
#include <libxml/tree.h> |
24 |
|
|
72 |
wms_cap_t *cap; |
wms_cap_t *cap; |
73 |
} wms_t; |
} wms_t; |
74 |
|
|
|
typedef struct { |
|
|
char *ptr; |
|
|
int len; |
|
|
} curl_data_t; |
|
|
|
|
|
static size_t write_callback(void *ptr, size_t size, size_t nmemb, |
|
|
void *stream) { |
|
|
curl_data_t *p = (curl_data_t*)stream; |
|
|
|
|
|
p->ptr = g_realloc(p->ptr, p->len + size*nmemb + 1); |
|
|
if(p->ptr) { |
|
|
memcpy(p->ptr+p->len, ptr, size*nmemb); |
|
|
p->len += size*nmemb; |
|
|
p->ptr[p->len] = 0; |
|
|
} |
|
|
return nmemb; |
|
|
} |
|
|
|
|
|
static char *wms_download(char *url, char *filename) { |
|
|
CURL *curl; |
|
|
CURLcode res; |
|
|
char buffer[CURL_ERROR_SIZE]; |
|
|
curl_data_t write_data; |
|
|
FILE *write_file = NULL; |
|
|
|
|
|
if(filename) { |
|
|
write_file = fopen(filename, "w"); |
|
|
} else { |
|
|
write_data.ptr = NULL; |
|
|
write_data.len = 0; |
|
|
} |
|
|
|
|
|
printf("download of \"%s\"\n", url); |
|
|
|
|
|
curl = curl_easy_init(); |
|
|
if(curl) { |
|
|
curl_easy_setopt(curl, CURLOPT_URL, url); |
|
|
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, buffer); |
|
|
|
|
|
if(filename) { |
|
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, write_file); |
|
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite); |
|
|
} else { |
|
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_data); |
|
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); |
|
|
} |
|
|
|
|
|
res = curl_easy_perform(curl); |
|
|
|
|
|
long response; |
|
|
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response); |
|
|
|
|
|
curl_easy_cleanup(curl); |
|
|
|
|
|
if(filename) { |
|
|
/* just a flag that everything went well */ |
|
|
write_data.ptr = (char*)TRUE; |
|
|
fclose(write_file); |
|
|
} |
|
|
|
|
|
/* erase reply buffer/file if there was an error */ |
|
|
if((res != 0) || (response != 200)) { |
|
|
if(filename) |
|
|
g_remove(filename); |
|
|
else |
|
|
g_free(write_data.ptr); |
|
|
|
|
|
write_data.ptr = NULL; |
|
|
} |
|
|
} |
|
|
|
|
|
return write_data.ptr; |
|
|
} |
|
|
|
|
75 |
gboolean xmlTextIs(xmlDocPtr doc, xmlNodePtr list, char *str) { |
gboolean xmlTextIs(xmlDocPtr doc, xmlNodePtr list, char *str) { |
76 |
char *nstr = (char*)xmlNodeListGetString(doc, list, 1); |
char *nstr = (char*)xmlNodeListGetString(doc, list, 1); |
77 |
if(!nstr) return FALSE; |
if(!nstr) return FALSE; |
748 |
"&REQUEST=GetCapabilities", |
"&REQUEST=GetCapabilities", |
749 |
wms->server, wms->path, append_char); |
wms->server, wms->path, append_char); |
750 |
|
|
751 |
char *cap = wms_download(url, NULL); |
char *cap = net_io_download_mem(GTK_WIDGET(appdata->window), url); |
752 |
g_free(url); |
g_free(url); |
753 |
|
|
754 |
/* ----------- parse capabilities -------------- */ |
/* ----------- parse capabilities -------------- */ |
883 |
/* remove any existing image before */ |
/* remove any existing image before */ |
884 |
wms_remove(appdata); |
wms_remove(appdata); |
885 |
|
|
886 |
if(!wms_download(url, filename)) { |
if(!net_io_download_file(GTK_WIDGET(appdata->window), url, filename)) { |
887 |
g_free(filename); |
g_free(filename); |
888 |
g_free(url); |
g_free(url); |
889 |
wms_free(wms); |
wms_free(wms); |