ecore-con: make curl support entirely runtime loaded via eina_module
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Thu, 10 Oct 2013 13:31:18 +0000 (22:31 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Thu, 10 Oct 2013 13:31:18 +0000 (22:31 +0900)
this makes curl support a pure runtime-only thing. libcurl is loaded by
eina_module (dlopen/dlsym) when curl is actually first needed (when a
url connection/object is created). this means that ecore-con has no
link or compile dependencies on curl, only runtime, AND this saves
memory (due to curl inits using apparently a chunk of private pages).
so this saves memory and moves the dependency to runtime (though still
consider libcurl a dependency of efl - but like a binary executed,
it's at runtime).

ChangeLog
NEWS
configure.ac
src/lib/ecore_con/ecore_con_private.h
src/lib/ecore_con/ecore_con_url.c

index 0fec054..f81b139 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-10  Carsten Haitzler (The Rasterman)
+
+        * Ecore-con: use dlopen/dlsym (eina_module) to load libcurl to
+        save memory (private pages) when not yet used by the process
+
 2013-10-10  Michael Bouchaud (yoz)
 
        * Emotion: add two events to trigger webcam plug and unplug
diff --git a/NEWS b/NEWS
index 173dd1b..fa99192 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -223,6 +223,7 @@ Improvements:
      - Add iterator for walking child of smart objects, table and a box.
     * Ecore_Con:
      - Rebase dns.c against upstream
+     - URL support now dynamically loads libcurl at runtime via eina_module.
     * Edje:
      - Entry: cursor position and location will be passed when it's really changed in case of mouse down, move, and up event.
      - Entry: remove ecore_imf_context_reset in mouse up event because it's useless.
index 77972b8..d5a359e 100644 (file)
@@ -1969,26 +1969,12 @@ EFL_LIB_END([Ecore])
 
 EFL_LIB_START([Ecore_Con])
 
-### Additional options to configure
-
-AC_ARG_ENABLE([curl],
-   [AC_HELP_STRING([--disable-curl], [disable curl support. @<:@default=enabled@:>@])],
-   [
-    if test "x${enableval}" = "xyes" ; then
-       want_curl="yes"
-    else
-       want_curl="no"
-    fi
-   ],
-   [want_curl="yes"])
-
 ### Default values
 
 want_ecore_con_local_sockets="yes"
 want_ecore_con_abstract_sockets="yes"
 
 if test "${have_wince}" = "yes"; then
-   want_curl="no"
    want_cares="no"
    want_ecore_con_local_sockets="no"
    want_ecore_con_abstract_sockets="no"
@@ -2027,8 +2013,6 @@ EFL_INTERNAL_DEPEND_PKG([ECORE_CON], [ecore])
 
 EFL_ADD_LIBS([ECORE_CON], [-lm])
 
-EFL_OPTIONAL_DEPEND_PKG([ECORE_CON], [${want_curl}], [CURL], [libcurl])
-
 EFL_OPTIONAL_DEPEND_PKG([ECORE_CON], [${want_cares}],
    [CARES], [libcares >= 1.6.1])
 AM_CONDITIONAL([HAVE_CARES], [test "x${have_cares}" = "xyes"])
@@ -2043,7 +2027,6 @@ fi
 
 EFL_OPTIONAL_DEPEND_PKG([ECORE_CON], [${want_systemd}], [SYSTEMD], [libsystemd-daemon])
 
-EFL_ADD_FEATURE([ECORE_CON], [curl])
 EFL_ADD_FEATURE([ECORE_CON], [cares])
 EFL_ADD_FEATURE([ECORE_CON], [local-sockets], [${want_ecore_con_local_sockets}])
 EFL_ADD_FEATURE([ECORE_CON], [abstract-sockets], [${want_ecore_con_abstract_sockets}])
index bdd7d96..ea9fada 100644 (file)
@@ -17,9 +17,6 @@
 #elif HAVE_OPENSSL
 # include <openssl/ssl.h>
 #endif
-#ifdef HAVE_CURL
-#include <curl/curl.h>
-#endif
 
 #define READBUFSIZ 65536
 
@@ -199,11 +196,10 @@ struct _Ecore_Con_Server
 #endif
 };
 
-#ifdef HAVE_CURL
 struct _Ecore_Con_Url
 {
    ECORE_MAGIC;
-   CURL *curl_easy;
+   void *curl_easy;
    struct curl_slist *headers;
    Eina_List *additional_headers;
    Eina_List *response_headers;
@@ -226,7 +222,6 @@ struct _Ecore_Con_Url
    Eina_Bool dead : 1;
    Eina_Bool multi : 1;
 };
-#endif
 
 struct _Ecore_Con_Info
 {
index f427138..959ca94 100644 (file)
 #include "Ecore_Con.h"
 #include "ecore_con_private.h"
 
+// all the types, defines, enums etc. from curl that we actuall USE.
+// we have to add to this if we use more things from curl not already
+// defined here. see culr headers to get them from
+typedef enum {
+   CURLM_CALL_MULTI_PERFORM = -1,
+   CURLM_OK = 0
+} CURLMcode;
+typedef enum {
+   CURLE_OK = 0,
+   CURLE_OPERATION_TIMEDOUT = 28
+} CURLcode;
+#define CURLOPTTYPE_LONG          0
+#define CURLOPTTYPE_OBJECTPOINT   10000
+#define CURLOPTTYPE_FUNCTIONPOINT 20000
+#define CURLOPTTYPE_OFF_T         30000
+#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu
+typedef enum {
+   CINIT(FILE, OBJECTPOINT, 1),
+   CINIT(URL,  OBJECTPOINT, 2),
+   CINIT(PROXY, OBJECTPOINT, 4),
+   CINIT(USERPWD, OBJECTPOINT, 5),
+   CINIT(INFILE, OBJECTPOINT, 9),
+   CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11),
+   CINIT(READFUNCTION, FUNCTIONPOINT, 12),
+   CINIT(POSTFIELDS, OBJECTPOINT, 15),
+   CINIT(HTTPHEADER, OBJECTPOINT, 23),
+   CINIT(WRITEHEADER, OBJECTPOINT, 29),
+   CINIT(COOKIEFILE, OBJECTPOINT, 31),
+   CINIT(TIMECONDITION, LONG, 33),
+   CINIT(TIMEVALUE, LONG, 34),
+   CINIT(CUSTOMREQUEST, OBJECTPOINT, 36),
+   CINIT(VERBOSE, LONG, 41),
+   CINIT(NOPROGRESS, LONG, 43),
+   CINIT(UPLOAD, LONG, 46),
+   CINIT(POST, LONG, 47),
+   CINIT(FOLLOWLOCATION, LONG, 52),
+   CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56),
+   CINIT(PROGRESSDATA, OBJECTPOINT, 57),
+   CINIT(POSTFIELDSIZE, LONG, 60),
+   CINIT(SSL_VERIFYPEER, LONG, 64),
+   CINIT(CAINFO, OBJECTPOINT, 65),
+   CINIT(CONNECTTIMEOUT, LONG, 78),
+   CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79),
+   CINIT(COOKIEJAR, OBJECTPOINT, 82),
+   CINIT(HTTP_VERSION, LONG, 84),
+   CINIT(FTP_USE_EPSV, LONG, 85),
+   CINIT(COOKIESESSION, LONG, 96),
+   CINIT(PROXYTYPE, LONG, 101),
+   CINIT(ACCEPT_ENCODING, OBJECTPOINT, 102),
+   CINIT(HTTPAUTH, LONG, 107),
+   CINIT(INFILESIZE_LARGE, OFF_T, 115),
+   CINIT(COOKIELIST, OBJECTPOINT, 135),
+   CINIT(USERNAME, OBJECTPOINT, 173),
+   CINIT(PASSWORD, OBJECTPOINT, 174)
+} CURLoption;
+#define CURLINFO_STRING   0x100000
+#define CURLINFO_LONG     0x200000
+#define CURLINFO_DOUBLE   0x300000
+#define CURLINFO_SLIST    0x400000
+#define CURLINFO_MASK     0x0fffff
+#define CURLINFO_TYPEMASK 0xf00000
+typedef enum {
+     CURLINFO_RESPONSE_CODE = CURLINFO_LONG   + 2,
+} CURLINFO;
+typedef enum {
+   CURLVERSION_FOURTH = 3
+} CURLversion;
+typedef enum {
+   CURLMSG_DONE = 1
+} CURLMSG;
+#undef CINIT
+#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num
+typedef enum {
+   CINIT(PIPELINING, LONG, 3)
+} CURLMoption;
+typedef enum {
+   CURL_TIMECOND_NONE = 0,
+   CURL_TIMECOND_IFMODSINCE = 1,
+   CURL_TIMECOND_IFUNMODSINCE = 2
+} curl_TimeCond;
+enum {
+   CURL_HTTP_VERSION_1_0 = 1,
+   CURL_HTTP_VERSION_1_1 = 2,
+};
+typedef enum {
+   CURLPROXY_HTTP = 0,
+   CURLPROXY_SOCKS4 = 4,
+   CURLPROXY_SOCKS5 = 5,
+   CURLPROXY_SOCKS4A = 6,
+   CURLPROXY_SOCKS5_HOSTNAME = 7
+} curl_proxytype;
+
+#define CURL_GLOBAL_SSL (1<<0)
+#define CURL_GLOBAL_WIN32 (1<<1)
+#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
+#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING
+#define CURLOPT_WRITEDATA CURLOPT_FILE
+#define CURLOPT_READDATA  CURLOPT_INFILE
+#define CURLOPT_HEADERDATA CURLOPT_WRITEHEADER
+#define CURLVERSION_NOW CURLVERSION_FOURTH
+#define CURLAUTH_BASIC (((unsigned long)1)<<0)
+#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4)
+#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE)
+#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE))
+#define CURL_READFUNC_ABORT 0x10000000
+
+typedef void CURLM;
+typedef void CURL;
+struct curl_slist {
+   char *data;
+   struct curl_slist *next;
+};
+typedef struct {
+   CURLversion age;
+   const char *version;
+   unsigned int version_num;
+   const char *host;
+   int features;
+   const char *ssl_version;
+   long ssl_version_num;
+   const char *libz_version;
+   const char * const *protocols;
+   const char *ares;
+   int ares_num;
+   const char *libidn;
+   int iconv_ver_num;
+   const char *libssh_version;
+} curl_version_info_data;
+typedef struct {
+   CURLMSG msg;
+   CURL *easy_handle;
+   union {
+      void *whatever;
+      CURLcode result;
+   } data;
+} CURLMsg;
+
+
+typedef struct _Ecore_Con_Curl Ecore_Con_Curl;
+
+struct _Ecore_Con_Curl
+{
+   Eina_Module *mod;
+   
+   CURLM *_curlm;
+   
+   CURLcode (*curl_global_init) (long flags);
+   void (*curl_global_cleanup)(void);
+   CURLM *(*curl_multi_init)(void);
+   CURLMcode (*curl_multi_timeout)(CURLM *multi_handle,
+                                   long *milliseconds);
+   CURLMcode (*curl_multi_cleanup)(CURLM *multi_handle);
+   CURLMcode (*curl_multi_remove_handle)(CURLM *multi_handle,
+                                         CURL *curl_handle);
+   const char *(*curl_multi_strerror)(CURLMcode);
+   CURLMsg *(*curl_multi_info_read)(CURLM *multi_handle,
+                                    int *msgs_in_queue);
+   CURLMcode (*curl_multi_fdset)(CURLM *multi_handle,
+                                 fd_set *read_fd_set,
+                                 fd_set *write_fd_set,
+                                 fd_set *exc_fd_set,
+                                 int *max_fd);
+   CURLMcode (*curl_multi_perform)(CURLM *multi_handle,
+                                   int *running_handles);
+   CURLMcode (*curl_multi_add_handle)(CURLM *multi_handle,
+                                      CURL *curl_handle);
+   CURLMcode (*curl_multi_setopt)(CURLM *multi_handle,
+                                  CURLMoption option, ...);
+   CURL *(*curl_easy_init)(void);
+   CURLcode (*curl_easy_setopt)(CURL *curl, CURLoption option, ...);
+   const char *(*curl_easy_strerror)(CURLcode);
+   void (*curl_easy_cleanup)(CURL *curl);
+   CURLcode (*curl_easy_getinfo)(CURL *curl, CURLINFO info, ...);
+   void (*curl_slist_free_all)(struct curl_slist *);
+   struct curl_slist *(*curl_slist_append)(struct curl_slist *list,
+                                           const char *string);
+   curl_version_info_data *(*curl_version_info)(CURLversion);
+};
+
 #define CURL_MIN_TIMEOUT 100
 
 int ECORE_CON_EVENT_URL_DATA = 0;
 int ECORE_CON_EVENT_URL_COMPLETE = 0;
 int ECORE_CON_EVENT_URL_PROGRESS = 0;
 
