Network/WebRequest: Add progress callback

This commit is contained in:
SirLynix 2024-01-16 15:21:19 +01:00
parent 964d32b34e
commit e355144bb6
3 changed files with 24 additions and 0 deletions

View File

@ -33,6 +33,7 @@ namespace Nz
public:
using DataCallback = std::function<bool(const void* data, std::size_t length)>;
using ProgressCallback = std::function<bool(UInt64 downloaded, UInt64 totalSize)>;
using ResultCallback = std::function<void(WebRequestResult&& result)>;
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<emscripten_fetch_t> m_fetchHandle;
#endif
ProgressCallback m_progressCallback;
ResultCallback m_resultCallback;
WebRequestOptionFlags m_options;
bool m_isUserAgentSet;

View File

@ -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);

View File

@ -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<WebRequest*>(userdata);
if (!request->m_progressCallback(SafeCast<UInt64>(dlnow), SafeCast<UInt64>(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