示例#1
0
        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();
            }
        }
示例#2
0
        private void IcEpDisconnected(InterComEndPoint sender)
        {
            Stop(false);
            Disconnected?.Invoke(this, false);

            // Adapter-ID erst nach invoke zurücksetzen, zwecks Identifikation im Disconnect.
            AdapterId = -1;
        }
示例#3
0
        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);
            }
        }
示例#4
0
        /// <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();
        }
示例#5
0
        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;
        }
示例#6
0
 private void IcDisconnected(InterComEndPoint sender)
 {
     _AdapterIndex = -1; // verhindert, dass noch etwas durchgeschickt wird.
 }
示例#7
0
        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;
                    }
                }
        }