[banshee: 21/57] A server may return partial results, make sure we query all available.



commit 89dc5b9fb96768f5351c44b0c9eb9a1e78623346
Author: Tobias Arrskog <topfs2 xbmc org>
Date:   Tue Jul 5 17:30:45 2011 +0200

    A server may return partial results, make sure we query all available.

 .../Banshee.UPnPClient/UPnPService.cs              |   56 +++++++++++++-------
 1 files changed, 37 insertions(+), 19 deletions(-)
---
diff --git a/src/Extensions/Banshee.UPnPClient/Banshee.UPnPClient/UPnPService.cs b/src/Extensions/Banshee.UPnPClient/Banshee.UPnPClient/UPnPService.cs
index 55c3cdc..39d44fe 100644
--- a/src/Extensions/Banshee.UPnPClient/Banshee.UPnPClient/UPnPService.cs
+++ b/src/Extensions/Banshee.UPnPClient/Banshee.UPnPClient/UPnPService.cs
@@ -105,9 +105,19 @@ namespace Banshee.UPnPClient
             if (!recursiveBrowse) {
                 try {
                     Hyena.Log.Debug ("Searchable, lets search");
-					foreach (var item in remoteContentDirectory.Search<MusicTrack>(root, visitor => visitor.VisitDerivedFrom("upnp:class", "object.item.audioItem.musicTrack"), new ResultsSettings())) {
-                        musicTracks.Add(item as MusicTrack);
-					}
+                    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);
+                        else
+                            hasresults = false;
+                    }
                 } catch (Exception exception) {
                     Hyena.Log.Exception (exception);
                     recursiveBrowse = true;
@@ -132,26 +142,34 @@ 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 (source, remoteContentDirectory, upnp_object as Container, depth + 1, musicTracks);
+                    }
 
-            foreach (var upnp_object in remoteContentDirectory.GetChildren<Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object>(container)) {
-                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);
+                    if (musicTracks.Count > 500) {
+                        source.AddTracks (musicTracks);
+                        musicTracks.Clear();
                     }
                 }
-                else if (upnp_object is Container) {
-                    ParseContainer (source, remoteContentDirectory, upnp_object as Container, depth + 1, musicTracks);
-                }
 
-                if (musicTracks.Count > 500) {
-                    source.AddTracks (musicTracks);
-                    musicTracks.Clear();
-                }
+                if (results.HasMoreResults)
+                    results = results.GetMoreResults(remoteContentDirectory);
+                else
+                    hasresults = false;
             }
         }
     



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