diff --git a/include/Helpers/FileDownloader.cpp b/include/Helpers/FileDownloader.cpp index 68f3ca4..e4034d9 100644 --- a/include/Helpers/FileDownloader.cpp +++ b/include/Helpers/FileDownloader.cpp @@ -22,12 +22,14 @@ std::shared_ptr FileDownloader::download_data_from DownloadHandler h; auto downloadData = std::make_shared(); 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(clientp); + if(dltotal == 0) + downData->progress = 0.0f; + else + downData->progress = static_cast(dlnow) / static_cast(dltotal); + return 0; +} + void FileDownloader::cleanup() { if(downloadThread && downloadThread->joinable()) { shutdownThread = true; diff --git a/include/Helpers/FileDownloader.hpp b/include/Helpers/FileDownloader.hpp index 19877e5..393309e 100644 --- a/include/Helpers/FileDownloader.hpp +++ b/include/Helpers/FileDownloader.hpp @@ -20,7 +20,8 @@ class FileDownloader { FAILURE }; std::string str; - std::atomic status; + std::atomic progress = 0; + std::atomic status = DownloadData::Status::IN_PROGRESS; }; static void init(); @@ -45,11 +46,13 @@ class FileDownloader { static std::unique_ptr 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 diff --git a/include/Helpers/FileDownloaderEmscripten.cpp b/include/Helpers/FileDownloaderEmscripten.cpp index 5942343..bf8b9ea 100644 --- a/include/Helpers/FileDownloaderEmscripten.cpp +++ b/include/Helpers/FileDownloaderEmscripten.cpp @@ -1,9 +1,18 @@ #ifdef __EMSCRIPTEN__ #include "FileDownloader.hpp" #include +#include std::vector FileDownloader::currentDownloads; +void FileDownloader::download_progress(emscripten_fetch_t *fetch) { + DownloadData* downData = static_cast(fetch->userData); + if(fetch->totalBytes == 0) + downData->progress = 0.0f; + else + downData->progress = static_cast(fetch->dataOffset) / static_cast(fetch->totalBytes); +} + void FileDownloader::download_succeeded(emscripten_fetch_t *fetch) { DownloadData* downData = static_cast(fetch->userData); downData->str = std::string(fetch->data, fetch->numBytes); @@ -29,13 +38,13 @@ void FileDownloader::init() { std::shared_ptr FileDownloader::download_data_from_url(std::string_view url) { DownloadHandler& newDownload = currentDownloads.emplace_back(); newDownload.data = std::make_shared(); - 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(newDownload.data.get()); emscripten_fetch(&attr, url.data());