diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libalpm/alpm.h | 35 | ||||
-rw-r--r-- | lib/libalpm/dload.c | 19 |
2 files changed, 47 insertions, 7 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index a31f7a8a..534a8189 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -715,13 +715,42 @@ typedef void (*alpm_cb_progress)(alpm_progress_t, const char *, int, size_t, siz * Downloading */ +/* File download events. + * These events are reported by ALPM via download callback. + */ +typedef enum { + ALPM_DOWNLOAD_INIT, /* alpm initializes file download logic */ + ALPM_DOWNLOAD_PROGRESS, /* download progress reported */ + ALPM_DOWNLOAD_COMPLETED /* alpm is about to release data related to the file */ +} alpm_download_event_type_t; + +typedef struct { + int optional; /* whether this file is optional and thus the errors could be ignored */ +} alpm_download_event_init_t; + +typedef struct { + off_t downloaded; /* amount of data downloaded */ + off_t total; /* total amount need to be downloaded */ +} alpm_download_event_progress_t; + +typedef struct { + /* total bytes in file */ + off_t total; + /* download result code: + * 0 - download completed successfully + * 1 - the file is up-to-date + * negative - error code + */ + int result; +} alpm_download_event_completed_t; + /** Type of download progress callbacks. * @param filename the name of the file being downloaded - * @param xfered the number of transferred bytes - * @param total the total number of bytes to transfer + * @param event the event type + * @param data the event data of type alpm_download_event_*_t */ typedef void (*alpm_cb_download)(const char *filename, - off_t xfered, off_t total); + alpm_download_event_type_t event, void *data); typedef void (*alpm_cb_totaldl)(off_t total); diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index c65bb5e4..2f360ab8 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -88,6 +88,7 @@ static int dload_progress_cb(void *file, curl_off_t dltotal, curl_off_t dlnow, { struct dload_payload *payload = (struct dload_payload *)file; off_t current_size, total_size; + alpm_download_event_progress_t cb_data = {0}; /* avoid displaying progress bar for redirects with a body */ if(payload->respcode >= 300) { @@ -127,16 +128,20 @@ static int dload_progress_cb(void *file, curl_off_t dltotal, curl_off_t dlnow, * x {x>0}, x: download complete * x {x>0, x<y}, y {y > 0}: download progress, expected total is known */ if(!payload->cb_initialized) { - payload->handle->dlcb(payload->remote_name, 0, -1); + cb_data.downloaded = 0; + cb_data.total = -1; payload->cb_initialized = 1; } if(payload->prevprogress == current_size) { - payload->handle->dlcb(payload->remote_name, 0, 0); + cb_data.downloaded = 0; + cb_data.total = 0; } else { /* do NOT include initial_size since it wasn't part of the package's * download_size (nor included in the total download size callback) */ - payload->handle->dlcb(payload->remote_name, dlnow, dltotal); + cb_data.downloaded = dlnow; + cb_data.total = dltotal; } + payload->handle->dlcb(payload->remote_name, ALPM_DOWNLOAD_PROGRESS, &cb_data); payload->prevprogress = current_size; @@ -660,6 +665,7 @@ static int curl_multi_check_finished_download(CURLM *curlm, CURLMsg *msg, long remote_time = -1; struct stat st; char hostname[HOSTNAME_SIZE]; + alpm_download_event_completed_t cb_data = {0}; int ret = -1; curlerr = curl_easy_getinfo(curl, CURLINFO_PRIVATE, &payload); @@ -819,7 +825,9 @@ cleanup: unlink(payload->tempfile_name); } - // TODO: report that the download has been completed + cb_data.total = bytes_dl; + cb_data.result = ret; + handle->dlcb(payload->remote_name, ALPM_DOWNLOAD_COMPLETED, &cb_data); curl_multi_remove_handle(curlm, curl); curl_easy_cleanup(curl); @@ -937,6 +945,9 @@ static int curl_multi_download_internal(alpm_handle_t *handle, struct dload_payload *payload = payloads->data; if(curl_multi_add_payload(handle, curlm, payload, localpath) == 0) { + alpm_download_event_init_t cb_data = {.optional = payload->errors_ok}; + + handle->dlcb(payload->remote_name, ALPM_DOWNLOAD_INIT, &cb_data); payloads = payloads->next; // TODO: report that download has started } else { |