Example #1
0
        private void RunNetwork()
        {
            Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() started");

            try
            {
                while (!iThreadNetworkAbort)
                {
                    try
                    {
                        TcpSessionStream sessionStream = new TcpSessionStream();

                        // listen for new incoming event
                        iServer.Accept(sessionStream);
                        lock (iActiveSessionStreams)
                        {
                            iActiveSessionStreams.Add(sessionStream);
                        }

                        // set the timeout for the call to receive - this prevents event server
                        // threads from getting indefinitely blocked by remote clients
                        sessionStream.ReceiveTimeout = 30 * 1000;

                        iScheduler.Schedule((aObject) =>
                        {
                            TcpSessionStream aSessionStream = aObject[0] as TcpSessionStream;
                            if (!iThreadNetworkAbort)
                            {
                                Srb readBuffer  = new Srb(kMaxReadBufferBytes, aSessionStream);
                                Swb writeBuffer = new Swb(kMaxWriteBufferBytes, aSessionStream);
                                try
                                {
                                    // read the event request
                                    EventRequest request = new EventRequest();
                                    request.Read(readBuffer);

                                    // get the session for this subscription ID
                                    EventHandlerEvent session = null;
                                    if (request.SubscriptionId != null)
                                    {
                                        session = GetSession(request.SubscriptionId);
                                        if (session == null)
                                        {
                                            // Wait 500mS and try again
                                            Trace.WriteLine(Trace.kUpnp, "EventServerUpnpScheduler: Early Event!     " + request.SubscriptionId);
                                            Thread.Sleep(500);

                                            session = GetSession(request.SubscriptionId);
                                        }
                                    }

                                    // send the event response
                                    request.WriteResponse(writeBuffer, (session != null));

                                    // add event to be handled
                                    if (session != null)
                                    {
                                        Event ev = new Event(request, session);
                                        iEventFifo.Push(ev);
                                    }
                                }
                                catch (HttpError e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnpScheduler HttpError: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnpScheduler HttpError: " + e.ToString());
                                }
                                catch (NetworkError e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnpScheduler NetworkError: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnpScheduler NetworkError: " + e.ToString());
                                }
                                catch (ReaderError e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnpScheduler ReaderError: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnpScheduler ReaderError: " + e.ToString());
                                }
                                catch (WriterError e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnpScheduler WriterError: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnpScheduler WriterError: " + e.ToString());
                                }
                                catch (Exception e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnpScheduler Exception: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnpScheduler Exception: " + e.ToString());
                                    throw;
                                }
                                finally
                                {
                                    lock (iActiveSessionStreams)
                                    {
                                        if (iActiveSessionStreams.Contains(aSessionStream))
                                        {
                                            aSessionStream.Close();
                                            iActiveSessionStreams.Remove(aSessionStream);
                                        }
                                    }
                                }
                            }
                        }, sessionStream);
                    }
                    catch (NetworkError e)
                    {
                        Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() NetworkError: " + e.ToString());
                        UserLog.WriteLine("EventServerUpnp.RunNetwork() NetworkError: " + e.ToString());
                    }
                }
            }
            catch (Exception e)
            {
                Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() Exception: " + e.ToString());
                UserLog.WriteLine("EventServerUpnp.RunNetwork() Exception: " + e.ToString());
                throw e;
            }

            Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() finished");
        }
