gnome-control-center r8530 - in trunk/capplets: appearance common



Author: jensg
Date: Wed Feb 27 21:14:25 2008
New Revision: 8530
URL: http://svn.gnome.org/viewvc/gnome-control-center?rev=8530&view=rev

Log:
2008-02-27  Jens Granseuer  <jensgr gmx net>

	* file-transfer-dialog.c: (file_transfer_dialog_update_num_files),
	(file_transfer_dialog_response), (file_transfer_dialog_finalize),
	(file_transfer_dialog_set_prop), (file_transfer_dialog_class_init),
	(file_transfer_dialog_init), (file_transfer_dialog_get_type),
	(file_transfer_job_update_before),
	(file_transfer_job_update_after), (file_transfer_job_destroy),
	(file_transfer_dialog_done), (file_transfer_dialog_cancel),
	(file_transfer_job_schedule), (file_transfer_dialog_copy_async):
	* file-transfer-dialog.h: port to gio

2008-02-27  Jens Granseuer  <jensgr gmx net>

	* theme-installer.c: (gnome_theme_install_from_uri): adapt to new
	FileTransferDialog that uses gio instead of GnomeVFS


Modified:
   trunk/capplets/appearance/ChangeLog
   trunk/capplets/appearance/theme-installer.c
   trunk/capplets/common/ChangeLog
   trunk/capplets/common/file-transfer-dialog.c
   trunk/capplets/common/file-transfer-dialog.h

Modified: trunk/capplets/appearance/theme-installer.c
==============================================================================
--- trunk/capplets/appearance/theme-installer.c	(original)
+++ trunk/capplets/appearance/theme-installer.c	Wed Feb 27 21:14:25 2008
@@ -23,15 +23,10 @@
 #include "appearance.h"
 
 #include <string.h>
-#include <libwindow-settings/gnome-wm-manager.h>
-#include <libgnomevfs/gnome-vfs-async-ops.h>
-#include <libgnomevfs/gnome-vfs-ops.h>
-#include <libgnomevfs/gnome-vfs-utils.h>
-
-#include "gnome-theme-info.h"
-#include "capplet-util.h"
-#include "activate-settings-daemon.h"
-#include "gconf-property-editor.h"
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
 #include "file-transfer-dialog.h"
 #include "theme-installer.h"
 #include "theme-util.h"
@@ -566,7 +561,6 @@
 	GtkWidget *dialog;
 	gchar *path, *base;
 	GList *src, *target;
-	GnomeVFSURI *uri;
 	gchar *temppath;
 	const gchar *template;
 	int cmp;
@@ -624,9 +618,7 @@
 		return;
 	}
 
-	uri = gnome_vfs_uri_new (filename);
-	base = gnome_vfs_uri_extract_short_name (uri);
-	src = g_list_append (NULL, uri);
+	base = g_path_get_basename (filename);
 
 	if (g_str_has_suffix (base, ".tar.gz") || g_str_has_suffix (base, ".tgz") || g_str_has_suffix (base, ".gtp"))
 		template = "gnome-theme-%d.gtp";
@@ -640,33 +632,36 @@
 	}
 	g_free (base);
 
+	src = g_list_append (NULL, g_strdup (filename));
+
 	path = NULL;
 	do {
 	  	gchar *file_tmp;
 
 		g_free (path);
-    		file_tmp = g_strdup_printf (template, rand ());
+    		file_tmp = g_strdup_printf (template, g_random_int ());
 	    	path = g_build_filename (g_get_home_dir (), ".themes", file_tmp, NULL);
 	  	g_free (file_tmp);
 	} while (g_file_test (path, G_FILE_TEST_EXISTS));
 
 
-	target = g_list_append (NULL, gnome_vfs_uri_new (path));
+	target = g_list_append (NULL, path);
 
 	dialog = file_transfer_dialog_new_with_parent (parent);
