WebDownloadCurl.cpp [plain text]
#include "WebKitDLL.h"
#include "WebDownload.h"
#include "DefaultDownloadDelegate.h"
#include "MarshallingHelpers.h"
#include "WebError.h"
#include "WebKit.h"
#include "WebKitLogging.h"
#include "WebMutableURLRequest.h"
#include "WebURLAuthenticationChallenge.h"
#include "WebURLCredential.h"
#include "WebURLResponse.h"
#include <wtf/text/CString.h>
#include <io.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <WebCore/BString.h>
#include <WebCore/NotImplemented.h>
#include <WebCore/ResourceError.h>
#include <WebCore/ResourceHandle.h>
#include <WebCore/ResourceRequest.h>
#include <WebCore/ResourceResponse.h>
using namespace WebCore;
void WebDownload::init(ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& response, IWebDownloadDelegate* delegate)
{
if (handle)
handle->setDefersLoading(true);
m_request.adoptRef(WebMutableURLRequest::createInstance(request));
m_delegate = delegate;
m_download = adoptRef(new CurlDownload());
m_download->init(this, handle, request, response);
start();
}
void WebDownload::init(const URL& url, IWebDownloadDelegate* delegate)
{
m_delegate = delegate;
m_download = adoptRef(new CurlDownload());
m_download->init(this, url);
}
HRESULT WebDownload::initWithRequest(
IWebURLRequest* request,
IWebDownloadDelegate* delegate)
{
if (!request)
return E_POINTER;
COMPtr<WebMutableURLRequest> webRequest;
if (FAILED(request->QueryInterface(&webRequest)))
return E_FAIL;
BString url;
if (!SUCCEEDED(request->URL(&url)))
return E_FAIL;
ResourceRequest resourceRequest;
resourceRequest.setURL(URL(ParsedURLString, String(url)));
const HTTPHeaderMap& headerMap = webRequest->httpHeaderFields();
for (HTTPHeaderMap::const_iterator it = headerMap.begin(); it != headerMap.end(); ++it)
resourceRequest.setHTTPHeaderField(it->key, it->value);
init(nullptr, resourceRequest, ResourceResponse(), delegate);
return S_OK;
}
HRESULT WebDownload::initToResumeWithBundle(
BSTR bundlePath,
IWebDownloadDelegate* delegate)
{
notImplemented();
return E_FAIL;
}
HRESULT WebDownload::start()
{
if (!m_download)
return E_FAIL;
if (!m_download->start())
return E_FAIL;
if (m_delegate)
m_delegate->didBegin(this);
return S_OK;
}
HRESULT WebDownload::cancel()
{
if (!m_download)
return E_FAIL;
if (!m_download->cancel())
return E_FAIL;
m_download->setListener(nullptr);
m_download = nullptr;
return S_OK;
}
HRESULT WebDownload::cancelForResume()
{
notImplemented();
return E_FAIL;
}
HRESULT WebDownload::deletesFileUponFailure(
BOOL* result)
{
if (!m_download)
return E_FAIL;
*result = m_download->deletesFileUponFailure() ? TRUE : FALSE;
return S_OK;
}
HRESULT WebDownload::setDeletesFileUponFailure(
BOOL deletesFileUponFailure)
{
if (!m_download)
return E_FAIL;
m_download->setDeletesFileUponFailure(deletesFileUponFailure);
return S_OK;
}
HRESULT WebDownload::setDestination(
BSTR path,
BOOL allowOverwrite)
{
if (!m_download)
return E_FAIL;
size_t len = wcslen(path);
m_destination = String(path, len);
m_download->setDestination(m_destination);
return S_OK;
}
HRESULT WebDownload::cancelAuthenticationChallenge(
IWebURLAuthenticationChallenge*)
{
notImplemented();
return E_FAIL;
}
HRESULT WebDownload::continueWithoutCredentialForAuthenticationChallenge(
IWebURLAuthenticationChallenge* challenge)
{
notImplemented();
return E_FAIL;
}
HRESULT WebDownload::useCredential(
IWebURLCredential* credential,
IWebURLAuthenticationChallenge* challenge)
{
notImplemented();
return E_FAIL;
}
void WebDownload::didReceiveResponse()
{
COMPtr<WebDownload> protect = this;
if (m_delegate) {
ResourceResponse response = m_download->getResponse();
COMPtr<WebURLResponse> webResponse(AdoptCOM, WebURLResponse::createInstance(response));
m_delegate->didReceiveResponse(this, webResponse.get());
String suggestedFilename = response.suggestedFilename();
if (suggestedFilename.isEmpty())
suggestedFilename = pathGetFileName(response.url().string());
suggestedFilename = decodeURLEscapeSequences(suggestedFilename);
BString suggestedFilenameBSTR(suggestedFilename);
m_delegate->decideDestinationWithSuggestedFilename(this, suggestedFilenameBSTR);
}
}
void WebDownload::didReceiveDataOfLength(int size)
{
COMPtr<WebDownload> protect = this;
if (m_delegate)
m_delegate->didReceiveDataOfLength(this, size);
}
void WebDownload::didFinish()
{
COMPtr<WebDownload> protect = this;
if (m_delegate)
m_delegate->didFinish(this);
}
void WebDownload::didFail()
{
COMPtr<WebDownload> protect = this;
if (m_delegate)
m_delegate->didFailWithError(this, 0);
}