Ecore con url: Migrate to eo.

This commit is contained in:
Tom Hacohen 2014-08-28 11:30:53 +01:00
parent 2a144e5717
commit f6156c9a62
7 changed files with 275 additions and 311 deletions

View File

@ -7,19 +7,23 @@ ecorecon_eobuiltheaders = \
lib/ecore_con/ecore_con_client.eo.h \ lib/ecore_con/ecore_con_client.eo.h \
lib/ecore_con/ecore_con_client.eo.legacy.h \ lib/ecore_con/ecore_con_client.eo.legacy.h \
lib/ecore_con/ecore_con_server.eo.h \ lib/ecore_con/ecore_con_server.eo.h \
lib/ecore_con/ecore_con_server.eo.legacy.h lib/ecore_con/ecore_con_server.eo.legacy.h \
lib/ecore_con/ecore_con_url.eo.h \
lib/ecore_con/ecore_con_url.eo.legacy.h
BUILT_SOURCES += \ BUILT_SOURCES += \
${ecorecon_eobuiltheaders} \ ${ecorecon_eobuiltheaders} \
lib/ecore_con/ecore_con_base.eo.c \ lib/ecore_con/ecore_con_base.eo.c \
lib/ecore_con/ecore_con_client.eo.c \ lib/ecore_con/ecore_con_client.eo.c \
lib/ecore_con/ecore_con_server.eo.c lib/ecore_con/ecore_con_server.eo.c \
lib/ecore_con/ecore_con_url.eo.c
ecoreconeolianfilesdir = $(datadir)/eolian/include/ecore-@VMAJ@ ecoreconeolianfilesdir = $(datadir)/eolian/include/ecore-@VMAJ@
ecoreconeolianfiles_DATA = \ ecoreconeolianfiles_DATA = \
lib/ecore_con/ecore_con_base.eo \ lib/ecore_con/ecore_con_base.eo \
lib/ecore_con/ecore_con_client.eo \ lib/ecore_con/ecore_con_client.eo \
lib/ecore_con/ecore_con_server.eo lib/ecore_con/ecore_con_server.eo \
lib/ecore_con/ecore_con_url.eo
EXTRA_DIST += \ EXTRA_DIST += \
${ecoreconeolianfiles_DATA} ${ecoreconeolianfiles_DATA}

View File

