- 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:
codewarrior 2006-04-07 12:27:39 +00:00 committed by codewarrior
parent bb05e978df
commit 237a7678de
2 changed files with 37 additions and 8 deletions

View File

@ -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);

View File

@ -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);