-	file_transfer_dialog_wrap_async_xfer (FILE_TRANSFER_DIALOG (dialog),
-					      src, target,
-					      GNOME_VFS_XFER_RECURSIVE,
-					      GNOME_VFS_XFER_ERROR_MODE_QUERY,
-					      GNOME_VFS_XFER_OVERWRITE_MODE_QUERY,
-					      GNOME_VFS_PRIORITY_DEFAULT);
-	gnome_vfs_uri_list_unref (src);
-	gnome_vfs_uri_list_unref (target);
-	g_signal_connect (G_OBJECT (dialog), "cancel",
-			  G_CALLBACK (transfer_cancel_cb), path);
-	g_signal_connect (G_OBJECT (dialog), "done",
-			  G_CALLBACK (transfer_done_cb), path);
+	g_signal_connect (dialog, "cancel",
+			  (GCallback) transfer_cancel_cb, path);
+	g_signal_connect (dialog, "done",
+			  (GCallback) transfer_done_cb, path);
+
+	file_transfer_dialog_copy_async (FILE_TRANSFER_DIALOG (dialog),
+					 src, target,
+					 G_PRIORITY_DEFAULT);
 	gtk_widget_show (dialog);
+
+	g_list_foreach (src, (GFunc) g_free, NULL);
+	/* don't free the target item since we're using that for the signals */
+	g_list_free (src);
+	g_list_free (target);
 }
 
 void

