2013-03-31 14:09:38 +02:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Data;
|
|
|
|
|
|
using System.Data.Common;
|
|
|
|
|
|
using System.Data.SqlClient;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using ChanSort.Api;
|
|
|
|
|
|
|
2013-04-03 12:47:24 +02:00
|
|
|
|
namespace ChanSort.Loader.TllFile
|
2013-03-31 14:09:38 +02:00
|
|
|
|
{
|
2013-04-03 12:47:24 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// For research purposes this class writes DVB-S channel information into a database
|
|
|
|
|
|
/// It is not used for production.
|
|
|
|
|
|
/// </summary>
|
2013-03-31 14:09:38 +02:00
|
|
|
|
public partial class TllFileSerializer
|
|
|
|
|
|
{
|
2013-04-03 12:47:24 +02:00
|
|
|
|
#region SQL (create table)
|
2013-03-31 14:09:38 +02:00
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
|
|
create table list (
|
|
|
|
|
|
listid int not null,
|
|
|
|
|
|
filename varchar(100),
|
|
|
|
|
|
created datetime,
|
|
|
|
|
|
primary key (listid))
|
|
|
|
|
|
|
|
|
|
|
|
create table channel (
|
|
|
|
|
|
listid int not null,
|
|
|
|
|
|
slot int not null,
|
|
|
|
|
|
isdel bit not null,
|
|
|
|
|
|
seq int,
|
|
|
|
|
|
progmask int not null,
|
|
|
|
|
|
prognr int not null,
|
|
|
|
|
|
name varchar(40) not null,
|
|
|
|
|
|
tpnr int not null,
|
|
|
|
|
|
satnr int,
|
|
|
|
|
|
onid int not null,
|
|
|
|
|
|
tsid int not null,
|
|
|
|
|
|
ssid int not null,
|
|
|
|
|
|
uid varchar(25),
|
|
|
|
|
|
favcrypt int,
|
|
|
|
|
|
lockskiphide int,
|
|
|
|
|
|
progfix int,
|
|
|
|
|
|
primary key (listid, slot))
|
|
|
|
|
|
|
|
|
|
|
|
create table chanseq(
|
|
|
|
|
|
listid int not null,
|
|
|
|
|
|
seq int not null,
|
|
|
|
|
|
slot int not null,
|
|
|
|
|
|
primary key (listid, seq))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
update channel
|
|
|
|
|
|
set seq=s.seq
|
|
|
|
|
|
from channel c inner join chanseq s on s.listid=c.listid and s.slot=c.slot
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2013-04-03 12:47:24 +02:00
|
|
|
|
#region StoreToDatabase()
|
|
|
|
|
|
private void StoreToDatabase()
|
2013-03-31 14:09:38 +02:00
|
|
|
|
{
|
2013-04-03 12:47:24 +02:00
|
|
|
|
if (this.dvbsBlockSize == 0)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2013-03-31 14:09:38 +02:00
|
|
|
|
var list = this.DataRoot.GetChannelList(SignalSource.DvbS, SignalType.Tv, false);
|
|
|
|
|
|
if (list == null)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
using (var conn = SqlClientFactory.Instance.CreateConnection())
|
|
|
|
|
|
{
|
|
|
|
|
|
conn.ConnectionString = "server=(local);database=ChanSort;Integrated Security=true";
|
|
|
|
|
|
conn.Open();
|
|
|
|
|
|
|
|
|
|
|
|
using (var cmd = conn.CreateCommand())
|
|
|
|
|
|
{
|
|
|
|
|
|
var listId = InsertListData(cmd);
|
|
|
|
|
|
|
2013-04-03 12:47:24 +02:00
|
|
|
|
InsertChannelLinkedList(cmd, listId);
|
|
|
|
|
|
InsertChannelData(cmd, listId);
|
2013-03-31 14:09:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2013-04-03 12:47:24 +02:00
|
|
|
|
#endregion
|
2013-03-31 14:09:38 +02:00
|
|
|
|
|
2013-04-03 12:47:24 +02:00
|
|
|
|
#region InsertListData()
|
|
|
|
|
|
private int InsertListData(DbCommand cmd)
|
|
|
|
|
|
{
|
|
|
|
|
|
cmd.CommandText = "select max(listid) from list";
|
|
|
|
|
|
var maxObj = cmd.ExecuteScalar();
|
|
|
|
|
|
int listId = maxObj == DBNull.Value ? 1 : (int) maxObj + 1;
|
|
|
|
|
|
|
|
|
|
|
|
cmd.CommandText = "insert into list(listid, filename, created) values (" + listId + ", @filename, getdate())";
|
|
|
|
|
|
var parm = cmd.CreateParameter();
|
|
|
|
|
|
parm.ParameterName = "@filename";
|
|
|
|
|
|
parm.DbType = DbType.String;
|
|
|
|
|
|
parm.Value = this.FileName;
|
|
|
|
|
|
cmd.Parameters.Add(parm);
|
|
|
|
|
|
cmd.ExecuteNonQuery();
|
|
|
|
|
|
return listId;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region InsertChannelLinkedList()
|
|
|
|
|
|
private void InsertChannelLinkedList(DbCommand cmd, int listId)
|
2013-03-31 14:09:38 +02:00
|
|
|
|
{
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
2013-04-03 12:47:24 +02:00
|
|
|
|
SatChannelListHeader header = new SatChannelListHeader(this.fileContent,
|
|
|
|
|
|
this.dvbsBlockOffset + this.satConfig.ChannelListHeaderOffset);
|
2013-03-31 14:09:38 +02:00
|
|
|
|
int seq = 0;
|
2013-04-03 12:47:24 +02:00
|
|
|
|
int tableIndex = header.LinkedListStartIndex;
|
|
|
|
|
|
int linkedListOffset = this.satConfig.SequenceTableOffset;
|
|
|
|
|
|
while (tableIndex != 0xFFFF)
|
2013-03-31 14:09:38 +02:00
|
|
|
|
{
|
2013-04-03 12:47:24 +02:00
|
|
|
|
int entryOffset = linkedListOffset + tableIndex * satConfig.sizeOfChannelLinkedListEntry;
|
2013-03-31 14:09:38 +02:00
|
|
|
|
pSeq.Value = seq;
|
2013-04-03 12:47:24 +02:00
|
|
|
|
if (BitConverter.ToInt16(this.fileContent, entryOffset + 4) != tableIndex)
|
2013-03-31 14:09:38 +02:00
|
|
|
|
break;
|
2013-04-03 12:47:24 +02:00
|
|
|
|
pSlot.Value = tableIndex;
|
2013-03-31 14:09:38 +02:00
|
|
|
|
cmd.ExecuteNonQuery();
|
|
|
|
|
|
|
2013-04-03 12:47:24 +02:00
|
|
|
|
tableIndex = BitConverter.ToInt16(this.fileContent, entryOffset + 2);
|
2013-03-31 14:09:38 +02:00
|
|
|
|
++seq;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region InsertChannelData()
|
2013-04-03 12:47:24 +02:00
|
|
|
|
private void InsertChannelData(DbCommand cmd, int listId)
|
2013-03-31 14:09:38 +02:00
|
|
|
|
{
|
|
|
|
|
|
PrepareChannelInsert(cmd);
|
|
|
|
|
|
|
2013-04-03 12:47:24 +02:00
|
|
|
|
DvbStringDecoder decoder = new DvbStringDecoder(this.DefaultEncoding);
|
|
|
|
|
|
DataMapping dvbsMapping = this.dvbsMappings.GetMapping(this.dvbsBlockSize);
|
|
|
|
|
|
dvbsMapping.SetDataPtr(this.fileContent, this.dvbsBlockOffset + this.satConfig.ChannelListOffset);
|
2013-03-31 14:09:38 +02:00
|
|
|
|
for (int slot = 0; slot < this.dvbsChannelCount; slot++)
|
|
|
|
|
|
{
|
|
|
|
|
|
cmd.Parameters["@listid"].Value = listId;
|
|
|
|
|
|
cmd.Parameters["@slot"].Value = slot;
|
|
|
|
|
|
cmd.Parameters["@seq"].Value = DBNull.Value;
|
2013-04-03 12:47:24 +02:00
|
|
|
|
cmd.Parameters["@isdel"].Value = dvbsMapping.GetFlag("InUse") ? 0 : 1;
|
|
|
|
|
|
cmd.Parameters["@progmask"].Value = dvbsMapping.GetWord("offProgramNr");
|
|
|
|
|
|
cmd.Parameters["@prognr"].Value = dvbsMapping.GetWord("offProgramNr") & 0x3FFF;
|
|
|
|
|
|
cmd.Parameters["@progfix"].Value = dvbsMapping.GetWord("offProgramNrPreset");
|
|
|
|
|
|
int absNameOffset = dvbsMapping.BaseOffset + dvbsMapping.GetOffsets("offName")[0];
|
|
|
|
|
|
string longName, shortName;
|
|
|
|
|
|
decoder.GetChannelNames(fileContent, absNameOffset, dvbsMapping.GetByte("offNameLength"), out longName, out shortName);
|
|
|
|
|
|
cmd.Parameters["@name"].Value = longName;
|
|
|
|
|
|
cmd.Parameters["@tpnr"].Value = dvbsMapping.GetWord("offTransponderIndex");
|
|
|
|
|
|
var transp = this.DataRoot.Transponder.TryGet(dvbsMapping.GetWord("offTransponderIndex"));
|
2013-03-31 14:09:38 +02:00
|
|
|
|
cmd.Parameters["@satnr"].Value = transp == null ? (object)DBNull.Value : transp.Satellite.Id;
|
|
|
|
|
|
cmd.Parameters["@onid"].Value = transp == null ? (object)DBNull.Value : transp.OriginalNetworkId;
|
|
|
|
|
|
cmd.Parameters["@tsid"].Value = transp == null ? (object)DBNull.Value : transp.TransportStreamId;
|
2013-04-03 12:47:24 +02:00
|
|
|
|
cmd.Parameters["@ssid"].Value = (int)dvbsMapping.GetWord("offServiceId");
|
2013-03-31 14:09:38 +02:00
|
|
|
|
cmd.Parameters["@uid"].Value = transp == null
|
|
|
|
|
|
? (object) DBNull.Value
|
|
|
|
|
|
: transp.TransportStreamId + "-" + transp.OriginalNetworkId + "-" +
|
2013-04-03 12:47:24 +02:00
|
|
|
|
dvbsMapping.GetWord("offServiceId");
|
2013-03-31 14:09:38 +02:00
|
|
|
|
cmd.Parameters["@favcrypt"].Value = (int)dvbsMapping.GetByte("offFavorites");
|
|
|
|
|
|
cmd.Parameters["@lockskiphide"].Value = (int)dvbsMapping.GetByte("offLock");
|
|
|
|
|
|
cmd.ExecuteNonQuery();
|
2013-04-03 12:47:24 +02:00
|
|
|
|
dvbsMapping.BaseOffset += this.satConfig.dvbsChannelLength;
|
2013-03-31 14:09:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region PrepareChannelInsert()
|
|
|
|
|
|
private static void PrepareChannelInsert(DbCommand cmd)
|
|
|
|
|
|
{
|
|
|
|
|
|
var cols = new[] { "listid", "slot", "seq", "isdel", "progmask", "prognr", "progfix", "name", "tpnr", "satnr", "onid", "tsid", "ssid", "uid", "favcrypt", "lockskiphide" };
|
|
|
|
|
|
|
|
|
|
|
|
cmd.Parameters.Clear();
|
|
|
|
|
|
|
|
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
|
|
sb.Append("insert into channel (");
|
|
|
|
|
|
var comma = "";
|
|
|
|
|
|
foreach (var col in cols)
|
|
|
|
|
|
{
|
|
|
|
|
|
sb.Append(comma).Append(col);
|
|
|
|
|
|
comma = ",";
|
|
|
|
|
|
}
|
|
|
|
|
|
sb.Append(") values (");
|
|
|
|
|
|
comma = "";
|
|
|
|
|
|
foreach (var col in cols)
|
|
|
|
|
|
{
|
|
|
|
|
|
sb.Append(comma).Append('@').Append(col);
|
|
|
|
|
|
comma = ",";
|
|
|
|
|
|
}
|
|
|
|
|
|
sb.Append(")");
|
|
|
|
|
|
cmd.CommandText = sb.ToString();
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var col in cols)
|
|
|
|
|
|
{
|
|
|
|
|
|
DbParameter parm = cmd.CreateParameter();
|
|
|
|
|
|
parm.ParameterName = "@" + col;
|
|
|
|
|
|
if (col == "name" || col == "uid")
|
|
|
|
|
|
{
|
|
|
|
|
|
parm.DbType = DbType.String;
|
|
|
|
|
|
parm.Size = 40;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
parm.DbType = DbType.Int32;
|
|
|
|
|
|
cmd.Parameters.Add(parm);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cmd.Prepare();
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|