-#ifdef HAVE_CURL
 static void      _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg);
 static void      _ecore_con_url_multi_remove(Ecore_Con_Url *url_con);
 static Eina_Bool _ecore_con_url_perform(Ecore_Con_Url *url_con);
@@ -52,12 +230,87 @@ static void      _ecore_con_url_status_get(Ecore_Con_Url *url_con);
 
 static Eina_List *_url_con_list = NULL;
 static Eina_List *_fd_hd_list = NULL;
-static CURLM *_curlm = NULL;
 static int _init_count = 0;
 static Ecore_Timer *_curl_timer = NULL;
 static Eina_Bool pipelining = EINA_FALSE;
 static Ecore_Idler *_curl_idler = NULL;
-#endif
+
+static Ecore_Con_Curl *_c = NULL;
+static Eina_Bool _c_fail = EINA_FALSE;
+
+static Eina_Bool
+_c_init(void)
+{
+   long ms = 0;
+   
+   if (_c) return EINA_TRUE;
+   if (_c_fail) return EINA_FALSE;
+   _c = calloc(1, sizeof(Ecore_Con_Curl));
+   if (!_c) goto error;
+   _c->mod = eina_module_new("libcurl.so.4");
+   if (!_c->mod) goto error;
+   if (!eina_module_load(_c->mod)) goto error;
+
+#define SYM(x) if (!(_c->x = eina_module_symbol_get(_c->mod, #x))) goto error
+   SYM(curl_global_init);
+   SYM(curl_global_cleanup);
+   SYM(curl_multi_init);
+   SYM(curl_multi_timeout);
+   SYM(curl_multi_cleanup);
+   SYM(curl_multi_remove_handle);
+   SYM(curl_multi_strerror);
+   SYM(curl_multi_info_read);
+   SYM(curl_multi_fdset);
+   SYM(curl_multi_perform);
+   SYM(curl_multi_add_handle);
+   SYM(curl_multi_setopt);
+   SYM(curl_easy_init);
+   SYM(curl_easy_setopt);
+   SYM(curl_easy_strerror);
+   SYM(curl_easy_cleanup);
+   SYM(curl_easy_getinfo);
+   SYM(curl_slist_free_all);
+   SYM(curl_slist_append);
+   SYM(curl_version_info);
+   
+   // curl_global_init() is not thread safe!
+   if (_c->curl_global_init(CURL_GLOBAL_ALL)) goto error;
+   _c->_curlm = _c->curl_multi_init();
+   if (!_c->_curlm)
+     {
+        _c->curl_global_cleanup();
+        goto error;
+     }
+   _c->curl_multi_timeout(_c->_curlm, &ms);
+   if ((ms >= CURL_MIN_TIMEOUT) || (ms <= 0)) ms = CURL_MIN_TIMEOUT;
+   _curl_timer = ecore_timer_add((double)ms / 1000.0,
+                                 _ecore_con_url_timer, NULL);
+   ecore_timer_freeze(_curl_timer);
+   return EINA_TRUE;
+error:
+   if (_c)
+     {
+        if (_c->mod) eina_module_free(_c->mod);
+        free(_c);
+        _c = NULL;
+     }
+   _c_fail = EINA_TRUE;
+   return EINA_FALSE;
+}
+
+static void
+_c_shutdown(void)
+{
+   if (!_c) return;
+   if (_c->_curlm)
+     {
+        _c->curl_multi_cleanup(_c->_curlm);
+     }
+   _c->curl_global_cleanup();
+   if (_c->mod) eina_module_free(_c->mod);
+   free(_c);
+   _c = NULL;
+}
 
 /**
  * @addtogroup Ecore_Con_Url_Group Ecore URL Connection Functions
@@ -68,95 +321,52 @@ static Ecore_Idler *_curl_idler = NULL;
 EAPI int
 ecore_con_url_init(void)
 {
-#ifdef HAVE_CURL
-   long ms;
    if (++_init_count > 1) return _init_count;
-
    ECORE_CON_EVENT_URL_DATA = ecore_event_type_new();
    ECORE_CON_EVENT_URL_COMPLETE = ecore_event_type_new();
    ECORE_CON_EVENT_URL_PROGRESS = ecore_event_type_new();
-
-   // curl_global_init() is not thread safe!
-   if (curl_global_init(CURL_GLOBAL_ALL)) return --_init_count;
-
-   _curlm = curl_multi_init();
-   if (!_curlm)
-     {
-        curl_global_cleanup();
-        return --_init_count;
-     }
-
-   curl_multi_timeout(_curlm, &ms);
-   if ((ms >= CURL_MIN_TIMEOUT) || (ms <= 0)) ms = CURL_MIN_TIMEOUT;
-
-   _curl_timer = ecore_timer_add((double)ms / 1000.0,
-                                 _ecore_con_url_timer, NULL);
-   ecore_timer_freeze(_curl_timer);
-
    return _init_count;
-#else
-   return 0;
-#endif
 }
 
 EAPI int
 ecore_con_url_shutdown(void)
 {
-#ifdef HAVE_CURL
    Ecore_Con_Url *url_con;
    Ecore_Fd_Handler *fd_handler;
    if (_init_count == 0) return 0;
    --_init_count;
    if (_init_count) return _init_count;
-
    if (_curl_timer)
      {
         ecore_timer_del(_curl_timer);
         _curl_timer = NULL;
      }
-
    if (_curl_idler)
      {
         ecore_idler_del(_curl_idler);
         _curl_idler = NULL;
      }
-
    EINA_LIST_FREE(_url_con_list, url_con)
      ecore_con_url_free(url_con);
    EINA_LIST_FREE(_fd_hd_list, fd_handler)
      ecore_main_fd_handler_del(fd_handler);
-
-   if (_curlm)
-     {
-        curl_multi_cleanup(_curlm);
-        _curlm = NULL;
-     }
-   curl_global_cleanup();
+   _c_shutdown();
    return 0;
-#endif
-   return 1;
 }
 
 EAPI void
 ecore_con_url_pipeline_set(Eina_Bool enable)
 {
-#ifdef HAVE_CURL
+   if (!_c_init()) return;
    if (enable == pipelining) return;
-   curl_multi_setopt(_curlm, CURLMOPT_PIPELINING, !!enable);
+   _c->curl_multi_setopt(_c->_curlm, CURLMOPT_PIPELINING, !!enable);
    pipelining = enable;
-#else
-   return;
-   (void)enable;
-#endif
 }
 
 EAPI Eina_Bool
 ecore_con_url_pipeline_get(void)
 {
-#ifdef HAVE_CURL
    return pipelining;
-#endif
-   return EINA_FALSE;
 }
 
 extern Ecore_Con_Socks *_ecore_con_proxy_global;
@@ -164,20 +374,18 @@ extern Ecore_Con_Socks *_ecore_con_proxy_global;
 EAPI Ecore_Con_Url *
 ecore_con_url_new(const char *url)
 {
-#ifdef HAVE_CURL
    Ecore_Con_Url *url_con;
    CURLcode ret;
 
-   if (!_init_count)
-     return NULL;
-
+   if (!_init_count) return NULL;
+   if (!_c_init()) return NULL;
+   
    url_con = calloc(1, sizeof(Ecore_Con_Url));
-   if (!url_con)
-     return NULL;
+   if (!url_con) return NULL;
 
    url_con->write_fd = -1;
 
-   url_con->curl_easy = curl_easy_init();
+   url_con->curl_easy = _c->curl_easy_init();
    if (!url_con->curl_easy)
      {
         free(url_con);
@@ -195,8 +403,8 @@ ecore_con_url_new(const char *url)
    // Read socks proxy
    url_con->proxy_type = -1;
    if (_ecore_con_proxy_global && _ecore_con_proxy_global->ip &&
-       (_ecore_con_proxy_global->version == 4 ||
-        _ecore_con_proxy_global->version == 5))
+       ((_ecore_con_proxy_global->version == 4) ||
+        (_ecore_con_proxy_global->version == 5)))
      {
         char proxy[256];
         char host[256];
@@ -229,98 +437,83 @@ ecore_con_url_new(const char *url)
                                          _ecore_con_proxy_global->username);
      }
 
-   ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate");
+   ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING,
+                              "gzip,deflate");
    if (ret != CURLE_OK)
      {
         ERR("Could not set CURLOPT_ENCODING to \"gzip,deflate\": %s",
-            curl_easy_strerror(ret));
+            _c->curl_easy_strerror(ret));
         ecore_con_url_free(url_con);
         return NULL;
      }
 
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION,
-                    _ecore_con_url_data_cb);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEDATA, url_con);
-
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
-                    _ecore_con_url_progress_cb);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
-
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION,
-                    _ecore_con_url_header_cb);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con);
-
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION,
+                        _ecore_con_url_data_cb);
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEDATA, url_con);
+   
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
+                        _ecore_con_url_progress_cb);
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con);
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
+   
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION,
+                        _ecore_con_url_header_cb);
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con);
    /*
     * FIXME: Check that these timeouts are sensible defaults
     * FIXME: Provide a means to change these timeouts
     */
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
-
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30);
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
    return url_con;