Modified: trunk/capplets/common/file-transfer-dialog.c
==============================================================================
--- trunk/capplets/common/file-transfer-dialog.c	(original)
+++ trunk/capplets/common/file-transfer-dialog.c	Wed Feb 27 21:14:25 2008
@@ -1,9 +1,8 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
 /* file-transfer-dialog.c
  * Copyright (C) 2002 Ximian, Inc.
  *
  * Written by Rachel Hestilow <hestilow ximian com>
+ *            Jens Granseuer <jensgr gmx net>
  *
  * 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
@@ -28,8 +27,7 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
-#include <libgnomevfs/gnome-vfs-async-ops.h>
-#include <libgnomevfs/gnome-vfs-utils.h>
+#include <gio/gio.h>
 #include <limits.h>
 
 #include "file-transfer-dialog.h"
@@ -60,39 +58,31 @@
 	GtkWidget *status;
 	guint nth;
 	guint total;
-	GnomeVFSAsyncHandle *handle;
+	GCancellable *cancellable;
 };
 
-static GObjectClass *parent_class;
+#define FILE_TRANSFER_DIALOG_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), file_transfer_dialog_get_type (), FileTransferDialogPrivate))
 
-static void
-file_transfer_dialog_cancel (FileTransferDialog *dlg)
-{
-	if (dlg->priv->handle)
-	{
-		gnome_vfs_async_cancel (dlg->priv->handle);
-		dlg->priv->handle = NULL;
-	}
-}
-
-static void
-file_transfer_dialog_finalize (GObject *obj)
+typedef struct _FileTransferJob
 {
-	FileTransferDialog *dlg = FILE_TRANSFER_DIALOG (obj);
+	FileTransferDialog *dialog;
+	GSList *source_uris;
+	GSList *target_uris;
+} FileTransferJob;
 
-	g_free (dlg->priv);
 
-	if (parent_class->finalize)
-		parent_class->finalize (G_OBJECT (dlg));
-}
+static GObjectClass *parent_class;
 
 static void
 file_transfer_dialog_update_num_files (FileTransferDialog *dlg)
 {
-	gchar *str = NULL;
-	if (dlg->priv->total > 1)
-		str = g_strdup_printf (_("Copying file: %u of %u"),
-				      dlg->priv->nth, dlg->priv->total);
+	gchar *str;
+
+	if (dlg->priv->total <= 1)
+		return;
+
+	str = g_strdup_printf (_("Copying file: %u of %u"),
+			      dlg->priv->nth, dlg->priv->total);
 	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (dlg->priv->progress), str);
 	g_free (str);
 }
@@ -100,65 +90,54 @@
 static void
 file_transfer_dialog_response (GtkDialog *dlg, gint response_id)
 {
-	g_signal_emit (G_OBJECT (dlg),
-		       file_transfer_dialog_signals[CANCEL], 0, NULL);
+	FileTransferDialog *dialog = FILE_TRANSFER_DIALOG (dlg);
+
+	g_cancellable_cancel (dialog->priv->cancellable);
 }
 
-static gchar *
-format_uri_for_display (const gchar *uri)
+static void
+file_transfer_dialog_finalize (GObject *object)
 {
-	GnomeVFSURI *vfs_uri;
-
-	g_return_val_if_fail (uri != NULL, NULL);
-
-	/* Note: vfs_uri may be NULL for some valid but
-	 * unsupported uris */
-	vfs_uri = gnome_vfs_uri_new (uri);
-
-	if (vfs_uri == NULL) {
-		/* We may disclose the password here, but there is nothing we
-		 * can do since we cannot get a valid vfs_uri */
-		return gnome_vfs_format_uri_for_display (uri);
-	} else {
-		gchar *name;
-		gchar *uri_for_display;
-
-		name = gnome_vfs_uri_to_string (vfs_uri, GNOME_VFS_URI_HIDE_PASSWORD);
-		g_return_val_if_fail (name != NULL, gnome_vfs_format_uri_for_display (uri));
-
-		uri_for_display = gnome_vfs_format_uri_for_display (name);
-		g_free (name);
-
-		gnome_vfs_uri_unref (vfs_uri);
+	FileTransferDialog *dlg = FILE_TRANSFER_DIALOG (object);
 
-		return uri_for_display;
+	if (dlg->priv->cancellable)
+	{
+		g_object_unref (dlg->priv->cancellable);
+		dlg->priv->cancellable = NULL;
 	}
+
+	if (parent_class->finalize)
+		parent_class->finalize (object);
 }
 
 static void
 file_transfer_dialog_set_prop (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
 {
 	FileTransferDialog *dlg = FILE_TRANSFER_DIALOG (object);
+	GFile *file;
 	gchar *str;
 	gchar *str2;
 	gchar *base;
 	gchar *escaped;
 	GtkWindow *parent;
+	guint n;
 
 	switch (prop_id)
 	{
 	case PROP_FROM_URI:
-		base = g_path_get_basename (g_value_get_string (value));
-		escaped = format_uri_for_display (base);
+		file = g_file_new_for_uri (g_value_get_string (value));
+		base = g_file_get_basename (file);
+		escaped = g_uri_escape_string (base, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, TRUE);
 
 		str = g_strdup_printf (_("Copying '%s'"), escaped);
 		str2 = g_strdup_printf ("<big><b>%s</b></big>", str);
-		gtk_label_set_markup (GTK_LABEL (dlg->priv->status),
-				      str2);
+		gtk_label_set_markup (GTK_LABEL (dlg->priv->status), str2);
+
 		g_free (base);
 		g_free (escaped);
 		g_free (str);
 		g_free (str2);
+		g_object_unref (file);
 		break;
 	case PROP_TO_URI:
 		break;
@@ -166,12 +145,20 @@
 		gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (dlg->priv->progress), g_value_get_double (value));
 		break;
 	case PROP_NTH_URI:
-		dlg->priv->nth = g_value_get_uint (value);
-		file_transfer_dialog_update_num_files (dlg);
+		n = g_value_get_uint (value);
+		if (n != dlg->priv->nth)
+		{
+			dlg->priv->nth = g_value_get_uint (value);
+			file_transfer_dialog_update_num_files (dlg);
+		}
 		break;
 	case PROP_TOTAL_URIS:
-		dlg->priv->total = g_value_get_uint (value);
-		file_transfer_dialog_update_num_files (dlg);
+		n = g_value_get_uint (value);
+		if (n != dlg->priv->nth)
+		{
+			dlg->priv->total = g_value_get_uint (value);
+			file_transfer_dialog_update_num_files (dlg);
+		}
 		break;
 	case PROP_PARENT:
 		parent = g_value_get_pointer (value);
@@ -208,7 +195,6 @@
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-	klass->cancel = file_transfer_dialog_cancel;
 	object_class->finalize = file_transfer_dialog_finalize;
 	object_class->get_property = file_transfer_dialog_get_prop;
 	object_class->set_property = file_transfer_dialog_set_prop;
@@ -266,7 +252,7 @@
 		g_signal_new ("cancel",
 			      G_TYPE_FROM_CLASS (object_class),
 			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (FileTransferDialogClass, cancel),
+			      0,
 			      NULL, NULL,
 			      g_cclosure_marshal_VOID__VOID,
 			      G_TYPE_NONE, 0);
@@ -275,11 +261,13 @@
 		g_signal_new ("done",
 			      G_TYPE_FROM_CLASS (object_class),
 			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (FileTransferDialogClass, done),
+			      0,
 			      NULL, NULL,
 			      g_cclosure_marshal_VOID__VOID,
 			      G_TYPE_NONE, 0);
 
+        g_type_class_add_private (klass, sizeof (FileTransferDialogPrivate));
+
 	parent_class =
 		G_OBJECT_CLASS (g_type_class_ref (GTK_TYPE_DIALOG));
 }
@@ -293,7 +281,8 @@
 	GtkWidget *table;
 	char      *markup;
 
-	dlg->priv = g_new0 (FileTransferDialogPrivate, 1);
+        dlg->priv = FILE_TRANSFER_DIALOG_GET_PRIVATE (dlg);
+	dlg->priv->cancellable = g_cancellable_new ();
 
 	gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dlg)->vbox),
 					4);