Example #2
0
        protected ServiceUpnp(Device aDevice, ServiceType aType, IProtocol aProtocol, IEventUpnpProvider aEventServer)
            : base(aDevice, aType, aProtocol)
        {
            Server = aEventServer;
            iMutex = new Mutex();
            iUnsubscribeCompleted = new ManualResetEvent(false);
            iControlUri           = new Uri(Location.Find(ServiceLocationUpnp.kKeyUpnpControlUri));
            iSubscribing          = false;
            iUnsubscribing        = false;
            iPendingSubscribe     = false;
            iPendingUnsubscribe   = false;
            iClosing = false;

            if (Server != null)
            {
                iEventUri = new Uri(Location.Find(ServiceLocationUpnp.kKeyUpnpSubscriptionUri));
                IPAddress address;
                if (IPAddress.TryParse(iEventUri.Host, out address))
                {
                    iEventEndpoint = new IPEndPoint(address, iEventUri.Port);
                }
                else
                {
                    try
                    {
                        IPAddress[] addresses = Dns.GetHostEntry(iEventUri.Host).AddressList;
                        for (int i = 0; i < addresses.Length && address == null; i++)
                        {
                            if (addresses[i].AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                            {
                                address = addresses[i];
                                break;
                            }
                        }
                        if (address != null)
                        {
                            iEventEndpoint = new IPEndPoint(address, iEventUri.Port);
                        }
                        else
                        {
                            UserLog.WriteLine("Endpoint not found: " + iEventUri.Host + ":" + iEventUri.Port);
                            throw new NetworkError();
                        }
                    }
                    catch (Exception ex)
                    {
                        throw (new ServiceException(903, "Endpoint lookup failure: " + iEventUri.Host + ":" + iEventUri.Port + ", " + ex));
                    }
                }

                iSubscriptionTimer = new System.Threading.Timer(SubscriptionTimerElapsed, null, Timeout.Infinite, Timeout.Infinite);

                iRequest           = new TcpClientStream();
                iWriteBuffer       = new Swb(kMaxWriteBufferBytes, iRequest);
                iReadBuffer        = new Srb(kMaxReadBufferBytes, iRequest);
                iWriter            = new WriterRequest(iWriteBuffer);
                iReader            = new ReaderResponse2(iReadBuffer);
                iHeaderUpnpSid     = new HeaderUpnpSid();
                iHeaderUpnpServer  = new HeaderUpnpServer();
                iHeaderUpnpTimeout = new HeaderUpnpTimeout();
                iReader.AddHeader(iHeaderUpnpSid);
                iReader.AddHeader(iHeaderUpnpServer);
                iReader.AddHeader(iHeaderUpnpTimeout);
            }
        }
Example #3
0
        private void RunNetwork()
        {
            Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() started");

            try
            {
                while (!iThreadNetworkAbort)
                {
                    try
                    {
                        TcpSessionStream sessionStream = new TcpSessionStream();

                        // listen for new incoming event
                        iServer.Accept(sessionStream);
                        lock (iActiveSessionStreams)
                        {
                            iActiveSessionStreams.Add(sessionStream);
                        }

                        iScheduler.Schedule(() =>
                        {
                            if (!iThreadNetworkAbort)
                            {
                                Srb readBuffer  = new Srb(kMaxReadBufferBytes, sessionStream);
                                Swb writeBuffer = new Swb(kMaxWriteBufferBytes, sessionStream);
                                try
                                {
                                    // read the event request
                                    EventRequest request = new EventRequest();
                                    request.Read(readBuffer);

                                    // get the session for this subscription ID
                                    EventHandlerEvent session = null;
                                    if (request.SubscriptionId != null)
                                    {
                                        session = GetSession(request.SubscriptionId);
                                        if (session == null)
                                        {
                                            // Wait 500mS and try again
                                            Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork(): Early Event!     " + request.SubscriptionId);
                                            Thread.Sleep(500);

                                            session = GetSession(request.SubscriptionId);
                                        }
                                    }

                                    // send the event response
                                    request.WriteResponse(writeBuffer, (session != null));

                                    // add event to be handled
                                    if (session != null)
                                    {
                                        Event ev = new Event(request, session);
                                        iEventFifo.Push(ev);
                                    }
                                }
                                catch (HttpError e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() HttpError: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnp.RunNetwork() HttpError: " + e.ToString());
                                }
                                catch (NetworkError e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() NetworkError: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnp.RunNetwork() NetworkError: " + e.ToString());
                                }
                                catch (ReaderError e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() ReaderError: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnp.RunNetwork() ReaderError: " + e.ToString());
                                }
                                catch (WriterError e)
                                {
                                    Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() WriterError: " + e.ToString());
                                    UserLog.WriteLine("EventServerUpnp.RunNetwork() WriterError: " + e.ToString());
                                }
                                finally
                                {
                                    lock (iActiveSessionStreams)
                                    {
                                        if (iActiveSessionStreams.Contains(sessionStream))
                                        {
                                            sessionStream.Close();
                                            iActiveSessionStreams.Remove(sessionStream);
                                        }
                                    }
                                }
                            }
                        });
                    }
                    catch (HttpError e)
                    {
                        Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() HttpError: " + e.ToString());
                        UserLog.WriteLine("EventServerUpnp.RunNetwork() HttpError: " + e.ToString());
                    }
                    catch (NetworkError e)
                    {
                        Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() NetworkError: " + e.ToString());
                        UserLog.WriteLine("EventServerUpnp.RunNetwork() NetworkError: " + e.ToString());
                    }
                    catch (ReaderError e)
                    {
                        Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() ReaderError: " + e.ToString());
                        UserLog.WriteLine("EventServerUpnp.RunNetwork() ReaderError: " + e.ToString());
                    }
                    catch (WriterError e)
                    {
                        Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() WriterError: " + e.ToString());
                        UserLog.WriteLine("EventServerUpnp.RunNetwork() WriterError: " + e.ToString());
                    }
                }
            }
            catch (Exception e)
            {
                Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() Exception: " + e.ToString());
                UserLog.WriteLine("EventServerUpnp.RunNetwork() Exception: " + e.ToString());
                throw e;
            }

            Trace.WriteLine(Trace.kUpnp, "EventServerUpnp.RunNetwork() finished");
        }