@ -232,13 +232,6 @@ typedef Eo Ecore_Con;
*/ */
typedef struct Ecore_Con_Socks Ecore_Con_Socks; typedef struct Ecore_Con_Socks Ecore_Con_Socks;
/**
* @typedef Ecore_Con_Url
* A handle to an http upload/download object
* @ingroup Ecore_Con_Url_Group
*/
typedef struct _Ecore_Con_Url Ecore_Con_Url;
#ifndef EFL_NOLEGACY_API_SUPPORT #ifndef EFL_NOLEGACY_API_SUPPORT
#include "Ecore_Con_Legacy.h" #include "Ecore_Con_Legacy.h"
#endif #endif
@ -1397,25 +1390,7 @@ EAPI Ecore_Con_Url * ecore_con_url_custom_new(const char *url,
* @see ecore_con_url_new() * @see ecore_con_url_new()
*/ */
EAPI void ecore_con_url_free(Ecore_Con_Url *url_con); EAPI void ecore_con_url_free(Ecore_Con_Url *url_con);
/**
* Sets the URL to send the request to.
*
* @param url_con Connection object through which the request will be sent.
* @param url URL that will receive the request
*
* @return @c EINA_TRUE on success, @c EINA_FALSE on error.
*/
EAPI Eina_Bool ecore_con_url_url_set(Ecore_Con_Url *url_con,
const char *url);
/**
* Gets the URL to send the request to.
*
* @param url_con Connection object through which the request will be sent.
* @return URL that will receive the request, @c NULL on failure. URL is
* stringshared.
* @since 1.1
*/
EAPI const char *ecore_con_url_url_get(Ecore_Con_Url *url_con);
/** /**
* Associates data with a connection object. * Associates data with a connection object.
* *

View File

@ -1,3 +1,4 @@
#include "ecore_con_base.eo.h" #include "ecore_con_base.eo.h"
#include "ecore_con_server.eo.h" #include "ecore_con_server.eo.h"
#include "ecore_con_client.eo.h" #include "ecore_con_client.eo.h"
#include "ecore_con_url.eo.h"

View File

@ -1,3 +1,4 @@
#include "ecore_con_base.eo.legacy.h" #include "ecore_con_base.eo.legacy.h"
#include "ecore_con_server.eo.legacy.h" #include "ecore_con_server.eo.legacy.h"
#include "ecore_con_client.eo.legacy.h" #include "ecore_con_client.eo.legacy.h"
#include "ecore_con_url.eo.legacy.h"

View File

@ -198,33 +198,6 @@ struct _Ecore_Con_Server_Data
typedef struct _Ecore_Con_Server_Data Ecore_Con_Server_Data; typedef struct _Ecore_Con_Server_Data Ecore_Con_Server_Data;
struct _Ecore_Con_Url
{
ECORE_MAGIC;
void *curl_easy;
struct curl_slist *headers;
Eina_List *additional_headers;
Eina_List *response_headers;
const char *url;
long proxy_type;
int status;
Ecore_Timer *timer;
Ecore_Con_Url_Time time_condition;
double timestamp;
void *data;
void *post_data;
int received;
int write_fd;
unsigned int event_count;
Eina_Bool dead : 1;
Eina_Bool multi : 1;
};
struct _Ecore_Con_Info struct _Ecore_Con_Info
{ {
unsigned int size; unsigned int size;

View File

@ -30,6 +30,8 @@
#include "Ecore_Con.h" #include "Ecore_Con.h"
#include "ecore_con_private.h" #include "ecore_con_private.h"
#define MY_CLASS ECORE_CON_URL_CLASS
// all the types, defines, enums etc. from curl that we actuall USE. // 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 // we have to add to this if we use more things from curl not already
// defined here. see culr headers to get them from // defined here. see culr headers to get them from
@ -222,6 +224,34 @@ struct _Ecore_Con_Curl
curl_version_info_data *(*curl_version_info)(CURLversion); curl_version_info_data *(*curl_version_info)(CURLversion);
}; };
struct _Ecore_Con_Url_Data
{
void *curl_easy;
struct curl_slist *headers;
Eina_List *additional_headers;
Eina_List *response_headers;
const char *url;
long proxy_type;
int status;
Ecore_Timer *timer;
Ecore_Con_Url_Time time_condition;
double timestamp;
void *data;
void *post_data;
int received;
int write_fd;
unsigned int event_count;
Eina_Bool dead : 1;
Eina_Bool multi : 1;
};
typedef struct _Ecore_Con_Url_Data Ecore_Con_Url_Data;
#define CURL_MIN_TIMEOUT 100 #define CURL_MIN_TIMEOUT 100
int ECORE_CON_EVENT_URL_DATA = 0; int ECORE_CON_EVENT_URL_DATA = 0;
@ -402,29 +432,39 @@ extern Ecore_Con_Socks *_ecore_con_proxy_global;
EAPI Ecore_Con_Url * EAPI Ecore_Con_Url *
ecore_con_url_new(const char *url) ecore_con_url_new(const char *url)
{ {
Ecore_Con_Url *url_con; Ecore_Con_Url *url_obj;
url_obj = eo_add(ECORE_CON_URL_CLASS, NULL,
ecore_con_url_obj_url_set(url));
return url_obj;
}
EOLIAN static void
_ecore_con_url_eo_base_constructor(Ecore_Con_Url *url_obj, Ecore_Con_Url_Data *url_con EINA_UNUSED)
{
eo_do_super(url_obj, MY_CLASS, eo_constructor());
if (!_init_count) eo_error_set(url_obj);
if (!_c_init()) eo_error_set(url_obj);
}
EOLIAN static Eo *
_ecore_con_url_eo_base_finalize(Ecore_Con_Url *url_obj, Ecore_Con_Url_Data *url_con)
{
CURLcode ret; CURLcode ret;
if (!_init_count) return NULL;
if (!_c_init()) return NULL;
url_con = calloc(1, sizeof(Ecore_Con_Url));
if (!url_con) return NULL;
url_con->write_fd = -1; url_con->write_fd = -1;
url_con->curl_easy = _c->curl_easy_init(); url_con->curl_easy = _c->curl_easy_init();
if (!url_con->curl_easy) if (!url_con->curl_easy)
{ {
free(url_con); eo_del(url_obj);
return NULL; return NULL;
} }
ECORE_MAGIC_SET(url_con, ECORE_MAGIC_CON_URL); if (!url_con->url)
if (!ecore_con_url_url_set(url_con, url))
{ {
ecore_con_url_free(url_con); ecore_con_url_free(url_obj);
return NULL; return NULL;
} }
@ -462,8 +502,8 @@ ecore_con_url_new(const char *url)
_ecore_con_proxy_global->port); _ecore_con_proxy_global->port);
else snprintf(proxy, sizeof(proxy), "%s", host); else snprintf(proxy, sizeof(proxy), "%s", host);
ecore_con_url_proxy_set(url_con, proxy); ecore_con_url_proxy_set(url_obj, proxy);
ecore_con_url_proxy_username_set(url_con, ecore_con_url_proxy_username_set(url_obj,
_ecore_con_proxy_global->username); _ecore_con_proxy_global->username);
} }
@ -473,44 +513,45 @@ ecore_con_url_new(const char *url)
{ {
ERR("Could not set CURLOPT_ENCODING to \"gzip,deflate\": %s", ERR("Could not set CURLOPT_ENCODING to \"gzip,deflate\": %s",
_c->curl_easy_strerror(ret)); _c->curl_easy_strerror(ret));
ecore_con_url_free(url_con); ecore_con_url_free(url_obj);
return NULL; return NULL;
} }
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION, _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION,
_ecore_con_url_data_cb); _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_WRITEDATA, url_obj);
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
_ecore_con_url_progress_cb); _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_PROGRESSDATA, url_obj);
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION, _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION,
_ecore_con_url_header_cb); _ecore_con_url_header_cb);
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_obj);
/* /*
* FIXME: Check that these timeouts are sensible defaults * FIXME: Check that these timeouts are sensible defaults
* FIXME: Provide a means to change these timeouts * FIXME: Provide a means to change these timeouts
*/ */
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30);
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
return url_con; return url_obj;
} }
EAPI Ecore_Con_Url * EAPI Ecore_Con_Url *
ecore_con_url_custom_new(const char *url, ecore_con_url_custom_new(const char *url,
const char *custom_request) const char *custom_request)
{ {
Ecore_Con_Url *url_con; Ecore_Con_Url *url_obj;
CURLcode ret; CURLcode ret;
if (!_init_count) return NULL; if (!_init_count) return NULL;
if (!_c_init()) return NULL; if (!_c_init()) return NULL;
if (!url) return NULL; if (!url) return NULL;
if (!custom_request) return NULL; if (!custom_request) return NULL;
url_con = ecore_con_url_new(url); url_obj = ecore_con_url_new(url);
if (!url_con) return NULL; if (!url_obj) return NULL;
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST,
custom_request); custom_request);
@ -518,23 +559,27 @@ ecore_con_url_custom_new(const char *url,
{ {
ERR("Could not set a custom request string: %s", ERR("Could not set a custom request string: %s",
_c->curl_easy_strerror(ret)); _c->curl_easy_strerror(ret));
ecore_con_url_free(url_con); ecore_con_url_free(url_obj);
return NULL; return NULL;
} }
return url_con; return url_obj;
} }
EAPI void EAPI void
ecore_con_url_free(Ecore_Con_Url *url_con) ecore_con_url_free(Ecore_Con_Url *url_obj)
{
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
eo_del(url_obj);
}
EOLIAN static void
_ecore_con_url_eo_base_destructor(Ecore_Con_Url *url_obj, Ecore_Con_Url_Data *url_con)
{ {
char *s; char *s;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
if (url_con->curl_easy) if (url_con->curl_easy)
{ {
// FIXME : How can we delete curl_easy's fds ?? // FIXME : How can we delete curl_easy's fds ??
@ -547,8 +592,8 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
if (url_con->multi) if (url_con->multi)
{ {
_ecore_con_url_multi_remove(url_con); _ecore_con_url_multi_remove(url_obj);
_url_con_list = eina_list_remove(_url_con_list, url_con); _url_con_list = eina_list_remove(_url_con_list, url_obj);
} }
_c->curl_easy_cleanup(url_con->curl_easy); _c->curl_easy_cleanup(url_con->curl_easy);
@ -559,7 +604,6 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
url_con->timer = NULL; url_con->timer = NULL;
url_con->dead = EINA_TRUE; url_con->dead = EINA_TRUE;
if (url_con->event_count) return; if (url_con->event_count) return;
ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE);
_c->curl_slist_free_all(url_con->headers); _c->curl_slist_free_all(url_con->headers);
EINA_LIST_FREE(url_con->additional_headers, s) EINA_LIST_FREE(url_con->additional_headers, s)
@ -568,42 +612,29 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
free(s); free(s);
eina_stringshare_del(url_con->url); eina_stringshare_del(url_con->url);
if (url_con->post_data) free(url_con->post_data); if (url_con->post_data) free(url_con->post_data);
free(url_con);
} }
EAPI const char * EOLIAN static const char *
ecore_con_url_url_get(Ecore_Con_Url *url_con) _ecore_con_url_url_get(Ecore_Con_Url *url_obj EINA_UNUSED, Ecore_Con_Url_Data *url_con)
{ {
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; return url_con->url;
} }
EAPI int EAPI int
ecore_con_url_status_code_get(Ecore_Con_Url *url_con) ecore_con_url_status_code_get(Ecore_Con_Url *url_obj)
{ {
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
{ if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return 0;
return 0;
}
if (url_con->status) return url_con->status; if (url_con->status) return url_con->status;
_ecore_con_url_status_get(url_con); _ecore_con_url_status_get(url_obj);
return url_con->status; return url_con->status;
} }
EAPI Eina_Bool EOLIAN static Eina_Bool
ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url) _ecore_con_url_url_set(Ecore_Con_Url *url_obj EINA_UNUSED, Ecore_Con_Url_Data *url_con, const char *url)
{ {
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
eina_stringshare_replace(&url_con->url, url); eina_stringshare_replace(&url_con->url, url);
if (url_con->url) if (url_con->url)
@ -615,27 +646,22 @@ ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url)
} }
EAPI void EAPI void
ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data) ecore_con_url_data_set(Ecore_Con_Url *url_obj, void *data)
{ {
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
{ if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return;
return;
}
url_con->data = data; url_con->data = data;
} }
EAPI void EAPI void
ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, const char *value) ecore_con_url_additional_header_add(Ecore_Con_Url *url_obj, const char *key, const char *value)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
char *tmp; char *tmp;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
if (url_con->dead) return; if (url_con->dead) return;
tmp = malloc(strlen(key) + strlen(value) + 3); tmp = malloc(strlen(key) + strlen(value) + 3);
if (!tmp) return; if (!tmp) return;
@ -645,89 +671,75 @@ ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, con
} }
EAPI void EAPI void
ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con) ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
char *s; char *s;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
EINA_LIST_FREE(url_con->additional_headers, s) EINA_LIST_FREE(url_con->additional_headers, s)
free(s); free(s);
} }
EAPI void * EAPI void *
ecore_con_url_data_get(Ecore_Con_Url *url_con) ecore_con_url_data_get(Ecore_Con_Url *url_obj)
{ {
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
{ if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return NULL;
return NULL;
}
return url_con->data; return url_con->data;
} }
EAPI void EAPI void
ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, double timestamp) ecore_con_url_time(Ecore_Con_Url *url_obj, Ecore_Con_Url_Time condition, double timestamp)
{ {
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
{ if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return;
return;
}
if (url_con->dead) return; if (url_con->dead) return;
url_con->time_condition = condition; url_con->time_condition = condition;
url_con->timestamp = timestamp; url_con->timestamp = timestamp;
} }
EAPI void EAPI void
ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd) ecore_con_url_fd_set(Ecore_Con_Url *url_obj, int fd)
{ {
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
{ if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return;
return;
}
if (url_con->dead) return; if (url_con->dead) return;
url_con->write_fd = fd; url_con->write_fd = fd;
} }
EAPI int EAPI int
ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con) ecore_con_url_received_bytes_get(Ecore_Con_Url *url_obj)
{ {
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
{ if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return -1;
return -1;
}
return url_con->received; return url_con->received;
} }
EAPI const Eina_List * EAPI const Eina_List *
ecore_con_url_response_headers_get(Ecore_Con_Url *url_con) ecore_con_url_response_headers_get(Ecore_Con_Url *url_obj)
{ {
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
{ if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return NULL;
return NULL;
}
return url_con->response_headers; return url_con->response_headers;
} }
EAPI Eina_Bool EAPI Eina_Bool
ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, const char *password, Eina_Bool safe) ecore_con_url_httpauth_set(Ecore_Con_Url *url_obj, const char *username, const char *password, Eina_Bool safe)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return EINA_FALSE;
CURLcode ret; CURLcode ret;
curl_version_info_data *vers = NULL; curl_version_info_data *vers = NULL;
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
vers = _c->curl_version_info(CURLVERSION_NOW); vers = _c->curl_version_info(CURLVERSION_NOW);
if (vers->version_num >= 0x071301) if (vers->version_num >= 0x071301)
@ -769,18 +781,16 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, const c
#define MODE_POST 2 #define MODE_POST 2
static Eina_Bool static Eina_Bool
_ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long length, const char *content_type) _ecore_con_url_send(Ecore_Con_Url *url_obj, int mode, const void *data, long length, const char *content_type)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return EINA_FALSE;
Eina_List *l; Eina_List *l;
const char *s; const char *s;
char tmp[512]; char tmp[512];
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (!url_con->url) return EINA_FALSE; if (!url_con->url) return EINA_FALSE;
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
@ -853,7 +863,7 @@ _ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long len
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER,
url_con->headers); url_con->headers);
url_con->received = 0; url_con->received = 0;
return _ecore_con_url_perform(url_con); return _ecore_con_url_perform(url_obj);
} }
EAPI Eina_Bool EAPI Eina_Bool
@ -869,8 +879,11 @@ ecore_con_url_post(Ecore_Con_Url *url_con, const void *data, long length, const
} }
EAPI Eina_Bool 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) ecore_con_url_ftp_upload(Ecore_Con_Url *url_obj, const char *filename, const char *user, const char *pass, const char *upload_dir)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, MY_CLASS))
return EINA_FALSE;
char url[4096]; char url[4096];
char userpwd[4096]; char userpwd[4096];
FILE *fd; FILE *fd;
@ -878,11 +891,6 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const cha
CURLcode ret; CURLcode ret;
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
if (!url_con->url) return EINA_FALSE; if (!url_con->url) return EINA_FALSE;
@ -909,7 +917,7 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const cha
snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url, snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
basename(tmp)); basename(tmp));
if (!ecore_con_url_url_set(url_con, url)) if (!ecore_con_url_url_set(url_obj, url))
return EINA_FALSE; return EINA_FALSE;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE, _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE,
(off_t)file_info.st_size); (off_t)file_info.st_size);
@ -923,85 +931,73 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const cha
return EINA_FALSE; return EINA_FALSE;
} }
_c->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); return _ecore_con_url_perform(url_obj);
} }
EAPI void EAPI void
ecore_con_url_cookies_init(Ecore_Con_Url *url_con) ecore_con_url_cookies_init(Ecore_Con_Url *url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
if (url_con->dead) return; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, ""); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, "");
} }
EAPI void EAPI void
ecore_con_url_cookies_ignore_old_session_set(Ecore_Con_Url *url_con, Eina_Bool ignore) ecore_con_url_cookies_ignore_old_session_set(Ecore_Con_Url *url_obj, Eina_Bool ignore)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
if (url_con->dead) return; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIESESSION, ignore); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIESESSION, ignore);
} }
EAPI void EAPI void
ecore_con_url_cookies_clear(Ecore_Con_Url *url_con) ecore_con_url_cookies_clear(Ecore_Con_Url *url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
if (url_con->dead) return; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "ALL"); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "ALL");
} }
EAPI void EAPI void
ecore_con_url_cookies_session_clear(Ecore_Con_Url *url_con) ecore_con_url_cookies_session_clear(Ecore_Con_Url *url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
if (url_con->dead) return; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "SESS"); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "SESS");
} }
EAPI void EAPI void
ecore_con_url_cookies_file_add(Ecore_Con_Url *url_con, const char *const file_name) ecore_con_url_cookies_file_add(Ecore_Con_Url *url_obj, const char *const file_name)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
if (url_con->dead) return; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, file_name); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, file_name);
} }
EAPI Eina_Bool EAPI Eina_Bool
ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_con, const char *const cookiejar_file) ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_obj, const char *const cookiejar_file)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return EINA_FALSE;
CURLcode ret; CURLcode ret;
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEJAR, ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEJAR,
cookiejar_file); cookiejar_file);
@ -1015,42 +1011,36 @@ ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_con, const char *const coo
} }
EAPI void EAPI void
ecore_con_url_cookies_jar_write(Ecore_Con_Url *url_con) ecore_con_url_cookies_jar_write(Ecore_Con_Url *url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return;
}
if (url_con->dead) return; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "FLUSH"); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "FLUSH");
} }
EAPI void EAPI void
ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose) ecore_con_url_verbose_set(Ecore_Con_Url *url_obj, Eina_Bool verbose)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
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; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose); _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose);
} }
EAPI void EAPI void
ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv) ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_obj, Eina_Bool use_epsv)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
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; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV,
@ -1070,14 +1060,12 @@ ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv)
* @since 1.1.0 * @since 1.1.0
*/ */
EAPI void EAPI void
ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_con, Eina_Bool verify) ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_obj, Eina_Bool verify)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return;
if (!_c) return; if (!_c) return;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
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; if (url_con->dead) return;
_c->curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER,
@ -1103,16 +1091,14 @@ ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_con, Eina_Bool verify)
* are equal to cURL error codes. * are equal to cURL error codes.
*/ */
EAPI int EAPI int
ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_con, const char *ca_path) ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_obj, const char *ca_path)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return -1;
int res = -1; int res = -1;
if (!_c) return -1; if (!_c) return -1;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return -1;
}
if (!url_con->url) return -1; if (!url_con->url) return -1;
if (url_con->dead) return -1; if (url_con->dead) return -1;
if (ca_path == NULL) if (ca_path == NULL)
@ -1129,16 +1115,14 @@ ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_con, const char *ca_path)
} }
EAPI Eina_Bool EAPI Eina_Bool
ecore_con_url_http_version_set(Ecore_Con_Url *url_con, Ecore_Con_Url_Http_Version version) ecore_con_url_http_version_set(Ecore_Con_Url *url_obj, Ecore_Con_Url_Http_Version version)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return EINA_FALSE;
int res = -1; int res = -1;
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
switch (version) switch (version)
{ {
@ -1166,17 +1150,15 @@ ecore_con_url_http_version_set(Ecore_Con_Url *url_con, Ecore_Con_Url_Http_Versio
} }
EAPI Eina_Bool EAPI Eina_Bool
ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy) ecore_con_url_proxy_set(Ecore_Con_Url *url_obj, const char *proxy)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return EINA_FALSE;
int res = -1; int res = -1;
curl_version_info_data *vers = NULL; curl_version_info_data *vers = NULL;
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (!url_con->url) return EINA_FALSE; if (!url_con->url) return EINA_FALSE;
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
if (!proxy) if (!proxy)
@ -1220,31 +1202,27 @@ ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy)
} }
EAPI void EAPI void
ecore_con_url_timeout_set(Ecore_Con_Url *url_con, double timeout) ecore_con_url_timeout_set(Ecore_Con_Url *url_obj, double timeout)
{ {
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
{ if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return;
return;
}
if (url_con->dead) return; if (url_con->dead) return;
if (!url_con->url || timeout < 0) return; if (!url_con->url || timeout < 0) return;
if (url_con->timer) ecore_timer_del(url_con->timer); if (url_con->timer) ecore_timer_del(url_con->timer);
url_con->timer = ecore_timer_add(timeout, _ecore_con_url_timeout_cb, url_con->timer = ecore_timer_add(timeout, _ecore_con_url_timeout_cb,
url_con); url_obj);
} }
EAPI Eina_Bool EAPI Eina_Bool
ecore_con_url_proxy_username_set(Ecore_Con_Url *url_con, const char *username) ecore_con_url_proxy_username_set(Ecore_Con_Url *url_obj, const char *username)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return EINA_FALSE;
int res = -1; int res = -1;
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
if (!url_con->url) return EINA_FALSE; if (!url_con->url) return EINA_FALSE;
if ((!username) || (!username[0])) return EINA_FALSE; if ((!username) || (!username[0])) return EINA_FALSE;
@ -1265,16 +1243,14 @@ ecore_con_url_proxy_username_set(Ecore_Con_Url *url_con, const char *username)
} }
EAPI Eina_Bool EAPI Eina_Bool
ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password) ecore_con_url_proxy_password_set(Ecore_Con_Url *url_obj, const char *password)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return EINA_FALSE;
int res = -1; int res = -1;
if (!_c) 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, __func__);
return EINA_FALSE;
}
if (!url_con->url) return EINA_FALSE; if (!url_con->url) return EINA_FALSE;
if (url_con->dead) return EINA_FALSE; if (url_con->dead) return EINA_FALSE;
if (!password) return EINA_FALSE; if (!password) return EINA_FALSE;
@ -1297,8 +1273,9 @@ ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password)
*/ */
static void static void
_ecore_con_url_status_get(Ecore_Con_Url *url_con) _ecore_con_url_status_get(Ecore_Con_Url *url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
long status = 0; long status = 0;
if (!_c) return; if (!_c) return;
@ -1311,8 +1288,9 @@ _ecore_con_url_status_get(Ecore_Con_Url *url_con)
} }
static void static void
_ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg) _ecore_con_url_event_url_complete(Ecore_Con_Url *url_obj, CURLMsg *curlmsg)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
Ecore_Con_Event_Url_Complete *e; Ecore_Con_Event_Url_Complete *e;
int status = url_con->status; int status = url_con->status;
@ -1333,7 +1311,7 @@ _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg)
{ {
if (!status) if (!status)
{ {
_ecore_con_url_status_get(url_con); _ecore_con_url_status_get(url_obj);
status = url_con->status; status = url_con->status;
} }
} }
@ -1343,15 +1321,16 @@ _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg)
curlmsg->data.result, _c->curl_easy_strerror(curlmsg->data.result)); curlmsg->data.result, _c->curl_easy_strerror(curlmsg->data.result));
} }
e->status = status; e->status = status;
e->url_con = url_con; e->url_con = url_obj;
url_con->event_count++; url_con->event_count++;
ecore_event_add(ECORE_CON_EVENT_URL_COMPLETE, e, ecore_event_add(ECORE_CON_EVENT_URL_COMPLETE, e,
(Ecore_End_Cb)_ecore_con_event_url_free, url_con); (Ecore_End_Cb)_ecore_con_event_url_free, url_obj);
} }
static void static void
_ecore_con_url_multi_remove(Ecore_Con_Url *url_con) _ecore_con_url_multi_remove(Ecore_Con_Url *url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
CURLMcode ret; CURLMcode ret;
if (!_c) return; if (!_c) return;
@ -1363,15 +1342,16 @@ _ecore_con_url_multi_remove(Ecore_Con_Url *url_con)
static Eina_Bool static Eina_Bool
_ecore_con_url_timeout_cb(void *data) _ecore_con_url_timeout_cb(void *data)
{ {
Ecore_Con_Url *url_con = data; Ecore_Con_Url *url_obj = data;
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
CURLMsg timeout_msg; CURLMsg timeout_msg;
if (!_c) return ECORE_CALLBACK_CANCEL; if (!_c) return ECORE_CALLBACK_CANCEL;
if (!url_con) return ECORE_CALLBACK_CANCEL; if (!url_obj) return ECORE_CALLBACK_CANCEL;
if (!url_con->curl_easy) return ECORE_CALLBACK_CANCEL; if (!url_con->curl_easy) return ECORE_CALLBACK_CANCEL;
_ecore_con_url_multi_remove(url_con); _ecore_con_url_multi_remove(url_obj);
_url_con_list = eina_list_remove(_url_con_list, url_con); _url_con_list = eina_list_remove(_url_con_list, url_obj);
_c->curl_slist_free_all(url_con->headers); _c->curl_slist_free_all(url_con->headers);
url_con->headers = NULL; url_con->headers = NULL;
@ -1382,24 +1362,20 @@ _ecore_con_url_timeout_cb(void *data)
timeout_msg.easy_handle = NULL; timeout_msg.easy_handle = NULL;
timeout_msg.data.result = CURLE_OPERATION_TIMEDOUT; timeout_msg.data.result = CURLE_OPERATION_TIMEDOUT;
_ecore_con_url_event_url_complete(url_con, &timeout_msg); _ecore_con_url_event_url_complete(url_obj, &timeout_msg);
return ECORE_CALLBACK_CANCEL; return ECORE_CALLBACK_CANCEL;
} }
static size_t static size_t
_ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
{ {
Ecore_Con_Url *url_con; Ecore_Con_Url *url_obj = (Ecore_Con_Url *)userp;
Ecore_Con_Event_Url_Data *e; Ecore_Con_Event_Url_Data *e;
size_t real_size = size * nitems; size_t real_size = size * nitems;
url_con = (Ecore_Con_Url *)userp; Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!url_con) return -1; if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) return -1;
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
return -1;
}
url_con->received += real_size; url_con->received += real_size;
INF("reading from %s", url_con->url); INF("reading from %s", url_con->url);
@ -1410,12 +1386,12 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
(real_size - 1)); (real_size - 1));
if (e) if (e)
{ {
e->url_con = url_con; e->url_con = url_obj;
e->size = real_size; e->size = real_size;
memcpy(e->data, buffer, real_size); memcpy(e->data, buffer, real_size);
url_con->event_count++; url_con->event_count++;
ecore_event_add(ECORE_CON_EVENT_URL_DATA, e, ecore_event_add(ECORE_CON_EVENT_URL_DATA, e,
(Ecore_End_Cb)_ecore_con_event_url_free, url_con); (Ecore_End_Cb)_ecore_con_event_url_free, url_obj);
} }
} }
else else
@ -1447,7 +1423,10 @@ static size_t
_ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream) _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream)
{ {
size_t real_size = size * nitems; size_t real_size = size * nitems;
Ecore_Con_Url *url_con = stream; Ecore_Con_Url *url_obj = stream;
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (!eo_isa(url_obj, ECORE_CON_URL_CLASS))
return 0;
char *header = malloc(sizeof(char) * (real_size + 1)); char *header = malloc(sizeof(char) * (real_size + 1));
if (!header) return real_size; if (!header) return real_size;
@ -1462,20 +1441,21 @@ static int
_ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow) _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{ {
Ecore_Con_Event_Url_Progress *e; Ecore_Con_Event_Url_Progress *e;
Ecore_Con_Url *url_con; Ecore_Con_Url *url_obj = clientp;
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
url_con = clientp;
e = malloc(sizeof(Ecore_Con_Event_Url_Progress)); e = malloc(sizeof(Ecore_Con_Event_Url_Progress));
if (e) if (e)
{ {
e->url_con = url_con; e->url_con = url_obj;
e->down.total = dltotal; e->down.total = dltotal;
e->down.now = dlnow; e->down.now = dlnow;
e->up.total = ultotal; e->up.total = ultotal;
e->up.now = ulnow; e->up.now = ulnow;
url_con->event_count++; url_con->event_count++;
ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e, ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e,
(Ecore_End_Cb)_ecore_con_event_url_free, url_con); (Ecore_End_Cb)_ecore_con_event_url_free, url_obj);
} }
return 0; return 0;
} }
@ -1509,15 +1489,16 @@ _ecore_con_url_info_read(void)
while ((curlmsg = _c->curl_multi_info_read(_c->_curlm, &n_remaining))) while ((curlmsg = _c->curl_multi_info_read(_c->_curlm, &n_remaining)))
{ {
Eina_List *l, *ll; Eina_List *l, *ll;
Ecore_Con_Url *url_con = NULL; Ecore_Con_Url *url_obj = NULL;
DBG("Curl message: %d", curlmsg->msg); DBG("Curl message: %d", curlmsg->msg);
if (curlmsg->msg == CURLMSG_DONE) if (curlmsg->msg == CURLMSG_DONE)
{ {
EINA_LIST_FOREACH_SAFE(_url_con_list, l, ll, url_con) EINA_LIST_FOREACH_SAFE(_url_con_list, l, ll, url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
if (curlmsg->easy_handle == url_con->curl_easy) if (curlmsg->easy_handle == url_con->curl_easy)
_ecore_con_url_event_url_complete(url_con, curlmsg); _ecore_con_url_event_url_complete(url_obj, curlmsg);
} }
} }
} }
@ -1638,8 +1619,9 @@ _ecore_con_url_timer(void *data EINA_UNUSED)
} }
static Eina_Bool static Eina_Bool
_ecore_con_url_perform(Ecore_Con_Url *url_con) _ecore_con_url_perform(Ecore_Con_Url *url_obj)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
CURLMcode ret; CURLMcode ret;
if (!_c) return EINA_FALSE; if (!_c) return EINA_FALSE;
@ -1651,16 +1633,19 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
return EINA_FALSE; return EINA_FALSE;
} }
url_con->multi = EINA_TRUE; url_con->multi = EINA_TRUE;
_url_con_list = eina_list_append(_url_con_list, url_con); _url_con_list = eina_list_append(_url_con_list, url_obj);
ecore_timer_thaw(_curl_timer); ecore_timer_thaw(_curl_timer);
return EINA_TRUE; return EINA_TRUE;
} }
static void static void
_ecore_con_event_url_free(Ecore_Con_Url *url_con, void *ev) _ecore_con_event_url_free(Ecore_Con_Url *url_obj, void *ev)
{ {
Ecore_Con_Url_Data *url_con = eo_data_scope_get(url_obj, MY_CLASS);
free(ev); free(ev);
url_con->event_count--; 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_obj);
} }
#include "ecore_con_url.eo.c"

View File

@ -0,0 +1,25 @@
class Ecore.Con.Url (Eo.Base) {
eo_prefix: ecore_con_url_obj;
properties {
url {
/**
* Controls the URL to send the request to.
*/
set {
return: bool (false); /* true on success, false on error. */
}
get {
}
values {
const(char) *url; /*@ The URL */
}
}
}
implements {
Eo.Base.constructor;
Eo.Base.destructor;
Eo.Base.finalize;
}
}
/* FIXME: Actually migrate all of the functions. */