[rhythmbox] removable-media: rework track transfer error handling
- From: Jonathan Matthew <jmatthew src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [rhythmbox] removable-media: rework track transfer error handling
- Date: Sat, 10 Oct 2009 05:23:28 +0000 (UTC)
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]