-#else
-   return NULL;
-   (void)url;
-#endif
 }
 
 EAPI Ecore_Con_Url *
 ecore_con_url_custom_new(const char *url,
                          const char *custom_request)
 {
-#ifdef HAVE_CURL
    Ecore_Con_Url *url_con;
    CURLcode ret;
 
-   if (!url)
-     return NULL;
-
-   if (!custom_request)
-     return NULL;
-
+   if (!_init_count) return NULL;
+   if (!_c_init()) return NULL;
+   if (!url) return NULL;
+   if (!custom_request) return NULL;
    url_con = ecore_con_url_new(url);
+   if (!url_con) return NULL;
 
-   if (!url_con)
-     return NULL;
-
-   ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request);
+   ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST,
+                              custom_request);
    if (ret != CURLE_OK)
      {
         ERR("Could not set a custom request string: %s",
-            curl_easy_strerror(ret));
+            _c->curl_easy_strerror(ret));
         ecore_con_url_free(url_con);
         return NULL;
      }
-
    return url_con;
-#else
-   return NULL;
-   (void)url;
-   (void)custom_request;
-#endif
 }
 
 EAPI void
 ecore_con_url_free(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
    char *s;
 
-   if (!url_con) return;
-
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_free");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->curl_easy)
      {
-        // FIXME : How can we delete curl_easy's fds ?? (Curl do not give this info.)
+        // FIXME : How can we delete curl_easy's fds ??
+        // (Curl do not give this info.)
         // This cause "Failed to delete epoll fd xx!" error messages
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL);
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_TRUE);
+        _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
+                             NULL);
+        _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS,
+                             EINA_TRUE);
 
         if (url_con->multi)
           {
@@ -328,7 +521,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
              _url_con_list = eina_list_remove(_url_con_list, url_con);
           }
 
