[rhythmbox] generic-player: transform URIs to the device filesystem conditionally



commit a3ea4460f3ee8e5e749347bec518f046691fd1bf
Author: Jonathan Matthew <jonathan d14n org>
Date:   Sat Jan 30 20:19:43 2010 +1000

    generic-player: transform URIs to the device filesystem conditionally
    
    For most playlist formats, we actually want to leave playlist entry URIs
    as-is, so totem-pl-parser can construct paths relative to the playlist
    file.  So, we add the playlist format as a parameter to
    uri_to_playlist_uri so it can be used to select the required behaviour.
    See bug #608397.

 .../rb-generic-player-playlist-source.c            |   35 ++++++++++---------
 plugins/generic-player/rb-generic-player-source.c  |   34 +++++++++++++------
 plugins/generic-player/rb-generic-player-source.h  |    5 ++-
 3 files changed, 44 insertions(+), 30 deletions(-)
---
diff --git a/plugins/generic-player/rb-generic-player-playlist-source.c b/plugins/generic-player/rb-generic-player-playlist-source.c
index 2ef328b..c56a503 100644
--- a/plugins/generic-player/rb-generic-player-playlist-source.c
+++ b/plugins/generic-player/rb-generic-player-playlist-source.c
@@ -63,6 +63,14 @@ enum {
 	PROP_PLAYER_SOURCE
 };
 
+typedef struct {
+	RBGenericPlayerPlaylistSource *source;
+#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
+	TotemPlPlaylist *playlist;
+#endif
+	TotemPlParserType playlist_type;
+} SavePlaylistData;
+
 
 static void
 impl_save_to_xml (RBPlaylistSource *source, xmlNodePtr node)
@@ -72,11 +80,6 @@ impl_save_to_xml (RBPlaylistSource *source, xmlNodePtr node)
 
 #if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
 
-typedef struct {
-	RBGenericPlayerPlaylistSource *source;
-	TotemPlPlaylist *playlist;
-} SavePlaylistData;
-
 static void
 set_field_from_property (TotemPlPlaylist *playlist,
 			 TotemPlPlaylistIter *iter,
@@ -110,7 +113,7 @@ save_playlist_foreach (GtkTreeModel *model,
 	}
 
 	host_uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
-	uri = rb_generic_player_source_uri_to_playlist_uri (priv->player_source, host_uri);
+	uri = rb_generic_player_source_uri_to_playlist_uri (priv->player_source, host_uri, data->format);
 
 	totem_pl_playlist_append (data->playlist, &pl_iter);
 	totem_pl_playlist_set (data->playlist, &pl_iter, TOTEM_PL_PARSER_FIELD_URI, uri, NULL);
@@ -129,9 +132,9 @@ static void
 save_playlist_entry (GtkTreeModel *model, GtkTreeIter *iter,
 		     char **uri, char **title,
 		     gboolean *custom_title,
-		     RBGenericPlayerPlaylistSource *source)
+		     SavePlaylistData *data)
 {
-	RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (source);
+	RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (data->source);
 	RhythmDBEntry *entry;
 	const char *host_uri;
 
@@ -142,7 +145,7 @@ save_playlist_entry (GtkTreeModel *model, GtkTreeIter *iter,
 	}
 
 	host_uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
-	*uri = rb_generic_player_source_uri_to_playlist_uri (priv->player_source, host_uri);
+	*uri = rb_generic_player_source_uri_to_playlist_uri (priv->player_source, host_uri, data->playlist_type);
 	*title = rhythmdb_entry_dup_string (entry, RHYTHMDB_PROP_TITLE);
 	*custom_title = TRUE;
 }
@@ -184,10 +187,7 @@ save_playlist (RBGenericPlayerPlaylistSource *source)
 	RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (source);
 	GFile *file;
 	gboolean result;
-#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
-	TotemPlPlaylist *playlist;
 	SavePlaylistData data;
-#endif
 
 	priv->save_playlist_id = 0;
 	playlist_type = rb_generic_player_source_get_playlist_format (priv->player_source);
@@ -240,10 +240,10 @@ save_playlist (RBGenericPlayerPlaylistSource *source)
 	file = g_file_new_for_path (temp_path);
 
 	parser = totem_pl_parser_new ();
-#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
-	playlist = totem_pl_playlist_new ();
 	data.source = source;
-	data.playlist = playlist;
+	data.playlist_type = playlist_type;
+#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
+	data.playlist = totem_pl_playlist_new ();
 
 	gtk_tree_model_foreach (GTK_TREE_MODEL (query_model),
 				(GtkTreeModelForeachFunc) save_playlist_foreach,
@@ -253,7 +253,8 @@ save_playlist (RBGenericPlayerPlaylistSource *source)
 	}
 
 	result = totem_pl_parser_save (parser, playlist, file, name, playlist_type, &error);
