+public class CurlWrapper : Object {
+ private Curl.EasyHandle curl;
+ private string url = null;
+ private SourceFunc callback = null;
+ private StringBuilder result;
+
+ construct {
+ curl = new Curl.EasyHandle ();
+ // FIXME: Fremantle SDK doesn't come with certs
+ curl.setopt (Curl.Option.SSL_VERIFYPEER, 0);
+ // curl.setopt (Curl.Option.VERBOSE, 1);
+ }
+
+ static construct {
+ Curl.global_init (Curl.GLOBAL_DEFAULT);
+ }
+
+ private void* download_thread () {
+ curl.setopt (Curl.Option.WRITEFUNCTION, write_callback);
+ curl.setopt (Curl.Option.WRITEDATA, this);
+ curl.setopt (Curl.Option.URL, url);
+ var res = curl.perform ();
+ if (res != Curl.Code.OK)
+ print ("CURL: %d\n", res);
+
+ if (callback != null)
+ Idle.add (callback);
+ callback = null;
+
+ return null;
+ }
+
+ [CCode (instance_pos = -1)]
+ private size_t write_callback (void *buffer, size_t size, size_t nmemb) {
+ result.append_len ((string) buffer, (ssize_t) (size * nmemb));
+
+ return size * nmemb;
+ }
+
+ public async unowned string http_get (string _url) {
+ url = _url;
+ callback = http_get.callback;
+ result = new StringBuilder ();
+ try {
+ Thread.create(download_thread, false);
+ } catch (ThreadError e) {
+ critical ("Failed to create download thread\n");
+ return "";
+ }
+
+ yield;
+
+ return result.str;
+ }
+}