[rhythmbox] removable-media: rework track transfer error handling



commit c30dc539855c0b851a27ea3b63417f452f9ab6e1
Author: Jonathan Matthew <jonathan d14n org>
Date:   Sat Oct 10 14:42:10 2009 +1000

    removable-media: rework track transfer error handling
    
    Now we pass the error to the callback, rather than handling it
    internally, and there's a track_add_error method on
    RemovableMediaSource, so sources can do specific error handling and
    reporting if they want.

 bindings/python/rb.override         |    3 ++-
 shell/rb-removable-media-manager.c  |   16 ++++------------
 shell/rb-removable-media-manager.h  |    1 +
 sources/rb-library-source.c         |   12 ++++++++++--
 sources/rb-removable-media-source.c |   29 +++++++++++++++++++++++++++--
 sources/rb-removable-media-source.h |    8 ++++++++
 6 files changed, 52 insertions(+), 17 deletions(-)
---
diff --git a/bindings/python/rb.override b/bindings/python/rb.override
index a961374..c42df81 100644
--- a/bindings/python/rb.override
+++ b/bindings/python/rb.override
@@ -1386,7 +1386,7 @@ typedef struct {
 } PyCallbackData;
 
 static void
-_rb_removable_media_manager_queue_transfer_func (RhythmDBEntry *entry, const char *dest, PyCallbackData *data)
+_rb_removable_media_manager_queue_transfer_func (RhythmDBEntry *entry, const char *dest, GError *error, PyCallbackData *data)
 {
 	PyObject *args;
 	PyObject *result;
@@ -1395,6 +1395,7 @@ _rb_removable_media_manager_queue_transfer_func (RhythmDBEntry *entry, const cha
 
 	__py_state = pyg_gil_state_ensure();
 
+	/* XXX no idea what to do with the error here.. */
 	py_entry = pyg_boxed_new (RHYTHMDB_TYPE_ENTRY, entry, FALSE, FALSE);
 	if (data->data) {
 		args = Py_BuildValue ("(OsO)", py_entry, dest, data->data);
diff --git a/shell/rb-removable-media-manager.c b/shell/rb-removable-media-manager.c
index fbf429a..2773761 100644
--- a/shell/rb-removable-media-manager.c
+++ b/shell/rb-removable-media-manager.c
@@ -1070,7 +1070,7 @@ typedef struct {
 	char *dest;
 	guint64 dest_size;
 	GList *mime_types;
-	gboolean failed;
+	GError *error;
 	RBTransferCompleteCallback callback;
 	gpointer userdata;
 } TransferData;
@@ -1089,17 +1089,9 @@ emit_progress (RBRemovableMediaManager *mgr)
 static void
 error_cb (RBEncoder *encoder, GError *error, TransferData *data)
 {
-	/* ignore 'file exists' */
-	if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
-		rb_debug ("ignoring 'file exists' error for %s", data->dest);
-		data->failed = TRUE;
-		return;
-	}
-
 	rb_debug ("Error transferring track to %s: %s", data->dest, error->message);
-	rb_error_dialog (NULL, _("Error transferring track"), "%s", error->message);
 
-	data->failed = TRUE;
+	data->error = g_error_copy (error);
 	rb_encoder_cancel (encoder);
 }
 
@@ -1119,8 +1111,7 @@ completed_cb (RBEncoder *encoder, TransferData *data)
 	RBRemovableMediaManagerPrivate *priv = GET_PRIVATE (data->manager);
 
 	rb_debug ("completed transferring track to %s", data->dest);
-	if (!data->failed)
-		(data->callback) (data->entry, data->dest, data->userdata);
+	(data->callback) (data->entry, data->dest, data->error, data->userdata);
 
 	priv->transfer_running = FALSE;
 	priv->transfer_done++;
@@ -1130,6 +1121,7 @@ completed_cb (RBEncoder *encoder, TransferData *data)
 	g_object_unref (G_OBJECT (encoder));
 	g_free (data->dest);
 	rb_list_deep_free (data->mime_types);
+	g_clear_error (&data->error);
 	g_free (data);
 }
 
diff --git a/shell/rb-removable-media-manager.h b/shell/rb-removable-media-manager.h
index 575ff1f..f12052d 100644
--- a/shell/rb-removable-media-manager.h
+++ b/shell/rb-removable-media-manager.h
@@ -49,6 +49,7 @@ G_BEGIN_DECLS
 
 typedef void (*RBTransferCompleteCallback) (RhythmDBEntry *entry,
 					    const char *dest,
+					    GError *error,
 					    gpointer userdata);
 
 typedef struct _RBRemovableMediaManager RBRemovableMediaManager;
diff --git a/sources/rb-library-source.c b/sources/rb-library-source.c
index dc55c6b..e3a74f5 100644
--- a/sources/rb-library-source.c
+++ b/sources/rb-library-source.c
@@ -1206,9 +1206,17 @@ impl_can_paste (RBSource *asource)
 }
 
 static void
