BlobDownloadClient.cpp [plain text]
#include "config.h"
#include "BlobDownloadClient.h"
#if !USE(NETWORK_SESSION)
#include "DataReference.h"
#include "Download.h"
#include "WebErrors.h"
#include <WebCore/MIMETypeRegistry.h>
#include <WebCore/ResourceError.h>
#include <WebCore/ResourceResponse.h>
#include <WebCore/SharedBuffer.h>
namespace WebKit {
using namespace WebCore;
BlobDownloadClient::BlobDownloadClient(Download& download)
: m_download(download)
{
}
void BlobDownloadClient::didReceiveResponseAsync(ResourceHandle*, ResourceResponse&& response)
{
m_download.didReceiveResponse(WTFMove(response));
String suggestedFilename = MIMETypeRegistry::appendFileExtensionIfNecessary(m_download.suggestedName().isEmpty() ? ASCIILiteral("unknown") : m_download.suggestedName(), response.mimeType());
m_download.decideDestinationWithSuggestedFilenameAsync(suggestedFilename);
}
void BlobDownloadClient::didDecideDownloadDestination(const String& destinationPath, bool allowOverwrite)
{
ASSERT(!destinationPath.isEmpty());
if (fileExists(destinationPath)) {
if (!allowOverwrite) {
didFail(nullptr, cancelledError(m_download.request()));
return;
}
deleteFile(destinationPath);
}
m_destinationPath = destinationPath;
m_destinationFile = openFile(m_destinationPath, OpenForWrite);
m_download.didCreateDestination(m_destinationPath);
m_download.continueDidReceiveResponse();
}
void BlobDownloadClient::didReceiveBuffer(ResourceHandle*, Ref<SharedBuffer>&& buffer, int)
{
writeToFile(m_destinationFile, buffer->data(), buffer->size());
m_download.didReceiveData(buffer->size());
}
void BlobDownloadClient::didFinishLoading(ResourceHandle*)
{
closeFile(m_destinationFile);
m_download.didFinish();
}
void BlobDownloadClient::didCancel()
{
closeFile(m_destinationFile);
if (!m_destinationPath.isEmpty())
deleteFile(m_destinationPath);
m_download.didCancel(IPC::DataReference());
}
void BlobDownloadClient::didFail(ResourceHandle*, const ResourceError& error)
{
closeFile(m_destinationFile);
if (!m_destinationPath.isEmpty())
deleteFile(m_destinationPath);
m_download.didFail(error, IPC::DataReference());
}
}
#endif // !USE(NETWORK_SESSION)