summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/efl/DownloadManagerEfl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/efl/DownloadManagerEfl.cpp')
-rw-r--r--Source/WebKit2/UIProcess/efl/DownloadManagerEfl.cpp162
1 files changed, 162 insertions, 0 deletions
diff --git a/Source/WebKit2/UIProcess/efl/DownloadManagerEfl.cpp b/Source/WebKit2/UIProcess/efl/DownloadManagerEfl.cpp
new file mode 100644
index 000000000..869e44f3a
--- /dev/null
+++ b/Source/WebKit2/UIProcess/efl/DownloadManagerEfl.cpp
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2012 Intel Corporation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "DownloadManagerEfl.h"
+
+#include "DownloadProxy.h"
+#include "EwkViewImpl.h"
+#include "WKContext.h"
+#include "WKString.h"
+#include "ewk_context_private.h"
+#include "ewk_error_private.h"
+#include "ewk_view.h"
+
+using namespace EwkViewCallbacks;
+
+namespace WebKit {
+
+static inline DownloadManagerEfl* toDownloadManagerEfl(const void* clientInfo)
+{
+ return static_cast<DownloadManagerEfl*>(const_cast<void*>(clientInfo));
+}
+
+WKStringRef DownloadManagerEfl::decideDestinationWithSuggestedFilename(WKContextRef, WKDownloadRef wkDownload, WKStringRef filename, bool* /*allowOverwrite*/, const void* clientInfo)
+{
+ EwkDownloadJob* download = toDownloadManagerEfl(clientInfo)->downloadJob(toImpl(wkDownload)->downloadID());
+ ASSERT(download);
+
+ download->setSuggestedFileName(toImpl(filename)->string().utf8().data());
+
+ // We send the new download signal on the Ewk_View only once we have received the response
+ // and the suggested file name.
+ download->viewImpl()->smartCallback<DownloadJobRequested>().call(download);
+
+ // DownloadSoup expects the destination to be a URL.
+ String destination = ASCIILiteral("file://") + String::fromUTF8(download->destination());
+
+ return WKStringCreateWithUTF8CString(destination.utf8().data());
+}
+
+void DownloadManagerEfl::didReceiveResponse(WKContextRef, WKDownloadRef wkDownload, WKURLResponseRef wkResponse, const void* clientInfo)
+{
+ EwkDownloadJob* download = toDownloadManagerEfl(clientInfo)->downloadJob(toImpl(wkDownload)->downloadID());
+ ASSERT(download);
+ download->setResponse(EwkUrlResponse::create(wkResponse));
+}
+
+void DownloadManagerEfl::didCreateDestination(WKContextRef, WKDownloadRef wkDownload, WKStringRef /*path*/, const void* clientInfo)
+{
+ EwkDownloadJob* download = toDownloadManagerEfl(clientInfo)->downloadJob(toImpl(wkDownload)->downloadID());
+ ASSERT(download);
+
+ download->setState(EWK_DOWNLOAD_JOB_STATE_DOWNLOADING);
+}
+
+void DownloadManagerEfl::didReceiveData(WKContextRef, WKDownloadRef wkDownload, uint64_t length, const void* clientInfo)
+{
+ EwkDownloadJob* download = toDownloadManagerEfl(clientInfo)->downloadJob(toImpl(wkDownload)->downloadID());
+ ASSERT(download);
+ download->incrementReceivedData(length);
+}
+
+void DownloadManagerEfl::didFail(WKContextRef, WKDownloadRef wkDownload, WKErrorRef error, const void* clientInfo)
+{
+ DownloadManagerEfl* downloadManager = toDownloadManagerEfl(clientInfo);
+ uint64_t downloadId = toImpl(wkDownload)->downloadID();
+ EwkDownloadJob* download = downloadManager->downloadJob(downloadId);
+ ASSERT(download);
+
+ OwnPtr<Ewk_Error> ewkError = Ewk_Error::create(error);
+ download->setState(EWK_DOWNLOAD_JOB_STATE_FAILED);
+ Ewk_Download_Job_Error downloadError = { download, ewkError.get() };
+ download->viewImpl()->smartCallback<DownloadJobFailed>().call(&downloadError);
+ downloadManager->unregisterDownloadJob(downloadId);
+}
+
+void DownloadManagerEfl::didCancel(WKContextRef, WKDownloadRef wkDownload, const void* clientInfo)
+{
+ DownloadManagerEfl* downloadManager = toDownloadManagerEfl(clientInfo);
+ uint64_t downloadId = toImpl(wkDownload)->downloadID();
+ EwkDownloadJob* download = downloadManager->downloadJob(downloadId);
+ ASSERT(download);
+
+ download->setState(EWK_DOWNLOAD_JOB_STATE_CANCELLED);
+ download->viewImpl()->smartCallback<DownloadJobCancelled>().call(download);
+ downloadManager->unregisterDownloadJob(downloadId);
+}
+
+void DownloadManagerEfl::didFinish(WKContextRef, WKDownloadRef wkDownload, const void* clientInfo)
+{
+ DownloadManagerEfl* downloadManager = toDownloadManagerEfl(clientInfo);
+ uint64_t downloadId = toImpl(wkDownload)->downloadID();
+ EwkDownloadJob* download = downloadManager->downloadJob(downloadId);
+ ASSERT(download);
+
+ download->setState(EWK_DOWNLOAD_JOB_STATE_FINISHED);
+ download->viewImpl()->smartCallback<DownloadJobFinished>().call(download);
+ downloadManager->unregisterDownloadJob(downloadId);
+}
+
+DownloadManagerEfl::DownloadManagerEfl(EwkContext* context)
+ : m_context(context)
+{
+ WKContextDownloadClient wkDownloadClient;
+ memset(&wkDownloadClient, 0, sizeof(WKContextDownloadClient));
+
+ wkDownloadClient.version = kWKContextDownloadClientCurrentVersion;
+ wkDownloadClient.clientInfo = this;
+ wkDownloadClient.didCancel = didCancel;
+ wkDownloadClient.decideDestinationWithSuggestedFilename = decideDestinationWithSuggestedFilename;
+ wkDownloadClient.didCreateDestination = didCreateDestination;
+ wkDownloadClient.didReceiveResponse = didReceiveResponse;
+ wkDownloadClient.didReceiveData = didReceiveData;
+ wkDownloadClient.didFail = didFail;
+ wkDownloadClient.didFinish = didFinish;
+
+ WKContextSetDownloadClient(context->wkContext(), &wkDownloadClient);
+}
+
+void DownloadManagerEfl::registerDownload(DownloadProxy* download, EwkViewImpl* viewImpl)
+{
+ uint64_t downloadId = download->downloadID();
+ if (m_downloadJobs.contains(downloadId))
+ return;
+
+ RefPtr<EwkDownloadJob> ewkDownload = EwkDownloadJob::create(download, viewImpl);
+ m_downloadJobs.add(downloadId, ewkDownload);
+}
+
+EwkDownloadJob* DownloadManagerEfl::downloadJob(uint64_t id) const
+{
+ return m_downloadJobs.get(id).get();
+}
+
+void DownloadManagerEfl::unregisterDownloadJob(uint64_t id)
+{
+ m_downloadJobs.remove(id);
+}
+
+} // namespace WebKit