[rhythmbox] media-player: use the batch to monitor the transfer of files to the device



commit 43775f8751b1b7a05833e8b13bce238bd66f173f
Author: Jonathan Matthew <jonathan d14n org>
Date:   Tue Aug 3 15:37:14 2010 +1000

    media-player: use the batch to monitor the transfer of files to the device
    
    Rather than using the track_added and track_add_error methods to manage the
    list of outstanding transfers, we can just wait for the batch to complete or be
    cancelled.

 plugins/ipod/rb-ipod-source.c     |    3 -
 plugins/mtpdevice/rb-mtp-source.c |    5 --
 sources/rb-media-player-source.c  |   77 ++++++++++---------------------------
 3 files changed, 20 insertions(+), 65 deletions(-)
---
diff --git a/plugins/ipod/rb-ipod-source.c b/plugins/ipod/rb-ipod-source.c
index 735b6bb..2f8b018 100644
--- a/plugins/ipod/rb-ipod-source.c
+++ b/plugins/ipod/rb-ipod-source.c
@@ -1485,9 +1485,6 @@ impl_track_added (RBRemovableMediaSource *source,
 
 	g_object_unref (db);
 
-	/* chain up to parent class for sync */
-	RB_REMOVABLE_MEDIA_SOURCE_CLASS (rb_ipod_source_parent_class)->impl_track_added (source, entry, dest, filesize, mimetype);
-
 	return FALSE;
 }
 
diff --git a/plugins/mtpdevice/rb-mtp-source.c b/plugins/mtpdevice/rb-mtp-source.c
index 3a44337..1f1b66f 100644
--- a/plugins/mtpdevice/rb-mtp-source.c
+++ b/plugins/mtpdevice/rb-mtp-source.c
@@ -1127,9 +1127,6 @@ impl_track_added (RBRemovableMediaSource *source,
 		g_idle_add ((GSourceFunc) request_album_art_idle, artdata);
 	}
 	queue_free_space_update (RB_MTP_SOURCE (source));
-
-	/* chain up to parent class for sync */
-	RB_REMOVABLE_MEDIA_SOURCE_CLASS (rb_mtp_source_parent_class)->impl_track_added (source, entry, dest, filesize, mimetype);
 	return FALSE;
 }
 
@@ -1149,8 +1146,6 @@ impl_track_add_error (RBRemovableMediaSource *source,
 		rb_debug ("track-add-error called, but can't find a track for dest URI %s", dest);
 	}
 
-	/* chain up to parent class for sync */
-	RB_REMOVABLE_MEDIA_SOURCE_CLASS (rb_mtp_source_parent_class)->impl_track_add_error (source, entry, dest, error);
 	return TRUE;
 }
 
diff --git a/sources/rb-media-player-source.c b/sources/rb-media-player-source.c
index 4c21b4e..b548fac 100644
--- a/sources/rb-media-player-source.c
+++ b/sources/rb-media-player-source.c
@@ -66,7 +66,6 @@ typedef struct {
 
 	/* sync state */
 	RBSyncState *sync_state;
-	GList *sync_add_remaining;
 
 } RBMediaPlayerSourcePrivate;
 
@@ -88,19 +87,6 @@ static void rb_media_player_source_get_property (GObject *object,
 					 GParamSpec *pspec);
 static void rb_media_player_source_constructed (GObject *object);
 
-static gboolean rb_media_player_source_track_added (RBRemovableMediaSource *source,
-						    RhythmDBEntry *entry,
-						    const char *uri,
-						    guint64 dest_size,
-						    const char *mimetype);
-static gboolean rb_media_player_source_track_add_error (RBRemovableMediaSource *source,
-							RhythmDBEntry *entry,
-							const char *uri,
-							GError *error);
-
-static gboolean sync_idle_cb_update_sync (RBMediaPlayerSource *source);
-
-static void track_add_done (RBMediaPlayerSource *source, RhythmDBEntry *entry);
 static void sync_cmd (GtkAction *action, RBSource *source);
 static gboolean sync_idle_delete_entries (RBMediaPlayerSource *source);
 
