private void AddChannelSession(InterComEndPoint ep) { ChannelSession sess = null; lock (this) { for (int i = 0; i < _ChanSessions.Length; i++) { if (_ChanSessions[i] == null) { sess = new ChannelSession(i + _AdapterOffset, ep); _ChanSessions[i] = sess; break; } } } if (sess != null) { sess.ChannelUpdated += ChannelUpdated; sess.FilterData += SendFilterdata; sess.Disconnected += ChannelDisconnected; sess.Start(); } else // keine ID mehr frei, max instanzen erreicht, trennen. { ep.DisconnectIntercom(); } }
private void IcEpDisconnected(InterComEndPoint sender) { Stop(false); Disconnected?.Invoke(this, false); // Adapter-ID erst nach invoke zurücksetzen, zwecks Identifikation im Disconnect. AdapterId = -1; }
private void IcCommand(InterComEndPoint sender, InterComCommand cmd, byte[] data) { LogProvider.Add(DebugLevel.InterComClientCommand, cLogSection, Message.AdapterIcCommand, cmd); try { using (MemoryStream ms = new MemoryStream(data)) using (BinaryReader rdr = new BinaryReader(ms)) { switch (cmd) { case InterComCommand.SetInstanceNumber: IcCommandSetInstanceNumber(rdr); break; case InterComCommand.Stop: // entfernt. Soll einfach weiterlaufen, z.b. bei oscam Restart break; case InterComCommand.SetFilter: IcCommandSetFilter(rdr); break; case InterComCommand.DelFilter: IcCommandDelFilter(rdr); break; case InterComCommand.SetPid: SetRawPid(rdr.ReadInt32(), rdr.ReadByte()); break; case InterComCommand.ClearFilter: IcCommandClearFilter(rdr); break; case InterComCommand.SetDescramblerMode: IcCommandSetDescramblerMode(rdr); break; case InterComCommand.SetDescramblerData: IcCommandSetDescrambleData(rdr, data.Length); break; default: LogProvider.Add(DebugLevel.Warning, cLogSection, Message.AdapterIcCommandUnknown, cmd); // unbekannter befehl. Sollte nicht vorkommen. // Da aber bereits alle Bytes gelesen, ignorieren und weiter im Programm. break; } } } catch (Exception ex) { LogProvider.Exception(cLogSection, Message.AdapterIcCommandFailed, ex); } }
/// <summary> /// Instantiiert einen neuen Adapter /// </summary> /// <param name="pipeName">Pipename über die der Adapter die Einstellungen zum ApiClient bezieht.</param> /// <param name="isMdapi">Wenn der Adapter selbst keine Entschlüsselung vornehmen soll, true, anderenfalls false.</param> public DvbApiAdapter(string pipeName, bool isMdapi) { _FilteredPids = new byte[0x2000]; // index = pid 0 = nicht filtern, 1 = filtern. _DescramblePids = new byte[0x2000]; // gleiche hier, wert jedoch descrambler-Index. _Descramblers = new Descrambler[256]; _DescramblersList = new List <Descrambler>(); _Filters = new List <DemuxFilter>(); _ServiceId = -1; _PmtPid = -1; _AdapterIndex = -1; _UseMdApi = isMdapi; _DumpStream = false; Globals.Config.Get("debug", "streamdump", ref _DumpStream); try { string srv = ""; int port = 0; int adapterOffset = 0; Globals.Config.Get(cConfigSection, "server", ref srv); if (Globals.Config.Get(cConfigSection, "offset", 0, 128, ref adapterOffset) != Configuration.ConfigRes.Ok) { LogProvider.Add(DebugLevel.Error, cLogSection, Message.AdapterConfigInvalidOffset); } if (Globals.Config.Get(cConfigSection, "port", 1, 65535, ref port) != Configuration.ConfigRes.Ok) { LogProvider.Add(DebugLevel.Error, cLogSection, Message.AdapterConfigInvalidPort); } _ApiClient = new DvbApiClient(srv, port, pipeName, Globals.Info, adapterOffset); _ApiClient.Start(); } catch (AlreadyRunningException) { // ...wenn fehlgeschlagen, weil pipe schon existent, // dann war eine andere Plugin-Instanz schneller, wird weiter nicht benötigt. LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterClientRunning); } _IcEp = new InterComClient(pipeName); _IcEp.GotCommand += IcCommand; _IcEp.Disconnected += IcDisconnected; _IcEp.Start(); }
public ChannelSession(int index, InterComEndPoint ep) { AdapterId = index; _IcEp = ep; _IsRunning = false; _IcEp.GotCommand += CommandReceived; _IcEp.Disconnected += IcEpDisconnected; CurrentPid = -1; CurrentTsId = -1; CurrentNId = -1; DvbApiDemuxIndex = -1; }
private void IcDisconnected(InterComEndPoint sender) { _AdapterIndex = -1; // verhindert, dass noch etwas durchgeschickt wird. }
private void CommandReceived(InterComEndPoint sender, InterComCommand cmd, byte[] data) { using (MemoryStream ms = new MemoryStream(data)) using (BinaryReader rdr = new BinaryReader(ms)) { switch (cmd) { case InterComCommand.Stop: Stop(false); break; case InterComCommand.Pmt: // 1 int pmt pid, 1 int sid; bool update = false; bool add = CurrentSid == -1; int tmp = rdr.ReadInt32(); // 4 byte nid if (tmp != CurrentNId) { update = true; CurrentNId = tmp; } tmp = rdr.ReadInt32(); // 4 byte tsid if (tmp != CurrentTsId) { update = true; CurrentTsId = tmp; } tmp = rdr.ReadInt32(); // 4 byte Pid if (tmp != CurrentPid) { update = true; CurrentPid = tmp; } PmtSection pmt = new PmtSection(data, (int)rdr.BaseStream.Position, CurrentPid); if (_CurrentPmt == null || _CurrentPmt.Version != pmt.Version) { update = true; _CurrentPmt = pmt; } if (update) { ChannelUpdated?.Invoke(this, add); } break; case InterComCommand.FilterData: int fltId = rdr.ReadInt32(); byte[] fData = rdr.ReadBytes(data.Length - sizeof(int)); FilterData?.Invoke(this, fltId, fData); break; default: // unbekannter befehl. oder anderswo abgefangen Sollte nicht vorkommen // Da aber bereits alle Bytes gelesen, ignorieren und weiter im Programm. break; } } }