[banshee: 32/57] Added a chunk result handler to unify the code when doing all media type searches



commit cbbf5ab81eebfe146b13e2a67e2063f80d3916fa
Author: Tobias Arrskog <topfs2 xbmc org>
Date:   Thu Jul 14 19:06:27 2011 +0200

    Added a chunk result handler to unify the code when doing all media type searches

 .../Banshee.UPnPClient/UPnPServerSource.cs         |   92 ++++++++++---------
 1 files changed, 48 insertions(+), 44 deletions(-)
---
diff --git a/src/Extensions/Banshee.UPnPClient/Banshee.UPnPClient/UPnPServerSource.cs b/src/Extensions/Banshee.UPnPClient/Banshee.UPnPClient/UPnPServerSource.cs
index 5ccaef7..d99bf72 100644
--- a/src/Extensions/Banshee.UPnPClient/Banshee.UPnPClient/UPnPServerSource.cs
+++ b/src/Extensions/Banshee.UPnPClient/Banshee.UPnPClient/UPnPServerSource.cs
@@ -82,6 +82,20 @@ namespace Banshee.UPnPClient
             music_source = null;
         }
 
+        delegate void ChunkHandler<T> (Results<T> results);
+        void HandleResults<T> (Results<T> results, RemoteContentDirectory remoteContentDirectory, ChunkHandler<T> chunkHandler)
+        {
+            bool hasresults = results.Count > 0;
+
+            while (hasresults) {
+                chunkHandler(results);
+
+                hasresults = results.HasMoreResults;
+                if (hasresults)
+                    results = results.GetMoreResults(remoteContentDirectory);
+            }
+        }
+
         void Parse (ContentDirectoryController contentDirectory)
         {
             RemoteContentDirectory remoteContentDirectory = new RemoteContentDirectory (contentDirectory);
@@ -93,22 +107,15 @@ namespace Banshee.UPnPClient
             if (!recursiveBrowse) {
                 try {
                     Hyena.Log.Debug ("Searchable, lets search");
-                    Results<MusicTrack> results = remoteContentDirectory.Search<MusicTrack>(root, visitor => visitor.VisitDerivedFrom("upnp:class", "object.item.audioItem.musicTrack"), new ResultsSettings());
-                    bool hasresults = results.Count > 0;
-
-                    while (hasresults) {
-                        foreach (var item in results) {
-                            musicTracks.Add(item as MusicTrack);
-                        }
-
-                        if (results.HasMoreResults) {
-                            results = results.GetMoreResults(remoteContentDirectory);
-                            music_source.AddTracks (musicTracks);
-                            musicTracks.Clear();
-                        }
-                        else
-                            hasresults = false;
-                    }
+
+                    HandleResults<MusicTrack> (remoteContentDirectory.Search<MusicTrack>(root, visitor => visitor.VisitDerivedFrom("upnp:class", "object.item.audioItem.musicTrack"), new ResultsSettings()),
+                                               remoteContentDirectory,
+                                               chunk => {
+                                                            foreach (var item in chunk)
+                                                                musicTracks.Add(item as MusicTrack);
+
+                                                            music_source.AddTracks (musicTracks);
+                                                        });
                 } catch (Exception exception) {
                     Hyena.Log.Exception (exception);
                     recursiveBrowse = true;
@@ -133,35 +140,32 @@ namespace Banshee.UPnPClient
         {
             if (depth > 10 || (container.ChildCount != null && container.ChildCount == 0))
                 return;
-            Results<Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object> results = remoteContentDirectory.GetChildren<Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object>(container);
-            bool hasresults = results.Count > 0;
-            while (hasresults) {
-                foreach (var upnp_object in results) {
-                    if (upnp_object is Item) {
-                        Item item = upnp_object as Item;
-
-                        if (item.IsReference || item.Resources.Count == 0)
-                          continue;
-
-                        if (item is MusicTrack) {
-                            musicTracks.Add(item as MusicTrack);
-                        }
-                    }
-                    else if (upnp_object is Container) {
-                        ParseContainer (remoteContentDirectory, upnp_object as Container, depth + 1, musicTracks);
-                    }
-
-                    if (musicTracks.Count > 500) {
-                        music_source.AddTracks (musicTracks);
-                        musicTracks.Clear();
-                    }
-                }
 
-                if (results.HasMoreResults)
-                    results = results.GetMoreResults(remoteContentDirectory);
-                else
-                    hasresults = false;
-            }
+            HandleResults<Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object> (
+                                       remoteContentDirectory.GetChildren<Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object>(container),
+                                       remoteContentDirectory,
+                                       chunk => {
+                                                    foreach (var upnp_object in chunk) {
+                                                        if (upnp_object is Item) {
+                                                            Item item = upnp_object as Item;
+
+                                                            if (item.IsReference || item.Resources.Count == 0)
+                                                              continue;
+
+                                                            if (item is MusicTrack) {
+                                                                musicTracks.Add(item as MusicTrack);
+                                                            }
+                                                        }
+                                                        else if (upnp_object is Container) {
+                                                            ParseContainer (remoteContentDirectory, upnp_object as Container, depth + 1, musicTracks);
+                                                        }
+
+                                                        if (musicTracks.Count > 500) {
+                                                            music_source.AddTracks (musicTracks);
+                                                            musicTracks.Clear();
+                                                        }
+                                                    }
+                                                });
         }
 
         public void Disconnect ()



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