@@ -144,7 +130,6 @@ static void
 rb_media_player_source_class_init (RBMediaPlayerSourceClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	RBRemovableMediaSourceClass *rms_class = RB_REMOVABLE_MEDIA_SOURCE_CLASS (klass);
 
 	object_class->dispose = rb_media_player_source_dispose;
 
@@ -152,9 +137,6 @@ rb_media_player_source_class_init (RBMediaPlayerSourceClass *klass)
 	object_class->get_property = rb_media_player_source_get_property;
 	object_class->constructed = rb_media_player_source_constructed;
 
-	rms_class->impl_track_added = rb_media_player_source_track_added;
-	rms_class->impl_track_add_error = rb_media_player_source_track_add_error;
-
 	klass->impl_get_entries = NULL;
 	klass->impl_get_capacity = NULL;
 	klass->impl_get_free_space = NULL;
@@ -242,27 +224,6 @@ rb_media_player_source_constructed (GObject *object)
 	priv->sync_action = gtk_action_group_get_action (action_group, "MediaPlayerSourceSync");
 }
 
-static gboolean
-rb_media_player_source_track_added (RBRemovableMediaSource *source,
-				    RhythmDBEntry *entry,
-				    const char *uri,
-				    guint64 dest_size,
-				    const char *mimetype)
-{
-	track_add_done (RB_MEDIA_PLAYER_SOURCE (source), entry);
-	return TRUE;
-}
-
-static gboolean
-rb_media_player_source_track_add_error (RBRemovableMediaSource *source,
-					RhythmDBEntry *entry,
-					const char *uri,
-					GError *error)
-{
-	track_add_done (RB_MEDIA_PLAYER_SOURCE (source), entry);
-	return TRUE;
-}
-
 /* must be called once device information is available via source properties */
 void
 rb_media_player_source_load		(RBMediaPlayerSource *source)
@@ -547,25 +508,21 @@ sync_idle_cb_playlists (RBMediaPlayerSource *source)
 }
 
 static void
-track_add_done (RBMediaPlayerSource *source, RhythmDBEntry *entry)
+transfer_batch_complete_cb (RBTrackTransferBatch *batch, RBMediaPlayerSource *source)
 {
-	RBMediaPlayerSourcePrivate *priv = MEDIA_PLAYER_SOURCE_GET_PRIVATE (source);
-	GList *l;
-	/* remove the entry from the set of transfers we're waiting for;
-	 * if the set is now empty, trigger the next sync stage.
-	 */
+	rb_debug ("finished transferring files to the device");
+	g_idle_add ((GSourceFunc) sync_idle_cb_playlists, source);
+}
 
-	l = g_list_find (priv->sync_add_remaining, entry);
-	if (l != NULL) {
-		priv->sync_add_remaining = g_list_remove_link (priv->sync_add_remaining, l);
-		if (priv->sync_add_remaining == NULL) {
-			rb_debug ("finished transferring files to the device");
-			g_idle_add ((GSourceFunc) sync_idle_cb_playlists, source);
-		}
-		rhythmdb_entry_unref (entry);
-	}
+static void
+transfer_batch_cancelled_cb (RBTrackTransferBatch *batch, RBMediaPlayerSource *source)
+{
+	/* don't try to update playlists, just clean up */
+	rb_debug ("sync file transfer to the device was cancelled");
+	g_idle_add ((GSourceFunc) sync_idle_cb_cleanup, source);
 }
 
+
 static void
 sync_delete_done_cb (RBMediaPlayerSource *source, gpointer dontcare)
 {
@@ -574,11 +531,17 @@ sync_delete_done_cb (RBMediaPlayerSource *source, gpointer dontcare)
 
 	/* Transfer needed tracks and podcasts from itinerary to device */
 	if (priv->sync_state->sync_add_count != 0) {
+		RBTrackTransferBatch *batch;
 
 		rb_debug ("transferring %d files to media player", priv->sync_state->sync_add_count);
-		priv->sync_add_remaining = g_list_copy (priv->sync_state->sync_to_add);
-		g_list_foreach (priv->sync_add_remaining, (GFunc) rhythmdb_entry_ref, NULL);
-		rb_source_paste (RB_SOURCE (source), priv->sync_add_remaining);
+		batch = rb_source_paste (RB_SOURCE (source), priv->sync_state->sync_to_add);
+		if (batch != NULL) {
+			g_signal_connect_object (batch, "complete", G_CALLBACK (transfer_batch_complete_cb), source, 0);
+			g_signal_connect_object (batch, "cancelled", G_CALLBACK (transfer_batch_cancelled_cb), source, 0);
+		} else {
+			rb_debug ("weird, transfer was apparently synchronous");
+			g_idle_add ((GSourceFunc) sync_idle_cb_playlists, source);
+		}
 	} else {
 		rb_debug ("no files to transfer to the device");
 		g_idle_add ((GSourceFunc) sync_idle_cb_playlists, source);



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