-        curl_easy_cleanup(url_con->curl_easy);
+        _c->curl_easy_cleanup(url_con->curl_easy);
      }
    if (url_con->timer) ecore_timer_del(url_con->timer);
 
@@ -338,287 +531,203 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
    if (url_con->event_count) return;
    ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE);
 
-   curl_slist_free_all(url_con->headers);
-   EINA_LIST_FREE(url_con->additional_headers, s)
-     free(s);
-   EINA_LIST_FREE(url_con->response_headers, s)
-     free(s);
+   _c->curl_slist_free_all(url_con->headers);
+   EINA_LIST_FREE(url_con->additional_headers, s) free(s);
+   EINA_LIST_FREE(url_con->response_headers, s) free(s);
    eina_stringshare_del(url_con->url);
    if (url_con->post_data) free(url_con->post_data);
    free(url_con);
-#else
-   return;
-   (void)url_con;
-#endif
 }
 
 EAPI const char *
 ecore_con_url_url_get(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
         ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return NULL;
      }
    return url_con->url;
-#else
-   return NULL;
-   (void)url_con;
-#endif
 }
 
 EAPI int
 ecore_con_url_status_code_get(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
         ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return 0;
      }
-
    if (url_con->status) return url_con->status;
    _ecore_con_url_status_get(url_con);
    return url_con->status;
-#else
-   return -1;
-   (void)url_con;
-#endif
 }
 
 EAPI Eina_Bool
 ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url)
 {
-#ifdef HAVE_CURL
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_url_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
-
    if (url_con->dead) return EINA_FALSE;
    eina_stringshare_replace(&url_con->url, url);
-
    if (url_con->url)
-     curl_easy_setopt(url_con->curl_easy, CURLOPT_URL,
-                      url_con->url);
+     _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_URL,
+                          url_con->url);
    else
-     curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, "");
-
+     _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, "");
    return EINA_TRUE;
-#else
-   return EINA_FALSE;
-   (void)url;
-   (void)url_con;
-#endif
 }
 
 EAPI void
 ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data)
 {
-#ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    url_con->data = data;
-#else
-   return;
-   (void)url_con;
-   (void)data;
-#endif
 }
 
 EAPI void
 ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, const char *value)
 {
-#ifdef HAVE_CURL
    char *tmp;
 
-   if (url_con->dead) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_additional_header_add");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
 
    if (url_con->dead) return;
    tmp = malloc(strlen(key) + strlen(value) + 3);
-   if (!tmp)
-     return;
-
+   if (!tmp) return;
    sprintf(tmp, "%s: %s", key, value);
    url_con->additional_headers = eina_list_append(url_con->additional_headers,
                                                   tmp);
-#else
-   return;
-   (void)url_con;
-   (void)key;
-   (void)value;
-#endif
 }
 
 EAPI void
 ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
    char *s;
 
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_additional_headers_clear");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
-   EINA_LIST_FREE(url_con->additional_headers, s)
-     free(s);
-#else
-   return;
-   (void)url_con;
-#endif
+   EINA_LIST_FREE(url_con->additional_headers, s) free(s);
 }
 
 EAPI void *
 ecore_con_url_data_get(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_get");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return NULL;
      }
-
    return url_con->data;
-#else
-   return NULL;
-   (void)url_con;
-#endif
 }
 
 EAPI void
 ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, double timestamp)
 {
-#ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_time");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->dead) return;
    url_con->time_condition = condition;
    url_con->timestamp = timestamp;
-#else
-   return;
-   (void)url_con;
-   (void)condition;
-   (void)timestamp;
-#endif
 }
 
 EAPI void
 ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd)
 {
-#ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->dead) return;
    url_con->write_fd = fd;
-#else
-   return;
-   (void)url_con;
-   (void)fd;
-#endif
 }
 
 EAPI int
 ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_received_bytes_get");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return -1;
      }
-
    return url_con->received;
-#else
-   return 0;
-   (void)url_con;
-#endif
 }
 
 EAPI const Eina_List *
 ecore_con_url_response_headers_get(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
+        return NULL;
+     }
    return url_con->response_headers;
-#else
-   return NULL;
-   (void)url_con;
-#endif
 }
 
 EAPI Eina_Bool
 ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, const char *password, Eina_Bool safe)
 {
-#ifdef HAVE_CURL
    CURLcode ret;
+   curl_version_info_data *vers = NULL;
 
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_httpauth_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
-
    if (url_con->dead) return EINA_FALSE;
-# if LIBCURL_VERSION_NUM >= 0x071301
-   if ((username) && (password))
+   vers = _c->curl_version_info(CURLVERSION_NOW);
+   if (vers->version_num >= 0x071301)
      {
-        if (safe)
-          curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
-                           CURLAUTH_ANYSAFE);
-        else
-          curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
-
-        ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
-        if (ret != CURLE_OK)
+        if ((username) && (password))
           {
-             ERR("Could not set username for HTTP authentication: %s",
-                 curl_easy_strerror(ret));
-             return EINA_FALSE;
-          }
-
-        ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
-        if (ret != CURLE_OK)
-          {
-             ERR("Could not set password for HTTP authentication: %s",
-                 curl_easy_strerror(ret));
-             return EINA_FALSE;
+             if (safe)
+               _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
+                                CURLAUTH_ANYSAFE);
+             else
+               _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
+                                    CURLAUTH_ANY);
+             
+             ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME,
+                                        username);
+             if (ret != CURLE_OK)
+               {
+                  ERR("Could not set username for HTTP authentication: %s",
+                      _c->curl_easy_strerror(ret));
+                  return EINA_FALSE;
+               }
+             
+             ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD,
+                                        password);
+             if (ret != CURLE_OK)
+               {
+                  ERR("Could not set password for HTTP authentication: %s",
+                      _c->curl_easy_strerror(ret));
+                  return EINA_FALSE;
+               }
+             return EINA_TRUE;
           }
