private void InsertChannelLinkedList(DbCommand cmd, int listId) { cmd.Parameters.Clear(); cmd.CommandText = "insert into chanseq(listid,seq,slot) values (" + listId + ",@seq,@slot)"; var pSeq = cmd.CreateParameter(); pSeq.ParameterName = "@seq"; pSeq.DbType = DbType.Int32; cmd.Parameters.Add(pSeq); var pSlot = cmd.CreateParameter(); pSlot.ParameterName = "@slot"; pSlot.DbType = DbType.Int32; cmd.Parameters.Add(pSlot); SatChannelListHeader header = new SatChannelListHeader(this.fileContent, this.dvbsBlockOffset + this.satConfig.ChannelListHeaderOffset); int seq = 0; int tableIndex = header.LinkedListStartIndex; int linkedListOffset = this.satConfig.SequenceTableOffset; while (tableIndex != 0xFFFF) { int entryOffset = linkedListOffset + tableIndex * satConfig.sizeOfChannelLinkedListEntry; pSeq.Value = seq; if (BitConverter.ToInt16(this.fileContent, entryOffset + 4) != tableIndex) { break; } pSlot.Value = tableIndex; cmd.ExecuteNonQuery(); tableIndex = BitConverter.ToInt16(this.fileContent, entryOffset + 2); ++seq; } }
private void UpdateChannelLinkedList(int counter) { var header = new SatChannelListHeader(this.fileContent, this.dvbsBlockOffset + satConfig.ChannelListHeaderOffset); header.ChannelCount = counter; header.LinkedListStartIndex = 0; if (counter == 0) counter = 1; header.LinkedListEndIndex1 = counter - 1; header.LinkedListEndIndex2 = counter - 1; // update linked list var off = this.dvbsBlockOffset + satConfig.SequenceTableOffset; for (int i = 0; i < counter; i++) { Tools.SetInt16(this.fileContent, off + 0, i - 1); Tools.SetInt16(this.fileContent, off + 2, i + 1); Tools.SetInt16(this.fileContent, off + 4, i); off += satConfig.sizeOfChannelLinkedListEntry; } Tools.SetInt16(this.fileContent, off - satConfig.sizeOfChannelLinkedListEntry + 2, 0xFFFF); Tools.MemSet(fileContent, off, 0, (satConfig.dvbsMaxChannelCount - counter) * satConfig.sizeOfChannelLinkedListEntry); }
private void ReadDvbsSubblocks(ref int off) { this.DataRoot.AddChannelList(satTvChannels); this.DataRoot.AddChannelList(satRadioChannels); this.VerifyDvbsSubblockChecksums(off); // subblock 1 (DVBS header) off += 16; // subblock 2 (satellites) off += 84; // irrelevant data this.ReadSatellites(ref off); // subblock 3 (transponder) off += satConfig.sizeOfTransponderBlockHeader; this.ReadTransponderData(ref off); // subblock 4 (channels) SatChannelListHeader header = new SatChannelListHeader(fileContent, off); this.dvbsChannelCount = header.ChannelCount; off += header.Size; off += satConfig.dvbsMaxChannelCount/8; // skip allocation bitmap this.ReadDvbsChannelLinkedList(header, ref off); off += satConfig.linkedListExtraDataLength; this.ReadDvbsChannels(ref off, header.LinkedListStartIndex); // subblock 5 (satellite/LNB config) this.ReadLnbConfig(ref off); }
private void ReadDvbsChannelLinkedList(SatChannelListHeader header, ref int off) { this.nextChannelIndex = new Dictionary<int, ushort>(); int index = header.LinkedListStartIndex; while (index != 0xFFFF) { int offEntry = off + index*satConfig.sizeOfChannelLinkedListEntry; ushort nextIndex = BitConverter.ToUInt16(fileContent, offEntry + 2); if (this.nextChannelIndex.ContainsKey(index)) // prevent infinite loop (exists in some test files) break; this.nextChannelIndex.Add(index, nextIndex); index = nextIndex; } off += satConfig.dvbsMaxChannelCount*satConfig.sizeOfChannelLinkedListEntry; }
private void InsertChannelLinkedList(DbCommand cmd, int listId) { cmd.Parameters.Clear(); cmd.CommandText = "insert into chanseq(listid,seq,slot) values (" + listId + ",@seq,@slot)"; var pSeq = cmd.CreateParameter(); pSeq.ParameterName = "@seq"; pSeq.DbType = DbType.Int32; cmd.Parameters.Add(pSeq); var pSlot = cmd.CreateParameter(); pSlot.ParameterName = "@slot"; pSlot.DbType = DbType.Int32; cmd.Parameters.Add(pSlot); SatChannelListHeader header = new SatChannelListHeader(this.fileContent, this.dvbsBlockOffset + this.satConfig.ChannelListHeaderOffset); int seq = 0; int tableIndex = header.LinkedListStartIndex; int linkedListOffset = this.satConfig.SequenceTableOffset; while (tableIndex != 0xFFFF) { int entryOffset = linkedListOffset + tableIndex * satConfig.sizeOfChannelLinkedListEntry; pSeq.Value = seq; if (BitConverter.ToInt16(this.fileContent, entryOffset + 4) != tableIndex) break; pSlot.Value = tableIndex; cmd.ExecuteNonQuery(); tableIndex = BitConverter.ToInt16(this.fileContent, entryOffset + 2); ++seq; } }