From e355144bb616d7a81b4f931dead6ab34278f97cd Mon Sep 17 00:00:00 2001 From: SirLynix Date: Tue, 16 Jan 2024 15:21:19 +0100 Subject: [PATCH] Network/WebRequest: Add progress callback --- include/Nazara/Network/WebRequest.hpp | 3 +++ include/Nazara/Network/WebRequest.inl | 5 +++++ src/Nazara/Network/WebRequest.cpp | 16 ++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/include/Nazara/Network/WebRequest.hpp b/include/Nazara/Network/WebRequest.hpp index 883629b9e..ca143a074 100644 --- a/include/Nazara/Network/WebRequest.hpp +++ b/include/Nazara/Network/WebRequest.hpp @@ -33,6 +33,7 @@ namespace Nz public: using DataCallback = std::function; + using ProgressCallback = std::function; using ResultCallback = std::function; WebRequest(WebService& owner); @@ -47,6 +48,7 @@ namespace Nz void SetJSonContent(std::string encodedJSon); void SetMaximumFileSize(UInt64 maxFileSize); inline void SetOptions(WebRequestOptionFlags options); + inline void SetProgressCallback(ProgressCallback callback); inline void SetResultCallback(ResultCallback callback); void SetServiceName(std::string serviceName); void SetURL(const std::string& url); @@ -87,6 +89,7 @@ namespace Nz HighPrecisionClock m_clock; MovablePtr m_fetchHandle; #endif + ProgressCallback m_progressCallback; ResultCallback m_resultCallback; WebRequestOptionFlags m_options; bool m_isUserAgentSet; diff --git a/include/Nazara/Network/WebRequest.inl b/include/Nazara/Network/WebRequest.inl index 868d16a30..9e9da9c75 100644 --- a/include/Nazara/Network/WebRequest.inl +++ b/include/Nazara/Network/WebRequest.inl @@ -16,6 +16,11 @@ namespace Nz m_options = options; } + inline void WebRequest::SetProgressCallback(ProgressCallback callback) + { + m_progressCallback = std::move(callback); + } + inline void WebRequest::SetResultCallback(ResultCallback callback) { m_resultCallback = std::move(callback); diff --git a/src/Nazara/Network/WebRequest.cpp b/src/Nazara/Network/WebRequest.cpp index 87106452c..b47320bf1 100644 --- a/src/Nazara/Network/WebRequest.cpp +++ b/src/Nazara/Network/WebRequest.cpp @@ -177,6 +177,22 @@ namespace Nz if (!m_isUserAgentSet) SetHeader("User-Agent", m_webService.GetUserAgent()); + if (m_progressCallback) + { + curl_xferinfo_callback progressCallback = [](void* userdata, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) -> int + { + WebRequest* request = static_cast(userdata); + if (!request->m_progressCallback(SafeCast(dlnow), SafeCast(dltotal))) + return -1; + + return 0; //< don't return CURL_PROGRESSFUNC_CONTINUE as it would output progress on stdout + }; + + libcurl.easy_setopt(m_curlHandle, CURLOPT_NOPROGRESS, long(0)); + libcurl.easy_setopt(m_curlHandle, CURLOPT_XFERINFODATA, this); + libcurl.easy_setopt(m_curlHandle, CURLOPT_XFERINFOFUNCTION, progressCallback); + } + return m_curlHandle; } #else