コード例 #1
0
        /// <summary>
        /// Constructs a MediaServerDiscovery object.
        /// </summary>
        /// <param name="onServerAddedCallback">null, if not interested in the OnServerSeen event; otherwise adds the callback to the multicasted event</param>
        /// <param name="onServerRemovedCallback">null, if not interested in the OnServerGone event; otherwise adds the callback to the multicasted event</param>
        /// <param name="onGoodServerAddedCallback">null, if not interested in the OnGoodServerAdded event; strongly recommended that this is not null; otherwise adds the callback to the multicasted event</param>
        /// <param name="onGoodServerRemovedCallback">null, if not interested in the OnGoodServerRemoved event; otherwise adds the callback to the multicasted event</param>
        public MediaServerDiscovery(
			Delegate_OnServerDeviceChange onServerAddedCallback,
			Delegate_OnServerDeviceChange onServerRemovedCallback,
			Delegate_OnGoodServersChange onGoodServerAddedCallback,
			Delegate_OnGoodServersChange onGoodServerRemovedCallback
			)
        {
            if (onServerAddedCallback != null)
            {
                this.OnServerSeen += onServerAddedCallback;
            }

            if (onServerRemovedCallback != null)
            {
                this.OnServerGone += onServerRemovedCallback;
            }

            if (onGoodServerAddedCallback != null)
            {
                this.OnGoodServerAdded += onGoodServerAddedCallback;
            }

            if (onGoodServerRemovedCallback != null)
            {
                this.OnGoodServerRemoved += onGoodServerRemovedCallback;
            }

            CpMediaServer[] servers = null;
            CpMediaServer[] goodServers = null;

            TheLock.WaitOne();
            if (TheInstance != null)
            {
                servers = TheInstance.GoodServers;
                goodServers = TheInstance.GoodServers;
            }
            else
            {
                TheInstance = new _MediaServerDiscovery(true);
            }
            TheLock.ReleaseMutex();

            TheInstance.OnCpServerAdded += new _MediaServerDiscovery.Delegate_OnGoodServersChange(this.Sink_OnGoodServerAdded);
            TheInstance.OnCpServerRemoved += new _MediaServerDiscovery.Delegate_OnGoodServersChange(this.Sink_OnGoodServerRemoved);
            TheInstance.OnServerSeen += new _MediaServerDiscovery.Delegate_OnServerDeviceChange(this.Sink_OnServerAdded);
            TheInstance.OnServerGone += new _MediaServerDiscovery.Delegate_OnServerDeviceChange(this.Sink_OnServerRemoved);

            if (servers != null)
            {
                if (this.OnServerSeen != null)
                {
                    foreach (CpMediaServer server in servers)
                    {
                        if (servers.Length > 0)
                        {
                            this.OnServerSeen(this, server.ConnectionManager.GetUPnPService().ParentDevice);
                        }
                    }
                }
            }

            if (goodServers != null)
            {
                if (this.OnGoodServerAdded != null)
                {
                    foreach (CpMediaServer server in goodServers)
                    {
                        if (servers.Length > 0)
                        {
                            this.OnGoodServerAdded(this, server);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Constructs a MediaServerDiscovery object.
        /// </summary>
        /// <param name="onServerAddedCallback">null, if not interested in the OnServerSeen event; otherwise adds the callback to the multicasted event</param>
        /// <param name="onServerRemovedCallback">null, if not interested in the OnServerGone event; otherwise adds the callback to the multicasted event</param>
        /// <param name="onGoodServerAddedCallback">null, if not interested in the OnGoodServerAdded event; strongly recommended that this is not null; otherwise adds the callback to the multicasted event</param>
        /// <param name="onGoodServerRemovedCallback">null, if not interested in the OnGoodServerRemoved event; otherwise adds the callback to the multicasted event</param>
        public MediaServerDiscovery
        (
            Delegate_OnServerDeviceChange onServerAddedCallback,
            Delegate_OnServerDeviceChange onServerRemovedCallback,
            Delegate_OnGoodServersChange onGoodServerAddedCallback,
            Delegate_OnGoodServersChange onGoodServerRemovedCallback
        )
        {
            if (onServerAddedCallback != null)
            {
                this.OnServerSeen += onServerAddedCallback;
            }

            if (onServerRemovedCallback != null)
            {
                this.OnServerGone += onServerRemovedCallback;
            }

            if (onGoodServerAddedCallback != null)
            {
                this.OnGoodServerAdded += onGoodServerAddedCallback;
            }

            if (onGoodServerRemovedCallback != null)
            {
                this.OnGoodServerRemoved += onGoodServerRemovedCallback;
            }

            CpMediaServer[] servers     = null;
            CpMediaServer[] goodServers = null;

            TheLock.WaitOne();
            if (TheInstance != null)
            {
                servers     = TheInstance.GoodServers;
                goodServers = TheInstance.GoodServers;
            }
            else
            {
                TheInstance = new _MediaServerDiscovery(true);
            }
            TheLock.ReleaseMutex();

            TheInstance.OnCpServerAdded   += new _MediaServerDiscovery.Delegate_OnGoodServersChange(this.Sink_OnGoodServerAdded);
            TheInstance.OnCpServerRemoved += new _MediaServerDiscovery.Delegate_OnGoodServersChange(this.Sink_OnGoodServerRemoved);
            TheInstance.OnServerSeen      += new _MediaServerDiscovery.Delegate_OnServerDeviceChange(this.Sink_OnServerAdded);
            TheInstance.OnServerGone      += new _MediaServerDiscovery.Delegate_OnServerDeviceChange(this.Sink_OnServerRemoved);

            if (servers != null)
            {
                if (this.OnServerSeen != null)
                {
                    foreach (CpMediaServer server in servers)
                    {
                        if (servers.Length > 0)
                        {
                            this.OnServerSeen(this, server.ConnectionManager.GetUPnPService().ParentDevice);
                        }
                    }
                }
            }


            if (goodServers != null)
            {
                if (this.OnGoodServerAdded != null)
                {
                    foreach (CpMediaServer server in goodServers)
                    {
                        if (servers.Length > 0)
                        {
                            this.OnGoodServerAdded(this, server);
                        }
                    }
                }
            }
        }