Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <time.h>
- #include <curl/curl.h>
- typedef void (*progressCallback)(unsigned, unsigned);
- void waitLoop(unsigned ms, unsigned interval, progressCallback callback)
- {
- unsigned i, j, s, count = ms/interval;
- for (i = 0, s = 0; i < ms; i += interval, ++s)
- {
- (*callback)(s % 4, (i * 100) / ms);
- usleep(interval * 1000);
- }
- (*callback)(0, 100);
- printf("\n");
- }
- struct cURLProgress
- {
- double lastrun;
- CURL *curl;
- progressCallback callback;
- unsigned interval;
- unsigned char step;
- };
- static int downloadProgress(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
- {
- struct cURLProgress *info;
- CURL *curl;
- double curtime;
- info = p;
- curl = info->curl;
- curtime = 0;
- curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &curtime);
- if ((curtime - info->lastrun) > ((double)info->interval / 1000.0) && dltotal > 0)
- {
- info->lastrun = curtime;
- (*info->callback)(info->step++ % 4, (dlnow * 100) / dltotal);
- }
- return 0;
- }
- size_t cURLWriteData(void *ptr, size_t size, size_t nmemb, FILE *stream)
- { return fwrite(ptr, size, nmemb, stream); }
- int downloadFile(const char *URL, const char *path, unsigned interval, progressCallback callback)
- {
- CURL *curl;
- CURLcode res;
- FILE *fp;
- struct cURLProgress progressInfo;
- res = CURLE_OK;
- if ((curl = curl_easy_init()) != NULL)
- {
- progressInfo.lastrun = 0;
- progressInfo.curl = curl;
- progressInfo.callback = callback;
- progressInfo.interval = interval;
- progressInfo.step = 0;
- fp = fopen(path, "wb");
- curl_easy_setopt(curl, CURLOPT_URL, URL);
- curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, downloadProgress);
- curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &progressInfo);
- curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cURLWriteData);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
- if ((res = curl_easy_perform(curl)) == CURLE_OK)
- (*callback)(0, 100);
- curl_easy_cleanup(curl);
- fclose(fp);
- }
- printf("\n");
- return res;
- }
- void progress(unsigned spin, unsigned step)
- {
- int i;
- const char *pgstep = "|\\-/";
- printf("\r"); for (i = 0; i < 109; ++i); printf(" "); printf("\r ["); // clear
- for (i = 0; i < step; ++i) printf("#"); // print bar
- for (; i < 100; ++i) printf(" "); // print blank space
- printf("] %c\b", step > 99 ? ' ' : pgstep[spin]);
- fflush(stdout);
- }
- int main()
- {
- int retVal;
- srand(time(NULL));
- waitLoop((rand() % 15 + 1) * 1000, 75, &progress);
- retVal = downloadFile(
- "http://mirror.digitalnova.at/archlinux/iso/2018.03.01/archlinux-2018.03.01-x86_64.iso",
- "archlinux.iso", 300, &progress);
- if (retVal != 0) fprintf(stderr, "There was an error downloading your file\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement