Network/WebRequest: Add progress callback
This commit is contained in:
parent
964d32b34e
commit
e355144bb6
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue