#pragma once
#if USE(CURL)
#include "CurlRequest.h"
#include "CurlRequestClient.h"
#include "ResourceRequest.h"
#include "ResourceResponse.h"
namespace WebCore {
class CurlRequest;
class ResourceHandle;
class CurlDownloadListener {
public:
virtual void didReceiveResponse(const ResourceResponse&) { }
virtual void didReceiveDataOfLength(int) { }
virtual void didFinish() { }
virtual void didFail() { }
};
class CurlDownload : public ThreadSafeRefCounted<CurlDownload>, public CurlRequestClient {
public:
CurlDownload() = default;
~CurlDownload();
void ref() override { ThreadSafeRefCounted<CurlDownload>::ref(); }
void deref() override { ThreadSafeRefCounted<CurlDownload>::deref(); }
void init(CurlDownloadListener&, const URL&);
void init(CurlDownloadListener&, ResourceHandle*, const ResourceRequest&, const ResourceResponse&);
void setListener(CurlDownloadListener* listener) { m_listener = listener; }
void start();
bool cancel();
bool deletesFileUponFailure() const { return m_deletesFileUponFailure; }
void setDeletesFileUponFailure(bool deletesFileUponFailure) { m_deletesFileUponFailure = deletesFileUponFailure; }
void setDestination(const String& destination) { m_destination = destination; }
private:
Ref<CurlRequest> createCurlRequest(ResourceRequest&);
void curlDidSendData(CurlRequest&, unsigned long long, unsigned long long) override { }
void curlDidReceiveResponse(CurlRequest&, const CurlResponse&) override;
void curlDidReceiveBuffer(CurlRequest&, Ref<SharedBuffer>&&) override;
void curlDidComplete(CurlRequest&) override;
void curlDidFailWithError(CurlRequest&, const ResourceError&) override;
bool shouldRedirectAsGET(const ResourceRequest&, bool crossOrigin);
void willSendRequest();
CurlDownloadListener* m_listener { nullptr };
bool m_isCancelled { false };
ResourceRequest m_request;
ResourceResponse m_response;
bool m_deletesFileUponFailure { false };
String m_destination;
unsigned m_redirectCount { 0 };
RefPtr<CurlRequest> m_curlRequest;
};
}
#endif