Progress towards implementing downloads with NetworkSession
[WebKit-https.git] / Source / WebKit2 / NetworkProcess / Downloads / DownloadManager.cpp
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "DownloadManager.h"
28
29 #include "Download.h"
30 #include "NetworkSession.h"
31 #include "PendingDownload.h"
32 #include "SessionTracker.h"
33 #include <WebCore/NotImplemented.h>
34 #include <WebCore/SessionID.h>
35 #include <wtf/StdLibExtras.h>
36
37 using namespace WebCore;
38
39 namespace WebKit {
40
41 DownloadManager::DownloadManager(Client& client)
42     : m_client(client)
43 {
44 }
45
46 void DownloadManager::startDownload(SessionID sessionID, DownloadID downloadID, const ResourceRequest& request)
47 {
48 #if USE(NETWORK_SESSION)
49     auto* networkSession = SessionTracker::networkSession(sessionID);
50     if (!networkSession)
51         return;
52     NetworkLoadParameters parameters;
53     parameters.sessionID = sessionID;
54     parameters.request = request;
55     m_pendingDownloads.add(downloadID, std::make_unique<PendingDownload>(parameters, downloadID));
56 #else
57     auto download = std::make_unique<Download>(*this, downloadID, request);
58     download->start();
59
60     ASSERT(!m_downloads.contains(downloadID));
61     m_downloads.add(downloadID, WTFMove(download));
62 #endif
63 }
64
65 #if USE(NETWORK_SESSION)
66 std::unique_ptr<PendingDownload> DownloadManager::dataTaskBecameDownloadTask(DownloadID downloadID, std::unique_ptr<Download>&& download)
67 {
68     // This is needed for downloads started with startDownload, otherwise it will return nullptr.
69     auto pendingDownload = m_pendingDownloads.take(downloadID);
70
71     m_downloads.add(downloadID, WTFMove(download));
72     return pendingDownload;
73 }
74 #else
75 void DownloadManager::convertHandleToDownload(DownloadID downloadID, ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& response)
76 {
77     auto download = std::make_unique<Download>(*this, downloadID, request);
78
79     download->startWithHandle(handle, response);
80     ASSERT(!m_downloads.contains(downloadID));
81     m_downloads.add(downloadID, WTFMove(download));
82 }
83 #endif
84
85 void DownloadManager::resumeDownload(SessionID, DownloadID downloadID, const IPC::DataReference& resumeData, const String& path, const SandboxExtension::Handle& sandboxExtensionHandle)
86 {
87 #if USE(NETWORK_SESSION)
88     notImplemented();
89 #else
90     // Download::resume() is responsible for setting the Download's resource request.
91     auto download = std::make_unique<Download>(*this, downloadID, ResourceRequest());
92
93     download->resume(resumeData, path, sandboxExtensionHandle);
94     ASSERT(!m_downloads.contains(downloadID));
95     m_downloads.add(downloadID, WTFMove(download));
96 #endif
97 }
98
99 void DownloadManager::cancelDownload(DownloadID downloadID)
100 {
101     Download* download = m_downloads.get(downloadID);
102     if (!download)
103         return;
104
105     download->cancel();
106 }
107
108 void DownloadManager::downloadFinished(Download* download)
109 {
110     ASSERT(m_downloads.contains(download->downloadID()));
111     m_downloads.remove(download->downloadID());
112 }
113
114 void DownloadManager::didCreateDownload()
115 {
116     m_client.didCreateDownload();
117 }
118
119 void DownloadManager::didDestroyDownload()
120 {
121     m_client.didDestroyDownload();
122 }
123
124 IPC::Connection* DownloadManager::downloadProxyConnection()
125 {
126     return m_client.downloadProxyConnection();
127 }
128
129 AuthenticationManager& DownloadManager::downloadsAuthenticationManager()
130 {
131     return m_client.downloadsAuthenticationManager();
132 }
133
134 } // namespace WebKit