aboutsummaryrefslogtreecommitdiffstats
path: root/embed/ephy-embed-persist.c
diff options
context:
space:
mode:
authorDiego Escalante Urrelo <descalante@igalia.com>2011-01-19 00:10:11 +0800
committerDiego Escalante Urrelo <descalante@igalia.com>2011-03-08 04:34:52 +0800
commitb9f9bf1a0763492f8bf41b8856bbd1149c5871a9 (patch)
tree92ad55101bff9eabcbc17afdba4a398ce4c4b709 /embed/ephy-embed-persist.c
parent7f7826a163f31bb662247ac4486dca0d01df35f6 (diff)
downloadgsoc2013-epiphany-b9f9bf1a0763492f8bf41b8856bbd1149c5871a9.tar
gsoc2013-epiphany-b9f9bf1a0763492f8bf41b8856bbd1149c5871a9.tar.gz
gsoc2013-epiphany-b9f9bf1a0763492f8bf41b8856bbd1149c5871a9.tar.bz2
gsoc2013-epiphany-b9f9bf1a0763492f8bf41b8856bbd1149c5871a9.tar.lz
gsoc2013-epiphany-b9f9bf1a0763492f8bf41b8856bbd1149c5871a9.tar.xz
gsoc2013-epiphany-b9f9bf1a0763492f8bf41b8856bbd1149c5871a9.tar.zst
gsoc2013-epiphany-b9f9bf1a0763492f8bf41b8856bbd1149c5871a9.zip
ephy-download: add the new EphyDownload object
EphyDownload is a wrapper object around WebKitDownload that handles common behavior in downloads: auto-destination, default action for the MIME type. It can be used to wrap a WebKitDownload coming from a WebKitView or to download a url: ephy_download_new_for_uri and ephy_download_new_for_download are provided. Its lifetime is not automagic like EphyEmbedPersist, so you have to unref it when you no longer need it. This new object replaces EphyEmbedPersist and enables us to use a single codepath for downloads in all Epiphany. Bug #618443
Diffstat (limited to 'embed/ephy-embed-persist.c')
-rw-r--r--embed/ephy-embed-persist.c911
1 files changed, 0 insertions, 911 deletions
diff --git a/embed/ephy-embed-persist.c b/embed/ephy-embed-persist.c
deleted file mode 100644
index 5d7a442c0..000000000
--- a/embed/ephy-embed-persist.c
+++ /dev/null
@@ -1,911 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright © 2000-2003 Marco Pesenti Gritti
- * Copyright © 2003 Christian Persch
- * Copyright © 2010 Igalia S.L.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "config.h"
-
-#include "downloader-view.h"
-#include "ephy-embed-persist.h"
-#include "ephy-embed-shell.h"
-#include "ephy-embed-type-builtins.h"
-#include "ephy-file-chooser.h"
-#include "ephy-file-helpers.h"
-#include "ephy-debug.h"
-
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-
-enum
-{
- PROP_0,
- PROP_DEST,
- PROP_EMBED,
- PROP_FILECHOOSER_TITLE,
- PROP_FILECHOOSER_PARENT,
- PROP_FLAGS,
- PROP_HANDLER,
- PROP_MAX_SIZE,
- PROP_PERSISTKEY,
- PROP_SOURCE,
- PROP_USER_TIME
-};
-
-#define EPHY_EMBED_PERSIST_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_EMBED_PERSIST, EphyEmbedPersistPrivate))
-
-struct _EphyEmbedPersistPrivate
-{
- char *dest;
- char *source;
- char *fc_title;
- char *persist_key;
- EphyEmbed *embed;
- gint64 max_size;
- EphyEmbedPersistFlags flags;
- GtkWindow *fc_parent;
- guint32 user_time;
- WebKitDownload *download;
- DownloaderView *dview;
-};
-
-static void ephy_embed_persist_class_init (EphyEmbedPersistClass *klass);
-static void ephy_embed_persist_init (EphyEmbedPersist *ges);
-
-G_DEFINE_TYPE (EphyEmbedPersist, ephy_embed_persist, G_TYPE_OBJECT)
-
-/**
- * ephy_embed_persist_set_dest:
- * @persist: an #EphyEmbedPersist
- * @value: the path to which @persist should save data
- *
- * Sets the path to which @persist should save data.
- **/
-void
-ephy_embed_persist_set_dest (EphyEmbedPersist *persist,
- const char *value)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- persist->priv->dest = g_strdup (value);
-}
-
-/**
- * ephy_embed_persist_set_embed:
- * @persist: an #EphyEmbedPersist
- * @value: a parent #EphyEmbed
- *
- * Sets the #EphyEmbed from which @persist will download data.
- *
- * An #EphyEmbed is absolutely required to download if @persist's
- * #EphyEmbedPersistFlags include %EPHY_EMBED_PERSIST_COPY_PAGE. Regardless, an
- * #EphyEmbed should be set for <emphasis>every</emphasis> #EphyEmbedPersist,
- * since it determines request information such as the referring page.
- **/
-void
-ephy_embed_persist_set_embed (EphyEmbedPersist *persist,
- EphyEmbed *value)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- persist->priv->embed = value;
-}
-
-/**
- * ephy_embed_persist_set_fc_title:
- * @persist: an #EphyEmbedPersist
- * @value: the title to be displayed by the filechooser
- *
- * Sets the title of the filechooser window. The filechooser will only be
- * displayed if %EPHY_EMBED_PERSIST_ASK_DESTINATION has been set with
- * ephy_embed_persist_set_flags().
- **/
-void
-ephy_embed_persist_set_fc_title (EphyEmbedPersist *persist,
- const char *value)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- persist->priv->fc_title = g_strdup (value);
-}
-
-/**
- * ephy_embed_persist_set_fc_parent:
- * @persist: an #EphyEmbedPersist
- * @value: the #EphyWindow which should be the filechooser's parent
- *
- * Sets the #EphyWindow which should be @persist's filechooser's parent. The
- * filechooser will only be displayed if %EPHY_EMBED_PERSIST_ASK_DESTINATION
- * has been set with ephy_embed_persist_set_flags().
- **/
-void
-ephy_embed_persist_set_fc_parent (EphyEmbedPersist *persist,
- GtkWindow *value)
-{
- EphyEmbedPersistPrivate *priv;
- GtkWindow **wptr;
-
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
- g_return_if_fail (gtk_widget_is_toplevel (GTK_WIDGET (value)));
-
- priv = persist->priv;
-
- priv->fc_parent = value;
- wptr = &priv->fc_parent;
- g_object_add_weak_pointer (G_OBJECT (priv->fc_parent),
- (gpointer *) wptr);
-}
-
-/**
- * ephy_embed_persist_set_flags:
- * @persist: an #EphyEmbedPersist
- * @value: the desired #EphyEmbedPersistFlags
- *
- * Sets the flags to be used for @persist's download.
- **/
-void
-ephy_embed_persist_set_flags (EphyEmbedPersist *persist,
- EphyEmbedPersistFlags value)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- persist->priv->flags = value;
-}
-
-/**
- * ephy_embed_persist_set_max_size:
- * @persist: an #EphyEmbedPersist
- * @value: maximum size of requested download, in bytes
- *
- * Sets the maximum size of @persist's download.
- *
- * If the requested file is discovered to be larger than @value, the download
- * will be aborted. Note that @persist will have to actually begin downloading
- * before it can abort, since it doesn't know the filesize before the download
- * starts.
- **/
-void
-ephy_embed_persist_set_max_size (EphyEmbedPersist *persist,
- gint64 value)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- persist->priv->max_size = value;
-}
-
-/**
- * ephy_embed_persist_set_persist_key:
- * @persist: an #EphyEmbedPersist
- * @value: a GConf key
- *
- * Sets the GConf key from which @persist will determine the default download
- * directory.
- **/
-void
-ephy_embed_persist_set_persist_key (EphyEmbedPersist *persist,
- const char *value)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- persist->priv->persist_key = g_strdup (value);
-}
-
-/**
- * ephy_embed_persist_set_source:
- * @persist: an #EphyEmbedPersist
- * @value: the URL from which @persist should download
- *
- * Sets the URL from which @persist should download. This should be used in
- * conjunction with ephy_embed_persist_set_embed().
- **/
-void
-ephy_embed_persist_set_source (EphyEmbedPersist *persist,
- const char *value)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- persist->priv->source = g_strdup (value);
-}
-
-/**
- * ephy_embed_persist_set_user_time:
- * @persist: an #EphyEmbedPersist
- * @user_time: a timestamp, or 0
- *
- * Sets the time stamp of the user action which created @persist.
- * Defaults to gtk_get_current_event_time() when @persist is created.
- **/
-void
-ephy_embed_persist_set_user_time (EphyEmbedPersist *persist,
- guint32 user_time)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- LOG ("ephy_embed_persist_set_user_time persist %p user-time %d",
- persist, user_time);
-
- persist->priv->user_time = user_time;
-}
-
-/**
- * ephy_embed_persist_get_dest:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the destination filename to which @persist will save its download.
- *
- * Return value: @persist's destination filename
- **/
-const char *
-ephy_embed_persist_get_dest (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), NULL);
-
- return persist->priv->dest;
-}
-
-/**
- * ephy_embed_persist_get_embed:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the #EphyEmbed from which @persist will download.
- *
- * Return value: (transfer none): the #EphyEmbed from which @persist
- * will download
- **/
-EphyEmbed *
-ephy_embed_persist_get_embed (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), NULL);
-
- return persist->priv->embed;
-}
-
-/**
- * ephy_embed_persist_get_fc_title:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the title to be displayed in @persist's filechooser.
- *
- * Return value: the title to be displayed in @persist's filechooser
- **/
-const char *
-ephy_embed_persist_get_fc_title (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), NULL);
-
- return persist->priv->fc_title;
-}
-
-/**
- * ephy_embed_persist_get_fc_parent:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the #EphyWindow which should serve as a parent for @persist's
- * filechooser.
- *
- * Return value: (transfer none): the #EphyWindow parent for @persist's
- * filechooser
- **/
-GtkWindow *
-ephy_embed_persist_get_fc_parent (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), NULL);
-
- return persist->priv->fc_parent;
-}
-
-/**
- * ephy_embed_persist_get_flags:
- * @persist: an #EphyEmbedPersist
- *
- * Returns @persist's #EphyEmbedPersistFlags.
- *
- * Return value: @persist's #EphyEmbedPersistFlags
- **/
-EphyEmbedPersistFlags
-ephy_embed_persist_get_flags (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), 0);
-
- return persist->priv->flags;
-}
-
-/**
- * ephy_embed_persist_get_max_size:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the maximum size of @persist's requested download, in bytes.
- *
- * Return value: the maximum size of @persist's requested download, in bytes
- **/
-gint64
-ephy_embed_persist_get_max_size (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), 0);
-
- return persist->priv->max_size;
-}
-
-/**
- * ephy_embed_persist_get_persist_key:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the GConf key which determines Epiphany's default download directory.
- *
- * Return value: the GConf key to the default download directory
- **/
-const char *
-ephy_embed_persist_get_persist_key (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), NULL);
-
- return persist->priv->persist_key;
-}
-
-/**
- * ephy_embed_persist_get_source:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the source URL of the file to download.
- *
- * Return value: a source URL
- **/
-const char *
-ephy_embed_persist_get_source (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), NULL);
-
- return persist->priv->source;
-}
-
-/**
- * ephy_embed_persist_get_user_time:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the timestamp of the user action which created @persist.
- * If not set explicitly, defaults to gtk_get_current_event_time ()
- * at the time of creation of @persist.
- *
- * Return value: a timestamp, or 0
- **/
-guint32
-ephy_embed_persist_get_user_time (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), 0);
-
- return persist->priv->user_time;
-}
-
-static void
-ephy_embed_persist_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EphyEmbedPersist *persist = EPHY_EMBED_PERSIST (object);
-
- switch (prop_id)
- {
- case PROP_DEST:
- ephy_embed_persist_set_dest (persist, g_value_get_string (value));
- break;
- case PROP_EMBED:
- ephy_embed_persist_set_embed (persist, g_value_get_object (value));
- break;
- case PROP_FILECHOOSER_TITLE:
- ephy_embed_persist_set_fc_title (persist, g_value_get_string (value));
- break;
- case PROP_FILECHOOSER_PARENT:
- ephy_embed_persist_set_fc_parent (persist, g_value_get_object (value));
- break;
- case PROP_FLAGS:
- ephy_embed_persist_set_flags (persist, g_value_get_flags (value));
- break;
- case PROP_MAX_SIZE:
- ephy_embed_persist_set_max_size (persist, g_value_get_int64 (value));
- break;
- case PROP_PERSISTKEY:
- ephy_embed_persist_set_persist_key (persist, g_value_get_string (value));
- break;
- case PROP_SOURCE:
- ephy_embed_persist_set_source (persist, g_value_get_string (value));
- break;
- case PROP_USER_TIME:
- ephy_embed_persist_set_user_time (persist, g_value_get_uint (value));
- break;
- }
-}
-
-static void
-ephy_embed_persist_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EphyEmbedPersist *persist = EPHY_EMBED_PERSIST (object);
-
- switch (prop_id)
- {
- case PROP_DEST:
- g_value_set_string (value, ephy_embed_persist_get_dest (persist));
- break;
- case PROP_EMBED:
- g_value_set_object (value, ephy_embed_persist_get_embed (persist));
- break;
- case PROP_FILECHOOSER_TITLE:
- g_value_set_string (value, ephy_embed_persist_get_fc_title (persist));
- break;
- case PROP_FILECHOOSER_PARENT:
- g_value_set_object (value, ephy_embed_persist_get_fc_parent (persist));
- break;
- case PROP_FLAGS:
- g_value_set_flags (value, ephy_embed_persist_get_flags (persist));
- break;
- case PROP_MAX_SIZE:
- g_value_set_int64 (value, ephy_embed_persist_get_max_size (persist));
- break;
- case PROP_PERSISTKEY:
- g_value_set_string (value, ephy_embed_persist_get_persist_key (persist));
- break;
- case PROP_SOURCE:
- g_value_set_string (value, ephy_embed_persist_get_source (persist));
- break;
- case PROP_USER_TIME:
- g_value_set_uint (value, ephy_embed_persist_get_user_time (persist));
- break;
- }
-}
-
-static void
-ephy_embed_persist_init (EphyEmbedPersist *persist)
-{
- persist->priv = EPHY_EMBED_PERSIST_GET_PRIVATE (persist);
-
- LOG ("EphyEmbedPersist initialising %p", persist);
-
- persist->priv->max_size = -1;
- persist->priv->dview = NULL;
-
- ephy_embed_persist_set_user_time (persist, gtk_get_current_event_time ());
-}
-
-static void
-ephy_embed_persist_dispose (GObject *object)
-{
- EphyEmbedPersist *persist = EPHY_EMBED_PERSIST (object);
- EphyEmbedPersistPrivate *priv = persist->priv;
-
- if (priv->download)
- {
- g_object_unref (priv->download);
- priv->download = NULL;
- }
-
- LOG ("EphyEmbedPersist disposed %p", object);
-
- G_OBJECT_CLASS (ephy_embed_persist_parent_class)->dispose (object);
-}
-
-static void
-ephy_embed_persist_finalize (GObject *object)
-{
- EphyEmbedPersist *persist = EPHY_EMBED_PERSIST (object);
- EphyEmbedPersistPrivate *priv = persist->priv;
- GtkWindow **wptr;
-
- g_free (priv->dest);
- g_free (priv->source);
- g_free (priv->fc_title);
- g_free (priv->persist_key);
-
- if (priv->fc_parent != NULL)
- {
- wptr = &priv->fc_parent;
- g_object_remove_weak_pointer (G_OBJECT (priv->fc_parent),
- (gpointer *) wptr);
- }
-
- LOG ("EphyEmbedPersist finalised %p", object);
-
- G_OBJECT_CLASS (ephy_embed_persist_parent_class)->finalize (object);
-}
-
-static void
-ephy_embed_persist_class_init (EphyEmbedPersistClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->finalize = ephy_embed_persist_finalize;
- object_class->dispose = ephy_embed_persist_dispose;
- object_class->set_property = ephy_embed_persist_set_property;
- object_class->get_property = ephy_embed_persist_get_property;
-
- /* init signals */
-/**
- * EphyEmbedPersist::completed:
- *
- * The ::completed signal is emitted when @persist has finished downloading. The
- * download must have started with ephy_embed_persist_save().
- **/
- g_signal_new ("completed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EphyEmbedPersistClass, completed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
-/**
- * EphyEmbedPersist::cancelled:
- *
- * The ::cancelled signal is emitted when @persist's download has been
- * cancelled with ephy_embed_persist_cancel().
- **/
- g_signal_new ("cancelled",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EphyEmbedPersistClass, cancelled),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
-
- g_object_class_install_property (object_class,
- PROP_DEST,
- g_param_spec_string ("dest",
- "Destination",
- "Destination file path",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property (object_class,
- PROP_EMBED,
- g_param_spec_object ("embed",
- "Embed",
- "The embed containing the document",
- G_TYPE_OBJECT,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
- G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (object_class,
- PROP_FILECHOOSER_TITLE,
- g_param_spec_string ("filechooser-title",
- "Filechooser title",
- "Title to use if showing filechooser",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property (object_class,
- PROP_FILECHOOSER_PARENT,
- g_param_spec_object ("filechooser-parent",
- "Filechooser parent",
- "The parent window for the filechooser",
- GTK_TYPE_WINDOW,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property (object_class,
- PROP_FLAGS,
- g_param_spec_flags ("flags",
- "Flags",
- "Flags",
- EPHY_TYPE_EMBED_PERSIST_FLAGS,
- 0,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property (object_class,
- PROP_MAX_SIZE,
- g_param_spec_int64 ("max-size",
- "Maxsize",
- "Maximum size of the file",
- -1,
- G_MAXINT64,
- -1,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property (object_class,
- PROP_PERSISTKEY,
- g_param_spec_string ("persist-key",
- "persist key",
- "Path persistence gconf key",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property (object_class,
- PROP_SOURCE,
- g_param_spec_string ("source",
- "Source",
- "Url of the document to save",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property (object_class,
- PROP_USER_TIME,
- g_param_spec_uint ("user-time",
- "User Time",
- "User Time",
- 0,
- G_MAXUINT,
- 0,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_type_class_add_private (object_class, sizeof(EphyEmbedPersistPrivate));
-}
-
-/**
- * ephy_embed_persist_cancel:
- * @persist: an #EphyEmbedPersist
- *
- * Cancels @persist's download. This will not delete the partially downloaded
- * file.
- **/
-void
-ephy_embed_persist_cancel (EphyEmbedPersist *persist)
-{
- g_return_if_fail (EPHY_IS_EMBED_PERSIST (persist));
-
- /* webkit_download_cancel() triggers download_status_changed_cb() with
- * status = WEBKIT_DOWNLOAD_STATUS_CANCELLED so we don't need to emit
- * the signal.
- */
- if (persist->priv->download)
- {
- webkit_download_cancel (persist->priv->download);
- }
- else
- {
- g_object_unref (persist);
- }
-}
-
-static void
-response_cb (GtkDialog *dialog,
- int response_id,
- EphyEmbedPersist *persist)
-{
- WebKitDownload *download;
-
- download = persist->priv->download;
-
- if (response_id == GTK_RESPONSE_ACCEPT)
- {
- char *uri;
-
- uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER(dialog));
-
- if (persist->priv->dview)
- downloader_view_add_download (persist->priv->dview, download);
-
- webkit_download_set_destination_uri (download, uri);
- webkit_download_start (download);
-
- g_free (uri);
- }
- else
- {
- g_object_unref (persist);
- }
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-static void
-download_status_changed_cb (GObject *object,
- GParamSpec *pspec,
- EphyEmbedPersist *persist)
-{
- EphyEmbedPersistPrivate *priv;
- WebKitDownload *download;
- WebKitDownloadStatus status;
-
- priv = persist->priv;
- download = WEBKIT_DOWNLOAD (object);
- status = webkit_download_get_status (download);
-
- if (status == WEBKIT_DOWNLOAD_STATUS_FINISHED)
- {
- g_signal_emit_by_name (persist, "completed");
- g_object_unref (persist);
- }
- else if (status == WEBKIT_DOWNLOAD_STATUS_CANCELLED ||
- status == WEBKIT_DOWNLOAD_STATUS_ERROR)
- {
- g_signal_emit_by_name (persist, "cancelled");
- g_object_unref (persist);
- }
-}
-
-/**
- * ephy_embed_persist_save:
- * @persist: an #EphyEmbedPersist
- *
- * Begins saving the file specified in @persist.
- *
- * If @persist's #EphyEmbedPersistFlags include %EPHY_EMBED_PERSIST_ASK_DESTINATION, a
- * filechooser dialog will be shown first. If this flag is not set and no
- * destination has been set, the target will be saved to the default download
- * directory using the suggested name, if no suggested name can be get the
- * download will fail.
- *
- * The file will continue to download in the background until either the
- * ::completed or the ::cancelled signals are emitted by @persist.
- *
- * Return value: %TRUE if the download began successfully
- **/
-gboolean
-ephy_embed_persist_save (EphyEmbedPersist *persist)
-{
- EphyEmbedPersistPrivate *priv;
- WebKitNetworkRequest *request;
-
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), FALSE);
-
- priv = persist->priv;
- g_return_val_if_fail (priv->source != NULL, FALSE);
-
- /* Balanced when priv->download is not needed anymore: here, in
- * ephy_embed_persist_cancel() and in download_status_changed_cb().
- */
- g_object_ref (persist);
-
- if (priv->embed)
- {
- EphyWebView *web_view;
- SoupMessage *msg;
- gchar *referer;
-
- /* Get the webview associated to the embed */
- web_view = ephy_embed_get_web_view (priv->embed);
-
- /* Create the request with a SoupMessage to allow
- setting the 'Referer' as got from the embed */
- msg = soup_message_new (SOUP_METHOD_GET, priv->source);
- request = WEBKIT_NETWORK_REQUEST (
- g_object_new (WEBKIT_TYPE_NETWORK_REQUEST,
- "message", msg,
- NULL));
-
- /* Add the referer to the request headers */
- referer = ephy_web_view_get_location (web_view, FALSE);
- soup_message_headers_append (msg->request_headers,
- "Referer", referer);
- g_free (referer);
- g_object_unref (msg);
- }
- else
- {
- /* Create a normal network request otherwise */
- request = webkit_network_request_new (priv->source);
- }
-
- priv->download = webkit_download_new (request);
- g_object_unref (request);
-
- g_signal_connect (priv->download, "notify::status",
- G_CALLBACK (download_status_changed_cb),
- persist);
-
- /* Should we include downloads in DownloaderView? */
- if (!(priv->flags & EPHY_EMBED_PERSIST_NO_VIEW))
- {
- priv->dview = EPHY_DOWNLOADER_VIEW
- (ephy_embed_shell_get_downloader_view (embed_shell));
-
- g_object_set_data (G_OBJECT (priv->download), "download-action",
- GINT_TO_POINTER (DOWNLOAD_ACTION_DOWNLOAD));
- }
-
- if (priv->flags & EPHY_EMBED_PERSIST_ASK_DESTINATION)
- {
- EphyFileChooser *dialog;
- GtkWidget *window;
- const char *suggested_filename;
-
- suggested_filename = webkit_download_get_suggested_filename (priv->download);
- window = GTK_WIDGET (priv->fc_parent);
-
- dialog = ephy_file_chooser_new (priv->fc_title ?
- priv->fc_title : _("Save"),
- window,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- priv->persist_key,
- EPHY_FILE_FILTER_ALL);
-
- gtk_file_chooser_set_do_overwrite_confirmation
- (GTK_FILE_CHOOSER (dialog), TRUE);
- gtk_file_chooser_set_current_name
- (GTK_FILE_CHOOSER (dialog), suggested_filename);
-
- g_signal_connect (dialog, "response",
- G_CALLBACK (response_cb), persist);
-
- gtk_widget_show (GTK_WIDGET (dialog));
-
- return TRUE;
- }
- else
- {
- char *dest_uri;
-
- if (priv->dest)
- {
- dest_uri = g_filename_to_uri (priv->dest, NULL, NULL);
- }
- else
- {
- const char *suggested_filename = NULL;
- char *downloads_dir;
- char *dest_filename;
-
- suggested_filename = webkit_download_get_suggested_filename (priv->download);
-
- if (suggested_filename == NULL)
- {
- g_object_unref (persist);
- return FALSE;
- }
-
- downloads_dir = ephy_file_get_downloads_dir ();
- dest_filename = g_build_filename (downloads_dir,
- suggested_filename,
- NULL);
- g_free (downloads_dir);
-
- priv->dest = dest_filename;
- dest_uri = g_filename_to_uri (dest_filename, NULL, NULL);
- }
-
- if (priv->dview)
- downloader_view_add_download (priv->dview, priv->download);
-
- webkit_download_set_destination_uri (priv->download, dest_uri);
- webkit_download_start (priv->download);
-
- g_free (dest_uri);
-
- return TRUE;
- }
-
- g_object_unref (persist);
- return FALSE;
-}
-
-/**
- * ephy_embed_persist_to_string:
- * @persist: an #EphyEmbedPersist
- *
- * Returns the download specified by @persist as a string instead of downloading
- * it to a file.
- *
- * The download is synchronous. An #EphyEmbed must be specified with
- * ephy_embed_persist_set_embed(). The function implicitly assumes that
- * @persist's #EphyEmbedPersistFlags include %EPHY_EMBED_PERSIST_COPY_PAGE. If @persist's
- * #EphyEmbed has not finished downloading, this function will only return the
- * portion of data which has already been downloaded.
- *
- * The document will be modified: it will only include absolute links and it
- * will be encoded as UTF-8.
- *
- * Return value: The contents of @persist's #EphyEmbed's web page
- **/
-char *
-ephy_embed_persist_to_string (EphyEmbedPersist *persist)
-{
- g_return_val_if_fail (EPHY_IS_EMBED_PERSIST (persist), NULL);
- return NULL;
-}