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