Skip to content

Commit cc5b398

Browse files
authored
Merge pull request #8507 from NickHardeman/feature-url-progress
ofUrlFileLoader progress function
2 parents e2282e4 + 6d25676 commit cc5b398

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

libs/openFrameworks/utils/ofURLFileLoader.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,21 @@ size_t readBody_cb(void * ptr, size_t size, size_t nmemb, void * userdata) {
299299
}
300300
return 0; /* no more data left to deliver */
301301
}
302+
int progress_cb(void* ptr, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) {
303+
auto & request = *static_cast<ofHttpRequest*>(ptr);
304+
if (request.progressCallback) {
305+
float progress = 0.0f;
306+
if (request.method == ofHttpRequest::GET && dltotal > 0) {
307+
progress = (float)dlnow / (float)dltotal;
308+
// note: we may want to support upload and download for POST
309+
} else if ((request.method == ofHttpRequest::PUT || request.method == ofHttpRequest::POST) && ultotal > 0) {
310+
progress = (float)ulnow / (float)ultotal;
311+
}
312+
313+
request.progressCallback(request, progress);
314+
}
315+
return 0;
316+
}
302317
}
303318

304319
ofHttpResponse ofURLFileLoaderImpl::handleRequest(const ofHttpRequest & request) {
@@ -412,6 +427,13 @@ ofHttpResponse ofURLFileLoaderImpl::handleRequest(const ofHttpRequest & request)
412427
// start request and receive response
413428
ofHttpResponse response(request, 0, "");
414429
CURLcode err = CURLE_OK;
430+
431+
if (request.progressCallback) {
432+
curl_easy_setopt(curl.get(), CURLOPT_XFERINFOFUNCTION, progress_cb);
433+
curl_easy_setopt(curl.get(), CURLOPT_XFERINFODATA, &request);
434+
curl_easy_setopt(curl.get(), CURLOPT_NOPROGRESS, 0L);
435+
}
436+
415437
if (request.saveTo) {
416438
ofFile saveTo(request.name, ofFile::WriteOnly, true);
417439
curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &saveTo);

libs/openFrameworks/utils/ofURLFileLoader.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class ofHttpRequest {
2323
std::string body; ///< POST body data
2424
std::string contentType; ///< POST data mime type
2525
std::function<void(const ofHttpResponse &)> done;
26+
std::function<void(const ofHttpRequest &, float)> progressCallback = nullptr; ///< pass a function for progress of download
2627
size_t timeoutSeconds = 0;
2728
bool headerOnly = false;
2829

0 commit comments

Comments
 (0)