The Ecore URL connection library is an HTTP abstraction. It makes it easy to
perform HTTP requests like POST
, GET
, …
First, we need to initialise the Ecore URL connection library and create a
Ecore_Con_Url
object.
Ecore_Con_Url *ec_url = NULL; // Initiate Ecore Url connection library. ecore_con_url_init(); // Create the Ecore_Con_Url object passing the URL that will receive the // requests as an argument. ec_url = ecore_con_url_new("http://www.enlightenment.org");
ecore_con_url_new()
will return NULL on error, so be careful to check the
returned object before using it.
The URL can be modified using ecore_con_url_url_set()
. Here we will set it
to https://docs.enlightenment.org/efl/1.15.0/index.html.
Eina_Bool ret = ecore_con_url_url_set(ec_url, "https://docs.enlightenment.org/efl/1.15.0/index.html");
The return
value will contain EINA_FALSE
if the new URL cannot be set.
To download a file, we first need to create a local file and open it with write access. We can then give the file descriptor to the Ecore URL connection library so that it can write to it.
We can then register a callback on the following events:
ECORE_CON_EVENT_URL_PROGRESS | happens when the URL object transfer has made progress. It gives the total and current data status of the transfer (upload and download). |
---|---|
ECORE_CON_EVENT_URL_COMPLETE | happens when the URL object has completed a transfer. It returns the HTTP status code of the operation. |
ECORE_CON_EVENT_URL_DATA | happens when the URL object has received data. It gives the size of the received data and a buffer containing the data. |
ECORE_CON_EVENT_URL_DATA
event will not be emitted if a file has been set
to receive the response data with ecore_con_url_fd_set()
.
Here we only register callbacks for the complete and progress events.
static Eina_Bool _url_progress_cb(void *data __UNUSED__, int type __UNUSED__, void *event_info) { Ecore_Con_Event_Url_Progress *url_progress = event_info; printf("Download progress : %d\n", (url_progress->down.now / url_progress->down.total) * 100); return EINA_TRUE; } static Eina_Bool _url_complete_cb(void *data __UNUSED__, int type __UNUSED__, void *event_info) { Ecore_Con_Event_Url_Complete *url_complete = event_info; printf("Download completed with status: %d\n", url_complete->status); return EINA_TRUE; } ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, _url_progress_cb, NULL); ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _url_complete_cb, NULL);
Once the URL is set up and the callbacks are registered, we can launch the GET request.
ecore_con_url_get(ec_url);
The status of the request will be shown in the _url_complete_cb()
and the
progress will be reported by the _url_progress_cb()
function.
The Ecore File library provides an abstraction of the Ecore URL connection library. All that we described previously can be done with one function call.
Ecore_File_Download_Job *jobret; ecore_file_download(http://www.enlightenment.org, file: _url_complete_cb, _url_progress_cb, NULL, &job_ret);
We first pass the url string we want to download, the local filename where it
needs to be written, then the complete and progress callbacks with the data to
pass to them (here NULL
). Finally, it takes a Ecore_File_Download_Job
structure that is filled by the function and which can be used with
ecore_file_download_abort()
to cancel the current download.