@@ -346,7 +335,7 @@
 
 	if (!file_transfer_dialog_type)
 	{
-		static GTypeInfo file_transfer_dialog_info =
+		const GTypeInfo file_transfer_dialog_info =
 		{
 			sizeof (FileTransferDialogClass),
 			NULL, /* GBaseInitFunc */
@@ -384,84 +373,154 @@
 					 "parent", parent, NULL));
 }
 
+static void
+file_transfer_job_update_before (FileTransferJob *job)
+{
+	gchar *from, *to;
+
+	from = job->source_uris->data;
+	to = job->target_uris->data;
+
+	g_object_set (job->dialog,
+		      "from_uri", from,
+		      "to_uri", to,
+		      NULL);
+}
+
+static void
+file_transfer_job_update_after (FileTransferJob *job)
+{
+	guint n, total;
+
+	n = job->dialog->priv->nth + 1;
+	total = job->dialog->priv->total;
+
+	g_object_set (job->dialog,
+		      "nth_uri", n,
+		      "fraction_complete", ((gdouble) n) / total,
+		      NULL);
+}
+
+static void
+file_transfer_job_destroy (FileTransferJob *job)
+{
+	g_object_unref (job->dialog);
+	g_slist_foreach (job->source_uris, (GFunc) g_free, NULL);
+	g_slist_foreach (job->target_uris, (GFunc) g_free, NULL);
+	g_slist_free (job->source_uris);
+	g_slist_free (job->target_uris);
+	g_free (job);
+}
+
+static gboolean
+file_transfer_dialog_done (FileTransferDialog *dialog)
+{
+	g_signal_emit (dialog,
+		       file_transfer_dialog_signals[DONE],
+		       0, NULL);
+	return FALSE;
+}
+
+static gboolean
+file_transfer_dialog_cancel (FileTransferDialog *dialog)
+{
+	g_signal_emit (dialog,
+		       file_transfer_dialog_signals[CANCEL],
+		       0, NULL);
+	return FALSE;
+}
+
+static gboolean
+file_transfer_job_schedule (GIOSchedulerJob *io_job,
+			    GCancellable *cancellable,
+			    FileTransferJob *job)
+{
+	GFile *source, *target;
+	gboolean success;
+
+	g_io_scheduler_job_send_to_mainloop (io_job,
+					     (GSourceFunc) file_transfer_job_update_before,
+					     job,
+					     NULL);
+
+	/* take the first file from the list and copy it */
+	source = g_file_new_for_path (job->source_uris->data);
+	g_free (job->source_uris->data);
+	job->source_uris = g_slist_delete_link (job->source_uris, job->source_uris);
+
+	target = g_file_new_for_path (job->target_uris->data);
+	g_free (job->target_uris->data);
+	job->target_uris = g_slist_delete_link (job->target_uris, job->target_uris);
 
-static int
-file_transfer_dialog_update_cb (GnomeVFSAsyncHandle *handle,
-				GnomeVFSXferProgressInfo *info,
-				gpointer data)
-{
-	FileTransferDialog *dlg = FILE_TRANSFER_DIALOG (data);
-
-	if (info->status == GNOME_VFS_XFER_PROGRESS_STATUS_VFSERROR)
-		return GNOME_VFS_XFER_ERROR_ACTION_ABORT;
-
-	if (info->source_name)
-		g_object_set (G_OBJECT (dlg),
-			      "from_uri", info->source_name,
-			      NULL);
-	if (info->target_name)
-		g_object_set (G_OBJECT (dlg),
-			      "to_uri", info->target_name,
-			      NULL);
-
-	if (info->bytes_total)
-		g_object_set (G_OBJECT (dlg),
-			      "fraction_complete", (double) info->total_bytes_copied / (double) info->bytes_total,
-			      NULL);
-
-	if (info->file_index && info->files_total)
-		g_object_set (G_OBJECT (dlg),
-			      "nth_uri", info->file_index,
-			      "total_uris", info->files_total,
-			      NULL);
+	success = g_file_copy (source, target,
+			       G_FILE_COPY_NONE,
+			       job->dialog->priv->cancellable,
+			       NULL, NULL, NULL);
 
-	switch (info->phase)
+	g_object_unref (source);
+	g_object_unref (target);
+
+	if (success)
 	{
-	case GNOME_VFS_XFER_PHASE_INITIAL:
+		g_io_scheduler_job_send_to_mainloop (io_job,
+						     (GSourceFunc) file_transfer_job_update_after,
+						     job,
+						     NULL);
+
+		if (job->source_uris == NULL)
 		{
-			char *str = g_strdup_printf ("<big><b>%s</b></big>", _("Connecting..."));
-			gtk_label_set_markup (GTK_LABEL (dlg->priv->status),
-					      str);
-			g_free (str);
+			g_io_scheduler_job_send_to_mainloop_async (io_job,
+								   (GSourceFunc) file_transfer_dialog_done,
+								   g_object_ref (job->dialog),
+								   g_object_unref);
+			return FALSE;
 		}
-		break;
-	case GNOME_VFS_XFER_PHASE_READYTOGO:
-	case GNOME_VFS_XFER_PHASE_OPENSOURCE:
-		break;
-	case GNOME_VFS_XFER_PHASE_COMPLETED:
-		g_signal_emit (G_OBJECT (dlg),
-			       file_transfer_dialog_signals[DONE],
-			       0, NULL);
-		return 0;
-	default:
-		break;
+	}
+	else /* error on copy or cancelled */
+	{
+		g_io_scheduler_job_send_to_mainloop_async (io_job,
+							   (GSourceFunc) file_transfer_dialog_cancel,
+							   g_object_ref (job->dialog),
+							   g_object_unref);
+		return FALSE;
 	}
 
-	return 1;
+	/* more work to do... */
+	return TRUE;
 }
 
-GnomeVFSResult
-file_transfer_dialog_wrap_async_xfer (FileTransferDialog *dlg,
-				      GList *source_uri_list,
-				      GList *target_uri_list,
-				      GnomeVFSXferOptions xfer_options,
-				      GnomeVFSXferErrorMode error_mode,
-				      GnomeVFSXferOverwriteMode overwrite_mode,
-				      int priority)
-{
-	g_return_val_if_fail (IS_FILE_TRANSFER_DIALOG (dlg),
-			      GNOME_VFS_ERROR_BAD_PARAMETERS);
-
-	return gnome_vfs_async_xfer (&dlg->priv->handle,
-				     source_uri_list,
-				     target_uri_list,
-				     xfer_options,
-				     error_mode,
-				     overwrite_mode,
-				     priority,
-				     file_transfer_dialog_update_cb,
-				     dlg,
-				     NULL,
-				     NULL
-				   );
+void
+file_transfer_dialog_copy_async (FileTransferDialog *dlg,
+				 GList *source_files,
+				 GList *target_files,
+				 int priority)
+{
+	FileTransferJob *job;
+	GList *l;
+	guint n;
+
+	job = g_new0 (FileTransferJob, 1);
+	job->dialog = g_object_ref (dlg);
+
+	/* we need to copy the list contents for private use */
+	n = 0;
+	for (l = g_list_last (source_files); l; l = l->prev, ++n)
+	{
+		job->source_uris = g_slist_prepend (job->source_uris,
+						    g_strdup (l->data));
+	}
+	for (l = g_list_last (target_files); l; l = l->prev)
+	{
+		job->target_uris = g_slist_prepend (job->target_uris,
+						    g_strdup (l->data));
+	}
+
+	g_object_set (dlg, "total_uris", n, NULL);
+
+	/* TODO: support transferring directories recursively? */
+	g_io_scheduler_push_job ((GIOSchedulerJobFunc) file_transfer_job_schedule,
+				 job,
+				 (GDestroyNotify) file_transfer_job_destroy,
+				 priority,
+				 dlg->priv->cancellable);
 }

Modified: trunk/capplets/common/file-transfer-dialog.h
==============================================================================
--- trunk/capplets/common/file-transfer-dialog.h	(original)
+++ trunk/capplets/common/file-transfer-dialog.h	Wed Feb 27 21:14:25 2008
@@ -3,7 +3,7 @@
 /* file-transfer-dialog.h
  * Copyright (C) 2002 Ximian, Inc.
  *
- * Written by Rachel Hestilow <hestilow ximian com> 
+ * Written by Rachel Hestilow <hestilow ximian com>
  *
  * 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
@@ -25,7 +25,6 @@
 #define __FILE_TRANSFER_DIALOG_H__
 
 #include <gtk/gtkdialog.h>
-#include <libgnomevfs/gnome-vfs-xfer.h>
 
 G_BEGIN_DECLS
 
@@ -47,22 +46,16 @@
 struct _FileTransferDialogClass
 {
 	GtkDialogClass parent_class;
-
-	void (*cancel) (FileTransferDialog *dlg);
-	void (*done) (FileTransferDialog *dlg);
 };
 
 GType	       file_transfer_dialog_get_type (void);
 GtkWidget*     file_transfer_dialog_new (void);
 GtkWidget*     file_transfer_dialog_new_with_parent (GtkWindow *parent);
 
-GnomeVFSResult file_transfer_dialog_wrap_async_xfer (FileTransferDialog *dlg,
-						     GList *source_uri_list,
-						     GList *target_uri_list,
-						     GnomeVFSXferOptions xfer_options,
-						     GnomeVFSXferErrorMode error_mode,
-						     GnomeVFSXferOverwriteMode overwrite_mode,
-						     int priority);
+void	       file_transfer_dialog_copy_async (FileTransferDialog *dlg,
+						GList *source_files,
+						GList *target_files,
+						int priority);
 
 
 G_END_DECLS



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]