1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-03 09:09:47 +02:00
Dmitry Vedenko 1bcc98230d
Adds callback to report the download and upload progress (#1202)
* Adds callback to report the download and upload progress

* Fixes upload progress
2021-07-13 14:47:07 -04:00

120 lines
3.2 KiB
C++

/*!********************************************************************
Audacity: A Digital Audio Editor
@file IResponse.h
@brief Declare an interface for HTTP response.
Dmitry Vedenko
**********************************************************************/
#pragma once
#include <string>
#include <cstdint>
#include <vector>
#include <functional>
#include "NetworkManagerApi.h"
namespace audacity
{
namespace network_manager
{
class Request;
class HeadersList;
class CookiesList;
enum class NetworkError
{
NoError,
BadURL,
ConnectionFailed,
ConnectionRefused,
RemoteHostClosed,
HostNotFound,
Timeout,
OperationCancelled,
SSLHandshakeFailed,
TooManyRedirects,
ProxyConnectionFailed,
ProxyNotFound,
UnknownError,
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;
virtual bool isFinished () const noexcept = 0;
virtual unsigned getHTTPCode () const noexcept = 0;
virtual NetworkError getError () const noexcept = 0;
virtual std::string getErrorString () const = 0;
virtual bool headersReceived () const noexcept = 0;
virtual bool hasHeader (const std::string& headerName) const noexcept = 0;
virtual std::string getHeader (const std::string& headerName) const = 0;
virtual const HeadersList& getHeaders () const noexcept = 0;
virtual const CookiesList& getCookies () const noexcept = 0;
virtual const Request& getRequest () const noexcept = 0;
virtual std::string getURL () const = 0;
virtual void abort () noexcept = 0;
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;
// Reads at max maxBytesCount into the buffer, returns the actual count of bytes read
virtual uint64_t readData (void* buffer, uint64_t maxBytesCount) = 0;
template<typename RetVal = std::vector<uint8_t>>
RetVal readAll ()
{
RetVal result;
constexpr uint64_t bufferSize = 4 * 1024;
uint8_t buffer[bufferSize];
while (uint64_t bytesRead = readData (buffer, bufferSize))
{
using PtrType = typename RetVal::pointer;
PtrType begin = reinterpret_cast<PtrType>(buffer);
PtrType end = reinterpret_cast<PtrType>(buffer + bytesRead);
result.insert (result.end (), begin, end);
if (bytesRead < bufferSize)
break;
}
return result;
}
};
}
}