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); } }
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"); }
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"); }
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; }