예제 #1
0
        private void SendCaPmt(CaPmtSection capmt)
        {
            if (_ServerInfo == null)
            {
                return;
            }

            byte[] data = capmt.Create();

            using (MemoryStream ms = new MemoryStream())
            {
                int len = data.Length;

                int cmd = unchecked ((int)DvbApiCommand.AotCaPmt);

                if (!_IsConnected)
                {
                    return;
                }

                byte[] header;
                // Längengenerierung nach ASN.1:
                if (len < 128)
                {
                    header    = new byte[4];
                    header[3] = (byte)len;
                }
                else if (len < 256)
                {
                    header    = new byte[5];
                    header[3] = 0x81;
                    header[4] = (byte)len;
                }
                else if (len < 65536)
                {
                    header    = new byte[6];
                    header[3] = 0x82;
                    header[4] = (byte)(len >> 8);
                    header[5] = (byte)(len);
                }
                else // bis 16MiB
                {
                    header    = new byte[7];
                    header[3] = 0x83;
                    header[4] = (byte)(len >> 16);
                    header[5] = (byte)(len >> 8);
                    header[6] = (byte)(len);
                }

                header[0] = (byte)(cmd >> 24);
                header[1] = (byte)(cmd >> 16);
                header[2] = (byte)(cmd >> 8);

                ms.Write(header, 0, header.Length);
                ms.Write(data, 0, data.Length);

                SendMessage(ms.ToArray());
            }
        }
예제 #2
0
        private void ChannelUpdated(ChannelSession sender, bool add)
        {
            CaPmtSection capmt = null;

            if (!add)
            {
                if (sender.CurrentSid > 0) // dann Update.
                {
                    capmt = sender.GetCaPmt(ListManagement.Update);
                }
                else
                {
                    // dann ist raus, also remove. hier bietet Oscam dvbapi ein stop command
                    StopDmx((byte)sender.AdapterId);
                }
            }
            else
            {
                // wenn noch keiner läuft dann als only senden. ansonsten add
                int c = ActiveChannels().Length;

                if (c > 1) // eigenen abziehen
                {
                    capmt = sender.GetCaPmt(ListManagement.Add);
                }
                else
                {
                    capmt = sender.GetCaPmt(ListManagement.Only);
                }
            }

            if (capmt != null)
            {
                SendCaPmt(capmt);
            }
        }