Пример #1
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);
            }
        }
Пример #2
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");
        }
Пример #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);
                        }

                        // 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");
        }
Пример #4
0
            public HttpServerSession(HttpServer aServer, IList <ISource> aSourceList, Socket aSocket)
            {
                iServer     = aServer;
                iSourceList = aSourceList;
                iSocket     = aSocket;

                iSession = new TcpSessionStream();
                iSession.SetSocket(iSocket);

                iReadBuffer = new Srb(kMaxReadBufferBytes, iSession);

                iWavFileHeader = new byte[44];

                iWavFileHeader[0] = 0x52; // ChunkId
                iWavFileHeader[1] = 0x49; // "RIFF"
                iWavFileHeader[2] = 0x46;
                iWavFileHeader[3] = 0x46;

                iWavFileHeader[4] = 0x24; // ChunkSize
                iWavFileHeader[5] = 0x00; // 36 + data size
                iWavFileHeader[6] = 0x00;
                iWavFileHeader[7] = 0x00;

                iWavFileHeader[8]  = 0x57; // Format
                iWavFileHeader[9]  = 0x41; // "WAVE"
                iWavFileHeader[10] = 0x56;
                iWavFileHeader[11] = 0x45;

                iWavFileHeader[12] = 0x66; // SubChunk1Id
                iWavFileHeader[13] = 0x6d; // "fmt "
                iWavFileHeader[14] = 0x74;
                iWavFileHeader[15] = 0x20;

                iWavFileHeader[16] = 0x10; // SubChunk1Size
                iWavFileHeader[17] = 0x00; // 16

                iWavFileHeader[18] = 0x00;
                iWavFileHeader[19] = 0x00;

                iWavFileHeader[20] = 0x01; // AudioFormat
                iWavFileHeader[21] = 0x00; // 1

                iWavFileHeader[22] = 0x02; // NumChannels
                iWavFileHeader[23] = 0x00; // 2

                iWavFileHeader[24] = 0x44; // SampleRate
                iWavFileHeader[25] = 0xac; // 44100
                iWavFileHeader[26] = 0x00;
                iWavFileHeader[27] = 0x00;

                iWavFileHeader[28] = 0x10; // ByteRate
                iWavFileHeader[29] = 0xb1; // 44100 * 2 * 2
                iWavFileHeader[30] = 0x02;
                iWavFileHeader[31] = 0x00;

                iWavFileHeader[32] = 0x04; // BlockAlign
                iWavFileHeader[33] = 0x00; // 4

                iWavFileHeader[34] = 0x10; // BitsPerSample
                iWavFileHeader[35] = 0x00; // 16

                iWavFileHeader[36] = 0x64; // SubChunk2Id
                iWavFileHeader[37] = 0x61; // "data"
                iWavFileHeader[38] = 0x74;
                iWavFileHeader[39] = 0x61;

                iWavFileHeader[40] = 0x00; // SubChunk2Size
                iWavFileHeader[41] = 0x00; // 0
                iWavFileHeader[42] = 0x00;
                iWavFileHeader[43] = 0x00;
            }