ecore: Add ecore_file_download_full patch by Sangho Park <gouache95@gmail.com>

SVN revision: 57087
This commit is contained in:
Cedric BAIL 2011-02-16 12:44:34 +00:00
parent ad1e029125
commit 16cd7939ff
5 changed files with 160 additions and 77 deletions

View File

@ -36,3 +36,4 @@ Brett Nash <nash@nash.id.au>
Mike Blumenkrantz <mike@zentific.com>
Leif Middelschulte <leif.middelschulte@gmail.com>
Mike McCormack <mj.mccormack@samsung.com>
Sangho Park <gouache95@gmail.com>

View File

@ -34,3 +34,8 @@
2011-02-11 Mike Blumenkrantz
* Added ecore_con_client_port_get
2011-02-16 Sangho Park
* Added ecore_file_download_full API.

View File

@ -1,4 +1,5 @@
#include <stdio.h>
#include <Eina.h>
#include <Ecore.h>
#include <Ecore_File.h>
@ -13,6 +14,7 @@
#define URL "http://www.kernel.org/pub/linux/kernel/v1.0/linux-1.0.tar.gz"
#define DST "linux-1.0.tar.gz"
#define DST_MIME "[x-gzip]linux-1.0.tar.gz"
void
@ -35,6 +37,7 @@ progress_cb(void *data, const char *file,
int main(void)
{
double start;
Eina_Hash *headers;
eina_init();
ecore_init();
@ -46,18 +49,36 @@ int main(void)
start = ecore_time_get();
if (ecore_file_download(URL, DST, completion_cb, progress_cb, NULL, NULL))
{
printf("Download started successfully:\n URL: %s\n DEST: %s\n", URL, DST);
ecore_main_loop_begin();
printf("\nTime elapsed: %f seconds\n", ecore_time_get() - start);
printf("Downloaded %lld bytes\n", ecore_file_size(DST));
}
{
printf("Download started successfully:\n URL: %s\n DEST: %s\n", URL, DST);
ecore_main_loop_begin();
printf("\nTime elapsed: %f seconds\n", ecore_time_get() - start);
printf("Downloaded %lld bytes\n", ecore_file_size(DST));
}
else
{
printf("Error, can't start download\n");
return 1;
}
{
printf("Error, can't start download\n");
goto done;
}
headers = eina_hash_string_small_new(NULL);
eina_hash_add(headers, "Content-type", "application/x-gzip");
if (ecore_file_download_full(URL, DST_MIME, completion_cb, progress_cb, NULL, NULL, headers))
{
printf("Download started successfully:\n URL: %s\n DEST: %s\n", URL, DST_MIME);
ecore_main_loop_begin();
printf("\nTime elapsed: %f seconds\n", ecore_time_get() - start);
printf("Downloaded %lld bytes\n", ecore_file_size(DST));
}
else
{
printf("Error, can't start download\n");
goto done;
}
done:
if (headers) eina_hash_free(headers);
ecore_file_shutdown();
ecore_shutdown();
eina_shutdown();

View File

@ -166,6 +166,14 @@ EAPI Eina_Bool ecore_file_download(const char *url,
Ecore_File_Download_Progress_Cb progress_cb,
void *data,
Ecore_File_Download_Job **job_ret);
EAPI Eina_Bool ecore_file_download_full(const char *url,
const char *dst,
Ecore_File_Download_Completion_Cb completion_cb,
Ecore_File_Download_Progress_Cb progress_cb,
void *data,
Ecore_File_Download_Job **job_ret,
Eina_Hash *headers);
EAPI void ecore_file_download_abort_all(void);
EAPI void ecore_file_download_abort(Ecore_File_Download_Job *job);
EAPI Eina_Bool ecore_file_download_protocol_available(const char *protocol);

View File

@ -32,7 +32,8 @@ struct _Ecore_File_Download_Job
Ecore_File_Download_Job *_ecore_file_download_curl(const char *url, const char *dst,
Ecore_File_Download_Completion_Cb completion_cb,
Ecore_File_Download_Progress_Cb progress_cb,
void *data);
void *data,
Eina_Hash *headers);
static Eina_Bool _ecore_file_download_url_complete_cb(void *data, int type, void *event);
static Eina_Bool _ecore_file_download_url_progress_cb(void *data, int type, void *event);
@ -77,6 +78,92 @@ ecore_file_download_shutdown(void)
#endif /* BUILD_ECORE_CON */
}
static Eina_Bool
_ecore_file_download_headers_foreach_cb(const Eina_Hash *hash __UNUSED__, const void *key, void *data, void *fdata)
{
Ecore_File_Download_Job *job = fdata;
ecore_con_url_additional_header_add(job->url_con, key, data);
return EINA_TRUE;
}
static Eina_Bool
_ecore_file_download(const char *url,
const char *dst,
Ecore_File_Download_Completion_Cb completion_cb,
Ecore_File_Download_Progress_Cb progress_cb,
void *data,
Ecore_File_Download_Job **job_ret,
Eina_Hash *headers)
{
#ifdef BUILD_ECORE_CON
char *dir = ecore_file_dir_get(dst);
if (!ecore_file_is_dir(dir))
{
EINA_LOG_ERR("%s is not a directory", dir);
free(dir);
return EINA_FALSE;
}
free(dir);
if (ecore_file_exists(dst))
{
EINA_LOG_ERR("%s already exists", dst);
return EINA_FALSE;
}
if (!strncmp(url, "file://", 7))
{
/* FIXME: Maybe fork? Might take a while to copy.
* Check filesize? */
/* Just copy it */
url += 7;
/* skip hostname */
url = strchr(url, '/');
return ecore_file_cp(url, dst);
}
# ifdef HAVE_CURL
else if ((!strncmp(url, "http://", 7)) || (!strncmp(url, "https://", 8)) ||
(!strncmp(url, "ftp://", 6)))
{
/* download */
Ecore_File_Download_Job *job;
job = _ecore_file_download_curl(url, dst, completion_cb, progress_cb, data, headers);
if(job_ret) *job_ret = job;
if(job)
return EINA_TRUE;
else
{
EINA_LOG_ERR("no job returned\n");
return EINA_FALSE;
}
return job ? EINA_TRUE : EINA_FALSE;
}
# else
else if ((!strncmp(url, "http://", 7)) || (!strncmp(url, "https://", 8)) ||
(!strncmp(url, "ftp://", 6)))
{
(void)completion_cb;
(void)progress_cb;
(void)data;
(void)job_ret;
return EINA_FALSE;
}
# endif
else
{
return EINA_FALSE;
}
#else
completion_cb = NULL;
progress_cb = NULL;
data = NULL;
return EINA_FALSE;
#endif /* BUILD_ECORE_CON */
}
/**
* @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
*
@ -120,72 +207,31 @@ ecore_file_download(const char *url,
void *data,
Ecore_File_Download_Job **job_ret)
{
#ifdef BUILD_ECORE_CON
char *dir = ecore_file_dir_get(dst);
_ecore_file_download(url, dst, completion_cb, progress_cb, data, job_ret, NULL);
}
if (!ecore_file_is_dir(dir))
{
EINA_LOG_ERR("%s is not a directory", dir);
free(dir);
return EINA_FALSE;
}
free(dir);
if (ecore_file_exists(dst))
{
EINA_LOG_ERR("%s already exists", dst);
return EINA_FALSE;
}
if (!strncmp(url, "file://", 7))
{
/* FIXME: Maybe fork? Might take a while to copy.
* Check filesize? */
/* Just copy it */
url += 7;
/* skip hostname */
url = strchr(url, '/');
return ecore_file_cp(url, dst);
}
# ifdef HAVE_CURL
else if ((!strncmp(url, "http://", 7)) || (!strncmp(url, "https://", 8)) ||
(!strncmp(url, "ftp://", 6)))
{
/* download */
Ecore_File_Download_Job *job;
job = _ecore_file_download_curl(url, dst, completion_cb, progress_cb, data);
if(job_ret) *job_ret = job;
if(job)
return EINA_TRUE;
else
{
EINA_LOG_ERR("no job returned\n");
return EINA_FALSE;
}
return job ? EINA_TRUE : EINA_FALSE;
}
# else
else if ((!strncmp(url, "http://", 7)) || (!strncmp(url, "https://", 8)) ||
(!strncmp(url, "ftp://", 6)))
{
(void)completion_cb;
(void)progress_cb;
(void)data;
(void)job_ret;
return EINA_FALSE;
}
# endif
else
{
return EINA_FALSE;
}
#else
completion_cb = NULL;
progress_cb = NULL;
data = NULL;
return EINA_FALSE;
#endif /* BUILD_ECORE_CON */
/**
* @brief Download the given url to the given destination with additional headers.
*
* @param url The complete url to download.
* @param dst The local file to save the downloaded to.
* @param completion_cb A callback called on download complete.
* @param progress_cb A callback called during the download operation.
* @param data User data passed to both callbacks.
* @param job_ret Job used to abort the download.
* @param headers pointer of header lists.
* @return EINA_TRUE if the download start or EINA_FALSE on failure
*/
EAPI Eina_Bool
ecore_file_download_full(const char *url,
const char *dst,
Ecore_File_Download_Completion_Cb completion_cb,
Ecore_File_Download_Progress_Cb progress_cb,
void *data,
Ecore_File_Download_Job **job_ret,
Eina_Hash *headers)
{
_ecore_file_download(url, dst, completion_cb, progress_cb, data, job_ret, headers);
}
/**
@ -278,7 +324,8 @@ Ecore_File_Download_Job *
_ecore_file_download_curl(const char *url, const char *dst,
Ecore_File_Download_Completion_Cb completion_cb,
Ecore_File_Download_Progress_Cb progress_cb,
void *data)
void *data,
Eina_Hash *headers)
{
Ecore_File_Download_Job *job;
@ -301,6 +348,7 @@ _ecore_file_download_curl(const char *url, const char *dst,
return NULL;
}
if (headers) eina_hash_foreach(headers, _ecore_file_download_headers_foreach_cb, job);
ecore_con_url_fd_set(job->url_con, fileno(job->file));
ecore_con_url_data_set(job->url_con, data);