-completed_cb (RhythmDBEntry *entry, const char *dest, RBLibrarySource *source)
+completed_cb (RhythmDBEntry *entry, const char *dest, GError *error, RBLibrarySource *source)
 {
-	rhythmdb_add_uri (source->priv->db, dest);
+	if (error == NULL) {
+		rhythmdb_add_uri (source->priv->db, dest);
+	} else {
+		if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
+			rb_debug ("not displaying 'file exists' error for %s", dest);
+		} else {
+			rb_error_dialog (NULL, _("Error transferring track"), "%s", error->message);
+		}
+	}
 }
 
 static void
diff --git a/sources/rb-removable-media-source.c b/sources/rb-removable-media-source.c
index 50b2478..6ef4a4d 100644
--- a/sources/rb-removable-media-source.c
+++ b/sources/rb-removable-media-source.c
@@ -313,9 +313,13 @@ struct _TrackAddedData {
 };
 
 static void
-_track_added_cb (RhythmDBEntry *entry, const char *uri, struct _TrackAddedData *data)
+_track_added_cb (RhythmDBEntry *entry, const char *uri, GError *error, struct _TrackAddedData *data)
 {
-	rb_removable_media_source_track_added (data->source, entry, uri, data->mimetype);
+	if (error == NULL) {
+		rb_removable_media_source_track_added (data->source, entry, uri, data->mimetype);
+	} else {
+		rb_removable_media_source_track_add_error (data->source, entry, uri, error);
+	}
 	g_free (data->mimetype);
 	g_free (data);
 }
@@ -724,3 +728,24 @@ rb_removable_media_source_track_added (RBRemovableMediaSource *source,
 	}
 }
 
+void
+rb_removable_media_source_track_add_error (RBRemovableMediaSource *source,
+					   RhythmDBEntry *entry,
+					   const char *uri,
+					   GError *error)
+{
+	RBRemovableMediaSourceClass *klass = RB_REMOVABLE_MEDIA_SOURCE_GET_CLASS (source);
+	gboolean show_dialog = TRUE;
+
+	if (klass->impl_track_add_error)
+		show_dialog = klass->impl_track_add_error (source, entry, uri, error);
+
+	if (show_dialog) {
+		if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
+			rb_debug ("not displaying 'file exists' error for %s", uri);
+		} else {
+			rb_error_dialog (NULL, _("Error transferring track"), "%s", error->message);
+		}
+	}
+}
+
diff --git a/sources/rb-removable-media-source.h b/sources/rb-removable-media-source.h
index 0a59f8b..07dd78d 100644
--- a/sources/rb-removable-media-source.h
+++ b/sources/rb-removable-media-source.h
@@ -61,6 +61,10 @@ typedef struct
 						 RhythmDBEntry *entry,
 						 const char *uri,
 						 const char *mimetype);
+	gboolean	(*impl_track_add_error) (RBRemovableMediaSource *source,
+						 RhythmDBEntry *entry,
+						 const char *uri,
+						 GError *error);
 	gboolean	(*impl_should_paste)	(RBRemovableMediaSource *source,
 						 RhythmDBEntry *entry);
 } RBRemovableMediaSourceClass;
@@ -78,6 +82,10 @@ void		rb_removable_media_source_track_added		(RBRemovableMediaSource *source,
 								 RhythmDBEntry *entry,
 								 const char *uri,
 								 const char *mimetype);
+void		rb_removable_media_source_track_add_error	(RBRemovableMediaSource *source,
+								 RhythmDBEntry *entry,
+								 const char *uri,
+								 GError *error);
 GList *		rb_removable_media_source_get_mime_types	(RBRemovableMediaSource *source);
 gboolean	rb_removable_media_source_should_paste		(RBRemovableMediaSource *source,
 								 RhythmDBEntry *entry);



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