+
+
+extern "C" {
+#include <curl/curl.h>
+
+ struct A3MemoryStruct {
+ char *data;
+ size_t size;
+ };
+
+ static size_t
+ WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) {
+ size_t realsize = size * nmemb;
+ struct A3MemoryStruct *mem = (struct A3MemoryStruct *)data;
+
+ mem->data = (char *)realloc(mem->data, mem->size + realsize + 1);
+ if (mem->data) {
+ memcpy(&(mem->data[mem->size]), ptr, realsize);
+ mem->size += realsize;
+ mem->data[mem->size] = 0;
+ }
+ return realsize;
+ }
+
+ char *a3_curl_http_get (const char *u, int *status) {
+ CURL *curl;
+ CURLcode res;
+ struct A3MemoryStruct chunk;
+ long int httpstatus;
+ if (status) *status = 0;
+ //Glib::usleep(500000); return NULL; // TEST & DEBUG
+ if (strncmp("http://", u, 7)) return NULL;
+
+ chunk.data=NULL;
+ chunk.size=0;
+
+ curl = curl_easy_init();
+ if(!curl) return NULL;
+ curl_easy_setopt(curl, CURLOPT_URL, u);
+
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+ curl_easy_setopt(curl, CURLOPT_USERAGENT, ARDOUR_USER_AGENT);
+ curl_easy_setopt(curl, CURLOPT_TIMEOUT, ARDOUR_CURL_TIMEOUT);
+ curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
+#ifdef CURLERRORDEBUG
+ char curlerror[CURL_ERROR_SIZE] = "";
+ curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curlerror);
+#endif
+
+ res = curl_easy_perform(curl);
+ curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpstatus);
+ curl_easy_cleanup(curl);
+ if (status) *status = httpstatus;
+ if (res) {
+#ifdef CURLERRORDEBUG
+ printf("a3_curl_http_get() failed: %s\n", curlerror);
+#endif
+ return NULL;
+ }
+ if (httpstatus != 200) {
+ free (chunk.data);
+ chunk.data = NULL;
+ }
+ return (chunk.data);
+ }
+
+} /* end extern "C" */