1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/*
2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2008 Collabora Ltd.
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2009 Gustavo Noronha Silva <gns@gnome.org>
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * This library is free software; you can redistribute it and/or
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modify it under the terms of the GNU Library General Public
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * License as published by the Free Software Foundation; either
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * version 2 of the License, or (at your option) any later version.
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * This library is distributed in the hope that it will be useful,
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * but WITHOUT ANY WARRANTY; without even the implied warranty of
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Library General Public License for more details.
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * You should have received a copy of the GNU Library General Public License
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * along with this library; see the file COPYING.LIB.  If not, write to
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Boston, MA 02110-1301, USA.
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "config.h"
22cad810f21b803229eb11403f9209855525a25d57Steve Block#include "webkitdownload.h"
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
24d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "GRefPtr.h"
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "Noncopyable.h"
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "NotImplemented.h"
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "ResourceHandleClient.h"
28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "ResourceHandleInternal.h"
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "ResourceRequest.h"
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "ResourceResponse.h"
31f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "webkitdownloadprivate.h"
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "webkitenumtypes.h"
33cad810f21b803229eb11403f9209855525a25d57Steve Block#include "webkitglobals.h"
34cad810f21b803229eb11403f9209855525a25d57Steve Block#include "webkitglobalsprivate.h"
35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "webkitmarshal.h"
36f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "webkitnetworkrequestprivate.h"
37cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "webkitnetworkresponse.h"
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "webkitnetworkresponseprivate.h"
39cad810f21b803229eb11403f9209855525a25d57Steve Block#include <glib/gi18n-lib.h>
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <glib/gstdio.h>
41cad810f21b803229eb11403f9209855525a25d57Steve Block#include <wtf/text/CString.h>
42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifdef ERROR
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#undef ERROR
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing namespace WebKit;
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing namespace WebCore;
49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/**
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * SECTION:webkitdownload
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * @short_description: Object used to communicate with the application when downloading.
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * #WebKitDownload carries information about a download request,
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * including a #WebKitNetworkRequest object. The application may use
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * this object to control the download process, or to simply figure
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * out what is to be downloaded, and do it itself.
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
60ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass DownloadClient : public ResourceHandleClient {
61ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_NONCOPYABLE(DownloadClient);
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    public:
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        DownloadClient(WebKitDownload*);
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        virtual void didReceiveData(ResourceHandle*, const char*, int, int);
6768513a70bcd92384395513322f1b801e7bf9c729Steve Block        virtual void didFinishLoading(ResourceHandle*, double);
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        virtual void didFail(ResourceHandle*, const ResourceError&);
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        virtual void wasBlocked(ResourceHandle*);
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        virtual void cannotShowURL(ResourceHandle*);
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    private:
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitDownload* m_download;
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark};
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstruct _WebKitDownloadPrivate {
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gchar* destinationURI;
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gchar* suggestedFilename;
79692e5dbf12901edacf14812a6fae25462920af42Steve Block    guint64 currentSize;
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GTimer* timer;
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadStatus status;
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GFileOutputStream* outputStream;
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DownloadClient* downloadClient;
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitNetworkRequest* networkRequest;
85cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebKitNetworkResponse* networkResponse;
86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RefPtr<ResourceHandle> resourceHandle;
87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark};
88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkenum {
90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Normal signals.
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ERROR,
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    LAST_SIGNAL
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark};
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic guint webkit_download_signals[LAST_SIGNAL] = { 0 };
96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkenum {
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PROP_0,
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PROP_NETWORK_REQUEST,
101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PROP_DESTINATION_URI,
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PROP_SUGGESTED_FILENAME,
103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PROP_PROGRESS,
104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PROP_STATUS,
105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PROP_CURRENT_SIZE,
106cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    PROP_TOTAL_SIZE,
107cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    PROP_NETWORK_RESPONSE
108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark};
109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
110563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkG_DEFINE_TYPE(WebKitDownload, webkit_download, G_TYPE_OBJECT);
111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void webkit_download_set_response(WebKitDownload* download, const ResourceResponse& response);
114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_set_status(WebKitDownload* download, WebKitDownloadStatus status);
115563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
116563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_dispose(GObject* object)
117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownload* download = WEBKIT_DOWNLOAD(object);
119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->outputStream) {
122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(priv->outputStream);
123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->outputStream = NULL;
124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->networkRequest) {
127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(priv->networkRequest);
128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->networkRequest = NULL;
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
131cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (priv->networkResponse) {
132cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        g_object_unref(priv->networkResponse);
133cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        priv->networkResponse = NULL;
134cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
135cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    G_OBJECT_CLASS(webkit_download_parent_class)->dispose(object);
137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
138563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_finalize(GObject* object)
140563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownload* download = WEBKIT_DOWNLOAD(object);
142563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
143563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
144563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // We don't call webkit_download_cancel() because we don't want to emit
145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // signals when finalizing an object.
146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->resourceHandle) {
147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (priv->status == WEBKIT_DOWNLOAD_STATUS_STARTED) {
148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            priv->resourceHandle->setClient(0);
149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            priv->resourceHandle->cancel();
150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->resourceHandle.release();
152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    delete priv->downloadClient;
155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // The download object may never have _start called on it, so we
157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // need to make sure timer is non-NULL.
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (priv->timer) {
159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_timer_destroy(priv->timer);
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        priv->timer = NULL;
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
162563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
163563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_free(priv->destinationURI);
164563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_free(priv->suggestedFilename);
165563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
166563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    G_OBJECT_CLASS(webkit_download_parent_class)->finalize(object);
167563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
168563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
169563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
170563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownload* download = WEBKIT_DOWNLOAD(object);
172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    switch(prop_id) {
174563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_NETWORK_REQUEST:
175563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_value_set_object(value, webkit_download_get_network_request(download));
176563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
177cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    case PROP_NETWORK_RESPONSE:
178cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        g_value_set_object(value, webkit_download_get_network_response(download));
179cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        break;
180563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_DESTINATION_URI:
181563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_value_set_string(value, webkit_download_get_destination_uri(download));
182563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
183563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_SUGGESTED_FILENAME:
184563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_value_set_string(value, webkit_download_get_suggested_filename(download));
185563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
186563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_PROGRESS:
187563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_value_set_double(value, webkit_download_get_progress(download));
188563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
189563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_STATUS:
190563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_value_set_enum(value, webkit_download_get_status(download));
191563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
192563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_CURRENT_SIZE:
193563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_value_set_uint64(value, webkit_download_get_current_size(download));
194563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
195563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_TOTAL_SIZE:
196563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_value_set_uint64(value, webkit_download_get_total_size(download));
197563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
198563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    default:
199563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
200563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
201563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
202563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
203563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec *pspec)
204563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
205563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownload* download = WEBKIT_DOWNLOAD(object);
206563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
208563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    switch(prop_id) {
209563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_NETWORK_REQUEST:
210563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->networkRequest = WEBKIT_NETWORK_REQUEST(g_value_dup_object(value));
211563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
212cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    case PROP_NETWORK_RESPONSE:
213cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        priv->networkResponse = WEBKIT_NETWORK_RESPONSE(g_value_dup_object(value));
214cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        break;
215563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_DESTINATION_URI:
216563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        webkit_download_set_destination_uri(download, g_value_get_string(value));
217563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
218563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    case PROP_STATUS:
219563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        webkit_download_set_status(download, static_cast<WebKitDownloadStatus>(g_value_get_enum(value)));
220563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        break;
221563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    default:
222563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
223563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
224563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_class_init(WebKitDownloadClass* downloadClass)
227563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
228563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GObjectClass* objectClass = G_OBJECT_CLASS(downloadClass);
229563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    objectClass->dispose = webkit_download_dispose;
230563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    objectClass->finalize = webkit_download_finalize;
231563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    objectClass->get_property = webkit_download_get_property;
232563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    objectClass->set_property = webkit_download_set_property;
233563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
234cad810f21b803229eb11403f9209855525a25d57Steve Block    webkitInit();
2350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
236563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /**
237563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * WebKitDownload::error:
238563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * @download: the object on which the signal is emitted
239692e5dbf12901edacf14812a6fae25462920af42Steve Block     * @error_code: the corresponding error code
240692e5dbf12901edacf14812a6fae25462920af42Steve Block     * @error_detail: detailed error code for the error, see
241692e5dbf12901edacf14812a6fae25462920af42Steve Block     * #WebKitDownloadError
242692e5dbf12901edacf14812a6fae25462920af42Steve Block     * @reason: a string describing the error
243563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
244692e5dbf12901edacf14812a6fae25462920af42Steve Block     * Emitted when @download is interrupted either by user action or by
245692e5dbf12901edacf14812a6fae25462920af42Steve Block     * network errors, @error_detail will take any value of
246692e5dbf12901edacf14812a6fae25462920af42Steve Block     * #WebKitDownloadError.
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Since: 1.1.2
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     */
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_signals[ERROR] = g_signal_new("error",
251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            G_TYPE_FROM_CLASS(downloadClass),
2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            (GSignalFlags)G_SIGNAL_RUN_LAST,
253563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            0,
254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            g_signal_accumulator_true_handled,
255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            NULL,
256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            webkit_marshal_BOOLEAN__INT_INT_STRING,
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            G_TYPE_BOOLEAN, 3,
258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            G_TYPE_INT,
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            G_TYPE_INT,
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            G_TYPE_STRING);
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Properties.
263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /**
265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * WebKitDownload:network-request
266563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * The #WebKitNetworkRequest instance associated with the download.
268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Since: 1.1.2
270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     */
271563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_class_install_property(objectClass,
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    PROP_NETWORK_REQUEST,
273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    g_param_spec_object("network-request",
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("Network Request"),
2750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("The network request for the URI that should be downloaded"),
276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        WEBKIT_TYPE_NETWORK_REQUEST,
277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /**
280cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block     * WebKitDownload:network-response
281cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block     *
282cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block     * The #WebKitNetworkResponse instance associated with the download.
283cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block     *
284cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block     * Since: 1.1.16
285cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block     */
286cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    g_object_class_install_property(objectClass,
287cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                                    PROP_NETWORK_RESPONSE,
288cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                                    g_param_spec_object("network-response",
289cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                                                        _("Network Response"),
290cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                                                        _("The network response for the URI that should be downloaded"),
291cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                                                        WEBKIT_TYPE_NETWORK_RESPONSE,
292cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                                                        (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
293cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
294cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    /**
295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * WebKitDownload:destination-uri
296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * The URI of the save location for this download.
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Since: 1.1.2
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     */
301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_class_install_property(objectClass,
302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    PROP_DESTINATION_URI,
303563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    g_param_spec_string("destination-uri",
3040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("Destination URI"),
3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("The destination URI where to save the file"),
306563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        "",
307563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        WEBKIT_PARAM_READWRITE));
308563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
309563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /**
310563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * WebKitDownload:suggested-filename
311563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
312563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * The file name suggested as default when saving
313563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
314563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Since: 1.1.2
315563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     */
316563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_class_install_property(objectClass,
317563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    PROP_SUGGESTED_FILENAME,
318563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    g_param_spec_string("suggested-filename",
3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("Suggested Filename"),
3200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("The filename suggested as default when saving"),
321563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        "",
322563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        WEBKIT_PARAM_READABLE));
323563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /**
325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * WebKitDownload:progress:
326563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch     * Determines the current progress of the download. Notice that,
3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch     * although the progress changes are reported as soon as possible,
3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch     * the emission of the notify signal for this property is
3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch     * throttled, for the benefit of download managers. If you care
3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch     * about every update, use WebKitDownload:current-size.
332563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
333563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Since: 1.1.2
334563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     */
335563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_class_install_property(objectClass, PROP_PROGRESS,
336563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    g_param_spec_double("progress",
3370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("Progress"),
3380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("Determines the current progress of the download"),
339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        0.0, 1.0, 1.0,
340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        WEBKIT_PARAM_READABLE));
341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
342563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /**
343563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * WebKitDownload:status:
344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Determines the current status of the download.
346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Since: 1.1.2
348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     */
349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_class_install_property(objectClass, PROP_STATUS,
350563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    g_param_spec_enum("status",
3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                      _("Status"),
3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                      _("Determines the current status of the download"),
353563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                      WEBKIT_TYPE_DOWNLOAD_STATUS,
354563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                      WEBKIT_DOWNLOAD_STATUS_CREATED,
355563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                      WEBKIT_PARAM_READABLE));
356563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
357563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /**
358563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * WebKitDownload:current-size
359563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
360563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * The length of the data already downloaded
361563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Since: 1.1.2
363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     */
364563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_class_install_property(objectClass,
365563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    PROP_CURRENT_SIZE,
366563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    g_param_spec_uint64("current-size",
3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("Current Size"),
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("The length of the data already downloaded"),
369563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        0, G_MAXUINT64, 0,
370563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        WEBKIT_PARAM_READABLE));
371563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
372563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /**
373563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * WebKitDownload:total-size
374563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
375563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * The total size of the file
376563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     *
377563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     * Since: 1.1.2
378563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark     */
379563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_class_install_property(objectClass,
380563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    PROP_CURRENT_SIZE,
381563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                    g_param_spec_uint64("total-size",
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("Total Size"),
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        _("The total size of the file"),
384563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        0, G_MAXUINT64, 0,
385563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                        WEBKIT_PARAM_READABLE));
386563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
387563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_type_class_add_private(downloadClass, sizeof(WebKitDownloadPrivate));
388563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
389563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
390563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_init(WebKitDownload* download)
391563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
392f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WebKitDownloadPrivate* priv = G_TYPE_INSTANCE_GET_PRIVATE(download, WEBKIT_TYPE_DOWNLOAD, WebKitDownloadPrivate);
393563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    download->priv = priv;
394563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
395563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    priv->downloadClient = new DownloadClient(download);
396563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    priv->currentSize = 0;
397563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    priv->status = WEBKIT_DOWNLOAD_STATUS_CREATED;
398563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
399563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
400563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
401563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_new:
402563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @request: a #WebKitNetworkRequest
403563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
404563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Creates a new #WebKitDownload object for the given
405563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * #WebKitNetworkRequest object.
406563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
407563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: the new #WebKitDownload
408563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
409563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
410563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
411563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitDownload* webkit_download_new(WebKitNetworkRequest* request)
412563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
413563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(request, NULL);
414563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
415563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return WEBKIT_DOWNLOAD(g_object_new(WEBKIT_TYPE_DOWNLOAD, "network-request", request, NULL));
416563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
417563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
418231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// Internal usage only
419231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebKitDownload* webkit_download_new_with_handle(WebKitNetworkRequest* request, WebCore::ResourceHandle* handle, const WebCore::ResourceResponse& response)
420231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
421231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    g_return_val_if_fail(request, NULL);
422231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
423231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ResourceHandleInternal* d = handle->getInternal();
424a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (d->m_soupMessage)
425a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        soup_session_pause_message(webkit_get_default_session(), d->m_soupMessage.get());
426231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
427231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebKitDownload* download = WEBKIT_DOWNLOAD(g_object_new(WEBKIT_TYPE_DOWNLOAD, "network-request", request, NULL));
428231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebKitDownloadPrivate* priv = download->priv;
429231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
430231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    handle->ref();
431231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    priv->resourceHandle = handle;
432231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
433231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    webkit_download_set_response(download, response);
434231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
435231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return download;
436231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
437231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
438563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webkit_download_open_stream_for_uri(WebKitDownload* download, const gchar* uri, gboolean append=FALSE)
439563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
440563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(uri, FALSE);
441563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
442563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
443563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GFile* file = g_file_new_for_uri(uri);
444563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GError* error = NULL;
445563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
446563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (append)
447563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->outputStream = g_file_append_to(file, G_FILE_CREATE_NONE, NULL, &error);
448563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else
449563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->outputStream = g_file_replace(file, NULL, TRUE, G_FILE_CREATE_NONE, NULL, &error);
450563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
451563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_unref(file);
452563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
453563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (error) {
454563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gboolean handled;
455563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_signal_emit_by_name(download, "error", 0, WEBKIT_DOWNLOAD_ERROR_DESTINATION, error->message, &handled);
456563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_error_free(error);
457563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return FALSE;
458563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
459563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
460563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
461563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
462563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
463563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_close_stream(WebKitDownload* download)
464563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
465563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
466563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->outputStream) {
467563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(priv->outputStream);
468563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->outputStream = NULL;
469563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
470563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
471563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
472563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
473563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_start:
474563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
475563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
476563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Initiates the download. Notice that you must have set the
477563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * destination-uri property before calling this method.
478563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
479563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
480563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
481563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid webkit_download_start(WebKitDownload* download)
482563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
483563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_if_fail(WEBKIT_IS_DOWNLOAD(download));
484563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
485563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
486563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_if_fail(priv->destinationURI);
487563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_if_fail(priv->status == WEBKIT_DOWNLOAD_STATUS_CREATED);
488563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_if_fail(priv->timer == NULL);
489563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
49068513a70bcd92384395513322f1b801e7bf9c729Steve Block    // For GTK, when downloading a file NetworkingContext is null
491231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!priv->resourceHandle)
49268513a70bcd92384395513322f1b801e7bf9c729Steve Block        priv->resourceHandle = ResourceHandle::create(/* Null NetworkingContext */ NULL, core(priv->networkRequest), priv->downloadClient, false, false);
493231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else {
494231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        priv->resourceHandle->setClient(priv->downloadClient);
495231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
496231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ResourceHandleInternal* d = priv->resourceHandle->getInternal();
497a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (d->m_soupMessage)
498a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            soup_session_unpause_message(webkit_get_default_session(), d->m_soupMessage.get());
499231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
500563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
501563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    priv->timer = g_timer_new();
502563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_open_stream_for_uri(download, priv->destinationURI);
503563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
504563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
505563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
506563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_cancel:
507563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
508563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
509563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Cancels the download. Calling this will not free the
510563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * #WebKitDownload object, so you still need to call
511563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * g_object_unref() on it, if you are the owner of a reference. Notice
512563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * that cancelling the download provokes the emission of the
513563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * WebKitDownload::error signal, reporting that the download was
514563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * cancelled.
515563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
516563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
517563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
518563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid webkit_download_cancel(WebKitDownload* download)
519563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
520563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_if_fail(WEBKIT_IS_DOWNLOAD(download));
521563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
522563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
523563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
524563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Cancel may be called even if start was not called, so we need
525563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // to make sure timer is non-NULL.
526563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->timer)
527563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_timer_stop(priv->timer);
528563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
529563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->resourceHandle)
530563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->resourceHandle->cancel();
531563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
532563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_set_status(download, WEBKIT_DOWNLOAD_STATUS_CANCELLED);
533563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
534563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gboolean handled;
5350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_signal_emit_by_name(download, "error", 0, WEBKIT_DOWNLOAD_ERROR_CANCELLED_BY_USER, _("User cancelled the download"), &handled);
536563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
537563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
538563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
539563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_uri:
540563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
541563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
542563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Convenience method to retrieve the URI from the
543563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * #WebKitNetworkRequest which is being downloaded.
544563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
545563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: the uri
546563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
547563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
548563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
549563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkconst gchar* webkit_download_get_uri(WebKitDownload* download)
550563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
551563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), NULL);
552563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
553563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
554563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return webkit_network_request_get_uri(priv->networkRequest);
555563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
556563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
557563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
558563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_network_request:
559563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
560563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
561563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Retrieves the #WebKitNetworkRequest object that backs the download
562563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * process.
563563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
564bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Returns: (transfer none): the #WebKitNetworkRequest instance
565563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
566563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
567563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
568563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitNetworkRequest* webkit_download_get_network_request(WebKitDownload* download)
569563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
570563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), NULL);
571563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
572563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
573563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return priv->networkRequest;
574563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
575563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
576cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/**
577cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * webkit_download_get_network_response:
578cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * @download: the #WebKitDownload
579cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *
580cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * Retrieves the #WebKitNetworkResponse object that backs the download
581cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * process.
582cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *
583bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Returns: (transfer none): the #WebKitNetworkResponse instance
584cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *
585cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * Since: 1.1.16
586cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block */
587cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockWebKitNetworkResponse* webkit_download_get_network_response(WebKitDownload* download)
588cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
589cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), NULL);
590cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
591cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebKitDownloadPrivate* priv = download->priv;
592cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return priv->networkResponse;
593cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
594cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
595563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_set_response(WebKitDownload* download, const ResourceResponse& response)
596563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
597563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
598f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    priv->networkResponse = kitNew(response);
599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!response.isNull() && !response.suggestedFilename().isEmpty())
601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        webkit_download_set_suggested_filename(download, response.suggestedFilename().utf8().data());
602563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
603563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
604563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
605563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_suggested_filename:
606563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
607563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
608563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Retrieves the filename that was suggested by the server, or the one
609563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * derived by WebKit from the URI.
610563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
611563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: the suggested filename
612563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
613563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
614563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
615563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkconst gchar* webkit_download_get_suggested_filename(WebKitDownload* download)
616563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
617563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), NULL);
618563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
619563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
6200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (priv->suggestedFilename)
6210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return priv->suggestedFilename;
6220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    KURL url = KURL(KURL(), webkit_network_request_get_uri(priv->networkRequest));
6240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    url.setQuery(String());
6250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    url.removeFragmentIdentifier();
6260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    priv->suggestedFilename = g_strdup(decodeURLEscapeSequences(url.lastPathComponent()).utf8().data());
627563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return priv->suggestedFilename;
628563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
629563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
6300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// for internal use only
6310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid webkit_download_set_suggested_filename(WebKitDownload* download, const gchar* suggestedFilename)
6320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitDownloadPrivate* priv = download->priv;
6340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_free(priv->suggestedFilename);
6350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    priv->suggestedFilename = g_strdup(suggestedFilename);
636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    g_object_notify(G_OBJECT(download), "suggested-filename");
6380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
641563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
642563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_destination_uri:
643563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
644563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Obtains the URI to which the downloaded file will be written. This
646563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * must have been set by the application before calling
647563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_start(), and may be %NULL.
648563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
649563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: the destination URI or %NULL
650563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
651563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
652563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
653563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkconst gchar* webkit_download_get_destination_uri(WebKitDownload* download)
654563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
655563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), NULL);
656563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
657563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
658563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return priv->destinationURI;
659563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
660563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
661563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
662563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_set_destination_uri:
663563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
664563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @destination_uri: the destination URI
665563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
666563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Defines the URI that should be used to save the downloaded file to.
667563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
668563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
669563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
670563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid webkit_download_set_destination_uri(WebKitDownload* download, const gchar* destination_uri)
671563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
672563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_if_fail(WEBKIT_IS_DOWNLOAD(download));
673563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_if_fail(destination_uri);
674563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
675563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
676563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->destinationURI && !strcmp(priv->destinationURI, destination_uri))
677563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
678563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
679563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->status != WEBKIT_DOWNLOAD_STATUS_CREATED && priv->status != WEBKIT_DOWNLOAD_STATUS_CANCELLED) {
680563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ASSERT(priv->destinationURI);
681563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
682563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gboolean downloading = priv->outputStream != NULL;
683563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (downloading)
684563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            webkit_download_close_stream(download);
685563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
686563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        GFile* src = g_file_new_for_uri(priv->destinationURI);
687563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        GFile* dest = g_file_new_for_uri(destination_uri);
688563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        GError* error = NULL;
689563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
690563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_file_move(src, dest, G_FILE_COPY_BACKUP, NULL, NULL, NULL, &error);
691563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
692563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(src);
693563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(dest);
694563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
695563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_free(priv->destinationURI);
696563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->destinationURI = g_strdup(destination_uri);
697563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
698563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (error) {
699563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            gboolean handled;
700563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            g_signal_emit_by_name(download, "error", 0, WEBKIT_DOWNLOAD_ERROR_DESTINATION, error->message, &handled);
701563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            g_error_free(error);
702563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return;
703563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
704563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
705563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (downloading) {
706563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (!webkit_download_open_stream_for_uri(download, destination_uri, TRUE)) {
707563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                webkit_download_cancel(download);
708563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                return;
709563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
710563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
711563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } else {
712563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_free(priv->destinationURI);
713563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        priv->destinationURI = g_strdup(destination_uri);
714563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
715563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
716563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Only notify change if everything went fine.
717563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_notify(G_OBJECT(download), "destination-uri");
718563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
719563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
720563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
721563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_status:
722563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
723563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
724563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Obtains the current status of the download, as a
725563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * #WebKitDownloadStatus.
726563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
727563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: the current #WebKitDownloadStatus
728563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
729563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
730563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
731563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitDownloadStatus webkit_download_get_status(WebKitDownload* download)
732563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
733563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), WEBKIT_DOWNLOAD_STATUS_ERROR);
734563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
735563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
736563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return priv->status;
737563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
738563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
739563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_set_status(WebKitDownload* download, WebKitDownloadStatus status)
740563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
741563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_if_fail(WEBKIT_IS_DOWNLOAD(download));
742563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
743563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
744563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    priv->status = status;
745563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
746563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_notify(G_OBJECT(download), "status");
747563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
748563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
749563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
750563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_total_size:
751563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
752563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
753563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns the expected total size of the download. This is expected
754563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * because the server may provide incorrect or missing
755563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Content-Length. Notice that this may grow over time, as it will be
756563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * always the same as current_size in the cases where current size
757563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * surpasses it.
758563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
759563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: the expected total size of the downloaded file
760563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
761563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
762563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
763563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkguint64 webkit_download_get_total_size(WebKitDownload* download)
764563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
765563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), 0);
766563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
767563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
768cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    SoupMessage* message = priv->networkResponse ? webkit_network_response_get_message(priv->networkResponse) : NULL;
769cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
770cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!message)
771563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
772563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
773692e5dbf12901edacf14812a6fae25462920af42Steve Block    return MAX(priv->currentSize, static_cast<guint64>(soup_message_headers_get_content_length(message->response_headers)));
774563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
775563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
776563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
777563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_current_size:
778563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: the #WebKitDownload
779563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
780563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Current already downloaded size.
781563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
782563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: the already downloaded size
783563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
784563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
785563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
786563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkguint64 webkit_download_get_current_size(WebKitDownload* download)
787563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
788563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), 0);
789563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
790563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
791563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return priv->currentSize;
792563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
793563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
794563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
795563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_progress:
796563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: a #WebKitDownload
797563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
798563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Determines the current progress of the download.
799563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
800563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: a #gdouble ranging from 0.0 to 1.0.
801563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
802563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
803563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
804563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkgdouble webkit_download_get_progress(WebKitDownload* download)
805563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
806563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), 1.0);
807563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
808563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
8090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!priv->networkResponse)
810cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return 0.0;
8110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
812cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    gdouble total_size = static_cast<gdouble>(webkit_download_get_total_size(download));
813563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
814563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (total_size == 0)
815563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 1.0;
816563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
817563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return ((gdouble)priv->currentSize) / total_size;
818563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
819563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
820563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/**
821563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * webkit_download_get_elapsed_time:
822563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * @download: a #WebKitDownload
823563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
824563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Elapsed time for the download in seconds, including any fractional
825563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * part. If the download is finished, had an error or was cancelled
826563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * this is the time between its start and the event.
827563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
828563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Returns: seconds since the download was started, as a #gdouble
829563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
830563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Since: 1.1.2
831563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
832563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkgdouble webkit_download_get_elapsed_time(WebKitDownload* download)
833563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
834563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), 0.0);
835563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
836563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
8370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!priv->timer)
8380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 0;
8390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
840563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return g_timer_elapsed(priv->timer, NULL);
841563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
842563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
843563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_received_data(WebKitDownload* download, const gchar* data, int length)
844563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
845563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
846563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
847563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (priv->currentSize == 0)
848563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        webkit_download_set_status(download, WEBKIT_DOWNLOAD_STATUS_STARTED);
849563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
850563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(priv->outputStream);
851563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
852563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gsize bytes_written;
853563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GError* error = NULL;
854563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
855563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_output_stream_write_all(G_OUTPUT_STREAM(priv->outputStream),
856563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                              data, length, &bytes_written, NULL, &error);
857563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
858563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (error) {
859563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gboolean handled;
860563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_signal_emit_by_name(download, "error", 0, WEBKIT_DOWNLOAD_ERROR_DESTINATION, error->message, &handled);
861563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_error_free(error);
862563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
863563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
864563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
865563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    priv->currentSize += length;
866563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_notify(G_OBJECT(download), "current-size");
867563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
868563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(priv->networkResponse);
869cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (priv->currentSize > webkit_download_get_total_size(download))
870563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_notify(G_OBJECT(download), "total-size");
871563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Throttle progress notification to not consume high amounts of
873d0825bca7fe65beaee391d30da42e937db621564Steve Block    // CPU on fast links, except when the last notification occured
874d0825bca7fe65beaee391d30da42e937db621564Steve Block    // in more then 0.7 secs from now, or the last notified progress
875d0825bca7fe65beaee391d30da42e937db621564Steve Block    // is passed in 1% or we reached the end.
876d0825bca7fe65beaee391d30da42e937db621564Steve Block    static gdouble lastProgress = 0;
8770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static gdouble lastElapsed = 0;
8780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gdouble currentElapsed = g_timer_elapsed(priv->timer, NULL);
879d0825bca7fe65beaee391d30da42e937db621564Steve Block    gdouble currentProgress = webkit_download_get_progress(download);
8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (lastElapsed
882d0825bca7fe65beaee391d30da42e937db621564Steve Block        && lastProgress
883d0825bca7fe65beaee391d30da42e937db621564Steve Block        && (currentElapsed - lastElapsed) < 0.7
884d0825bca7fe65beaee391d30da42e937db621564Steve Block        && (currentProgress - lastProgress) < 0.01
885d0825bca7fe65beaee391d30da42e937db621564Steve Block        && currentProgress < 1.0) {
8860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
8870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
8880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    lastElapsed = currentElapsed;
889d0825bca7fe65beaee391d30da42e937db621564Steve Block    lastProgress = currentProgress;
8900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
891563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_notify(G_OBJECT(download), "progress");
892563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
893563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
894563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_finished_loading(WebKitDownload* download)
895563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
896563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_close_stream(download);
897563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
898563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
899563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
900563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_timer_stop(priv->timer);
901563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
902563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_notify(G_OBJECT(download), "progress");
903563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_set_status(download, WEBKIT_DOWNLOAD_STATUS_FINISHED);
904563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
905563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
906563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webkit_download_error(WebKitDownload* download, const ResourceError& error)
907563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
908563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_close_stream(download);
909563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
910563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitDownloadPrivate* priv = download->priv;
911cad810f21b803229eb11403f9209855525a25d57Steve Block    GRefPtr<WebKitDownload> protect(download);
912563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
913563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_timer_stop(priv->timer);
914563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_set_status(download, WEBKIT_DOWNLOAD_STATUS_ERROR);
915563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
916563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gboolean handled;
917563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_signal_emit_by_name(download, "error", 0, WEBKIT_DOWNLOAD_ERROR_NETWORK, error.localizedDescription().utf8().data(), &handled);
918563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
919563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
920563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkDownloadClient::DownloadClient(WebKitDownload* download)
921563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    : m_download(download)
922563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
923563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
924563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
925563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid DownloadClient::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
926563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
927563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_set_response(m_download, response);
928563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
929563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
9302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid DownloadClient::didReceiveData(ResourceHandle*, const char* data, int length, int encodedDataLength)
931563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
932563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_received_data(m_download, data, length);
933563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
934563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
93568513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid DownloadClient::didFinishLoading(ResourceHandle*, double)
936563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
937563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_finished_loading(m_download);
938563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
939563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
940563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid DownloadClient::didFail(ResourceHandle*, const ResourceError& error)
941563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
942563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_download_error(m_download, error);
943563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
944563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
945563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid DownloadClient::wasBlocked(ResourceHandle*)
946563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
947563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: Implement this when we have the new frame loader signals
948563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // and error handling.
949563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    notImplemented();
950563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
951563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
952563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid DownloadClient::cannotShowURL(ResourceHandle*)
953563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
954563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: Implement this when we have the new frame loader signals
955563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // and error handling.
956563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    notImplemented();
957563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
958