-
-        return EINA_TRUE;
      }
-# endif
-#else
-   return EINA_FALSE;
-   (void)url_con;
-   (void)username;
-   (void)password;
-   (void)safe;
-#endif
-
    return EINA_FALSE;
 }
 
@@ -629,14 +738,14 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, const c
 static Eina_Bool
 _ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long length, const char *content_type)
 {
-#ifdef HAVE_CURL
    Eina_List *l;
    const char *s;
    char tmp[512];
 
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_send");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
 
@@ -644,14 +753,12 @@ _ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long len
    if (url_con->dead) return EINA_FALSE;
 
    /* Free response headers from previous send() calls */
-   EINA_LIST_FREE(url_con->response_headers, s)
-     free((char *)s);
+   EINA_LIST_FREE(url_con->response_headers, s) free((char *)s);
    url_con->response_headers = NULL;
    url_con->status = 0;
 
-   curl_slist_free_all(url_con->headers);
+   _c->curl_slist_free_all(url_con->headers);
    url_con->headers = NULL;
-
    if ((mode == MODE_POST) || (mode == MODE_AUTO))
      {
         if (url_con->post_data) free(url_con->post_data);
@@ -664,59 +771,52 @@ _ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long len
                   memcpy(url_con->post_data, data, length);
                   if ((content_type) && (strlen(content_type) < 450))
                     {
-                       snprintf(tmp, sizeof(tmp), "Content-Type: %s", content_type);
-                       url_con->headers = curl_slist_append(url_con->headers, tmp);
+                       snprintf(tmp, sizeof(tmp), "Content-Type: %s",
+                                content_type);
+                       url_con->headers =
+                         _c->curl_slist_append(url_con->headers, tmp);
                     }
-                  curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, url_con->post_data);
-                  curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, length);
+                  _c->curl_easy_setopt(url_con->curl_easy,
+                                       CURLOPT_POSTFIELDS, url_con->post_data);
+                  _c->curl_easy_setopt(url_con->curl_easy,
+                                       CURLOPT_POSTFIELDSIZE, length);
                }
              else
                return EINA_FALSE;
           }
-        else curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, 0);
+        else _c->curl_easy_setopt(url_con->curl_easy,
+                                  CURLOPT_POSTFIELDSIZE, 0);
         if (mode == MODE_POST)
-          curl_easy_setopt(url_con->curl_easy, CURLOPT_POST, 1);
+          _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_POST, 1);
      }
 
    switch (url_con->time_condition)
      {
       case ECORE_CON_URL_TIME_NONE:
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
+        _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
                          CURL_TIMECOND_NONE);
         break;
-
       case ECORE_CON_URL_TIME_IFMODSINCE:
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
+        _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
                          CURL_TIMECOND_IFMODSINCE);
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
+        _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
                          (long)url_con->timestamp);
         break;
-
       case ECORE_CON_URL_TIME_IFUNMODSINCE:
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
+        _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
                          CURL_TIMECOND_IFUNMODSINCE);
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
+        _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
                          (long)url_con->timestamp);
         break;
      }
-
    /* Additional headers */
    EINA_LIST_FOREACH(url_con->additional_headers, l, s)
-     url_con->headers = curl_slist_append(url_con->headers, s);
-
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, url_con->headers);
+     url_con->headers = _c->curl_slist_append(url_con->headers, s);
 
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER,
+                        url_con->headers);
    url_con->received = 0;
-
    return _ecore_con_url_perform(url_con);
-#else
-   return EINA_FALSE;
-   (void)url_con;
-   (void)mode;
-   (void)data;
-   (void)length;
-   (void)content_type;
-#endif
 }
 
 EAPI Eina_Bool
@@ -734,18 +834,16 @@ ecore_con_url_post(Ecore_Con_Url *url_con, const void *data, long length, const
 EAPI Eina_Bool
 ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const char *user, const char *pass, const char *upload_dir)
 {
-#ifdef HAVE_CURL
    char url[4096];
    char userpwd[4096];
    FILE *fd;
    struct stat file_info;
    CURLcode ret;
 
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con,
-                         ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_ftp_upload");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
 
@@ -753,15 +851,14 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const cha
    if (!url_con->url) return EINA_FALSE;
    if ((!filename) || (!filename[0])) return EINA_FALSE;
 
-   if (stat(filename, &file_info))
-     return EINA_FALSE;
+   if (stat(filename, &file_info)) return EINA_FALSE;
 
    snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
-   ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
+   ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
    if (ret != CURLE_OK)
      {
         ERR("Could not set username and password for FTP upload: %s",
-            curl_easy_strerror(ret));
+            _c->curl_easy_strerror(ret));
         return EINA_FALSE;
      }
 
@@ -777,244 +874,150 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const cha
 
    if (!ecore_con_url_url_set(url_con, url))
      return EINA_FALSE;
-
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE,
-                    (curl_off_t)file_info.st_size);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION,
-                    _ecore_con_url_read_cb);
-
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE,
+                        (off_t)file_info.st_size);
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION,
+                        _ecore_con_url_read_cb);
    fd = fopen(filename, "rb");
    if (!fd)
      {
         ERR("Could not open \"%s\" for FTP upload", filename);
         return EINA_FALSE;
      }
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd);
-
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd);
    return _ecore_con_url_perform(url_con);
-#else
-   return EINA_FALSE;
-   (void)url_con;
-   (void)filename;
-   (void)user;
-   (void)pass;
-   (void)upload_dir;
-#endif
 }
 
 EAPI void
 ecore_con_url_cookies_init(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
-   if (!url_con)
-     return;
-
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_cookies_init");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, "");
-#else
-   return;
-   (void)url_con;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, "");
 }
 
 EAPI void
 ecore_con_url_cookies_ignore_old_session_set(Ecore_Con_Url *url_con, Eina_Bool ignore)
 {
-#ifdef HAVE_CURL
-   if (!url_con)
-     return;
-
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_cookies_ignore_old_session_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIESESSION, ignore);
-#else
-   return;
-   (void)url_con;
-   (void)ignore;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIESESSION, ignore);
 }
 
 EAPI void
 ecore_con_url_cookies_clear(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
-   if (!url_con)
-     return;
-
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_cookies_clear");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "ALL");
-#else
-   return;
-   (void)url_con;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "ALL");
 }
 
 EAPI void
 ecore_con_url_cookies_session_clear(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
-   if (!url_con)
-     return;
-
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_cookies_session_clear");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "SESS");
-#else
-   return;
-   (void)url_con;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "SESS");
 }
 
 EAPI void
 ecore_con_url_cookies_file_add(Ecore_Con_Url *url_con, const char *const file_name)
 {
-#ifdef HAVE_CURL
-   if (!url_con)
-     return;
-
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_cookies_file_add");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, file_name);
-#else
-   return;
-   (void)url_con;
-   (void)file_name;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, file_name);
 }
 
 EAPI Eina_Bool
 ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_con, const char *const cookiejar_file)
 {
-#ifdef HAVE_CURL
    CURLcode ret;
 
-   if (!url_con)
-     return EINA_FALSE;
-
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_cookies_jar_file_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
-
    if (url_con->dead) return EINA_FALSE;
-   ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEJAR,
-                          cookiejar_file);
+   ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEJAR,
+                              cookiejar_file);
    if (ret != CURLE_OK)
      {
         ERR("Setting the cookie-jar name failed: %s",
-            curl_easy_strerror(ret));
+            _c->curl_easy_strerror(ret));
         return EINA_FALSE;
      }
