Could you test this set of patch ?
On Mon, Mar 3, 2008 at 7:11 PM, Massimiliano Calamelli
<[EMAIL PROTECTED]> wrote:
> I'll be very happy to help you for tests.
>
> massimiliano
--
Cedric BAIL
From c3ddd94569aed2dd8c5cc5a7b14d56f1ab2e913f Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Thu, 28 Feb 2008 16:07:38 +0100
Subject: [PATCH] Add a way to directly store the result of a ecore_con_url request inside a fd.
---
src/lib/ecore_con/Ecore_Con.h | 2 +
src/lib/ecore_con/ecore_con_private.h | 3 +
src/lib/ecore_con/ecore_con_url.c | 87 ++++++++++++++++++++++++++++---
src/lib/ecore_download/ecore_download.c | 48 +++++------------
4 files changed, 98 insertions(+), 42 deletions(-)
diff --git a/src/lib/ecore_con/Ecore_Con.h b/src/lib/ecore_con/Ecore_Con.h
index 01375f4..a23e365 100644
--- a/src/lib/ecore_con/Ecore_Con.h
+++ b/src/lib/ecore_con/Ecore_Con.h
@@ -196,6 +196,8 @@ extern "C" {
EAPI void ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data);
EAPI void *ecore_con_url_data_get(Ecore_Con_Url *url_con);
EAPI int ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url);
+ EAPI void ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd);
+ EAPI int ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con);
EAPI int ecore_con_url_send(Ecore_Con_Url *url_con, void *data, size_t length, char *content_type);
EAPI void ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, time_t tm);
diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h
index 820771a..ae0332a 100644
--- a/src/lib/ecore_con/ecore_con_private.h
+++ b/src/lib/ecore_con/ecore_con_private.h
@@ -79,6 +79,9 @@ struct _Ecore_Con_Url
Ecore_Fd_Handler *fd_handler;
+ int received;
+ int fd;
+
unsigned char active : 1;
};
#endif
diff --git a/src/lib/ecore_con/ecore_con_url.c b/src/lib/ecore_con/ecore_con_url.c
index d114a0d..be46b94 100644
--- a/src/lib/ecore_con/ecore_con_url.c
+++ b/src/lib/ecore_con/ecore_con_url.c
@@ -40,6 +40,8 @@
#include "Ecore_Con.h"
#include "ecore_con_private.h"
+#include <errno.h>
+
/**
* @defgroup Ecore_Con_Url_Group Ecore URL Connection Functions
*
@@ -230,6 +232,8 @@ ecore_con_url_new(const char *url)
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300);
curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
+ url_con->fd = -1;
+
return url_con;
#else
return NULL;
@@ -376,6 +380,40 @@ ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, time_t
* @return FIXME: To be documented.
* @ingroup Ecore_Con_Url_Group
*/
+EAPI void
+ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd)
+{
+ 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->fd = fd;
+}
+
+/**
+ * FIXME: To be documented.
+ * @return FIXME: To be documented.
+ * @ingroup Ecore_Con_Url_Group
+ */
+EAPI int
+ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con)
+{
+ 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;
+}
+
+/**
+ * FIXME: To be documented.
+ * @return FIXME: To be documented.
+ * @ingroup Ecore_Con_Url_Group
+ */
EAPI int
ecore_con_url_send(Ecore_Con_Url *url_con, void *data, size_t length, char *content_type)
{
@@ -448,15 +486,50 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nmemb, void *userp)
size_t real_size = size * nmemb;
url_con = (Ecore_Con_Url *)userp;
- e = malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) * (real_size - 1));
- if (e)
+
+ if (!url_con) return -1;
+ if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
- 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);
+ ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_destroy");
+ return -1;
}
+
+ url_con->received += real_size;
+
+ if (url_con->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;
+ size_t total_size = real_size;
+ size_t offset = 0;
+
+ while (total_size > 0)
+ {
+ count = write(url_con->fd, (char*) buffer + offset, total_size);
+ if (count < 0)
+ {
+ if (errno != EAGAIN && errno != EINTR)
+ return -1;
+ }
+ else
+ {
+ total_size -= count;
+ offset += count;
+ }
+ }
+ }
+
return real_size;
}
diff --git a/src/lib/ecore_download/ecore_download.c b/src/lib/ecore_download/ecore_download.c
index 2374aaf..1ec596c 100644
--- a/src/lib/ecore_download/ecore_download.c
+++ b/src/lib/ecore_download/ecore_download.c
@@ -28,54 +28,31 @@ struct _Ecore_Download_Dir
struct _Ecore_Download_File
{
- ECORE_MAGIC;
+ ECORE_MAGIC;
- Ecore_Download_Dir *dir;
+ Ecore_Download_Dir *dir;
- Ecore_Con_Url *url_con;
- const char *url;
+ Ecore_Con_Url *url_con;
+ const char *url;
- const char *file;
- time_t tm;
+ const char *file;
+ time_t tm;
- const char *temp;
- int fd;
+ const char *temp;
+ int fd;
- const void *data;
+ const void *data;
- int active : 1;
- int updated : 1;
+ unsigned int active : 1;
};
int ECORE_DOWNLOAD_EVENT_CANCEL = 0;
int ECORE_DOWNLOAD_EVENT_COMPLETE = 0;
int ECORE_DOWNLOAD_EVENT_PROGRESS = 0;
-static Ecore_Event_Handler *ed_url_data = NULL;
static Ecore_Event_Handler *ed_url_complete = NULL;
static Ecore_Event_Handler *ed_url_progress_download = NULL;
-static int
-_ecore_download_url_data_cb(void *data, int type, void *event)
-{
- Ecore_Con_Event_Url_Data *e;
- Ecore_Download_File *edf;
-
- e = event;
-
- edf = ecore_con_url_data_get(e->url_con);
-
- if (!ECORE_MAGIC_CHECK(edf, ECORE_MAGIC_DOWNLOAD_FILES)) return 1;
-
- if (edf->fd != -1)
- {
- edf->updated = 1;
- write(edf->fd, e->data, e->size);
- }
-
- return 0;
-}
-
static Ecore_Download_Event_Complete*
_ecore_download_event_complete_new(Ecore_Download_File *edf, int status)
{
@@ -124,7 +101,7 @@ _ecore_download_url_complete_cb(void *data, int type, void *event)
if (e->status == 200)
{
/* File update. */
- if (edf->updated != 0)
+ if (ecore_con_url_received_bytes_get(e->url_con) > 0)
{
unlink(edf->file);
if (rename(edf->temp, edf->file) != 0)
@@ -211,7 +188,6 @@ ecore_download_init(void)
ECORE_DOWNLOAD_EVENT_COMPLETE = ecore_event_type_new();
ECORE_DOWNLOAD_EVENT_CANCEL = ecore_event_type_new();
- ed_url_data = ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA, _ecore_download_url_data_cb, NULL);
ed_url_complete = ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _ecore_download_url_complete_cb, NULL);
ed_url_progress_download = ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS_DOWNLOAD, _ecore_download_url_progress_download_cb, NULL);
}
@@ -427,6 +403,8 @@ ecore_download_file_start(Ecore_Download_File* edf)
if (edf->tm != 0)
ecore_con_url_time(edf->url_con, ECORE_CON_URL_TIME_IFMODSINCE, edf->tm);
+ ecore_con_url_fd_set(edf->url_con, edf->fd);
+
return ecore_con_url_send(edf->url_con, NULL, 0, NULL);
}
--
1.5.4.GIT
From 6976666918072509b3234e4bff758acb18154d1f Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Fri, 29 Feb 2008 15:26:46 +0100
Subject: [PATCH] Defer curl_multi_perform until idle.
With low end device, downloading data too fast will give ecore_main_loop always
a chance to find data with select and thus never enter idle loop. This prevent
evas_render from being called.
The idea of this change is to create an ecore_idler when we know that we have
some pending data and wait until idle to get them. All download monitoring is
suspended until ecore enter idle mode. This force ecore to call evas_render,
before receiving data. The download are monitored again only if their is no
more pending data.
---
src/lib/ecore_con/ecore_con_private.h | 4 +-
src/lib/ecore_con/ecore_con_url.c | 127 ++++++++++++++++++++++++++++-----
2 files changed, 112 insertions(+), 19 deletions(-)
diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h
index ae0332a..d5d9258 100644
--- a/src/lib/ecore_con/ecore_con_private.h
+++ b/src/lib/ecore_con/ecore_con_private.h
@@ -78,9 +78,11 @@ struct _Ecore_Con_Url
void *data;
Ecore_Fd_Handler *fd_handler;
+ int fd;
+ int flags;
int received;
- int fd;
+ int write_fd;
unsigned char active : 1;
};
diff --git a/src/lib/ecore_con/ecore_con_url.c b/src/lib/ecore_con/ecore_con_url.c
index be46b94..e399c02 100644
--- a/src/lib/ecore_con/ecore_con_url.c
+++ b/src/lib/ecore_con/ecore_con_url.c
@@ -20,7 +20,7 @@
* 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.
- *
+ *
* Example Usage 1 (HTTP GET):
* ecore_con_url_url_set(url_con, "http://www.google.com");
* ecore_con_url_send(url, NULL, 0, NULL);
@@ -63,10 +63,11 @@ int ECORE_CON_EVENT_URL_COMPLETE = 0;
int ECORE_CON_EVENT_URL_PROGRESS_DOWNLOAD = 0;
int ECORE_CON_EVENT_URL_PROGRESS_UPLOAD = 0;
-static CURLM *curlm = NULL;
-static Ecore_List *_url_con_list = NULL;
-static fd_set _current_fd_set;
-static int init_count = 0;
+static Ecore_Idler *_fd_idler_handler = NULL;
+static Ecore_List *_url_con_list = NULL;
+static CURLM *curlm = NULL;
+static fd_set _current_fd_set;
+static int init_count = 0;
struct _Ecore_Con_Url_Event
{
@@ -233,6 +234,7 @@ ecore_con_url_new(const char *url)
curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
url_con->fd = -1;
+ url_con->write_fd = -1;
return url_con;
#else
@@ -259,7 +261,10 @@ ecore_con_url_destroy(Ecore_Con_Url *url_con)
ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE);
if (url_con->fd_handler)
- ecore_main_fd_handler_del(url_con->fd_handler);
+ {
+ ecore_main_fd_handler_del(url_con->fd_handler);
+ url_con->fd = -1;
+ }
if (url_con->curl_easy)
{
if (url_con->active)
@@ -389,7 +394,7 @@ ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd)
return ;
}
- url_con->fd = fd;
+ url_con->write_fd = fd;
}
/**
@@ -478,6 +483,57 @@ ecore_con_url_send(Ecore_Con_Url *url_con, void *data, size_t length, char *cont
}
#ifdef HAVE_CURL
+static int
+_ecore_con_url_suspend_fd_handler(void)
+{
+ Ecore_Con_Url *url_con;
+ int deleted = 0;
+
+ if (!_url_con_list)
+ return 0;
+
+ ecore_list_first_goto(_url_con_list);
+ while ((url_con = ecore_list_current(_url_con_list)))
+ {
+ if (url_con->active && url_con->fd_handler)
+ {
+ ecore_main_fd_handler_del(url_con->fd_handler);
+ url_con->fd_handler = NULL;
+ deleted++;
+ }
+ ecore_list_next(_url_con_list);
+ }
+
+ return deleted;
+}
+
+static int
+_ecore_con_url_restart_fd_handler(void)
+{
+ Ecore_Con_Url *url_con;
+ int activated = 0;
+
+ if (!_url_con_list)
+ return 0;
+
+ ecore_list_first_goto(_url_con_list);
+ while ((url_con = ecore_list_current(_url_con_list)))
+ {
+ if (url_con->fd_handler == NULL
+ && url_con->fd != -1)
+ {
+ url_con->fd_handler = ecore_main_fd_handler_add(url_con->fd,
+ url_con->flags,
+ _ecore_con_url_fd_handler,
+ NULL, NULL, NULL);
+ activated++;
+ }
+ ecore_list_next(_url_con_list);
+ }
+
+ return activated;
+}
+
static size_t
_ecore_con_url_data_cb(void *buffer, size_t size, size_t nmemb, void *userp)
{
@@ -490,13 +546,13 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nmemb, void *userp)
if (!url_con) return -1;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
- ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_destroy");
+ ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_cb");
return -1;
}
url_con->received += real_size;
- if (url_con->fd < 0)
+ if (url_con->write_fd < 0)
{
e = malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) * (real_size - 1));
if (e)
@@ -516,7 +572,7 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nmemb, void *userp)
while (total_size > 0)
{
- count = write(url_con->fd, (char*) buffer + offset, total_size);
+ count = write(url_con->write_fd, (char*) buffer + offset, total_size);
if (count < 0)
{
if (errno != EAGAIN && errno != EINTR)
@@ -566,6 +622,7 @@ static int
_ecore_con_url_perform(Ecore_Con_Url *url_con)
{
fd_set read_set, write_set, exc_set;
+ double start;
int fd_max;
int fd;
int flags;
@@ -574,8 +631,10 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
ecore_list_append(_url_con_list, url_con);
+ start = ecore_time_get();
url_con->active = 1;
curl_multi_add_handle(curlm, url_con->curl_easy);
+ /* This one can't be stopped, or the download never start. */
while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM);
completed_immediately = _ecore_con_url_process_completed_jobs(url_con);
@@ -600,9 +659,12 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
if (flags)
{
FD_SET(fd, &_current_fd_set);
+ url_con->fd = fd;
+ url_con->flags = flags;
url_con->fd_handler = ecore_main_fd_handler_add(fd, flags,
_ecore_con_url_fd_handler,
NULL, NULL, NULL);
+ break;
}
}
}
@@ -611,6 +673,7 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
/* Failed to set up an fd_handler */
curl_multi_remove_handle(curlm, url_con->curl_easy);
url_con->active = 0;
+ url_con->fd = -1;
return 0;
}
}
@@ -619,14 +682,41 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
}
static int
+_ecore_con_url_idler_handler(void *data)
+{
+ double start;
+ int done = 1;
+ int still_running;
+
+ start = ecore_time_get();
+ while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM)
+ /* make this 1/20th of a second to keep interactivity high */
+ if ((ecore_time_get() - start) > 0.2)
+ {
+ done = 0;
+ break;
+ }
+
+ _ecore_con_url_process_completed_jobs(NULL);
+
+ if (done)
+ {
+ _ecore_con_url_restart_fd_handler();
+ _fd_idler_handler = NULL;
+ return 0;
+ }
+
+ return 1;
+}
+
+static int
_ecore_con_url_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
{
- int still_running;
+ _ecore_con_url_suspend_fd_handler();
- /* FIXME: Can this run for a long time? Maybe limit how long it can run */
- while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM);
+ if (_fd_idler_handler == NULL)
+ _fd_idler_handler = ecore_idler_add(_ecore_con_url_idler_handler, NULL);
- _ecore_con_url_process_completed_jobs(NULL);
return 1;
}
@@ -653,11 +743,12 @@ _ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match)
if (url_con_to_match && (url_con == url_con_to_match)) {
job_matched = 1;
}
- if (url_con->fd_handler)
+ if (url_con->fd != -1)
{
- FD_CLR(ecore_main_fd_handler_fd_get(url_con->fd_handler),
- &_current_fd_set);
- ecore_main_fd_handler_del(url_con->fd_handler);
+ 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;
url_con->fd_handler = NULL;
}
ecore_list_remove(_url_con_list);
--
1.5.4.GIT
From 98d35ebf67ebc9d4e7163e1e8697fa527d75b5bb Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Tue, 4 Mar 2008 16:53:14 +0100
Subject: [PATCH] Unify progress message..
---
src/lib/ecore_con/Ecore_Con.h | 13 +++++++++----
src/lib/ecore_con/ecore_con_url.c | 23 ++++++++++++++++-------
2 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/src/lib/ecore_con/Ecore_Con.h b/src/lib/ecore_con/Ecore_Con.h
index a23e365..e977c84 100644
--- a/src/lib/ecore_con/Ecore_Con.h
+++ b/src/lib/ecore_con/Ecore_Con.h
@@ -149,8 +149,14 @@ extern "C" {
struct _Ecore_Con_Event_Url_Progress
{
Ecore_Con_Url *url_con;
- double total;
- double now;
+ struct {
+ double total;
+ double now;
+ } down;
+ struct {
+ double total;
+ double now;
+ } up;
};
EAPI extern int ECORE_CON_EVENT_CLIENT_ADD;
@@ -161,8 +167,7 @@ extern "C" {
EAPI extern int ECORE_CON_EVENT_SERVER_DATA;
EAPI extern int ECORE_CON_EVENT_URL_DATA;
EAPI extern int ECORE_CON_EVENT_URL_COMPLETE;
- EAPI extern int ECORE_CON_EVENT_URL_PROGRESS_DOWNLOAD;
- EAPI extern int ECORE_CON_EVENT_URL_PROGRESS_UPLOAD;
+ EAPI extern int ECORE_CON_EVENT_URL_PROGRESS;
EAPI int ecore_con_init(void);
EAPI int ecore_con_shutdown(void);
diff --git a/src/lib/ecore_con/ecore_con_url.c b/src/lib/ecore_con/ecore_con_url.c
index e399c02..cb87ee8 100644
--- a/src/lib/ecore_con/ecore_con_url.c
+++ b/src/lib/ecore_con/ecore_con_url.c
@@ -60,8 +60,7 @@ static int _ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match
int ECORE_CON_EVENT_URL_DATA = 0;
int ECORE_CON_EVENT_URL_COMPLETE = 0;
-int ECORE_CON_EVENT_URL_PROGRESS_DOWNLOAD = 0;
-int ECORE_CON_EVENT_URL_PROGRESS_UPLOAD = 0;
+int ECORE_CON_EVENT_URL_PROGRESS = 0;
static Ecore_Idler *_fd_idler_handler = NULL;
static Ecore_List *_url_con_list = NULL;
@@ -117,8 +116,7 @@ ecore_con_url_init(void)
{
ECORE_CON_EVENT_URL_DATA = ecore_event_type_new();
ECORE_CON_EVENT_URL_COMPLETE = ecore_event_type_new();
- ECORE_CON_EVENT_URL_PROGRESS_DOWNLOAD = ecore_event_type_new();
- ECORE_CON_EVENT_URL_PROGRESS_UPLOAD = ecore_event_type_new();
+ ECORE_CON_EVENT_URL_PROGRESS = ecore_event_type_new();
}
if (!_url_con_list)
@@ -233,6 +231,8 @@ ecore_con_url_new(const char *url)
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300);
curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate");
+
url_con->fd = -1;
url_con->write_fd = -1;
@@ -608,12 +608,21 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nmemb, void *userp)
static int
_ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
- Ecore_Con_Url *url_con;
+ Ecore_Con_Event_Url_Progress *e;
+ Ecore_Con_Url *url_con;
url_con = clientp;
- ECORE_CON_URL_TRANSMISSION(Download, ECORE_CON_EVENT_URL_PROGRESS_DOWNLOAD, url_con, dltotal, dlnow);
- ECORE_CON_URL_TRANSMISSION(Upload, ECORE_CON_EVENT_URL_PROGRESS_UPLOAD, url_con, ultotal, ulnow);
+ e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress));
+ if (e)
+ {
+ e->url_con = url_con;
+ e->down.total = dltotal;
+ e->down.now = dlnow;
+ e->up.total = ultotal;
+ e->up.now = ulnow;
+ ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e, _ecore_con_event_url_free, NULL);
+ }
return 0;
}
--
1.5.4.GIT
From e21b735cd8d4f5b447328350e696937944ead7ab Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Tue, 4 Mar 2008 16:55:04 +0100
Subject: [PATCH] Use Ecore_Con_Url for ecore_file_download.
---
src/lib/ecore_file/Makefile.am | 1 +
src/lib/ecore_file/ecore_file_download.c | 330 ++++++++++--------------------
2 files changed, 107 insertions(+), 224 deletions(-)
diff --git a/src/lib/ecore_file/Makefile.am b/src/lib/ecore_file/Makefile.am
index 3e52f50..f2d785a 100644
--- a/src/lib/ecore_file/Makefile.am
+++ b/src/lib/ecore_file/Makefile.am
@@ -2,6 +2,7 @@ MAINTAINERCLEANFILES = Makefile.in
AM_CPPFLAGS = \
-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_con \
-I$(top_builddir)/src/lib/ecore \
@CURL_CFLAGS@
diff --git a/src/lib/ecore_file/ecore_file_download.c b/src/lib/ecore_file/ecore_file_download.c
index 85ede05..a3a244a 100644
--- a/src/lib/ecore_file/ecore_file_download.c
+++ b/src/lib/ecore_file/ecore_file_download.c
@@ -1,111 +1,87 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
+#include "Ecore_Con.h"
#include "ecore_file_private.h"
-static int init = 0;
-
-#ifdef HAVE_CURL
-#include <curl/curl.h>
-
-typedef struct _Ecore_File_Download_Job Ecore_File_Download_Job;
+#define ECORE_MAGIC_FILE_DOWNLOAD_JOB 0xf7427cb8
+typedef struct _Ecore_File_Download_Job Ecore_File_Download_Job;
struct _Ecore_File_Download_Job
{
- Ecore_Fd_Handler *fd_handler;
- CURL *curl;
- void (*completion_cb)(void *data, const char *file, int status);
- int (*progress_cb)(void *data, const char *file, long int dltotal, long int dlnow, long int ultotal, long int ulnow);
- void *data;
- FILE *file;
- char *dst;
+ ECORE_MAGIC;
+
+ Ecore_Con_Url *url_con;
+ FILE *file;
+
+ char *dst;
+
+ void (*completion_cb)(void *data, const char *file, int status);
+
+ int (*progress_cb) (void *data, const char *file,
+ long int dltotal, long int dlnow,
+ long int ultotal, long int ulnow);
};
+#ifdef HAVE_CURL
Ecore_File_Download_Job *_ecore_file_download_curl(const char *url, const char *dst,
void (*completion_cb)(void *data, const char *file, int status),
int (*progress_cb)(void *data, const char *file, long int dltotal, long int dlnow, long int ultotal, long int ulnow),
void *data);
static int _ecore_file_download_curl_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
-static CURLM *curlm;
-static Ecore_List *_job_list;
-static fd_set _current_fd_set;
+static void _ecore_file_download_abort(Ecore_File_Download_Job *job);
+
+static int _ecore_file_download_url_complete_cb(void *data, int type, void *event);
+static int _ecore_file_download_url_progress_cb(void *data, int type, void *event);
#endif
+static int init = 0;
+static Ecore_Event_Handler *_url_complete_handler = NULL;
+static Ecore_Event_Handler *_url_progress_download = NULL;
+static Ecore_List *_job_list;
+
int
ecore_file_download_init(void)
{
- if (++init != 1) return init;
-
-#ifdef HAVE_CURL
- FD_ZERO(&_current_fd_set);
- _job_list = ecore_list_new();
- if (!_job_list) return --init;
-
- if (curl_global_init(CURL_GLOBAL_NOTHING)) return 0;
-
- curlm = curl_multi_init();
- if (!curlm)
+ if (init++ == 0)
{
- ecore_list_destroy(_job_list);
- _job_list = NULL;
- return --init;
+ _url_complete_handler = ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _ecore_file_download_url_complete_cb, NULL);
+ _url_progress_download = ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, _ecore_file_download_url_progress_cb, NULL);
}
-#endif
- return init;
+
+ return ecore_con_url_init();
}
int
ecore_file_download_shutdown(void)
{
- if (--init != 0) return init;
-#ifdef HAVE_CURL
- Ecore_File_Download_Job *job;
-
- if (!ecore_list_empty_is(_job_list))
+ if (--init == 0)
{
- ecore_list_first_goto(_job_list);
- while ((job = ecore_list_next(_job_list)))
- {
- ecore_main_fd_handler_del(job->fd_handler);
- curl_multi_remove_handle(curlm, job->curl);
- curl_easy_cleanup(job->curl);
- fclose(job->file);
- free(job->dst);
- free(job);
- }
+ ecore_event_handler_del(_url_complete_handler);
+ ecore_event_handler_del(_url_progress_download);
+ _url_complete_handler = NULL;
+ _url_progress_download = NULL;
}
- ecore_list_destroy(_job_list);
- curl_multi_cleanup(curlm);
- curl_global_cleanup();
-#endif
- return init;
+
+ return ecore_con_url_shutdown();
}
void
ecore_file_download_abort_all(void)
{
-#ifdef HAVE_CURL
- Ecore_File_Download_Job *job;
-
- if (!_job_list)
- return;
-
- ecore_list_first_goto(_job_list);
- while ((job = ecore_list_next(_job_list)))
+ if (!ecore_list_empty_is(_job_list))
{
- ecore_main_fd_handler_del(job->fd_handler);
- curl_multi_remove_handle(curlm, job->curl);
- curl_easy_cleanup(job->curl);
- fclose(job->file);
- free(job->dst);
- free(job);
+ Ecore_File_Download_Job *job;
+
+ while ((job = ecore_list_first_remove(_job_list)))
+ {
+ _ecore_file_download_abort(job);
+ }
}
ecore_list_clear(_job_list);
-#endif
}
-
/**
* Download @p url to the given @p dst
* @param url The complete url to download
@@ -192,38 +168,77 @@ ecore_file_download_protocol_available(const char *protocol)
}
#ifdef HAVE_CURL
-/* this reports the downloads progress. if we return 0, then download
- * continues, if we return anything else, then the download stops */
static int
-_ecore_file_download_curl_progress_func(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
+_ecore_file_download_url_compare_job(const void *data1, const void *data2)
{
- Ecore_File_Download_Job *job;
+ const Ecore_File_Download_Job *job = data1;
+ const Ecore_Con_Url *url = data2;
+
+ if (job->url_con == url) return 0;
+ return -1;
+}
+
+static int
+_ecore_file_download_url_complete_cb(void *data, int type, void *event)
+{
+ Ecore_Con_Event_Url_Complete *ev = event;
+ Ecore_File_Download_Job *job;
+
+ job = ecore_list_find(_job_list, _ecore_file_download_url_compare_job, ev->url_con);
+ if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return 1;
- job = clientp;
+ ecore_list_remove(_job_list);
+
+ if (job->completion_cb)
+ job->completion_cb(ecore_con_url_data_get(job->url_con), job->dst, !ev->status);
+
+ _ecore_file_download_abort(job);
- if(job->progress_cb)
- return job->progress_cb(job->data, job->dst, (long int)dltotal, (long int)dlnow, (long int)ultotal, (long int)ulnow);
return 0;
}
+static int
+_ecore_file_download_url_progress_cb(void *data, int type, void *event)
+{
+/* this reports the downloads progress. if we return 0, then download
+ * continues, if we return anything else, then the download stops */
+ Ecore_Con_Event_Url_Progress *ev = event;
+ Ecore_File_Download_Job *job;
+
+ job = ecore_list_find(_job_list, _ecore_file_download_url_compare_job, ev->url_con);
+ if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return 1;
+
+ if (job->progress_cb)
+ if (job->progress_cb(ecore_con_url_data_get(job->url_con), job->dst,
+ (long int) ev->down.total, (long int) ev->down.now,
+ (long int) ev->up.total, (long int) ev->up.now) != 0)
+ {
+ ecore_list_remove(_job_list);
+ _ecore_file_download_abort(job);
+ }
+
+ return 0;
+}
+
+static void
+_ecore_file_download_abort(Ecore_File_Download_Job *job)
+{
+ ecore_con_url_destroy(job->url_con);
+ fclose(job->file);
+ free(job->dst);
+ free(job);
+}
+
Ecore_File_Download_Job *
_ecore_file_download_curl(const char *url, const char *dst,
void (*completion_cb)(void *data, const char *file,
int status),
int (*progress_cb)(void *data, const char *file,
long int dltotal, long int dlnow,
- long int ultotal,
- long int ulnow),
+ long int ultotal, long int ulnow),
void *data)
{
- CURLMsg *curlmsg;
- fd_set read_set, write_set, exc_set;
- int fd_max;
- int fd;
- int flags;
- int n_remaining, still_running;
Ecore_File_Download_Job *job;
- double start = 0.0;
job = calloc(1, sizeof(Ecore_File_Download_Job));
if (!job) return NULL;
@@ -234,158 +249,25 @@ _ecore_file_download_curl(const char *url, const char *dst,
free(job);
return NULL;
}
- job->curl = curl_easy_init();
- if (!job->curl)
+ job->url_con = ecore_con_url_new(url);
+ if (!job->url_con)
{
fclose(job->file);
free(job);
return NULL;
}
- curl_easy_setopt(job->curl, CURLOPT_URL, url);
- curl_easy_setopt(job->curl, CURLOPT_WRITEDATA, job->file);
- curl_easy_setopt(job->curl, CURLOPT_FOLLOWLOCATION, TRUE);
-
- if (progress_cb)
- {
- curl_easy_setopt(job->curl, CURLOPT_NOPROGRESS, FALSE);
- curl_easy_setopt(job->curl, CURLOPT_PROGRESSDATA, job);
- curl_easy_setopt(job->curl, CURLOPT_PROGRESSFUNCTION, _ecore_file_download_curl_progress_func);
- }
+ ecore_con_url_fd_set(job->url_con, fileno(job->file));
+ ecore_con_url_data_set(job->url_con, data);
+
+ job->dst = strdup(dst);
- job->data = data;
job->completion_cb = completion_cb;
job->progress_cb = progress_cb;
- job->dst = strdup(dst);
ecore_list_append(_job_list, job);
- curl_multi_add_handle(curlm, job->curl);
- start = ecore_time_get();
- while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM)
- {
- /* make this 1/100th of a second to keep interactivity high. really
- * though this needs to somehow get the fd from curl and use an fd handler
- * and thus select
- */
- if ((ecore_time_get() - start) > 0.01) break;
- }
-
- /* check for completed jobs */
- while ((curlmsg = curl_multi_info_read(curlm, &n_remaining)) != NULL)
- {
- Ecore_File_Download_Job *current;
-
- if (curlmsg->msg != CURLMSG_DONE) continue;
-
- /* find the job which is done */
- ecore_list_first_goto(_job_list);
- while ((current = ecore_list_current(_job_list)))
- {
- if (curlmsg->easy_handle == current->curl)
- {
- /* We have a match -- delete the job */
- if (current == job)
- job = NULL;
- if (current->fd_handler)
- {
- FD_CLR(ecore_main_fd_handler_fd_get(current->fd_handler),
- &_current_fd_set);
- ecore_main_fd_handler_del(current->fd_handler);
- }
- ecore_list_remove(_job_list);
- curl_multi_remove_handle(curlm, current->curl);
- curl_easy_cleanup(current->curl);
- fclose(current->file);
- if (current->completion_cb)
- current->completion_cb(current->data, current->dst,
- curlmsg->data.result);
- free(current->dst);
- free(current);
- break;
- }
- ecore_list_next(_job_list);
- }
- }
-
- if (job)
- {
- 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)
- {
- FD_SET(fd, &_current_fd_set);
- job->fd_handler = ecore_main_fd_handler_add(fd, flags,
- _ecore_file_download_curl_fd_handler,
- NULL, NULL, NULL);
- }
- }
- }
- if (!job->fd_handler)
- {
- curl_easy_cleanup(job->curl);
- fclose(job->file);
- free(job);
- job = NULL;
- }
- }
+ ecore_con_url_send(job->url_con, NULL, 0, NULL);
return job;
}
-
-static int
-_ecore_file_download_curl_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
-{
- Ecore_File_Download_Job *job;
- CURLMsg *curlmsg;
- int n_remaining, still_running;
- double start = 0.0;
-
- start = ecore_time_get();
- while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM)
- {
- if ((ecore_time_get() - start) > 0.2) break;
- }
-
- /* 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 */
- ecore_list_first_goto(_job_list);
- while ((job = ecore_list_current(_job_list)))
- {
- if (curlmsg->easy_handle == job->curl)
- {
- /* We have a match -- delete the job */
- FD_CLR(ecore_main_fd_handler_fd_get(job->fd_handler),
- &_current_fd_set);
- ecore_list_remove(_job_list);
- ecore_main_fd_handler_del(job->fd_handler);
- curl_multi_remove_handle(curlm, job->curl);
- curl_easy_cleanup(job->curl);
- fclose(job->file);
- if (job->completion_cb)
- job->completion_cb(job->data, job->dst, !curlmsg->data.result);
- free(job->dst);
- free(job);
- break;
- }
- ecore_list_next(_job_list);
- }
- }
- return 1;
-}
#endif
--
1.5.4.GIT
From 5bc9b16f5fa7882120498f2db59fc47a07e454a8 Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Tue, 4 Mar 2008 18:12:01 +0100
Subject: [PATCH] Replace CURL dependency on Ecore_File by a dependency on Ecore_Con_Url.
---
configure.in | 2 +-
src/lib/ecore_file/Makefile.am | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/configure.in b/configure.in
index d10df4e..87bfea9 100644
--- a/configure.in
+++ b/configure.in
@@ -101,7 +101,6 @@ if test "x$want_curl" = "xyes"; then
PKG_CHECK_MODULES(CURL, libcurl,
[
AC_DEFINE(HAVE_CURL, 1, [ Downloading with CURL ])
- requirements_ecore_file="$requirements_ecore_file libcurl"
requirements_ecore_con="$requirements_ecore_con libcurl"
have_curl="yes"
],
@@ -736,6 +735,7 @@ if test "x$have_ecore_file" = "xyes"; then
AC_DEFINE(HAVE_POLL, 1, [ File monitoring with polling ])
have_poll="yes"
fi
+ requirements_ecore_file="$requirements_ecore_file $requirements_ecore_con"
fi
dnl ecore_desktop
diff --git a/src/lib/ecore_file/Makefile.am b/src/lib/ecore_file/Makefile.am
index f2d785a..818fd1d 100644
--- a/src/lib/ecore_file/Makefile.am
+++ b/src/lib/ecore_file/Makefile.am
@@ -22,7 +22,8 @@ ecore_file_download.c
libecore_file_la_LIBADD = \
$(top_builddir)/src/lib/ecore/libecore.la \
[EMAIL PROTECTED]@ @ecore_file_win32_lib@ @winsock_libs@
+$(top_builddir)/src/lib/ecore_con/libecore_con.la \
[EMAIL PROTECTED]@ @winsock_libs@
libecore_file_la_LDFLAGS = @create_shared_lib@ -version-info @version_info@
--
1.5.4.GIT
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel