forked from enlightenment/efl
ecore: Add ecore_file_download_full patch by Sangho Park <gouache95@gmail.com>
SVN revision: 57087
This commit is contained in:
parent
ad1e029125
commit
16cd7939ff
|
@ -36,3 +36,4 @@ Brett Nash <nash@nash.id.au>
|
||||||
Mike Blumenkrantz <mike@zentific.com>
|
Mike Blumenkrantz <mike@zentific.com>
|
||||||
Leif Middelschulte <leif.middelschulte@gmail.com>
|
Leif Middelschulte <leif.middelschulte@gmail.com>
|
||||||
Mike McCormack <mj.mccormack@samsung.com>
|
Mike McCormack <mj.mccormack@samsung.com>
|
||||||
|
Sangho Park <gouache95@gmail.com>
|
||||||
|
|
|
@ -34,3 +34,8 @@
|
||||||
2011-02-11 Mike Blumenkrantz
|
2011-02-11 Mike Blumenkrantz
|
||||||
|
|
||||||
* Added ecore_con_client_port_get
|
* Added ecore_con_client_port_get
|
||||||
|
|
||||||
|
2011-02-16 Sangho Park
|
||||||
|
|
||||||
|
* Added ecore_file_download_full API.
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <Eina.h>
|
||||||
#include <Ecore.h>
|
#include <Ecore.h>
|
||||||
#include <Ecore_File.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 URL "http://www.kernel.org/pub/linux/kernel/v1.0/linux-1.0.tar.gz"
|
||||||
#define DST "linux-1.0.tar.gz"
|
#define DST "linux-1.0.tar.gz"
|
||||||
|
#define DST_MIME "[x-gzip]linux-1.0.tar.gz"
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -35,6 +37,7 @@ progress_cb(void *data, const char *file,
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
double start;
|
double start;
|
||||||
|
Eina_Hash *headers;
|
||||||
|
|
||||||
eina_init();
|
eina_init();
|
||||||
ecore_init();
|
ecore_init();
|
||||||
|
@ -46,18 +49,36 @@ int main(void)
|
||||||
start = ecore_time_get();
|
start = ecore_time_get();
|
||||||
|
|
||||||
if (ecore_file_download(URL, DST, completion_cb, progress_cb, NULL, NULL))
|
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);
|
printf("Download started successfully:\n URL: %s\n DEST: %s\n", URL, DST);
|
||||||
ecore_main_loop_begin();
|
ecore_main_loop_begin();
|
||||||
printf("\nTime elapsed: %f seconds\n", ecore_time_get() - start);
|
printf("\nTime elapsed: %f seconds\n", ecore_time_get() - start);
|
||||||
printf("Downloaded %lld bytes\n", ecore_file_size(DST));
|
printf("Downloaded %lld bytes\n", ecore_file_size(DST));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("Error, can't start download\n");
|
printf("Error, can't start download\n");
|
||||||
return 1;
|
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_file_shutdown();
|
||||||
ecore_shutdown();
|
ecore_shutdown();
|
||||||
eina_shutdown();
|
eina_shutdown();
|
||||||
|
|
|
@ -166,6 +166,14 @@ EAPI Eina_Bool ecore_file_download(const char *url,
|
||||||
Ecore_File_Download_Progress_Cb progress_cb,
|
Ecore_File_Download_Progress_Cb progress_cb,
|
||||||
void *data,
|
void *data,
|
||||||
Ecore_File_Download_Job **job_ret);
|
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_all(void);
|
||||||
EAPI void ecore_file_download_abort(Ecore_File_Download_Job *job);
|
EAPI void ecore_file_download_abort(Ecore_File_Download_Job *job);
|
||||||
EAPI Eina_Bool ecore_file_download_protocol_available(const char *protocol);
|
EAPI Eina_Bool ecore_file_download_protocol_available(const char *protocol);
|
||||||
|
|
|
@ -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_Job *_ecore_file_download_curl(const char *url, const char *dst,
|
||||||
Ecore_File_Download_Completion_Cb completion_cb,
|
Ecore_File_Download_Completion_Cb completion_cb,
|
||||||
Ecore_File_Download_Progress_Cb progress_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_complete_cb(void *data, int type, void *event);
|
||||||
static Eina_Bool _ecore_file_download_url_progress_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 */
|
#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
|
* @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
|
||||||
*
|
*
|
||||||
|
@ -120,72 +207,31 @@ ecore_file_download(const char *url,
|
||||||
void *data,
|
void *data,
|
||||||
Ecore_File_Download_Job **job_ret)
|
Ecore_File_Download_Job **job_ret)
|
||||||
{
|
{
|
||||||
#ifdef BUILD_ECORE_CON
|
_ecore_file_download(url, dst, completion_cb, progress_cb, data, job_ret, NULL);
|
||||||
char *dir = ecore_file_dir_get(dst);
|
}
|
||||||
|
|
||||||
if (!ecore_file_is_dir(dir))
|
/**
|
||||||
{
|
* @brief Download the given url to the given destination with additional headers.
|
||||||
EINA_LOG_ERR("%s is not a directory", dir);
|
*
|
||||||
free(dir);
|
* @param url The complete url to download.
|
||||||
return EINA_FALSE;
|
* @param dst The local file to save the downloaded to.
|
||||||
}
|
* @param completion_cb A callback called on download complete.
|
||||||
free(dir);
|
* @param progress_cb A callback called during the download operation.
|
||||||
if (ecore_file_exists(dst))
|
* @param data User data passed to both callbacks.
|
||||||
{
|
* @param job_ret Job used to abort the download.
|
||||||
EINA_LOG_ERR("%s already exists", dst);
|
* @param headers pointer of header lists.
|
||||||
return EINA_FALSE;
|
* @return EINA_TRUE if the download start or EINA_FALSE on failure
|
||||||
}
|
*/
|
||||||
|
EAPI Eina_Bool
|
||||||
if (!strncmp(url, "file://", 7))
|
ecore_file_download_full(const char *url,
|
||||||
{
|
const char *dst,
|
||||||
/* FIXME: Maybe fork? Might take a while to copy.
|
Ecore_File_Download_Completion_Cb completion_cb,
|
||||||
* Check filesize? */
|
Ecore_File_Download_Progress_Cb progress_cb,
|
||||||
/* Just copy it */
|
void *data,
|
||||||
|
Ecore_File_Download_Job **job_ret,
|
||||||
url += 7;
|
Eina_Hash *headers)
|
||||||
/* skip hostname */
|
{
|
||||||
url = strchr(url, '/');
|
_ecore_file_download(url, dst, completion_cb, progress_cb, data, job_ret, headers);
|
||||||
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 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -278,7 +324,8 @@ Ecore_File_Download_Job *
|
||||||
_ecore_file_download_curl(const char *url, const char *dst,
|
_ecore_file_download_curl(const char *url, const char *dst,
|
||||||
Ecore_File_Download_Completion_Cb completion_cb,
|
Ecore_File_Download_Completion_Cb completion_cb,
|
||||||
Ecore_File_Download_Progress_Cb progress_cb,
|
Ecore_File_Download_Progress_Cb progress_cb,
|
||||||
void *data)
|
void *data,
|
||||||
|
Eina_Hash *headers)
|
||||||
{
|
{
|
||||||
Ecore_File_Download_Job *job;
|
Ecore_File_Download_Job *job;
|
||||||
|
|
||||||
|
@ -301,6 +348,7 @@ _ecore_file_download_curl(const char *url, const char *dst,
|
||||||
return NULL;
|
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_fd_set(job->url_con, fileno(job->file));
|
||||||
ecore_con_url_data_set(job->url_con, data);
|
ecore_con_url_data_set(job->url_con, data);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue