2005-06-24 06:38:27 -07:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* For info on how to use libcurl, see:
|
|
|
|
* http://curl.haxx.se/libcurl/c/libcurl-tutorial.html
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Brief usage:
|
|
|
|
* 1. Create an Ecore_Con_Url object
|
|
|
|
* 2. Register to receive the ECORE_CON_EVENT_URL_COMPLETE event
|
|
|
|
* (and optionally the ECORE_CON_EVENT_URL_DATA event to receive
|
|
|
|
* the response, e.g. for HTTP/FTP downloads)
|
|
|
|
* 3. Set the URL with ecore_con_url_url_set(...);
|
|
|
|
* 4. Perform the operation with ecore_con_url_send(...);
|
|
|
|
*
|
|
|
|
* Note that it is good to reuse Ecore_Con_Url objects wherever possible, but
|
|
|
|
* bear in mind that each one can only perform one operation at a time.
|
|
|
|
* You need to wait for the ECORE_CON_EVENT_URL_COMPLETE event before re-using
|
|
|
|
* or destroying the object.
|
2009-03-22 06:27:24 -07:00
|
|
|
*
|
2005-06-24 06:38:27 -07:00
|
|
|
* Example Usage 1 (HTTP GET):
|
|
|
|
* ecore_con_url_url_set(url_con, "http://www.google.com");
|
2008-06-20 00:48:33 -07:00
|
|
|
* ecore_con_url_send(url_con, NULL, 0, NULL);
|
2005-06-24 06:38:27 -07:00
|
|
|
*
|
|
|
|
* Example usage 2 (HTTP POST):
|
|
|
|
* ecore_con_url_url_set(url_con, "http://www.example.com/post_handler.cgi");
|
2008-06-20 00:48:33 -07:00
|
|
|
* ecore_con_url_send(url_con, data, data_length, "multipart/form-data");
|
2005-06-24 06:38:27 -07:00
|
|
|
*
|
|
|
|
* Example Usage 3 (FTP download):
|
|
|
|
* ecore_con_url_url_set(url_con, "ftp://ftp.example.com/pub/myfile");
|
2008-06-20 00:48:33 -07:00
|
|
|
* ecore_con_url_send(url_con, NULL, 0, NULL);
|
|
|
|
*
|
|
|
|
* Example Usage 4 (FTP upload as ftp://ftp.example.com/file):
|
|
|
|
* ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
|
|
|
|
* ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass", NULL);
|
|
|
|
*
|
|
|
|
* Example Usage 5 (FTP upload as ftp://ftp.example.com/dir/file):
|
|
|
|
* ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
|
|
|
|
* ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass","dir");
|
2005-06-24 06:38:27 -07:00
|
|
|
*
|
2008-05-28 02:02:39 -07:00
|
|
|
* FIXME: Support more CURL features: Authentication, Progress callbacks and more...
|
2005-06-24 06:38:27 -07:00
|
|
|
*/
|
|
|
|
|
2009-01-31 10:33:39 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <string.h>
|
2008-03-09 09:43:32 -07:00
|
|
|
#include <errno.h>
|
2008-05-28 02:02:39 -07:00
|
|
|
#include <sys/stat.h>
|
2008-06-20 00:48:33 -07:00
|
|
|
#include <sys/types.h>
|
2010-01-03 13:55:50 -08:00
|
|
|
#include <unistd.h>
|
2008-03-09 09:43:32 -07:00
|
|
|
|
2010-02-20 11:12:52 -08:00
|
|
|
#ifdef HAVE_WS2TCPIP_H
|
2010-02-20 10:01:50 -08:00
|
|
|
# include <ws2tcpip.h>
|
|
|
|
#endif
|
|
|
|
|
2009-01-31 10:33:39 -08:00
|
|
|
#include "Ecore.h"
|
|
|
|
#include "ecore_private.h"
|
|
|
|
#include "Ecore_Con.h"
|
|
|
|
#include "ecore_con_private.h"
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
|
|
|
* @defgroup Ecore_Con_Url_Group Ecore URL Connection Functions
|
|
|
|
*
|
2009-03-22 06:27:24 -07:00
|
|
|
* Utility functions that set up, use and shut down the Ecore URL
|
2008-02-11 15:24:11 -08:00
|
|
|
* Connection library.
|
|
|
|
* FIXME: write detailed description
|
|
|
|
*/
|
|
|
|
|
2008-03-04 21:15:37 -08:00
|
|
|
int ECORE_CON_EVENT_URL_DATA = 0;
|
|
|
|
int ECORE_CON_EVENT_URL_COMPLETE = 0;
|
2008-03-09 09:43:32 -07:00
|
|
|
int ECORE_CON_EVENT_URL_PROGRESS = 0;
|
2008-03-04 21:15:37 -08:00
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
#ifdef HAVE_CURL
|
2010-06-24 09:15:56 -07:00
|
|
|
static Eina_Bool _ecore_con_url_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
|
2005-06-24 06:38:27 -07:00
|
|
|
static int _ecore_con_url_perform(Ecore_Con_Url *url_con);
|
2009-08-24 02:41:07 -07:00
|
|
|
static size_t _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream);
|
2008-06-20 00:48:33 -07:00
|
|
|
static size_t _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp);
|
2007-09-26 09:01:04 -07:00
|
|
|
static int _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
|
2008-06-20 00:48:33 -07:00
|
|
|
static size_t _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream);
|
2007-09-26 09:01:04 -07:00
|
|
|
static void _ecore_con_event_url_free(void *data __UNUSED__, void *ev);
|
2005-06-24 06:38:27 -07:00
|
|
|
static int _ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match);
|
2010-06-24 09:15:56 -07:00
|
|
|
static Eina_Bool _ecore_con_url_idler_handler(void *data __UNUSED__);
|
2005-06-24 06:38:27 -07:00
|
|
|
|
2009-08-21 12:47:04 -07:00
|
|
|
static Ecore_Idler *_fd_idler_handler = NULL;
|
|
|
|
static Eina_List *_url_con_list = NULL;
|
|
|
|
static CURLM *curlm = NULL;
|
|
|
|
static fd_set _current_fd_set;
|
|
|
|
static int init_count = 0;
|
2009-10-30 14:36:31 -07:00
|
|
|
static Ecore_Timer *_curl_timeout = NULL;
|
2007-09-26 09:01:04 -07:00
|
|
|
|
2009-08-21 12:47:04 -07:00
|
|
|
typedef struct _Ecore_Con_Url_Event Ecore_Con_Url_Event;
|
2007-09-26 10:18:52 -07:00
|
|
|
struct _Ecore_Con_Url_Event
|
2007-09-26 09:01:04 -07:00
|
|
|
{
|
2009-08-21 12:47:04 -07:00
|
|
|
int type;
|
|
|
|
void *ev;
|
2007-09-26 09:01:04 -07:00
|
|
|
};
|
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
static Eina_Bool
|
2007-09-26 09:01:04 -07:00
|
|
|
_url_complete_idler_cb(void *data)
|
|
|
|
{
|
2007-09-26 10:18:52 -07:00
|
|
|
Ecore_Con_Url_Event *lev;
|
2007-09-26 09:01:04 -07:00
|
|
|
|
|
|
|
lev = data;
|
|
|
|
ecore_event_add(lev->type, lev->ev, _ecore_con_event_url_free, NULL);
|
|
|
|
free(lev);
|
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2007-09-26 09:01:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_url_complete_push_event(int type, void *ev)
|
|
|
|
{
|
2007-09-26 10:18:52 -07:00
|
|
|
Ecore_Con_Url_Event *lev;
|
2007-09-26 09:01:04 -07:00
|
|
|
|
2007-09-26 10:18:52 -07:00
|
|
|
lev = malloc(sizeof(Ecore_Con_Url_Event));
|
2007-09-26 09:01:04 -07:00
|
|
|
lev->type = type;
|
|
|
|
lev->ev = ev;
|
|
|
|
|
|
|
|
ecore_idler_add(_url_complete_idler_cb, lev);
|
|
|
|
}
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
#endif
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
|
|
|
* Initialises the Ecore_Con_Url library.
|
|
|
|
* @return Number of times the library has been initialised without being
|
|
|
|
* shut down.
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int
|
2005-06-24 06:38:27 -07:00
|
|
|
ecore_con_url_init(void)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
2009-10-30 14:36:31 -07:00
|
|
|
init_count++;
|
|
|
|
|
|
|
|
if (init_count > 1) return init_count;
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
if (!ECORE_CON_EVENT_URL_DATA)
|
|
|
|
{
|
|
|
|
ECORE_CON_EVENT_URL_DATA = ecore_event_type_new();
|
|
|
|
ECORE_CON_EVENT_URL_COMPLETE = ecore_event_type_new();
|
2008-03-09 09:43:32 -07:00
|
|
|
ECORE_CON_EVENT_URL_PROGRESS = ecore_event_type_new();
|
2005-06-24 06:38:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!curlm)
|
|
|
|
{
|
2009-10-30 14:36:31 -07:00
|
|
|
long ms;
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
FD_ZERO(&_current_fd_set);
|
2005-06-24 07:26:01 -07:00
|
|
|
if (curl_global_init(CURL_GLOBAL_NOTHING))
|
|
|
|
{
|
2009-03-04 02:49:23 -08:00
|
|
|
while (_url_con_list)
|
|
|
|
ecore_con_url_destroy(eina_list_data_get(_url_con_list));
|
2005-06-24 07:26:01 -07:00
|
|
|
return 0;
|
|
|
|
}
|
2005-06-24 06:38:27 -07:00
|
|
|
|
|
|
|
curlm = curl_multi_init();
|
|
|
|
if (!curlm)
|
|
|
|
{
|
2009-03-04 02:49:23 -08:00
|
|
|
while (_url_con_list)
|
|
|
|
ecore_con_url_destroy(eina_list_data_get(_url_con_list));
|
2009-10-30 14:36:31 -07:00
|
|
|
|
|
|
|
init_count--;
|
2005-06-24 06:38:27 -07:00
|
|
|
return 0;
|
|
|
|
}
|
2009-10-30 14:36:31 -07:00
|
|
|
|
|
|
|
curl_multi_timeout(curlm, &ms);
|
|
|
|
if (ms <= 0) ms = 1000;
|
|
|
|
|
|
|
|
_curl_timeout = ecore_timer_add((double) ms / 1000, _ecore_con_url_idler_handler, (void *) 0xACE);
|
|
|
|
ecore_timer_freeze(_curl_timeout);
|
2005-06-24 06:38:27 -07:00
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
#else
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
|
|
|
* Shuts down the Ecore_Con_Url library.
|
|
|
|
* @return Number of calls that still uses Ecore_Con_Url
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int
|
2005-06-24 06:38:27 -07:00
|
|
|
ecore_con_url_shutdown(void)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
2009-08-21 12:47:04 -07:00
|
|
|
if (!init_count) return 0;
|
2005-06-24 06:38:27 -07:00
|
|
|
|
|
|
|
init_count--;
|
2009-10-30 14:36:31 -07:00
|
|
|
|
|
|
|
if (init_count != 0) return init_count;
|
|
|
|
|
|
|
|
if (_fd_idler_handler)
|
|
|
|
ecore_idler_del(_fd_idler_handler);
|
|
|
|
_fd_idler_handler = NULL;
|
|
|
|
|
|
|
|
if (_curl_timeout)
|
|
|
|
ecore_timer_del(_curl_timeout);
|
|
|
|
_curl_timeout = NULL;
|
|
|
|
|
2009-03-04 02:49:23 -08:00
|
|
|
while (_url_con_list)
|
|
|
|
ecore_con_url_destroy(eina_list_data_get(_url_con_list));
|
2005-06-24 06:38:27 -07:00
|
|
|
|
|
|
|
if (curlm)
|
|
|
|
{
|
|
|
|
curl_multi_cleanup(curlm);
|
|
|
|
curlm = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
curl_global_cleanup();
|
|
|
|
#endif
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* Creates and initializes a new Ecore_Con_Url connection object.
|
|
|
|
*
|
|
|
|
* Creates and initializes a new Ecore_Con_Url connection object that can be
|
|
|
|
* uesd for sending requests.
|
|
|
|
*
|
|
|
|
* @param url URL that will receive requests. Can be changed using
|
|
|
|
* ecore_con_url_url_set.
|
|
|
|
*
|
|
|
|
* @return NULL on error, a new Ecore_Con_Url on success.
|
|
|
|
*
|
2008-02-11 15:24:11 -08:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
2009-08-24 02:41:07 -07:00
|
|
|
*
|
|
|
|
* @see ecore_con_url_custom_new()
|
|
|
|
* @see ecore_con_url_url_set()
|
2008-02-11 15:24:11 -08:00
|
|
|
*/
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI Ecore_Con_Url *
|
2005-06-24 06:38:27 -07:00
|
|
|
ecore_con_url_new(const char *url)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
|
|
|
Ecore_Con_Url *url_con;
|
|
|
|
|
2005-06-24 07:39:25 -07:00
|
|
|
if (!init_count) return NULL;
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
url_con = calloc(1, sizeof(Ecore_Con_Url));
|
|
|
|
if (!url_con) return NULL;
|
|
|
|
|
|
|
|
url_con->curl_easy = curl_easy_init();
|
|
|
|
if (!url_con->curl_easy)
|
2005-06-24 07:31:51 -07:00
|
|
|
{
|
|
|
|
free(url_con);
|
|
|
|
return NULL;
|
|
|
|
}
|
2007-09-26 09:01:04 -07:00
|
|
|
|
|
|
|
ECORE_MAGIC_SET(url_con, ECORE_MAGIC_CON_URL);
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
ecore_con_url_url_set(url_con, url);
|
|
|
|
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION,
|
|
|
|
_ecore_con_url_data_cb);
|
2005-06-24 06:38:27 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEDATA, url_con);
|
2007-09-26 09:01:04 -07:00
|
|
|
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
|
|
|
|
_ecore_con_url_progress_cb);
|
2007-09-26 09:01:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con);
|
2010-02-25 21:56:49 -08:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
|
2007-09-26 09:01:04 -07:00
|
|
|
|
2009-08-24 02:41:07 -07:00
|
|
|
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);
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
/*
|
|
|
|
* 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_TIMEOUT, 300);
|
2007-02-10 09:23:09 -08:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
|
2005-06-24 06:38:27 -07:00
|
|
|
|
2008-03-09 09:43:32 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate");
|
|
|
|
|
|
|
|
url_con->fd = -1;
|
|
|
|
url_con->write_fd = -1;
|
2009-08-12 02:47:04 -07:00
|
|
|
url_con->additional_headers = NULL;
|
2009-08-24 02:41:07 -07:00
|
|
|
url_con->response_headers = NULL;
|
2008-03-09 09:43:32 -07:00
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
return url_con;
|
|
|
|
#else
|
|
|
|
return NULL;
|
2007-09-26 10:18:52 -07:00
|
|
|
url = NULL;
|
2005-06-24 06:38:27 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2009-08-12 02:47:04 -07:00
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* Creates a custom connection object.
|
|
|
|
*
|
2009-08-12 02:47:04 -07:00
|
|
|
* Creates and initializes a new Ecore_Con_Url for a custom request (e.g. HEAD,
|
|
|
|
* SUBSCRIBE and other obscure HTTP requests). This object should be used like
|
|
|
|
* one created with ecore_con_url_new().
|
|
|
|
*
|
2009-08-24 02:41:07 -07:00
|
|
|
* @param url URL that will receive requests
|
|
|
|
* @param custom_request Custom request (e.g. GET, POST, HEAD, PUT, etc)
|
|
|
|
*
|
|
|
|
* @return NULL on error, a new Ecore_Con_Url on success.
|
|
|
|
*
|
2009-08-12 02:47:04 -07:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
2009-08-24 02:41:07 -07:00
|
|
|
*
|
|
|
|
* @see ecore_con_url_new()
|
|
|
|
* @see ecore_con_url_url_set()
|
2009-08-12 02:47:04 -07:00
|
|
|
*/
|
|
|
|
EAPI Ecore_Con_Url *
|
|
|
|
ecore_con_url_custom_new(const char *url, const char *custom_request)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
2009-08-21 12:47:04 -07:00
|
|
|
Ecore_Con_Url *url_con;
|
|
|
|
|
2009-08-12 02:47:04 -07:00
|
|
|
if (!url) return NULL;
|
|
|
|
if (!custom_request) return NULL;
|
|
|
|
|
|
|
|
url_con = ecore_con_url_new(url);
|
|
|
|
|
|
|
|
if (!url_con) return NULL;
|
|
|
|
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request);
|
|
|
|
|
|
|
|
return url_con;
|
|
|
|
#else
|
|
|
|
return NULL;
|
|
|
|
url = NULL;
|
|
|
|
custom_request = NULL;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* Destroys a Ecore_Con_Url connection object.
|
|
|
|
*
|
2008-02-11 15:24:11 -08:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
2009-08-24 02:41:07 -07:00
|
|
|
*
|
|
|
|
* @see ecore_con_url_new()
|
2008-02-11 15:24:11 -08:00
|
|
|
*/
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI void
|
2005-06-24 06:38:27 -07:00
|
|
|
ecore_con_url_destroy(Ecore_Con_Url *url_con)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
2009-08-12 02:47:04 -07:00
|
|
|
char *s;
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
if (!url_con) return;
|
2007-09-26 09:01:04 -07:00
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
2007-09-26 10:18:52 -07:00
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_destroy");
|
|
|
|
return;
|
2007-09-26 09:01:04 -07:00
|
|
|
}
|
2005-06-24 06:38:27 -07:00
|
|
|
|
2007-09-26 09:01:04 -07:00
|
|
|
ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE);
|
2009-11-14 05:43:38 -08:00
|
|
|
if(url_con->fd != -1)
|
2008-03-09 09:43:32 -07:00
|
|
|
{
|
2009-11-14 05:43:38 -08:00
|
|
|
FD_CLR(url_con->fd, &_current_fd_set);
|
|
|
|
if (url_con->fd_handler)
|
|
|
|
ecore_main_fd_handler_del(url_con->fd_handler);
|
2008-03-09 09:43:32 -07:00
|
|
|
url_con->fd = -1;
|
2009-11-14 05:43:38 -08:00
|
|
|
url_con->fd_handler = NULL;
|
2008-03-09 09:43:32 -07:00
|
|
|
}
|
2010-05-06 13:18:39 -07:00
|
|
|
|
|
|
|
if (url_con->post)
|
|
|
|
curl_formfree(url_con->post);
|
|
|
|
url_con->post = NULL;
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
if (url_con->curl_easy)
|
|
|
|
{
|
2009-10-23 06:33:40 -07:00
|
|
|
// FIXME: For an unknown reason, progress continue to arrive after destruction
|
|
|
|
// this prevent any further call to the callback.
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL);
|
|
|
|
|
2005-06-24 08:01:59 -07:00
|
|
|
if (url_con->active)
|
2008-03-09 09:43:32 -07:00
|
|
|
{
|
|
|
|
url_con->active = 0;
|
|
|
|
|
|
|
|
curl_multi_remove_handle(curlm, url_con->curl_easy);
|
|
|
|
}
|
2005-06-24 06:38:27 -07:00
|
|
|
curl_easy_cleanup(url_con->curl_easy);
|
|
|
|
}
|
2009-03-04 02:49:23 -08:00
|
|
|
_url_con_list = eina_list_remove(_url_con_list, url_con);
|
2005-06-24 06:38:27 -07:00
|
|
|
curl_slist_free_all(url_con->headers);
|
2009-08-12 02:47:04 -07:00
|
|
|
EINA_LIST_FREE(url_con->additional_headers, s)
|
|
|
|
free(s);
|
2009-08-24 02:41:07 -07:00
|
|
|
EINA_LIST_FREE(url_con->response_headers, s)
|
|
|
|
free(s);
|
2005-06-24 06:38:27 -07:00
|
|
|
free(url_con->url);
|
|
|
|
free(url_con);
|
2006-11-05 08:49:55 -08:00
|
|
|
#else
|
2007-09-26 10:18:52 -07:00
|
|
|
return;
|
2006-11-05 08:49:55 -08:00
|
|
|
url_con = NULL;
|
2005-06-24 06:38:27 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* 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 1 on success, 0 on error.
|
|
|
|
*
|
2008-02-11 15:24:11 -08:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int
|
2005-06-24 06:38:27 -07:00
|
|
|
ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
2007-09-26 09:01:04 -07:00
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
2007-09-26 10:18:52 -07:00
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_url_set");
|
|
|
|
return 0;
|
2007-09-26 09:01:04 -07:00
|
|
|
}
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
if (url_con->active) return 0;
|
|
|
|
|
2010-04-27 03:53:25 -07:00
|
|
|
if (url_con->url) free(url_con->url);
|
2005-06-24 07:31:51 -07:00
|
|
|
url_con->url = NULL;
|
2010-04-27 03:53:25 -07:00
|
|
|
if (url) url_con->url = strdup(url);
|
|
|
|
if (url_con->url)
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, url_con->url);
|
|
|
|
else
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, "");
|
2007-09-26 10:18:52 -07:00
|
|
|
return 1;
|
2006-11-05 08:49:55 -08:00
|
|
|
#else
|
2007-09-26 10:18:52 -07:00
|
|
|
return 0;
|
2006-11-05 08:49:55 -08:00
|
|
|
url_con = NULL;
|
|
|
|
url = NULL;
|
2005-06-24 06:38:27 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* Associates data with a connection object.
|
|
|
|
*
|
|
|
|
* Associates data with a connection object, which can be retrieved later with
|
|
|
|
* ecore_con_url_data_get()).
|
|
|
|
*
|
|
|
|
* @param url_con Connection object to associate data.
|
|
|
|
* @param data Data to be set.
|
|
|
|
*
|
2008-02-11 15:24:11 -08:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
2009-08-24 02:41:07 -07:00
|
|
|
*
|
|
|
|
* @see ecore_con_url_data_get()
|
2008-02-11 15:24:11 -08:00
|
|
|
*/
|
2007-09-26 09:01:04 -07:00
|
|
|
EAPI void
|
2007-09-26 10:18:52 -07:00
|
|
|
ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data)
|
2007-09-26 09:01:04 -07:00
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
2007-09-26 10:18:52 -07:00
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_set");
|
|
|
|
return;
|
2007-09-26 09:01:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
url_con->data = data;
|
|
|
|
#else
|
2007-09-26 10:18:52 -07:00
|
|
|
return;
|
|
|
|
url_con = NULL;
|
|
|
|
data = NULL;
|
2007-09-26 09:01:04 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2009-08-24 02:41:07 -07:00
|
|
|
/**
|
|
|
|
* Adds an additional header to the request connection object.
|
|
|
|
*
|
|
|
|
* Adds an additional header to the request connection object. This addition
|
|
|
|
* will be valid for only one ecore_con_url_send() call.
|
|
|
|
*
|
|
|
|
* @param url_con Connection object
|
|
|
|
* @param key Header key
|
|
|
|
* @param value Header value
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*
|
|
|
|
* @see ecore_con_url_send()
|
|
|
|
* @see ecore_con_url_additional_headers_clear()
|
|
|
|
*/
|
2009-08-12 02:47:04 -07:00
|
|
|
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 (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_additional_header_add");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
tmp = malloc(strlen(key) + strlen(value) + 3);
|
|
|
|
if (!tmp) return ;
|
|
|
|
sprintf(tmp, "%s: %s", key, value);
|
|
|
|
url_con->additional_headers = eina_list_append(url_con->additional_headers, tmp);
|
|
|
|
#else
|
|
|
|
return;
|
|
|
|
url_con = NULL;
|
|
|
|
key = NULL;
|
|
|
|
value = NULL;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2009-08-24 02:41:07 -07:00
|
|
|
/*
|
|
|
|
* Cleans additional headers.
|
|
|
|
*
|
|
|
|
* Cleans additional headers associated with a connection object (previously
|
|
|
|
* added with ecore_con_url_additional_header_add()).
|
|
|
|
*
|
|
|
|
* @param url_con Connection object to clean additional headers.
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*
|
|
|
|
* @see ecore_con_url_additional_header_add()
|
|
|
|
* @see ecore_con_url_send()
|
|
|
|
*/
|
2009-08-12 02:47:04 -07:00
|
|
|
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");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
EINA_LIST_FREE(url_con->additional_headers, s)
|
|
|
|
free(s);
|
|
|
|
#else
|
|
|
|
return;
|
|
|
|
url_con = NULL;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* Retrieves data associated with a Ecore_Con_Url connection object.
|
|
|
|
*
|
|
|
|
* Retrieves data associated with a Ecore_Con_Url connection object (previously
|
|
|
|
* set with ecore_con_url_data_set()).
|
|
|
|
*
|
|
|
|
* @param Connection object to retrieve data from.
|
|
|
|
*
|
|
|
|
* @return Data associated with the given object.
|
|
|
|
*
|
2008-02-11 15:24:11 -08:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
2009-08-24 02:41:07 -07:00
|
|
|
*
|
|
|
|
* @see ecore_con_url_data_set()
|
2008-02-11 15:24:11 -08:00
|
|
|
*/
|
2007-09-26 10:18:52 -07:00
|
|
|
EAPI void *
|
2007-09-26 09:01:04 -07:00
|
|
|
ecore_con_url_data_get(Ecore_Con_Url *url_con)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
2007-09-26 10:18:52 -07:00
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_get");
|
|
|
|
return NULL;
|
2007-09-26 09:01:04 -07:00
|
|
|
}
|
|
|
|
|
2007-09-26 10:18:52 -07:00
|
|
|
return url_con->data;
|
2007-09-26 09:01:04 -07:00
|
|
|
#else
|
|
|
|
return NULL;
|
2007-09-26 10:18:52 -07:00
|
|
|
url_con = NULL;
|
2007-09-26 09:01:04 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
2010-07-26 18:00:24 -07:00
|
|
|
* FIXME
|
|
|
|
* Sets the @ref Ecore_Con_Url object's condition/time members.
|
2008-02-11 15:24:11 -08:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
2007-09-26 09:01:04 -07:00
|
|
|
EAPI void
|
|
|
|
ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, time_t tm)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
2007-09-26 10:18:52 -07:00
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_time");
|
|
|
|
return;
|
2007-09-26 09:01:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
url_con->condition = condition;
|
|
|
|
url_con->time = tm;
|
|
|
|
#else
|
2007-09-26 10:18:52 -07:00
|
|
|
return;
|
|
|
|
url_con = NULL;
|
|
|
|
condition = 0;
|
|
|
|
tm = 0;
|
2007-09-26 09:01:04 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-03-09 09:43:32 -07:00
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* Setup a file for receiving request data.
|
|
|
|
*
|
|
|
|
* Setups a file to have response data written into. Note that
|
|
|
|
* ECORE_CON_EVENT_URL_DATA events will not be emitted if a file has been set to
|
|
|
|
* receive the response data.
|
|
|
|
*
|
|
|
|
* @param url_con Connection object to set file
|
|
|
|
* @param fd File descriptor associated with the file
|
|
|
|
*
|
2008-03-09 09:43:32 -07:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
|
|
|
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");
|
|
|
|
return ;
|
|
|
|
}
|
|
|
|
url_con->write_fd = fd;
|
2009-03-22 06:27:24 -07:00
|
|
|
#endif
|
2008-03-09 09:43:32 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* Retrieves the number of bytes received.
|
|
|
|
*
|
|
|
|
* Retrieves the number of bytes received on the last request of the given
|
|
|
|
* connection object.
|
|
|
|
*
|
|
|
|
* @param url_con Connection object which the request was sent on.
|
|
|
|
*
|
|
|
|
* @return Number of bytes received on request.
|
|
|
|
*
|
2008-03-09 09:43:32 -07:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
2009-08-24 02:41:07 -07:00
|
|
|
*
|
|
|
|
* @see ecore_con_url_send()
|
2008-03-09 09:43:32 -07:00
|
|
|
*/
|
|
|
|
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");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return url_con->received;
|
2009-08-24 23:45:35 -07:00
|
|
|
#else
|
2008-03-12 23:35:57 -07:00
|
|
|
return 0;
|
2009-08-24 23:45:35 -07:00
|
|
|
#endif
|
2008-03-09 09:43:32 -07:00
|
|
|
}
|
|
|
|
|
2008-02-11 15:24:11 -08:00
|
|
|
/**
|
2009-08-24 02:41:07 -07:00
|
|
|
* Retrieves headers from last request sent.
|
|
|
|
*
|
|
|
|
* Retrieves a list containing the response headers. This function should be
|
|
|
|
* used after an ECORE_CON_EVENT_URL_COMPLETE event (headers should normally be
|
|
|
|
* ready at that time).
|
|
|
|
*
|
|
|
|
* @param url_con Connection object to retrieve response headers from.
|
|
|
|
*
|
|
|
|
* @return List of response headers. This list must not be modified by the user.
|
|
|
|
*
|
2008-02-11 15:24:11 -08:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
2009-08-24 02:41:07 -07:00
|
|
|
EAPI const Eina_List *
|
|
|
|
ecore_con_url_response_headers_get(Ecore_Con_Url *url_con)
|
|
|
|
{
|
2009-08-24 23:45:35 -07:00
|
|
|
#ifdef HAVE_CURL
|
2009-08-24 02:41:07 -07:00
|
|
|
return url_con->response_headers;
|
2009-08-24 23:45:35 -07:00
|
|
|
#else
|
|
|
|
return NULL;
|
|
|
|
#endif
|
2009-08-24 02:41:07 -07:00
|
|
|
}
|
|
|
|
|
2010-05-09 08:06:06 -07:00
|
|
|
/**
|
|
|
|
* Sets url_con to use http auth, with given username and password, "safely" or not.
|
|
|
|
*
|
|
|
|
* @param url_con Connection object to perform a request on, previously created
|
|
|
|
* with ecore_con_url_new() or ecore_con_url_custom_new().
|
|
|
|
* @param username Username to use in authentication
|
|
|
|
* @param password Password to use in authentication
|
|
|
|
* @param safe Whether to use "safer" methods (eg, NOT http basic auth)
|
|
|
|
*
|
|
|
|
* @return 1 on success, 0 on error.
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
|
|
|
EAPI int
|
|
|
|
ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, const char *password, Eina_Bool safe)
|
|
|
|
{
|
|
|
|
#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_httpauth_set");
|
|
|
|
return 0;
|
|
|
|
}
|
2010-05-11 05:10:29 -07:00
|
|
|
# ifdef CURLOPT_USERNAME
|
|
|
|
# ifdef CURLOPT_PASSWORD
|
2010-05-09 08:06:06 -07:00
|
|
|
if ((username != NULL) && (password != NULL))
|
|
|
|
{
|
|
|
|
if (safe)
|
2010-05-11 05:10:29 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANYSAFE);
|
2010-05-09 08:06:06 -07:00
|
|
|
else
|
2010-05-11 05:10:29 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
|
2010-05-09 08:06:06 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
|
2010-05-11 05:10:29 -07:00
|
|
|
return 1;
|
2010-05-09 08:06:06 -07:00
|
|
|
}
|
2010-05-11 05:10:29 -07:00
|
|
|
# endif
|
|
|
|
# endif
|
2010-05-09 08:06:06 -07:00
|
|
|
#endif
|
2010-05-11 05:10:29 -07:00
|
|
|
return 0;
|
2010-05-09 08:06:06 -07:00
|
|
|
}
|
|
|
|
|
2009-08-24 02:41:07 -07:00
|
|
|
/**
|
|
|
|
* Sends a request.
|
|
|
|
*
|
|
|
|
* @param url_con Connection object to perform a request on, previously created
|
|
|
|
* with ecore_con_url_new() or ecore_con_url_custom_new().
|
|
|
|
* @param data Payload (data sent on the request)
|
|
|
|
* @param length Payload length
|
|
|
|
* @param content_type Content type of the payload (e.g. text/xml)
|
|
|
|
*
|
|
|
|
* @return 1 on success, 0 on error.
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*
|
|
|
|
* @see ecore_con_url_custom_new()
|
|
|
|
* @see ecore_con_url_additional_headers_clear()
|
|
|
|
* @see ecore_con_url_additional_header_add()
|
|
|
|
* @see ecore_con_url_data_set()
|
|
|
|
* @see ecore_con_url_data_get()
|
|
|
|
* @see ecore_con_url_response_headers_get()
|
|
|
|
*/
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int
|
2009-03-16 06:46:16 -07:00
|
|
|
ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, size_t length, const char *content_type)
|
2005-06-24 06:38:27 -07:00
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
2009-08-12 02:47:04 -07:00
|
|
|
Eina_List *l;
|
|
|
|
const char *s;
|
2005-06-24 06:38:27 -07:00
|
|
|
char tmp[256];
|
|
|
|
|
2007-09-26 09:01:04 -07:00
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
2007-09-26 10:18:52 -07:00
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_send");
|
|
|
|
return 0;
|
2007-09-26 09:01:04 -07:00
|
|
|
}
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
if (url_con->active) return 0;
|
|
|
|
if (!url_con->url) return 0;
|
|
|
|
|
2009-08-24 02:41:07 -07:00
|
|
|
/* Free response headers from previous send() calls */
|
|
|
|
EINA_LIST_FREE(url_con->response_headers, s) free((char *)s);
|
|
|
|
url_con->response_headers = NULL;
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
curl_slist_free_all(url_con->headers);
|
|
|
|
url_con->headers = NULL;
|
|
|
|
|
|
|
|
if (data)
|
|
|
|
{
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, data);
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, length);
|
|
|
|
|
|
|
|
if (content_type && (strlen(content_type) < 200))
|
|
|
|
{
|
|
|
|
sprintf(tmp, "Content-type: %s", content_type);
|
|
|
|
url_con->headers = curl_slist_append(url_con->headers, tmp);
|
|
|
|
}
|
2009-04-27 22:26:22 -07:00
|
|
|
sprintf(tmp, "Content-length: %zu", length);
|
2005-06-24 06:38:27 -07:00
|
|
|
url_con->headers = curl_slist_append(url_con->headers, tmp);
|
|
|
|
}
|
|
|
|
|
2007-09-26 09:01:04 -07:00
|
|
|
switch (url_con->condition)
|
|
|
|
{
|
|
|
|
case ECORE_CON_URL_TIME_NONE:
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
|
|
|
CURL_TIMECOND_NONE);
|
2007-09-26 10:18:52 -07:00
|
|
|
break;
|
2007-09-26 09:01:04 -07:00
|
|
|
case ECORE_CON_URL_TIME_IFMODSINCE:
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
|
|
|
CURL_TIMECOND_IFMODSINCE);
|
2007-09-26 10:18:52 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, url_con->time);
|
|
|
|
break;
|
2007-09-26 09:01:04 -07:00
|
|
|
case ECORE_CON_URL_TIME_IFUNMODSINCE:
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
|
|
|
CURL_TIMECOND_IFUNMODSINCE);
|
2007-09-26 10:18:52 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, url_con->time);
|
|
|
|
break;
|
2007-09-26 09:01:04 -07:00
|
|
|
case ECORE_CON_URL_TIME_LASTMOD:
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
|
|
|
|
CURL_TIMECOND_LASTMOD);
|
2007-09-26 10:18:52 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, url_con->time);
|
|
|
|
break;
|
2007-09-26 09:01:04 -07:00
|
|
|
}
|
|
|
|
|
2009-08-12 02:47:04 -07:00
|
|
|
/* Additional headers */
|
|
|
|
EINA_LIST_FOREACH(url_con->additional_headers, l, s)
|
2009-08-21 12:47:04 -07:00
|
|
|
url_con->headers = curl_slist_append(url_con->headers, s);
|
2009-08-12 02:47:04 -07:00
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, url_con->headers);
|
|
|
|
|
2008-09-12 06:19:26 -07:00
|
|
|
url_con->received = 0;
|
|
|
|
|
2009-11-14 05:43:38 -08:00
|
|
|
int res = _ecore_con_url_perform(url_con);
|
|
|
|
|
|
|
|
return res;
|
2005-06-24 06:38:27 -07:00
|
|
|
#else
|
2007-09-26 10:18:52 -07:00
|
|
|
return 0;
|
2006-11-05 08:49:55 -08:00
|
|
|
url_con = NULL;
|
|
|
|
data = NULL;
|
|
|
|
length = 0;
|
|
|
|
content_type = NULL;
|
2005-06-24 06:38:27 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-05-28 02:02:39 -07:00
|
|
|
/**
|
|
|
|
* Makes a FTP upload
|
2008-06-20 00:48:33 -07:00
|
|
|
* @return FIXME: To be more documented.
|
2008-05-28 02:02:39 -07:00
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
2009-03-22 06:27:24 -07:00
|
|
|
EAPI int
|
2009-03-16 06:46:16 -07:00
|
|
|
ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const char *user, const char *pass, const char *upload_dir)
|
2008-05-28 02:02:39 -07:00
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
|
|
|
char url[4096];
|
|
|
|
char userpwd[4096];
|
|
|
|
FILE *fd;
|
2008-06-20 00:48:33 -07:00
|
|
|
struct stat file_info;
|
2009-03-22 06:27:24 -07:00
|
|
|
|
2008-05-28 02:02:39 -07:00
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_ftp_upload");
|
|
|
|
return 0;
|
|
|
|
}
|
2009-03-22 06:27:24 -07:00
|
|
|
|
2008-05-28 02:02:39 -07:00
|
|
|
if (url_con->active) return 0;
|
|
|
|
if (!url_con->url) return 0;
|
|
|
|
if (filename)
|
|
|
|
{
|
2009-11-06 23:09:06 -08:00
|
|
|
char tmp[PATH_MAX];
|
2009-10-30 14:36:31 -07:00
|
|
|
|
2009-11-06 23:09:06 -08:00
|
|
|
snprintf(tmp, PATH_MAX, "%s", filename);
|
2009-10-30 14:36:31 -07:00
|
|
|
|
2008-05-28 02:02:39 -07:00
|
|
|
if (stat(filename, &file_info)) return 0;
|
|
|
|
fd = fopen(filename, "rb");
|
2008-06-20 00:48:33 -07:00
|
|
|
if (upload_dir)
|
2009-08-21 12:47:04 -07:00
|
|
|
snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url,
|
2009-10-30 14:36:31 -07:00
|
|
|
upload_dir, basename(tmp));
|
2008-06-20 00:48:33 -07:00
|
|
|
else
|
2009-08-21 12:47:04 -07:00
|
|
|
snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
|
2009-10-30 14:36:31 -07:00
|
|
|
basename(tmp));
|
2008-05-28 02:02:39 -07:00
|
|
|
snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE,
|
|
|
|
(curl_off_t)file_info.st_size);
|
2008-05-28 02:02:39 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION,
|
|
|
|
_ecore_con_url_read_cb);
|
2008-05-28 02:02:39 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd);
|
|
|
|
ecore_con_url_url_set(url_con, url);
|
|
|
|
|
|
|
|
return _ecore_con_url_perform(url_con);
|
|
|
|
}
|
2008-06-27 20:51:20 -07:00
|
|
|
else
|
2009-08-21 12:47:04 -07:00
|
|
|
return 0;
|
2008-05-28 02:02:39 -07:00
|
|
|
#else
|
|
|
|
return 0;
|
|
|
|
url_con = NULL;
|
|
|
|
filename = NULL;
|
|
|
|
user = NULL;
|
|
|
|
pass = NULL;
|
2008-06-20 00:48:33 -07:00
|
|
|
upload_dir = NULL;
|
2009-03-22 06:27:24 -07:00
|
|
|
#endif
|
2008-05-28 02:02:39 -07:00
|
|
|
}
|
|
|
|
|
2010-05-06 13:18:39 -07:00
|
|
|
/**
|
|
|
|
* Send a Curl httppost
|
|
|
|
* @return 1 on success, 0 on error.
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
|
|
|
EAPI int
|
|
|
|
ecore_con_url_http_post_send(Ecore_Con_Url *url_con, void *httppost)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_CURL
|
|
|
|
if (url_con->post)
|
|
|
|
curl_formfree(url_con->post);
|
|
|
|
url_con->post = NULL;
|
|
|
|
|
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_http_post_send");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
url_con->post = httppost;
|
|
|
|
|
|
|
|
if (url_con->active) return 0;
|
|
|
|
if (!url_con->url) return 0;
|
|
|
|
|
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPPOST, httppost);
|
|
|
|
|
|
|
|
return ecore_con_url_send(url_con, NULL, 0, NULL);
|
|
|
|
#else
|
|
|
|
return 0;
|
|
|
|
url_con = NULL;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-06-20 00:48:33 -07:00
|
|
|
/**
|
|
|
|
* Enable or disable libcurl verbose output, useful for debug
|
|
|
|
* @return FIXME: To be more documented.
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
|
|
|
EAPI void
|
|
|
|
ecore_con_url_verbose_set(Ecore_Con_Url *url_con, int verbose)
|
|
|
|
{
|
|
|
|
#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_verbose_set");
|
|
|
|
return;
|
|
|
|
}
|
2009-03-22 06:27:24 -07:00
|
|
|
|
2008-06-20 00:48:33 -07:00
|
|
|
if (url_con->active) return;
|
|
|
|
if (!url_con->url) return;
|
2010-02-25 21:56:49 -08:00
|
|
|
if (verbose == EINA_TRUE)
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, 1);
|
2009-03-22 06:27:24 -07:00
|
|
|
else
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, 0);
|
2008-06-20 00:48:33 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Enable or disable EPSV extension
|
|
|
|
* @return FIXME: To be more documented.
|
|
|
|
* @ingroup Ecore_Con_Url_Group
|
|
|
|
*/
|
|
|
|
EAPI void
|
|
|
|
ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, int use_epsv)
|
|
|
|
{
|
|
|
|
#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_ftp_use_epsv_set");
|
|
|
|
return;
|
|
|
|
}
|
2009-03-22 06:27:24 -07:00
|
|
|
|
2008-06-20 00:48:33 -07:00
|
|
|
if (url_con->active) return;
|
|
|
|
if (!url_con->url) return;
|
2010-02-25 21:56:49 -08:00
|
|
|
if (use_epsv == EINA_TRUE)
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, 1);
|
2009-03-22 06:27:24 -07:00
|
|
|
else
|
2009-08-21 12:47:04 -07:00
|
|
|
curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, 0);
|
2008-06-20 00:48:33 -07:00
|
|
|
#endif
|
|
|
|
}
|
2008-05-28 02:02:39 -07:00
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
#ifdef HAVE_CURL
|
2008-03-09 09:43:32 -07:00
|
|
|
static int
|
|
|
|
_ecore_con_url_suspend_fd_handler(void)
|
|
|
|
{
|
2009-08-21 12:47:04 -07:00
|
|
|
Eina_List *l;
|
|
|
|
Ecore_Con_Url *url_con;
|
|
|
|
int deleted = 0;
|
2008-03-09 09:43:32 -07:00
|
|
|
|
2009-08-21 12:47:04 -07:00
|
|
|
if (!_url_con_list) return 0;
|
2008-03-09 09:43:32 -07:00
|
|
|
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
EINA_LIST_FOREACH(_url_con_list, l, url_con)
|
2008-03-09 09:43:32 -07:00
|
|
|
{
|
|
|
|
if (url_con->active && url_con->fd_handler)
|
|
|
|
{
|
|
|
|
ecore_main_fd_handler_del(url_con->fd_handler);
|
|
|
|
url_con->fd_handler = NULL;
|
|
|
|
deleted++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return deleted;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_ecore_con_url_restart_fd_handler(void)
|
|
|
|
{
|
2009-08-21 12:47:04 -07:00
|
|
|
Eina_List *l;
|
|
|
|
Ecore_Con_Url *url_con;
|
|
|
|
int activated = 0;
|
2008-03-09 09:43:32 -07:00
|
|
|
|
2009-08-21 12:47:04 -07:00
|
|
|
if (!_url_con_list) return 0;
|
2008-03-09 09:43:32 -07:00
|
|
|
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
EINA_LIST_FOREACH(_url_con_list, l, url_con)
|
2008-03-09 09:43:32 -07:00
|
|
|
{
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
if (url_con->fd_handler == NULL && url_con->fd != -1)
|
2008-03-09 09:43:32 -07:00
|
|
|
{
|
2009-08-21 12:47:04 -07:00
|
|
|
url_con->fd_handler =
|
|
|
|
ecore_main_fd_handler_add(url_con->fd, url_con->flags,
|
|
|
|
_ecore_con_url_fd_handler,
|
|
|
|
NULL, NULL, NULL);
|
2008-03-09 09:43:32 -07:00
|
|
|
activated++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return activated;
|
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
static size_t
|
2008-06-20 00:48:33 -07:00
|
|
|
_ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
|
2005-06-24 06:38:27 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Url *url_con;
|
|
|
|
Ecore_Con_Event_Url_Data *e;
|
2008-06-20 00:48:33 -07:00
|
|
|
size_t real_size = size * nitems;
|
2005-06-24 06:38:27 -07:00
|
|
|
|
|
|
|
url_con = (Ecore_Con_Url *)userp;
|
2008-03-09 09:43:32 -07:00
|
|
|
|
|
|
|
if (!url_con) return -1;
|
|
|
|
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
|
2005-06-24 06:38:27 -07:00
|
|
|
{
|
2008-03-09 09:43:32 -07:00
|
|
|
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_cb");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
url_con->received += real_size;
|
|
|
|
|
|
|
|
if (url_con->write_fd < 0)
|
|
|
|
{
|
|
|
|
e = malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) * (real_size - 1));
|
|
|
|
if (e)
|
|
|
|
{
|
|
|
|
e->url_con = url_con;
|
|
|
|
e->size = real_size;
|
|
|
|
memcpy(e->data, buffer, real_size);
|
|
|
|
ecore_event_add(ECORE_CON_EVENT_URL_DATA, e,
|
|
|
|
_ecore_con_event_url_free, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ssize_t count = 0;
|
2009-08-21 12:47:04 -07:00
|
|
|
size_t total_size = real_size;
|
|
|
|
size_t offset = 0;
|
2008-03-09 09:43:32 -07:00
|
|
|
|
|
|
|
while (total_size > 0)
|
|
|
|
{
|
|
|
|
count = write(url_con->write_fd, (char*) buffer + offset, total_size);
|
|
|
|
if (count < 0)
|
|
|
|
{
|
2009-08-21 12:47:04 -07:00
|
|
|
if (errno != EAGAIN && errno != EINTR) return -1;
|
2008-03-09 09:43:32 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
total_size -= count;
|
|
|
|
offset += count;
|
|
|
|
}
|
|
|
|
}
|
2005-06-24 06:38:27 -07:00
|
|
|
}
|
2008-03-09 09:43:32 -07:00
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
return real_size;
|
|
|
|
}
|
|
|
|
|
2007-09-26 09:01:04 -07:00
|
|
|
#define ECORE_CON_URL_TRANSMISSION(Transmit, Event, Url_con, Total, Now) \
|
2007-09-26 10:18:52 -07:00
|
|
|
{ \
|
|
|
|
Ecore_Con_Event_Url_Progress *e; \
|
|
|
|
if ((Total != 0) || (Now != 0)) \
|
|
|
|
{ \
|
|
|
|
e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress)); \
|
|
|
|
if (e) \
|
|
|
|
{ \
|
|
|
|
e->url_con = url_con; \
|
|
|
|
e->total = Total; \
|
|
|
|
e->now = Now; \
|
|
|
|
ecore_event_add(Event, e, _ecore_con_event_url_free, NULL); \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
}
|
2007-09-26 09:01:04 -07:00
|
|
|
|
2009-08-24 02:41:07 -07:00
|
|
|
static size_t
|
|
|
|
_ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream)
|
|
|
|
{
|
|
|
|
size_t real_size = size * nitems;
|
|
|
|
Ecore_Con_Url *url_con = stream;
|
|
|
|
|
|
|
|
char *header = malloc(sizeof(char)*(real_size + 1));
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2007-09-26 09:01:04 -07:00
|
|
|
static int
|
|
|
|
_ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
|
|
|
|
{
|
2008-03-09 09:43:32 -07:00
|
|
|
Ecore_Con_Event_Url_Progress *e;
|
2009-08-21 12:47:04 -07:00
|
|
|
Ecore_Con_Url *url_con;
|
2007-09-26 09:01:04 -07:00
|
|
|
|
|
|
|
url_con = clientp;
|
|
|
|
|
2008-09-12 06:19:26 -07:00
|
|
|
e = malloc(sizeof(Ecore_Con_Event_Url_Progress));
|
2008-03-09 09:43:32 -07:00
|
|
|
if (e)
|
|
|
|
{
|
|
|
|
e->url_con = url_con;
|
|
|
|
e->down.total = dltotal;
|
|
|
|
e->down.now = dlnow;
|
|
|
|
e->up.total = ultotal;
|
|
|
|
e->up.now = ulnow;
|
2009-08-21 12:47:04 -07:00
|
|
|
ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e,
|
|
|
|
_ecore_con_event_url_free, NULL);
|
2008-03-09 09:43:32 -07:00
|
|
|
}
|
2007-09-26 09:01:04 -07:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-03-22 06:27:24 -07:00
|
|
|
static size_t
|
2008-06-20 00:48:33 -07:00
|
|
|
_ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream)
|
|
|
|
{
|
|
|
|
size_t retcode = fread(ptr, size, nitems, stream);
|
2009-08-21 12:47:04 -07:00
|
|
|
|
|
|
|
if (ferror((FILE*)stream))
|
|
|
|
{
|
|
|
|
fclose(stream);
|
|
|
|
return CURL_READFUNC_ABORT;
|
|
|
|
}
|
|
|
|
else if ((retcode == 0) || (retcode < nitems))
|
|
|
|
{
|
|
|
|
fclose((FILE*)stream);
|
|
|
|
return 0;
|
|
|
|
}
|
2009-12-21 09:32:19 -08:00
|
|
|
INF("*** We read %zu bytes from file", retcode);
|
2008-06-20 00:48:33 -07:00
|
|
|
return retcode;
|
|
|
|
}
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
static int
|
|
|
|
_ecore_con_url_perform(Ecore_Con_Url *url_con)
|
|
|
|
{
|
|
|
|
fd_set read_set, write_set, exc_set;
|
2009-08-21 12:47:04 -07:00
|
|
|
int fd_max, fd;
|
|
|
|
int flags, still_running;
|
2005-06-24 06:38:27 -07:00
|
|
|
int completed_immediately = 0;
|
|
|
|
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
_url_con_list = eina_list_append(_url_con_list, url_con);
|
2005-06-24 06:38:27 -07:00
|
|
|
|
|
|
|
url_con->active = 1;
|
|
|
|
curl_multi_add_handle(curlm, url_con->curl_easy);
|
2008-03-09 09:43:32 -07:00
|
|
|
/* This one can't be stopped, or the download never start. */
|
2005-06-24 06:38:27 -07:00
|
|
|
while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM);
|
|
|
|
|
2009-11-13 10:12:09 -08:00
|
|
|
completed_immediately = _ecore_con_url_process_completed_jobs(url_con);
|
2005-06-24 06:38:27 -07:00
|
|
|
|
|
|
|
if (!completed_immediately)
|
|
|
|
{
|
2009-11-13 10:12:09 -08:00
|
|
|
if (url_con->fd_handler)
|
|
|
|
ecore_main_fd_handler_del(url_con->fd_handler);
|
2009-11-14 05:43:38 -08:00
|
|
|
url_con->fd_handler = NULL;
|
2009-11-13 10:12:09 -08:00
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
/* url_con still active -- set up an fd_handler */
|
|
|
|
FD_ZERO(&read_set);
|
|
|
|
FD_ZERO(&write_set);
|
|
|
|
FD_ZERO(&exc_set);
|
|
|
|
|
|
|
|
/* Stupid curl, why can't I get the fd to the current added job? */
|
|
|
|
curl_multi_fdset(curlm, &read_set, &write_set, &exc_set, &fd_max);
|
|
|
|
for (fd = 0; fd <= fd_max; fd++)
|
|
|
|
{
|
|
|
|
if (!FD_ISSET(fd, &_current_fd_set))
|
|
|
|
{
|
|
|
|
flags = 0;
|
|
|
|
if (FD_ISSET(fd, &read_set)) flags |= ECORE_FD_READ;
|
|
|
|
if (FD_ISSET(fd, &write_set)) flags |= ECORE_FD_WRITE;
|
|
|
|
if (FD_ISSET(fd, &exc_set)) flags |= ECORE_FD_ERROR;
|
|
|
|
if (flags)
|
|
|
|
{
|
2009-10-30 14:36:31 -07:00
|
|
|
long ms = 0;
|
|
|
|
|
|
|
|
curl_multi_timeout(curlm, &ms);
|
|
|
|
if (ms == 0) ms = 1000;
|
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
FD_SET(fd, &_current_fd_set);
|
2008-03-09 09:43:32 -07:00
|
|
|
url_con->fd = fd;
|
|
|
|
url_con->flags = flags;
|
2009-08-21 12:47:04 -07:00
|
|
|
url_con->fd_handler =
|
|
|
|
ecore_main_fd_handler_add(fd, flags,
|
|
|
|
_ecore_con_url_fd_handler,
|
|
|
|
NULL, NULL, NULL);
|
2008-03-09 09:43:32 -07:00
|
|
|
break;
|
2005-06-24 06:38:27 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!url_con->fd_handler)
|
|
|
|
{
|
|
|
|
/* Failed to set up an fd_handler */
|
2009-10-30 14:36:31 -07:00
|
|
|
ecore_timer_freeze(_curl_timeout);
|
2005-06-24 07:39:25 -07:00
|
|
|
curl_multi_remove_handle(curlm, url_con->curl_easy);
|
2005-06-24 06:38:27 -07:00
|
|
|
url_con->active = 0;
|
2008-03-09 09:43:32 -07:00
|
|
|
url_con->fd = -1;
|
2005-06-24 06:38:27 -07:00
|
|
|
return 0;
|
|
|
|
}
|
2009-10-30 14:36:31 -07:00
|
|
|
ecore_timer_thaw(_curl_timeout);
|
2005-06-24 06:38:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
static Eina_Bool
|
2009-10-30 14:36:31 -07:00
|
|
|
_ecore_con_url_idler_handler(void *data)
|
2008-03-09 09:43:32 -07:00
|
|
|
{
|
2009-08-21 12:47:04 -07:00
|
|
|
double start;
|
|
|
|
int done = 1, still_running;
|
2008-03-09 09:43:32 -07:00
|
|
|
|
|
|
|
start = ecore_time_get();
|
|
|
|
while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM)
|
2008-09-12 06:19:26 -07:00
|
|
|
/* make this not more than a frametime to keep interactivity high */
|
|
|
|
if ((ecore_time_get() - start) > ecore_animator_frametime_get())
|
2008-03-09 09:43:32 -07:00
|
|
|
{
|
|
|
|
done = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
_ecore_con_url_process_completed_jobs(NULL);
|
|
|
|
|
|
|
|
if (done)
|
|
|
|
{
|
|
|
|
_ecore_con_url_restart_fd_handler();
|
|
|
|
_fd_idler_handler = NULL;
|
2009-10-30 14:36:31 -07:00
|
|
|
|
|
|
|
if (!_url_con_list)
|
|
|
|
ecore_timer_freeze(_curl_timeout);
|
2010-06-24 09:15:56 -07:00
|
|
|
return data == (void*) 0xACE ? ECORE_CALLBACK_RENEW : ECORE_CALLBACK_CANCEL;
|
2008-03-09 09:43:32 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2008-03-09 09:43:32 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
static Eina_Bool
|
2006-11-10 11:11:12 -08:00
|
|
|
_ecore_con_url_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
|
2005-06-24 06:38:27 -07:00
|
|
|
{
|
2008-03-09 09:43:32 -07:00
|
|
|
_ecore_con_url_suspend_fd_handler();
|
2005-06-24 06:38:27 -07:00
|
|
|
|
2008-03-09 09:43:32 -07:00
|
|
|
if (_fd_idler_handler == NULL)
|
|
|
|
_fd_idler_handler = ecore_idler_add(_ecore_con_url_idler_handler, NULL);
|
2005-06-24 06:38:27 -07:00
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2005-06-24 06:38:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match)
|
|
|
|
{
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
Eina_List *l;
|
2005-06-24 06:38:27 -07:00
|
|
|
Ecore_Con_Url *url_con;
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
Ecore_Con_Event_Url_Complete *e;
|
2005-06-24 06:38:27 -07:00
|
|
|
CURLMsg *curlmsg;
|
|
|
|
int n_remaining;
|
|
|
|
int job_matched = 0;
|
|
|
|
|
|
|
|
/* Loop jobs and check if any are done */
|
|
|
|
while ((curlmsg = curl_multi_info_read(curlm, &n_remaining)) != NULL)
|
|
|
|
{
|
|
|
|
if (curlmsg->msg != CURLMSG_DONE) continue;
|
|
|
|
|
|
|
|
/* find the job which is done */
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
EINA_LIST_FOREACH(_url_con_list, l, url_con)
|
2005-06-24 06:38:27 -07:00
|
|
|
{
|
|
|
|
if (curlmsg->easy_handle == url_con->curl_easy)
|
|
|
|
{
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
if (url_con_to_match && (url_con == url_con_to_match))
|
2009-08-21 12:47:04 -07:00
|
|
|
job_matched = 1;
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
if(url_con->fd != -1)
|
2005-06-24 06:38:27 -07:00
|
|
|
{
|
2008-03-09 09:43:32 -07:00
|
|
|
FD_CLR(url_con->fd, &_current_fd_set);
|
|
|
|
if (url_con->fd_handler)
|
|
|
|
ecore_main_fd_handler_del(url_con->fd_handler);
|
|
|
|
url_con->fd = -1;
|
2005-06-24 07:47:51 -07:00
|
|
|
url_con->fd_handler = NULL;
|
2005-06-24 06:38:27 -07:00
|
|
|
}
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
_url_con_list = eina_list_remove(_url_con_list, url_con);
|
2005-06-24 06:38:27 -07:00
|
|
|
url_con->active = 0;
|
2009-03-04 02:49:23 -08:00
|
|
|
e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete));
|
|
|
|
if (e)
|
|
|
|
{
|
|
|
|
e->url_con = url_con;
|
|
|
|
e->status = 0;
|
2009-11-19 10:45:51 -08:00
|
|
|
if (curlmsg->data.result == CURLE_OK)
|
|
|
|
{
|
|
|
|
long status; /* curl API uses long, not int */
|
|
|
|
|
|
|
|
status = 0;
|
|
|
|
curl_easy_getinfo(curlmsg->easy_handle, CURLINFO_RESPONSE_CODE, &status);
|
|
|
|
e->status = status;
|
|
|
|
}
|
|
|
|
|
2009-03-04 02:49:23 -08:00
|
|
|
_url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e);
|
|
|
|
}
|
2007-09-26 09:01:04 -07:00
|
|
|
curl_multi_remove_handle(curlm, url_con->curl_easy);
|
2005-06-24 06:38:27 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
return job_matched;
|
|
|
|
}
|
2008-02-11 15:24:11 -08:00
|
|
|
|
2005-06-24 06:38:27 -07:00
|
|
|
static void
|
2007-09-26 09:01:04 -07:00
|
|
|
_ecore_con_event_url_free(void *data __UNUSED__, void *ev)
|
2005-06-24 06:38:27 -07:00
|
|
|
{
|
2007-09-26 09:01:04 -07:00
|
|
|
free(ev);
|
2005-06-24 06:38:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|