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