? help/sv/.xml2po.mo
? help/sv/rhythmbox.xml
? lib/media-eject-inline.h
? lib/rhythmbox-no-star-inline.h
? lib/rhythmbox-podcast-inline.h
? lib/rhythmbox-set-star-inline.h
? lib/rhythmbox-tray-icon-inline.h
? lib/rhythmbox-unset-star-inline.h
? plugins/iradio
? plugins/artdisplay/artdisplay/Makefile
? plugins/artdisplay/artdisplay/Makefile.in
? plugins/generic-player/Makefile
? plugins/generic-player/Makefile.in
? plugins/generic-player/generic-player.rb-plugin
? plugins/lyrics/Makefile
? plugins/lyrics/Makefile.in
? plugins/lyrics/lyrics.rb-plugin
? plugins/rb/Makefile
? plugins/rb/Makefile.in
? remote/Makefile
? remote/Makefile.in
? remote/dbus/rhythmbox-client
? shell/main.c.new
? shell/rb-shell-binding.h
? shell/rb-shell-player-binding.h
? shell/rb-shell-player.loT
? tests/bench-rhythmdb-load
Index: Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/Makefile.am,v
retrieving revision 1.53
diff -p -u -w -r1.53 Makefile.am
--- Makefile.am	10 Jul 2006 02:00:32 -0000	1.53
+++ Makefile.am	10 Jul 2006 22:58:31 -0000
@@ -5,7 +5,7 @@ AUTOMAKE_OPTIONS = 1.7
 DISTCHECK_CONFIGURE_FLAGS = --disable-schemas-install --enable-gtk-doc --disable-scrollkeeper
 distuninstallcheck_listfiles = find . -type f -print | grep -v '^\./var/scrollkeeper'
 
-SUBDIRS = macros lib metadata rhythmdb widgets sources iradio podcast \
+SUBDIRS = macros lib metadata rhythmdb widgets sources podcast \
 	daapsharing backends plugins bindings shell remote data po help tests doc
 
 EXTRA_DIST = 			\
Index: configure.ac
===================================================================
RCS file: /cvs/gnome/rhythmbox/configure.ac,v
retrieving revision 1.251
diff -p -u -w -r1.251 configure.ac
--- configure.ac	10 Jul 2006 02:00:32 -0000	1.251
+++ configure.ac	10 Jul 2006 22:58:31 -0000
@@ -915,7 +915,6 @@ metadata/Makefile
 rhythmdb/Makefile
 widgets/Makefile
 widgets/libsexy/Makefile
-iradio/Makefile
 podcast/Makefile
 shell/Makefile
 data/Makefile
@@ -929,6 +928,7 @@ plugins/sample/Makefile
 plugins/audioscrobbler/Makefile
 plugins/cd-recorder/Makefile
 plugins/ipod/Makefile
+plugins/iradio/Makefile
 plugins/lirc/Makefile
 plugins/lyrics/Makefile
 plugins/sample-python/Makefile