-	g_object_unref (playlist);
+	g_object_unref (data.playlist);
+	data.playlist = NULL;
 #else
 	if (rb_debug_matches ("totem_pl_parser_write_with_title", "totem-pl-parser.c")) {
 		g_object_set (parser, "debug", TRUE, NULL);
@@ -265,7 +266,7 @@ save_playlist (RBGenericPlayerPlaylistSource *source)
 						   temp_path,
 						   name,
 						   playlist_type,
-						   source,
+						   &data,
 						   &error);
 #endif
 	if (result == FALSE) {
diff --git a/plugins/generic-player/rb-generic-player-source.c b/plugins/generic-player/rb-generic-player-source.c
index e829a3e..500453c 100644
--- a/plugins/generic-player/rb-generic-player-source.c
+++ b/plugins/generic-player/rb-generic-player-source.c
@@ -84,7 +84,8 @@ static void default_load_playlists (RBGenericPlayerSource *source);
 static char * default_uri_from_playlist_uri (RBGenericPlayerSource *source,
 					     const char *uri);
 static char * default_uri_to_playlist_uri (RBGenericPlayerSource *source,
-					   const char *uri);
+					   const char *uri,
+					   TotemPlParserType playlist_type);
 
 enum
 {
@@ -607,19 +608,30 @@ default_uri_from_playlist_uri (RBGenericPlayerSource *source, const char *uri)
 }
 
 static char *
-default_uri_to_playlist_uri (RBGenericPlayerSource *source, const char *uri)
+default_uri_to_playlist_uri (RBGenericPlayerSource *source, const char *uri, TotemPlParserType playlist_type)
 {
 	char *mount_uri;
 	char *playlist_uri;
 
-	mount_uri = rb_generic_player_source_get_mount_path (source);
-	if (g_str_has_prefix (uri, mount_uri) == FALSE) {
-		rb_debug ("uri %s is not under device mount uri %s", uri, mount_uri);
-		return NULL;
-	}
+	switch (playlist_type) {
+	case TOTEM_PL_PARSER_IRIVER_PLA:
+		/* we need absolute paths within the device filesystem for this format */
+		mount_uri = rb_generic_player_source_get_mount_path (source);
+		if (g_str_has_prefix (uri, mount_uri) == FALSE) {
+			rb_debug ("uri %s is not under device mount uri %s", uri, mount_uri);
+			return NULL;
+		}
 
-	playlist_uri = g_strdup_printf ("file://%s", uri + strlen (mount_uri));
-	return playlist_uri;
+		playlist_uri = g_strdup_printf ("file://%s", uri + strlen (mount_uri));
+		return playlist_uri;
+
+	case TOTEM_PL_PARSER_M3U_DOS:
+	case TOTEM_PL_PARSER_M3U:
+	case TOTEM_PL_PARSER_PLS:
+	default:
+		/* leave the URI as-is, so we end up with relative paths in the playlist file */
+		return g_strdup (uri);
+	}
 }
 
 char *
@@ -631,11 +643,11 @@ rb_generic_player_source_uri_from_playlist_uri (RBGenericPlayerSource *source, c
 }
 
 char *
-rb_generic_player_source_uri_to_playlist_uri (RBGenericPlayerSource *source, const char *uri)
+rb_generic_player_source_uri_to_playlist_uri (RBGenericPlayerSource *source, const char *uri, TotemPlParserType playlist_type)
 {
 	RBGenericPlayerSourceClass *klass = RB_GENERIC_PLAYER_SOURCE_GET_CLASS (source);
 
-	return klass->impl_uri_to_playlist_uri (source, uri);
+	return klass->impl_uri_to_playlist_uri (source, uri, playlist_type);
 }
 
 static void
diff --git a/plugins/generic-player/rb-generic-player-source.h b/plugins/generic-player/rb-generic-player-source.h
index 032a0d7..19942ac 100644
--- a/plugins/generic-player/rb-generic-player-source.h
+++ b/plugins/generic-player/rb-generic-player-source.h
@@ -59,7 +59,7 @@ typedef struct
 	char **		(*impl_get_audio_folders) (RBGenericPlayerSource *source);
 
 	char *		(*impl_uri_from_playlist_uri) (RBGenericPlayerSource *source, const char *uri);
-	char *		(*impl_uri_to_playlist_uri) (RBGenericPlayerSource *source, const char *uri);
+	char *		(*impl_uri_to_playlist_uri) (RBGenericPlayerSource *source, const char *uri, TotemPlParserType playlist_type);
 
 	/* used for track transfer - returns the filename relative to the audio folder on the device */
 	char *		(*impl_build_filename) (RBGenericPlayerSource *source, RhythmDBEntry *entry);
@@ -75,7 +75,8 @@ char *			rb_generic_player_source_get_mount_path		(RBGenericPlayerSource *source
 char *			rb_generic_player_source_uri_from_playlist_uri  (RBGenericPlayerSource *source,
 									 const char *uri);
 char *			rb_generic_player_source_uri_to_playlist_uri    (RBGenericPlayerSource *source,
-									 const char *uri);
+									 const char *uri,
+									 TotemPlParserType playlist_type);
 void			rb_generic_player_source_set_supported_formats  (RBGenericPlayerSource *source,
 									 TotemPlParser *parser);
 TotemPlParserType	rb_generic_player_source_get_playlist_format	(RBGenericPlayerSource *source);



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