-
    return EINA_TRUE;
-#else
-   return EINA_FALSE;
-   (void)url_con;
-   (void)cookiejar_file;
-#endif
 }
 
 EAPI void
 ecore_con_url_cookies_jar_write(Ecore_Con_Url *url_con)
 {
-#ifdef HAVE_CURL
-   if (!url_con)
-     return;
-
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_cookies_jar_write");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
 
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "FLUSH");
-#else
-   return;
-   (void)url_con;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "FLUSH");
 }
 
 EAPI void
 ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose)
 {
-#ifdef HAVE_CURL
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_verbose_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
-   if (!url_con->url)
-     return;
-
+   if (!url_con->url) return;
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose);
-#else
-   return;
-   (void)url_con;
-   (void)verbose;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose);
 }
 
 EAPI void
 ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv)
 {
-#ifdef HAVE_CURL
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_ftp_use_epsv_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
-   if (!url_con->url)
-     return;
-
+   if (!url_con->url) return;
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, (int)use_epsv);
-#else
-   return;
-   (void)url_con;
-   (void)use_epsv;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV,
+                        (int)use_epsv);
 }
 
 /**
@@ -1032,24 +1035,16 @@ ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv)
 EAPI void
 ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_con, Eina_Bool verify)
 {
-#ifdef HAVE_CURL
+   if (!_c) return;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
-                         "ecore_con_url_ssl_verify_peer_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
-   if (!url_con->url)
-     return;
-
+   if (!url_con->url) return;
    if (url_con->dead) return;
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, (int)verify);
-#else
-   return;
-   (void)url_con;
-   (void)verify;
-#endif
+   _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER,
+                        (int)verify);
 }
 
 /**
@@ -1075,95 +1070,83 @@ ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_con, const char *ca_path)
 {
    int res = -1;
 
-#ifdef HAVE_CURL
+   if (!_c) return -1;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_ssl_ca_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return -1;
      }
-
    if (!url_con->url) return -1;
    if (url_con->dead) return -1;
    if (ca_path == NULL)
-     res = curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 0);
+     res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 0);
    else
      {
-        res = curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 1);
+        res = _c->curl_easy_setopt(url_con->curl_easy,
+                                   CURLOPT_SSL_VERIFYPEER, 1);
         if (!res)
-          res = curl_easy_setopt(url_con->curl_easy, CURLOPT_CAINFO, ca_path);
+          res = _c->curl_easy_setopt(url_con->curl_easy,
+                                     CURLOPT_CAINFO, ca_path);
      }
-#else
-   return -1;
-   (void)url_con;
-   (void)ca_path;
-#endif
-
    return res;
 }
 
 EAPI Eina_Bool
 ecore_con_url_http_version_set(Ecore_Con_Url *url_con, Ecore_Con_Url_Http_Version version)
 {
-#ifdef HAVE_CURL
    int res = -1;
+   
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_http_version_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
    if (url_con->dead) return EINA_FALSE;
    switch (version)
      {
       case ECORE_CON_URL_HTTP_VERSION_1_0:
-        res = curl_easy_setopt(url_con->curl_easy,
-                               CURLOPT_HTTP_VERSION,
-                               CURL_HTTP_VERSION_1_0);
+        res = _c->curl_easy_setopt(url_con->curl_easy,
+                                   CURLOPT_HTTP_VERSION,
+                                   CURL_HTTP_VERSION_1_0);
         break;
-
       case ECORE_CON_URL_HTTP_VERSION_1_1:
-        res = curl_easy_setopt(url_con->curl_easy,
-                               CURLOPT_HTTP_VERSION,
-                               CURL_HTTP_VERSION_1_1);
+        res = _c->curl_easy_setopt(url_con->curl_easy,
+                                   CURLOPT_HTTP_VERSION,
+                                   CURL_HTTP_VERSION_1_1);
         break;
-
       default:
         break;
      }
    if (res != CURLE_OK)
      {
-        ERR("curl http version setting failed: %s", curl_easy_strerror(res));
+        ERR("curl http version setting failed: %s", _c->curl_easy_strerror(res));
         return EINA_FALSE;
      }
    return EINA_TRUE;
-#else
-   (void)url_con;
-   (void)version;
-   return EINA_FALSE;
-#endif
 }
 
 EAPI Eina_Bool
 ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy)
 {
-#ifdef HAVE_CURL
    int res = -1;
    curl_version_info_data *vers = NULL;
 
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
-
    if (!url_con->url) return EINA_FALSE;
    if (url_con->dead) return EINA_FALSE;
-
-   if (!proxy) res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, "");
+   if (!proxy) res = _c->curl_easy_setopt(url_con->curl_easy,
+                                          CURLOPT_PROXY, "");
    else
      {
         // before curl version 7.21.7, socks protocol:// prefix is not supported
         // (e.g. socks4://, socks4a://, socks5:// or socks5h://, etc.)
-        vers = curl_version_info(CURLVERSION_NOW);
+        vers = _c->curl_version_info(CURLVERSION_NOW);
         if (vers->version_num < 0x71507)
           {
              url_con->proxy_type = CURLPROXY_HTTP;
@@ -1175,95 +1158,81 @@ ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy)
                url_con->proxy_type = CURLPROXY_SOCKS5_HOSTNAME;
              else if (strstr(proxy, "socks5"))
                url_con->proxy_type = CURLPROXY_SOCKS5;
-             res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXYTYPE,
-                                    url_con->proxy_type);
+             res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXYTYPE,
+                                        url_con->proxy_type);
              if (res != CURLE_OK)
                {
                   ERR("curl proxy type setting failed: %s",
-                      curl_easy_strerror(res));
+                      _c->curl_easy_strerror(res));
                   url_con->proxy_type = -1;
                   return EINA_FALSE;
                }
           }
-        res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, proxy);
+        res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, proxy);
      }
    if (res != CURLE_OK)
      {
-        ERR("curl proxy setting failed: %s", curl_easy_strerror(res));
+        ERR("curl proxy setting failed: %s", _c->curl_easy_strerror(res));
         url_con->proxy_type = -1;
         return EINA_FALSE;
      }
    return EINA_TRUE;
-#else
-   return EINA_FALSE;
-   (void)url_con;
-   (void)proxy;
-#endif
 }
 
 EAPI void
 ecore_con_url_timeout_set(Ecore_Con_Url *url_con, double timeout)
 {
-#ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_timeout_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return;
      }
-
    if (url_con->dead) return;
    if (!url_con->url || timeout < 0) return;
    if (url_con->timer) ecore_timer_del(url_con->timer);
-   url_con->timer = ecore_timer_add(timeout, _ecore_con_url_timeout_cb, url_con);
-#else
-   return;
-   (void)url_con;
-   (void)timeout;
-#endif
+   url_con->timer = ecore_timer_add(timeout, _ecore_con_url_timeout_cb,
+                                    url_con);
 }
 
 EAPI Eina_Bool
 ecore_con_url_proxy_username_set(Ecore_Con_Url *url_con, const char *username)
 {
-#ifdef HAVE_CURL
    int res = -1;
+   
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_username_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
-
    if (url_con->dead) return EINA_FALSE;
    if (!url_con->url) return EINA_FALSE;
    if ((!username) || (!username[0])) return EINA_FALSE;
-   if (url_con->proxy_type == CURLPROXY_SOCKS4 || url_con->proxy_type == CURLPROXY_SOCKS4A)
+   if ((url_con->proxy_type == CURLPROXY_SOCKS4) ||
+       (url_con->proxy_type == CURLPROXY_SOCKS4A))
      {
         ERR("Proxy type should be socks5 and above");
         return EINA_FALSE;
      }
 
-   res = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
+   res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
    if (res != CURLE_OK)
      {
-        ERR("curl_easy_setopt() failed: %s", curl_easy_strerror(res));
+        ERR("curl_easy_setopt() failed: %s", _c->curl_easy_strerror(res));
         return EINA_FALSE;
      }
    return EINA_TRUE;
-#else
-   return EINA_FALSE;
-   (void)url_con;
-   (void)username;
-#endif
 }
 
 EAPI Eina_Bool
 ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password)
 {
-#ifdef HAVE_CURL
    int res = -1;
+   
+   if (!_c) return EINA_FALSE;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_password_set");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return EINA_FALSE;
      }
    if (!url_con->url) return EINA_FALSE;
@@ -1274,33 +1243,28 @@ ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password)
         ERR("Proxy type should be socks5 and above");
         return EINA_FALSE;
      }
-
-   res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
+   res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
    if (res != CURLE_OK)
      {
-        ERR("curl_easy_setopt() failed: %s", curl_easy_strerror(res));
+        ERR("curl_easy_setopt() failed: %s", _c->curl_easy_strerror(res));
         return EINA_FALSE;
      }
    return EINA_TRUE;
-#else
-   return EINA_FALSE;
-   (void)url_con;
-   (void)password;
-#endif
 }
 
 /**
  * @}
  */
 
