예제 #1
0
		public Finder(UPnPDevice device, Gallery presenter)
		{
			Controller = new ContentDirectoryController(this);
			Model = MediaServerModel.GetInstance();
			Device = device;
			Presenter = presenter;
		}
예제 #2
0
        public UPnPServerSource(Device device) :  base(Catalog.GetString("UPnP Share"), device.FriendlyName, 300)
        {
            Properties.SetStringList("Icon.Name", "computer", "network-server");
            TypeUniqueId    = "upnp-container";
            expanded_schema = new SchemaEntry <bool> ("plugins.upnp." + device.Udn, "expanded", true,
                                                      "UPnP Share expanded", "UPnP Share expanded");
            udn = device.Udn;

            ContentDirectoryController content_directory = null;

            foreach (Service service in device.Services)
            {
                Log.Debug("UPnPService \"" + device.FriendlyName + "\" Implements " + service.Type);
                if (service.Type.Type == "ContentDirectory")
                {
                    content_directory = new ContentDirectoryController(service.GetController());
                }
            }

            if (content_directory == null)
            {
                throw new ArgumentNullException("content_directory");
            }

            ThreadAssist.Spawn(delegate {
                Parse(device, content_directory);
            });
        }
		private void InitializeMediaReceiver(UPnPDevice device = null, string userAgent = null)
		{
			if (!Helper.InDesignerMode)
			{
				var appInfo = new AppInfo(Assembly.GetEntryAssembly());
				if (Utility.IsStringEmpty(userAgent))
				{
					HTTPMessage.DefaultUserAgent = string.Format("{0} {1}.{2}", appInfo.Title, appInfo.Version.Major,
											  appInfo.Version.Minor);
				}
				else
				{
					HTTPMessage.DefaultUserAgent = userAgent;
				}
			}
			AutoChooseFirstDevice = true;
			var actions = MediaServerModel.CreateDefaultActionsInstance();
			actions.ItemFactory = new UPnPItemFactory();
			MediaServerModel.Start(actions);
			Model = MediaServerModel.GetInstance();

			Controller = new ContentDirectoryController(this, false, device);

			Controller.ItemActivated += OnItemActivated;
			Controller.ClearView += OnClearView;
			Controller.AddItemToView += OnAddItemToView;
			Controller.AddContainerToView += OnAddContainerToView;
			Controller.OpenDeviceView += OpenDeviceView;
			Controller.OpenContainerView += OnOpenContainerView;
			Controller.OpenAVItemView += OnOpenAvItemView;
			Controller.ParseBegin += OnParseBegin;
			Controller.ParseEnd += OnParseEnd;
			Controller.ParseCancelled += OnParseCancelled;
			Controller.BrowseResultsReceived += OnBrowseResultsReceived;

			Model.Actions.ContentDirectory.NewDeviceFound += OnNewDeviceFound;
			if (Model.Actions.Download != null)
			{
				Model.Actions.Download.DownloadCompleted += OnDownloadCompleted;
				Model.Actions.Download.ProgressChanged += OnDownloadProgressChanged;
			}

			ImageWidth = Constants.DEFAULT_GALLERY_ITEM_WIDTH;
			ImageHeight = Constants.DEFAULT_GALLERY_ITEM_HEIGHT;
			TitlesExcludedFromImageReplacement = string.Empty;
			PageManager = new UPnPPageManager(this);
			Devices = new ObservableCollection<UPnPDevice>();
			if (device != null)
			{
				Devices.Add(device);
				Device = device;
			}
			AllDevices = new ObservableCollection<UPnPDevice>();
			WaitForItemEvent = new ManualResetEvent(false);
		}
예제 #4
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());
        }