forked from enlightenment/efl
- new addition for ecore_file_download. now we have a progress_cb from curl so we know how much of the file we've downloaded.
SVN revision: 21928
This commit is contained in:
parent
bb05e978df
commit
237a7678de
|
@ -95,6 +95,12 @@ extern "C" {
|
||||||
void (*completion_cb)(void *data,
|
void (*completion_cb)(void *data,
|
||||||
const char *file,
|
const char *file,
|
||||||
int status),
|
int status),
|
||||||
|
int (*progress_cb)(void *data,
|
||||||
|
const char *file,
|
||||||
|
long int dltotal,
|
||||||
|
long int dlnow,
|
||||||
|
long int ultotal,
|
||||||
|
long int ulnow),
|
||||||
void *data);
|
void *data);
|
||||||
EAPI int ecore_file_download_protocol_available(const char *protocol);
|
EAPI int ecore_file_download_protocol_available(const char *protocol);
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ struct _Ecore_File_Download_Job
|
||||||
Ecore_Fd_Handler *fd_handler;
|
Ecore_Fd_Handler *fd_handler;
|
||||||
CURL *curl;
|
CURL *curl;
|
||||||
void (*completion_cb)(void *data, const char *file, int status);
|
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;
|
void *data;
|
||||||
FILE *file;
|
FILE *file;
|
||||||
char *dst;
|
char *dst;
|
||||||
|
@ -22,6 +23,7 @@ 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,
|
||||||
void (*completion_cb)(void *data, const char *file, int status),
|
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);
|
void *data);
|
||||||
static int _ecore_file_download_curl_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
|
static int _ecore_file_download_curl_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
|
||||||
|
|
||||||
|
@ -83,6 +85,7 @@ ecore_file_download_shutdown(void)
|
||||||
EAPI int
|
EAPI int
|
||||||
ecore_file_download(const char *url, const char *dst,
|
ecore_file_download(const char *url, const char *dst,
|
||||||
void (*completion_cb)(void *data, const char *file, int status),
|
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)
|
void *data)
|
||||||
{
|
{
|
||||||
if (!ecore_file_is_dir(ecore_file_get_dir((char *)dst))) return 0;
|
if (!ecore_file_is_dir(ecore_file_get_dir((char *)dst))) return 0;
|
||||||
|
@ -107,7 +110,7 @@ ecore_file_download(const char *url, const char *dst,
|
||||||
/* download */
|
/* download */
|
||||||
Ecore_File_Download_Job *job;
|
Ecore_File_Download_Job *job;
|
||||||
|
|
||||||
job = _ecore_file_download_curl(url, dst, completion_cb, data);
|
job = _ecore_file_download_curl(url, dst, completion_cb, progress_cb, data);
|
||||||
if (job)
|
if (job)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
|
@ -133,16 +136,27 @@ ecore_file_download_protocol_available(const char *protocol)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_CURL
|
#ifdef HAVE_CURL
|
||||||
/*
|
/* this reports the downloads progress. if we return 0, then download
|
||||||
* FIXME: Use
|
* continues, if we return anything else, then the download stops */
|
||||||
* CURLOPT_PROGRESSFUNCTION and CURLOPT_PROGRESSDATA to
|
int _ecore_file_download_curl_progress_func(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
|
||||||
* get reports on progress.
|
{
|
||||||
* And maybe other nifty functions...
|
Ecore_File_Download_Job *job;
|
||||||
*/
|
|
||||||
|
job = clientp;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
Ecore_File_Download_Job *
|
Ecore_File_Download_Job *
|
||||||
_ecore_file_download_curl(const char *url, const char *dst,
|
_ecore_file_download_curl(const char *url, const char *dst,
|
||||||
void (*completion_cb)(void *data, const char *file,
|
void (*completion_cb)(void *data, const char *file,
|
||||||
int status),
|
int status),
|
||||||
|
int (*progress_cb)(void *data, const char *file,
|
||||||
|
long int dltotal, long int dlnow,
|
||||||
|
long int ultotal,
|
||||||
|
long int ulnow),
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
CURLMsg *curlmsg;
|
CURLMsg *curlmsg;
|
||||||
|
@ -169,11 +183,20 @@ _ecore_file_download_curl(const char *url, const char *dst,
|
||||||
free(job);
|
free(job);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
curl_easy_setopt(job->curl, CURLOPT_URL, url);
|
curl_easy_setopt(job->curl, CURLOPT_URL, url);
|
||||||
curl_easy_setopt(job->curl, CURLOPT_WRITEDATA, job->file);
|
curl_easy_setopt(job->curl, CURLOPT_WRITEDATA, job->file);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
job->data = data;
|
job->data = data;
|
||||||
job->completion_cb = completion_cb;
|
job->completion_cb = completion_cb;
|
||||||
|
job->progress_cb = progress_cb;
|
||||||
job->dst = strdup(dst);
|
job->dst = strdup(dst);
|
||||||
ecore_list_append(_job_list, job);
|
ecore_list_append(_job_list, job);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue