Esempio n. 1
0
        public ContentDirectoryInfo(RemoteContentDirectory contentDirectory)
        {
            if (contentDirectory == null)
            {
                throw new ArgumentNullException("contentDirectory");
            }

            this.content_directry = contentDirectory;
            this.store            = new TreeStore(typeof(ObjectRow));
            var objects = new TreeView();
            var column  = new TreeViewColumn();
            var cell    = new CellRendererText();

            column.PackStart(cell, true);
            column.SetCellDataFunc(cell, RenderObject);
            column.Title = "Objects";
            objects.AppendColumn(column);
            objects.Selection.Changed += HandleObjectsSelectionChanged;
            objects.RowExpanded       += HandleObjectsRowExpanded;
            objects.Model              = store;

            var root = contentDirectory.GetRootObject();

            store.AppendValues(new ObjectRow(root));
            TreeIter iter;

            store.GetIterFirst(out iter);
            store.AppendValues(iter, loading);

            Add(objects);
        }
        public ContentDirectoryInfo (RemoteContentDirectory contentDirectory)
        {
            if (contentDirectory == null) {
                throw new ArgumentNullException ("contentDirectory");
            }

            this.content_directry = contentDirectory;
            this.store = new TreeStore (typeof (ObjectRow));
            var objects = new TreeView ();
            var column = new TreeViewColumn ();
            var cell = new CellRendererText ();
            column.PackStart (cell, true);
            column.SetCellDataFunc (cell, RenderObject);
            column.Title = "Objects";
            objects.AppendColumn (column);
            objects.Selection.Changed += HandleObjectsSelectionChanged;
            objects.RowExpanded += HandleObjectsRowExpanded;
            objects.Model = store;

            var root = contentDirectory.GetRootObject ();
            store.AppendValues (new ObjectRow (root));
            TreeIter iter;
            store.GetIterFirst (out iter);
            store.AppendValues (iter, loading);

            Add (objects);
        }
        public Gtk.Widget ProvideInfo(ServiceAnnouncement service)
        {
            var controller        = service.GetService().GetController();
            var content_directory = new RemoteContentDirectory(new ContentDirectoryController(controller));

            return(new ContentDirectoryInfo(content_directory));
        }
Esempio n. 4
0
        protected override Results <T> GetMoreResults(RemoteContentDirectory contentDirectory,
                                                      ResultsSettings settings)
        {
            if (contentDirectory == null)
            {
                throw new ArgumentNullException("contentDirectory");
            }

            return(contentDirectory.Search <T> (Container, Query, settings));
        }
Esempio n. 5
0
        void ParseContainer(RemoteContentDirectory remote_dir, Container container, int depth, List <MusicTrack> music_tracks, List <VideoItem> video_tracks)
        {
            if (depth > 10 || (container.ChildCount != null && container.ChildCount == 0))
            {
                return;
            }

            HandleResults <Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object> (
                remote_dir.GetChildren <Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object> (container),
                remote_dir,
                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)
                        {
                            music_tracks.Add(item as MusicTrack);
                        }
                        else if (item is VideoItem)
                        {
                            video_tracks.Add(item as VideoItem);
                        }
                    }
                    else if (upnp_object is Container)
                    {
                        ParseContainer(remote_dir, upnp_object as Container, depth + 1, music_tracks, video_tracks);
                    }

                    if (music_tracks.Count > 500)
                    {
                        AddMusic(music_tracks);
                        music_tracks.Clear();
                    }
                    if (video_tracks.Count > 100)
                    {
                        AddVideo(video_tracks);
                        video_tracks.Clear();
                    }
                }
            });
        }
Esempio n. 6
0
        void HandleResults <T> (Results <T> results, RemoteContentDirectory remote_dir, ChunkHandler <T> chunkHandler)
        {
            bool has_results = results.Count > 0;

            while (has_results)
            {
                chunkHandler(results);

                has_results = results.HasMoreResults;
                if (has_results)
                {
                    results = results.GetMoreResults(remote_dir);
                }
            }
        }
Esempio n. 7
0
 void TraverseContainer(RemoteContentDirectory remote_dir, Container container, string[] hierarchy, int position, List <MusicTrack> music_tracks, List <VideoItem> video_tracks)
 {
     if (hierarchy != null && hierarchy.Length > position)
     {
         HandleResults <Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object> (
             remote_dir.GetChildren <Mono.Upnp.Dcp.MediaServer1.ContentDirectory1.Object> (container),
             remote_dir,
             chunk => {
             foreach (var upnp_object in chunk)
             {
                 if (upnp_object is Container && upnp_object.Title == hierarchy[position])
                 {
                     TraverseContainer(remote_dir, upnp_object as Container, hierarchy, position + 1, music_tracks, video_tracks);
                 }
             }
         });
     }
     else
     {
         ParseContainer(remote_dir, container, 0, music_tracks, video_tracks);
     }
 }
 public Gtk.Widget ProvideInfo (ServiceAnnouncement service)
 {
     var controller = service.GetService ().GetController ();
     var content_directory = new RemoteContentDirectory (new ContentDirectoryController (controller));
     return new ContentDirectoryInfo (content_directory);
 }
Esempio n. 9
0
        void Parse(Device device, ContentDirectoryController content_directory)
        {
            RemoteContentDirectory remote_dir = new RemoteContentDirectory(content_directory);
            DateTime begin            = DateTime.Now;
            bool     recursive_browse = !content_directory.CanSearch;

            try {
                Container root = remote_dir.GetRootObject();

                if (!recursive_browse)
                {
                    try {
                        Log.Debug("Content directory is searchable, let's search");

                        HandleResults <MusicTrack> (remote_dir.Search <MusicTrack>(root, visitor => visitor.VisitDerivedFrom("upnp:class", "object.item.audioItem.musicTrack"), new ResultsSettings()),
                                                    remote_dir,
                                                    chunk => {
                            List <MusicTrack> music_tracks = new List <MusicTrack>();
                            foreach (var item in chunk)
                            {
                                music_tracks.Add(item as MusicTrack);
                            }

                            AddMusic(music_tracks);
                        });

                        HandleResults <VideoItem>  (remote_dir.Search <VideoItem>(root, visitor => visitor.VisitDerivedFrom("upnp:class", "object.item.videoItem"), new ResultsSettings()),
                                                    remote_dir,
                                                    chunk => {
                            List <VideoItem> video_tracks = new List <VideoItem>();
                            foreach (var item in chunk)
                            {
                                video_tracks.Add(item as VideoItem);
                            }

                            AddVideo(video_tracks);
                        });
                    } catch (System.InvalidCastException exception) {
                        Log.Exception(exception);
                        recursive_browse = true;
                    }
                }

                if (recursive_browse)
                {
                    Log.Debug("Content directory is not searchable, let's browse recursively");
                    List <MusicTrack> music_tracks = new List <MusicTrack> ();
                    List <VideoItem>  video_tracks = new List <VideoItem> ();

                    foreach (var hierarchy in FindBrowseQuirks(device))
                    {
                        TraverseContainer(remote_dir, root, hierarchy, 0, music_tracks, video_tracks);
                    }

                    if (music_tracks.Count > 0)
                    {
                        AddMusic(music_tracks);
                    }
                    if (video_tracks.Count > 0)
                    {
                        AddVideo(video_tracks);
                    }
                }
            } catch (Exception exception) {
                Log.Exception(exception);
            }

            Log.Debug("Found all items on the service, took " + (DateTime.Now - begin).ToString());
        }