Download progress is tracked by FileDownloader
This commit is contained in:
parent
27d334e234
commit
5c9fc917ac
3 changed files with 26 additions and 3 deletions
|
|
@ -22,12 +22,14 @@ std::shared_ptr<FileDownloader::DownloadData> FileDownloader::download_data_from
|
|||
DownloadHandler h;
|
||||
auto downloadData = std::make_shared<DownloadData>();
|
||||
h.data = downloadData;
|
||||
h.data->status = DownloadData::Status::IN_PROGRESS;
|
||||
h.eHandle = curl_easy_init();
|
||||
curl_easy_setopt(h.eHandle, CURLOPT_URL, url.data());
|
||||
curl_easy_setopt(h.eHandle, CURLOPT_NOSIGNAL, 1);
|
||||
curl_easy_setopt(h.eHandle, CURLOPT_FOLLOWLOCATION, CURLFOLLOW_ALL);
|
||||
curl_easy_setopt(h.eHandle, CURLOPT_USERAGENT, "InfiniPaint/1.0");
|
||||
curl_easy_setopt(h.eHandle, CURLOPT_NOPROGRESS, 0);
|
||||
curl_easy_setopt(h.eHandle, CURLOPT_XFERINFODATA, h.data.get());
|
||||
curl_easy_setopt(h.eHandle, CURLOPT_XFERINFOFUNCTION, download_progress_callback);
|
||||
disable_ssl_verification(h.eHandle);
|
||||
save_to_string(h.eHandle, &h.data->str);
|
||||
|
||||
|
|
@ -120,6 +122,15 @@ size_t FileDownloader::write_to_string(void* contents, size_t size, size_t nmemb
|
|||
return realsize;
|
||||
}
|
||||
|
||||
int FileDownloader::download_progress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) {
|
||||
DownloadData* downData = static_cast<DownloadData*>(clientp);
|
||||
if(dltotal == 0)
|
||||
downData->progress = 0.0f;
|
||||
else
|
||||
downData->progress = static_cast<float>(dlnow) / static_cast<float>(dltotal);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void FileDownloader::cleanup() {
|
||||
if(downloadThread && downloadThread->joinable()) {
|
||||
shutdownThread = true;
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@ class FileDownloader {
|
|||
FAILURE
|
||||
};
|
||||
std::string str;
|
||||
std::atomic<Status> status;
|
||||
std::atomic<float> progress = 0;
|
||||
std::atomic<Status> status = DownloadData::Status::IN_PROGRESS;
|
||||
};
|
||||
|
||||
static void init();
|
||||
|
|
@ -45,11 +46,13 @@ class FileDownloader {
|
|||
static std::unique_ptr<std::thread> downloadThread;
|
||||
|
||||
static void save_to_string(CURL* curl, std::string* str);
|
||||
static int download_progress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
|
||||
static void disable_ssl_verification(CURL* curl);
|
||||
static size_t write_to_string(void* contents, size_t size, size_t nmemb, void* userp);
|
||||
static void add_new_handlers_to_multi();
|
||||
static void download_thread_update();
|
||||
#else
|
||||
static void download_progress(emscripten_fetch_t *fetch);
|
||||
static void download_succeeded(emscripten_fetch_t *fetch);
|
||||
static void download_failed(emscripten_fetch_t *fetch);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,9 +1,18 @@
|
|||
#ifdef __EMSCRIPTEN__
|
||||
#include "FileDownloader.hpp"
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
|
||||
std::vector<FileDownloader::DownloadHandler> FileDownloader::currentDownloads;
|
||||
|
||||
void FileDownloader::download_progress(emscripten_fetch_t *fetch) {
|
||||
DownloadData* downData = static_cast<DownloadData*>(fetch->userData);
|
||||
if(fetch->totalBytes == 0)
|
||||
downData->progress = 0.0f;
|
||||
else
|
||||
downData->progress = static_cast<float>(fetch->dataOffset) / static_cast<float>(fetch->totalBytes);
|
||||
}
|
||||
|
||||
void FileDownloader::download_succeeded(emscripten_fetch_t *fetch) {
|
||||
DownloadData* downData = static_cast<DownloadData*>(fetch->userData);
|
||||
downData->str = std::string(fetch->data, fetch->numBytes);
|
||||
|
|
@ -29,13 +38,13 @@ void FileDownloader::init() {
|
|||
std::shared_ptr<FileDownloader::DownloadData> FileDownloader::download_data_from_url(std::string_view url) {
|
||||
DownloadHandler& newDownload = currentDownloads.emplace_back();
|
||||
newDownload.data = std::make_shared<DownloadData>();
|
||||
newDownload.data->status = DownloadData::Status::IN_PROGRESS;
|
||||
|
||||
emscripten_fetch_attr_t attr;
|
||||
emscripten_fetch_attr_init(&attr);
|
||||
std::strcpy(attr.requestMethod, "GET");
|
||||
attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY;
|
||||
attr.onsuccess = download_succeeded;
|
||||
attr.onprogress = download_progress;
|
||||
attr.onerror = download_failed;
|
||||
attr.userData = static_cast<void*>(newDownload.data.get());
|
||||
emscripten_fetch(&attr, url.data());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue