mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-19 09:30:06 +02:00
Adds callback to report the download and upload progress (#1202)
* Adds callback to report the download and upload progress * Fixes upload progress
This commit is contained in:
parent
06eae90100
commit
1bcc98230d
@ -44,10 +44,15 @@ enum class NetworkError
|
||||
HTTPError
|
||||
};
|
||||
|
||||
|
||||
//! Interface, that provides access to the data from the HTTP response
|
||||
class NETWORK_MANAGER_API IResponse
|
||||
{
|
||||
public:
|
||||
using RequestCallback = std::function<void (IResponse*)>;
|
||||
//! Called when download or upload progress changes. Expected can be zero when
|
||||
//! transfer encoding does not allow to calculate the size
|
||||
using ProgressCallback = std::function<void(int64_t current, int64_t expected)>;
|
||||
|
||||
virtual ~IResponse () = default;
|
||||
|
||||
@ -74,6 +79,11 @@ public:
|
||||
virtual void setOnDataReceivedCallback (RequestCallback callback) = 0;
|
||||
virtual void setRequestFinishedCallback (RequestCallback callback) = 0;
|
||||
|
||||
//! Set the download progress callback
|
||||
virtual void setDownloadProgressCallback(ProgressCallback callback) = 0;
|
||||
//! Set the upload progress callback
|
||||
virtual void setUploadProgressCallback(ProgressCallback callback) = 0;
|
||||
|
||||
// The total bytes available to read by readData
|
||||
virtual uint64_t getBytesAvailable () const noexcept = 0;
|
||||
|
||||
|
@ -203,6 +203,18 @@ void CurlResponse::setRequestFinishedCallback (RequestCallback callback)
|
||||
mRequestFinishedCallback (this);
|
||||
}
|
||||
|
||||
void CurlResponse::setDownloadProgressCallback(ProgressCallback callback)
|
||||
{
|
||||
std::lock_guard<std::mutex> callbackLock(mCallbackMutex);
|
||||
mDownloadProgressCallback = std::move(callback);
|
||||
}
|
||||
|
||||
void CurlResponse::setUploadProgressCallback(ProgressCallback callback)
|
||||
{
|
||||
std::lock_guard<std::mutex> callbackLock(mCallbackMutex);
|
||||
mUploadProgressCallback = std::move(callback);
|
||||
}
|
||||
|
||||
uint64_t CurlResponse::getBytesAvailable () const noexcept
|
||||
{
|
||||
std::lock_guard<std::mutex> lock (mDataBufferMutex);
|
||||
@ -241,9 +253,14 @@ void CurlResponse::perform (const void* ptr, size_t size)
|
||||
handle.setOption (CURLOPT_HEADERFUNCTION, HeaderCallback);
|
||||
handle.setOption (CURLOPT_HEADERDATA, this);
|
||||
|
||||
handle.setOption (CURLOPT_XFERINFOFUNCTION, CurlProgressCallback);
|
||||
handle.setOption (CURLOPT_XFERINFODATA, this);
|
||||
|
||||
handle.setOption (CURLOPT_FOLLOWLOCATION, mRequest.getMaxRedirects () == 0 ? 0 : 1);
|
||||
handle.setOption (CURLOPT_MAXREDIRS, mRequest.getMaxRedirects ());
|
||||
|
||||
handle.setOption (CURLOPT_NOPROGRESS, 0L);
|
||||
|
||||
handle.setOption (CURLOPT_CONNECTTIMEOUT_MS,
|
||||
std::chrono::duration_cast<std::chrono::milliseconds> (mRequest.getTimeout()).count ()
|
||||
);
|
||||
@ -301,6 +318,8 @@ void CurlResponse::perform (const void* ptr, size_t size)
|
||||
|
||||
mRequestFinishedCallback = {};
|
||||
mOnDataReceivedCallback = {};
|
||||
mDownloadProgressCallback = {};
|
||||
mUploadProgressCallback = {};
|
||||
}
|
||||
|
||||
|
||||
@ -378,5 +397,20 @@ size_t CurlResponse::HeaderCallback (const char* buffer, size_t size, size_t nit
|
||||
return size;
|
||||
}
|
||||
|
||||
int CurlResponse::CurlProgressCallback(
|
||||
CurlResponse* clientp, curl_off_t dltotal, curl_off_t dlnow,
|
||||
curl_off_t ultotal, curl_off_t ulnow) noexcept
|
||||
{
|
||||
std::lock_guard<std::mutex> callbackLock(clientp->mCallbackMutex);
|
||||
|
||||
if (dltotal > 0 && clientp->mDownloadProgressCallback)
|
||||
clientp->mDownloadProgressCallback(dlnow, dltotal);
|
||||
|
||||
if (ultotal > 0 && clientp->mUploadProgressCallback)
|
||||
clientp->mUploadProgressCallback(ulnow, ultotal);
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -56,6 +56,11 @@ public:
|
||||
|
||||
void setRequestFinishedCallback (RequestCallback callback) override;
|
||||
|
||||
//! Set the download progress callback
|
||||
virtual void setDownloadProgressCallback(ProgressCallback callback) override;
|
||||
//! Set the upload progress callback
|
||||
virtual void setUploadProgressCallback(ProgressCallback callback) override;
|
||||
|
||||
uint64_t getBytesAvailable () const noexcept override;
|
||||
uint64_t readData (void* buffer, uint64_t maxBytesCount) override;
|
||||
|
||||
@ -71,6 +76,8 @@ private:
|
||||
mutable std::mutex mCallbackMutex;
|
||||
RequestCallback mOnDataReceivedCallback;
|
||||
RequestCallback mRequestFinishedCallback;
|
||||
ProgressCallback mDownloadProgressCallback;
|
||||
ProgressCallback mUploadProgressCallback;
|
||||
|
||||
mutable std::mutex mHeadersMutex;
|
||||
HeadersList mResponseHeaders;
|
||||
@ -92,6 +99,10 @@ private:
|
||||
|
||||
static size_t WriteCallback (const uint8_t* ptr, size_t size, size_t nmemb, CurlResponse* userdata) noexcept;
|
||||
static size_t HeaderCallback (const char* buffer, size_t size, size_t nitems, CurlResponse* userdata) noexcept;
|
||||
static int CurlProgressCallback(
|
||||
CurlResponse* clientp, curl_off_t dltotal, curl_off_t dlnow,
|
||||
curl_off_t ultotal,
|
||||
curl_off_t ulnow) noexcept;
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user