-#ifdef HAVE_CURL
 static void
 _ecore_con_url_status_get(Ecore_Con_Url *url_con)
 {
    long status = 0;
-
+   
+   if (!_c) return;
    if (!url_con->curl_easy) return;
-   if (!curl_easy_getinfo(url_con->curl_easy, CURLINFO_RESPONSE_CODE, &status))
+   if (!_c->curl_easy_getinfo(url_con->curl_easy, CURLINFO_RESPONSE_CODE,
+                              &status))
      url_con->status = status;
    else
      url_con->status = 0;
@@ -1312,13 +1276,12 @@ _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg)
    Ecore_Con_Event_Url_Complete *e;
    int status = url_con->status;
 
+   if (!_c) return;
    e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete));
    if (!e) return;
 
    if (!curlmsg)
-     {
-        ERR("Event completed without CURL message handle. Shouldn't happen");
-     }
+     ERR("Event completed without CURL message handle. Shouldn't happen");
    else if ((curlmsg->msg == CURLMSG_DONE) &&
             (curlmsg->data.result == CURLE_OPERATION_TIMEDOUT) &&
             (!curlmsg->easy_handle))
@@ -1337,14 +1300,13 @@ _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg)
    else
      {
         ERR("Curl message have errors: %d (%s)",
-          curlmsg->data.result, curl_easy_strerror(curlmsg->data.result));
+          curlmsg->data.result, _c->curl_easy_strerror(curlmsg->data.result));
      }
-
    e->status = status;
    e->url_con = url_con;
-
    url_con->event_count++;
-   ecore_event_add(ECORE_CON_EVENT_URL_COMPLETE, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
+   ecore_event_add(ECORE_CON_EVENT_URL_COMPLETE, e,
+                   (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
 }
 
 static void
@@ -1352,9 +1314,10 @@ _ecore_con_url_multi_remove(Ecore_Con_Url *url_con)
 {
    CURLMcode ret;
 
-   ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
+   if (!_c) return;
+   ret = _c->curl_multi_remove_handle(_c->_curlm, url_con->curl_easy);
    url_con->multi = EINA_FALSE;
-   if (ret != CURLM_OK) ERR("curl_multi_remove_handle failed: %s", curl_multi_strerror(ret));
+   if (ret != CURLM_OK) ERR("curl_multi_remove_handle failed: %s", _c->curl_multi_strerror(ret));
 }
 
 static Eina_Bool
@@ -1363,13 +1326,14 @@ _ecore_con_url_timeout_cb(void *data)
    Ecore_Con_Url *url_con = data;
    CURLMsg timeout_msg;
 
+   if (!_c) return ECORE_CALLBACK_CANCEL;
    if (!url_con) return ECORE_CALLBACK_CANCEL;
    if (!url_con->curl_easy) return ECORE_CALLBACK_CANCEL;
 
    _ecore_con_url_multi_remove(url_con);
    _url_con_list = eina_list_remove(_url_con_list, url_con);
 
-   curl_slist_free_all(url_con->headers);
+   _c->curl_slist_free_all(url_con->headers);
    url_con->headers = NULL;
 
    url_con->timer = NULL;
@@ -1390,18 +1354,14 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
    size_t real_size = size * nitems;
 
    url_con = (Ecore_Con_Url *)userp;
-
-   if (!url_con)
-     return -1;
-
+   if (!url_con) return -1;
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_cb");
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
         return -1;
      }
 
    url_con->received += real_size;
-
    INF("reading from %s", url_con->url);
    if (url_con->write_fd < 0)
      {
@@ -1414,7 +1374,8 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
              e->size = real_size;
              memcpy(e->data, buffer, real_size);
              url_con->event_count++;
-             ecore_event_add(ECORE_CON_EVENT_URL_DATA, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
+             ecore_event_add(ECORE_CON_EVENT_URL_DATA, e,
+                             (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
           }
      }
    else
@@ -1430,8 +1391,7 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
                            total_size);
              if (count < 0)
                {
-                  if (errno != EAGAIN && errno != EINTR)
-                    return -1;
+                  if ((errno != EAGAIN) && (errno != EINTR)) return -1;
                }
              else
                {
@@ -1440,7 +1400,6 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
                }
           }
      }
-
    return real_size;
 }
 
@@ -1451,15 +1410,11 @@ _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream)
    Ecore_Con_Url *url_con = stream;
 
    char *header = malloc(sizeof(char) * (real_size + 1));
