From 6d256761457d21aa68f9cd1406178d0da122b2a9 Mon Sep 17 00:00:00 2001 From: NickHardeman Date: Fri, 20 Mar 2026 11:21:28 -0400 Subject: [PATCH] urlFileLoader progress function --- libs/openFrameworks/utils/ofURLFileLoader.cpp | 22 +++++++++++++++++++ libs/openFrameworks/utils/ofURLFileLoader.h | 1 + 2 files changed, 23 insertions(+) diff --git a/libs/openFrameworks/utils/ofURLFileLoader.cpp b/libs/openFrameworks/utils/ofURLFileLoader.cpp index 81fce02e52e..c6ce82c8380 100644 --- a/libs/openFrameworks/utils/ofURLFileLoader.cpp +++ b/libs/openFrameworks/utils/ofURLFileLoader.cpp @@ -299,6 +299,21 @@ size_t readBody_cb(void * ptr, size_t size, size_t nmemb, void * userdata) { } return 0; /* no more data left to deliver */ } +int progress_cb(void* ptr, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { + auto & request = *static_cast(ptr); + if (request.progressCallback) { + float progress = 0.0f; + if (request.method == ofHttpRequest::GET && dltotal > 0) { + progress = (float)dlnow / (float)dltotal; + // note: we may want to support upload and download for POST + } else if ((request.method == ofHttpRequest::PUT || request.method == ofHttpRequest::POST) && ultotal > 0) { + progress = (float)ulnow / (float)ultotal; + } + + request.progressCallback(request, progress); + } + return 0; +} } ofHttpResponse ofURLFileLoaderImpl::handleRequest(const ofHttpRequest & request) { @@ -412,6 +427,13 @@ ofHttpResponse ofURLFileLoaderImpl::handleRequest(const ofHttpRequest & request) // start request and receive response ofHttpResponse response(request, 0, ""); CURLcode err = CURLE_OK; + + if (request.progressCallback) { + curl_easy_setopt(curl.get(), CURLOPT_XFERINFOFUNCTION, progress_cb); + curl_easy_setopt(curl.get(), CURLOPT_XFERINFODATA, &request); + curl_easy_setopt(curl.get(), CURLOPT_NOPROGRESS, 0L); + } + if (request.saveTo) { ofFile saveTo(request.name, ofFile::WriteOnly, true); curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &saveTo); diff --git a/libs/openFrameworks/utils/ofURLFileLoader.h b/libs/openFrameworks/utils/ofURLFileLoader.h index 1d73cb878cb..1e33f162cbd 100644 --- a/libs/openFrameworks/utils/ofURLFileLoader.h +++ b/libs/openFrameworks/utils/ofURLFileLoader.h @@ -23,6 +23,7 @@ class ofHttpRequest { std::string body; ///< POST body data std::string contentType; ///< POST data mime type std::function done; + std::function progressCallback = nullptr; ///< pass a function for progress of download size_t timeoutSeconds = 0; bool headerOnly = false;