Index: bindings/python/rb.defs
===================================================================
RCS file: /cvs/gnome/rhythmbox/bindings/python/rb.defs,v
retrieving revision 1.30
diff -p -u -w -r1.30 rb.defs
--- bindings/python/rb.defs	9 Jul 2006 13:39:21 -0000	1.30
+++ bindings/python/rb.defs	10 Jul 2006 22:58:31 -0000
@@ -252,7 +252,6 @@
   (c-name "rb_shell_add_uri")
   (return-type "gboolean")
   (parameters
-    '("RhythmDBEntryType_*" "entry_type")
     '("const-char*" "uri")
     '("const-char*" "title")
     '("const-char*" "genre")
Index: plugins/audioscrobbler/rb-audioscrobbler.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/plugins/audioscrobbler/rb-audioscrobbler.c,v
retrieving revision 1.28
diff -p -u -w -r1.28 rb-audioscrobbler.c
--- plugins/audioscrobbler/rb-audioscrobbler.c	1 Jul 2006 01:58:38 -0000	1.28
+++ plugins/audioscrobbler/rb-audioscrobbler.c	10 Jul 2006 22:58:32 -0000
@@ -1007,9 +1007,7 @@ rb_audioscrobbler_song_changed_cb (RBShe
 	}
 
 	type = rhythmdb_entry_get_entry_type (entry);
-	if (type == RHYTHMDB_ENTRY_TYPE_IRADIO_STATION ||
-	    type == RHYTHMDB_ENTRY_TYPE_PODCAST_POST ||
-	    type == RHYTHMDB_ENTRY_TYPE_PODCAST_FEED ||
+	if (type != RHYTHMDB_ENTRY_TYPE_SONG ||
 	    rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_PLAYBACK_ERROR) != NULL) {
 		audioscrobbler->priv->should_queue = FALSE;
 		return;
Index: plugins/cd-recorder/rb-cd-recorder-plugin.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/plugins/cd-recorder/rb-cd-recorder-plugin.c,v
retrieving revision 1.1
diff -p -u -w -r1.1 rb-cd-recorder-plugin.c
--- plugins/cd-recorder/rb-cd-recorder-plugin.c	10 Jul 2006 02:00:34 -0000	1.1
+++ plugins/cd-recorder/rb-cd-recorder-plugin.c	10 Jul 2006 22:58:32 -0000
@@ -19,9 +19,7 @@
 
 #define __EXTENSIONS__
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include "config.h"
 
 #include <string.h> /* For strlen */
 #include <glib/gi18n-lib.h>
Index: rhythmdb/rhythmdb-tree.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb-tree.c,v
retrieving revision 1.111
diff -p -u -w -r1.111 rhythmdb-tree.c
--- rhythmdb/rhythmdb-tree.c	1 Jul 2006 01:58:39 -0000	1.111
+++ rhythmdb/rhythmdb-tree.c	10 Jul 2006 22:58:32 -0000
@@ -94,7 +94,6 @@ static void rhythmdb_hash_tree_foreach (
 					RBTreePropertyItFunc genres_func,
 					gpointer data);
 
-
 #define RHYTHMDB_TREE_XML_VERSION "1.3"
 
 static void destroy_tree_property (RhythmDBTreeProperty *prop);
@@ -130,7 +129,6 @@ enum
 
 const int RHYTHMDB_TREE_PARSER_INITIAL_BUFFER_SIZE = 512;
 
-
 static void
 rhythmdb_tree_class_init (RhythmDBTreeClass *klass)
 {
@@ -638,8 +636,6 @@ save_entry (RhythmDBTree *db, RhythmDBEn
 
 	if (entry->type == RHYTHMDB_ENTRY_TYPE_SONG) {
 		RHYTHMDB_FWRITE_STATICSTR ("song", ctx->handle, ctx->error);
-	} else if (entry->type == RHYTHMDB_ENTRY_TYPE_IRADIO_STATION) {
-		RHYTHMDB_FWRITE_STATICSTR ("iradio", ctx->handle, ctx->error);
 	} else if (entry->type == RHYTHMDB_ENTRY_TYPE_PODCAST_POST) {
 		RHYTHMDB_FWRITE_STATICSTR ("podcast-post", ctx->handle, ctx->error);
 	} else if (entry->type == RHYTHMDB_ENTRY_TYPE_PODCAST_FEED) {
@@ -647,7 +643,8 @@ save_entry (RhythmDBTree *db, RhythmDBEn
 	} else if (entry->type == RHYTHMDB_ENTRY_TYPE_IGNORE) {
 		RHYTHMDB_FWRITE_STATICSTR ("ignore", ctx->handle, ctx->error);
 	} else {
-		g_assert_not_reached ();
+		/* type installed by a plugin */
+		RHYTHMDB_FWRITE_STATICSTR (entry->type->name, ctx->handle, ctx->error);
 	}
 
 	RHYTHMDB_FWRITE_STATICSTR ("\">\n", ctx->handle, ctx->error);
@@ -835,7 +832,8 @@ rhythmdb_tree_save (RhythmDB *rdb)
 	rhythmdb_hash_tree_foreach (rdb, RHYTHMDB_ENTRY_TYPE_SONG,
 				    (RBTreeEntryItFunc)save_entry,
 				    NULL, NULL, NULL, &ctx);
-	rhythmdb_hash_tree_foreach (rdb, RHYTHMDB_ENTRY_TYPE_IRADIO_STATION,
+	/* FIXME: do this dynamically but exclude aliases */
+	rhythmdb_hash_tree_foreach (rdb, rhythmdb_entry_type_get_by_name ("iradio"),
 				    (RBTreeEntryItFunc)save_entry,
 				    NULL, NULL, NULL, &ctx);
 	rhythmdb_hash_tree_foreach (rdb, RHYTHMDB_ENTRY_TYPE_PODCAST_POST,
@@ -1257,7 +1255,6 @@ remove_one_song (gchar *uri, RhythmDBEnt
 	return FALSE;
 }
 
-
 static void
 rhythmdb_tree_entry_delete_by_type (RhythmDB *adb, RhythmDBEntryType type)
 {
@@ -1270,7 +1267,6 @@ rhythmdb_tree_entry_delete_by_type (Rhyt
 				     (GHRFunc) remove_one_song, &ctxt);
 }
 
-
 static void
 destroy_tree_property (RhythmDBTreeProperty *prop)
 {
@@ -1725,7 +1721,6 @@ conjunctive_query (RhythmDBTree *db, GPt
 	g_free (traversal_data);
 }
 
-
 static GList *
 split_query_by_disjunctions (RhythmDBTree *db, GPtrArray *query)
 {
@@ -1892,7 +1887,6 @@ hash_tree_entries_foreach (gpointer key,
 	ctxt->entry_func (ctxt->db, entry, ctxt->data);
 }
 
-
 static void
 hash_tree_albums_foreach (gpointer key, gpointer value, gpointer data)
 {
@@ -1909,14 +1903,12 @@ hash_tree_albums_foreach (gpointer key, 
 	}
 }
 
-
 static void
 hash_tree_artists_foreach (gpointer key, gpointer value, gpointer data)
 {
 	RhythmDBTreeProperty *artist = (RhythmDBTreeProperty *)value;
 	struct HashTreeIteratorCtxt *ctxt = (struct HashTreeIteratorCtxt*)data;
 
-
 	if (ctxt->artist_func) {
 		ctxt->artist_func (ctxt->db, artist, ctxt->data);
 	}
@@ -1927,14 +1919,12 @@ hash_tree_artists_foreach (gpointer key,
 	}
 }
 
-
 static void
 hash_tree_genres_foreach (gpointer key, gpointer value, gpointer data)
 {
 	RhythmDBTreeProperty *genre = (RhythmDBTreeProperty *)value;
 	struct HashTreeIteratorCtxt *ctxt = (struct HashTreeIteratorCtxt*)data;
 
-
 	if (ctxt->genres_func) {
 		ctxt->genres_func (ctxt->db, genre, ctxt->data);
 	}
Index: rhythmdb/rhythmdb.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb.c,v
retrieving revision 1.234
diff -p -u -w -r1.234 rhythmdb.c
--- rhythmdb/rhythmdb.c	10 Jul 2006 04:19:58 -0000	1.234
+++ rhythmdb/rhythmdb.c	10 Jul 2006 22:58:33 -0000
@@ -45,14 +45,11 @@
 #include "rb-preferences.h"
 #include "eel-gconf-extensions.h"
 
-
 #define RB_PARSE_NICK_START (xmlChar *) "["
 #define RB_PARSE_NICK_END (xmlChar *) "]"
 
-
 GType rhythmdb_property_type_map[RHYTHMDB_NUM_PROPERTIES];
 
-
 #define RHYTHMDB_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RHYTHMDB_TYPE, RhythmDBPrivate))
 G_DEFINE_ABSTRACT_TYPE(RhythmDB, rhythmdb, G_TYPE_OBJECT)
 
@@ -83,7 +80,6 @@ typedef struct
  	RhythmDBEntryType entry_type;
 } RhythmDBAction;
 
-
 static void rhythmdb_finalize (GObject *object);
 static void rhythmdb_set_property (GObject *object,
 					guint prop_id,
@@ -232,7 +228,6 @@ rhythmdb_class_init (RhythmDBClass *klas
 			      G_TYPE_STRING,
 			      G_TYPE_POINTER);
 
-
 	rhythmdb_signals[READ_ONLY] =
 		g_signal_new ("read-only",
 			      G_OBJECT_CLASS_TYPE (object_class),
@@ -387,7 +382,6 @@ rhythmdb_init (RhythmDB *db)
 	rhythmdb_entry_import_error_get_type ();
 	
 	/* and other types we haven't kicked out of the rhythmdb core yet */
-	rhythmdb_entry_iradio_get_type ();
 	rhythmdb_entry_podcast_post_get_type ();
 	rhythmdb_entry_podcast_feed_get_type ();
 
@@ -534,7 +528,6 @@ rhythmdb_event_free (RhythmDB *db, Rhyth
 	g_free (result);
 }
 
-
 /**
  * rhythmdb_shutdown:
  *
@@ -560,7 +553,6 @@ rhythmdb_shutdown (RhythmDB *db)
 		rhythmdb_action_free (db, action);
 	}
 
-	
 	rb_debug ("%d outstanding threads", g_atomic_int_get (&db->priv->outstanding_threads));
 	while (g_atomic_int_get (&db->priv->outstanding_threads) > 0) {
 		result = g_async_queue_pop (db->priv->event_queue);
@@ -753,8 +745,6 @@ sync_entry_changed (RhythmDBEntry *entry
 	}
 }
 
-
-
 static gboolean
 rhythmdb_emit_entry_signals_idle (RhythmDB *db)
 {
@@ -775,7 +765,6 @@ rhythmdb_emit_entry_signals_idle (Rhythm
 	
 	g_mutex_unlock (db->priv->change_mutex);
 
-
 	/* emit added entries */
 	for (l = added_entries; l; l = g_list_next (l)) {
 		RhythmDBEntry *entry = (RhythmDBEntry *)l->data;
@@ -885,7 +874,6 @@ rhythmdb_add_timeout_commit (RhythmDB *d
 	g_timeout_add (100, (GSourceFunc)timeout_rhythmdb_commit, data);
 }
 
-
 /**
  * rhythmdb_commit:
  * @db: a #RhythmDB.
@@ -980,7 +968,6 @@ rhythmdb_entry_get_type_data (RhythmDBEn
 	return (gpointer) (((guint8 *)entry) + offset);
 }
 
-
 /**
  * rhythmdb_entry_insert:
  * @db: a #RhythmDB.
@@ -1002,7 +989,6 @@ rhythmdb_entry_insert (RhythmDB *db, Rhy
 	g_mutex_unlock (db->priv->change_mutex);
 }
 
-
 /**
  * rhythmdb_entry_new:
  * @db: a #RhythmDB.
@@ -1146,7 +1132,6 @@ rhythmdb_entry_is_editable (RhythmDB *db
 	return entry_type->can_sync_metadata (db, entry, entry_type->can_sync_metadata_data);
 }
 
-
 static void
 set_metadata_string_default_unknown (RhythmDB *db,
 				     RBMetaData *metadata,
@@ -1321,7 +1306,6 @@ set_props_from_metadata (RhythmDB *db, R
 	}
 }
 
-
 static gboolean
 is_ghost_entry (RhythmDBEntry *entry)
 {
@@ -1359,7 +1343,6 @@ is_ghost_entry (RhythmDBEntry *entry)
 	return (last_seen + grace_period < time.tv_sec);
 }
 
-
 static void
 rhythmdb_process_stat_event (RhythmDB *db, RhythmDBEvent *event)
 {
@@ -1869,7 +1852,6 @@ rhythmdb_execute_stat (RhythmDB *db, con
 	g_list_free (uri_list);
 }
 
-
 void
 queue_stat_uri (const char *uri, RhythmDB *db, RhythmDBEntryType type)
 {
@@ -1923,7 +1905,6 @@ queue_stat_uri_tad (const char *uri, Rhy
 	queue_stat_uri (uri, data->db, data->type);
 }
 
-
 static gpointer
 add_thread_main (RhythmDBAddThreadData *data)
 {
@@ -1978,7 +1959,6 @@ rhythmdb_execute_load (RhythmDB *db, con
 	g_async_queue_push (db->priv->event_queue, event);
 }
 
-
 /**
  * rhythmdb_entry_get:
  * @entry: a #RhythmDBEntry.
@@ -2412,7 +2392,6 @@ record_entry_change (RhythmDB *db, Rhyth
 	g_mutex_unlock (db->priv->change_mutex);
 }
 
-
 void
 rhythmdb_entry_set_internal (RhythmDB *db, RhythmDBEntry *entry,
 			     gboolean notify_if_inserted,
@@ -2622,7 +2601,6 @@ rhythmdb_entry_set_internal (RhythmDB *d
  * This should only be used by RhythmDB itself, or a backend (such as rhythmdb-tree).
  **/
 
-
 static void
 rhythmdb_entry_sync_mirrored (RhythmDBEntry *entry, guint propid)
 {
@@ -3304,7 +3282,6 @@ rhythmdb_compute_status_normal (gint n_s
 	return ret;
 }
 
-
 static gboolean
 song_can_sync_metadata (RhythmDB *db, RhythmDBEntry *entry, gpointer data)
 {
@@ -3366,7 +3343,7 @@ rhythmdb_entry_register_type (const char
 	type = g_new0 (RhythmDBEntryType_, 1);
 	type->can_sync_metadata = (RhythmDBEntryCanSyncFunc)rb_false_function;
 	type->sync_metadata = default_sync_metadata;
-	if (name) {
+	if (name != NULL) {
 		type->name = g_strdup (name);
 		g_static_mutex_lock (&entry_type_map_mutex);
 		if (entry_type_map == NULL) {
@@ -3379,6 +3356,71 @@ rhythmdb_entry_register_type (const char
 	return type;
 }
 
+void
+rhythmdb_entry_type_set_post_entry_create_func (RhythmDBEntryType        type,
+						RhythmDBEntryActionFunc  func,
+						gpointer                 data,
+						GDestroyNotify           destroy_func)
+{
+	g_static_mutex_lock (&entry_type_mutex);
+	type->post_entry_create = func;
+	type->post_entry_create_data = data;
+	type->post_entry_create_destroy = destroy_func;
+	g_static_mutex_unlock (&entry_type_map_mutex);
+}
+
+void
+rhythmdb_entry_type_set_pre_entry_destroy_func (RhythmDBEntryType        type,
+						RhythmDBEntryActionFunc  func,
+						gpointer                 data,
+						GDestroyNotify           destroy_func)
+{
+	g_static_mutex_lock (&entry_type_mutex);
+	type->pre_entry_destroy = func;
+	type->pre_entry_destroy_data = data;
+	type->pre_entry_destroy_destroy = destroy_func;
+	g_static_mutex_unlock (&entry_type_map_mutex);
+}
+
+void
+rhythmdb_entry_type_set_get_playback_uri_func (RhythmDBEntryType        type,
+					       RhythmDBEntryStringFunc  func,
+					       gpointer                 data,
+					       GDestroyNotify           destroy_func)
+{
+	g_static_mutex_lock (&entry_type_mutex);
+	type->get_playback_uri = func;
+	type->get_playback_uri_data = data;
+	type->get_playback_uri_destroy = destroy_func;
+	g_static_mutex_unlock (&entry_type_map_mutex);
+}
+
+void
+rhythmdb_entry_type_set_can_sync_metadata_func (RhythmDBEntryType        type,
+						RhythmDBEntryCanSyncFunc func,
+						gpointer                 data,
+						GDestroyNotify           destroy_func)
+{
+	g_static_mutex_lock (&entry_type_mutex);
+	type->can_sync_metadata = func;
+	type->can_sync_metadata_data = data;
+	type->can_sync_metadata_destroy = destroy_func;
+	g_static_mutex_unlock (&entry_type_map_mutex);
+}
+
+void
+rhythmdb_entry_type_set_sync_metadata_func (RhythmDBEntryType        type,
+					    RhythmDBEntrySyncFunc    func,
+					    gpointer                 data,
+					    GDestroyNotify           destroy_func)
+{
+	g_static_mutex_lock (&entry_type_mutex);
+	type->sync_metadata = func;
+	type->sync_metadata_data = data;
+	type->sync_metadata_destroy = destroy_func;
+	g_static_mutex_unlock (&entry_type_map_mutex);
+}
+
 static void
 rhythmdb_entry_register_type_alias (RhythmDBEntryType type, const char *name)
 {
@@ -3417,7 +3459,6 @@ rhythmdb_entry_type_get_by_name (const c
 	return RHYTHMDB_ENTRY_TYPE_INVALID;
 }
 
-
 RhythmDBEntryType 
 rhythmdb_entry_song_get_type (void) 
 {
@@ -3448,22 +3489,6 @@ rhythmdb_entry_ignore_get_type (void) 
 	return ignore_type;
 }
 
-RhythmDBEntryType rhythmdb_entry_iradio_get_type (void) 
-{
-	static RhythmDBEntryType iradio_type = RHYTHMDB_ENTRY_TYPE_INVALID;
-       
-	g_static_mutex_lock (&entry_type_mutex);
-	if (iradio_type == RHYTHMDB_ENTRY_TYPE_INVALID) {
-		iradio_type = rhythmdb_entry_register_type ("iradio");
-		rhythmdb_entry_register_type_alias (iradio_type, "1");
-		iradio_type->can_sync_metadata = (RhythmDBEntryCanSyncFunc)rb_true_function;
-		iradio_type->sync_metadata = (RhythmDBEntrySyncFunc)rb_null_function;
-	}
-	g_static_mutex_unlock (&entry_type_mutex);
-
-	return iradio_type;
-}
-
 static char *
 _get_podcast_playback_uri (RhythmDBEntry *entry, gpointer data)
 {
@@ -3597,7 +3622,6 @@ rhythmdb_sync_library_location (RhythmDB
 						    db);
 	}
 	
-
 	if (reload) {
 		rb_debug ("ending monitor of old library directories");
 
@@ -3888,4 +3912,3 @@ rhythmdb_entry_type_get_type (void)
 
 	return type;
 }
-
Index: rhythmdb/rhythmdb.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb.h,v
retrieving revision 1.90
diff -p -u -w -r1.90 rhythmdb.h
--- rhythmdb/rhythmdb.h	7 Jul 2006 03:00:45 -0000	1.90
+++ rhythmdb/rhythmdb.h	10 Jul 2006 22:58:33 -0000
@@ -50,7 +50,6 @@ GType rhythmdb_entry_get_type (void);
 #define RHYTHMDB_ENTRY(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), RHYTHMDB_TYPE_ENTRY, RhythmDBEntry))
 #define RHYTHMDB_IS_ENTRY(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), RHYTHMDB_TYPE_ENTRY))
 
-
 typedef void (*RhythmDBEntryActionFunc) (RhythmDBEntry *entry, gpointer data);
 typedef char* (*RhythmDBEntryStringFunc) (RhythmDBEntry *entry, gpointer data);
 typedef gboolean (*RhythmDBEntryCanSyncFunc) (RhythmDB *db, RhythmDBEntry *entry, gpointer data);
@@ -89,17 +88,13 @@ GType rhythmdb_entry_type_get_type (void
 #define RHYTHMDB_ENTRY_TYPE(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), RHYTHMDB_TYPE_ENTRY_TYPE, RhythmDBEntryType_))
 #define RHYTHMDB_IS_ENTRY_TYPE(o)	(G_TYPE_CHECK_INSTANCE_TYPE ((o), RHYTHMDB_TYPE_ENTRY_TYPE))
 
-
-
 typedef GPtrArray RhythmDBQuery;
 GType rhythmdb_query_get_type (void);
 #define RHYTHMDB_TYPE_QUERY	(rhythmdb_query_get_type ())
 #define RHYTHMDB_QUERY(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), RHYTHMDB_TYPE_QUERY, RhythmDBQuery))
 #define RHYTHMDB_IS_QUERY(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), RHYTHMDB_TYPE_QUERY))
 
-
 #define RHYTHMDB_ENTRY_TYPE_SONG (rhythmdb_entry_song_get_type ())
-#define RHYTHMDB_ENTRY_TYPE_IRADIO_STATION (rhythmdb_entry_iradio_get_type ())
 #define RHYTHMDB_ENTRY_TYPE_PODCAST_POST (rhythmdb_entry_podcast_post_get_type ())
 #define RHYTHMDB_ENTRY_TYPE_PODCAST_FEED (rhythmdb_entry_podcast_feed_get_type ())
 #define RHYTHMDB_ENTRY_TYPE_IMPORT_ERROR (rhythmdb_entry_import_error_get_type ())
@@ -229,8 +224,6 @@ gpointer rhythmdb_entry_get_pointer     
 
 RhythmDBEntryType rhythmdb_entry_get_entry_type (RhythmDBEntry *entry);
 
-
-
 typedef enum
 {
 	RHYTHMDB_ERROR_ACCESS_FAILED,
@@ -291,7 +284,6 @@ typedef struct
 						 gboolean *cancel);
 } RhythmDBClass;
 
-
 GType		rhythmdb_get_type	(void);
 
 RhythmDB *	rhythmdb_new		(const char *name);
@@ -330,7 +322,6 @@ void            rhythmdb_entry_delete_by
 void		rhythmdb_entry_move_to_trash (RhythmDB *db,
 					      RhythmDBEntry *entry);
 
-
 RhythmDBEntry *	rhythmdb_entry_lookup_by_location (RhythmDB *db, const char *uri);
 
 gboolean	rhythmdb_evaluate_query		(RhythmDB *db, GPtrArray *query,
@@ -399,12 +390,32 @@ char *		rhythmdb_compute_status_normal		
 							 const char *singular,
 							 const char *plural);
 
-
 RhythmDBEntryType rhythmdb_entry_register_type          (const char *name);
+void              rhythmdb_entry_type_set_data_size     (RhythmDBEntryType        type,
+                                                         guint                    data_size);
+void              rhythmdb_entry_type_set_post_entry_create_func (RhythmDBEntryType        type,
+                                                                  RhythmDBEntryActionFunc  func,
+                                                                  gpointer                 data,
+                                                                  GDestroyNotify           destroy_func);
+void              rhythmdb_entry_type_set_pre_entry_destroy_func (RhythmDBEntryType        type,
+                                                                  RhythmDBEntryActionFunc  func,
+                                                                  gpointer                 data,
+                                                                  GDestroyNotify           destroy_func);
+void              rhythmdb_entry_type_set_get_playback_uri_func  (RhythmDBEntryType        type,
+                                                                  RhythmDBEntryStringFunc  func,
+                                                                  gpointer                 data,
+                                                                  GDestroyNotify           destroy_func);
+void              rhythmdb_entry_type_set_can_sync_metadata_func (RhythmDBEntryType        type,
+                                                                  RhythmDBEntryCanSyncFunc func,
+                                                                  gpointer                 data,
+                                                                  GDestroyNotify           destroy_func);
+void              rhythmdb_entry_type_set_sync_metadata_func     (RhythmDBEntryType        type,
+                                                                  RhythmDBEntrySyncFunc    func,
+                                                                  gpointer                 data,
+                                                                  GDestroyNotify           destroy_func);
 RhythmDBEntryType rhythmdb_entry_type_get_by_name       (const char *name);
 
 RhythmDBEntryType rhythmdb_entry_song_get_type          (void);
-RhythmDBEntryType rhythmdb_entry_iradio_get_type        (void);
 RhythmDBEntryType rhythmdb_entry_podcast_post_get_type  (void);
 RhythmDBEntryType rhythmdb_entry_podcast_feed_get_type  (void);
 RhythmDBEntryType rhythmdb_entry_import_error_get_type	(void);
Index: shell/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/Makefile.am,v
retrieving revision 1.85
diff -p -u -w -r1.85 Makefile.am
--- shell/Makefile.am	10 Jul 2006 02:00:35 -0000	1.85
+++ shell/Makefile.am	10 Jul 2006 22:58:33 -0000
@@ -35,7 +35,6 @@ INCLUDES = 						\
 	-I$(top_srcdir)/rhythmdb                       	\
 	-I$(top_srcdir)/widgets                    	\
 	-I$(top_srcdir)/sources                    	\
-	-I$(top_srcdir)/iradio                    	\
 	-I$(top_srcdir)/podcast                    	\
 	-I$(top_builddir)/lib				\
 	-I$(top_srcdir)/plugins				\
@@ -97,7 +96,6 @@ rhythmbox_LDADD =					\
 	librbshell.la					\
 	$(top_builddir)/sources/libsources.la	        \
 	$(top_builddir)/sources/libsourcesimpl.la	\
-	$(top_builddir)/iradio/librbiradio.la	        \
 	$(top_builddir)/podcast/librbpodcast.la	        \
 	$(top_builddir)/metadata/librbmetadata.la	\
 	$(top_builddir)/widgets/librbwidgets.la         \
Index: shell/rb-playlist-manager.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-playlist-manager.c,v
retrieving revision 1.109
diff -p -u -w -r1.109 rb-playlist-manager.c
--- shell/rb-playlist-manager.c	10 Jul 2006 02:00:35 -0000	1.109
+++ shell/rb-playlist-manager.c	10 Jul 2006 22:58:33 -0000
@@ -428,24 +428,17 @@ handle_playlist_entry_cb (TotemPlParser 
 			  const char *genre, RBPlaylistManager *mgr)
 {
 	char *uri = rb_canonicalise_uri (uri_maybe);
-	RhythmDBEntryType entry_type;
+	gboolean handled;
 
 	g_return_if_fail (uri != NULL);
 
-	entry_type = rb_shell_guess_type_for_uri (mgr->priv->shell, uri);
-	if (entry_type == RHYTHMDB_ENTRY_TYPE_INVALID) {
-		g_free (uri);
-		return;
-	}
-
-	rb_shell_add_uri (mgr->priv->shell,
-			  entry_type,
+	handled = rb_shell_add_uri (mgr->priv->shell,
 			  uri,
 			  title,
 			  genre,
 			  NULL);
 
-	if (entry_type == RHYTHMDB_ENTRY_TYPE_SONG) {
+	if (handled) {
 		if (!mgr->priv->loading_playlist) {
 			mgr->priv->loading_playlist =
 				RB_STATIC_PLAYLIST_SOURCE (rb_playlist_manager_new_playlist (mgr, NULL, FALSE));
Index: shell/rb-shell.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell.c,v
retrieving revision 1.460
diff -p -u -w -r1.460 rb-shell.c
--- shell/rb-shell.c	10 Jul 2006 02:00:35 -0000	1.460
+++ shell/rb-shell.c	10 Jul 2006 22:58:34 -0000
@@ -39,12 +39,13 @@
 /*#include <libgnomeui/gnome-stock-icons.h>*/
 #include <libgnome/gnome-init.h>
 #include <libgnome/gnome-program.h>
-/*#include <libgnomeui/gnome-window-icon.h>*/
 #include <libgnomeui/gnome-client.h>
 
 #include <libgnomevfs/gnome-vfs.h>
+#include <libgnomevfs/gnome-vfs-mime.h>
 #include <libgnomevfs/gnome-vfs-mime-utils.h>
 
+
 #include "rb-shell.h"
 #include "rb-debug.h"
 #include "rb-dialog.h"
@@ -76,7 +77,6 @@
 #include "rb-daap-source.h"
 #include "rb-daap-sharing.h"
 #endif /* WITH_DAAP_SUPPORT */
-#include "rb-iradio-source.h"
 #include "rb-shell-preferences.h"
 #include "rb-playlist-source.h"
 #include "rb-static-playlist-source.h"
@@ -302,7 +302,6 @@ static guint rb_shell_signals[LAST_SIGNA
 
 G_DEFINE_TYPE (RBShell, rb_shell, G_TYPE_OBJECT)
 
-
 struct RBShellPrivate
 {
 	GtkWidget *window;
@@ -326,6 +325,8 @@ struct RBShellPrivate
 
 	GList *sources;
 	GHashTable *sources_hash;
+	GHashTable *mime_handler_hash;
+	GHashTable *scheme_handler_hash;
 
 	guint async_state_save_id;
 	guint save_playlist_id;
@@ -354,7 +355,6 @@ struct RBShellPrivate
 	GList *supported_media_extensions;
 
 	RBLibrarySource *library_source;
-	RBIRadioSource *iradio_source;
 	RBPodcastSource *podcast_source;
 	RBPlaylistSource *queue_source;
 	RBSource *missing_files_source;
@@ -537,7 +537,6 @@ rb_shell_class_init (RBShellClass *klass
 							      RB_TYPE_SOURCE,
 							      G_PARAM_READABLE));
 
-
 	g_object_class_install_property (object_class,
 					 PROP_DB,
 					 g_param_spec_object ("db", 
@@ -668,6 +667,11 @@ rb_shell_init (RBShell *shell) 
         rb_shell_session_init (shell);
 
 	eel_gconf_monitor_add (CONF_PREFIX);
+
+	shell->priv->mime_handler_hash = g_hash_table_new (g_str_hash,
+							   g_str_equal);
+	shell->priv->scheme_handler_hash = g_hash_table_new (g_str_hash,
+							     g_str_equal);
 }
 
 static void
@@ -910,6 +914,8 @@ rb_shell_finalize (GObject *object)
 	shell->priv->sources = NULL;
 
 	g_hash_table_destroy (shell->priv->sources_hash);
+	g_hash_table_destroy (shell->priv->mime_handler_hash);
+	g_hash_table_destroy (shell->priv->scheme_handler_hash);
 
         ((GObjectClass*)rb_shell_parent_class)->finalize (G_OBJECT (shell));
 
@@ -1138,8 +1144,6 @@ construct_sources (RBShell *shell)
 
 	shell->priv->library_source = RB_LIBRARY_SOURCE (rb_library_source_new (shell));
 	rb_shell_append_source (shell, RB_SOURCE (shell->priv->library_source), NULL);
-	shell->priv->iradio_source = RB_IRADIO_SOURCE (rb_iradio_source_new (shell));
-	rb_shell_append_source (shell, RB_SOURCE (shell->priv->iradio_source), NULL);
 	shell->priv->podcast_source = RB_PODCAST_SOURCE (rb_podcast_source_new (shell));
 	rb_shell_append_source (shell, RB_SOURCE (shell->priv->podcast_source), NULL);
 
@@ -1313,7 +1317,6 @@ rb_shell_constructor (GType type,
 	shell->priv->sourcelist_height = eel_gconf_get_integer (CONF_STATE_SOURCELIST_HEIGHT);
 	shell->priv->statusbar_hidden = eel_gconf_get_boolean (CONF_UI_STATUSBAR_HIDDEN);
 
-	
 	rb_debug ("shell: syncing with gconf");
 	rb_shell_sync_sidepane_visibility (shell);
 	rb_shell_sync_pane_visibility (shell);
@@ -1701,15 +1704,60 @@ rb_shell_register_entry_type_for_source 
 	g_hash_table_insert (shell->priv->sources_hash, type, source);
 }
 
+void
+rb_shell_register_source (RBShell  *shell,
+			  RBSource *source)
+{
+	GList *list;
+	GList *l;
+
+	list = rb_source_get_entry_types (source);
+	for (l = list; l != NULL; l = l->next) {
+		RhythmDBEntryType entry_type = l->data;
+
+		if (g_hash_table_lookup (shell->priv->sources_hash, entry_type) == NULL) {
+			rb_shell_register_entry_type_for_source (shell, source, entry_type);
+		}
+	}
+	g_list_free (list);
+
+	list = rb_source_get_mime_types (source);
+	for (l = list; l != NULL; l = l->next) {
+		g_hash_table_insert (shell->priv->mime_handler_hash, l->data, source);
+	}
+	g_list_free (list);
 
+	list = rb_source_get_uri_schemes (source);
+	for (l = list; l != NULL; l = l->next) {
+		g_hash_table_insert (shell->priv->scheme_handler_hash, l->data, source);
+	}
+	g_list_free (list);
+}
+
+void
+rb_shell_unregister_source (RBShell  *shell,
+			    RBSource *source)
+{
+	GList *entry_types;
+	GList *l;
+
+	entry_types = rb_source_get_entry_types (source);
+	for (l = entry_types; l != NULL; l = l->next) {
+		RhythmDBEntryType entry_type = l->data;
+
+		if (shell->priv->sources_hash != NULL) {
+			g_hash_table_remove (shell->priv->sources_hash, entry_type);
+		}
+	}
+	g_list_free (entry_types);
+}
 
 void
 rb_shell_append_source (RBShell *shell,
 			RBSource *source,
 			RBSource *parent)
 {
-	shell->priv->sources
-		= g_list_append (shell->priv->sources, source);
+	shell->priv->sources = g_list_append (shell->priv->sources, source);
 
 	g_signal_connect_object (G_OBJECT (source), "deleted",
 				 G_CALLBACK (rb_shell_source_deleted_cb), shell, 0);
@@ -2266,7 +2314,6 @@ rb_shell_plugins_response_cb (GtkDialog 
 		gtk_widget_hide (GTK_WIDGET (dialog));
 }
 
-
 static void
 rb_shell_cmd_plugins (GtkAction *action,
 		      RBShell *shell)
@@ -2353,7 +2400,6 @@ rb_shell_cmd_add_folder_to_library (GtkA
 		gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog),
 							 dir);
 	
-
 	g_signal_connect_object (G_OBJECT (dialog),
 				 "response",
 				 G_CALLBACK (add_to_library_response_cb),
@@ -2375,7 +2421,6 @@ rb_shell_cmd_add_file_to_library (GtkAct
 		gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog),
 							 dir);
 	
-
 	g_signal_connect_object (G_OBJECT (dialog),
 				 "response",
 				 G_CALLBACK (add_to_library_response_cb),
@@ -2473,7 +2518,6 @@ rb_shell_sync_pane_visibility (RBShell *
 				      shell->priv->queue_as_sidebar);
 }
 
-
 static void
 rb_shell_sync_toolbar_state (RBShell *shell)
 {
@@ -2716,7 +2760,6 @@ rb_shell_cmd_current_song (GtkAction *ac
 	rb_shell_jump_to_current (shell);
 }
 
-
 static void
 rb_shell_cmd_view_all (GtkAction *action,
 		       RBShell *shell)
@@ -2892,45 +2935,53 @@ rb_shell_session_init (RBShell *shell)
 				 shell, 0);
 }
 
-RhythmDBEntryType
-rb_shell_guess_type_for_uri (RBShell *shell,
+RBSource *
+rb_shell_guess_source_for_uri (RBShell    *shell,
 			     const char *uri)
 {
 	GnomeVFSURI *vfs_uri;
-	RhythmDBEntryType entry_type = RHYTHMDB_ENTRY_TYPE_SONG;
 	const char *scheme;
-	const char *path;
-	const char *pathend;
+	const char  *mime;
+	GList       *mime_list;
+	GList       *scheme_list;
+	RBSource    *source;
 
-	if (uri == NULL)
+	if (uri == NULL) {
 		return RHYTHMDB_ENTRY_TYPE_INVALID;
+	}
 
 	vfs_uri = gnome_vfs_uri_new (uri);
 	if (vfs_uri == NULL) {
 		rb_debug ("Invalid uri: %s", uri);
-		return RHYTHMDB_ENTRY_TYPE_INVALID;
+		return NULL;
 	}
+
 	scheme = gnome_vfs_uri_get_scheme (vfs_uri);
-	path = gnome_vfs_uri_get_scheme (vfs_uri);
-	pathend = path + strlen (path);
+	mime = gnome_vfs_get_mime_type_from_uri (vfs_uri);
 
-	if (strcmp ("file", scheme) == 0) {
-		entry_type = RHYTHMDB_ENTRY_TYPE_SONG;
-	} else if (strcmp ("http", scheme) == 0) {
-		if ((strcasecmp (".xml", pathend-4) == 0)
-		    || strcasecmp (".rss", pathend-4) == 0)
-			entry_type = RHYTHMDB_ENTRY_TYPE_PODCAST_FEED;
-		else
-			entry_type = RHYTHMDB_ENTRY_TYPE_IRADIO_STATION;
-	} else if ((strcmp ("pnm", scheme) == 0) ||
-		  (strcmp ("rtsp", scheme) == 0) ||
-		  (strcmp ("mms", scheme) == 0) ||
-		  (strcmp ("mmsh", scheme) == 0)) {
-		entry_type = RHYTHMDB_ENTRY_TYPE_IRADIO_STATION;
+	scheme_list = NULL;
+	if (scheme != NULL) {
+		scheme_list = g_hash_table_lookup (shell->priv->scheme_handler_hash, scheme);
+	}
+
+	mime_list = NULL;
+	if (mime != NULL) {
+		mime_list = g_hash_table_lookup (shell->priv->mime_handler_hash, mime);
 	}
 
-	gnome_vfs_uri_unref (vfs_uri);
-	return entry_type;
+	/* FIXME: */
+	if (mime_list != NULL) {
+		source = mime_list->data;
+	} else if (scheme_list != NULL) {
+		source = scheme_list->data;
+	} else {
+		source = NULL;
+	}
+
+	g_list_free (scheme_list);
+	g_list_free (mime_list);
+
+	return source;
 }
 
 /* Load a URI representing an element of the given type, with
@@ -2938,31 +2989,29 @@ rb_shell_guess_type_for_uri (RBShell *sh
  */
 gboolean
 rb_shell_add_uri (RBShell *shell,
-		  RhythmDBEntryType entrytype,
 		  const char *uri,
 		  const char *title,
 		  const char *genre,
 		  GError **error)
 {
 	RBSource *source;
+	gboolean  handled;
 
-	/* FIXME should abstract this... */
-	source = rb_shell_get_source_by_entry_type (shell, entrytype);
-	if (source == RB_SOURCE (shell->priv->iradio_source)) {
-		if (rb_uri_is_local (uri)) {
-			rb_iradio_source_add_from_playlist (shell->priv->iradio_source,
-							    uri);
-		} else {
-			rb_iradio_source_add_station (shell->priv->iradio_source,
-						      uri,
-						      title,
-						      genre);
+	source = rb_shell_guess_source_for_uri (shell, uri);
+	if (source == NULL) {
+		return FALSE;
 		}
+
+	handled = rb_source_add_uri (source, uri, title, genre);
+
+	if (handled) {
 		return TRUE;
-	} else if (source == RB_SOURCE (shell->priv->podcast_source)) {
+	}
+
+	if (source == RB_SOURCE (shell->priv->podcast_source)) {
 		rb_podcast_source_add_feed (shell->priv->podcast_source, uri);
 		return TRUE;
-	} else if (entrytype == RHYTHMDB_ENTRY_TYPE_SONG) {
+	} else if (source == RB_SOURCE (shell->priv->library_source)) {
 		/* FIXME should be sync... */
 		rhythmdb_add_uri (shell->priv->db, uri);
 		return TRUE;
@@ -2984,14 +3033,15 @@ handle_playlist_entry_cb (TotemPlParser 
 			  const char *genre,
 			  PlaylistParseData *data)
 {
-	RhythmDBEntryType entry_type;
+	RBSource *source;
 
 	g_return_if_fail (uri != NULL);
 	
-	entry_type = rb_shell_guess_type_for_uri (data->shell, uri);
+	source = rb_shell_guess_source_for_uri (data->shell, uri);
 	
-	if (entry_type != RHYTHMDB_ENTRY_TYPE_IRADIO_STATION)
-		data->iradio_playlist = FALSE;
+	if (source != RB_SOURCE (data->shell->priv->library_source)) {
+		data->iradio_playlist = TRUE;
+	}
 }
 
 /* Load a URI representing a single song, a directory, a playlist, or
@@ -3047,19 +3097,7 @@ rb_shell_load_uri (RBShell *shell,
 							     uri, error))
 				return FALSE;
 		} else {
-			RhythmDBEntryType entrytype;
-
-			if (result == TOTEM_PL_PARSER_RESULT_SUCCESS) {
-				rb_debug ("adding %s as an iradio playlist", uri);
-				entrytype = RHYTHMDB_ENTRY_TYPE_IRADIO_STATION;
-			} else {
-				rb_debug ("%s didn't parse as a playlist", uri);
-				entrytype = rb_shell_guess_type_for_uri (shell, uri);
-				if (entrytype < 0)
-					return FALSE;
-			}
-
-			rb_shell_add_uri (shell, entrytype, uri, NULL, NULL, NULL);
+			rb_shell_add_uri (shell, uri, NULL, NULL, NULL);
 		}
 	}
 	
@@ -3146,7 +3184,6 @@ rb_shell_clear_queue (RBShell *shell,
 	return TRUE;
 }
 
-
 gboolean
 rb_shell_present (RBShell *shell,
 		  guint32 timestamp,
@@ -3376,4 +3413,3 @@ rb_shell_ui_location_get_type (void)
 
 	return etype;
 }
-
Index: shell/rb-shell.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell.h,v
retrieving revision 1.34
diff -p -u -w -r1.34 rb-shell.h
--- shell/rb-shell.h	29 May 2006 01:16:07 -0000	1.34
+++ shell/rb-shell.h	10 Jul 2006 22:58:34 -0000
@@ -1,5 +1,4 @@
-/*
- *  arch-tag: Header for main Rhythmbox shell
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
  *
  *  Copyright (C) 2002 Jorn Baayen
  *  Copyright (C) 2004 Colin Walters <walters@redhat.com>
@@ -80,24 +79,30 @@ typedef struct
 
 GType		rb_shell_get_type	(void);
 
-RBShell *	rb_shell_new		(int argc, char **argv,
+RBShell *	  rb_shell_new		                    (int argc,
+							     char **argv,
 					 gboolean no_registration,
 					 gboolean no_update,
 					 gboolean dry_run,
 					 char *rhythmdb);
 
-gboolean        rb_shell_present        (RBShell *shell, guint32 timestamp, GError **error);
+gboolean          rb_shell_present                          (RBShell *shell,
+							     guint32 timestamp,
+							     GError **error);
 
-RhythmDBEntryType rb_shell_guess_type_for_uri (RBShell *shell, const char *uri);
+RBSource *        rb_shell_guess_source_for_uri             (RBShell *shell,
+							     const char *uri);
 
 gboolean        rb_shell_add_uri        (RBShell *shell,
-					 RhythmDBEntryType entry_type,
 					 const char *uri,
 					 const char *title,
 					 const char *genre,
 					 GError **error);
 
-gboolean        rb_shell_load_uri       (RBShell *shell, const char *uri, gboolean play, GError **error);
+gboolean           rb_shell_load_uri                        (RBShell *shell,
+							     const char *uri,
+							     gboolean play,
+							     GError **error);
 
 GObject *       rb_shell_get_player     (RBShell *shell);
 const char *    rb_shell_get_player_path(RBShell *shell);
@@ -138,18 +143,28 @@ void            rb_shell_hidden_notify  
 					 GtkWidget *icon,
 					 const char *secondary);
 
+gboolean           rb_shell_get_party_mode                  (RBShell *shell);
+
+RBSource *         rb_shell_get_source_by_entry_type        (RBShell *shell,
+							     RhythmDBEntryType type);
 void            rb_shell_register_entry_type_for_source (RBShell *shell,
 							 RBSource *source,
 							 RhythmDBEntryType type);
-RBSource * rb_shell_get_source_by_entry_type (RBShell *shell,
-					      RhythmDBEntryType type);
+void               rb_shell_register_source                 (RBShell *shell,
+							     RBSource *source);
+void               rb_shell_unregister_source               (RBShell *shell,
+							     RBSource *source);
 
-gboolean        rb_shell_get_party_mode (RBShell *shell);
-
-void rb_shell_append_source (RBShell *shell, RBSource *source, RBSource *parent);
+void               rb_shell_append_source                   (RBShell *shell,
+							     RBSource *source,
+							     RBSource *parent);
 
-void rb_shell_add_widget (RBShell *shell, GtkWidget *widget, RBShellUILocation location);
-void rb_shell_remove_widget (RBShell *shell, GtkWidget *widget, RBShellUILocation location);
+void               rb_shell_add_widget                      (RBShell *shell,
+							     GtkWidget *widget,
+							     RBShellUILocation location);
+void               rb_shell_remove_widget                   (RBShell *shell,
+							     GtkWidget *widget,
+							     RBShellUILocation location);
 
 G_END_DECLS
 
Index: sources/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/Makefile.am,v
retrieving revision 1.42
diff -p -u -w -r1.42 Makefile.am
--- sources/Makefile.am	10 Jul 2006 02:00:36 -0000	1.42
+++ sources/Makefile.am	10 Jul 2006 22:58:34 -0000
@@ -12,8 +12,6 @@ libsourcesimpl_la_SOURCES =		\
 	rb-browser-source.h	\
 	rb-library-source.c		\
 	rb-library-source.h		\
-	rb-iradio-source.c		\
-	rb-iradio-source.h		\
 	rb-podcast-source.c		\
 	rb-podcast-source.h		\
 	rb-removable-media-source.c	\
@@ -44,8 +42,6 @@ INCLUDES =						\
 	-I$(top_srcdir)/metadata 			\
 	-I$(top_srcdir)/widgets 			\
 	-I$(top_srcdir)/library 			\
-	-I$(top_srcdir)/player	 			\
-	-I$(top_srcdir)/iradio				\
 	-I$(top_srcdir)/podcast				\
 	-I$(top_srcdir)/shell				\
 	-I$(top_srcdir)/daapsharing			\
Index: sources/rb-audiocd-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-audiocd-source.c,v
retrieving revision 1.40
diff -p -u -w -r1.40 rb-audiocd-source.c
--- sources/rb-audiocd-source.c	5 Jul 2006 14:25:18 -0000	1.40
+++ sources/rb-audiocd-source.c	10 Jul 2006 22:58:34 -0000
@@ -184,7 +184,7 @@ rb_audiocd_source_new (RBShell *shell,
 
 	g_free (device_path);
 
-	rb_shell_register_entry_type_for_source (shell, RB_SOURCE (source), entry_type);
+	rb_shell_register_source (shell, RB_SOURCE (source));
 
 	return RB_REMOVABLE_MEDIA_SOURCE (source);
 }
Index: sources/rb-daap-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-daap-source.c,v
retrieving revision 1.37
diff -p -u -w -r1.37 rb-daap-source.c
--- sources/rb-daap-source.c	19 Jun 2006 04:40:04 -0000	1.37
+++ sources/rb-daap-source.c	10 Jul 2006 22:58:34 -0000
@@ -329,8 +329,7 @@ rb_daap_source_new (RBShell *shell,
 		g_object_unref (icon);
 	}
 
-	rb_shell_register_entry_type_for_source (shell, source,
-						 type);
+	rb_shell_register_source (shell, source);
 
 	return source;
 }
Index: sources/rb-ipod-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-ipod-source.c,v
retrieving revision 1.57
diff -p -u -w -r1.57 rb-ipod-source.c
--- sources/rb-ipod-source.c	5 Jul 2006 14:25:18 -0000	1.57
+++ sources/rb-ipod-source.c	10 Jul 2006 22:58:34 -0000
@@ -214,7 +214,7 @@ rb_ipod_source_new (RBShell *shell, Gnom
 					  "sourcelist-group", RB_SOURCELIST_GROUP_REMOVABLE,
 					  NULL));
 
-	rb_shell_register_entry_type_for_source (shell, RB_SOURCE (source), entry_type);
+	rb_shell_register_source (shell, RB_SOURCE (source));
 
 	return RB_REMOVABLE_MEDIA_SOURCE (source);
 }
Index: sources/rb-iradio-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-iradio-source.c,v
retrieving revision 1.123
diff -p -u -w -r1.123 rb-iradio-source.c
--- sources/rb-iradio-source.c	5 Jul 2006 14:25:18 -0000	1.123
+++ sources/rb-iradio-source.c	10 Jul 2006 22:58:34 -0000
@@ -1,7 +1,5 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
  * 
- *  arch-tag: Implementation of Internet Radio source object
- *
  *  Copyright (C) 2002,2003 Colin Walters <walters@debian.org>
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -24,11 +22,11 @@
 
 #include <string.h>
 
+#include <libxml/tree.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include <glade/glade.h>
 #include <libgnomevfs/gnome-vfs-uri.h>
-#include <libxml/tree.h>
 
 #include "rb-iradio-source.h"
 
@@ -94,6 +92,7 @@ static void impl_song_properties (RBSour
 static RBSourceEOFType impl_handle_eos (RBSource *asource);
 static gboolean impl_show_popup (RBSource *source);
 static GList *impl_get_ui_actions (RBSource *source);
+static GList *impl_get_entry_types (RBSource *source);
 
 static void rb_iradio_source_do_query (RBIRadioSource *source);
 
@@ -181,9 +180,12 @@ rb_iradio_source_class_init (RBIRadioSou
 	source_class->impl_can_delete = (RBSourceFeatureFunc) rb_true_function;
 	source_class->impl_can_pause = (RBSourceFeatureFunc) rb_false_function;
 	source_class->impl_can_search = (RBSourceFeatureFunc) rb_true_function;
+	source_class->impl_add_uri = impl_add_uri;
 	source_class->impl_delete = impl_delete;
 	source_class->impl_get_browser_key  = impl_get_browser_key;
 	source_class->impl_get_entry_view = impl_get_entry_view;
+	source_class->impl_get_entry_types = impl_get_entry_types;
+	source_class->impl_get_uri_schemes = impl_get_uri_schemes;
 	source_class->impl_get_status  = impl_get_status;
 	source_class->impl_get_ui_actions = impl_get_ui_actions;
 	source_class->impl_handle_eos = impl_handle_eos;
@@ -404,14 +406,26 @@ RBSource *
 rb_iradio_source_new (RBShell *shell)
 {
 	RBSource *source;
+	RhythmDBEntryType entry_type;
+
+	entry_type = rhythmdb_entry_register_type_full ("iradio");
+	rhythmdb_entry_type_set_can_sync_metadata_func (entry_type,
+							(RhythmDBEntryCanSyncFunc)rb_true_function,
+							NULL,
+							NULL);
+	rhythmdb_entry_type_set_sync_metadata_func (entry_type,
+						    (RhythmDBEntrySyncFunc)rb_null_function,
+						    NULL,
+						    NULL);
 
 	source = RB_SOURCE (g_object_new (RB_TYPE_IRADIO_SOURCE,
+					  "entry-type", entry_type,
 					  "name", _("Radio"),
 					  "shell", shell,
+					  "sourcelist-group", RB_SOURCELIST_GROUP_FIXED,
 					  NULL));
 
-	rb_shell_register_entry_type_for_source (shell, source, 
-						 RHYTHMDB_ENTRY_TYPE_IRADIO_STATION);
+	rb_shell_register_source (shell, source);
 
 	return source;
 }
@@ -488,6 +502,26 @@ rb_iradio_source_add_station (RBIRadioSo
 }
 
 static void
+impl_add_uri (RBSource   *asource,
+	      const char *uri,
+	      const char *title,
+	      const char *genre)
+{
+	RBIRadioSource *source = RB_IRADIO_SOURCE (asource);
+
+	if (rb_uri_is_local (uri)) {
+		rb_iradio_source_add_from_playlist (source,
+						    uri);
+	} else {
+		rb_iradio_source_add_station (source,
+					      uri,
+					      title,
+					      genre);
+	}
+	return TRUE;
+}
+
+static void
 impl_search (RBSource *asource, const char *search_text)
 {
 	RBIRadioSource *source = RB_IRADIO_SOURCE (asource);
@@ -518,6 +552,32 @@ impl_get_entry_view (RBSource *asource)
 	RBIRadioSource *source = RB_IRADIO_SOURCE (asource);
 
 	return source->priv->stations;
+}
+
+static GList *
+impl_get_entry_types (RBSource *asource)
+{
+	RBIRadioSource *source = RB_IRADIO_SOURCE (asource);
+	GList          *list = NULL;
+
+	list = g_list_prepend (list, source->priv->entry_type);
+
+	return list;
+}
+
+static GList *
+impl_get_uri_schemes (RBSource *asource)
+{
+	RBIRadioSource    *source = RB_IRADIO_SOURCE (asource);
+	static const char *schemes[] = { "http", "pnm", "rtsp", "mms", "mmsh" };
+	GList             *list = NULL;
+	int                i;
+
+	for (i = 0; i < G_N_ELEMENTS (schemes); i++) {
+		list = g_list_prepend (list, schemes[i]);
+	}
+
+	return list;
 }
 
 static RBSourceEOFType
Index: sources/rb-library-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-library-source.c,v
retrieving revision 1.175
diff -p -u -w -r1.175 rb-library-source.c
--- sources/rb-library-source.c	30 Jun 2006 04:22:27 -0000	1.175
+++ sources/rb-library-source.c	10 Jul 2006 22:58:34 -0000
@@ -309,8 +309,8 @@ rb_library_source_new (RBShell *shell)
 					  "shell", shell,
 					  "icon", icon,
 					  NULL));
-	rb_shell_register_entry_type_for_source (shell, source,
-						 RHYTHMDB_ENTRY_TYPE_SONG);
+
+	rb_shell_register_source (shell, source);
 
 	return source;
 }
Index: sources/rb-podcast-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-podcast-source.c,v
retrieving revision 1.70
diff -p -u -w -r1.70 rb-podcast-source.c
--- sources/rb-podcast-source.c	19 Jun 2006 04:40:04 -0000	1.70
+++ sources/rb-podcast-source.c	10 Jul 2006 22:58:34 -0000
@@ -105,12 +105,10 @@ static void rb_podcast_source_show_brows
 
 static void rb_podcast_source_state_prefs_sync 		(RBPodcastSource *source);
 
-
 static void feed_select_change_cb 			(RBPropertyView *propview, 
 							 GList *feeds,
 			 			       	 RBPodcastSource *podcast_source);
 							 
-
 static void rb_podcast_source_posts_view_sort_order_changed_cb (RBEntryView *view, 
 								RBPodcastSource *source);
 
@@ -122,7 +120,6 @@ static void rb_podcast_source_download_s
 static void rb_podcast_source_btn_file_change_cb 	(GtkFileChooserButton *widget, 
 							 const char *key);
 
-
 static void posts_view_drag_data_received_cb 		(GtkWidget *widget,
 					      		 GdkDragContext *dc,
   				              		 gint x,
@@ -236,14 +233,10 @@ static void impl_get_status				(RBSource
 							 char **progress_text, 
 							 float *progress);
 
-
-
-
 #define CMD_PATH_SHOW_BROWSER "/commands/ShowBrowser"
 #define CMD_PATH_CURRENT_STATION "/commands/CurrentStation"
 #define CMD_PATH_SONG_INFO    "/commands/SongInfo"
 
-
 #define CONF_UI_PODCAST_DIR 			CONF_PREFIX "/ui/podcast"
 #define CONF_UI_PODCAST_COLUMNS_SETUP 		CONF_PREFIX "/ui/podcast/columns_setup"
 #define CONF_STATE_PODCAST_PREFIX		CONF_PREFIX "/state/podcast"
@@ -323,7 +316,6 @@ static const GtkTargetEntry posts_view_d
 	{  "application/rss+xml", 0, 2 },
 };
 
-
 enum
 {
 	PROP_0,
@@ -333,7 +325,6 @@ enum
 
 G_DEFINE_TYPE (RBPodcastSource, rb_podcast_source, RB_TYPE_SOURCE)
 
-
 static void
 rb_podcast_source_class_init (RBPodcastSourceClass *klass)
 {
@@ -544,7 +535,6 @@ rb_podcast_source_constructor (GType typ
 
 	g_object_unref (shell);
 	
-
 	/* set up posts view */
 	source->priv->posts = rb_entry_view_new (source->priv->db, 
 						 rb_shell_get_player (shell),
@@ -555,7 +545,6 @@ rb_podcast_source_constructor (GType typ
 				 G_CALLBACK (rb_podcast_source_entry_activated_cb),
 				 source, 0);
 
-
 	/* Podcast date column */
 	column = gtk_tree_view_column_new ();
 	renderer = gtk_cell_renderer_text_new();
@@ -581,7 +570,6 @@ rb_podcast_source_constructor (GType typ
 					    _("_Date"), "Date", 
 					    (GCompareDataFunc) rb_podcast_source_post_date_cell_sort_func, 0);
 						    
-
 	rb_entry_view_append_column (source->priv->posts, RB_ENTRY_VIEW_COL_TITLE, TRUE);
 	
 	/* COLUMN FEED */
@@ -603,13 +591,11 @@ rb_podcast_source_constructor (GType typ
 					    _("_Feed"), "Feed", 
 					    (GCompareDataFunc) rb_podcast_source_post_feed_cell_sort_func, 0);
 
-	
 	rb_entry_view_append_column (source->priv->posts, RB_ENTRY_VIEW_COL_DURATION, FALSE);
 	rb_entry_view_append_column (source->priv->posts, RB_ENTRY_VIEW_COL_RATING, FALSE);
 	rb_entry_view_append_column (source->priv->posts, RB_ENTRY_VIEW_COL_PLAY_COUNT, FALSE);
 	rb_entry_view_append_column (source->priv->posts, RB_ENTRY_VIEW_COL_LAST_PLAYED, FALSE);
 
-
 	/* Status column */
 	column = gtk_tree_view_column_new ();
 	renderer = gtk_cell_renderer_progress_new();
@@ -647,8 +633,6 @@ rb_podcast_source_constructor (GType typ
 				 G_CALLBACK (rb_podcast_source_posts_view_sort_order_changed_cb),
 				 source, 0);
 
-
-
 	g_signal_connect (G_OBJECT (source->priv->podcast_mg),
 			  "status_changed",
 			  G_CALLBACK (rb_podcast_source_download_status_changed_cb),
@@ -667,7 +651,6 @@ rb_podcast_source_constructor (GType typ
 	g_signal_connect_object (G_OBJECT (source->priv->posts), "show_popup",
 				 G_CALLBACK (rb_podcast_source_songs_show_popup_cb), source, 0);
 	
-
 	/* configure feed view */
 	source->priv->feeds = rb_property_view_new (source->priv->db,  RHYTHMDB_PROP_LOCATION, _("Feed"));	
 	rb_property_view_set_selection_mode (RB_PROPERTY_VIEW (source->priv->feeds), GTK_SELECTION_MULTIPLE);
@@ -752,10 +735,8 @@ rb_podcast_source_constructor (GType typ
 
 	gtk_box_pack_start_defaults (GTK_BOX (source->priv->vbox), source->priv->paned);
 
-
 	rb_podcast_source_state_prefs_sync (source);
 	
-	
 	eel_gconf_notification_add (CONF_STATE_PODCAST_PREFIX,
 				    (GConfClientNotifyFunc) rb_podcast_source_state_pref_changed,
 				    source);
@@ -764,7 +745,6 @@ rb_podcast_source_constructor (GType typ
 
 	rb_podcast_source_do_query (source, RB_PODCAST_QUERY_TYPE_ALL);
 	
-
 	return G_OBJECT (source);
 }
 
@@ -819,6 +799,8 @@ rb_podcast_source_new (RBShell *shell)
 					  "shell", shell,
 					  NULL));
 
+	rb_shell_register_source (shell, source);
+
 	rb_shell_register_entry_type_for_source (shell, source, 
 						 RHYTHMDB_ENTRY_TYPE_PODCAST_FEED);
 	rb_shell_register_entry_type_for_source (shell, source, 
@@ -996,7 +978,6 @@ rb_podcast_source_download_status_change
 
 }
 
-
 static void
 rb_podcast_source_songs_show_popup_cb (RBEntryView *view,
 				       gboolean over_entry,
@@ -1038,7 +1019,6 @@ rb_podcast_source_songs_show_popup_cb (R
 	}
 }
 
-
 static void
 rb_podcast_source_feeds_show_popup_cb (RBPropertyView *view,
 				       RBPodcastSource *source)
@@ -1070,8 +1050,6 @@ rb_podcast_source_feeds_show_popup_cb (R
 	}
 }
 
-
-
 static void
 feed_select_change_cb (RBPropertyView *propview,
 		       GList *feeds,
@@ -1091,8 +1069,6 @@ feed_select_change_cb (RBPropertyView *p
 	rb_source_notify_filter_changed (RB_SOURCE (source));
 }
 
-
-
 static void
 rb_podcast_source_show_browser (RBPodcastSource *source,
 			       gboolean show)
@@ -1113,7 +1089,6 @@ rb_podcast_source_show_browser (RBPodcas
 	}
 }
 
-
 static GPtrArray *
 construct_query_from_selection (RBPodcastSource *source)
 {
@@ -1233,7 +1208,6 @@ impl_show_popup (RBSource *source)
 	return TRUE;
 }
 
-
 static GtkWidget *
 impl_get_config_widget (RBSource *asource, RBShellPreferences *prefs)
 {
@@ -1246,7 +1220,6 @@ impl_get_config_widget (RBSource *asourc
 	if (source->priv->config_widget)
 		return source->priv->config_widget;
 
-
 	xml = rb_glade_xml_new ("podcast-prefs.glade", "podcast_vbox", source);
 	source->priv->config_widget = glade_xml_get_widget (xml, "podcast_vbox");
 	
@@ -1281,7 +1254,6 @@ rb_podcast_source_btn_file_change_cb (Gt
 	g_free (uri);
 }
 
-
 static void
 posts_view_drag_data_received_cb (GtkWidget *widget,
 				  GdkDragContext *dc,
@@ -1618,7 +1590,6 @@ rb_podcast_source_feed_title_cell_data_f
 	g_free (title);
 }
 
-
 static void
 rb_podcast_source_post_date_cell_data_func (GtkTreeViewColumn *column,
 					    GtkCellRenderer *renderer,
@@ -1647,9 +1618,6 @@ rb_podcast_source_post_date_cell_data_fu
 	g_free (str);
 }
 
-
-
-
 static void
 rb_podcast_source_cb_interval_changed_cb (GtkComboBox *box, gpointer cb_data)
 {
@@ -1738,7 +1706,6 @@ impl_receive_drag (RBSource *asource, Gt
 	return TRUE;
 }
 
-
 static void
 rb_podcast_source_start_download_cb (RBPodcastManager *pd,
 				     RhythmDBEntry *entry,
@@ -1991,4 +1958,3 @@ impl_get_status (RBSource *source, char 
 		*text = g_strdup ("");
 	}
 }
-
Index: sources/rb-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-source.c,v
retrieving revision 1.72
diff -p -u -w -r1.72 rb-source.c
--- sources/rb-source.c	20 Jun 2006 12:10:18 -0000	1.72
+++ sources/rb-source.c	10 Jul 2006 22:58:34 -0000
@@ -51,6 +51,9 @@ static void rb_source_get_property (GObj
 
 static char * default_get_browser_key (RBSource *source);
 static GList *default_get_property_views (RBSource *source);
+static GList *default_get_entry_types (RBSource *source);
+static GList *default_get_mime_types (RBSource *source);
+static GList *default_get_uri_schemes (RBSource *source);
 static gboolean default_can_rename (RBSource *source);
 static gboolean default_can_search (RBSource *source);
 static GList *default_copy (RBSource *source);
@@ -122,10 +125,14 @@ rb_source_class_init (RBSourceClass *kla
 	object_class->set_property = rb_source_set_property;
 	object_class->get_property = rb_source_get_property;
 
+	klass->impl_add_uri = NULL;
 	klass->impl_can_browse = (RBSourceFeatureFunc) rb_false_function;
 	klass->impl_get_browser_key = default_get_browser_key;
 	klass->impl_browser_toggled = NULL;
 	klass->impl_get_property_views = default_get_property_views;
+	klass->impl_get_entry_types = default_get_entry_types;
+	klass->impl_get_mime_types = default_get_mime_types;
+	klass->impl_get_uri_schemes = default_get_uri_schemes;
 	klass->impl_can_rename = default_can_rename;
 	klass->impl_can_search = default_can_search;
 	klass->impl_can_cut = (RBSourceFeatureFunc) rb_false_function;
@@ -412,6 +419,21 @@ rb_source_get_property (GObject *object,
 	}
 }
 
+gboolean
+rb_source_add_uri (RBSource   *source,
+		   const char *uri,
+		   const char *title,
+		   const char *genre)
+{
+	RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
+
+	if (klass->impl_add_uri) {
+		return klass->impl_add_uri (source, uri, title, genre);
+	} else {
+		return FALSE;
+	}
+}
+
 static void
 default_get_status (RBSource *source, char **text, char **progress_text, float *progress)
 {
@@ -536,6 +558,24 @@ default_get_property_views (RBSource *so
 	return NULL;
 }
 
+static GList *
+default_get_entry_types (RBSource *source)
+{
+	return NULL;
+}
+
+static GList *
+default_get_mime_types (RBSource *source)
+{
+	return NULL;
+}
+
+static GList *
+default_get_uri_schemes (RBSource *source)
+{
+	return NULL;
+}
+
 GList *
 rb_source_get_property_views (RBSource *source)
 {
@@ -544,6 +584,30 @@ rb_source_get_property_views (RBSource *
 	return klass->impl_get_property_views (source);
 }
 
+GList *
+rb_source_get_entry_types (RBSource *source)
+{
+	RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
+
+	return klass->impl_get_entry_types (source);
+}
+
+GList *
+rb_source_get_mime_types (RBSource *source)
+{
+	RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
+
+	return klass->impl_get_mime_types (source);
+}
+
+GList *
+rb_source_get_uri_schemes (RBSource *source)
+{
+	RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
+
+	return klass->impl_get_uri_schemes (source);
+}
+
 static gboolean
 default_can_rename (RBSource *source)
 {
@@ -878,17 +942,20 @@ default_get_entry_view (RBSource *source
 	return NULL;
 }
 
-static void default_activate (RBSource *source)
+static void
+default_activate (RBSource *source)
 {
 	return;
 }
 
-static void default_deactivate (RBSource *source)
+static void
+default_deactivate (RBSource *source)
 {
 	return;
 }
 
-void rb_source_activate (RBSource *source)
+void
+rb_source_activate (RBSource *source)
 {
 	RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
@@ -897,7 +964,8 @@ void rb_source_activate (RBSource *sourc
 	return;
 }
 
-void rb_source_deactivate (RBSource *source)
+void
+rb_source_deactivate (RBSource *source)
 {
 	RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
Index: sources/rb-source.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-source.h,v
retrieving revision 1.46
diff -p -u -w -r1.46 rb-source.h
--- sources/rb-source.h	4 Jun 2006 10:19:22 -0000	1.46
+++ sources/rb-source.h	10 Jul 2006 22:58:35 -0000
@@ -1,4 +1,5 @@
-/*
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
  *  arch-tag: Header for the abstract base class of all sources
  *
  *  Copyright (C) 2002 Jorn Baayen <jorn@nl.linux.org>
@@ -85,6 +86,10 @@ struct _RBSourceClass
 	void (*artistalbum_changed)	(RBSource *source);
 
 	/* methods */
+	gboolean        (*impl_add_uri)         (RBSource   *source,
+                                                 const char *uri,
+                                                 const char *title,
+                                                 const char *genre);
 	void		(*impl_get_status)	(RBSource *source, char **text, char **progress_text, float *progress);
 
 	gboolean	(*impl_can_browse)	(RBSource *source);
@@ -93,6 +98,9 @@ struct _RBSourceClass
 
 	RBEntryView *	(*impl_get_entry_view)	(RBSource *source);
 	GList *		(*impl_get_property_views)	(RBSource *source);
+	GList *		(*impl_get_entry_types) (RBSource *source);
+	GList *		(*impl_get_mime_types)  (RBSource *source);
+	GList *		(*impl_get_uri_schemes) (RBSource *source);
 
 	gboolean	(*impl_can_rename)	(RBSource *source);
 
@@ -144,6 +152,10 @@ void		rb_source_update_play_statistics(R
 						 RhythmDBEntry *entry);
 
 /* general interface */
+gboolean        rb_source_add_uri               (RBSource   *source,
+                                                 const char *uri,
+                                                 const char *title,
+                                                 const char *genre);
 void	        rb_source_set_pixbuf		(RBSource *source, GdkPixbuf *pixbuf);
 void	        rb_source_get_status		(RBSource *source, char **text, char **progress_text, float *progress);
 
@@ -154,6 +166,9 @@ void		rb_source_browser_toggled	(RBSourc
 RBEntryView *	rb_source_get_entry_view	(RBSource *source);
 
 GList *		rb_source_get_property_views	(RBSource *source);
+GList *		rb_source_get_entry_types	(RBSource *source);
+GList *		rb_source_get_mime_types	(RBSource *source);
+GList *		rb_source_get_uri_schemes	(RBSource *source);
 
 gboolean	rb_source_can_rename		(RBSource *source);
 