-   if (!header)
-     return real_size;
-
+   if (!header) return real_size;
    memcpy(header, ptr, real_size);
    header[real_size] = '\0';
-
    url_con->response_headers = eina_list_append(url_con->response_headers,
                                                 header);
-
    return real_size;
 }
 
@@ -1470,7 +1425,6 @@ _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double u
    Ecore_Con_Url *url_con;
 
    url_con = clientp;
-
    e = malloc(sizeof(Ecore_Con_Event_Url_Progress));
    if (e)
      {
@@ -1480,9 +1434,9 @@ _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double u
         e->up.total = ultotal;
         e->up.now = ulnow;
         url_con->event_count++;
-        ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
+        ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e, 
+                        (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
      }
-
    return 0;
 }
 
@@ -1501,7 +1455,6 @@ _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream)
         fclose((FILE *)stream);
         return 0;
      }
-
 #ifdef _WIN32
    INF("*** We read %Iu bytes from file", retcode);
 #else
@@ -1516,12 +1469,13 @@ _ecore_con_url_info_read(void)
    CURLMsg *curlmsg;
    int n_remaining;
 
-   while ((curlmsg = curl_multi_info_read(_curlm, &n_remaining)))
+   if (!_c) return;
+   while ((curlmsg = _c->curl_multi_info_read(_c->_curlm, &n_remaining)))
      {
         Eina_List *l, *ll;
         Ecore_Con_Url *url_con = NULL;
+        
         DBG("Curl message: %d", curlmsg->msg);
-
         if (curlmsg->msg == CURLMSG_DONE)
           {
              EINA_LIST_FOREACH_SAFE(_url_con_list, l, ll, url_con)
@@ -1549,15 +1503,12 @@ _ecore_con_url_fd_handler(void *data EINA_UNUSED, Ecore_Fd_Handler *fd_handler E
    Ecore_Fd_Handler *fdh;
    long ms;
 
+   if (!_c) return ECORE_CALLBACK_CANCEL;
    EINA_LIST_FREE(_fd_hd_list, fdh) ecore_main_fd_handler_del(fdh);
-
-   curl_multi_timeout(_curlm, &ms);
+   _c->curl_multi_timeout(_c->_curlm, &ms);
    if ((ms >= CURL_MIN_TIMEOUT) || (ms <= 0)) ms = CURL_MIN_TIMEOUT;
    ecore_timer_interval_set(_curl_timer, (double)ms / 1000.0);
-   
-   if (!_curl_idler)
-     _curl_idler = ecore_idler_add(_ecore_con_url_timer, NULL);
-
+   if (!_curl_idler) _curl_idler = ecore_idler_add(_ecore_con_url_timer, NULL);
    return ECORE_CALLBACK_CANCEL;
 }
 
@@ -1568,14 +1519,17 @@ _ecore_con_url_fdset(void)
    fd_set read_set, write_set, exc_set;
    int fd, fd_max;
 
+   if (!_c) return;
+   
    FD_ZERO(&read_set);
    FD_ZERO(&write_set);
    FD_ZERO(&exc_set);
 
-   ret = curl_multi_fdset(_curlm, &read_set, &write_set, &exc_set, &fd_max);
+   ret = _c->curl_multi_fdset(_c->_curlm, &read_set,
+                              &write_set, &exc_set, &fd_max);
    if (ret != CURLM_OK)
      {
-        ERR("curl_multi_fdset failed: %s", curl_multi_strerror(ret));
+        ERR("curl_multi_fdset failed: %s", _c->curl_multi_strerror(ret));
         return;
      }
 
@@ -1587,7 +1541,8 @@ _ecore_con_url_fdset(void)
         if (FD_ISSET(fd, &exc_set)) flags |= ECORE_FD_ERROR;
         if (flags)
           {
-             // FIXME: Who is owner (easy_handle) of this fd?? (Curl do not give this info.)
+             // FIXME: Who is owner (easy_handle) of this fd??
+             // (Curl do not give this info.)
              // This cause "Failed to delete epoll fd xx!" error messages
              Ecore_Fd_Handler *fd_handler;
              fd_handler = ecore_main_fd_handler_add(fd, flags,
@@ -1608,8 +1563,8 @@ _ecore_con_url_timer(void *data EINA_UNUSED)
 
    EINA_LIST_FREE(_fd_hd_list, fdh) ecore_main_fd_handler_del(fdh);
    _ecore_con_url_info_read();
-
-   ret = curl_multi_perform(_curlm, &still_running);
+   if (!_c) return ECORE_CALLBACK_RENEW;
+   ret = _c->curl_multi_perform(_c->_curlm, &still_running);
    if (ret == CURLM_CALL_MULTI_PERFORM)
      {
         DBG("curl_multi_perform() again immediately");
@@ -1617,7 +1572,7 @@ _ecore_con_url_timer(void *data EINA_UNUSED)
      }
    else if (ret != CURLM_OK)
      {
-        ERR("curl_multi_perform() failed: %s", curl_multi_strerror(ret));
+        ERR("curl_multi_perform() failed: %s", _c->curl_multi_strerror(ret));
         _ecore_con_url_curl_clear();
         ecore_timer_freeze(_curl_timer);
         if (_curl_idler)
@@ -1626,13 +1581,14 @@ _ecore_con_url_timer(void *data EINA_UNUSED)
              _curl_idler = NULL;
           }
      }
-
    if (still_running)
      {
         long ms;
+        
         _ecore_con_url_fdset();
-        curl_multi_timeout(_curlm, &ms);
-        DBG("multiperform is still running: %d, timeout: %ld", still_running, ms);
+        _c->curl_multi_timeout(_c->_curlm, &ms);
+        DBG("multiperform is still running: %d, timeout: %ld",
+            still_running, ms);
         if ((ms >= CURL_MIN_TIMEOUT) || (ms <= 0)) ms = CURL_MIN_TIMEOUT;
         ecore_timer_interval_set(_curl_timer, (double)ms / 1000.0);
      }
@@ -1648,7 +1604,6 @@ _ecore_con_url_timer(void *data EINA_UNUSED)
              _curl_idler = NULL;
           }
      }
-
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -1657,17 +1612,17 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
 {
    CURLMcode ret;
 
-   ret = curl_multi_add_handle(_curlm, url_con->curl_easy);
+   if (!_c) return EINA_FALSE;
+   ret = _c->curl_multi_add_handle(_c->_curlm, url_con->curl_easy);
    if (ret != CURLM_OK)
      {
-        ERR("curl_multi_add_handle() failed: %s", curl_multi_strerror(ret));
+        ERR("curl_multi_add_handle() failed: %s",
+            _c->curl_multi_strerror(ret));
         return EINA_FALSE;
      }
-
    url_con->multi = EINA_TRUE;
    _url_con_list = eina_list_append(_url_con_list, url_con);
    ecore_timer_thaw(_curl_timer);
-
    return EINA_TRUE;
 }
 
@@ -1676,8 +1631,5 @@ _ecore_con_event_url_free(Ecore_Con_Url *url_con, void *ev)
 {
    free(ev);
    url_con->event_count--;
-   if (url_con->dead && (!url_con->event_count))
-     ecore_con_url_free(url_con);
+   if (url_con->dead && (!url_con->event_count)) ecore_con_url_free(url_con);
 }
-
-#endif