goto ERROR;
// Enable logging/debugging
- curl_easy_setopt(transfer->handle, CURLOPT_VERBOSE, 1);
+ curl_easy_setopt(transfer->handle, CURLOPT_VERBOSE, 0);
#ifdef ENABLE_DEBUG
curl_easy_setopt(transfer->handle, CURLOPT_DEBUGFUNCTION, debug_callback);
return 0;
}
+static int pakfire_downloader_update_single_progressbar(void* data,
+ curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) {
+ struct pakfire_downloader* downloader = (struct pakfire_downloader*)data;
+
+ // Set maximum (because this might have changed)
+ pakfire_progressbar_set_max(downloader->progressbar, dltotal);
+
+ // Update current value
+ return pakfire_progressbar_update(downloader->progressbar, dlnow);
+}
+
+static int pakfire_downloader_make_single_progressbar(
+ struct pakfire_downloader* downloader, struct pakfire_transfer* transfer) {
+ int r;
+
+ // Reset the progressbar
+ pakfire_progressbar_reset(downloader->progressbar);
+
+ // Add title
+ char* filename = pakfire_basename(transfer->url);
+ if (filename) {
+ r = pakfire_progressbar_add_string(downloader->progressbar, "%s", filename);
+ free(filename);
+ if (r)
+ return r;
+ }
+
+ // Add the bar
+ r = pakfire_progressbar_add_bar(downloader->progressbar);
+ if (r)
+ return r;
+
+ // Add percentage
+ r = pakfire_progressbar_add_percentage(downloader->progressbar);
+ if (r)
+ return r;
+
+ // Add timer
+ r = pakfire_progressbar_add_timer(downloader->progressbar);
+ if (r)
+ return r;
+
+ // Update the progressbar
+ curl_easy_setopt(transfer->handle, CURLOPT_XFERINFOFUNCTION,
+ pakfire_downloader_update_single_progressbar);
+ curl_easy_setopt(transfer->handle, CURLOPT_XFERINFODATA, downloader);
+ curl_easy_setopt(transfer->handle, CURLOPT_NOPROGRESS, 0L);
+
+ // Start the progressbar
+ r = pakfire_progressbar_start(downloader->progressbar, 0);
+ if (r)
+ return r;
+
+ return 0;
+}
+
/*
This function performs one single transfer in blocking mode.
*/
struct pakfire_downloader* downloader, struct pakfire_transfer* transfer) {
int r;
+ // Create progressbar
+ r = pakfire_downloader_make_single_progressbar(downloader, transfer);
+ if (r)
+ return r;
+
// Prepare the transfer
r = pakfire_downloader_prepare_transfer(downloader, transfer);
if (r)
// Perform the download
r = curl_easy_perform(transfer->handle);
+ // Finish the progressbar
+ pakfire_progressbar_finish(downloader->progressbar);
+
if (r == CURLE_OK)
return pakfire_transfer_done(downloader, transfer, r);
return r;
}
- // Calculate update interval
- p->update_interval = p->value_max / p->terminal.cols;
-
return pakfire_progressbar_update(p, 0);
}
}
void pakfire_progressbar_set_max(struct pakfire_progressbar* p, unsigned long value) {
+ // Do nothing if nothing has changed
+ if (p->value_max == value)
+ return;
+
// Store maximum value
p->value_max = value;
// Redraw immediately
p->value_redraw = 0;
+
+ // Calculate update interval
+ p->update_interval = p->value_max / p->terminal.cols;
}
static int pakfire_progressbar_add_widget(struct pakfire_progressbar* p,